UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

325 lines • 17.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FilesSearchService = void 0; var tslib_1 = require("tslib"); var sp_http_1 = require("@microsoft/sp-http"); var Utilities_1 = require("@fluentui/react/lib/Utilities"); var GeneralHelper_1 = require("../common/utilities/GeneralHelper"); var SPSitesService_1 = require("./SPSitesService"); /** * Maximum file size when searching */ var MAXFILESIZE = 52428800; /** * Maximum number of search results */ var MAXRESULTS = 100; var FilesSearchService = /** @class */ (function () { function FilesSearchService(context, bingAPIKey, siteAbsoluteUrl) { var _this = this; /** * Checks if file exists */ this.checkFileExists = function (fileUrl) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var fetchFileResult, err_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this.context.httpClient.fetch(fileUrl, sp_http_1.SPHttpClient.configurations.v1, { headers: new Headers(), method: 'HEAD', mode: 'cors' })]; case 1: fetchFileResult = _a.sent(); if (!fetchFileResult || !fetchFileResult.ok) { throw new Error("Something went wrong when executing search query. Status='".concat(fetchFileResult.status, "'")); } return [2 /*return*/, true]; case 2: err_1 = _a.sent(); console.error("[BingFilesService.fetchFile]: Err='".concat(err_1 instanceof Error ? err_1.message : String(err_1), "'")); return [2 /*return*/, false]; case 3: return [2 /*return*/]; } }); }); }; /** * Executes Recent files search. */ this.executeRecentSearch = function (accepts) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var webId, siteId, siteinfo, fileFilter, queryTemplate, queryData, searchApi, recentSearchDataResult, recentSearchData, recentFilesResult, err_2; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 5, , 6]); webId = this.context.pageContext.web.id.toString(); siteId = this.context.pageContext.site.id.toString(); if (!(this.siteAbsoluteUrl !== this.context.pageContext.web.absoluteUrl)) return [3 /*break*/, 2]; return [4 /*yield*/, (0, SPSitesService_1.getSiteWebInfo)(this.context, this.siteAbsoluteUrl)]; case 1: siteinfo = _a.sent(); webId = siteinfo.webId; siteId = siteinfo.siteId; _a.label = 2; case 2: fileFilter = this._getFileFilter(accepts); queryTemplate = "((SiteID:".concat(siteId, " OR SiteID: {").concat(siteId, "}) AND (WebId: ").concat(webId, " OR WebId: {").concat(webId, "})) AND LastModifiedTime < {Today} AND -Title:OneNote_DeletedPages AND -Title:OneNote_RecycleBin").concat(fileFilter); queryData = { __metadata: { "type": "Microsoft.Office.Server.Search.REST.SearchRequest" }, QueryTemplate: queryTemplate, RowLimit: 20, SelectProperties: { results: [ "Title", "Path", "Filename", "FileExtension", "FileType", "Created", "Author", "LastModifiedTime", "EditorOwsUser", "ModifiedBy", "LinkingUrl", "SiteTitle", "ParentLink", "DocumentPreviewMetadata", "ListID", "ListItemID", "SPSiteURL", "SiteID", "WebId", "UniqueID", "SPWebUrl", "DefaultEncodingURL", "PictureThumbnailURL", ] }, SortList: { results: [ { "Property": "LastModifiedTime", "Direction": 1 } ] } }; searchApi = "".concat(this.siteAbsoluteUrl, "/_api/search/postquery"); return [4 /*yield*/, this.context.spHttpClient.post(searchApi, sp_http_1.SPHttpClient.configurations.v1, { headers: { 'accept': 'application/json;odata=nometadata', 'content-type': 'application/json;odata=verbose', "odata-version": "" }, body: JSON.stringify({ request: queryData }) })]; case 3: recentSearchDataResult = _a.sent(); if (!recentSearchDataResult || !recentSearchDataResult.ok) { throw new Error("Something went wrong when executing search query. Status='".concat(recentSearchDataResult.status, "'")); } return [4 /*yield*/, recentSearchDataResult.json()]; case 4: recentSearchData = _a.sent(); if (!recentSearchData || !recentSearchData.PrimaryQueryResult.RelevantResults.Table.Rows) { throw new Error("Cannot read JSON result"); } recentFilesResult = recentSearchData.PrimaryQueryResult.RelevantResults.Table.Rows.map(function (row) { return _this.parseRecentSearchResult(row.Cells); }); return [2 /*return*/, recentFilesResult]; case 5: err_2 = _a.sent(); console.error("[BingFilesService.executeRecentSearch]: Err='".concat(err_2 instanceof Error ? err_2.message : String(err_2), "'")); return [2 /*return*/, undefined]; case 6: return [2 /*return*/]; } }); }); }; /** * Executes bing search for a file. */ this.executeBingSearch = function (queryParams) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var aspect, size, license, query, maxResults, maxFileSize, apiUrl, searchDataResponse, searchData, bingResults, searchResults, err_3; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); aspect = queryParams.aspect ? queryParams.aspect : 'All'; size = queryParams.size ? queryParams.size : 'All'; license = queryParams.license ? queryParams.license : 'Any'; query = queryParams.query; maxResults = queryParams.maxResults ? queryParams.maxResults : MAXRESULTS; maxFileSize = queryParams.maxFileSize ? queryParams.maxFileSize : MAXFILESIZE; // No query if (query === undefined) { return [2 /*return*/]; } apiUrl = "https://api.bing.microsoft.com/v7.0/images/search?q=".concat(encodeURIComponent(query), "&count=").concat(maxResults, "&aspect=").concat(aspect, "&maxFileSize=").concat(maxFileSize, "&size=").concat(size, "&mkt=en-US&license=").concat(license); return [4 /*yield*/, this.context.httpClient.get(apiUrl, sp_http_1.SPHttpClient.configurations.v1, { method: 'GET', mode: 'cors', headers: { 'Ocp-Apim-Subscription-Key': this.bingAPIKey, } })]; case 1: searchDataResponse = _a.sent(); if (!searchDataResponse || !searchDataResponse.ok) { throw new Error("Something went wrong when executing search query. Status='".concat(searchDataResponse.statusText, "'")); } return [4 /*yield*/, searchDataResponse.json()]; case 2: searchData = _a.sent(); if (!searchData || !searchData.value) { throw new Error("Cannot read JSON result"); } bingResults = searchData.value; searchResults = bingResults.map(function (item) { return _this.parseBingSearchResult(item); }); return [2 /*return*/, searchResults]; case 3: err_3 = _a.sent(); console.error("[BingFilesService.executeSearch]: Err='".concat(err_3 instanceof Error ? err_3.message : String(err_3), "'")); return [2 /*return*/, null]; case 4: return [2 /*return*/]; } }); }); }; /** * Downloads document content from SP location. */ this.downloadSPFileContent = function (absoluteFileUrl, fileName) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var fileDownloadResult, blob, err_4; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); return [4 /*yield*/, this.context.spHttpClient.get(absoluteFileUrl, sp_http_1.SPHttpClient.configurations.v1)]; case 1: fileDownloadResult = _a.sent(); if (!fileDownloadResult || !fileDownloadResult.ok) { throw new Error("Something went wrong when downloading the file. Status='".concat(fileDownloadResult.status, "'")); } return [4 /*yield*/, fileDownloadResult.blob()]; case 2: blob = _a.sent(); // Retrieve file from blob - method supports IE11 return [2 /*return*/, GeneralHelper_1.GeneralHelper.getFileFromBlob(blob, fileName)]; case 3: err_4 = _a.sent(); console.error("[FileSearchService.fetchFileContent] Err='".concat(err_4 instanceof Error ? err_4.message : String(err_4), "'")); return [2 /*return*/, null]; case 4: return [2 /*return*/]; } }); }); }; /** * Downloads document content from Remote location. */ this.downloadBingContent = function (absoluteFileUrl, fileName) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var fileDownloadResult, blob, err_5; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); return [4 /*yield*/, this.context.httpClient.get(absoluteFileUrl, sp_http_1.SPHttpClient.configurations.v1, { method: "GET", mode: "cors" })]; case 1: fileDownloadResult = _a.sent(); if (!fileDownloadResult || !fileDownloadResult.ok) { throw new Error("Something went wrong when downloading the file. Status='".concat(fileDownloadResult.status, "'")); } return [4 /*yield*/, fileDownloadResult.blob()]; case 2: blob = _a.sent(); return [2 /*return*/, GeneralHelper_1.GeneralHelper.getFileFromBlob(blob, fileName)]; case 3: err_5 = _a.sent(); console.error("[FileSearchService.fetchFileContent] Err='".concat(err_5 instanceof Error ? err_5.message : String(err_5), "'")); return [2 /*return*/, null]; case 4: return [2 /*return*/]; } }); }); }; /** * Parses Recent Search results. */ this.parseRecentSearchResult = function (cells) { var titleCell = (0, Utilities_1.find)(cells, function (x) { return x.Key === "Title"; }); var keyCell = (0, Utilities_1.find)(cells, function (x) { return x.Key === "UniqueID"; }); var fileUrlCell = (0, Utilities_1.find)(cells, function (x) { return x.Key === "DefaultEncodingURL"; }); var editedByCell = (0, Utilities_1.find)(cells, function (x) { return x.Key === "ModifiedBy"; }); var recentFile = { key: keyCell ? keyCell.Value : null, name: titleCell ? titleCell.Value : null, fileUrl: fileUrlCell ? fileUrlCell.Value : null, editedBy: editedByCell ? editedByCell.Value : null, isFolder: !fileUrlCell.Value }; return recentFile; }; /** * Parses Bing search results. */ this.parseBingSearchResult = function (bingResult) { // Get dimensions var width = bingResult.thumbnail.width ? bingResult.thumbnail.width : bingResult.width; var height = bingResult.thumbnail.height ? bingResult.thumbnail.height : bingResult.height; // Create a search result var searchResult = { thumbnailUrl: bingResult.thumbnailUrl, contentUrl: bingResult.contentUrl, displayUrl: _this.getDisplayUrl(bingResult.hostPageDisplayUrl), key: bingResult.imageId, width: width, height: height, }; return searchResult; }; /** * Removes protocol and retrieves only the domain, just like Bing search results does * in the SharePoint file picker * @param url The display url as provided by Bing */ this.getDisplayUrl = function (url) { // remove any protocols if (url.indexOf('://') > -1) { var urlParts = url.split('://'); url = urlParts.pop(); } // Split the URL on the first slash var splitUrl = url.split('/'); return splitUrl[0]; }; this.context = context; this.bingAPIKey = bingAPIKey; this.siteAbsoluteUrl = siteAbsoluteUrl || context.pageContext.web.absoluteUrl; } /** * Builds a file filter using the accepted file extensions */ FilesSearchService.prototype._getFileFilter = function (accepts) { var fileFilter = undefined; if (accepts) { fileFilter = " AND ("; accepts.forEach(function (fileType, index) { fileType = fileType.replace(".", ""); if (index > 0) { fileFilter = fileFilter + " OR "; } fileFilter = fileFilter + "FileExtension:".concat(fileType, " OR SecondaryFileExtension:").concat(fileType); }); fileFilter = fileFilter + ")"; } return fileFilter; }; return FilesSearchService; }()); exports.FilesSearchService = FilesSearchService; //# sourceMappingURL=FilesSearchService.js.map