sp-dev-fx-webparts/samples/knockout-sp-pnp-js/src/webparts/spPnPjsExample/SpPnPjsExampleViewModel.ts

164 lines
4.5 KiB
TypeScript

import * as ko from 'knockout';
import styles from './SpPnPjsExample.module.scss';
import { ISpPnPjsExampleWebPartProps } from './ISpPnPjsExampleWebPartProps';
import pnp, { List, ListEnsureResult, ItemAddResult } from "sp-pnp-js";
export interface ISpPnPjsExampleBindingContext extends ISpPnPjsExampleWebPartProps {
shouter: KnockoutSubscribable<{}>;
}
/**
* Interface which defines the fields in our list items
*/
export interface OrderListItem {
Id: number;
Title: string;
OrderNumber: string;
}
export default class SpPnPjsExampleViewModel {
public description: KnockoutObservable<string> = ko.observable('');
public newItemTitle: KnockoutObservable<string> = ko.observable('');
public newItemNumber: KnockoutObservable<string> = ko.observable('');
public items: KnockoutObservableArray<OrderListItem> = ko.observableArray([]);
public labelClass: string = styles.label;
public helloWorldClass: string = styles.helloWorld;
public containerClass: string = styles.container;
public rowClass: string = `ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}`;
public buttonClass: string = `ms-Button ${styles.button}`;
constructor(bindings: ISpPnPjsExampleBindingContext) {
this.description(bindings.description);
// When web part description is updated, change this view model's description.
bindings.shouter.subscribe((value: string) => {
this.description(value);
}, this, 'description');
// call the load the items
this.getItems().then(items => {
this.items(items);
});
}
/**
* Gets the items from the list
*/
private getItems(): Promise<OrderListItem[]> {
return this.ensureList().then(list => {
// here we are using the getAs operator so that our returned value will be typed
return list.items.select("Id", "Title", "OrderNumber").getAs<OrderListItem[]>();
});
}
/**
* Adds an item to the list
*/
public addItem(): void {
if (this.newItemTitle() !== "" && this.newItemNumber() !== "") {
this.ensureList().then(list => {
// add the new item to the SharePoint list
list.items.add({
Title: this.newItemTitle(),
OrderNumber: this.newItemNumber(),
}).then((iar: ItemAddResult) => {
// add the new item to the display
this.items.push({
Id: iar.data.Id,
OrderNumber: iar.data.OrderNumber,
Title: iar.data.Title,
});
// clear the form
this.newItemTitle("");
this.newItemNumber("");
});
});
}
}
/**
* Deletes an item from the list
*/
public deleteItem(data): void {
if (confirm("Are you sure you want to delete this item?")) {
this.ensureList().then(list => {
list.items.getById(data.Id).delete().then(_ => {
this.items.remove(data);
});
}).catch((e: Error) => {
alert(`There was an error deleting the item ${e.message}`);
});
}
}
/**
* Ensures the list exists and if it creates it adds some default example data
*/
private ensureList(): Promise<List> {
return new Promise<List>((resolve, reject) => {
// use lists.ensure to always have the list available
pnp.sp.web.lists.ensure("SPPnPJSExampleList").then((ler: ListEnsureResult) => {
if (ler.created) {
// we created the list on this call so let's add a column
ler.list.fields.addText("OrderNumber").then(_ => {
// and we will also add a few items so we can see some example data
// here we use batching
// create a batch
let batch = pnp.sp.web.createBatch();
ler.list.getListItemEntityTypeFullName().then(typeName => {
ler.list.items.inBatch(batch).add({
Title: "Title 1",
OrderNumber: "4826492"
}, typeName);
ler.list.items.inBatch(batch).add({
Title: "Title 2",
OrderNumber: "828475"
}, typeName);
ler.list.items.inBatch(batch).add({
Title: "Title 3",
OrderNumber: "75638923"
}, typeName);
// excute the batched operations
batch.execute().then(_ => {
// all of the items have been added within the batch
resolve(ler.list);
}).catch(e => reject(e));
}).catch(e => reject(e));
}).catch(e => reject(e));
} else {
resolve(ler.list);
}
}).catch(e => reject(e));
});
}
}