Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V4 document sets #2809

Merged
merged 5 commits into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 102 additions & 12 deletions docs/graph/items.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,128 @@
# @pnp/graph/items

Currently, there is no module in graph to access all items directly. Please, instead, default to search by path using the following methods.

[![Selective Imports Banner](https://img.shields.io/badge/Selective%20Imports-informational.svg)](../concepts/selective-imports.md)

### Get list items

```TypeScript
import { Site } from "@pnp/graph/sites";
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const sites = graph.sites.getById("{site id}");
const graph = graphfi(...);
const items = const siteLists = await graph.site.getById("{site identifier}").lists.getById("{list identifier}").items();

const items = await Site(sites, "lists/{listid}/items")();
```

### Get File/Item version information

```TypeScript
import { Site } from "@pnp/graph/sites";

const sites = graph.sites.getById("{site id}");
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const users = await Site(sites, "lists/{listid}/items/{item id}/versions")();
const graph = graphfi(...);
const itemVersions = const siteLists = await graph.site.getById("{site identifier}").lists.getById("{list identifier}").items.getById(1).versions();

```

### Get list items with fields included

```TypeScript
import { Site } from "@pnp/graph/sites";
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
const listItems = await graph.site.getById("{site identifier}").lists.getById("{list identifier}").items..expand("fields")();

```

### Create a new list item

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
var newItem = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.add({
Title: "Widget",
});

```
### Update a list item

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
var newItem = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").update({
Title: "Widget",
});

```

### Delete a list item

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
var newItem = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").delete();

```

### Get Document Set Versions of an Item

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
var documentSetVersions = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").documentSetVersions();

```

### Get Document Set Versions By Id

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const sites = graph.sites.getById("{site id}");
const graph = graphfi(...);
var documentSetVersion = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").documentSetVersions.getById("{document set version id}");

```

### Create a new Document Set Version

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const graph = graphfi(...);
var version = await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").documentSetVersions.add({comment:"Test Comment", shouldCaptureMinorVersion: true});

```

### Restore a Document Set version

```TypeScript
import { graphfi } from "@pnp/graph";
import "@pnp/graph/list-items";
import "@pnp/graph/lists";

const listItems : IList[] = await Site(sites, "lists/{site id}/items?$expand=fields")();
const graph = graphfi(...);
await graph.sites.getById("{site identifier}").lists.getById("{list identifier}").items.getById("{item identifier}").documentSetVersions.getById("{document set version id}").restore();

```

#### Hint: Note that you can just use normal [graph queries](https://developer.microsoft.com/en-us/graph/graph-explorer) in this search.
13 changes: 13 additions & 0 deletions packages/graph/list-item/document-sets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { addProp } from "@pnp/queryable";
import { DocumentSetVersions, _ListItem } from "./types.js";

declare module "./types" {
interface _ListItem {
readonly documentSetVersions: IDocumentSetVersions;
}
interface IListItem {
readonly documentSetVersions: IDocumentSetVersions;
}
}

addProp(_ListItem, "documentSetVersions", DocumentSetVersions);
6 changes: 6 additions & 0 deletions packages/graph/list-item/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import "./list.js";
import "./document-sets.js";

export {
ListItems,
IListItems,
ListItem,
IListItem,
IListItemAddResult,
IDocumentSetVersion,
DocumentSetVersion,
DocumentSetVersions,
IDocumentSetVersions,
IDocumentSetVersionAddResult,
} from "./types.js";
53 changes: 37 additions & 16 deletions packages/graph/list-item/types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { ListItem as IListItemEntity, ListItemVersion as IListItemVersion } from "@microsoft/microsoft-graph-types";
import { ListItem as IListItemEntity, ListItemVersion as IListItemVersion, DocumentSetVersion as IDocumentSetVersionEntity } from "@microsoft/microsoft-graph-types";
import { _GraphCollection, graphInvokableFactory, _GraphInstance, IGraphCollection, GraphCollection, graphPost } from "../graphqueryable.js";
import { defaultPath, deleteable, IDeleteable, updateable, IUpdateable, getById, IGetById } from "../decorators.js";
import { body } from "@pnp/queryable";
import { defaultPath, deleteable, IDeleteable, updateable, IUpdateable, getById, IGetById, addable, IAddable } from "../decorators.js";

/**
* Represents a list item entity
Expand All @@ -17,7 +16,7 @@ export class _ListItem extends _GraphInstance<IListItemEntity> {
return <any>GraphCollection(this, "versions");
}
}
export interface IListItem extends _ListItem, IDeleteable, IUpdateable { }
export interface IListItem extends _ListItem, IDeleteable, IUpdateable {}
export const ListItem = graphInvokableFactory<IListItem>(_ListItem);

/**
Expand All @@ -26,24 +25,46 @@ export const ListItem = graphInvokableFactory<IListItem>(_ListItem);
*/
@defaultPath("items")
@getById(ListItem)
export class _ListItems extends _GraphCollection<IListItemEntity[]>{
@addable()
export class _ListItems extends _GraphCollection<IListItemEntity[]>{}

export interface IListItems extends _ListItems, IGetById<IListItem>, IAddable<IListItemEntity> { }
export const ListItems = graphInvokableFactory<IListItems>(_ListItems);

/**
* Represents a document set version
*/
@deleteable()
export class _DocumentSetVersion extends _GraphInstance<IDocumentSetVersionEntity> {
/**
* Create a new list item as specified in the request body.
* Restore a document set version
*
* @param listItem a JSON representation of a List object.
*/
public async add(listItem: IListItemEntity): Promise<IListItemAddResult> {
const data = await graphPost(this, body(listItem));

return {
data,
list: (<any>this).getById(data.id),
};
public async restore(): Promise<void> {
return graphPost(DocumentSetVersion(this, "restore"));
}
}
export interface IDocumentSetVersion extends _DocumentSetVersion, IDeleteable { }
export const DocumentSetVersion = graphInvokableFactory<IDocumentSetVersion>(_DocumentSetVersion);

export interface IListItems extends _ListItems, IGetById<IListItem> { }
export const ListItems = graphInvokableFactory<IListItems>(_ListItems);
/**
* Describes a collection of document set versions
*
*/
@defaultPath("documentSetVersions")
@getById(DocumentSetVersion)
@addable()
export class _DocumentSetVersions extends _GraphCollection<IDocumentSetVersionEntity[]>{}
export interface IDocumentSetVersions extends _DocumentSetVersions, IGetById<IDocumentSetVersion>, IAddable<IDocumentSetVersionEntity> {}
export const DocumentSetVersions = graphInvokableFactory<IDocumentSetVersions>(_DocumentSetVersions);

/**
* IDocumentSetVersionAddResult
*/
export interface IDocumentSetVersionAddResult {
item: IDocumentSetVersion;
data: IDocumentSetVersionEntity;
}

/**
* IListAddResult
Expand Down
1 change: 1 addition & 0 deletions settings.example.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export const settings = {
// set your scopes as needed here
scopes: ["https://{tenant}.sharepoint.com/.default"]
},
testWebUrl:"{ site collection for testing }"
},
// all are optional if using msal
graph: {
Expand Down
123 changes: 123 additions & 0 deletions test/graph/list-items.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { expect } from "chai";
import "@pnp/graph/sites";
import "@pnp/graph/lists";
import { List } from "@microsoft/microsoft-graph-types";
import { ISite } from "@pnp/graph/sites";
import { getRandomString } from "@pnp/core";
import getTestingGraphSPSite from "./utilities/getTestingGraphSPSite.js";
import { pnpTest } from "../pnp-test.js";
import { IList } from "@pnp/graph/lists";
import { IListItem } from "@pnp/graph/list-item/types.js";

describe("List-Items", function () {
let site: ISite;
let list: IList;
let item: IListItem;

const sampleList: List = {
displayName: "PnPGraphTestList",
list: { "template": "ItemTestList-Graph" },
};

before(async function () {

if (!this.pnp.settings.enableWebTests) {
this.skip();
}

site = await getTestingGraphSPSite(this);

const props = await this.props({
displayName: getRandomString(5) + "Add",
});

const listTemplate = JSON.parse(JSON.stringify(sampleList));
listTemplate.displayName += props.displayName;
const list = (await site.lists.add(listTemplate)).list;

// add test items. Document set can be added later
if(list){
await list.items.add({Title: `Item ${getRandomString(4)}`} as any);
await list.items.add({Title: `Item ${getRandomString(4)}`} as any);
}

});

it("items", pnpTest("3e0e16a0-5683-4c3a-aa3d-f35bb6912de1", async function () {
const items = await list.items();
return expect(items).to.be.an("array") && expect(items[0]).to.haveOwnProperty("id");
}));

it("getById()", pnpTest("6f9592fd-1568-4d9c-a3f5-7f45165d84f2", async function () {
const itemData = await list.items.select("Id").top(1)<{ Id: number }[]>();
return expect(itemData[0].Id).is.not.null;
}));

it("add", pnpTest("587e280b-0342-4515-a166-1b05cee9f242", async function () {
// fieldvalueset. ugh. Casting as any.
const itemAdded = await list.items.add({fields:
{
title: getRandomString(5) + "Add",
},
} as any);

return expect((itemAdded.id)).is.not.null;
}));

it("update", pnpTest("5766613a-51b8-4f88-ba0f-2436d160b86b", async function () {
// fieldvalueset. ugh. Casting as any.
const itemUpdated = await item.update({fields:
{
title: getRandomString(5) + "Update",
},
} as any);


return expect(itemUpdated).is.not.null;
}));

it("delete", pnpTest("e55bf53f-1316-4e47-97c1-b0c0cdd860ef", async function () {
const item = await list.items.add({fields:
{
title: getRandomString(5) + "Add",
},
} as any);
const r = await list.items.filter(`Id eq '${item.id}'`)();
return expect(r.length).to.eq(0);
}));

it.skip("documentSetVersions", pnpTest("c2889ca3-0230-4c6e-879d-71cc9cd08e83", async function () {
const versions = await item.documentSetVersions();
return expect(versions).to.be.an("array") && expect(versions[0]).to.haveOwnProperty("id");
}));

it.skip("documentSetVersions - getById()", pnpTest("35226d93-204b-4877-9041-26e04e437914", async function () {
const versions = await item.documentSetVersions();

const version = await item.documentSetVersions.getById(versions[0].id);
return expect(version).to.not.be.null && expect(version).to.haveOwnProperty("id");
}));

it.skip("documentSetVersions - add()", pnpTest("a192e096-fe84-4c2c-adc5-b1b9021c0031", async function () {
const documentSetVersion = await item.documentSetVersions.add({comment:"Test Comment"});
return expect(documentSetVersion).to.not.be.null && expect(documentSetVersion).to.haveOwnProperty("id");
}));

it.skip("documentSetVersions - restore()", pnpTest("8814b247-4087-4c87-9a8f-af997f7d8745", async function () {
const restore = await item.documentSetVersions[0].restore();
return expect(restore).to.be.fulfilled;
}));

// Remove the test list we created
after(async function () {
if (list) {
try {
await list.delete();
} catch (err) {
console.error("Cannot clean up test list");
}
}
return;
});

});
Loading