spws
Version:
SharePoint Web Services Wrapper
134 lines (112 loc) • 3.86 kB
text/typescript
// SPWS Library
import { defaults } from "../..";
// Classes
import { SpwsRequest, SpwsError } from "../../classes";
// Enum
import { WebServices } from "../../enum";
// Types
import { SpwsResponse, ListView } from "../../types";
// Utils
// import { } from "../../utils";
interface Operation extends SpwsResponse {
data: ListView;
}
/**
* Returns the schema of the specified view for the specified list.
* @link https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-services/ms772612(v=office.12)?redirectedfrom=MSDN
* @param {string} listName A string that contains the internal name of the list.
* @param {string} [viewName=""] A string that contains the GUID for the view. If the view name is blank, the default view is returned.
* @example
* ```
* const res = await getView("Announcements", "{397586A7-1738-4837-9F5D-4F6D54B4FB39}")
* ```
*/
const getView = async (
listName: string,
viewName: string = "",
{
webURL = defaults.webURL,
}: {
/** The SharePoint webURL */
webURL?: string;
} = {}
): Promise<Operation> => {
try {
// Create request object
const req = new SpwsRequest({ webService: WebServices.Views, webURL });
// Create envelope
req.createEnvelope(
`<GetView xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>${listName}</listName>
<viewName>${viewName}</viewName>
</GetView>`
);
// Send request
const res = await req.send();
// Get view as node
const node = res.responseXML.querySelector("View");
// Handle invalid response XML
if (!node) {
const error = new Error("View was not found in the response XML");
throw new SpwsError(error);
}
// Create the view
const view = Array.from(node.attributes).reduce(
(object: { [key: string]: any }, { name, value }) => {
switch (name as keyof ListView) {
case "DefaultView":
case "MobileView":
case "MobileDefaultView":
object[name] = value === "TRUE";
break;
default:
object[name] = value;
break;
}
// Return accumulator
return object;
},
{}
) as ListView;
// Create Dom Parsers
const serializer = new XMLSerializer();
// Parse Query
const query = node.querySelector("Query");
view.Query = query ? serializer.serializeToString(query) : `<Query />`;
// Parse ViewFields
view.ViewFields = Array.from(node.querySelectorAll("ViewFields FieldRef"))
.map((node) => node.getAttribute("Name") || "")
// Remove empty fields
.filter((field) => field);
// Parse ViewFields
const rowLimit = node.querySelector("RowLimit");
if (rowLimit)
view.RowLimit = {
size: +rowLimit.textContent!,
Paged: rowLimit.getAttribute("Paged") === "TRUE",
};
// Parse Aggregations
const aggregations = node.querySelector("Aggregations");
if (aggregations)
view.Aggregations = {
Value: aggregations.getAttribute("Value") === "Off" ? "Off" : "On",
};
// Parse GroupBy
const groupBy = node.querySelector("GroupBy");
if (groupBy) {
view.GroupBy = {
Collapse: groupBy.getAttribute("Collapse") === "TRUE",
limit: +(groupBy.getAttribute("GroupLimit") || "0"),
fields: Array.from(groupBy.querySelectorAll("FieldRef")).map((node) => ({
Name: node.getAttribute("Name")!,
Ascending: node.getAttribute("Ascending") !== "FALSE",
})),
};
}
// Return object
return { ...res, data: view };
} catch (error: any) {
throw new SpwsError(error);
}
};
export default getView;