@pnp/cli-microsoft365 6.9.0-beta.f488de8 → 6.9.0-beta.f6054b4
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/Dockerfile +2 -1
- package/dist/cli/Cli.js +16 -0
- package/dist/m365/cli/commands/config/config-set.js +1 -0
- package/dist/m365/flow/commands/flow-list.js +4 -4
- package/dist/m365/pp/commands/card/card-get.js +6 -1
- package/dist/m365/spo/commands/navigation/navigation-node-add.js +31 -1
- package/dist/m365/spo/commands/navigation/navigation-node-set.js +31 -2
- package/dist/m365/spo/commands/tenant/Solution.js +3 -0
- package/dist/m365/spo/commands/tenant/tenant-commandset-add.js +215 -0
- package/dist/m365/spo/commands/tenant/tenant-commandset-get.js +114 -0
- package/dist/m365/spo/commands.js +2 -0
- package/dist/settingsNames.js +1 -0
- package/dist/utils/spo.js +60 -0
- package/docs/docs/cmd/flow/flow-list.mdx +11 -3
- package/docs/docs/cmd/flow/run/run-list.mdx +0 -3
- package/docs/docs/cmd/spo/navigation/navigation-node-add.mdx +7 -4
- package/docs/docs/cmd/spo/navigation/navigation-node-set.mdx +9 -0
- package/docs/docs/cmd/spo/tenant/tenant-commandset-add.mdx +183 -0
- package/docs/docs/cmd/spo/tenant/tenant-commandset-get.mdx +155 -0
- package/package.json +1 -1
package/Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
FROM mcr.microsoft.com/powershell:alpine-3.
|
|
1
|
+
FROM mcr.microsoft.com/powershell:alpine-3.17
|
|
2
2
|
|
|
3
3
|
ARG CLI_VERSION=latest
|
|
4
4
|
|
|
@@ -48,6 +48,7 @@ RUN bash -c 'echo "export PATH=$PATH:/home/cli-microsoft365/.npm-global/bin:/hom
|
|
|
48
48
|
&& bash -c 'm365 cli completion sh setup' \
|
|
49
49
|
&& pwsh -c 'm365 cli completion pwsh setup --profile $profile'
|
|
50
50
|
|
|
51
|
+
RUN pip install setuptools==58
|
|
51
52
|
RUN pip install jmespath-terminal
|
|
52
53
|
|
|
53
54
|
CMD [ "bash", "-l" ]
|
package/dist/cli/Cli.js
CHANGED
|
@@ -801,6 +801,22 @@ class Cli {
|
|
|
801
801
|
return response;
|
|
802
802
|
});
|
|
803
803
|
}
|
|
804
|
+
static handleMultipleResultsFound(promptMessage, errorMessage, values) {
|
|
805
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
806
|
+
const interactive = Cli.getInstance().getSettingWithDefaultValue(settingsNames_1.settingsNames.interactive, false);
|
|
807
|
+
if (!interactive) {
|
|
808
|
+
throw errorMessage;
|
|
809
|
+
}
|
|
810
|
+
const response = yield Cli.prompt({
|
|
811
|
+
type: 'list',
|
|
812
|
+
name: 'select',
|
|
813
|
+
default: 0,
|
|
814
|
+
message: promptMessage,
|
|
815
|
+
choices: Object.keys(values)
|
|
816
|
+
});
|
|
817
|
+
return values[response.select];
|
|
818
|
+
});
|
|
819
|
+
}
|
|
804
820
|
static removeShortOptions(args) {
|
|
805
821
|
const filteredArgs = JSON.parse(JSON.stringify(args));
|
|
806
822
|
const optionsToRemove = Object.getOwnPropertyNames(args.options)
|
|
@@ -43,6 +43,7 @@ class CliConfigSetCommand extends AnonymousCommand_1.default {
|
|
|
43
43
|
case settingsNames_1.settingsNames.csvQuoted:
|
|
44
44
|
case settingsNames_1.settingsNames.csvQuotedEmpty:
|
|
45
45
|
case settingsNames_1.settingsNames.disableTelemetry:
|
|
46
|
+
case settingsNames_1.settingsNames.interactive:
|
|
46
47
|
case settingsNames_1.settingsNames.printErrorsAsPlainText:
|
|
47
48
|
case settingsNames_1.settingsNames.prompt:
|
|
48
49
|
case settingsNames_1.settingsNames.showHelpOnFailure:
|
|
@@ -31,7 +31,7 @@ class FlowListCommand extends AzmgmtItemsListCommand_1.AzmgmtItemsListCommand {
|
|
|
31
31
|
constructor() {
|
|
32
32
|
super();
|
|
33
33
|
_FlowListCommand_instances.add(this);
|
|
34
|
-
this.
|
|
34
|
+
this.allowedSharingStatuses = ['all', 'personal', 'ownedByMe', 'sharedWithMe'];
|
|
35
35
|
__classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initTelemetry).call(this);
|
|
36
36
|
__classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initOptions).call(this);
|
|
37
37
|
__classPrivateFieldGet(this, _FlowListCommand_instances, "m", _FlowListCommand_initValidators).call(this);
|
|
@@ -88,7 +88,7 @@ _FlowListCommand_instances = new WeakSet(), _FlowListCommand_initTelemetry = fun
|
|
|
88
88
|
option: '-e, --environmentName <environmentName>'
|
|
89
89
|
}, {
|
|
90
90
|
option: '--sharingStatus [sharingStatus]',
|
|
91
|
-
autocomplete: this.
|
|
91
|
+
autocomplete: this.allowedSharingStatuses
|
|
92
92
|
}, {
|
|
93
93
|
option: '--asAdmin'
|
|
94
94
|
});
|
|
@@ -97,8 +97,8 @@ _FlowListCommand_instances = new WeakSet(), _FlowListCommand_initTelemetry = fun
|
|
|
97
97
|
if (args.options.asAdmin && args.options.sharingStatus) {
|
|
98
98
|
return `The options asAdmin and sharingStatus cannot be specified together.`;
|
|
99
99
|
}
|
|
100
|
-
if (args.options.sharingStatus && !this.
|
|
101
|
-
return `${args.options.sharingStatus} is not a valid sharing status. Allowed values are: ${this.
|
|
100
|
+
if (args.options.sharingStatus && !this.allowedSharingStatuses.some(status => status === args.options.sharingStatus)) {
|
|
101
|
+
return `${args.options.sharingStatus} is not a valid sharing status. Allowed values are: ${this.allowedSharingStatuses.join(',')}`;
|
|
102
102
|
}
|
|
103
103
|
return true;
|
|
104
104
|
}));
|
|
@@ -20,6 +20,7 @@ const PowerPlatformCommand_1 = require("../../../base/PowerPlatformCommand");
|
|
|
20
20
|
const commands_1 = require("../../commands");
|
|
21
21
|
const request_1 = require("../../../../request");
|
|
22
22
|
const validation_1 = require("../../../../utils/validation");
|
|
23
|
+
const Cli_1 = require("../../../../cli/Cli");
|
|
23
24
|
class PpCardGetCommand extends PowerPlatformCommand_1.default {
|
|
24
25
|
get name() {
|
|
25
26
|
return commands_1.default.CARD_GET;
|
|
@@ -72,7 +73,11 @@ class PpCardGetCommand extends PowerPlatformCommand_1.default {
|
|
|
72
73
|
throw `The specified card '${options.name}' does not exist.`;
|
|
73
74
|
}
|
|
74
75
|
if (result.value.length > 1) {
|
|
75
|
-
|
|
76
|
+
const resultAsKeyValuePair = {};
|
|
77
|
+
result.value.forEach((obj) => {
|
|
78
|
+
resultAsKeyValuePair[obj.cardid] = obj;
|
|
79
|
+
});
|
|
80
|
+
return Cli_1.Cli.handleMultipleResultsFound(`Multiple cards with name '${options.name}' found. Choose the correct ID:`, `Multiple cards with name '${options.name}' found.`, resultAsKeyValuePair);
|
|
76
81
|
}
|
|
77
82
|
return result.value[0];
|
|
78
83
|
});
|
|
@@ -16,6 +16,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
16
16
|
var _SpoNavigationNodeAddCommand_instances, _SpoNavigationNodeAddCommand_initTelemetry, _SpoNavigationNodeAddCommand_initOptions, _SpoNavigationNodeAddCommand_initValidators, _SpoNavigationNodeAddCommand_initOptionSets;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const request_1 = require("../../../../request");
|
|
19
|
+
const spo_1 = require("../../../../utils/spo");
|
|
19
20
|
const validation_1 = require("../../../../utils/validation");
|
|
20
21
|
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
21
22
|
const commands_1 = require("../../commands");
|
|
@@ -62,6 +63,20 @@ class SpoNavigationNodeAddCommand extends SpoCommand_1.default {
|
|
|
62
63
|
};
|
|
63
64
|
try {
|
|
64
65
|
const res = yield request_1.default.post(requestOptions);
|
|
66
|
+
if (args.options.openInNewWindow) {
|
|
67
|
+
if (this.verbose) {
|
|
68
|
+
logger.logToStderr(`Making sure that the newly added navigation node opens in a new window.`);
|
|
69
|
+
}
|
|
70
|
+
const id = res.Id.toString();
|
|
71
|
+
let menuState = args.options.location === 'TopNavigationBar' ? yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl) : yield spo_1.spo.getQuickLaunchMenuState(args.options.webUrl);
|
|
72
|
+
let menuStateItem = this.getMenuStateNode(menuState.Nodes, id);
|
|
73
|
+
if (args.options.parentNodeId && !menuStateItem) {
|
|
74
|
+
menuState = yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl);
|
|
75
|
+
menuStateItem = this.getMenuStateNode(menuState.Nodes, id);
|
|
76
|
+
}
|
|
77
|
+
menuStateItem.OpenInNewWindow = true;
|
|
78
|
+
yield spo_1.spo.saveMenuState(args.options.webUrl, menuState);
|
|
79
|
+
}
|
|
65
80
|
logger.log(res);
|
|
66
81
|
}
|
|
67
82
|
catch (err) {
|
|
@@ -69,6 +84,18 @@ class SpoNavigationNodeAddCommand extends SpoCommand_1.default {
|
|
|
69
84
|
}
|
|
70
85
|
});
|
|
71
86
|
}
|
|
87
|
+
getMenuStateNode(nodes, id) {
|
|
88
|
+
let menuNode = nodes.find((node) => node.Key !== null && node.Key === id);
|
|
89
|
+
if (menuNode === undefined) {
|
|
90
|
+
for (const node of nodes.filter(node => node.Nodes.length > 0)) {
|
|
91
|
+
menuNode = this.getMenuStateNode(node.Nodes, id);
|
|
92
|
+
if (menuNode) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return menuNode;
|
|
98
|
+
}
|
|
72
99
|
}
|
|
73
100
|
_SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCommand_initTelemetry = function _SpoNavigationNodeAddCommand_initTelemetry() {
|
|
74
101
|
this.telemetry.push((args) => {
|
|
@@ -77,7 +104,8 @@ _SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCom
|
|
|
77
104
|
location: typeof args.options.location !== 'undefined',
|
|
78
105
|
parentNodeId: typeof args.options.parentNodeId !== 'undefined',
|
|
79
106
|
audienceIds: typeof args.options.audienceIds !== 'undefined',
|
|
80
|
-
url: typeof args.options.url !== 'undefined'
|
|
107
|
+
url: typeof args.options.url !== 'undefined',
|
|
108
|
+
openInNewWindow: !!args.options.openInNewWindow
|
|
81
109
|
});
|
|
82
110
|
});
|
|
83
111
|
}, _SpoNavigationNodeAddCommand_initOptions = function _SpoNavigationNodeAddCommand_initOptions() {
|
|
@@ -96,6 +124,8 @@ _SpoNavigationNodeAddCommand_instances = new WeakSet(), _SpoNavigationNodeAddCom
|
|
|
96
124
|
option: '--isExternal'
|
|
97
125
|
}, {
|
|
98
126
|
option: '--audienceIds [audienceIds]'
|
|
127
|
+
}, {
|
|
128
|
+
option: '--openInNewWindow'
|
|
99
129
|
});
|
|
100
130
|
}, _SpoNavigationNodeAddCommand_initValidators = function _SpoNavigationNodeAddCommand_initValidators() {
|
|
101
131
|
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -16,6 +16,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
16
16
|
var _SpoNavigationNodeSetCommand_instances, _SpoNavigationNodeSetCommand_initTelemetry, _SpoNavigationNodeSetCommand_initTypes, _SpoNavigationNodeSetCommand_initOptions, _SpoNavigationNodeSetCommand_initValidators;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const request_1 = require("../../../../request");
|
|
19
|
+
const spo_1 = require("../../../../utils/spo");
|
|
19
20
|
const validation_1 = require("../../../../utils/validation");
|
|
20
21
|
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
21
22
|
const commands_1 = require("../../commands");
|
|
@@ -65,12 +66,37 @@ class SpoNavigationNodeSetCommand extends SpoCommand_1.default {
|
|
|
65
66
|
if (response['odata.null'] === true) {
|
|
66
67
|
throw `Navigation node does not exist.`;
|
|
67
68
|
}
|
|
69
|
+
if (args.options.openInNewWindow !== undefined) {
|
|
70
|
+
if (this.verbose) {
|
|
71
|
+
logger.logToStderr(`Making sure that the navigation node opens in a new window.`);
|
|
72
|
+
}
|
|
73
|
+
let menuState = yield spo_1.spo.getQuickLaunchMenuState(args.options.webUrl);
|
|
74
|
+
let menuStateItem = this.getMenuStateNode(menuState.Nodes, args.options.id);
|
|
75
|
+
if (!menuStateItem) {
|
|
76
|
+
menuState = yield spo_1.spo.getTopNavigationMenuState(args.options.webUrl);
|
|
77
|
+
menuStateItem = this.getMenuStateNode(menuState.Nodes, args.options.id);
|
|
78
|
+
}
|
|
79
|
+
menuStateItem.OpenInNewWindow = args.options.openInNewWindow;
|
|
80
|
+
yield spo_1.spo.saveMenuState(args.options.webUrl, menuState);
|
|
81
|
+
}
|
|
68
82
|
}
|
|
69
83
|
catch (err) {
|
|
70
84
|
this.handleRejectedODataJsonPromise(err);
|
|
71
85
|
}
|
|
72
86
|
});
|
|
73
87
|
}
|
|
88
|
+
getMenuStateNode(nodes, id) {
|
|
89
|
+
let menuNode = nodes.find((node) => node.Key.toString() === id.toString());
|
|
90
|
+
if (menuNode === undefined) {
|
|
91
|
+
for (const node of nodes.filter(node => node.Nodes.length > 0)) {
|
|
92
|
+
menuNode = this.getMenuStateNode(node.Nodes, id);
|
|
93
|
+
if (menuNode) {
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return menuNode;
|
|
99
|
+
}
|
|
74
100
|
}
|
|
75
101
|
_SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCommand_initTelemetry = function _SpoNavigationNodeSetCommand_initTelemetry() {
|
|
76
102
|
this.telemetry.push((args) => {
|
|
@@ -78,7 +104,8 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
|
|
|
78
104
|
title: typeof args.options.title !== 'undefined',
|
|
79
105
|
url: typeof args.options.url !== 'undefined',
|
|
80
106
|
isExternal: typeof args.options.isExternal !== 'undefined',
|
|
81
|
-
audienceIds: typeof args.options.audienceIds !== 'undefined'
|
|
107
|
+
audienceIds: typeof args.options.audienceIds !== 'undefined',
|
|
108
|
+
openInNewWindow: typeof args.options.openInNewWindow !== 'undefined'
|
|
82
109
|
});
|
|
83
110
|
});
|
|
84
111
|
}, _SpoNavigationNodeSetCommand_initTypes = function _SpoNavigationNodeSetCommand_initTypes() {
|
|
@@ -96,6 +123,8 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
|
|
|
96
123
|
option: '--audienceIds [audienceIds]'
|
|
97
124
|
}, {
|
|
98
125
|
option: '--isExternal [isExternal]'
|
|
126
|
+
}, {
|
|
127
|
+
option: '--openInNewWindow [openInNewWindow]'
|
|
99
128
|
});
|
|
100
129
|
}, _SpoNavigationNodeSetCommand_initValidators = function _SpoNavigationNodeSetCommand_initValidators() {
|
|
101
130
|
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -103,7 +132,7 @@ _SpoNavigationNodeSetCommand_instances = new WeakSet(), _SpoNavigationNodeSetCom
|
|
|
103
132
|
if (isValidSharePointUrl !== true) {
|
|
104
133
|
return isValidSharePointUrl;
|
|
105
134
|
}
|
|
106
|
-
if (args.options.audienceIds === undefined && !args.options.url && args.options.isExternal === undefined && !args.options.title) {
|
|
135
|
+
if (args.options.audienceIds === undefined && !args.options.url && args.options.isExternal === undefined && !args.options.title && args.options.openInNewWindow === undefined) {
|
|
107
136
|
return `Please specify atleast one property to update.`;
|
|
108
137
|
}
|
|
109
138
|
if (args.options.audienceIds) {
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
12
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
13
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
14
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
15
|
+
};
|
|
16
|
+
var _SpoTenantCommandSetAddCommand_instances, _SpoTenantCommandSetAddCommand_initTelemetry, _SpoTenantCommandSetAddCommand_initOptions, _SpoTenantCommandSetAddCommand_initValidators;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const validation_1 = require("../../../../utils/validation");
|
|
19
|
+
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
20
|
+
const commands_1 = require("../../commands");
|
|
21
|
+
const Cli_1 = require("../../../../cli/Cli");
|
|
22
|
+
const spoTenantAppCatalogUrlGetCommand = require("./tenant-appcatalogurl-get");
|
|
23
|
+
const spoListItemAddCommand = require("../listitem/listitem-add");
|
|
24
|
+
const spoListItemListCommand = require("../listitem/listitem-list");
|
|
25
|
+
const urlUtil_1 = require("../../../../utils/urlUtil");
|
|
26
|
+
class SpoTenantCommandSetAddCommand extends SpoCommand_1.default {
|
|
27
|
+
get name() {
|
|
28
|
+
return commands_1.default.TENANT_COMMANDSET_ADD;
|
|
29
|
+
}
|
|
30
|
+
get description() {
|
|
31
|
+
return 'Add a ListView Command Set as a tenant-wide extension.';
|
|
32
|
+
}
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
_SpoTenantCommandSetAddCommand_instances.add(this);
|
|
36
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initTelemetry).call(this);
|
|
37
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initOptions).call(this);
|
|
38
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetAddCommand_instances, "m", _SpoTenantCommandSetAddCommand_initValidators).call(this);
|
|
39
|
+
}
|
|
40
|
+
commandAction(logger, args) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
try {
|
|
43
|
+
const appCatalogUrl = yield this.getAppCatalogUrl(logger);
|
|
44
|
+
const componentManifest = yield this.getComponentManifest(appCatalogUrl, args.options.clientSideComponentId, logger);
|
|
45
|
+
const clientComponentManifest = JSON.parse(componentManifest.ClientComponentManifest);
|
|
46
|
+
if (clientComponentManifest.extensionType !== "ListViewCommandSet") {
|
|
47
|
+
throw `The extension type of this component is not of type 'ListViewCommandSet' but of type '${clientComponentManifest.extensionType}'`;
|
|
48
|
+
}
|
|
49
|
+
const solution = yield this.getSolutionFromAppCatalog(appCatalogUrl, componentManifest.SolutionId, logger);
|
|
50
|
+
if (!solution.ContainsTenantWideExtension) {
|
|
51
|
+
throw `The solution does not contain an extension that can be deployed to all sites. Make sure that you've entered the correct component Id.`;
|
|
52
|
+
}
|
|
53
|
+
else if (!solution.SkipFeatureDeployment) {
|
|
54
|
+
throw 'The solution has not been deployed to all sites. Make sure to deploy this solution to all sites.';
|
|
55
|
+
}
|
|
56
|
+
yield this.addTenantWideExtension(appCatalogUrl, args.options, logger);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
this.handleRejectedODataJsonPromise(err);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
getAppCatalogUrl(logger) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
const spoTenantAppCatalogUrlGetCommandOutput = yield Cli_1.Cli.executeCommandWithOutput(spoTenantAppCatalogUrlGetCommand, { options: { output: 'text', _: [] } });
|
|
66
|
+
if (this.verbose) {
|
|
67
|
+
logger.logToStderr(spoTenantAppCatalogUrlGetCommandOutput.stderr);
|
|
68
|
+
}
|
|
69
|
+
const appCatalogUrl = spoTenantAppCatalogUrlGetCommandOutput.stdout;
|
|
70
|
+
if (!appCatalogUrl) {
|
|
71
|
+
throw 'Cannot add tenant-wide ListView Command Set as app catalog cannot be found';
|
|
72
|
+
}
|
|
73
|
+
if (this.verbose) {
|
|
74
|
+
logger.logToStderr(`Got tenant app catalog url: ${appCatalogUrl}`);
|
|
75
|
+
}
|
|
76
|
+
return appCatalogUrl;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
getComponentManifest(appCatalogUrl, clientSideComponentId, logger) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
if (this.verbose) {
|
|
82
|
+
logger.logToStderr('Retrieving component manifest item from the ComponentManifests list on the app catalog site so that we get the solution id');
|
|
83
|
+
}
|
|
84
|
+
const camlQuery = `<View><ViewFields><FieldRef Name='ClientComponentId'></FieldRef><FieldRef Name='SolutionId'></FieldRef><FieldRef Name='ClientComponentManifest'></FieldRef></ViewFields><Query><Where><Eq><FieldRef Name='ClientComponentId' /><Value Type='Guid'>${clientSideComponentId}</Value></Eq></Where></Query></View>`;
|
|
85
|
+
const commandOptions = {
|
|
86
|
+
webUrl: appCatalogUrl,
|
|
87
|
+
listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/Lists/ComponentManifests`,
|
|
88
|
+
camlQuery: camlQuery,
|
|
89
|
+
verbose: this.verbose,
|
|
90
|
+
debug: this.debug,
|
|
91
|
+
output: 'json'
|
|
92
|
+
};
|
|
93
|
+
const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
|
|
94
|
+
if (this.verbose) {
|
|
95
|
+
logger.logToStderr(output.stderr);
|
|
96
|
+
}
|
|
97
|
+
const outputParsed = JSON.parse(output.stdout);
|
|
98
|
+
if (outputParsed.length === 0) {
|
|
99
|
+
throw 'No component found with the specified clientSideComponentId found in the component manifest list. Make sure that the application is added to the application catalog';
|
|
100
|
+
}
|
|
101
|
+
return outputParsed[0];
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
getSolutionFromAppCatalog(appCatalogUrl, solutionId, logger) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
if (this.verbose) {
|
|
107
|
+
logger.logToStderr(`Retrieving solution with id ${solutionId} from the application catalog`);
|
|
108
|
+
}
|
|
109
|
+
const camlQuery = `<View><ViewFields><FieldRef Name='SkipFeatureDeployment'></FieldRef><FieldRef Name='ContainsTenantWideExtension'></FieldRef></ViewFields><Query><Where><Eq><FieldRef Name='AppProductID' /><Value Type='Guid'>${solutionId}</Value></Eq></Where></Query></View>`;
|
|
110
|
+
const commandOptions = {
|
|
111
|
+
webUrl: appCatalogUrl,
|
|
112
|
+
listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/AppCatalog`,
|
|
113
|
+
camlQuery: camlQuery,
|
|
114
|
+
verbose: this.verbose,
|
|
115
|
+
debug: this.debug,
|
|
116
|
+
output: 'json'
|
|
117
|
+
};
|
|
118
|
+
const output = yield Cli_1.Cli.executeCommandWithOutput(spoListItemListCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
|
|
119
|
+
if (this.verbose) {
|
|
120
|
+
logger.logToStderr(output.stderr);
|
|
121
|
+
}
|
|
122
|
+
const outputParsed = JSON.parse(output.stdout);
|
|
123
|
+
if (outputParsed.length === 0) {
|
|
124
|
+
throw `No component found with the solution id ${solutionId}. Make sure that the solution is available in the app catalog`;
|
|
125
|
+
}
|
|
126
|
+
return outputParsed[0];
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
addTenantWideExtension(appCatalogUrl, options, logger) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
if (this.verbose) {
|
|
132
|
+
logger.logToStderr('Pre-checks finished. Adding tenant wide extension to the TenantWideExtensions list');
|
|
133
|
+
}
|
|
134
|
+
const commandOptions = {
|
|
135
|
+
webUrl: appCatalogUrl,
|
|
136
|
+
listUrl: `${urlUtil_1.urlUtil.getServerRelativeSiteUrl(appCatalogUrl)}/Lists/TenantWideExtensions`,
|
|
137
|
+
Title: options.title,
|
|
138
|
+
TenantWideExtensionComponentId: options.clientSideComponentId,
|
|
139
|
+
TenantWideExtensionLocation: this.getLocation(options.location),
|
|
140
|
+
TenantWideExtensionSequence: 0,
|
|
141
|
+
TenantWideExtensionListTemplate: this.getListTemplate(options.listType),
|
|
142
|
+
TenantWideExtensionComponentProperties: options.clientSideComponentProperties || '',
|
|
143
|
+
TenantWideExtensionWebTemplate: options.webTemplate || '',
|
|
144
|
+
TenantWideExtensionDisabled: false,
|
|
145
|
+
verbose: this.verbose,
|
|
146
|
+
debug: this.debug,
|
|
147
|
+
output: options.output
|
|
148
|
+
};
|
|
149
|
+
yield Cli_1.Cli.executeCommand(spoListItemAddCommand, { options: Object.assign(Object.assign({}, commandOptions), { _: [] }) });
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
getLocation(location) {
|
|
153
|
+
switch (location) {
|
|
154
|
+
case 'Both':
|
|
155
|
+
return 'ClientSideExtension.ListViewCommandSet';
|
|
156
|
+
case 'ContextMenu':
|
|
157
|
+
return 'ClientSideExtension.ListViewCommandSet.ContextMenu';
|
|
158
|
+
default:
|
|
159
|
+
return 'ClientSideExtension.ListViewCommandSet.CommandBar';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
getListTemplate(listTemplate) {
|
|
163
|
+
switch (listTemplate) {
|
|
164
|
+
case 'SitePages':
|
|
165
|
+
return '119';
|
|
166
|
+
case 'Library':
|
|
167
|
+
return '101';
|
|
168
|
+
default:
|
|
169
|
+
return '100';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
_SpoTenantCommandSetAddCommand_instances = new WeakSet(), _SpoTenantCommandSetAddCommand_initTelemetry = function _SpoTenantCommandSetAddCommand_initTelemetry() {
|
|
174
|
+
this.telemetry.push((args) => {
|
|
175
|
+
Object.assign(this.telemetryProperties, {
|
|
176
|
+
listType: args.options.listType,
|
|
177
|
+
clientSideComponentProperties: typeof args.options.clientSideComponentProperties !== 'undefined',
|
|
178
|
+
webTemplate: typeof args.options.webTemplate !== 'undefined',
|
|
179
|
+
location: args.options.location
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}, _SpoTenantCommandSetAddCommand_initOptions = function _SpoTenantCommandSetAddCommand_initOptions() {
|
|
183
|
+
this.options.unshift({
|
|
184
|
+
option: '-t, --title <title>'
|
|
185
|
+
}, {
|
|
186
|
+
option: '-l, --listType <listType>',
|
|
187
|
+
autocomplete: SpoTenantCommandSetAddCommand.listTypes
|
|
188
|
+
}, {
|
|
189
|
+
option: '-i, --clientSideComponentId <clientSideComponentId>'
|
|
190
|
+
}, {
|
|
191
|
+
option: '-p, --clientSideComponentProperties [clientSideComponentProperties]'
|
|
192
|
+
}, {
|
|
193
|
+
option: '-w, --webTemplate [webTemplate]'
|
|
194
|
+
}, {
|
|
195
|
+
option: '--location [location]',
|
|
196
|
+
autocomplete: SpoTenantCommandSetAddCommand.locations
|
|
197
|
+
});
|
|
198
|
+
}, _SpoTenantCommandSetAddCommand_initValidators = function _SpoTenantCommandSetAddCommand_initValidators() {
|
|
199
|
+
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
|
|
200
|
+
if (!validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
|
|
201
|
+
return `${args.options.clientSideComponentId} is not a valid GUID`;
|
|
202
|
+
}
|
|
203
|
+
if (SpoTenantCommandSetAddCommand.listTypes.indexOf(args.options.listType) < 0) {
|
|
204
|
+
return `${args.options.listType} is not a valid list type. Allowed values are ${SpoTenantCommandSetAddCommand.listTypes.join(', ')}`;
|
|
205
|
+
}
|
|
206
|
+
if (args.options.location && SpoTenantCommandSetAddCommand.locations.indexOf(args.options.location) < 0) {
|
|
207
|
+
return `${args.options.location} is not a valid location. Allowed values are ${SpoTenantCommandSetAddCommand.locations.join(', ')}`;
|
|
208
|
+
}
|
|
209
|
+
return true;
|
|
210
|
+
}));
|
|
211
|
+
};
|
|
212
|
+
SpoTenantCommandSetAddCommand.listTypes = ['List', 'Library', 'SitePages'];
|
|
213
|
+
SpoTenantCommandSetAddCommand.locations = ['ContextMenu', 'CommandBar', 'Both'];
|
|
214
|
+
module.exports = new SpoTenantCommandSetAddCommand();
|
|
215
|
+
//# sourceMappingURL=tenant-commandset-add.js.map
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
12
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
13
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
14
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
15
|
+
};
|
|
16
|
+
var _SpoTenantCommandSetGetCommand_instances, _SpoTenantCommandSetGetCommand_initTelemetry, _SpoTenantCommandSetGetCommand_initOptions, _SpoTenantCommandSetGetCommand_initValidators, _SpoTenantCommandSetGetCommand_initOptionSets;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const Command_1 = require("../../../../Command");
|
|
19
|
+
const request_1 = require("../../../../request");
|
|
20
|
+
const formatting_1 = require("../../../../utils/formatting");
|
|
21
|
+
const spo_1 = require("../../../../utils/spo");
|
|
22
|
+
const urlUtil_1 = require("../../../../utils/urlUtil");
|
|
23
|
+
const validation_1 = require("../../../../utils/validation");
|
|
24
|
+
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
25
|
+
const commands_1 = require("../../commands");
|
|
26
|
+
class SpoTenantCommandSetGetCommand extends SpoCommand_1.default {
|
|
27
|
+
get name() {
|
|
28
|
+
return commands_1.default.TENANT_COMMANDSET_GET;
|
|
29
|
+
}
|
|
30
|
+
get description() {
|
|
31
|
+
return 'Get a ListView Command Set that is installed tenant wide';
|
|
32
|
+
}
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
_SpoTenantCommandSetGetCommand_instances.add(this);
|
|
36
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initTelemetry).call(this);
|
|
37
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initOptions).call(this);
|
|
38
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initValidators).call(this);
|
|
39
|
+
__classPrivateFieldGet(this, _SpoTenantCommandSetGetCommand_instances, "m", _SpoTenantCommandSetGetCommand_initOptionSets).call(this);
|
|
40
|
+
}
|
|
41
|
+
commandAction(logger, args) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
const appCatalogUrl = yield spo_1.spo.getTenantAppCatalogUrl(logger, this.debug);
|
|
44
|
+
if (!appCatalogUrl) {
|
|
45
|
+
throw new Command_1.CommandError('No app catalog URL found');
|
|
46
|
+
}
|
|
47
|
+
let filter = `startswith(TenantWideExtensionLocation,'ClientSideExtension.ListViewCommandSet')`;
|
|
48
|
+
if (args.options.title) {
|
|
49
|
+
filter += ` and Title eq '${args.options.title}'`;
|
|
50
|
+
}
|
|
51
|
+
else if (args.options.id) {
|
|
52
|
+
filter += ` and Id eq ${args.options.id}`;
|
|
53
|
+
}
|
|
54
|
+
else if (args.options.clientSideComponentId) {
|
|
55
|
+
filter += ` and TenantWideExtensionComponentId eq '${args.options.clientSideComponentId}'`;
|
|
56
|
+
}
|
|
57
|
+
const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(appCatalogUrl, '/lists/TenantWideExtensions');
|
|
58
|
+
const reqOptions = {
|
|
59
|
+
url: `${appCatalogUrl}/_api/web/GetList('${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')/items?$filter=${filter}`,
|
|
60
|
+
headers: {
|
|
61
|
+
'accept': 'application/json;odata=nometadata'
|
|
62
|
+
},
|
|
63
|
+
responseType: 'json'
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
const listItemInstances = yield request_1.default.get(reqOptions);
|
|
67
|
+
if ((listItemInstances === null || listItemInstances === void 0 ? void 0 : listItemInstances.value.length) > 0) {
|
|
68
|
+
if (listItemInstances.value.length > 1) {
|
|
69
|
+
throw `Multiple ListView Command Sets with ${args.options.title || args.options.clientSideComponentId} were found. Please disambiguate (IDs): ${listItemInstances.value.map(item => item.Id).join(', ')}`;
|
|
70
|
+
}
|
|
71
|
+
listItemInstances.value.forEach(v => delete v['ID']);
|
|
72
|
+
logger.log(listItemInstances.value[0]);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw 'The specified ListView Command Set was not found';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return this.handleRejectedODataJsonPromise(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
_SpoTenantCommandSetGetCommand_instances = new WeakSet(), _SpoTenantCommandSetGetCommand_initTelemetry = function _SpoTenantCommandSetGetCommand_initTelemetry() {
|
|
85
|
+
this.telemetry.push((args) => {
|
|
86
|
+
Object.assign(this.telemetryProperties, {
|
|
87
|
+
title: typeof args.options.title !== 'undefined',
|
|
88
|
+
id: typeof args.options.id !== 'undefined',
|
|
89
|
+
clientSideComponentId: typeof args.options.clientSideComponentId !== 'undefined'
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}, _SpoTenantCommandSetGetCommand_initOptions = function _SpoTenantCommandSetGetCommand_initOptions() {
|
|
93
|
+
this.options.unshift({
|
|
94
|
+
option: '-t, --title [title]'
|
|
95
|
+
}, {
|
|
96
|
+
option: '-i, --id [id]'
|
|
97
|
+
}, {
|
|
98
|
+
option: '-c, --clientSideComponentId [clientSideComponentId]'
|
|
99
|
+
});
|
|
100
|
+
}, _SpoTenantCommandSetGetCommand_initValidators = function _SpoTenantCommandSetGetCommand_initValidators() {
|
|
101
|
+
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
if (args.options.id && isNaN(parseInt(args.options.id))) {
|
|
103
|
+
return `${args.options.id} is not a number`;
|
|
104
|
+
}
|
|
105
|
+
if (args.options.clientSideComponentId && !validation_1.validation.isValidGuid(args.options.clientSideComponentId)) {
|
|
106
|
+
return `${args.options.clientSideComponentId} is not a valid GUID`;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}));
|
|
110
|
+
}, _SpoTenantCommandSetGetCommand_initOptionSets = function _SpoTenantCommandSetGetCommand_initOptionSets() {
|
|
111
|
+
this.optionSets.push({ options: ['title', 'id', 'clientSideComponentId'] });
|
|
112
|
+
};
|
|
113
|
+
module.exports = new SpoTenantCommandSetGetCommand();
|
|
114
|
+
//# sourceMappingURL=tenant-commandset-get.js.map
|
|
@@ -295,6 +295,8 @@ exports.default = {
|
|
|
295
295
|
TENANT_APPLICATIONCUSTOMIZER_GET: `${prefix} tenant applicationcustomizer get`,
|
|
296
296
|
TENANT_APPLICATIONCUSTOMIZER_LIST: `${prefix} tenant applicationcustomizer list`,
|
|
297
297
|
TENANT_APPLICATIONCUSTOMIZER_REMOVE: `${prefix} tenant applicationcustomizer remove`,
|
|
298
|
+
TENANT_COMMANDSET_ADD: `${prefix} tenant commandset add`,
|
|
299
|
+
TENANT_COMMANDSET_GET: `${prefix} tenant commandset get`,
|
|
298
300
|
TENANT_COMMANDSET_REMOVE: `${prefix} tenant commandset remove`,
|
|
299
301
|
TENANT_COMMANDSET_SET: `${prefix} tenant commandset set`,
|
|
300
302
|
TENANT_RECYCLEBINITEM_LIST: `${prefix} tenant recyclebinitem list`,
|
package/dist/settingsNames.js
CHANGED
package/dist/utils/spo.js
CHANGED
|
@@ -568,6 +568,66 @@ exports.spo = {
|
|
|
568
568
|
const res = yield request_1.default.get(requestOptions);
|
|
569
569
|
return res.AadObjectId.NameId;
|
|
570
570
|
});
|
|
571
|
+
},
|
|
572
|
+
/**
|
|
573
|
+
* Retrieves the menu state for the quick launch.
|
|
574
|
+
* @param webUrl Web url
|
|
575
|
+
*/
|
|
576
|
+
getQuickLaunchMenuState(webUrl) {
|
|
577
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
578
|
+
return this.getMenuState(webUrl);
|
|
579
|
+
});
|
|
580
|
+
},
|
|
581
|
+
/**
|
|
582
|
+
* Retrieves the menu state for the top navigation.
|
|
583
|
+
* @param webUrl Web url
|
|
584
|
+
*/
|
|
585
|
+
getTopNavigationMenuState(webUrl) {
|
|
586
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
587
|
+
return this.getMenuState(webUrl, '1002');
|
|
588
|
+
});
|
|
589
|
+
},
|
|
590
|
+
/**
|
|
591
|
+
* Retrieves the menu state.
|
|
592
|
+
* @param webUrl Web url
|
|
593
|
+
* @param menuNodeKey Menu node key
|
|
594
|
+
*/
|
|
595
|
+
getMenuState(webUrl, menuNodeKey) {
|
|
596
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
597
|
+
const requestBody = {
|
|
598
|
+
customProperties: null,
|
|
599
|
+
depth: 10,
|
|
600
|
+
mapProviderName: null,
|
|
601
|
+
menuNodeKey: menuNodeKey || null
|
|
602
|
+
};
|
|
603
|
+
const requestOptions = {
|
|
604
|
+
url: `${webUrl}/_api/navigation/MenuState`,
|
|
605
|
+
headers: {
|
|
606
|
+
accept: 'application/json;odata=nometadata'
|
|
607
|
+
},
|
|
608
|
+
data: requestBody,
|
|
609
|
+
responseType: 'json'
|
|
610
|
+
};
|
|
611
|
+
return request_1.default.post(requestOptions);
|
|
612
|
+
});
|
|
613
|
+
},
|
|
614
|
+
/**
|
|
615
|
+
* Saves the menu state.
|
|
616
|
+
* @param webUrl Web url
|
|
617
|
+
* @param menuState Updated menu state
|
|
618
|
+
*/
|
|
619
|
+
saveMenuState(webUrl, menuState) {
|
|
620
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
621
|
+
const requestOptions = {
|
|
622
|
+
url: `${webUrl}/_api/navigation/SaveMenuState`,
|
|
623
|
+
headers: {
|
|
624
|
+
accept: 'application/json;odata=nometadata'
|
|
625
|
+
},
|
|
626
|
+
data: { menuState: menuState },
|
|
627
|
+
responseType: 'json'
|
|
628
|
+
};
|
|
629
|
+
return request_1.default.post(requestOptions);
|
|
630
|
+
});
|
|
571
631
|
}
|
|
572
632
|
};
|
|
573
633
|
//# sourceMappingURL=spo.js.map
|
|
@@ -16,10 +16,13 @@ m365 flow list [options]
|
|
|
16
16
|
|
|
17
17
|
```md definition-list
|
|
18
18
|
`-e, --environmentName <environmentName>`
|
|
19
|
-
: The name of the environment for which to retrieve available flows
|
|
19
|
+
: The name of the environment for which to retrieve available flows.
|
|
20
|
+
|
|
21
|
+
`--sharingStatus [sharingStatus]`
|
|
22
|
+
: List a specific type of flows. Valid values: `ownedByMe`, `personal`, `sharedWithMe`, `all`. Defaults to `ownedByMe`. Don't specify this option when using asAdmin.
|
|
20
23
|
|
|
21
24
|
`--asAdmin`
|
|
22
|
-
: Set, to list all Flows as admin. Otherwise will return only your own flows
|
|
25
|
+
: Set, to list all Flows as admin. Otherwise will return only your own flows.
|
|
23
26
|
```
|
|
24
27
|
|
|
25
28
|
<Global />
|
|
@@ -34,7 +37,12 @@ This command is based on an API that is currently in preview and is subject to c
|
|
|
34
37
|
|
|
35
38
|
If the environment with the name you specified doesn't exist, you will get the `Access to the environment 'xyz' is denied.` error.
|
|
36
39
|
|
|
37
|
-
|
|
40
|
+
When you specify a value for `sharingStatus`, consider the following:
|
|
41
|
+
|
|
42
|
+
- `ownedByMe` returns all flows created by you regardless of whether they are shared or not.
|
|
43
|
+
- `personal` returns all flows created by you which are not shared.
|
|
44
|
+
- `sharedWithMe` returns flows that are shared with you, or created by you and shared with someone.
|
|
45
|
+
- `all` combines `personal` and `sharedWithMe`.
|
|
38
46
|
|
|
39
47
|
## Examples
|
|
40
48
|
|
|
@@ -30,9 +30,6 @@ m365 flow run list [options]
|
|
|
30
30
|
`--triggerEndTime [triggerEndTime]`
|
|
31
31
|
: Time indicating the exclusive end of a time range of flow runs to return. This should be defined as a valid ISO 8601 string (2021-12-16T18:28:48.6964197Z).
|
|
32
32
|
|
|
33
|
-
`--sharingStatus [sharingStatus]`
|
|
34
|
-
: List a specific type of flows. Valid values: `ownedByMe`, `personal`, `sharedWithMe`, `all`. Defaults to `ownedByMe`. Don't specify this option when using asAdmin.
|
|
35
|
-
|
|
36
33
|
`--asAdmin`
|
|
37
34
|
: Run the command as admin. Use this flag when targeting flows you don't own.
|
|
38
35
|
```
|
|
@@ -35,6 +35,9 @@ m365 spo navigation node add [options]
|
|
|
35
35
|
|
|
36
36
|
`--audienceIds [audienceIds]`
|
|
37
37
|
: Comma-separated list of group IDs that will be used for audience targeting. The limit is 10 ids per navigation node.
|
|
38
|
+
|
|
39
|
+
`--openInNewWindow`
|
|
40
|
+
: Set, if the link has to be opened in a new window.
|
|
38
41
|
```
|
|
39
42
|
|
|
40
43
|
<Global />
|
|
@@ -57,16 +60,16 @@ Add a navigation node pointing to an external page to the quick launch
|
|
|
57
60
|
m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location QuickLaunch --title "About us" --url https://contoso.com/about-us --isExternal
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
Add a navigation node below an existing node
|
|
63
|
+
Add a navigation node below an existing node and opens it in a new window
|
|
61
64
|
|
|
62
65
|
```sh
|
|
63
|
-
m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --parentNodeId 2010 --title About --url /sites/team-s/sitepages/about.aspx
|
|
66
|
+
m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --parentNodeId 2010 --title About --url /sites/team-s/sitepages/about.aspx --openInNewWindow
|
|
64
67
|
```
|
|
65
68
|
|
|
66
|
-
Add a navigation node to the top navigation which is audience targetted
|
|
69
|
+
Add a navigation node to the top navigation which is audience targetted and open it in a new window
|
|
67
70
|
|
|
68
71
|
```sh
|
|
69
|
-
m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location TopNavigationBar --title About --url /sites/team-s/sitepages/about.aspx --audienceIds "7aa4a1ca-4035-4f2f-bac7-7beada59b5ba,4bbf236f-a131-4019-b4a2-315902fcfa3a"
|
|
72
|
+
m365 spo navigation node add --webUrl https://contoso.sharepoint.com/sites/team-a --location TopNavigationBar --title About --url /sites/team-s/sitepages/about.aspx --audienceIds "7aa4a1ca-4035-4f2f-bac7-7beada59b5ba,4bbf236f-a131-4019-b4a2-315902fcfa3a" --openInNewWindow
|
|
70
73
|
```
|
|
71
74
|
|
|
72
75
|
## Response
|
|
@@ -30,6 +30,9 @@ m365 spo navigation node set [options]
|
|
|
30
30
|
|
|
31
31
|
`--isExternal [isExternal]`
|
|
32
32
|
: Whether the navigation node points to an external URL. Valid values: `true` or `false`.
|
|
33
|
+
|
|
34
|
+
`--openInNewWindow [openInNewWindow]`
|
|
35
|
+
: Open the URL in a new window. Valid values: `true` or `false`.
|
|
33
36
|
```
|
|
34
37
|
|
|
35
38
|
<Global />
|
|
@@ -58,6 +61,12 @@ Updates audience targeting of a navigation node with 3 groups
|
|
|
58
61
|
m365 spo navigation node set --webUrl https://contoso.sharepoint.com/sites/marketing --id 2209 --audienceIds "61f78c73-f71a-471e-a3b9-15daa936e200,9524e6b4-e663-44fe-b179-210c963e37e7,c42b8756-494d-4141-a575-45f01320e26a"
|
|
59
62
|
```
|
|
60
63
|
|
|
64
|
+
Updates the navigation node so that it opens in a new window
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
m365 spo navigation node set --webUrl https://contoso.sharepoint.com/sites/marketing --id 2209 --openInNewWindow true
|
|
68
|
+
```
|
|
69
|
+
|
|
61
70
|
## Response
|
|
62
71
|
|
|
63
72
|
The command won't return a response on success.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import Global from '/docs/cmd/_global.mdx';
|
|
2
|
+
import Tabs from '@theme/Tabs';
|
|
3
|
+
import TabItem from '@theme/TabItem';
|
|
4
|
+
|
|
5
|
+
# spo tenant commandset add
|
|
6
|
+
|
|
7
|
+
Add a ListView Command Set as a tenant-wide extension.
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
m365 spo tenant commandset add [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Options
|
|
16
|
+
|
|
17
|
+
```md defintion-list
|
|
18
|
+
`-t, --title <title>`
|
|
19
|
+
: The title of the ListView Command Set.
|
|
20
|
+
|
|
21
|
+
`-l, --listType <listType>`
|
|
22
|
+
: The list or library type to register the ListView Command Set on. Allowed values `List` or `Library`.
|
|
23
|
+
|
|
24
|
+
`-i, --clientSideComponentId <clientSideComponentId>`
|
|
25
|
+
: The Client Side Component Id (GUID) of the ListView Command Set.
|
|
26
|
+
|
|
27
|
+
`-p, --clientSideComponentProperties [clientSideComponentProperties]`
|
|
28
|
+
: The Client Side Component properties of the ListView Command Set.
|
|
29
|
+
|
|
30
|
+
`-w, --webTemplate [webTemplate]`
|
|
31
|
+
: Optionally add a web template (e.g. STS#3, SITEPAGEPUBLISHING#0, etc) as a filter for what kind of sites the ListView Command Set is registered on.
|
|
32
|
+
|
|
33
|
+
`--location [location]`
|
|
34
|
+
: The location of the ListView Command Set. Allowed values `ContextMenu`, `CommandBar` or `Both`. Defaults to `CommandBar`.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
<Global />
|
|
38
|
+
|
|
39
|
+
## Remarks
|
|
40
|
+
|
|
41
|
+
Running this command from the Windows Command Shell (cmd.exe) or PowerShell for Windows OS XP, 7, 8, 8.1 without bash installed might require additional formatting for command options that have JSON, XML, or JavaScript values because the command shell treats quotes differently. For example, this is how commandset user custom action can be created from the Windows cmd.exe:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
m365 spo tenant commandset add --title "YourAppCustomizer" --clientSideComponentId b41916e7-e69d-467f-b37f-ff8ecf8f99f2 --clientSideComponentProperties '{\"testMessage\":\"Test message\"}'
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Note, how the clientSideComponentProperties option has escaped double quotes `'{\"testMessage\":\"Test message\"}'` compared to execution from bash `'{"testMessage":"Test message"}'`.
|
|
48
|
+
|
|
49
|
+
:::caution Escaping JSON in PowerShell
|
|
50
|
+
|
|
51
|
+
When using the `--clientSideComponentProperties` option it's possible to enter a JSON string. In PowerShell 5 to 7.2 [specific escaping rules](./../../../user-guide/using-cli.mdx#escaping-double-quotes-in-powershell) apply due to an issue. Remember that you can also use [file tokens](./../../../user-guide/using-cli.mdx#passing-complex-content-into-cli-options) instead.
|
|
52
|
+
|
|
53
|
+
:::
|
|
54
|
+
|
|
55
|
+
:::info
|
|
56
|
+
|
|
57
|
+
To use this command, you need to be a SharePoint Admin.
|
|
58
|
+
|
|
59
|
+
:::
|
|
60
|
+
|
|
61
|
+
## Examples
|
|
62
|
+
|
|
63
|
+
Adds a ListView Command Set that's deployed tenant wide to CommandBars of Lists.
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
m365 spo tenant commandset add --title "Some customizer" --clientSideComponentId 799883f5-7962-4384-a10a-105adaec6ffc --listType List
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Adds a ListView Command Set that is configured to the context menu of communication site libraries.
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
m365 spo tenant commandset add --title "Some customizer" --clientSideComponentId 799883f5-7962-4384-a10a-105adaec6ffc --webTemplate "SITEPAGEPUBLISHING#0" --listType Library --location ContextMenu
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Response
|
|
76
|
+
|
|
77
|
+
<Tabs>
|
|
78
|
+
<TabItem value="JSON">
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"FileSystemObjectType": 0,
|
|
83
|
+
"Id": 4,
|
|
84
|
+
"ServerRedirectedEmbedUri": null,
|
|
85
|
+
"ServerRedirectedEmbedUrl": "",
|
|
86
|
+
"ID": 4,
|
|
87
|
+
"ContentTypeId": "0x00693E2C487575B448BD420C12CEAE7EFE",
|
|
88
|
+
"Title": "Some ListView Command Set",
|
|
89
|
+
"Modified": "2023-01-11T15:47:38Z",
|
|
90
|
+
"Created": "2023-01-11T15:47:38Z",
|
|
91
|
+
"AuthorId": 9,
|
|
92
|
+
"EditorId": 9,
|
|
93
|
+
"OData__UIVersionString": "1.0",
|
|
94
|
+
"Attachments": false,
|
|
95
|
+
"GUID": "14125658-a9bc-4ddf-9c75-1b5767c9a337",
|
|
96
|
+
"ComplianceAssetId": null,
|
|
97
|
+
"TenantWideExtensionComponentId": "7096cded-b83d-4eab-96f0-df477ed7c0bc",
|
|
98
|
+
"TenantWideExtensionComponentProperties": "{\"testMessage\":\"Test message\"}",
|
|
99
|
+
"TenantWideExtensionWebTemplate": null,
|
|
100
|
+
"TenantWideExtensionListTemplate": 101,
|
|
101
|
+
"TenantWideExtensionLocation": "ClientSideExtension.ListViewCommandSet.ContextMenu",
|
|
102
|
+
"TenantWideExtensionSequence": 0,
|
|
103
|
+
"TenantWideExtensionHostProperties": null,
|
|
104
|
+
"TenantWideExtensionDisabled": false
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
</TabItem>
|
|
109
|
+
<TabItem value="Text">
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
Attachments : false
|
|
113
|
+
AuthorId : 9
|
|
114
|
+
ComplianceAssetId : null
|
|
115
|
+
ContentTypeId : 0x00693E2C487575B448BD420C12CEAE7EFE
|
|
116
|
+
Created : 2023-01-11T15:47:38Z
|
|
117
|
+
EditorId : 9
|
|
118
|
+
FileSystemObjectType : 0
|
|
119
|
+
GUID : 14125658-a9bc-4ddf-9c75-1b5767c9a337
|
|
120
|
+
Id : 4
|
|
121
|
+
ID : 4
|
|
122
|
+
Modified : 2023-01-11T15:47:38Z
|
|
123
|
+
OData__UIVersionString : 1.0
|
|
124
|
+
ServerRedirectedEmbedUri : null
|
|
125
|
+
ServerRedirectedEmbedUrl :
|
|
126
|
+
TenantWideExtensionComponentId : 7096cded-b83d-4eab-96f0-df477ed7c0bc
|
|
127
|
+
TenantWideExtensionComponentProperties: {"testMessage":"Test message"}
|
|
128
|
+
TenantWideExtensionDisabled : false
|
|
129
|
+
TenantWideExtensionHostProperties : null
|
|
130
|
+
TenantWideExtensionListTemplate : 101
|
|
131
|
+
TenantWideExtensionLocation : ClientSideExtension.ListViewCommandSet.ContextMenu
|
|
132
|
+
TenantWideExtensionSequence : 0
|
|
133
|
+
TenantWideExtensionWebTemplate : null
|
|
134
|
+
Title : Some ListView Command Set
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
</TabItem>
|
|
138
|
+
<TabItem value="CSV">
|
|
139
|
+
|
|
140
|
+
```csv
|
|
141
|
+
FileSystemObjectType,Id,ServerRedirectedEmbedUri,ServerRedirectedEmbedUrl,ID,ContentTypeId,Title,Modified,Created,AuthorId,EditorId,OData__UIVersionString,Attachments,GUID,ComplianceAssetId,TenantWideExtensionComponentId,TenantWideExtensionComponentProperties,TenantWideExtensionWebTemplate,TenantWideExtensionListTemplate,TenantWideExtensionLocation,TenantWideExtensionSequence,TenantWideExtensionHostProperties,TenantWideExtensionDisabled
|
|
142
|
+
0,4,,,4,0x00693E2C487575B448BD420C12CEAE7EFE,Some ListView Command Set,2023-01-11T15:47:38Z,2023-01-11T15:47:38Z,9,9,1.0,,14125658-a9bc-4ddf-9c75-1b5767c9a337,,7096cded-b83d-4eab-96f0-df477ed7c0bc,"{""testMessage"":""Test message""}",,101,ClientSideExtension.ListViewCommandSet.ContextMenu,0,,
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
</TabItem>
|
|
146
|
+
<TabItem value="Markdown">
|
|
147
|
+
|
|
148
|
+
```md
|
|
149
|
+
# spo listitem add --webUrl "https://contoso.sharepoint.com/sites/appcatalog" --listUrl "/sites/appcatalog/Lists/TenantWideExtensions" --Title "Some ListView Command Set" --TenantWideExtensionComponentId "7096cded-b83d-4eab-96f0-df477ed7c0bc" --TenantWideExtensionLocation "ClientSideExtension.ListViewCommandSet.ContextMenu" --TenantWideExtensionSequence "0" --TenantWideExtensionListTemplate "101" --TenantWideExtensionComponentProperties "{"testMessage":"Test message"}" --TenantWideExtensionWebTemplate "" --TenantWideExtensionDisabled "false" --verbose "false" --debug "false" --_ ""
|
|
150
|
+
|
|
151
|
+
Date: 1/13/2023
|
|
152
|
+
|
|
153
|
+
## Some ListView Command Set (4)
|
|
154
|
+
|
|
155
|
+
Property | Value
|
|
156
|
+
---------|-------
|
|
157
|
+
FileSystemObjectType | 0
|
|
158
|
+
Id | 4
|
|
159
|
+
ServerRedirectedEmbedUri | null
|
|
160
|
+
ServerRedirectedEmbedUrl |
|
|
161
|
+
ID | 4
|
|
162
|
+
ContentTypeId | 0x00693E2C487575B448BD420C12CEAE7EFE
|
|
163
|
+
Title | Some customizer
|
|
164
|
+
Modified | 2023-01-11T15:47:38Z
|
|
165
|
+
Created | 2023-01-11T15:47:38Z
|
|
166
|
+
AuthorId | 9
|
|
167
|
+
EditorId | 9
|
|
168
|
+
OData\_\_UIVersionString | 1.0
|
|
169
|
+
Attachments | false
|
|
170
|
+
GUID | 14125658-a9bc-4ddf-9c75-1b5767c9a337
|
|
171
|
+
ComplianceAssetId | null
|
|
172
|
+
TenantWideExtensionComponentId | 7096cded-b83d-4eab-96f0-df477ed7c0bc
|
|
173
|
+
TenantWideExtensionComponentProperties | {"testMessage":"Test message"}
|
|
174
|
+
TenantWideExtensionWebTemplate | null
|
|
175
|
+
TenantWideExtensionListTemplate | 101
|
|
176
|
+
TenantWideExtensionLocation | ClientSideExtension.ListViewCommandSet.ContextMenu
|
|
177
|
+
TenantWideExtensionSequence | 0
|
|
178
|
+
TenantWideExtensionHostProperties | null
|
|
179
|
+
TenantWideExtensionDisabled | false
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
</TabItem>
|
|
183
|
+
</Tabs>
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import Global from '/docs/cmd/_global.mdx';
|
|
2
|
+
import Tabs from '@theme/Tabs';
|
|
3
|
+
import TabItem from '@theme/TabItem';
|
|
4
|
+
|
|
5
|
+
# spo tenant commandset get
|
|
6
|
+
|
|
7
|
+
Get a ListView Command Set that is installed tenant wide
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
spo tenant commandset get [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Options
|
|
16
|
+
|
|
17
|
+
```md defintion-list
|
|
18
|
+
`-t, --title [title]`
|
|
19
|
+
: The title of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
|
|
20
|
+
|
|
21
|
+
`-i, --id [id]`
|
|
22
|
+
: The id of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
|
|
23
|
+
|
|
24
|
+
`-c, --clientSideComponentId [clientSideComponentId]`
|
|
25
|
+
: The Client Side Component Id (GUID) of the ListView Command Set. Specify either `title`, `id`, or `clientSideComponentId`.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
<Global />
|
|
29
|
+
|
|
30
|
+
## Examples
|
|
31
|
+
|
|
32
|
+
Retrieves a ListView Command Set by title.
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
m365 spo tenant commandset get --title "Some customizer"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Retrieves a ListView Command Set by id.
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
m365 spo tenant commandset get --id 3
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Retrieves a ListView Command Set by clientSideComponentId.
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
m365 spo tenant commandset get --clientSideComponentId 7096cded-b83d-4eab-96f0-df477ed7c0bc
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Response
|
|
51
|
+
|
|
52
|
+
<Tabs>
|
|
53
|
+
<TabItem value="JSON">
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"FileSystemObjectType": 0,
|
|
58
|
+
"Id": 4,
|
|
59
|
+
"ServerRedirectedEmbedUri": null,
|
|
60
|
+
"ServerRedirectedEmbedUrl": "",
|
|
61
|
+
"ContentTypeId": "0x00693E2C487575B448BD420C12CEAE7EFE",
|
|
62
|
+
"Title": "Some ListView Command Set",
|
|
63
|
+
"Modified": "2023-01-11T15:47:38Z",
|
|
64
|
+
"Created": "2023-01-11T15:47:38Z",
|
|
65
|
+
"AuthorId": 9,
|
|
66
|
+
"EditorId": 9,
|
|
67
|
+
"OData__UIVersionString": "1.0",
|
|
68
|
+
"Attachments": false,
|
|
69
|
+
"GUID": "14125658-a9bc-4ddf-9c75-1b5767c9a337",
|
|
70
|
+
"ComplianceAssetId": null,
|
|
71
|
+
"TenantWideExtensionComponentId": "7096cded-b83d-4eab-96f0-df477ed7c0bc",
|
|
72
|
+
"TenantWideExtensionComponentProperties": "{\"testMessage\":\"Test message\"}",
|
|
73
|
+
"TenantWideExtensionWebTemplate": null,
|
|
74
|
+
"TenantWideExtensionListTemplate": 101,
|
|
75
|
+
"TenantWideExtensionLocation": "ClientSideExtension.ListViewCommandSet.ContextMenu",
|
|
76
|
+
"TenantWideExtensionSequence": 0,
|
|
77
|
+
"TenantWideExtensionHostProperties": null,
|
|
78
|
+
"TenantWideExtensionDisabled": false
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
</TabItem>
|
|
83
|
+
<TabItem value="Text">
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
Attachments : false
|
|
87
|
+
AuthorId : 9
|
|
88
|
+
ComplianceAssetId : null
|
|
89
|
+
ContentTypeId : 0x00693E2C487575B448BD420C12CEAE7EFE
|
|
90
|
+
Created : 2023-01-11T15:47:38Z
|
|
91
|
+
EditorId : 9
|
|
92
|
+
FileSystemObjectType : 0
|
|
93
|
+
GUID : 14125658-a9bc-4ddf-9c75-1b5767c9a337
|
|
94
|
+
Id : 4
|
|
95
|
+
Modified : 2023-01-11T15:47:38Z
|
|
96
|
+
OData__UIVersionString : 1.0
|
|
97
|
+
ServerRedirectedEmbedUri : null
|
|
98
|
+
ServerRedirectedEmbedUrl :
|
|
99
|
+
TenantWideExtensionComponentId : 7096cded-b83d-4eab-96f0-df477ed7c0bc
|
|
100
|
+
TenantWideExtensionComponentProperties: {"testMessage":"Test message"}
|
|
101
|
+
TenantWideExtensionDisabled : false
|
|
102
|
+
TenantWideExtensionHostProperties : null
|
|
103
|
+
TenantWideExtensionListTemplate : 101
|
|
104
|
+
TenantWideExtensionLocation : ClientSideExtension.ListViewCommandSet.ContextMenu
|
|
105
|
+
TenantWideExtensionSequence : 0
|
|
106
|
+
TenantWideExtensionWebTemplate : null
|
|
107
|
+
Title : Some ListView Command Set
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
</TabItem>
|
|
111
|
+
<TabItem value="CSV">
|
|
112
|
+
|
|
113
|
+
```csv
|
|
114
|
+
FileSystemObjectType,Id,ServerRedirectedEmbedUri,ServerRedirectedEmbedUrl,ContentTypeId,Title,Modified,Created,AuthorId,EditorId,OData__UIVersionString,Attachments,GUID,ComplianceAssetId,TenantWideExtensionComponentId,TenantWideExtensionComponentProperties,TenantWideExtensionWebTemplate,TenantWideExtensionListTemplate,TenantWideExtensionLocation,TenantWideExtensionSequence,TenantWideExtensionHostProperties,TenantWideExtensionDisabled
|
|
115
|
+
0,4,,,0x00693E2C487575B448BD420C12CEAE7EFE,Some ListView Command Set,2023-01-11T15:47:38Z,2023-01-11T15:47:38Z,9,9,1.0,,14125658-a9bc-4ddf-9c75-1b5767c9a337,,7096cded-b83d-4eab-96f0-df477ed7c0bc,"{""testMessage"":""Test message""}",,101,ClientSideExtension.ListViewCommandSet.ContextMenu,0,,
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
</TabItem>
|
|
119
|
+
<TabItem value="Markdown">
|
|
120
|
+
|
|
121
|
+
```md
|
|
122
|
+
# spo tenant commandset get --title "Some ListView Command Set"
|
|
123
|
+
|
|
124
|
+
Date: 1/13/2023
|
|
125
|
+
|
|
126
|
+
## Some ListView Command Set (4)
|
|
127
|
+
|
|
128
|
+
Property | Value
|
|
129
|
+
---------|-------
|
|
130
|
+
FileSystemObjectType | 0
|
|
131
|
+
Id | 4
|
|
132
|
+
ServerRedirectedEmbedUri | null
|
|
133
|
+
ServerRedirectedEmbedUrl |
|
|
134
|
+
ContentTypeId | 0x00693E2C487575B448BD420C12CEAE7EFE
|
|
135
|
+
Title | Some customizer
|
|
136
|
+
Modified | 2023-01-11T15:47:38Z
|
|
137
|
+
Created | 2023-01-11T15:47:38Z
|
|
138
|
+
AuthorId | 9
|
|
139
|
+
EditorId | 9
|
|
140
|
+
OData\_\_UIVersionString | 1.0
|
|
141
|
+
Attachments | false
|
|
142
|
+
GUID | 14125658-a9bc-4ddf-9c75-1b5767c9a337
|
|
143
|
+
ComplianceAssetId | null
|
|
144
|
+
TenantWideExtensionComponentId | 7096cded-b83d-4eab-96f0-df477ed7c0bc
|
|
145
|
+
TenantWideExtensionComponentProperties | {"testMessage":"Test message"}
|
|
146
|
+
TenantWideExtensionWebTemplate | null
|
|
147
|
+
TenantWideExtensionListTemplate | 101
|
|
148
|
+
TenantWideExtensionLocation | ClientSideExtension.ListViewCommandSet.ContextMenu
|
|
149
|
+
TenantWideExtensionSequence | 0
|
|
150
|
+
TenantWideExtensionHostProperties | null
|
|
151
|
+
TenantWideExtensionDisabled | false
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
</TabItem>
|
|
155
|
+
</Tabs>
|
package/package.json
CHANGED