@itrocks/action
Version:
An abstract class for applying actions in your framework, with @Actions and @Need decorators for assignment
54 lines • 2.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.actionTemplates = exports.actionCss = exports.actionRepository = void 0;
exports.getActions = getActions;
exports.setAction = setAction;
exports.setActionCss = setActionCss;
exports.setActionTemplates = setActionTemplates;
const class_type_1 = require("@itrocks/class-type");
const rename_1 = require("@itrocks/rename");
exports.actionRepository = {};
exports.actionCss = [];
exports.actionTemplates = [];
const DEFAULT = Symbol('DEFAULT');
function filterFile(actionAssets, definition) {
return actionAssets
.filter(entry => Object.entries(definition).every(([filter, value]) => entry[filter] === value))
.find(entry => Object.entries(entry).every(([filter, value]) => ['file', 'target'].includes(filter) || (definition[filter] === value)))
?? actionAssets.find(entry => Object.keys(entry).length === 1)
?? { file: 'noMatch' };
}
function getActions(source, sourceAction) {
const actions = [];
const sourceActions = exports.actionRepository[sourceAction];
if (!sourceActions) {
return actions;
}
const type = (0, class_type_1.typeOf)(source);
const targetIdentifier = (0, class_type_1.typeIdentifier)(type);
for (const targetAction in sourceActions) {
const action = sourceActions[targetAction][targetIdentifier] ?? sourceActions[targetAction][DEFAULT];
if (action) {
action.object = source;
action.type = type;
actions.push(action);
}
}
return actions;
}
function setAction(sourceAction, targetAction, definition = {}, source) {
const sourceActions = exports.actionRepository[sourceAction] ?? (exports.actionRepository[sourceAction] = {});
const target = definition.target ?? '#';
const targetActions = sourceActions[targetAction] ?? (sourceActions[targetAction] = {});
const caption = definition.caption ?? (0, rename_1.ucFirst)((0, rename_1.toDisplay)(targetAction));
const css = definition.css ?? filterFile(exports.actionCss, definition).file.replaceAll('(action)', targetAction);
const template = definition.template ?? filterFile(exports.actionTemplates, definition).file;
targetActions[source ? (0, class_type_1.typeIdentifier)(source) : DEFAULT] = Object.assign({ action: targetAction, caption, target, css, template }, definition);
}
function setActionCss(...css) {
exports.actionCss.push(...css);
}
function setActionTemplates(...templates) {
exports.actionTemplates.push(...templates);
}
//# sourceMappingURL=repository.js.map