fluxtuate
Version:
a javascript ES7 library for handling complex data transactions
159 lines (127 loc) • 5.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _internals = require("./_internals");
var _dateMethods = require("./date-methods");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var innerDate = Symbol("fluxtuateArrayWrapper_innerDate");
var listeners = Symbol("fluxtuateArrayWrapper_listeners");
var destroyed = Symbol("fluxtuateArrayWrapper_destroyed");
var checkDestroyed = Symbol("fluxtuateArrayWrapper_checkDestroyed");
var dispatchUpdate = Symbol("fluxtuateArrayWrapper_dispatchUpdate");
var updateTimer = Symbol("fluxtuateArrayWrapper_updateTimer");
var dateGetterMethods = _dateMethods.dateGetterMethods.concat(["compare"]);
var dateSetterMethods = _dateMethods.dateSetterMethods.concat(["setValue", "clear"]);
var DateWrapper = function () {
function DateWrapper(wrappedDate, holderContext) {
var _this = this;
_classCallCheck(this, DateWrapper);
this[innerDate] = wrappedDate;
this[listeners] = [];
this[_internals.context] = holderContext;
this[_internals.updateable] = false;
this[destroyed] = false;
this[checkDestroyed] = function () {
if (_this[destroyed]) {
throw new Error("You are trying to access a destroyed date.");
}
};
this[dispatchUpdate] = function (callback, payload) {
if (_this[updateTimer]) {
clearTimeout(_this[updateTimer]);
_this[updateTimer] = undefined;
}
if (_this[destroyed]) return;
_this[updateTimer] = setTimeout(function () {
callback({ model: _this, data: payload.data, name: payload.name });
}, 0);
};
this[_internals.updateInnerObject] = function (wrappedDate) {
_this[innerDate] = wrappedDate;
var oldListeners = _this[listeners];
_this[listeners] = [];
while (oldListeners.length > 0) {
var listener = oldListeners.pop();
listener.originalRemove();
_this.onUpdate(listener.callback);
}
};
dateSetterMethods.forEach(function (methodName) {
Object.defineProperty(_this, methodName, {
value: function value() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this[checkDestroyed]();
if (!_this[_internals.updateable]) {
throw new Error("You are trying to alter a array that is not editable, you must do all data alteration from a command!");
}
return _this[innerDate][methodName].apply(_this[innerDate], [_this].concat(args));
},
configurable: false
});
});
dateGetterMethods.forEach(function (methodName) {
Object.defineProperty(_this, methodName, {
value: function value() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this[checkDestroyed]();
return _this[innerDate][methodName].apply(_this[innerDate], args);
},
configurable: false
});
});
}
_createClass(DateWrapper, [{
key: "onUpdate",
value: function onUpdate(callback) {
var _this2 = this;
this[checkDestroyed]();
var listener = this[innerDate].onUpdate(this[dispatchUpdate].bind(this, callback));
var removeFunction = listener.remove;
var index = this[listeners].length;
this[listeners].push(listener);
listener.callback = callback;
listener.originalRemove = removeFunction;
listener.remove = function () {
_this2[listeners].splice(index, 1);
removeFunction();
};
return listener;
}
}, {
key: "destroy",
value: function destroy() {
if (this[destroyed]) return;
this[listeners].forEach(function (listener) {
listener.remove();
});
this[destroyed] = true;
}
}, {
key: "modelName",
get: function get() {
this[checkDestroyed]();
return this[innerDate].modelName;
}
}, {
key: "modelData",
get: function get() {
this[checkDestroyed]();
return this[innerDate].modelData;
}
}, {
key: "cleanData",
get: function get() {
this[checkDestroyed]();
return this[innerDate].cleanData;
}
}]);
return DateWrapper;
}();
exports.default = DateWrapper;