Files
mixtape/zero.Backoffice.UI/app/editor/editor-blueprint.ts
T
2021-12-22 10:55:40 +01:00

170 lines
4.6 KiB
TypeScript

import { localize } from '../services/localization';
import { arrayRemove } from '../utils/arrays';
import { useUiStore } from '../ui/store';
import { ZeroCompiledEditor } from './compile';
function unlocked(config, model, field)
{
if (!config || !model || !model.blueprint)
{
return true;
}
return canUnlock(config, model, field)
&& (model.blueprint.desync.indexOf(field.path) > -1
|| model.blueprint.desync.find(x => field.path.indexOf(x + '.') === 0) != null);
}
function canUnlock(config, model, field)
{
if (!config || !model || !model.blueprint)
{
return false;
}
return config.unlocked.indexOf(field.path) > -1
|| config.unlocked.find(x => field.path.indexOf(x + '.') === 0) != null;
}
function isBlueprintChild(config, route, model)
{
return model && route.query.scope != 'shared' && !!model.blueprint;
}
function isBlueprintParent(config, route, model)
{
return model && route.query.scope == 'shared' && !model.blueprint;
}
async function lock(config, model, field)
{
arrayRemove(model.blueprint.desync, field.path);
//let blueprint = await BlueprintApi.getById(model.blueprint.id);
//return blueprint[field.path];
}
function unlock(config, model, field)
{
model.blueprint.desync.push(field.path);
}
/**
* [TODO] description
* @typedef {object} EditorBlueprint
* @param {string} alias - Alias which is used to match an editor
* @param {function} unlocked - Whether a field is unlocked and can be changed
* @param {function} canUnlock - Whether a field can be unlocked
* @param {EditorBlueprintField[]} fields - Fields which can be altered in synchronization
*/
/**
* [TODO] description
* @typedef {object} EditorBlueprintField
* @param {string} path - Property path
* @param {string} label - Label which describes the property
* @param {string} description - Additional description for this property
* @param {function} synced - Whether this field is synchronized with the parent
*/
/**
* [TODO] description
* @param {string} alias - Alias for the tab
* @returns {EditorBlueprint}
*/
export function createBlueprintConfig(alias: string, editor: ZeroCompiledEditor)
{
const store = useUiStore();
let blueprintAlias = editor.alias;
let canBeBlueprinted = store.blueprints.indexOf(blueprintAlias) > -1;
if (!blueprintAlias || !canBeBlueprinted)
{
return {
alias: blueprintAlias,
isEnabled: false,
unlocked: () => true,
canUnlock: () => false,
isBlueprintParent: () => false,
isBlueprintChild: () => false,
lock: () => { },
unlock: () => { },
fields: []
};
}
let config = {
unlocked: []
}
// check for blueprint availability
//config.isParent = this.value && this.$route.query.scope === 'shared';
//config.isNewParent = config.isParent && !this.value.id;
//config.isChild = !config.isParent && this.value && !!this.value.blueprint;
// get all editor fields
let fields = [];
let processed = ['blueprint'];
let defaults = ['name', /*'alias',*/ 'isActive', 'sort', /*'key'*/];
// add blueprint setting for default fields
defaults.forEach(alias =>
{
processed.push(alias);
//if (config.unlocked.indexOf(alias) > -1)
//{
fields.push({
path: alias,
label: localize("@ui.entityfields." + alias),
description: localize("@ui.entityfields." + alias + "_text", { hideEmpty: true }),
synced: model => !model.blueprint || model.blueprint.desync.indexOf(alias) < 0
});
//}
});
// add blueprint setting for custom fields
editor.tabs.forEach(tab =>
{
tab.fieldsets.forEach(set =>
{
set.fields.forEach(field =>
{
let alias = field.path;
if (processed.indexOf(alias) < 0)
{
processed.push(alias);
if (config.unlocked.indexOf(alias) > -1 || config.unlocked.find(x => alias.indexOf(x + '.') === 0))
{
fields.push({
path: alias,
label: field.label,
description: field.description,
synced: model => !model.blueprint || model.blueprint.desync.indexOf(alias) < 0
});
}
}
});
});
});
return {
alias: blueprintAlias,
isEnabled: true,
unlocked: (model, field) => unlocked(config, model, field),
canUnlock: (model, field) => canUnlock(config, model, field),
unlock: async (model, field) => await unlock(config, model, field),
lock: async (model, field) => await lock(config, model, field),
isBlueprintParent: (route, model) => isBlueprintParent(config, route, model),
isBlueprintChild: (route, model) => isBlueprintChild(config, route, model),
fields: fields
};
};