mirror of https://github.com/rancher/ui.git
52 lines
1.1 KiB
JavaScript
52 lines
1.1 KiB
JavaScript
import Mixin from '@ember/object/mixin';
|
|
import { get, set } from '@ember/object';
|
|
import { all } from 'rsvp';
|
|
|
|
const DEFAULT_KEY = '_childHooks';
|
|
let NEXT_ID = 1;
|
|
|
|
export default Mixin.create({
|
|
actions: {
|
|
// sendAction('registerHook', fn);
|
|
// sendAction('registerHook', fn, 'name');
|
|
// sendAction('registerHook', fn, {name: 'name', priority: 99, key: 'alternateKey'})
|
|
registerHook(boundFn, opt) {
|
|
if ( typeof opt === 'string' ) {
|
|
opt = { name: opt };
|
|
} else if ( !opt ) {
|
|
opt = {};
|
|
}
|
|
|
|
if ( !opt.name ) {
|
|
opt.name = `hook_${ NEXT_ID }`;
|
|
NEXT_ID++;
|
|
}
|
|
|
|
const key = opt.key || DEFAULT_KEY;
|
|
|
|
let hooks = get(this, key);
|
|
|
|
if ( !hooks ) {
|
|
hooks = [];
|
|
set(this, key, hooks);
|
|
}
|
|
|
|
let entry = hooks.findBy('name', opt.name);
|
|
|
|
if ( !entry ) {
|
|
entry = opt;
|
|
hooks.push(entry);
|
|
}
|
|
|
|
entry.priority = opt.priority || 99;
|
|
entry.fn = boundFn;
|
|
},
|
|
},
|
|
|
|
applyHooks(key = DEFAULT_KEY) {
|
|
const hooks = (get(this, key) || []).sortBy('priority', 'name');
|
|
|
|
return all(hooks.map((x) => x.fn()));
|
|
}
|
|
});
|