/**
* @name Callback
* @namespace
* @classdesc Miscellaneous callback util functions.
*/
var Util = require('../Util');
module.exports = {
/** Create callback used to set binding value on an event.
* @param {Binding} binding binding
* @param {String|Array} [subpath] subpath as a dot-separated string or an array of strings and numbers
* @param {Function} [f] value transformer
* @returns {Function} callback
* @memberOf Callback */
set: function (binding, subpath, f) {
var args = Util.resolveArgs(
arguments,
'binding', function (x) { return Util.canRepresentSubpath(x) ? 'subpath' : null; }, '?f'
);
return function (event) {
var value = event.target.value;
binding.set(args.subpath, args.f ? args.f(value) : value);
};
},
/** Create callback used to delete binding value on an event.
* @param {Binding} binding binding
* @param {String|String[]} [subpath] subpath as a dot-separated string or an array of strings and numbers
* @param {Function} [pred] predicate
* @returns {Function} callback
* @memberOf Callback */
remove: function (binding, subpath, pred) {
var args = Util.resolveArgs(
arguments,
'binding', function (x) { return Util.canRepresentSubpath(x) ? 'subpath' : null; }, '?pred'
);
return function (event) {
var value = event.target.value;
if (!args.pred || args.pred(value)) {
binding.remove(args.subpath);
}
};
},
/** Create callback invoked when specified key combination is pressed.
* @param {Function} cb callback
* @param {String|Array} key key
* @param {Boolean} [shiftKey] shift key flag
* @param {Boolean} [ctrlKey] ctrl key flag
* @returns {Function} callback
* @memberOf Callback */
onKey: function (cb, key, shiftKey, ctrlKey) {
var effectiveShiftKey = shiftKey || false;
var effectiveCtrlKey = ctrlKey || false;
return function (event) {
var keyMatched = typeof key === 'string' ?
event.key === key :
Util.find(key, function (k) { return k === event.key; });
if (keyMatched && event.shiftKey === effectiveShiftKey && event.ctrlKey === effectiveCtrlKey) {
cb(event);
}
};
},
/** Create callback invoked when enter key is pressed.
* @param {Function} cb callback
* @returns {Function} callback
* @memberOf Callback */
onEnter: function (cb) {
return this.onKey(cb, 'Enter');
},
/** Create callback invoked when escape key is pressed.
* @param {Function} cb callback
* @returns {Function} callback
* @memberOf Callback */
onEscape: function (cb) {
return this.onKey(cb, 'Escape');
}
};
module.exports['delete'] = module.exports.remove;