Fixed build dependency issues by moving hal core into hal-core folder/subproject
This commit is contained in:
parent
f1da2c5a4d
commit
ded778fd11
138 changed files with 195 additions and 183 deletions
744
hal-core/resource/web/js/bootstrap-switch.js
vendored
Normal file
744
hal-core/resource/web/js/bootstrap-switch.js
vendored
Normal file
|
|
@ -0,0 +1,744 @@
|
|||
/* ========================================================================
|
||||
* bootstrap-switch - v3.3.2
|
||||
* http://www.bootstrap-switch.org
|
||||
* ========================================================================
|
||||
* Copyright 2012-2013 Mattia Larentis
|
||||
*
|
||||
* ========================================================================
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ========================================================================
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var slice = [].slice;
|
||||
|
||||
(function($, window) {
|
||||
"use strict";
|
||||
var BootstrapSwitch;
|
||||
BootstrapSwitch = (function() {
|
||||
function BootstrapSwitch(element, options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
this.$element = $(element);
|
||||
this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, {
|
||||
state: this.$element.is(":checked"),
|
||||
size: this.$element.data("size"),
|
||||
animate: this.$element.data("animate"),
|
||||
disabled: this.$element.is(":disabled"),
|
||||
readonly: this.$element.is("[readonly]"),
|
||||
indeterminate: this.$element.data("indeterminate"),
|
||||
inverse: this.$element.data("inverse"),
|
||||
radioAllOff: this.$element.data("radio-all-off"),
|
||||
onColor: this.$element.data("on-color"),
|
||||
offColor: this.$element.data("off-color"),
|
||||
onText: this.$element.data("on-text"),
|
||||
offText: this.$element.data("off-text"),
|
||||
labelText: this.$element.data("label-text"),
|
||||
handleWidth: this.$element.data("handle-width"),
|
||||
labelWidth: this.$element.data("label-width"),
|
||||
baseClass: this.$element.data("base-class"),
|
||||
wrapperClass: this.$element.data("wrapper-class")
|
||||
}, options);
|
||||
this.prevOptions = {};
|
||||
this.$wrapper = $("<div>", {
|
||||
"class": (function(_this) {
|
||||
return function() {
|
||||
var classes;
|
||||
classes = ["" + _this.options.baseClass].concat(_this._getClasses(_this.options.wrapperClass));
|
||||
classes.push(_this.options.state ? _this.options.baseClass + "-on" : _this.options.baseClass + "-off");
|
||||
if (_this.options.size != null) {
|
||||
classes.push(_this.options.baseClass + "-" + _this.options.size);
|
||||
}
|
||||
if (_this.options.disabled) {
|
||||
classes.push(_this.options.baseClass + "-disabled");
|
||||
}
|
||||
if (_this.options.readonly) {
|
||||
classes.push(_this.options.baseClass + "-readonly");
|
||||
}
|
||||
if (_this.options.indeterminate) {
|
||||
classes.push(_this.options.baseClass + "-indeterminate");
|
||||
}
|
||||
if (_this.options.inverse) {
|
||||
classes.push(_this.options.baseClass + "-inverse");
|
||||
}
|
||||
if (_this.$element.attr("id")) {
|
||||
classes.push(_this.options.baseClass + "-id-" + (_this.$element.attr("id")));
|
||||
}
|
||||
return classes.join(" ");
|
||||
};
|
||||
})(this)()
|
||||
});
|
||||
this.$container = $("<div>", {
|
||||
"class": this.options.baseClass + "-container"
|
||||
});
|
||||
this.$on = $("<span>", {
|
||||
html: this.options.onText,
|
||||
"class": this.options.baseClass + "-handle-on " + this.options.baseClass + "-" + this.options.onColor
|
||||
});
|
||||
this.$off = $("<span>", {
|
||||
html: this.options.offText,
|
||||
"class": this.options.baseClass + "-handle-off " + this.options.baseClass + "-" + this.options.offColor
|
||||
});
|
||||
this.$label = $("<span>", {
|
||||
html: this.options.labelText,
|
||||
"class": this.options.baseClass + "-label"
|
||||
});
|
||||
this.$element.on("init.bootstrapSwitch", (function(_this) {
|
||||
return function() {
|
||||
return _this.options.onInit.apply(element, arguments);
|
||||
};
|
||||
})(this));
|
||||
this.$element.on("switchChange.bootstrapSwitch", (function(_this) {
|
||||
return function(e) {
|
||||
if (false === _this.options.onSwitchChange.apply(element, arguments)) {
|
||||
if (_this.$element.is(":radio")) {
|
||||
return $("[name='" + (_this.$element.attr('name')) + "']").trigger("previousState.bootstrapSwitch", true);
|
||||
} else {
|
||||
return _this.$element.trigger("previousState.bootstrapSwitch", true);
|
||||
}
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
this.$container = this.$element.wrap(this.$container).parent();
|
||||
this.$wrapper = this.$container.wrap(this.$wrapper).parent();
|
||||
this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
|
||||
if (this.options.indeterminate) {
|
||||
this.$element.prop("indeterminate", true);
|
||||
}
|
||||
this._init();
|
||||
this._elementHandlers();
|
||||
this._handleHandlers();
|
||||
this._labelHandlers();
|
||||
this._formHandler();
|
||||
this._externalLabelHandler();
|
||||
this.$element.trigger("init.bootstrapSwitch", this.options.state);
|
||||
}
|
||||
|
||||
BootstrapSwitch.prototype._constructor = BootstrapSwitch;
|
||||
|
||||
BootstrapSwitch.prototype.setPrevOptions = function() {
|
||||
return this.prevOptions = $.extend(true, {}, this.options);
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.state = function(value, skip) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.state;
|
||||
}
|
||||
if (this.options.disabled || this.options.readonly) {
|
||||
return this.$element;
|
||||
}
|
||||
if (this.options.state && !this.options.radioAllOff && this.$element.is(":radio")) {
|
||||
return this.$element;
|
||||
}
|
||||
if (this.$element.is(":radio")) {
|
||||
$("[name='" + (this.$element.attr('name')) + "']").trigger("setPreviousOptions.bootstrapSwitch");
|
||||
} else {
|
||||
this.$element.trigger("setPreviousOptions.bootstrapSwitch");
|
||||
}
|
||||
if (this.options.indeterminate) {
|
||||
this.indeterminate(false);
|
||||
}
|
||||
value = !!value;
|
||||
this.$element.prop("checked", value).trigger("change.bootstrapSwitch", skip);
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleState = function(skip) {
|
||||
if (this.options.disabled || this.options.readonly) {
|
||||
return this.$element;
|
||||
}
|
||||
if (this.options.indeterminate) {
|
||||
this.indeterminate(false);
|
||||
return this.state(true);
|
||||
} else {
|
||||
return this.$element.prop("checked", !this.options.state).trigger("change.bootstrapSwitch", skip);
|
||||
}
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.size = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.size;
|
||||
}
|
||||
if (this.options.size != null) {
|
||||
this.$wrapper.removeClass(this.options.baseClass + "-" + this.options.size);
|
||||
}
|
||||
if (value) {
|
||||
this.$wrapper.addClass(this.options.baseClass + "-" + value);
|
||||
}
|
||||
this._width();
|
||||
this._containerPosition();
|
||||
this.options.size = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.animate = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.animate;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.animate) {
|
||||
return this.$element;
|
||||
}
|
||||
return this.toggleAnimate();
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleAnimate = function() {
|
||||
this.options.animate = !this.options.animate;
|
||||
this.$wrapper.toggleClass(this.options.baseClass + "-animate");
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.disabled = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.disabled;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.disabled) {
|
||||
return this.$element;
|
||||
}
|
||||
return this.toggleDisabled();
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleDisabled = function() {
|
||||
this.options.disabled = !this.options.disabled;
|
||||
this.$element.prop("disabled", this.options.disabled);
|
||||
this.$wrapper.toggleClass(this.options.baseClass + "-disabled");
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.readonly = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.readonly;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.readonly) {
|
||||
return this.$element;
|
||||
}
|
||||
return this.toggleReadonly();
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleReadonly = function() {
|
||||
this.options.readonly = !this.options.readonly;
|
||||
this.$element.prop("readonly", this.options.readonly);
|
||||
this.$wrapper.toggleClass(this.options.baseClass + "-readonly");
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.indeterminate = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.indeterminate;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.indeterminate) {
|
||||
return this.$element;
|
||||
}
|
||||
return this.toggleIndeterminate();
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleIndeterminate = function() {
|
||||
this.options.indeterminate = !this.options.indeterminate;
|
||||
this.$element.prop("indeterminate", this.options.indeterminate);
|
||||
this.$wrapper.toggleClass(this.options.baseClass + "-indeterminate");
|
||||
this._containerPosition();
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.inverse = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.inverse;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.inverse) {
|
||||
return this.$element;
|
||||
}
|
||||
return this.toggleInverse();
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.toggleInverse = function() {
|
||||
var $off, $on;
|
||||
this.$wrapper.toggleClass(this.options.baseClass + "-inverse");
|
||||
$on = this.$on.clone(true);
|
||||
$off = this.$off.clone(true);
|
||||
this.$on.replaceWith($off);
|
||||
this.$off.replaceWith($on);
|
||||
this.$on = $off;
|
||||
this.$off = $on;
|
||||
this.options.inverse = !this.options.inverse;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.onColor = function(value) {
|
||||
var color;
|
||||
color = this.options.onColor;
|
||||
if (typeof value === "undefined") {
|
||||
return color;
|
||||
}
|
||||
if (color != null) {
|
||||
this.$on.removeClass(this.options.baseClass + "-" + color);
|
||||
}
|
||||
this.$on.addClass(this.options.baseClass + "-" + value);
|
||||
this.options.onColor = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.offColor = function(value) {
|
||||
var color;
|
||||
color = this.options.offColor;
|
||||
if (typeof value === "undefined") {
|
||||
return color;
|
||||
}
|
||||
if (color != null) {
|
||||
this.$off.removeClass(this.options.baseClass + "-" + color);
|
||||
}
|
||||
this.$off.addClass(this.options.baseClass + "-" + value);
|
||||
this.options.offColor = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.onText = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.onText;
|
||||
}
|
||||
this.$on.html(value);
|
||||
this._width();
|
||||
this._containerPosition();
|
||||
this.options.onText = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.offText = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.offText;
|
||||
}
|
||||
this.$off.html(value);
|
||||
this._width();
|
||||
this._containerPosition();
|
||||
this.options.offText = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.labelText = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.labelText;
|
||||
}
|
||||
this.$label.html(value);
|
||||
this._width();
|
||||
this.options.labelText = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.handleWidth = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.handleWidth;
|
||||
}
|
||||
this.options.handleWidth = value;
|
||||
this._width();
|
||||
this._containerPosition();
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.labelWidth = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.labelWidth;
|
||||
}
|
||||
this.options.labelWidth = value;
|
||||
this._width();
|
||||
this._containerPosition();
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.baseClass = function(value) {
|
||||
return this.options.baseClass;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.wrapperClass = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.wrapperClass;
|
||||
}
|
||||
if (!value) {
|
||||
value = $.fn.bootstrapSwitch.defaults.wrapperClass;
|
||||
}
|
||||
this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" "));
|
||||
this.$wrapper.addClass(this._getClasses(value).join(" "));
|
||||
this.options.wrapperClass = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.radioAllOff = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.radioAllOff;
|
||||
}
|
||||
value = !!value;
|
||||
if (value === this.options.radioAllOff) {
|
||||
return this.$element;
|
||||
}
|
||||
this.options.radioAllOff = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.onInit = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.onInit;
|
||||
}
|
||||
if (!value) {
|
||||
value = $.fn.bootstrapSwitch.defaults.onInit;
|
||||
}
|
||||
this.options.onInit = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.onSwitchChange = function(value) {
|
||||
if (typeof value === "undefined") {
|
||||
return this.options.onSwitchChange;
|
||||
}
|
||||
if (!value) {
|
||||
value = $.fn.bootstrapSwitch.defaults.onSwitchChange;
|
||||
}
|
||||
this.options.onSwitchChange = value;
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype.destroy = function() {
|
||||
var $form;
|
||||
$form = this.$element.closest("form");
|
||||
if ($form.length) {
|
||||
$form.off("reset.bootstrapSwitch").removeData("bootstrap-switch");
|
||||
}
|
||||
this.$container.children().not(this.$element).remove();
|
||||
this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch");
|
||||
return this.$element;
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._width = function() {
|
||||
var $handles, handleWidth;
|
||||
$handles = this.$on.add(this.$off);
|
||||
$handles.add(this.$label).css("width", "");
|
||||
handleWidth = this.options.handleWidth === "auto" ? Math.max(this.$on.width(), this.$off.width()) : this.options.handleWidth;
|
||||
$handles.width(handleWidth);
|
||||
this.$label.width((function(_this) {
|
||||
return function(index, width) {
|
||||
if (_this.options.labelWidth !== "auto") {
|
||||
return _this.options.labelWidth;
|
||||
}
|
||||
if (width < handleWidth) {
|
||||
return handleWidth;
|
||||
} else {
|
||||
return width;
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
this._handleWidth = this.$on.outerWidth();
|
||||
this._labelWidth = this.$label.outerWidth();
|
||||
this.$container.width((this._handleWidth * 2) + this._labelWidth);
|
||||
return this.$wrapper.width(this._handleWidth + this._labelWidth);
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._containerPosition = function(state, callback) {
|
||||
if (state == null) {
|
||||
state = this.options.state;
|
||||
}
|
||||
this.$container.css("margin-left", (function(_this) {
|
||||
return function() {
|
||||
var values;
|
||||
values = [0, "-" + _this._handleWidth + "px"];
|
||||
if (_this.options.indeterminate) {
|
||||
return "-" + (_this._handleWidth / 2) + "px";
|
||||
}
|
||||
if (state) {
|
||||
if (_this.options.inverse) {
|
||||
return values[1];
|
||||
} else {
|
||||
return values[0];
|
||||
}
|
||||
} else {
|
||||
if (_this.options.inverse) {
|
||||
return values[0];
|
||||
} else {
|
||||
return values[1];
|
||||
}
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
if (!callback) {
|
||||
return;
|
||||
}
|
||||
return setTimeout(function() {
|
||||
return callback();
|
||||
}, 50);
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._init = function() {
|
||||
var init, initInterval;
|
||||
init = (function(_this) {
|
||||
return function() {
|
||||
_this.setPrevOptions();
|
||||
_this._width();
|
||||
return _this._containerPosition(null, function() {
|
||||
if (_this.options.animate) {
|
||||
return _this.$wrapper.addClass(_this.options.baseClass + "-animate");
|
||||
}
|
||||
});
|
||||
};
|
||||
})(this);
|
||||
if (this.$wrapper.is(":visible")) {
|
||||
return init();
|
||||
}
|
||||
return initInterval = window.setInterval((function(_this) {
|
||||
return function() {
|
||||
if (_this.$wrapper.is(":visible")) {
|
||||
init();
|
||||
return window.clearInterval(initInterval);
|
||||
}
|
||||
};
|
||||
})(this), 50);
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._elementHandlers = function() {
|
||||
return this.$element.on({
|
||||
"setPreviousOptions.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
return _this.setPrevOptions();
|
||||
};
|
||||
})(this),
|
||||
"previousState.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
_this.options = _this.prevOptions;
|
||||
if (_this.options.indeterminate) {
|
||||
_this.$wrapper.addClass(_this.options.baseClass + "-indeterminate");
|
||||
}
|
||||
return _this.$element.prop("checked", _this.options.state).trigger("change.bootstrapSwitch", true);
|
||||
};
|
||||
})(this),
|
||||
"change.bootstrapSwitch": (function(_this) {
|
||||
return function(e, skip) {
|
||||
var state;
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
state = _this.$element.is(":checked");
|
||||
_this._containerPosition(state);
|
||||
if (state === _this.options.state) {
|
||||
return;
|
||||
}
|
||||
_this.options.state = state;
|
||||
_this.$wrapper.toggleClass(_this.options.baseClass + "-off").toggleClass(_this.options.baseClass + "-on");
|
||||
if (!skip) {
|
||||
if (_this.$element.is(":radio")) {
|
||||
$("[name='" + (_this.$element.attr('name')) + "']").not(_this.$element).prop("checked", false).trigger("change.bootstrapSwitch", true);
|
||||
}
|
||||
return _this.$element.trigger("switchChange.bootstrapSwitch", [state]);
|
||||
}
|
||||
};
|
||||
})(this),
|
||||
"focus.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
e.preventDefault();
|
||||
return _this.$wrapper.addClass(_this.options.baseClass + "-focused");
|
||||
};
|
||||
})(this),
|
||||
"blur.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
e.preventDefault();
|
||||
return _this.$wrapper.removeClass(_this.options.baseClass + "-focused");
|
||||
};
|
||||
})(this),
|
||||
"keydown.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
if (!e.which || _this.options.disabled || _this.options.readonly) {
|
||||
return;
|
||||
}
|
||||
switch (e.which) {
|
||||
case 37:
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
return _this.state(false);
|
||||
case 39:
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
return _this.state(true);
|
||||
}
|
||||
};
|
||||
})(this)
|
||||
});
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._handleHandlers = function() {
|
||||
this.$on.on("click.bootstrapSwitch", (function(_this) {
|
||||
return function(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
_this.state(false);
|
||||
return _this.$element.trigger("focus.bootstrapSwitch");
|
||||
};
|
||||
})(this));
|
||||
return this.$off.on("click.bootstrapSwitch", (function(_this) {
|
||||
return function(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
_this.state(true);
|
||||
return _this.$element.trigger("focus.bootstrapSwitch");
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._labelHandlers = function() {
|
||||
return this.$label.on({
|
||||
"click": function(e) {
|
||||
return e.stopPropagation();
|
||||
},
|
||||
"mousedown.bootstrapSwitch touchstart.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
if (_this._dragStart || _this.options.disabled || _this.options.readonly) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
_this._dragStart = (e.pageX || e.originalEvent.touches[0].pageX) - parseInt(_this.$container.css("margin-left"), 10);
|
||||
if (_this.options.animate) {
|
||||
_this.$wrapper.removeClass(_this.options.baseClass + "-animate");
|
||||
}
|
||||
return _this.$element.trigger("focus.bootstrapSwitch");
|
||||
};
|
||||
})(this),
|
||||
"mousemove.bootstrapSwitch touchmove.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
var difference;
|
||||
if (_this._dragStart == null) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
difference = (e.pageX || e.originalEvent.touches[0].pageX) - _this._dragStart;
|
||||
if (difference < -_this._handleWidth || difference > 0) {
|
||||
return;
|
||||
}
|
||||
_this._dragEnd = difference;
|
||||
return _this.$container.css("margin-left", _this._dragEnd + "px");
|
||||
};
|
||||
})(this),
|
||||
"mouseup.bootstrapSwitch touchend.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
var state;
|
||||
if (!_this._dragStart) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
if (_this.options.animate) {
|
||||
_this.$wrapper.addClass(_this.options.baseClass + "-animate");
|
||||
}
|
||||
if (_this._dragEnd) {
|
||||
state = _this._dragEnd > -(_this._handleWidth / 2);
|
||||
_this._dragEnd = false;
|
||||
_this.state(_this.options.inverse ? !state : state);
|
||||
} else {
|
||||
_this.state(!_this.options.state);
|
||||
}
|
||||
return _this._dragStart = false;
|
||||
};
|
||||
})(this),
|
||||
"mouseleave.bootstrapSwitch": (function(_this) {
|
||||
return function(e) {
|
||||
return _this.$label.trigger("mouseup.bootstrapSwitch");
|
||||
};
|
||||
})(this)
|
||||
});
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._externalLabelHandler = function() {
|
||||
var $externalLabel;
|
||||
$externalLabel = this.$element.closest("label");
|
||||
return $externalLabel.on("click", (function(_this) {
|
||||
return function(event) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
if (event.target === $externalLabel[0]) {
|
||||
return _this.toggleState();
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._formHandler = function() {
|
||||
var $form;
|
||||
$form = this.$element.closest("form");
|
||||
if ($form.data("bootstrap-switch")) {
|
||||
return;
|
||||
}
|
||||
return $form.on("reset.bootstrapSwitch", function() {
|
||||
return window.setTimeout(function() {
|
||||
return $form.find("input").filter(function() {
|
||||
return $(this).data("bootstrap-switch");
|
||||
}).each(function() {
|
||||
return $(this).bootstrapSwitch("state", this.checked);
|
||||
});
|
||||
}, 1);
|
||||
}).data("bootstrap-switch", true);
|
||||
};
|
||||
|
||||
BootstrapSwitch.prototype._getClasses = function(classes) {
|
||||
var c, cls, i, len;
|
||||
if (!$.isArray(classes)) {
|
||||
return [this.options.baseClass + "-" + classes];
|
||||
}
|
||||
cls = [];
|
||||
for (i = 0, len = classes.length; i < len; i++) {
|
||||
c = classes[i];
|
||||
cls.push(this.options.baseClass + "-" + c);
|
||||
}
|
||||
return cls;
|
||||
};
|
||||
|
||||
return BootstrapSwitch;
|
||||
|
||||
})();
|
||||
$.fn.bootstrapSwitch = function() {
|
||||
var args, option, ret;
|
||||
option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
||||
ret = this;
|
||||
this.each(function() {
|
||||
var $this, data;
|
||||
$this = $(this);
|
||||
data = $this.data("bootstrap-switch");
|
||||
if (!data) {
|
||||
$this.data("bootstrap-switch", data = new BootstrapSwitch(this, option));
|
||||
}
|
||||
if (typeof option === "string") {
|
||||
return ret = data[option].apply(data, args);
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
$.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
|
||||
return $.fn.bootstrapSwitch.defaults = {
|
||||
state: true,
|
||||
size: null,
|
||||
animate: true,
|
||||
disabled: false,
|
||||
readonly: false,
|
||||
indeterminate: false,
|
||||
inverse: false,
|
||||
radioAllOff: false,
|
||||
onColor: "primary",
|
||||
offColor: "default",
|
||||
onText: "ON",
|
||||
offText: "OFF",
|
||||
labelText: " ",
|
||||
handleWidth: "auto",
|
||||
labelWidth: "auto",
|
||||
baseClass: "bootstrap-switch",
|
||||
wrapperClass: "wrapper",
|
||||
onInit: function() {},
|
||||
onSwitchChange: function() {}
|
||||
};
|
||||
})(window.jQuery, window);
|
||||
|
||||
}).call(this);
|
||||
22
hal-core/resource/web/js/bootstrap-switch.min.js
vendored
Normal file
22
hal-core/resource/web/js/bootstrap-switch.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2363
hal-core/resource/web/js/bootstrap.js
vendored
Normal file
2363
hal-core/resource/web/js/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
7
hal-core/resource/web/js/bootstrap.min.js
vendored
Normal file
7
hal-core/resource/web/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
20
hal-core/resource/web/js/c3.LICENSE
Normal file
20
hal-core/resource/web/js/c3.LICENSE
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Masayuki Tanaka
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
8202
hal-core/resource/web/js/c3.js
Normal file
8202
hal-core/resource/web/js/c3.js
Normal file
File diff suppressed because it is too large
Load diff
6
hal-core/resource/web/js/c3.min.js
vendored
Normal file
6
hal-core/resource/web/js/c3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
26
hal-core/resource/web/js/d3.LICENSE
Normal file
26
hal-core/resource/web/js/d3.LICENSE
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Copyright (c) 2010-2016, Michael Bostock
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* The name Michael Bostock may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
9554
hal-core/resource/web/js/d3.js
vendored
Normal file
9554
hal-core/resource/web/js/d3.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
5
hal-core/resource/web/js/d3.min.js
vendored
Normal file
5
hal-core/resource/web/js/d3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
179
hal-core/resource/web/js/hal.js
Normal file
179
hal-core/resource/web/js/hal.js
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
///////////////////////////////// Autostart
|
||||
$(function(){
|
||||
$(".toggle-switch").bootstrapSwitch();
|
||||
|
||||
$(".timestamp").relTimestamp();
|
||||
});
|
||||
|
||||
////////////////////////////////////// JQuery helper functions
|
||||
|
||||
// $.attr() # returns all attributes of an element
|
||||
(function(old) {
|
||||
$.fn.attr = function() {
|
||||
if(arguments.length === 0) {
|
||||
if(this.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var obj = {};
|
||||
$.each(this[0].attributes, function() {
|
||||
if(this.specified) {
|
||||
obj[this.name] = this.value;
|
||||
}
|
||||
});
|
||||
return obj;
|
||||
}
|
||||
|
||||
return old.apply(this, arguments);
|
||||
};
|
||||
})($.fn.attr);
|
||||
|
||||
// converts all timestamps to human readable time and date
|
||||
$.fn.relTimestamp = function() {
|
||||
return this.each(function() {
|
||||
var timestamp = parseInt($(this).text());
|
||||
var timestampNow = Date.now();
|
||||
var timeDiff = timestampNow - timestamp;
|
||||
|
||||
if(timeDiff < 10 * 60 * 1000) // less than 10 min
|
||||
$(this).text(moment(timestamp).fromNow());
|
||||
else if(timeDiff < 24 * 60 * 60 * 1000) // less than 24 hours
|
||||
$(this).text(moment(timestamp).fromNow() + " ("+moment(timestamp).format("HH:mm")+")");
|
||||
else
|
||||
$(this).text(moment(timestamp).format("YYYY-MM-DD HH:mm"));
|
||||
return this;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////// Hal functions
|
||||
|
||||
////////////// Chart functions
|
||||
function createChart(elementId, url, updateTime=-1){
|
||||
var tickConf = {count: 20};
|
||||
if (updateTime < 60*60*1000)
|
||||
tickConf['format'] = '%H:%M';
|
||||
else if (updateTime < 24*60*60*1000)
|
||||
tickConf['format'] = '%Y-%m-%d %H:%M';
|
||||
else
|
||||
tickConf['format'] = '%Y-%m-%d';
|
||||
|
||||
|
||||
var chart = c3.generate({
|
||||
bindto: elementId,
|
||||
data: {json: []}, // set empty data, data will be loaded later
|
||||
axis : {
|
||||
x : {
|
||||
type : 'timeseries',
|
||||
label: 'Timestamp',
|
||||
tick: tickConf,
|
||||
},
|
||||
y: {
|
||||
label: 'Power (kWh)',
|
||||
min: 0,
|
||||
},
|
||||
y2: {
|
||||
show: true,
|
||||
label: 'Temperature (C)',
|
||||
min: 0,
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
y: {show: true}
|
||||
},
|
||||
point: {
|
||||
show: false
|
||||
}
|
||||
});
|
||||
|
||||
updateChart(chart, url, updateTime);
|
||||
$(window).focus(function(e) {
|
||||
updateChart(chart, url);
|
||||
});
|
||||
}
|
||||
function updateChart(chart, url, updateTime=-1){
|
||||
console.log('Updating chart: '+chart.element.id);
|
||||
$.getJSON(url, function(json){
|
||||
chart.load(getChartData(json));
|
||||
});
|
||||
if (updateTime > 0)
|
||||
setTimeout(function(){ updateChart(chart, url, updateTime); }, updateTime);
|
||||
}
|
||||
function getChartData(json){
|
||||
var dataXaxis = {};
|
||||
var dataYaxis = {};
|
||||
var data = [];
|
||||
var labels = [];
|
||||
json.forEach(function(sensor, i) {
|
||||
var index = 'data'+i;
|
||||
labels[index] = sensor.user +": "+ sensor.name;
|
||||
dataXaxis[index] = 'data'+i+'x';
|
||||
data.push([index+'x'].concat(sensor.timestamps));
|
||||
data.push([index].concat(sensor.data));
|
||||
|
||||
if (sensor.type == "PowerConsumptionSensorData")
|
||||
dataYaxis[index] = 'y';
|
||||
else //if (sensor.type == "TemperatureSensorData")
|
||||
dataYaxis[index] = 'y2';
|
||||
});
|
||||
|
||||
return {
|
||||
xs: dataXaxis,
|
||||
columns: data,
|
||||
names: labels,
|
||||
type: 'spline',
|
||||
axes: dataYaxis,
|
||||
unload: true,
|
||||
};
|
||||
}
|
||||
|
||||
////////////// Dynamic forms
|
||||
var dynamicConf = {};
|
||||
|
||||
function initDynamicModalForm(modalId, formTemplateId = null, templateID = null){
|
||||
// read in all configurations into global variable (to skip naming issues)
|
||||
if (formTemplateId != null) {
|
||||
dynamicConf[formTemplateId] = [];
|
||||
$("#"+templateID+" div").each(function(){
|
||||
dynamicConf[formTemplateId][$(this).attr("id")] = $(this).html();
|
||||
});
|
||||
// Update dynamic inputs
|
||||
$("#"+modalId+" select[name=type]").change(function(){
|
||||
$("#"+modalId+" #"+formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]);
|
||||
});
|
||||
}
|
||||
|
||||
// click event
|
||||
$("#"+modalId).on('show.bs.modal', function (event) {
|
||||
var button = $(event.relatedTarget);
|
||||
var modal = $(this);
|
||||
|
||||
// Reset all inputs
|
||||
if (formTemplateId != null)
|
||||
modal.find("#"+formTemplateId).empty(); // clear form div
|
||||
|
||||
// select dynamic form
|
||||
var selector = modal.find("select[name=type]");
|
||||
selector.val(button.data("type"));
|
||||
selector.change(); // Update dynamic inputs
|
||||
// set dynamic form data
|
||||
$.each(button.attr(), function(fieldName, value) {
|
||||
if(fieldName.startsWith("data-")) {
|
||||
fieldName = fieldName.substring(5);
|
||||
// case insensitive search
|
||||
input = modal.find("input").filter(function() {
|
||||
return this.name.toLowerCase() == fieldName;
|
||||
});
|
||||
if (input.attr("type") == "checkbox") { // special handling for checkboxes
|
||||
input.attr("value", "true");
|
||||
if (value=="true") input.attr("checked", "true");
|
||||
else input.removeAttr("checked");
|
||||
// Add default false value as a unchecked checkbox is not included in the post
|
||||
input.parent().prepend("<input type='hidden' name='"+input.attr("name")+"' value='false' />");
|
||||
} else {
|
||||
input.val(value);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
5
hal-core/resource/web/js/jquery-1.11.3.min.js
vendored
Normal file
5
hal-core/resource/web/js/jquery-1.11.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
991
hal-core/resource/web/js/jquery.filer.js
Normal file
991
hal-core/resource/web/js/jquery.filer.js
Normal file
|
|
@ -0,0 +1,991 @@
|
|||
/*!
|
||||
* jQuery.filer
|
||||
* Copyright (c) 2015 CreativeDream
|
||||
* Website: https://github.com/CreativeDream/jquery.filer
|
||||
* Version: 1.0.5 (19-Nov-2015)
|
||||
* Requires: jQuery v1.7.1 or later
|
||||
*/
|
||||
(function($) {
|
||||
"use strict";
|
||||
$.fn.filer = function(q) {
|
||||
return this.each(function(t, r) {
|
||||
var s = $(r),
|
||||
b = '.jFiler',
|
||||
p = $(),
|
||||
o = $(),
|
||||
l = $(),
|
||||
sl = [],
|
||||
n_f = $.isFunction(q) ? q(s, $.fn.filer.defaults) : q,
|
||||
n = n_f && $.isPlainObject(n_f) ? $.extend(true, {}, $.fn.filer.defaults, n_f) : $.fn.filer.defaults,
|
||||
f = {
|
||||
init: function() {
|
||||
s.wrap('<div class="jFiler"></div>');
|
||||
f._set('props');
|
||||
s.prop("jFiler").boxEl = p = s.closest(b);
|
||||
f._changeInput();
|
||||
},
|
||||
_bindInput: function() {
|
||||
if(n.changeInput && o.size() > 0) {
|
||||
o.bind("click", f._clickHandler);
|
||||
}
|
||||
s.on({
|
||||
"focus": function() {
|
||||
o.addClass('focused');
|
||||
},
|
||||
"blur": function() {
|
||||
o.removeClass('focused');
|
||||
},
|
||||
"change": function() {
|
||||
f._onChange();
|
||||
}
|
||||
});
|
||||
if(n.dragDrop) {
|
||||
(o.length > 0 ? o : s)
|
||||
.bind("drop", f._dragDrop.drop)
|
||||
.bind("dragover", f._dragDrop.dragEnter)
|
||||
.bind("dragleave", f._dragDrop.dragLeave);
|
||||
}
|
||||
if(n.uploadFile && n.clipBoardPaste) {
|
||||
$(window)
|
||||
.on("paste", f._clipboardPaste);
|
||||
}
|
||||
},
|
||||
_unbindInput: function() {
|
||||
if(n.changeInput && o.size() > 0) {
|
||||
o.unbind("click", f._clickHandler);
|
||||
}
|
||||
},
|
||||
_clickHandler: function() {
|
||||
s.click()
|
||||
},
|
||||
_applyAttrSettings: function() {
|
||||
var d = ["name", "limit", "maxSize", "extensions", "changeInput", "showThumbs", "appendTo", "theme", "addMore", "excludeName", "files", "uploadUrl", "uploadData", "options"];
|
||||
for(var k in d) {
|
||||
var j = "data-jfiler-" + d[k];
|
||||
if(f._assets.hasAttr(j)) {
|
||||
switch(d[k]) {
|
||||
case "changeInput":
|
||||
case "showThumbs":
|
||||
case "addMore":
|
||||
n[d[k]] = (["true", "false"].indexOf(s.attr(j)) > -1 ? s.attr(j) == "true" : s.attr(j));
|
||||
break;
|
||||
case "extensions":
|
||||
n[d[k]] = s.attr(j)
|
||||
.replace(/ /g, '')
|
||||
.split(",");
|
||||
break;
|
||||
case "uploadUrl":
|
||||
if(n.uploadFile) n.uploadFile.url = s.attr(j);
|
||||
break;
|
||||
case "uploadData":
|
||||
if(n.uploadFile) n.uploadFile.data = JSON.parse(s.attr(j));
|
||||
break;
|
||||
case "files":
|
||||
case "options":
|
||||
n[d[k]] = JSON.parse(s.attr(j));
|
||||
break;
|
||||
default:
|
||||
n[d[k]] = s.attr(j);
|
||||
}
|
||||
s.removeAttr(j);
|
||||
}
|
||||
}
|
||||
},
|
||||
_changeInput: function() {
|
||||
f._applyAttrSettings();
|
||||
n.beforeRender != null && typeof n.beforeRender == "function" ? n.beforeRender(p, s) : null;
|
||||
if(n.theme) {
|
||||
p.addClass('jFiler-theme-' + n.theme);
|
||||
}
|
||||
if(s.get(0)
|
||||
.tagName.toLowerCase() != "input" && s.get(0)
|
||||
.type != "file") {
|
||||
o = s;
|
||||
s = $("<input type=\"file\" name=\"" + n.name + "\" />");
|
||||
s.css({
|
||||
position: "absolute",
|
||||
left: "-9999px",
|
||||
top: "-9999px",
|
||||
"z-index": "-9999"
|
||||
});
|
||||
p.prepend(s);
|
||||
f._isGn = s;
|
||||
} else {
|
||||
if(n.changeInput) {
|
||||
switch(typeof n.changeInput) {
|
||||
case "boolean":
|
||||
o = $('<div class="jFiler-input"><div class="jFiler-input-caption"><span>' + n.captions.feedback + '</span></div><div class="jFiler-input-button">' + n.captions.button + '</div></div>"');
|
||||
break;
|
||||
case "string":
|
||||
case "object":
|
||||
o = $(n.changeInput);
|
||||
break;
|
||||
case "function":
|
||||
o = $(n.changeInput(p, s, n));
|
||||
break;
|
||||
}
|
||||
s.after(o);
|
||||
s.css({
|
||||
position: "absolute",
|
||||
left: "-9999px",
|
||||
top: "-9999px",
|
||||
"z-index": "-9999"
|
||||
});
|
||||
}
|
||||
}
|
||||
s.prop("jFiler").newInputEl = o;
|
||||
if(!n.limit || (n.limit && n.limit >= 2)) {
|
||||
s.attr("multiple", "multiple");
|
||||
s.attr("name")
|
||||
.slice(-2) != "[]" ? s.attr("name", s.attr("name") + "[]") : null;
|
||||
}
|
||||
f._bindInput();
|
||||
if(n.files) {
|
||||
f._append(false, {
|
||||
files: n.files
|
||||
});
|
||||
}
|
||||
n.afterRender != null && typeof n.afterRender == "function" ? n.afterRender(l, p, o, s) : null;
|
||||
},
|
||||
_clear: function() {
|
||||
f.files = null;
|
||||
s.prop("jFiler")
|
||||
.files = null;
|
||||
if(!n.uploadFile && !n.addMore) {
|
||||
f._reset();
|
||||
}
|
||||
f._set('feedback', (f._itFl && f._itFl.length > 0 ? f._itFl.length + ' ' + n.captions.feedback2 : n.captions.feedback));
|
||||
n.onEmpty != null && typeof n.onEmpty == "function" ? n.onEmpty(p, o, s) : null
|
||||
},
|
||||
_reset: function(a) {
|
||||
if(!a) {
|
||||
if(!n.uploadFile && n.addMore) {
|
||||
for(var i = 0; i < sl.length; i++) {
|
||||
sl[i].remove();
|
||||
}
|
||||
sl = [];
|
||||
f._unbindInput();
|
||||
if(f._isGn) {
|
||||
s = f._isGn;
|
||||
} else {
|
||||
s = $(r);
|
||||
}
|
||||
f._bindInput();
|
||||
}
|
||||
f._set('input', '');
|
||||
}
|
||||
f._itFl = [];
|
||||
f._itFc = null;
|
||||
f._ajFc = 0;
|
||||
f._set('props');
|
||||
s.prop("jFiler")
|
||||
.files_list = f._itFl;
|
||||
s.prop("jFiler")
|
||||
.current_file = f._itFc;
|
||||
if(!f._prEr) {
|
||||
f._itFr = [];
|
||||
p.find("input[name^='jfiler-items-exclude-']:hidden")
|
||||
.remove();
|
||||
}
|
||||
l.fadeOut("fast", function() {
|
||||
$(this)
|
||||
.remove();
|
||||
});
|
||||
s.prop("jFiler").listEl = l = $();
|
||||
},
|
||||
_set: function(element, value) {
|
||||
switch(element) {
|
||||
case 'input':
|
||||
s.val("");
|
||||
break;
|
||||
case 'feedback':
|
||||
if(o.length > 0) {
|
||||
o.find('.jFiler-input-caption span')
|
||||
.html(value);
|
||||
}
|
||||
break;
|
||||
case 'props':
|
||||
if(!s.prop("jFiler")){
|
||||
s.prop("jFiler", {
|
||||
options: n,
|
||||
listEl: l,
|
||||
boxEl: p,
|
||||
newInputEl: o,
|
||||
inputEl: s,
|
||||
files: f.files,
|
||||
files_list: f._itFl,
|
||||
current_file: f._itFc,
|
||||
append: function(data) {
|
||||
return f._append(false, {
|
||||
files: [data]
|
||||
});
|
||||
},
|
||||
remove: function(id) {
|
||||
f._remove(null, {
|
||||
binded: true,
|
||||
data: {
|
||||
id: id
|
||||
}
|
||||
});
|
||||
return true;
|
||||
},
|
||||
reset: function() {
|
||||
f._reset();
|
||||
f._clear();
|
||||
return true;
|
||||
},
|
||||
retry: function(data) {
|
||||
return f._retryUpload(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
_filesCheck: function() {
|
||||
var s = 0;
|
||||
if(n.limit && f.files.length + f._itFl.length > n.limit) {
|
||||
alert(f._assets.textParse(n.captions.errors.filesLimit));
|
||||
return false
|
||||
}
|
||||
for(var t = 0; t < f.files.length; t++) {
|
||||
var x = f.files[t].name.split(".")
|
||||
.pop()
|
||||
.toLowerCase(),
|
||||
file = f.files[t],
|
||||
m = {
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
size2: f._assets.bytesToSize(file.size),
|
||||
type: file.type,
|
||||
ext: x
|
||||
};
|
||||
if(n.extensions != null && $.inArray(x, n.extensions) == -1) {
|
||||
alert(f._assets.textParse(n.captions.errors.filesType, m));
|
||||
return false;
|
||||
break
|
||||
}
|
||||
if(n.maxSize != null && f.files[t].size > n.maxSize * 1048576) {
|
||||
alert(f._assets.textParse(n.captions.errors.filesSize, m));
|
||||
return false;
|
||||
break
|
||||
}
|
||||
if(file.size == 4096 && file.type.length == 0) {
|
||||
return false;
|
||||
break
|
||||
}
|
||||
s += f.files[t].size
|
||||
}
|
||||
if(n.maxSize != null && s >= Math.round(n.maxSize * 1048576)) {
|
||||
alert(f._assets.textParse(n.captions.errors.filesSizeAll));
|
||||
return false
|
||||
}
|
||||
if((n.addMore || n.uploadFile)) {
|
||||
var m = f._itFl.filter(function(a, b) {
|
||||
if(a.file.name == file.name && a.file.size == file.size && a.file.type == file.type && (file.lastModified ? a.file.lastModified == file.lastModified : true)) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if(m.length > 0) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
_thumbCreator: {
|
||||
create: function(i) {
|
||||
var file = f.files[i],
|
||||
id = (f._itFc ? f._itFc.id : i),
|
||||
name = file.name,
|
||||
size = file.size,
|
||||
type = file.type.split("/", 1)
|
||||
.toString()
|
||||
.toLowerCase(),
|
||||
ext = name.indexOf(".") != -1 ? name.split(".")
|
||||
.pop()
|
||||
.toLowerCase() : "",
|
||||
progressBar = n.uploadFile ? '<div class="jFiler-jProgressBar">' + n.templates.progressBar + '</div>' : '',
|
||||
opts = {
|
||||
id: id,
|
||||
name: name,
|
||||
size: size,
|
||||
size2: f._assets.bytesToSize(size),
|
||||
type: type,
|
||||
extension: ext,
|
||||
icon: f._assets.getIcon(ext, type),
|
||||
icon2: f._thumbCreator.generateIcon({
|
||||
type: type,
|
||||
extension: ext
|
||||
}),
|
||||
image: '<div class="jFiler-item-thumb-image fi-loading"></div>',
|
||||
progressBar: progressBar,
|
||||
_appended: file._appended
|
||||
},
|
||||
html = "";
|
||||
if(file.opts) {
|
||||
opts = $.extend({}, file.opts, opts);
|
||||
}
|
||||
html = $(f._thumbCreator.renderContent(opts))
|
||||
.attr("data-jfiler-index", id);
|
||||
html.get(0)
|
||||
.jfiler_id = id;
|
||||
f._thumbCreator.renderFile(file, html, opts);
|
||||
if(file.forList) {
|
||||
return html;
|
||||
}
|
||||
f._itFc.html = html;
|
||||
html.hide()[n.templates.itemAppendToEnd ? "appendTo" : "prependTo"](l.find(n.templates._selectors.list))
|
||||
.show();
|
||||
if(!file._appended) {
|
||||
f._onSelect(i);
|
||||
}
|
||||
},
|
||||
renderContent: function(opts) {
|
||||
return f._assets.textParse((opts._appended ? n.templates.itemAppend : n.templates.item), opts);
|
||||
},
|
||||
renderFile: function(file, html, opts) {
|
||||
if(html.find('.jFiler-item-thumb-image')
|
||||
.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
if(file.file && opts.type == "image") {
|
||||
var g = '<img src="' + file.file + '" draggable="false" />',
|
||||
m = html.find('.jFiler-item-thumb-image.fi-loading');
|
||||
$(g)
|
||||
.error(function() {
|
||||
g = f._thumbCreator.generateIcon(opts);
|
||||
html.addClass('jFiler-no-thumbnail');
|
||||
m.removeClass('fi-loading')
|
||||
.html(g);
|
||||
})
|
||||
.load(function() {
|
||||
m.removeClass('fi-loading')
|
||||
.html(g);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if(window.File && window.FileList && window.FileReader && opts.type == "image" && opts.size < 6e+6) {
|
||||
var y = new FileReader;
|
||||
y.onload = function(e) {
|
||||
var g = '<img src="' + e.target.result + '" draggable="false" />',
|
||||
m = html.find('.jFiler-item-thumb-image.fi-loading');
|
||||
$(g)
|
||||
.error(function() {
|
||||
g = f._thumbCreator.generateIcon(opts);
|
||||
html.addClass('jFiler-no-thumbnail');
|
||||
m.removeClass('fi-loading')
|
||||
.html(g);
|
||||
})
|
||||
.load(function() {
|
||||
m.removeClass('fi-loading')
|
||||
.html(g);
|
||||
});
|
||||
};
|
||||
y.readAsDataURL(file);
|
||||
} else {
|
||||
var g = f._thumbCreator.generateIcon(opts),
|
||||
m = html.find('.jFiler-item-thumb-image.fi-loading');
|
||||
html.addClass('jFiler-no-thumbnail');
|
||||
m.removeClass('fi-loading')
|
||||
.html(g);
|
||||
}
|
||||
},
|
||||
generateIcon: function(obj) {
|
||||
var m = new Array(3);
|
||||
if(obj && obj.type && obj.extension) {
|
||||
switch(obj.type) {
|
||||
case "image":
|
||||
m[0] = "f-image";
|
||||
m[1] = "<i class=\"icon-jfi-file-image\"></i>"
|
||||
break;
|
||||
case "video":
|
||||
m[0] = "f-video";
|
||||
m[1] = "<i class=\"icon-jfi-file-video\"></i>"
|
||||
break;
|
||||
case "audio":
|
||||
m[0] = "f-audio";
|
||||
m[1] = "<i class=\"icon-jfi-file-audio\"></i>"
|
||||
break;
|
||||
default:
|
||||
m[0] = "f-file f-file-ext-" + obj.extension;
|
||||
m[1] = (obj.extension.length > 0 ? "." + obj.extension : "");
|
||||
m[2] = 1
|
||||
}
|
||||
} else {
|
||||
m[0] = "f-file";
|
||||
m[1] = (obj.extension && obj.extension.length > 0 ? "." + obj.extension : "");
|
||||
m[2] = 1
|
||||
}
|
||||
var el = '<span class="jFiler-icon-file ' + m[0] + '">' + m[1] + '</span>';
|
||||
if(m[2] == 1) {
|
||||
var c = f._assets.text2Color(obj.extension);
|
||||
if(c) {
|
||||
var j = $(el)
|
||||
.appendTo("body"),
|
||||
h = j.css("box-shadow");
|
||||
h = c + h.substring(h.replace(/^.*(rgba?\([^)]+\)).*$/, '$1')
|
||||
.length, h.length);
|
||||
j.css({
|
||||
'-webkit-box-shadow': h,
|
||||
'-moz-box-shadow': h,
|
||||
'box-shadow': h
|
||||
})
|
||||
.attr('style', '-webkit-box-shadow: ' + h + '; -moz-box-shadow: ' + h + '; box-shadow: ' + h + ';');
|
||||
el = j.prop('outerHTML');
|
||||
j.remove();
|
||||
}
|
||||
}
|
||||
return el;
|
||||
},
|
||||
_box: function(params) {
|
||||
if(n.beforeShow != null && typeof n.beforeShow == "function" ? !n.beforeShow(f.files, l, p, o, s) : false) {
|
||||
return false
|
||||
}
|
||||
if(l.length < 1) {
|
||||
if(n.appendTo) {
|
||||
var appendTo = $(n.appendTo);
|
||||
} else {
|
||||
var appendTo = p;
|
||||
}
|
||||
appendTo.find('.jFiler-items')
|
||||
.remove();
|
||||
l = $('<div class="jFiler-items jFiler-row"></div>');
|
||||
s.prop("jFiler").listEl = l;
|
||||
l.append(f._assets.textParse(n.templates.box))
|
||||
.appendTo(appendTo);
|
||||
l.on('click', n.templates._selectors.remove, function(e) {
|
||||
e.preventDefault();
|
||||
var cf = n.templates.removeConfirmation ? confirm(n.captions.removeConfirmation) : true;
|
||||
if(cf) {
|
||||
f._remove(params ? params.remove.event : e, params ? params.remove.el : $(this)
|
||||
.closest(n.templates._selectors.item));
|
||||
}
|
||||
});
|
||||
}
|
||||
for(var i = 0; i < f.files.length; i++) {
|
||||
if(!f.files[i]._appended) f.files[i]._choosed = true;
|
||||
f._addToMemory(i);
|
||||
f._thumbCreator.create(i);
|
||||
}
|
||||
}
|
||||
},
|
||||
_upload: function(i) {
|
||||
var el = f._itFc.html,
|
||||
formData = new FormData();
|
||||
formData.append(s.attr('name'), f._itFc.file, (f._itFc.file.name ? f._itFc.file.name : false));
|
||||
if(n.uploadFile.data != null && $.isPlainObject(n.uploadFile.data)) {
|
||||
for(var k in n.uploadFile.data) {
|
||||
formData.append(k, n.uploadFile.data[k])
|
||||
}
|
||||
}
|
||||
f._ajax.send(el, formData, f._itFc);
|
||||
},
|
||||
_ajax: {
|
||||
send: function(el, formData, c) {
|
||||
c.ajax = $.ajax({
|
||||
url: n.uploadFile.url,
|
||||
data: formData,
|
||||
type: n.uploadFile.type,
|
||||
enctype: n.uploadFile.enctype,
|
||||
xhr: function() {
|
||||
var myXhr = $.ajaxSettings.xhr();
|
||||
if(myXhr.upload) {
|
||||
myXhr.upload.addEventListener("progress", function(e) {
|
||||
f._ajax.progressHandling(e, el)
|
||||
}, false)
|
||||
}
|
||||
return myXhr
|
||||
},
|
||||
complete: function(jqXHR, textStatus) {
|
||||
c.ajax = false;
|
||||
f._ajFc++;
|
||||
if(f._ajFc >= f.files.length) {
|
||||
f._ajFc = 0;
|
||||
n.uploadFile.onComplete != null && typeof n.uploadFile.onComplete == "function" ? n.uploadFile.onComplete(l, p, o, s, jqXHR, textStatus) : null;
|
||||
}
|
||||
},
|
||||
beforeSend: function(jqXHR, settings) {
|
||||
return n.uploadFile.beforeSend != null && typeof n.uploadFile.beforeSend == "function" ? n.uploadFile.beforeSend(el, l, p, o, s, c.id, jqXHR, settings) : true;
|
||||
},
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
c.uploaded = true;
|
||||
n.uploadFile.success != null && typeof n.uploadFile.success == "function" ? n.uploadFile.success(data, el, l, p, o, s, c.id, textStatus, jqXHR) : null
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
c.uploaded = false;
|
||||
n.uploadFile.error != null && typeof n.uploadFile.error == "function" ? n.uploadFile.error(el, l, p, o, s, c.id, jqXHR, textStatus, errorThrown) : null
|
||||
},
|
||||
statusCode: n.uploadFile.statusCode,
|
||||
cache: false,
|
||||
contentType: false,
|
||||
processData: false
|
||||
});
|
||||
return c.ajax;
|
||||
},
|
||||
progressHandling: function(e, el) {
|
||||
if(e.lengthComputable) {
|
||||
var t = Math.round(e.loaded * 100 / e.total)
|
||||
.toString();
|
||||
n.uploadFile.onProgress != null && typeof n.uploadFile.onProgress == "function" ? n.uploadFile.onProgress(t, el, l, p, o, s) : null;
|
||||
el.find('.jFiler-jProgressBar')
|
||||
.find(n.templates._selectors.progressBar)
|
||||
.css("width", t + "%")
|
||||
}
|
||||
}
|
||||
},
|
||||
_dragDrop: {
|
||||
dragEnter: function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
p.addClass('dragged');
|
||||
f._set('feedback', n.captions.drop);
|
||||
n.dragDrop.dragEnter != null && typeof n.dragDrop.dragEnter == "function" ? n.dragDrop.dragEnter(e, o, s, p) : null;
|
||||
},
|
||||
dragLeave: function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
if(!f._dragDrop._dragLeaveCheck(e)) {
|
||||
return false
|
||||
}
|
||||
p.removeClass('dragged');
|
||||
f._set('feedback', n.captions.feedback);
|
||||
n.dragDrop.dragLeave != null && typeof n.dragDrop.dragLeave == "function" ? n.dragDrop.dragLeave(e, o, s, p) : null;
|
||||
},
|
||||
drop: function(e) {
|
||||
e.preventDefault();
|
||||
p.removeClass('dragged');
|
||||
f._set('feedback', n.captions.feedback);
|
||||
if(e && e.originalEvent && e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files && e.originalEvent.dataTransfer.files.length > 0) {
|
||||
f._onChange(e, e.originalEvent.dataTransfer.files);
|
||||
}
|
||||
n.dragDrop.drop != null && typeof n.dragDrop.drop == "function" ? n.dragDrop.drop(e.originalEvent.dataTransfer.files, e, o, s, p) : null;
|
||||
},
|
||||
_dragLeaveCheck: function(e) {
|
||||
var related = e.relatedTarget,
|
||||
inside = false;
|
||||
if(related !== o) {
|
||||
if(related) {
|
||||
inside = $.contains(o, related);
|
||||
}
|
||||
if(inside) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
},
|
||||
_clipboardPaste: function(e, fromDrop) {
|
||||
if(!fromDrop && (!e.originalEvent.clipboardData && !e.originalEvent.clipboardData.items)) {
|
||||
return
|
||||
}
|
||||
if(fromDrop && (!e.originalEvent.dataTransfer && !e.originalEvent.dataTransfer.items)) {
|
||||
return
|
||||
}
|
||||
if(f._clPsePre) {
|
||||
return
|
||||
}
|
||||
var items = (fromDrop ? e.originalEvent.dataTransfer.items : e.originalEvent.clipboardData.items),
|
||||
b64toBlob = function(b64Data, contentType, sliceSize) {
|
||||
contentType = contentType || '';
|
||||
sliceSize = sliceSize || 512;
|
||||
var byteCharacters = atob(b64Data);
|
||||
var byteArrays = [];
|
||||
for(var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
|
||||
var slice = byteCharacters.slice(offset, offset + sliceSize);
|
||||
var byteNumbers = new Array(slice.length);
|
||||
for(var i = 0; i < slice.length; i++) {
|
||||
byteNumbers[i] = slice.charCodeAt(i);
|
||||
}
|
||||
var byteArray = new Uint8Array(byteNumbers);
|
||||
byteArrays.push(byteArray);
|
||||
}
|
||||
var blob = new Blob(byteArrays, {
|
||||
type: contentType
|
||||
});
|
||||
return blob;
|
||||
};
|
||||
if(items) {
|
||||
for(var i = 0; i < items.length; i++) {
|
||||
if(items[i].type.indexOf("image") !== -1 || items[i].type.indexOf("text/uri-list") !== -1) {
|
||||
if(fromDrop) {
|
||||
try {
|
||||
window.atob(e.originalEvent.dataTransfer.getData("text/uri-list")
|
||||
.toString()
|
||||
.split(',')[1]);
|
||||
} catch(e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
var blob = (fromDrop ? b64toBlob(e.originalEvent.dataTransfer.getData("text/uri-list")
|
||||
.toString()
|
||||
.split(',')[1], "image/png") : items[i].getAsFile());
|
||||
blob.name = Math.random()
|
||||
.toString(36)
|
||||
.substring(5);
|
||||
blob.name += blob.type.indexOf("/") != -1 ? "." + blob.type.split("/")[1].toString()
|
||||
.toLowerCase() : ".png";
|
||||
f._onChange(e, [blob]);
|
||||
f._clPsePre = setTimeout(function() {
|
||||
delete f._clPsePre
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
_onSelect: function(i) {
|
||||
if(n.uploadFile && !$.isEmptyObject(n.uploadFile)) {
|
||||
f._upload(i)
|
||||
}
|
||||
n.onSelect != null && typeof n.onSelect == "function" ? n.onSelect(f.files[i], f._itFc.html, l, p, o, s) : null;
|
||||
if(i + 1 >= f.files.length) {
|
||||
n.afterShow != null && typeof n.afterShow == "function" ? n.afterShow(l, p, o, s) : null
|
||||
}
|
||||
},
|
||||
_onChange: function(e, d) {
|
||||
if(!d) {
|
||||
if(!s.get(0)
|
||||
.files || typeof s.get(0)
|
||||
.files == "undefined" || s.get(0)
|
||||
.files.length == 0) {
|
||||
if(!n.uploadFile && !n.addMore) {
|
||||
f._set('input', '');
|
||||
f._clear();
|
||||
}
|
||||
return false
|
||||
}
|
||||
f.files = s.get(0)
|
||||
.files;
|
||||
} else {
|
||||
if(!d || d.length == 0) {
|
||||
f._set('input', '');
|
||||
f._clear();
|
||||
return false
|
||||
}
|
||||
f.files = d;
|
||||
}
|
||||
if(!n.uploadFile && !n.addMore) {
|
||||
f._reset(true);
|
||||
}
|
||||
s.prop("jFiler")
|
||||
.files = f.files;
|
||||
if(!f._filesCheck() || (n.beforeSelect != null && typeof n.beforeSelect == "function" ? !n.beforeSelect(f.files, l, p, o, s) : false)) {
|
||||
f._set('input', '');
|
||||
f._clear();
|
||||
return false
|
||||
}
|
||||
f._set('feedback', f.files.length + f._itFl.length + ' ' + n.captions.feedback2);
|
||||
if(n.showThumbs) {
|
||||
f._thumbCreator._box();
|
||||
} else {
|
||||
for(var i = 0; i < f.files.length; i++) {
|
||||
f.files[i]._choosed = true;
|
||||
f._addToMemory(i);
|
||||
f._onSelect(i);
|
||||
}
|
||||
}
|
||||
if(!n.uploadFile && n.addMore) {
|
||||
var elem = $('<input type="file" />');
|
||||
var attributes = s.prop("attributes");
|
||||
$.each(attributes, function() {
|
||||
elem.attr(this.name, this.value);
|
||||
});
|
||||
s.after(elem);
|
||||
f._unbindInput();
|
||||
sl.push(elem);
|
||||
s = elem;
|
||||
f._bindInput();
|
||||
f._set('props');
|
||||
}
|
||||
},
|
||||
_append: function(e, data) {
|
||||
var files = (!data ? false : data.files);
|
||||
if(!files || files.length <= 0) {
|
||||
return;
|
||||
}
|
||||
f.files = files;
|
||||
s.prop("jFiler")
|
||||
.files = f.files;
|
||||
if(n.showThumbs) {
|
||||
for(var i = 0; i < f.files.length; i++) {
|
||||
f.files[i]._appended = true;
|
||||
}
|
||||
f._thumbCreator._box();
|
||||
}
|
||||
},
|
||||
_getList: function(e, data) {
|
||||
var files = (!data ? false : data.files);
|
||||
if(!files || files.length <= 0) {
|
||||
return;
|
||||
}
|
||||
f.files = files;
|
||||
s.prop("jFiler")
|
||||
.files = f.files;
|
||||
if(n.showThumbs) {
|
||||
var returnData = [];
|
||||
for(var i = 0; i < f.files.length; i++) {
|
||||
f.files[i].forList = true;
|
||||
returnData.push(f._thumbCreator.create(i));
|
||||
}
|
||||
if(data.callback) {
|
||||
data.callback(returnData, l, p, o, s);
|
||||
}
|
||||
}
|
||||
},
|
||||
_retryUpload: function(e, data) {
|
||||
var id = parseInt(typeof data == "object" ? data.attr("data-jfiler-index") : data),
|
||||
obj = f._itFl.filter(function(value, key) {
|
||||
return value.id == id;
|
||||
});
|
||||
if(obj.length > 0) {
|
||||
if(n.uploadFile && !$.isEmptyObject(n.uploadFile) && !obj[0].uploaded) {
|
||||
f._itFc = obj[0];
|
||||
s.prop("jFiler")
|
||||
.current_file = f._itFc;
|
||||
f._upload(id);
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
_remove: function(e, el) {
|
||||
if(el.binded) {
|
||||
if(typeof(el.data.id) != "undefined") {
|
||||
el = l.find(n.templates._selectors.item + "[data-jfiler-index='" + el.data.id + "']");
|
||||
if(el.size() == 0) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if(el.data.el) {
|
||||
el = el.data.el;
|
||||
}
|
||||
}
|
||||
var attrId = el.get(0)
|
||||
.jfiler_id || el.attr('data-jfiler-index'),
|
||||
id = null,
|
||||
excl_input = function(id) {
|
||||
var input = p.find("input[name^='jfiler-items-exclude-']:hidden")
|
||||
.first(),
|
||||
item = f._itFl[id],
|
||||
val = [];
|
||||
if(input.size() == 0) {
|
||||
input = $('<input type="hidden" name="jfiler-items-exclude-' + (n.excludeName ? n.excludeName : (s.attr("name")
|
||||
.slice(-2) != "[]" ? s.attr("name") : s.attr("name")
|
||||
.substring(0, s.attr("name")
|
||||
.length - 2)) + "-" + t) + '">');
|
||||
input.appendTo(p);
|
||||
}
|
||||
if(item.file._choosed || item.file._appended || item.uploaded) {
|
||||
f._prEr = true;
|
||||
f._itFr.push(item);
|
||||
if(n.addMore) {
|
||||
var current_input = item.input,
|
||||
count_same_input = 0;
|
||||
f._itFl.filter(function(val, index) {
|
||||
if(val.file._choosed && val.input.get(0) == current_input.get(0)) count_same_input++;
|
||||
});
|
||||
if(count_same_input == 1) {
|
||||
f._itFr = f._itFr.filter(function(val, index) {
|
||||
return val.file._choosed ? val.input.get(0) != current_input.get(0) : true;
|
||||
});
|
||||
current_input.val("");
|
||||
f._prEr = false;
|
||||
}
|
||||
}
|
||||
for(var i = 0; i < f._itFr.length; i++) {
|
||||
val.push(f._itFr[i].file.name);
|
||||
}
|
||||
val = JSON.stringify(val);
|
||||
input.val(val);
|
||||
}
|
||||
},
|
||||
callback = function(el, id) {
|
||||
excl_input(id);
|
||||
f._itFl.splice(id, 1);
|
||||
if(f._itFl.length < 1) {
|
||||
f._reset();
|
||||
f._clear();
|
||||
} else {
|
||||
f._set('feedback', f._itFl.length + ' ' + n.captions.feedback2);
|
||||
}
|
||||
el.fadeOut("fast", function() {
|
||||
$(this)
|
||||
.remove();
|
||||
});
|
||||
};
|
||||
for(var key in f._itFl) {
|
||||
if(key === 'length' || !f._itFl.hasOwnProperty(key)) continue;
|
||||
if(f._itFl[key].id == attrId) {
|
||||
id = key;
|
||||
}
|
||||
}
|
||||
if(!f._itFl.hasOwnProperty(id)) {
|
||||
return false
|
||||
}
|
||||
if(f._itFl[id].ajax) {
|
||||
f._itFl[id].ajax.abort();
|
||||
callback(el, id);
|
||||
return;
|
||||
}
|
||||
n.onRemove != null && typeof n.onRemove == "function" ? n.onRemove(el, f._itFl[id].file, id, l, p, o, s) : null;
|
||||
callback(el, id);
|
||||
},
|
||||
_addToMemory: function(i) {
|
||||
f._itFl.push({
|
||||
id: f._itFl.length,
|
||||
file: f.files[i],
|
||||
html: $(),
|
||||
ajax: false,
|
||||
uploaded: false,
|
||||
});
|
||||
if(n.addMore && !f.files[i]._appended) f._itFl[f._itFl.length - 1].input = s;
|
||||
f._itFc = f._itFl[f._itFl.length - 1];
|
||||
s.prop("jFiler")
|
||||
.files_list = f._itFl;
|
||||
s.prop("jFiler")
|
||||
.current_file = f._itFc;
|
||||
},
|
||||
_assets: {
|
||||
bytesToSize: function(bytes) {
|
||||
if(bytes == 0) return '0 Byte';
|
||||
var k = 1000;
|
||||
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
return(bytes / Math.pow(k, i))
|
||||
.toPrecision(3) + ' ' + sizes[i];
|
||||
},
|
||||
hasAttr: function(attr, el) {
|
||||
var el = (!el ? s : el),
|
||||
a = el.attr(attr);
|
||||
if(!a || typeof a == "undefined") {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
getIcon: function(ext, type) {
|
||||
var types = ["audio", "image", "text", "video"];
|
||||
if($.inArray(type, types) > -1) {
|
||||
return '<i class="icon-jfi-file-' + type + ' jfi-file-ext-' + ext + '"></i>';
|
||||
}
|
||||
return '<i class="icon-jfi-file-o jfi-file-type-' + type + ' jfi-file-ext-' + ext + '"></i>';
|
||||
},
|
||||
textParse: function(text, opts) {
|
||||
opts = $.extend({}, {
|
||||
limit: n.limit,
|
||||
maxSize: n.maxSize,
|
||||
extensions: n.extensions ? n.extensions.join(',') : null,
|
||||
}, (opts && $.isPlainObject(opts) ? opts : {}), n.options);
|
||||
switch(typeof(text)) {
|
||||
case "string":
|
||||
return text.replace(/\{\{fi-(.*?)\}\}/g, function(match, a) {
|
||||
a = a.replace(/ /g, '');
|
||||
if(a.match(/(.*?)\|limitTo\:(\d+)/)) {
|
||||
return a.replace(/(.*?)\|limitTo\:(\d+)/, function(match, a, b) {
|
||||
var a = (opts[a] ? opts[a] : ""),
|
||||
str = a.substring(0, b);
|
||||
str = (a.length > str.length ? str.substring(0, str.length - 3) + "..." : str);
|
||||
return str;
|
||||
});
|
||||
} else {
|
||||
return(opts[a] ? opts[a] : "");
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "function":
|
||||
return text(opts);
|
||||
break;
|
||||
default:
|
||||
return text;
|
||||
}
|
||||
},
|
||||
text2Color: function(str) {
|
||||
if(!str || str.length == 0) {
|
||||
return false
|
||||
}
|
||||
for(var i = 0, hash = 0; i < str.length; hash = str.charCodeAt(i++) + ((hash << 5) - hash));
|
||||
for(var i = 0, colour = "#"; i < 3; colour += ("00" + ((hash >> i++ * 2) & 0xFF)
|
||||
.toString(16))
|
||||
.slice(-2));
|
||||
return colour;
|
||||
}
|
||||
},
|
||||
files: null,
|
||||
_itFl: [],
|
||||
_itFc: null,
|
||||
_itFr: [],
|
||||
_ajFc: 0,
|
||||
_prEr: false
|
||||
}
|
||||
|
||||
s.on("filer.append", function(e, data) {
|
||||
f._append(e, data)
|
||||
}).on("filer.remove", function(e, data) {
|
||||
data.binded = true;
|
||||
f._remove(e, data);
|
||||
}).on("filer.reset", function(e) {
|
||||
f._reset();
|
||||
f._clear();
|
||||
return true;
|
||||
}).on("filer.generateList", function(e, data) {
|
||||
return f._getList(e, data)
|
||||
}).on("filer.retry", function(e, data) {
|
||||
return f._retryUpload(e, data)
|
||||
});
|
||||
|
||||
f.init();
|
||||
|
||||
return this;
|
||||
});
|
||||
};
|
||||
$.fn.filer.defaults = {
|
||||
limit: null,
|
||||
maxSize: null,
|
||||
extensions: null,
|
||||
changeInput: true,
|
||||
showThumbs: false,
|
||||
appendTo: null,
|
||||
theme: 'default',
|
||||
templates: {
|
||||
box: '<ul class="jFiler-items-list jFiler-items-default"></ul>',
|
||||
item: '<li class="jFiler-item"><div class="jFiler-item-container"><div class="jFiler-item-inner"><div class="jFiler-item-icon pull-left">{{fi-icon}}</div><div class="jFiler-item-info pull-left"><div class="jFiler-item-title" title="{{fi-name}}">{{fi-name | limitTo:30}}</div><div class="jFiler-item-others"><span>size: {{fi-size2}}</span><span>type: {{fi-extension}}</span><span class="jFiler-item-status">{{fi-progressBar}}</span></div><div class="jFiler-item-assets"><ul class="list-inline"><li><a class="icon-jfi-trash jFiler-item-trash-action"></a></li></ul></div></div></div></div></li>',
|
||||
itemAppend: '<li class="jFiler-item"><div class="jFiler-item-container"><div class="jFiler-item-inner"><div class="jFiler-item-icon pull-left">{{fi-icon}}</div><div class="jFiler-item-info pull-left"><div class="jFiler-item-title">{{fi-name | limitTo:35}}</div><div class="jFiler-item-others"><span>size: {{fi-size2}}</span><span>type: {{fi-extension}}</span><span class="jFiler-item-status"></span></div><div class="jFiler-item-assets"><ul class="list-inline"><li><a class="icon-jfi-trash jFiler-item-trash-action"></a></li></ul></div></div></div></div></li>',
|
||||
progressBar: '<div class="bar"></div>',
|
||||
itemAppendToEnd: false,
|
||||
removeConfirmation: true,
|
||||
_selectors: {
|
||||
list: '.jFiler-items-list',
|
||||
item: '.jFiler-item',
|
||||
progressBar: '.bar',
|
||||
remove: '.jFiler-item-trash-action'
|
||||
}
|
||||
},
|
||||
files: null,
|
||||
uploadFile: null,
|
||||
dragDrop: null,
|
||||
addMore: false,
|
||||
clipBoardPaste: true,
|
||||
excludeName: null,
|
||||
beforeRender: null,
|
||||
afterRender: null,
|
||||
beforeShow: null,
|
||||
beforeSelect: null,
|
||||
onSelect: null,
|
||||
afterShow: null,
|
||||
onRemove: null,
|
||||
onEmpty: null,
|
||||
options: null,
|
||||
captions: {
|
||||
button: "Choose Files",
|
||||
feedback: "Choose files To Upload",
|
||||
feedback2: "files were chosen",
|
||||
drop: "Drop file here to Upload",
|
||||
removeConfirmation: "Are you sure you want to remove this file?",
|
||||
errors: {
|
||||
filesLimit: "Only {{fi-limit}} files are allowed to be uploaded.",
|
||||
filesType: "Only Images are allowed to be uploaded.",
|
||||
filesSize: "{{fi-name}} is too large! Please upload file up to {{fi-maxSize}} MB.",
|
||||
filesSizeAll: "Files you've choosed are too large! Please upload files up to {{fi-maxSize}} MB."
|
||||
}
|
||||
}
|
||||
}
|
||||
})(jQuery);
|
||||
8
hal-core/resource/web/js/jquery.filer.min.js
vendored
Normal file
8
hal-core/resource/web/js/jquery.filer.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3606
hal-core/resource/web/js/moment.js
Normal file
3606
hal-core/resource/web/js/moment.js
Normal file
File diff suppressed because it is too large
Load diff
221
hal-core/resource/web/js/svg.draggable.js
Normal file
221
hal-core/resource/web/js/svg.draggable.js
Normal file
|
|
@ -0,0 +1,221 @@
|
|||
/*! svg.draggable.js - v2.2.0 - 2016-05-21
|
||||
* https://github.com/wout/svg.draggable.js
|
||||
* Copyright (c) 2016 Wout Fierens; Licensed MIT */
|
||||
;(function() {
|
||||
|
||||
// creates handler, saves it
|
||||
function DragHandler(el){
|
||||
el.remember('_draggable', this)
|
||||
this.el = el
|
||||
}
|
||||
|
||||
|
||||
// Sets new parameter, starts dragging
|
||||
DragHandler.prototype.init = function(constraint, val){
|
||||
var _this = this
|
||||
this.constraint = constraint
|
||||
this.value = val
|
||||
this.el.on('mousedown.drag', function(e){ _this.start(e) })
|
||||
this.el.on('touchstart.drag', function(e){ _this.start(e) })
|
||||
}
|
||||
|
||||
// transforms one point from screen to user coords
|
||||
DragHandler.prototype.transformPoint = function(event, offset){
|
||||
event = event || window.event
|
||||
var touches = event.changedTouches && event.changedTouches[0] || event
|
||||
this.p.x = touches.pageX - (offset || 0)
|
||||
this.p.y = touches.pageY
|
||||
return this.p.matrixTransform(this.m)
|
||||
}
|
||||
|
||||
// gets elements bounding box with special handling of groups, nested and use
|
||||
DragHandler.prototype.getBBox = function(){
|
||||
|
||||
var box = this.el.bbox()
|
||||
|
||||
if(this.el instanceof SVG.Nested) box = this.el.rbox()
|
||||
|
||||
if (this.el instanceof SVG.G || this.el instanceof SVG.Use || this.el instanceof SVG.Nested) {
|
||||
box.x = this.el.x()
|
||||
box.y = this.el.y()
|
||||
}
|
||||
|
||||
return box
|
||||
}
|
||||
|
||||
// start dragging
|
||||
DragHandler.prototype.start = function(e){
|
||||
|
||||
// check for left button
|
||||
if(e.type == 'click'|| e.type == 'mousedown' || e.type == 'mousemove'){
|
||||
if((e.which || e.buttons) != 1){
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
var _this = this
|
||||
|
||||
// fire beforedrag event
|
||||
this.el.fire('beforedrag', { event: e, handler: this })
|
||||
|
||||
// search for parent on the fly to make sure we can call
|
||||
// draggable() even when element is not in the dom currently
|
||||
this.parent = this.parent || this.el.parent(SVG.Nested) || this.el.parent(SVG.Doc)
|
||||
this.p = this.parent.node.createSVGPoint()
|
||||
|
||||
// save current transformation matrix
|
||||
this.m = this.el.node.getScreenCTM().inverse()
|
||||
|
||||
var box = this.getBBox()
|
||||
|
||||
var anchorOffset;
|
||||
|
||||
// fix text-anchor in text-element (#37)
|
||||
if(this.el instanceof SVG.Text){
|
||||
anchorOffset = this.el.node.getComputedTextLength();
|
||||
|
||||
switch(this.el.attr('text-anchor')){
|
||||
case 'middle':
|
||||
anchorOffset /= 2;
|
||||
break
|
||||
case 'start':
|
||||
anchorOffset = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.startPoints = {
|
||||
// We take absolute coordinates since we are just using a delta here
|
||||
point: this.transformPoint(e, anchorOffset),
|
||||
box: box
|
||||
}
|
||||
|
||||
// add drag and end events to window
|
||||
SVG.on(window, 'mousemove.drag', function(e){ _this.drag(e) })
|
||||
SVG.on(window, 'touchmove.drag', function(e){ _this.drag(e) })
|
||||
SVG.on(window, 'mouseup.drag', function(e){ _this.end(e) })
|
||||
SVG.on(window, 'touchend.drag', function(e){ _this.end(e) })
|
||||
|
||||
// fire dragstart event
|
||||
this.el.fire('dragstart', {event: e, p: this.startPoints.point, m: this.m, handler: this})
|
||||
|
||||
// prevent browser drag behavior
|
||||
e.preventDefault()
|
||||
|
||||
// prevent propagation to a parent that might also have dragging enabled
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
// while dragging
|
||||
DragHandler.prototype.drag = function(e){
|
||||
|
||||
var box = this.getBBox()
|
||||
, p = this.transformPoint(e)
|
||||
, x = this.startPoints.box.x + p.x - this.startPoints.point.x
|
||||
, y = this.startPoints.box.y + p.y - this.startPoints.point.y
|
||||
, c = this.constraint
|
||||
|
||||
var event = new CustomEvent('dragmove', {
|
||||
detail: {
|
||||
event: e
|
||||
, p: p
|
||||
, m: this.m
|
||||
, handler: this
|
||||
}
|
||||
, cancelable: true
|
||||
})
|
||||
|
||||
this.el.fire(event)
|
||||
|
||||
if(event.defaultPrevented) return p
|
||||
|
||||
// move the element to its new position, if possible by constraint
|
||||
if (typeof c == 'function') {
|
||||
|
||||
var coord = c.call(this.el, x, y, this.m)
|
||||
|
||||
// bool, just show us if movement is allowed or not
|
||||
if (typeof coord == 'boolean') {
|
||||
coord = {
|
||||
x: coord,
|
||||
y: coord
|
||||
}
|
||||
}
|
||||
|
||||
// if true, we just move. If !false its a number and we move it there
|
||||
if (coord.x === true) {
|
||||
this.el.x(x)
|
||||
} else if (coord.x !== false) {
|
||||
this.el.x(coord.x)
|
||||
}
|
||||
|
||||
if (coord.y === true) {
|
||||
this.el.y(y)
|
||||
} else if (coord.y !== false) {
|
||||
this.el.y(coord.y)
|
||||
}
|
||||
|
||||
} else if (typeof c == 'object') {
|
||||
|
||||
// keep element within constrained box
|
||||
if (c.minX != null && x < c.minX)
|
||||
x = c.minX
|
||||
else if (c.maxX != null && x > c.maxX - box.width){
|
||||
x = c.maxX - box.width
|
||||
}if (c.minY != null && y < c.minY)
|
||||
y = c.minY
|
||||
else if (c.maxY != null && y > c.maxY - box.height)
|
||||
y = c.maxY - box.height
|
||||
|
||||
this.el.move(x, y)
|
||||
}
|
||||
|
||||
// so we can use it in the end-method, too
|
||||
return p
|
||||
}
|
||||
|
||||
DragHandler.prototype.end = function(e){
|
||||
|
||||
// final drag
|
||||
var p = this.drag(e);
|
||||
|
||||
// fire dragend event
|
||||
this.el.fire('dragend', { event: e, p: p, m: this.m, handler: this })
|
||||
|
||||
// unbind events
|
||||
SVG.off(window, 'mousemove.drag')
|
||||
SVG.off(window, 'touchmove.drag')
|
||||
SVG.off(window, 'mouseup.drag')
|
||||
SVG.off(window, 'touchend.drag')
|
||||
|
||||
}
|
||||
|
||||
SVG.extend(SVG.Element, {
|
||||
// Make element draggable
|
||||
// Constraint might be an object (as described in readme.md) or a function in the form "function (x, y)" that gets called before every move.
|
||||
// The function can return a boolean or an object of the form {x, y}, to which the element will be moved. "False" skips moving, true moves to raw x, y.
|
||||
draggable: function(value, constraint) {
|
||||
|
||||
// Check the parameters and reassign if needed
|
||||
if (typeof value == 'function' || typeof value == 'object') {
|
||||
constraint = value
|
||||
value = true
|
||||
}
|
||||
|
||||
var dragHandler = this.remember('_draggable') || new DragHandler(this)
|
||||
|
||||
// When no parameter is given, value is true
|
||||
value = typeof value === 'undefined' ? true : value
|
||||
|
||||
if(value) dragHandler.init(constraint || {}, value)
|
||||
else {
|
||||
this.off('mousedown.drag')
|
||||
this.off('touchstart.drag')
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}).call(this);
|
||||
4
hal-core/resource/web/js/svg.draggable.min.js
vendored
Normal file
4
hal-core/resource/web/js/svg.draggable.min.js
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
/*! svg.draggable.js - v2.2.0 - 2016-05-21
|
||||
* https://github.com/wout/svg.draggable.js
|
||||
* Copyright (c) 2016 Wout Fierens; Licensed MIT */
|
||||
(function(){function a(a){a.remember("_draggable",this),this.el=a}a.prototype.init=function(a,b){var c=this;this.constraint=a,this.value=b,this.el.on("mousedown.drag",function(a){c.start(a)}),this.el.on("touchstart.drag",function(a){c.start(a)})},a.prototype.transformPoint=function(a,b){a=a||window.event;var c=a.changedTouches&&a.changedTouches[0]||a;return this.p.x=c.pageX-(b||0),this.p.y=c.pageY,this.p.matrixTransform(this.m)},a.prototype.getBBox=function(){var a=this.el.bbox();return this.el instanceof SVG.Nested&&(a=this.el.rbox()),(this.el instanceof SVG.G||this.el instanceof SVG.Use||this.el instanceof SVG.Nested)&&(a.x=this.el.x(),a.y=this.el.y()),a},a.prototype.start=function(a){if("click"!=a.type&&"mousedown"!=a.type&&"mousemove"!=a.type||1==(a.which||a.buttons)){var b=this;this.el.fire("beforedrag",{event:a,handler:this}),this.parent=this.parent||this.el.parent(SVG.Nested)||this.el.parent(SVG.Doc),this.p=this.parent.node.createSVGPoint(),this.m=this.el.node.getScreenCTM().inverse();var c,d=this.getBBox();if(this.el instanceof SVG.Text)switch(c=this.el.node.getComputedTextLength(),this.el.attr("text-anchor")){case"middle":c/=2;break;case"start":c=0}this.startPoints={point:this.transformPoint(a,c),box:d},SVG.on(window,"mousemove.drag",function(a){b.drag(a)}),SVG.on(window,"touchmove.drag",function(a){b.drag(a)}),SVG.on(window,"mouseup.drag",function(a){b.end(a)}),SVG.on(window,"touchend.drag",function(a){b.end(a)}),this.el.fire("dragstart",{event:a,p:this.startPoints.point,m:this.m,handler:this}),a.preventDefault(),a.stopPropagation()}},a.prototype.drag=function(a){var b=this.getBBox(),c=this.transformPoint(a),d=this.startPoints.box.x+c.x-this.startPoints.point.x,e=this.startPoints.box.y+c.y-this.startPoints.point.y,f=this.constraint,g=new CustomEvent("dragmove",{detail:{event:a,p:c,m:this.m,handler:this},cancelable:!0});if(this.el.fire(g),g.defaultPrevented)return c;if("function"==typeof f){var h=f.call(this.el,d,e,this.m);"boolean"==typeof h&&(h={x:h,y:h}),h.x===!0?this.el.x(d):h.x!==!1&&this.el.x(h.x),h.y===!0?this.el.y(e):h.y!==!1&&this.el.y(h.y)}else"object"==typeof f&&(null!=f.minX&&d<f.minX?d=f.minX:null!=f.maxX&&d>f.maxX-b.width&&(d=f.maxX-b.width),null!=f.minY&&e<f.minY?e=f.minY:null!=f.maxY&&e>f.maxY-b.height&&(e=f.maxY-b.height),this.el.move(d,e));return c},a.prototype.end=function(a){var b=this.drag(a);this.el.fire("dragend",{event:a,p:b,m:this.m,handler:this}),SVG.off(window,"mousemove.drag"),SVG.off(window,"touchmove.drag"),SVG.off(window,"mouseup.drag"),SVG.off(window,"touchend.drag")},SVG.extend(SVG.Element,{draggable:function(b,c){("function"==typeof b||"object"==typeof b)&&(c=b,b=!0);var d=this.remember("_draggable")||new a(this);return b="undefined"==typeof b?!0:b,b?d.init(c||{},b):(this.off("mousedown.drag"),this.off("touchstart.drag")),this}})}).call(this);
|
||||
5302
hal-core/resource/web/js/svg.js
Normal file
5302
hal-core/resource/web/js/svg.js
Normal file
File diff suppressed because it is too large
Load diff
2
hal-core/resource/web/js/svg.min.js
vendored
Normal file
2
hal-core/resource/web/js/svg.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
26
hal-core/resource/web/js/svg.title.js
Normal file
26
hal-core/resource/web/js/svg.title.js
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Title Plugin
|
||||
// Source: https://github.com/wout/svg.js/issues/147
|
||||
//
|
||||
// // example usage
|
||||
// var draw = SVG('drawing')
|
||||
// var group = draw.group()
|
||||
// group.title('This is a pink square.')
|
||||
// group.rect(100,100).fill('#f06')
|
||||
|
||||
SVG.Title = SVG.invent({
|
||||
create: 'title',
|
||||
inherit: SVG.Element,
|
||||
extend: {
|
||||
text: function(text) {
|
||||
while (this.node.firstChild)
|
||||
this.node.removeChild(this.node.firstChild)
|
||||
this.node.appendChild(document.createTextNode(text))
|
||||
return this
|
||||
}
|
||||
},
|
||||
construct: {
|
||||
title: function(text) {
|
||||
return this.put(new SVG.Title).text(text)
|
||||
}
|
||||
}
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue