@pnp/cli-microsoft365 11.7.0-beta.b67a258 → 11.7.0-beta.b9f508d

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.
Files changed (38) hide show
  1. package/allCommands.json +1 -1
  2. package/allCommandsFull.json +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/m365/entra/commands/user/user-license-add.js +2 -1
  5. package/dist/m365/entra/commands/user/user-license-list.js +4 -9
  6. package/dist/m365/entra/commands/user/user-license-remove.js +2 -1
  7. package/dist/m365/outlook/commands/calendar/calendar-add.js +85 -0
  8. package/dist/m365/outlook/commands/calendar/calendar-get.js +71 -0
  9. package/dist/m365/outlook/commands/calendar/calendar-remove.js +100 -0
  10. package/dist/m365/outlook/commands/event/event-cancel.js +103 -0
  11. package/dist/m365/outlook/commands/event/event-list.js +115 -0
  12. package/dist/m365/outlook/commands/event/event-remove.js +104 -0
  13. package/dist/m365/outlook/commands.js +6 -0
  14. package/dist/m365/spfx/commands/SpfxCompatibilityMatrix.js +628 -0
  15. package/dist/m365/spfx/commands/project/DeployWorkflow.js +2 -2
  16. package/dist/m365/spfx/commands/project/project-azuredevops-pipeline-add.js +13 -1
  17. package/dist/m365/spfx/commands/project/project-github-workflow-add.js +16 -1
  18. package/dist/m365/spfx/commands/spfx-doctor.js +5 -631
  19. package/dist/m365/teams/commands/chat/chat-message-list.js +43 -4
  20. package/dist/utils/calendar.js +37 -0
  21. package/dist/utils/calendarGroup.js +22 -0
  22. package/dist/utils/entraApp.js +9 -2
  23. package/dist/utils/spfx.js +59 -0
  24. package/docs/docs/cmd/entra/license/license-list.mdx +19 -0
  25. package/docs/docs/cmd/entra/m365group/m365group-conversation-list.mdx +19 -0
  26. package/docs/docs/cmd/entra/m365group/m365group-conversation-post-list.mdx +19 -0
  27. package/docs/docs/cmd/entra/user/user-license-add.mdx +19 -0
  28. package/docs/docs/cmd/entra/user/user-license-list.mdx +18 -1
  29. package/docs/docs/cmd/entra/user/user-license-remove.mdx +21 -0
  30. package/docs/docs/cmd/outlook/calendar/calendar-add.mdx +165 -0
  31. package/docs/docs/cmd/outlook/calendar/calendar-get.mdx +165 -0
  32. package/docs/docs/cmd/outlook/calendar/calendar-remove.mdx +86 -0
  33. package/docs/docs/cmd/outlook/event/event-cancel.mdx +85 -0
  34. package/docs/docs/cmd/outlook/event/event-list.mdx +245 -0
  35. package/docs/docs/cmd/outlook/event/event-remove.mdx +85 -0
  36. package/docs/docs/cmd/teams/chat/chat-message-list.mdx +23 -2
  37. package/npm-shrinkwrap.json +0 -7
  38. package/package.json +2 -1
@@ -11,9 +11,24 @@ export const options = z.strictObject({
11
11
  error: e => `'${e.input}' is not a valid value for option chatId.`
12
12
  })
13
13
  .alias('i'),
14
+ createdEndDateTime: z.string()
15
+ .refine(time => validation.isValidISODateTime(time), {
16
+ error: e => `'${e.input}' is not a valid ISO date-time string for option createdEndDateTime.`
17
+ })
18
+ .optional(),
14
19
  endDateTime: z.string()
15
20
  .refine(time => validation.isValidISODateTime(time), {
16
21
  error: e => `'${e.input}' is not a valid ISO date-time string for option endDateTime.`
22
+ })
23
+ .optional(),
24
+ modifiedStartDateTime: z.string()
25
+ .refine(time => validation.isValidISODateTime(time), {
26
+ error: e => `'${e.input}' is not a valid ISO date-time string for option modifiedStartDateTime.`
27
+ })
28
+ .optional(),
29
+ modifiedEndDateTime: z.string()
30
+ .refine(time => validation.isValidISODateTime(time), {
31
+ error: e => `'${e.input}' is not a valid ISO date-time string for option modifiedEndDateTime.`
17
32
  })
