SPFX Listviewコマンドを作成し、今いるフォルダの現在のURLを取得する必要があります。
これが可能かどうか、どなたかご存知でしょうか?sp-pnp-js の github などには、これに関するドキュメントが見当たりません。
どんな助けでも大いに感謝します :)
かなり簡単です。どの項目が選択されているかが分かっているので、ファイルのURLも分かっています。event.selectedRows[0]
は、選択されたアイテムに関する多くの情報を保持しています。あるいは、クエリ文字列を使用することもできます。
@override
public onExecute(event: IListViewCommandSetExecuteEventParameters): void {
switch (event.itemId) {
case 'COMMAND_1':
{
var folderUrl: string;
// Get file url of first selected item
if (event.selectedRows.length > 0) {
const fileUrl: string = event.selectedRows[0].getValueByName("FileRef");
// Trim the file name and you have server relative folder url
folderUrl = fileUrl.substring(0, fileUrl.lastIndexOf('/'));
} else {
// Get url form query string
folderUrl = this.getFolderUrlFromQueryString();
}
Dialog.alert(folderUrl);
break;
}
default:
throw new Error('Unknown command');
}
}
private getFolderUrlFromQueryString(): string {
const id = this.getQueryStringParameter("Id");
const rootFolder = this.getQueryStringParameter("RootFolder");
var url = id != null ? id : rootFolder;
if (url === undefined) {
// in case of root folder
url = this.context.pageContext.list.serverRelativeUrl;
}
return decodeURIComponent(url);
}
private getQueryStringParameter(paramToRetrieve: string) {
if (document.URL.indexOf("?") == -1)
return null;
var params = document.URL.split("?")[1].split("&");
var strParams = "";
for (var i = 0; i < params.length; i = i + 1) {
var singleParam = params[i].split("=");
if (singleParam[0].toLowerCase() == paramToRetrieve.toLowerCase())
return singleParam[1];
}
}
リストやライブラリの中に一旦フォルダを作るということでしょうか。私ならこうします。
var folderUrl = decodeURIComponent(window.location.href.split("?")[1].split("RootFolder=")[1].split("&FolderCTID")[0]);
var folderServerRelativeUrl = this.context.pageContext.web.absoluteUrl + folderUrl.FolderServerRelativeUrl = this.context.pageContext.web.absoluteUrl + folderServerRelativeUrl;
folderUrlはクエリパラメータ全体を取得し、"RootFolder="以降、"&FolderCTID"以前のすべてを取得し、%2F文字をデコードして "/" を生成します。
次に、ページ コンテキストを使用して、webs' absoluteUrl と folderUrl を連結します。
アイテムやフォルダを選択せずにフォルダのURLを取得したいとのことですが、その場合は "onListViewUpdated" 関数の下にコードを記述することができます。もし、返されたURLが空であれば、あなたはフォルダの外にいることになります。
@override
public onListViewUpdated(event: IListViewCommandSetListViewUpdatedParameters): void {
Dialog.alert(this.getParameterByName('id'));
}
private getParameterByName(name) {
var url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}