q42-cms-components
Version:
102 lines (89 loc) • 3.22 kB
JavaScript
import { ServerStore } from './server-store.js';
export class CRUDStore extends ServerStore {
static get docs() {
return `CRUDStore is een ServerStore subclass die een standaard REST API voor collecties implementeert,
en ook het bijbehorende JSON schema ophaalt. <ul>
<li><code>path</code> geeft de url van de API aan, het schema komt van <code><i>path</i>/schema</code>
<li><code>options</code> heeft dezelfde properties als bij ServerStore.
</ul>
<b>Reactive data properties</b>
<ul>
<li><code>items</code> De lijst met items in de collectie.
De items bevatten niet alle properties, gebruik daarvoor <code>getItemById</code>.
<li><code>schema</code> Het JSON schema van de items in de collectie
<li><code>fields</code> Object met velden voor het <a href="#listing"><code>listing</code></a> component
<li><code>displayField</code> De propertynaam van de items die kan worden gebruikt om de item te tonen.
</ul>`
}
constructor(path, options) {
let { initial = {}, loaders = {}, computed = {} } = options || {};
super({
initial: {
items: [],
schema: { properties: {} },
...initial
},
loaders: {
items: () => this.fetch(this.path),
schema: () => this.fetch(`${this.path}/schema`),
...loaders
},
computed: {
fields: () => this.fieldsObjectForProps(Object.keys(this.schema.properties)),
displayField: () => {
for (var name in this.fields) {
return this.fields[name];
}
return '';
},
...computed
}
});
this.path = path;
}
create(item) {
// when creating an item, the id is an empty string (comes from schema)
// id & created will be set by the server
delete item.id;
delete item.created;
return this.postJson(this.path, item).then(this.updaters.items);
}
static get createDocs() {
return `POST een nieuw item en update de lijst met items.`;
}
update(item) {
return this.putJson(`${this.path}/${item.id}`, item).then(this.updaters.items);
}
static get updateDocs() {
return `PUT een bestaand item en update de lijst met items.`;
}
upsert(item) {
return item.id ? this.update(item) : this.create(item);
}
static get upsertDocs() {
return `Als het item nog geen <code>id</code> heeft, doe een <code>create</code>, anders een <code>update</code>.`;
}
delete(item) {
return this.del(`${this.path}/${item.id}`, item).then(this.updaters.items);
}
static get deleteDocs() {
return `DELETE een bestaand item en update de lijst met items.`;
}
getItemById(id) {
return this.fetch(`${this.path}/${id}`);
}
static get getItemByIdDocs() {
return `GET een item, inclusief alle details.`;
}
fieldsObjectForProps(propNames) {
var fields = {};
var props = this.schema.properties;
propNames.forEach(name => {
var prop = props[name];
if (prop && prop.title) {
fields[prop.title] = name;
}
});
return fields;
}
}