q42-cms-components
Version:
81 lines (74 loc) • 2.79 kB
JavaScript
import { crudStores } from '../tools/crud-stores.js';
import { initialValue } from '../schema/schema-scripts.js';
import { doc } from '../docs/doc.js';
function defaultStore(itemName) {
return crudStores.getStore('/items/' + itemName);
}
function defaultNewItem(store) {
return () => store.loaders.schema().then(schema => initialValue(schema));
}
export const crudFactory = doc((options) => {
const {
itemName, fields,
store = defaultStore(itemName),
newItem = defaultNewItem(store),
customFields = {}
} = options;
return {
name: itemName + 's',
template: '<router-view></router-view>',
children: [
{
path: '',
name: 'index-' + itemName,
component: require('./crud-overview.vue'),
meta: { itemName, store, fields, customFields, newItem }
},
{
path: 'create',
name: 'create-' + itemName,
component: require('./crud-editor.vue'),
meta: { itemName, store, newItem }
},
{
path: 'create-type',
name: 'create-type-' + itemName,
component: require('./crud-editor.vue'),
meta: { itemName, store, newItem }
},
{
path: ':id',
name: itemName + '-editor',
component: require('./crud-editor.vue'),
meta: { itemName, store }
}
],
}
}, `Genereert een CRUD interface voor <code>CmsItem</code>s.
<code>options</code> heeft als velden: <ul>
<li><code>itemName</code> de korte naam van de class, bijv 'person' of 'banner'.
<li><code>fields</code> een array van propertynamen voor de kolommen van het overzicht.
<li><code>customFields</code> Optioneel. Een object die mapt van kolom-titel naar component-naam voor het overzicht.
<li><code>store</code> Optioneel. Mogelijkheid om de default store obv. de <code>/items/{itemName}</code> api te overriden.
<li><code>newItem</code> Optioneel. Een functie die een nieuwe (lege) instance aanmaakt, mag ook een <code>Promise</code> returnen.
</ul>`);
export const singletonFactory = doc((options) => {
const {
itemName,
store = defaultStore(itemName),
newItem = defaultNewItem(store)
} = options;
return {
name: itemName,
template: '<router-view></router-view>',
children: [
{
path: '',
name: 'index-' + itemName,
component: require('./crud-editor.vue'),
meta: { itemName, store, newItem: () => store.getItemById('latest').catch(() => newItem()) },
}
]
}
}, `Genereert een interface voor een <code>SingletonItem</code>, zonder overzichtspagina.
<code>options</code> heeft de velden <code>itemName</code>, <code>newItem</code> en <code>store</code>.`);