18
33
  .optional()
19
34
  });
@@ -30,13 +45,37 @@ class TeamsChatMessageListCommand extends GraphCommand {
30
45
  get schema() {
31
46
  return options;
32
47
  }
48
+ getRefinedSchema(schema) {
49
+ return schema
50
+ .refine(options => !(options.endDateTime && options.createdEndDateTime), {
51
+ error: 'Specify either endDateTime or createdEndDateTime, but not both.'
52
+ })
53
+ .refine(options => !(options.createdEndDateTime && (options.modifiedStartDateTime || options.modifiedEndDateTime)), {
54
+ error: 'You cannot combine createdEndDateTime with modifiedStartDateTime or modifiedEndDateTime. These filters operate on different properties.'
55
+ })
56
+ .refine(options => !(options.endDateTime && (options.modifiedStartDateTime || options.modifiedEndDateTime)), {
57
+ error: 'You cannot combine endDateTime with modifiedStartDateTime or modifiedEndDateTime. These filters operate on different properties.'
58
+ });
59
+ }
33
60
  async commandAction(logger, args) {
61
+ if (args.options.endDateTime) {
62
+ await this.warn(logger, `Option 'endDateTime' is deprecated. Please use 'createdEndDateTime' instead.`);
63
+ args.options.createdEndDateTime = args.options.endDateTime;
64
+ }
34
65
  try {
35
66
  let apiUrl = `${this.resource}/v1.0/chats/${args.options.chatId}/messages`;
36
- if (args.options.endDateTime) {
37
- // You can only filter results if the request URL contains the $orderby and $filter query parameters configured for the same property;
38
- // otherwise, the $filter query option is ignored.
39
- apiUrl += `?$filter=createdDateTime lt ${args.options.endDateTime}&$orderby=createdDateTime desc`;
67
+ if (args.options.createdEndDateTime) {
68
+ apiUrl += `?$filter=createdDateTime lt ${args.options.createdEndDateTime}&$orderby=createdDateTime desc`;
69
+ }
70
+ else if (args.options.modifiedStartDateTime || args.options.modifiedEndDateTime) {
71
+ const filters = [];
72
+ if (args.options.modifiedStartDateTime) {
73
+ filters.push(`lastModifiedDateTime gt ${args.options.modifiedStartDateTime}`);
74
+ }
75
+ if (args.options.modifiedEndDateTime) {
76
+ filters.push(`lastModifiedDateTime lt ${args.options.modifiedEndDateTime}`);
77
+ }
78
+ apiUrl += `?$filter=${filters.join(' and ')}&$orderby=lastModifiedDateTime desc`;
40
79
  }
41
80
  const items = await odata.getAllItems(apiUrl);
42
81
  if (args.options.output && args.options.output !== 'json') {
@@ -0,0 +1,37 @@
1
+ import { odata } from './odata.js';
2
+ import { formatting } from './formatting.js';
3
+ import { cli } from '../cli/cli.js';
4
+ import request from '../request.js';
5
+ export const calendar = {
6
+ async getUserCalendarById(userId, calendarId, calendarGroupId, properties) {
7
+ let url = `https://graph.microsoft.com/v1.0/users('${userId}')/${calendarGroupId ? `calendarGroups/${calendarGroupId}/` : ''}calendars/${calendarId}`;
8
+ if (properties) {
9
+ url += `?$select=${properties}`;
10
+ }
11
+ const requestOptions = {
12
+ url: url,
13
+ headers: {
14
+ accept: 'application/json;odata.metadata=none'
15
+ },
16
+ responseType: 'json'
17
+ };
18
+ return await request.get(requestOptions);
19
+ },
20
+ async getUserCalendarByName(userId, name, calendarGroupId, properties) {
21
+ let url = `https://graph.microsoft.com/v1.0/users('${userId}')/${calendarGroupId ? `calendarGroups/${calendarGroupId}/` : ''}calendars?$filter=name eq '${formatting.encodeQueryParameter(name)}'`;
22
+ if (properties) {
23
+ url += `&$select=${properties}`;
24
+ }
25
+ const calendars = await odata.getAllItems(url);
26
+ if (calendars.length === 0) {
27
+ throw new Error(`The specified calendar '${name}' does not exist.`);
28
+ }
29
+ if (calendars.length > 1) {
30
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', calendars);
31
+ const selectedCalendar = await cli.handleMultipleResultsFound(`Multiple calendars with name '${name}' found.`, resultAsKeyValuePair);
32
+ return selectedCalendar;
33
+ }
34
+ return calendars[0];
35
+ }
36
+ };
37
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1,22 @@
1
+ import { odata } from './odata.js';
2
+ import { formatting } from './formatting.js';
3
+ import { cli } from '../cli/cli.js';
4
+ export const calendarGroup = {
5
+ async getUserCalendarGroupByName(userId, displayName, properties) {
6
+ let url = `https://graph.microsoft.com/v1.0/users('${userId}')/calendarGroups?$filter=name eq '${formatting.encodeQueryParameter(displayName)}'`;
7
+ if (properties) {
8
+ url += `&$select=${properties}`;
9
+ }
10
+ const calendarGroups = await odata.getAllItems(url);
11
+ if (calendarGroups.length === 0) {
12
+ throw new Error(`The specified calendar group '${displayName}' does not exist.`);
13
+ }
14
+ if (calendarGroups.length > 1) {
15
+ const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', calendarGroups);
16
+ const selectedCalendarGroup = await cli.handleMultipleResultsFound(`Multiple calendar groups with name '${displayName}' found.`, resultAsKeyValuePair);
17
+ return selectedCalendarGroup;
18
+ }
19
+ return calendarGroups[0];
20
+ }
21
+ };
22
+ //# sourceMappingURL=calendarGroup.js.map
@@ -336,8 +336,15 @@ export const entraApp = {
336
336
  },
337
337
  responseType: 'json'
338
338
  };
339
- const app = await request.get(requestOptions);
340
- return app;
339
+ try {
340
+ return await request.get(requestOptions);
341
+ }
342
+ catch (error) {
343
+ if (error?.response?.status === 404) {
344
+ throw Error(`App with objectId '${objectId}' not found in Microsoft Entra ID.`);
345
+ }
346
+ throw error;
347
+ }
341
348
  }
342
349
  };
343
350
  //# sourceMappingURL=entraApp.js.map
@@ -1,3 +1,4 @@
1
+ import { Range, coerce, gt, validRange } from 'semver';
1
2
  export const spfx = {
2
3
  isReactProject(project) {
3
4
  return (typeof project.yoRcJson !== 'undefined' &&
@@ -11,6 +12,64 @@ export const spfx = {
11
12
  typeof project.yoRcJson['@microsoft/generator-sharepoint'] !== 'undefined' &&
12
13
  project.yoRcJson["@microsoft/generator-sharepoint"].framework === 'knockout') ||
13
14
  typeof project.packageJson?.dependencies?.['knockout'] !== 'undefined';
15
+ },
16
+ getHighestNodeVersion(versionRange) {
17
+ if (!versionRange) {
18
+ throw new Error('Node version range was not provided.');
19
+ }
20
+ const ranges = versionRange
21
+ .split('||')
22
+ .map(range => range.trim())
23
+ .filter(range => range.length > 0);
24
+ let highestMajor = null;
25
+ let exactVersion = null;
26
+ const simpleVersionPattern = /^\d+(\.\d+(\.\d+)?)?$/;
27
+ if (ranges.every(r => simpleVersionPattern.test(r))) {
28
+ const highest = ranges.reduce((best, curr) => gt(coerce(curr), coerce(best)) ? curr : best);
29
+ const parts = highest.split('.');
30
+ if (parts.length >= 3) {
31
+ return highest;
32
+ }
33
+ if (parts.length === 2) {
34
+ return `${highest}.x`;
35
+ }
36
+ }
37
+ for (const rangeString of ranges) {
38
+ const normalized = validRange(rangeString);
39
+ if (!normalized) {
40
+ continue;
41
+ }
42
+ const rangeObj = new Range(normalized);
43
+ let maxMajor = 0;
44
+ // Analyze the range to find the maximum major version
45
+ for (const comparatorSet of rangeObj.set) {
46
+ for (const comparator of comparatorSet) {
47
+ if (comparator.operator === '<') {
48
+ // Exclusive upper bound: <17.0.0 means max major is 16
49
+ maxMajor = Math.max(maxMajor, comparator.semver.major - 1);
50
+ }
51
+ else if (comparator.operator === '<=') {
52
+ // Inclusive upper bound: <=17.0.0 means we can use exactly that version
53
+ maxMajor = Math.max(maxMajor, comparator.semver.major);
54
+ // Store the exact version for <= comparator
55
+ if (highestMajor === null || comparator.semver.major > highestMajor) {
56
+ exactVersion = comparator.semver.version;
57
+ }
58
+ }
59
+ else if (comparator.operator === '>=' || comparator.operator === '>') {
60
+ // For lower bounds use the major version
61
+ maxMajor = Math.max(maxMajor, comparator.semver.major);
62
+ }
63
+ }
64
+ }
65
+ // Track the highest major version across all ranges
66
+ highestMajor = Math.max(highestMajor ?? 0, maxMajor);
67
+ }
68
+ if (highestMajor === null) {
69
+ throw new Error(`Unable to resolve the highest Node version for range '${versionRange}'.`);
70
+ }
71
+ // Return exact version if we have a <= comparator, otherwise use .x
72
+ return exactVersion || `${highestMajor}.x`;
14
73
  }
15
74
  };
16
75
  //# sourceMappingURL=spfx.js.map
@@ -16,6 +16,25 @@ m365 entra license list [options]
16
16
 
17
17
  <Global />
18
18
 
19
+ ## Permissions
20
+
21
+ <Tabs>
22
+ <TabItem value="Delegated">
23
+
24
+ | Resource | Permissions |
25
+ |-----------------|----------------------------|
26
+ | Microsoft Graph | LicenseAssignment.Read.All |
27
+
28
+ </TabItem>
29
+ <TabItem value="Application">
30
+
31
+ | Resource | Permissions |
32
+ |-----------------|----------------------------|
33
+ | Microsoft Graph | LicenseAssignment.Read.All |
34
+
35
+ </TabItem>
36
+ </Tabs>
37
+
19
38
  ## Examples
20
39
 
21
40
  List all licenses within the tenant.
@@ -24,6 +24,25 @@ m365 entra m365group conversation list [options]
24
24
 
25
25
  <Global />
26
26
 
27
+ ## Permissions
28
+
29
+ <Tabs>
30
+ <TabItem value="Delegated">
31
+
32
+ | Resource | Permissions |
33
+ |-----------------|-----------------------------|
34
+ | Microsoft Graph | Group-Conversation.Read.All |
35
+
36
+ </TabItem>
37
+ <TabItem value="Application">
38
+
39
+ | Resource | Permissions |
40
+ |-----------------|-----------------------------|
41
+ | Microsoft Graph | Group-Conversation.Read.All |
42
+
43
+ </TabItem>
44
+ </Tabs>
45
+
27
46
  ## Examples
28
47
 
29
48
  Lists conversations for the Microsoft 365 group specified by id.
@@ -27,6 +27,25 @@ m365 entra m365group conversation post list [options]
27
27
 
28
28
  <Global />
29
29
 
30
+ ## Permissions
31
+
32
+ <Tabs>
33
+ <TabItem value="Delegated">
34
+
35
+ | Resource | Permissions |
36
+ |-----------------|-----------------------------|
37
+ | Microsoft Graph | Group-Conversation.Read.All |
38
+
39
+ </TabItem>
40
+ <TabItem value="Application">
41
+
42
+ | Resource | Permissions |
43
+ |-----------------|-----------------------------|
44
+ | Microsoft Graph | Group-Conversation.Read.All |
45
+
46
+ </TabItem>
47
+ </Tabs>
48
+
30
49
  ## Examples
31
50
 
32
51
  Lists the posts of the specific conversation of Microsoft 365 group by groupId
@@ -35,6 +35,25 @@ The user must have a `usageLocation` value in order to assign a license to it.
35
35
 
36
36
  :::
37
37
 
38
+ ## Permissions
39
+
40
+ <Tabs>
41
+ <TabItem value="Delegated">
42
+
43
+ | Resource | Permissions |
44
+ |-----------------|---------------------------------|
45
+ | Microsoft Graph | LicenseAssignment.ReadWrite.All |
46
+
47
+ </TabItem>
48
+ <TabItem value="Application">
49
+
50
+ | Resource | Permissions |
51
+ |-----------------|---------------------------------|
52
+ | Microsoft Graph | LicenseAssignment.ReadWrite.All |
53
+
54
+ </TabItem>
55
+ </Tabs>
56
+
38
57
  ## Examples
39
58
 
40
59
  Assign specific licenses to a specific user by UPN.
@@ -28,10 +28,27 @@ m365 entra user license list [options]
28
28
 
29
29
  :::tip
30
30
 
31
- If you don't specify any option, the command will list the license details of the current logged in user. This does not work when using application permissions.
31
+ If you don't specify any option, the command will list the license details of the current logged in user.
32
32
 
33
33
  :::
34
34
 
35
+ ## Permissions
36
+
37
+ <Tabs>
38
+ <TabItem value="Delegated">
39
+
40
+ | Resource | Permissions |
41
+ |-----------------|----------------------------|
42
+ | Microsoft Graph | LicenseAssignment.Read.All |
43
+
44
+ </TabItem>
45
+ <TabItem value="Application">
46
+
47
+ This command does not support application permissions.
48
+
49
+ </TabItem>
50
+ </Tabs>
51
+
35
52
  ## Examples
36
53
 
37
54
  List license details of the current logged in user.
@@ -1,4 +1,6 @@
1
1
  import Global from '../../_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
2
4
 
3
5
  # entra user license remove
4
6
 
@@ -28,6 +30,25 @@ m365 entra user license remove [options]
28
30
 
29
31
  <Global />
30
32
 
33
+ ## Permissions
34
+
35
+ <Tabs>
36
+ <TabItem value="Delegated">
37
+
38
+ | Resource | Permissions |
39
+ |-----------------|---------------------------------|
40
+ | Microsoft Graph | LicenseAssignment.ReadWrite.All |
41
+
42
+ </TabItem>
43
+ <TabItem value="Application">
44
+
45
+ | Resource | Permissions |
46
+ |-----------------|---------------------------------|
47
+ | Microsoft Graph | LicenseAssignment.ReadWrite.All |
48
+
49
+ </TabItem>
50
+ </Tabs>
51
+
31
52
  ## Examples
32
53
 
33
54
  Remove specific licenses from a specific user by UPN.
@@ -0,0 +1,165 @@
1
+ import Global from '../../_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # outlook calendar add
6
+
7
+ Creates a new calendar for a user
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 outlook calendar add [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md definition-list
18
+ `--userId [userId]`
19
+ : ID of the user. Specify either `userId` or `userName`, but not both.
20
+
21
+ `--userName [userName]`
22
+ : UPN of the user. Specify either `userId` or `userName`, but not both.
23
+
24
+ `--name <name>`
25
+ : Name of the calendar.
26
+
27
+ `--calendarGroupId [calendarGroupId]`
28
+ : Id of the group where the calendar will belong. Specify either `calendarGroupId` or `calendarGroupName`, but not both.
29
+
30
+ `--calendarGroupName [calendarGroupName]`
31
+ : Name of the group where the calendar will belong. Specify either `calendarGroupId` or `calendarGroupName`, but not both.
32
+
33
+ `--color [color]`
34
+ : The color of the calendar in UI. Allowed values are `auto`, `lightBlue`, `lightGreen`, `lightOrange`, `lightGray`, `lightYellow`, `lightTeal`, `lightPink`, `lightBrown`, `lightRed`, `maxColor`. Defaults to `auto`.
35
+
36
+ `--defaultOnlineMeetingProvider [defaultOnlineMeetingProvider]`
37
+ : The default online meeting provider for meetings sent from the calendar. Allowed values are `none`, `teamsForBusiness`. Defaults to `teamsForBusiness`.
38
+
39
+ `--default`
40
+ : Specify whether the calendar will be the default calendar for new events.
41
+ ```
42
+
43
+ <Global />
44
+
45
+ ## Permissions
46
+
47
+ <Tabs>
48
+ <TabItem value="Delegated">
49
+
50
+ | Resource | Permissions |
51
+ |-----------------|---------------------|
52
+ | Microsoft Graph | Calendars.ReadWrite |
53
+
54
+ </TabItem>
55
+ <TabItem value="Application">
56
+
57
+ | Resource | Permissions |
58
+ |-----------------|---------------------|
59
+ | Microsoft Graph | Calendars.ReadWrite |
60
+
61
+ </TabItem>
62
+ </Tabs>
63
+
64
+ ## Examples
65
+
66
+ Create a new calendar for a user in a default calendar's group
67
+
68
+ ```sh
69
+ m365 outlook calendar add --userId '@meId' --name 'Holidays'
70
+ ```
71
+
72
+ Create a new calendar for a user specified by email in a specific calendar group and defined color
73
+
74
+ ```sh
75
+ m365 outlook calendar add --userName 'john.doe@contoso.com' --name 'Interviews' --calendarGroupId 'AAMkADY1YmE3N2FhLWEwMz' --color 'lightBlue'
76
+ ```
77
+
78
+ ## Response
79
+
80
+ <Tabs>
81
+ <TabItem value="JSON">
82
+
83
+ ```json
84
+ {
85
+ "id": "AQMkAGRlMCQAAAA==",
86
+ "name": "My Calendars",
87
+ "color": "auto",
88
+ "hexColor": "",
89
+ "groupClassId": "0006f0b7-0000-0000-c000-000000000046",
90
+ "isDefaultCalendar": false,
91
+ "changeKey": "fJKVL07sbkmIfHqjbDnRgQACxSYYpw==",
92
+ "canShare": true,
93
+ "canViewPrivateItems": true,
94
+ "canEdit": true,
95
+ "allowedOnlineMeetingProviders": [
96
+ "teamsForBusiness"
97
+ ],
98
+ "defaultOnlineMeetingProvider": "teamsForBusiness",
99
+ "isTallyingResponses": false,
100
+ "isRemovable": true,
101
+ "owner": {
102
+ "name": "John Doe",
103
+ "address": "john.doe@contoso.com"
104
+ }
105
+ }
106
+ ```
107
+
108
+ </TabItem>
109
+ <TabItem value="Text">
110
+
111
+ ```text
112
+ allowedOnlineMeetingProviders: ["teamsForBusiness"]
113
+ canEdit : true
114
+ canShare : true
115
+ canViewPrivateItems : true
116
+ changeKey : fJKVL07sbkmIfHqjbDnRgQACxSYYug==
117
+ color : auto
118
+ defaultOnlineMeetingProvider : teamsForBusiness
119
+ groupClassId : 0006f0b7-0000-0000-c000-000000000046
120
+ hexColor :
121
+ id : AQMkAGRlMCQAAAA==
122
+ isDefaultCalendar : false
123
+ isRemovable : true
124
+ isTallyingResponses : false
125
+ name : My Calendars
126
+ owner : {"name":"John Doe","address":"john.doe@contoso.com"}
127
+ ```
128
+
129
+ </TabItem>
130
+ <TabItem value="CSV">
131
+
132
+ ```csv
133
+ id,name,color,hexColor,groupClassId,isDefaultCalendar,changeKey,canShare,canViewPrivateItems,canEdit,defaultOnlineMeetingProvider,isTallyingResponses,isRemovable
134
+ AQMkAGRlMCQAAAA==,My Calendars,auto,,0006f0b7-0000-0000-c000-000000000046,0,fJKVL07sbkmIfHqjbDnRgQACxSYYzQ==,1,1,1,teamsForBusiness,0,1
135
+ ```
136
+
137
+ </TabItem>
138
+ <TabItem value="Markdown">
139
+
140
+ ```md
141
+ # outlook calendar add --userId "893f9116-e024-4bc6-8e98-54c245129485" --name "My Calendars"
142
+
143
+ Date: 2/5/2026
144
+
145
+ ## My Calendars (AQMkAGRlMCQAAAA==)
146
+
147
+ Property | Value
148
+ ---------|-------
149
+ id | AQMkAGRlMCQAAAA==
150
+ name | My Calendars
151
+ color | auto
152
+ hexColor |
153
+ groupClassId | 0006f0b7-0000-0000-c000-000000000046
154
+ isDefaultCalendar | false
155
+ changeKey | fJKVL07sbkmIfHqjbDnRgQACxSYY4A==
156
+ canShare | true
157
+ canViewPrivateItems | true
158
+ canEdit | true
159
+ defaultOnlineMeetingProvider | teamsForBusiness
160
+ isTallyingResponses | false
161
+ isRemovable | true
162
+ ```
163
+
164
+ </TabItem>
165
+ </Tabs>