[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-3' - loleaflet/dist
Henry Castro
hcastro at collabora.com
Tue Jun 19 15:04:45 UTC 2018
loleaflet/dist/toolbar/w2ui-1.5.rc1.js | 2512 ++++++++++++++++++++++-----------
loleaflet/dist/w2ui-1.5.rc1.css | 194 ++
2 files changed, 1917 insertions(+), 789 deletions(-)
New commits:
commit 1c4fdf7df1afe5514a8ea1b94aa68044f20fba66
Author: Henry Castro <hcastro at collabora.com>
Date: Mon Jun 18 21:06:37 2018 -0400
loleaflet: update w2ui-1.5.rc1
https://github.com/vitmalina/w2ui.git
1de0c6dc7a756561fdb734ae14ba6972805f7b8c build,
Change-Id: If2e2142fe17ea61ccf106008a1fea5d380a3cc81
Reviewed-on: https://gerrit.libreoffice.org/56074
Reviewed-by: Jan Holesovsky <kendy at collabora.com>
Tested-by: Jan Holesovsky <kendy at collabora.com>
diff --git a/loleaflet/dist/toolbar/w2ui-1.5.rc1.js b/loleaflet/dist/toolbar/w2ui-1.5.rc1.js
index 89f54de62..e38fd4fd7 100644
--- a/loleaflet/dist/toolbar/w2ui-1.5.rc1.js
+++ b/loleaflet/dist/toolbar/w2ui-1.5.rc1.js
@@ -1,4 +1,4 @@
-/* w2ui 1.5.rc1 (nightly) (c) http://w2ui.com, vitmalina at gmail.com */
+/* w2ui 1.5.x (nightly) (c) http://w2ui.com, vitmalina at gmail.com */
var w2ui = w2ui || {};
var w2obj = w2obj || {}; // expose object to be able to overwrite default functions
@@ -28,12 +28,18 @@ var w2obj = w2obj || {}; // expose object to be able to overwrite default functi
* - add w2utils.lang wrap for all captions in all buttons.
* - $().w2date(), $().w2dateTime()
*
+* == 1.5 change
+* - parseColor(str) returns rgb
+* - rgb2hsv, hsv2rgb
+* - color.onSelect
+* - refactored w2tag object, it has more potential with $().data('w2tag')
+*
************************************************/
var w2utils = (function ($) {
var tmp = {}; // for some temp variables
var obj = {
- version : '1.5.RC1',
+ version : '1.5.x',
settings : {
"locale" : "en-us",
"dateFormat" : "m/d/yyyy",
@@ -61,6 +67,7 @@ var w2utils = (function ($) {
isHex : isHex,
isAlphaNumeric : isAlphaNumeric,
isEmail : isEmail,
+ isIpAddress : isIpAddress,
isDate : isDate,
isTime : isTime,
isDateTime : isDateTime,
@@ -83,6 +90,7 @@ var w2utils = (function ($) {
lock : lock,
unlock : unlock,
message : message,
+ naturalCompare : naturalCompare,
lang : lang,
locale : locale,
getSize : getSize,
@@ -92,17 +100,22 @@ var w2utils = (function ($) {
checkUniqueId : checkUniqueId,
parseRoute : parseRoute,
cssPrefix : cssPrefix,
+ parseColor : parseColor,
+ hsv2rgb : hsv2rgb,
+ rgb2hsv : rgb2hsv,
getCursorPosition : getCursorPosition,
setCursorPosition : setCursorPosition,
testLocalStorage : testLocalStorage,
hasLocalStorage : testLocalStorage(),
// some internal variables
- isIOS : ((navigator.userAgent.toLowerCase().indexOf('iphone') != -1 ||
- navigator.userAgent.toLowerCase().indexOf('ipod') != -1 ||
- navigator.userAgent.toLowerCase().indexOf('ipad') != -1)
+ isIOS : ((navigator.userAgent.toLowerCase().indexOf('iphone') !== -1 ||
+ navigator.userAgent.toLowerCase().indexOf('ipod') !== -1 ||
+ navigator.userAgent.toLowerCase().indexOf('ipad') !== -1 ||
+ navigator.userAgent.toLowerCase().indexOf('mobile') !== -1 ||
+ navigator.userAgent.toLowerCase().indexOf('android') !== -1)
? true : false),
- isIE : ((navigator.userAgent.toLowerCase().indexOf('msie') != -1 ||
- navigator.userAgent.toLowerCase().indexOf('trident') != -1 )
+ isIE : ((navigator.userAgent.toLowerCase().indexOf('msie') !== -1 ||
+ navigator.userAgent.toLowerCase().indexOf('trident') !== -1 )
? true : false)
};
return obj;
@@ -118,7 +131,7 @@ var w2utils = (function ($) {
}
function isFloat (val) {
- if (typeof val == 'string') val = val.replace(/\s+/g, '').replace(w2utils.settings.groupSymbol, '').replace(w2utils.settings.decimalSymbol, '.');
+ if (typeof val === 'string') val = val.replace(/\s+/g, '').replace(w2utils.settings.groupSymbol, '').replace(w2utils.settings.decimalSymbol, '.');
return (typeof val === 'number' || (typeof val === 'string' && val !== '')) && !isNaN(Number(val));
}
@@ -135,7 +148,7 @@ var w2utils = (function ($) {
}
function isHex (val) {
- var re = /^[a-fA-F0-9]+$/;
+ var re = /^(0x)?[0-9a-fA-F]+$/;
return re.test(val);
}
@@ -145,10 +158,18 @@ var w2utils = (function ($) {
}
function isEmail (val) {
- var email = /^[a-zA-Z0-9._%-+]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
+ var email = /^[a-zA-Z0-9._%\-+]+@[а-яА-Яa-zA-Z0-9.-]+\.[а-яА-Яa-zA-Z]+$/;
return email.test(val);
}
+ function isIpAddress (val) {
+ var re = new RegExp('^' +
+ '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}' +
+ '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' +
+ '$');
+ return re.test(val);
+ }
+
function isDate (val, format, retDate) {
if (!val) return false;
@@ -166,6 +187,14 @@ var w2utils = (function ($) {
year = val.getUTCFullYear();
month = val.getUTCMonth() + 1;
day = val.getUTCDate();
+ } else if (String(new Date(val)) != 'Invalid Date') {
+ val = new Date(val);
+ if (retDate !== true) return true;
+ return val;
+ val = new Date(val);
+ year = val.getUTCFullYear();
+ month = val.getUTCMonth() + 1;
+ day = val.getUTCDate();
} else {
val = String(val);
// convert month formats
@@ -206,7 +235,7 @@ var w2utils = (function ($) {
dt = new Date(year, month - 1, day);
// do checks
if (month == null) return false;
- if (String(dt) == 'Invalid Date') return false;
+ if (String(dt) === 'Invalid Date') return false;
if ((dt.getMonth() + 1 !== month) || (dt.getDate() !== day) || (dt.getFullYear() !== year)) return false;
if (retDate === true) return dt; else return true;
}
@@ -255,10 +284,16 @@ var w2utils = (function ($) {
if (typeof val.getUTCFullYear === 'function') { // date object
if (retDate !== true) return true;
return val;
- } else if (parseInt(val) == val && parseInt(val) > 0) {
+ } else if (parseInt(val) === val && parseInt(val) >= 0) {
val = new Date(parseInt(val));
if (retDate !== true) return true;
return val;
+ } else if (parseInt(val) === val && parseInt(val) < 0) {
+ return false;
+ } else if (String(new Date(val)) != 'Invalid Date') {
+ val = new Date(val);
+ if (retDate !== true) return true;
+ return val;
} else {
var tmp = String(val).indexOf(' ');
var values = [val.substr(0, tmp), val.substr(tmp).trim()];
@@ -289,7 +324,7 @@ var w2utils = (function ($) {
} else {
d1 = new Date(dateStr);
}
- if (String(d1) == 'Invalid Date') return '';
+ if (String(d1) === 'Invalid Date') return '';
var d2 = new Date();
var sec = (d2.getTime() - d1.getTime()) / 1000;
@@ -346,10 +381,10 @@ var w2utils = (function ($) {
}
function date (dateStr) {
- if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return '';
+ if (dateStr === '' || dateStr == null || (typeof dateStr === 'object' && !dateStr.getMonth)) return '';
var d1 = new Date(dateStr);
if (w2utils.isInt(dateStr)) d1 = new Date(Number(dateStr)); // for unix timestamps
- if (String(d1) == 'Invalid Date') return '';
+ if (String(d1) === 'Invalid Date') return '';
var months = w2utils.settings.shortmonths;
var d2 = new Date(); // today
@@ -379,7 +414,7 @@ var w2utils = (function ($) {
}
function formatNumber (val, fraction, useGrouping) {
- if (val == null || val === '' || typeof val == 'object') return '';
+ if (val == null || val === '' || typeof val === 'object') return '';
var options = {
minimumFractionDigits : fraction,
maximumFractionDigits : fraction,
@@ -394,11 +429,11 @@ var w2utils = (function ($) {
function formatDate (dateStr, format) { // IMPORTANT dateStr HAS TO BE valid JavaScript Date String
if (!format) format = this.settings.dateFormat;
- if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return '';
+ if (dateStr === '' || dateStr == null || (typeof dateStr === 'object' && !dateStr.getMonth)) return '';
var dt = new Date(dateStr);
if (w2utils.isInt(dateStr)) dt = new Date(Number(dateStr)); // for unix timestamps
- if (String(dt) == 'Invalid Date') return '';
+ if (String(dt) === 'Invalid Date') return '';
var year = dt.getFullYear();
var month = dt.getMonth();
@@ -423,7 +458,7 @@ var w2utils = (function ($) {
var months = w2utils.settings.shortmonths;
var fullMonths = w2utils.settings.fullmonths;
if (!format) format = this.settings.timeFormat;
- if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return '';
+ if (dateStr === '' || dateStr == null || (typeof dateStr === 'object' && !dateStr.getMonth)) return '';
var dt = new Date(dateStr);
if (w2utils.isInt(dateStr)) dt = new Date(Number(dateStr)); // for unix timestamps
@@ -433,7 +468,7 @@ var w2utils = (function ($) {
dt.setHours(tmp.hours);
dt.setMinutes(tmp.minutes);
}
- if (String(dt) == 'Invalid Date') return '';
+ if (String(dt) === 'Invalid Date') return '';
var type = 'am';
var hour = dt.getHours();
@@ -445,6 +480,7 @@ var w2utils = (function ($) {
if (format.indexOf('am') !== -1 || format.indexOf('pm') !== -1) {
if (hour >= 12) type = 'pm';
if (hour > 12) hour = hour - 12;
+ if (hour === 0) hour = 12;
}
return format.toLowerCase()
.replace('am', type)
@@ -463,17 +499,17 @@ var w2utils = (function ($) {
function formatDateTime(dateStr, format) {
var fmt;
- if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return '';
+ if (dateStr === '' || dateStr == null || (typeof dateStr === 'object' && !dateStr.getMonth)) return '';
if (typeof format !== 'string') {
fmt = [this.settings.dateFormat, this.settings.timeFormat];
} else {
fmt = format.split('|');
fmt[0] = fmt[0].trim();
- fmt[1] = fmt[1].trim();
+ fmt[1] = (fmt.length > 1 ? fmt[1].trim() : this.settings.timeFormat);
}
// older formats support
- if (fmt[1] == 'h12') fmt[1] = 'h:m pm';
- if (fmt[1] == 'h24') fmt[1] = 'h24:m';
+ if (fmt[1] === 'h12') fmt[1] = 'h:m pm';
+ if (fmt[1] === 'h24') fmt[1] = 'h24:m';
return this.formatDate(dateStr, fmt[0]) + ' ' + this.formatTime(dateStr, fmt[1]);
}
@@ -1227,7 +1263,7 @@ var w2utils = (function ($) {
if (!options.msg) mess.css({ 'background-color': 'transparent', 'border': '0px' });
if (options.spinner === true) options.msg = '<div class="w2ui-spinner" '+ (!options.msg ? 'style="width: 35px; height: 35px"' : '') +'></div>' + options.msg;
if (options.opacity != null) $lock.css('opacity', options.opacity);
- if (typeof $lock.fadeIn == 'function') {
+ if (typeof $lock.fadeIn === 'function') {
$lock.fadeIn(200);
mess.html(options.msg).fadeIn(200);
} else {
@@ -1308,14 +1344,14 @@ var w2utils = (function ($) {
'transition': '0.15s',
'transform': 'translateY(-' + options.height + 'px)'
})).addClass('w2ui-closing');
- if (msgCount == 1) {
+ if (msgCount === 1) {
if (this.unlock) {
if (where.param) this.unlock(where.param, 150); else this.unlock(150);
}
} else {
$(where.box).find('#w2ui-message'+ (msgCount-2)).css('z-index', 1500);
}
- closeTimer = setTimeout(function () { closeCB($msg, options) }, 150);
+ closeTimer = setTimeout(function () { closeCB($msg, options); }, 150);
} else {
@@ -1346,9 +1382,9 @@ var w2utils = (function ($) {
.data('prev_focus', $(':focus'));
var display = $(where.box).find('#w2ui-message'+ msgCount).css('display');
$(where.box).find('#w2ui-message'+ msgCount).css(w2utils.cssPrefix({
- 'transform': (display == 'none' ? 'translateY(-' + options.height + 'px)' : 'translateY(0px)')
+ 'transform': (display === 'none' ? 'translateY(-' + options.height + 'px)' : 'translateY(0px)')
}));
- if (display == 'none') {
+ if (display === 'none') {
$(where.box).find('#w2ui-message'+ msgCount).show().html(options.html);
options.box = $(where.box).find('#w2ui-message'+ msgCount);
// before event
@@ -1361,7 +1397,7 @@ var w2utils = (function ($) {
// timer needs to animation
setTimeout(function () {
$(where.box).find('#w2ui-message'+ msgCount).css(w2utils.cssPrefix({
- 'transform': (display == 'none' ? 'translateY(0px)' : 'translateY(-' + options.height + 'px)')
+ 'transform': (display === 'none' ? 'translateY(0px)' : 'translateY(-' + options.height + 'px)')
}));
}, 1);
// timer for lock
@@ -1448,11 +1484,11 @@ var w2utils = (function ($) {
if (translation == null) return phrase; else return translation;
}
- function locale (locale) {
+ function locale (locale, callBack) {
if (!locale) locale = 'en-us';
// if the locale is an object, not a string, than we assume it's a
- if(typeof locale !== "string" ) {
+ if (typeof locale !== "string" ) {
w2utils.settings = $.extend(true, w2utils.settings, locale);
return;
}
@@ -1467,9 +1503,9 @@ var w2utils = (function ($) {
url : locale,
type : "GET",
dataType : "JSON",
- async : false,
success : function (data, status, xhr) {
w2utils.settings = $.extend(true, w2utils.settings, data);
+ if (typeof callBack === 'function') callBack();
},
error : function (xhr, status, msg) {
console.log('ERROR: Cannot load locale '+ locale);
@@ -1569,7 +1605,7 @@ var w2utils = (function ($) {
var doc = input.ownerDocument || input.document;
var win = doc.defaultView || doc.parentWindow;
var sel;
- if (input.tagName && input.tagName.toUpperCase() == 'INPUT' && input.selectionStart) {
+ if (input.tagName && input.tagName.toUpperCase() === 'INPUT' && input.selectionStart) {
// standards browser
caretOffset = input.selectionStart;
} else {
@@ -1582,7 +1618,7 @@ var w2utils = (function ($) {
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
}
- } else if ( (sel = doc.selection) && sel.type != "Control") {
+ } else if ( (sel = doc.selection) && sel.type !== "Control") {
var textRange = sel.createRange();
var preCaretTextRange = doc.body.createTextRange();
preCaretTextRange.moveToElementText(input);
@@ -1641,6 +1677,149 @@ var w2utils = (function ($) {
}
}
+ function parseColor(str) {
+ if (typeof str !== 'string') return null; else str = str.trim().toUpperCase();
+ if (str[0] === '#') str = str.substr(1);
+ var color = {};
+ if (str.length === 3) {
+ color = {
+ r: parseInt(str[0] + str[0], 16),
+ g: parseInt(str[1] + str[1], 16),
+ b: parseInt(str[2] + str[2], 16),
+ a: 1
+ };
+ } else if (str.length === 6) {
+ color = {
+ r: parseInt(str.substr(0, 2), 16),
+ g: parseInt(str.substr(2, 2), 16),
+ b: parseInt(str.substr(4, 2), 16),
+ a: 1
+ };
+ } else if (str.length > 4 && str.substr(0, 4) === 'RGB(') {
+ var tmp = str.replace('RGB', '').replace(/\(/g, '').replace(/\)/g, '').split(',');
+ color = {
+ r: parseInt(tmp[0], 10),
+ g: parseInt(tmp[1], 10),
+ b: parseInt(tmp[2], 10),
+ a: 1
+ };
+ } else if (str.length > 5 && str.substr(0, 5) === 'RGBA(') {
+ var tmp = str.replace('RGBA', '').replace(/\(/g, '').replace(/\)/g, '').split(',');
+ color = {
+ r: parseInt(tmp[0], 10),
+ g: parseInt(tmp[1], 10),
+ b: parseInt(tmp[2], 10),
+ a: parseFloat(tmp[3])
+ };
+ } else {
+ // word color
+ return null;
+ }
+ return color;
+ }
+
+ // h=0..360, s=0..100, v=0..100
+ function hsv2rgb(h, s, v, a) {
+ var r, g, b, i, f, p, q, t;
+ if (arguments.length === 1) {
+ s = h.s; v = h.v; a = h.a; h = h.h;
+ }
+ h = h / 360;
+ s = s / 100;
+ v = v / 100;
+ i = Math.floor(h * 6);
+ f = h * 6 - i;
+ p = v * (1 - s);
+ q = v * (1 - f * s);
+ t = v * (1 - (1 - f) * s);
+ switch (i % 6) {
+ case 0: r = v, g = t, b = p; break;
+ case 1: r = q, g = v, b = p; break;
+ case 2: r = p, g = v, b = t; break;
+ case 3: r = p, g = q, b = v; break;
+ case 4: r = t, g = p, b = v; break;
+ case 5: r = v, g = p, b = q; break;
+ }
+ return {
+ r: Math.round(r * 255),
+ g: Math.round(g * 255),
+ b: Math.round(b * 255),
+ a: (a != null ? a : 1)
+ };
+ }
+
+ // r=0..255, g=0..255, b=0..255
+ function rgb2hsv(r, g, b, a) {
+ if (arguments.length === 1) {
+ g = r.g; b = r.b; a = r.a; r = r.r;
+ }
+ var max = Math.max(r, g, b), min = Math.min(r, g, b),
+ d = max - min,
+ h,
+ s = (max === 0 ? 0 : d / max),
+ v = max / 255;
+ switch (max) {
+ case min: h = 0; break;
+ case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;
+ case g: h = (b - r) + d * 2; h /= 6 * d; break;
+ case b: h = (r - g) + d * 4; h /= 6 * d; break;
+ }
+ return {
+ h: Math.round(h * 360),
+ s: Math.round(s * 100),
+ v: Math.round(v * 100),
+ a: (a != null ? a : 1)
+ }
+ }
+
+ /*! from litejs.com / MIT Licence
+ https://github.com/litejs/natural-compare-lite/blob/master/index.js */
+ /*
+ * @version 1.4.0
+ * @date 2015-10-26
+ * @stability 3 - Stable
+ * @author Lauri Rooden (https://github.com/litejs/natural-compare-lite)
+ * @license MIT License
+ */
+ function naturalCompare(a, b) {
+ var i, codeA
+ , codeB = 1
+ , posA = 0
+ , posB = 0
+ , alphabet = String.alphabet;
+
+ function getCode(str, pos, code) {
+ if (code) {
+ for (i = pos; code = getCode(str, i), code < 76 && code > 65;) ++i;
+ return +str.slice(pos - 1, i);
+ }
+ code = alphabet && alphabet.indexOf(str.charAt(pos));
+ return code > -1 ? code + 76 : ((code = str.charCodeAt(pos) || 0), code < 45 || code > 127) ? code
+ : code < 46 ? 65 // -
+ : code < 48 ? code - 1
+ : code < 58 ? code + 18 // 0-9
+ : code < 65 ? code - 11
+ : code < 91 ? code + 11 // A-Z
+ : code < 97 ? code - 37
+ : code < 123 ? code + 5 // a-z
+ : code - 63;
+ }
+
+
+ if ((a+="") != (b+="")) for (;codeB;) {
+ codeA = getCode(a, posA++);
+ codeB = getCode(b, posB++);
+
+ if (codeA < 76 && codeB < 76 && codeA > 66 && codeB > 66) {
+ codeA = getCode(a, posA, posA);
+ codeB = getCode(b, posB, posA = i);
+ posB = i;
+ }
+
+ if (codeA != codeB) return (codeA < codeB) ? -1 : 1;
+ }
+ return 0;
+ }
})(jQuery);
/***********************************************************
@@ -1766,15 +1945,15 @@ w2utils.event = {
var $ = jQuery;
var scope;
// allow 'eventName.scope' syntax
- if (typeof edata == 'string' && edata.indexOf('.') != -1) {
+ if (typeof edata === 'string' && edata.indexOf('.') !== -1) {
var tmp = edata.split('.');
edata = tmp[0];
scope = tmp[1];
}
// allow 'eventName:after' syntax
- if (typeof edata == 'string' && edata.indexOf(':') != -1) {
+ if (typeof edata === 'string' && edata.indexOf(':') !== -1) {
var tmp = edata.split(':');
- if (['complete', 'done'].indexOf(edata[1]) != -1) edata[1] = 'after';
+ if (['complete', 'done'].indexOf(edata[1]) !== -1) edata[1] = 'after';
edata = {
type : tmp[0],
execute : tmp[1]
@@ -1786,7 +1965,6 @@ w2utils.event = {
if (!edata.type) { console.log('ERROR: You must specify event type when calling .on() method of '+ this.name); return; }
if (!handler) { console.log('ERROR: You must specify event handler function when calling .on() method of '+ this.name); return; }
if (!$.isArray(this.handlers)) this.handlers = [];
- console.log('add', edata);
this.handlers.push({ edata: edata, handler: handler });
},
@@ -1794,19 +1972,19 @@ w2utils.event = {
var $ = jQuery;
var scope;
// allow 'eventName.scope' syntax
- if (typeof edata == 'string' && edata.indexOf('.') != -1) {
+ if (typeof edata === 'string' && edata.indexOf('.') !== -1) {
var tmp = edata.split('.');
edata = tmp[0];
scope = tmp[1];
}
// allow 'eventName:after' syntax
- if (typeof edata == 'string' && edata.indexOf(':') != -1) {
+ if (typeof edata === 'string' && edata.indexOf(':') !== -1) {
var tmp = edata.split(':');
- if (['complete', 'done'].indexOf(edata[1]) != -1) edata[1] = 'after';
+ if (['complete', 'done'].indexOf(edata[1]) !== -1) edata[1] = 'after';
edata = {
type : tmp[0],
execute : tmp[1]
- }
+ };
}
if (!$.isPlainObject(edata)) edata = { type: edata };
edata = $.extend({}, { type: null, execute: 'before', target: null, onComplete: null }, edata);
@@ -1820,7 +1998,7 @@ w2utils.event = {
if ((t.edata.type === edata.type || edata.type === '*' || (t.edata.scope != null && edata.type == '')) &&
(t.edata.target === edata.target || edata.target == null) &&
(t.edata.execute === edata.execute || edata.execute == null) &&
- (t.handler === handler || handler == null || (scope != null && t.edata.scope == scope)))
+ ((t.handler === handler && handler != null) || (scope != null && t.edata.scope == scope)))
{
// match
} else {
@@ -1898,7 +2076,7 @@ w2utils.event = {
if (edata.phase === 'after') {
if (typeof edata.onComplete === 'function') edata.onComplete.call(this, edata);
for (var i = 0; i < edata.doneHandlers.length; i++) {
- if (typeof edata.doneHandlers[i] == 'function') {
+ if (typeof edata.doneHandlers[i] === 'function') {
edata.doneHandlers[i].call(this, edata);
}
}
@@ -1951,7 +2129,7 @@ w2utils.event = {
}
function clearMarkedText(index, el) {
- while (el.innerHTML.indexOf('<span class="w2ui-marker">') != -1) {
+ while (el.innerHTML.indexOf('<span class="w2ui-marker">') !== -1) {
el.innerHTML = el.innerHTML.replace(/\<span class=\"w2ui\-marker\"\>((.|\n|\r)*)\<\/span\>/ig, '$1'); // unmark
}
}
@@ -1961,7 +2139,7 @@ w2utils.event = {
$.fn.w2tag = function (text, options) {
// only one argument
- if (arguments.length == 1 && typeof text == 'object') {
+ if (arguments.length === 1 && typeof text === 'object') {
options = text;
if (options.html != null) text = options.html;
}
@@ -1981,7 +2159,8 @@ w2utils.event = {
onHide : null, // callBack when hidden
hideOnKeyPress : true, // hide tag if key pressed
hideOnBlur : false, // hide tag on blur
- hideOnClick : false // hide tag on document click
+ hideOnClick : false, // hide tag on document click
+ hideOnChange : true
}, options);
if (options.name != null && options.id == null) options.id = options.name;
@@ -1991,162 +2170,196 @@ w2utils.event = {
// remove all tags
if ($(this).length === 0) {
$('.w2ui-tag').each(function (index, el) {
- var opt = $(el).data('options');
- if (opt == null) opt = {};
- $($(el).data('taged-el'))
- .removeClass(opt.inputClass)
- .removeData('w2tag')
- .removeData('checkIfMoved');
- clearInterval($(el).data('timer'));
- $(el).remove();
+ var tag = $(el).data('w2tag');
+ if (tag) tag.hide();
});
return;
}
return $(this).each(function (index, el) {
- // show or hide tag
+ // main object
+ var tag;
var origID = (options.id ? options.id : el.id);
- var tagID = w2utils.escapeId(origID);
- var $tags = $('#w2ui-tag-'+tagID);
+ if (origID == '') { // search for an id
+ origID = $(el).find('input').attr('id');
+ }
+ if (!origID) {
+ origID = 'noid';
+ }
+ var tmpID = w2utils.escapeId(origID);
+ if ($(this).data('w2tag') != null) {
+ tag = $(this).data('w2tag');
+ $.extend(tag.options, options);
+ } else {
+ tag = {
+ id : origID,
+ attachedTo: el, // element attached to
+ box : $('#w2ui-tag-' + tmpID), // tag itself
+ options : $.extend({}, options),
+ // methods
+ init : init, // attach events
+ hide : hide, // hide tag
+ getPos : getPos, // gets position of tag
+ isMoved : isMoved, // if called, will adjust position
+ // internal
+ tmp : {} // for temp variables
+ };
+ }
+ // show or hide tag
if (text === '' || text == null) {
- // remmove element
- $tags.css('opacity', 0);
- clearInterval($tags.data('timer'));
- $tags.remove();
- return;
- } else if ($tags.length !== 0) {
+ tag.hide();
+ } else if (tag.box.length !== 0) {
// if already present
- options = $.extend($tags.data('options'), options);
- $tags.data('options', options);
- $tags.find('.w2ui-tag-body')
- .attr('style', options.style)
- .addClass(options.className)
- .html(options.html);
- checkIfMoved(true);
+ tag.box.find('.w2ui-tag-body')
+ .css(tag.options.css)
+ .attr('style', tag.options.style)
+ .addClass(tag.options.className)
+ .html(tag.options.html);
} else {
- var originalCSS = '';
- if ($(el).length > 0) originalCSS = $(el)[0].style.cssText;
+ tag.tmp.originalCSS = '';
+ if ($(tag.attachedTo).length > 0) tag.tmp.originalCSS = $(tag.attachedTo)[0].style.cssText;
// insert
$('body').append(
- '<div onclick="event.stopPropagation()" style="display:none;" id="w2ui-tag-'+ origID +'" '+
- ' class="w2ui-tag '+ ($(el).parents('.w2ui-popup, .w2ui-overlay-popup, .w2ui-message').length > 0 ? 'w2ui-tag-popup' : '') + '">'+
+ '<div onclick="event.stopPropagation()" style="display: none;" id="w2ui-tag-'+ tag.id +'" '+
+ ' class="w2ui-tag '+ ($(tag.attachedTo).parents('.w2ui-popup, .w2ui-overlay-popup, .w2ui-message').length > 0 ? 'w2ui-tag-popup' : '') + '">'+
' <div style="margin: -2px 0px 0px -2px; white-space: nowrap;">'+
- ' <div class="w2ui-tag-body '+ options.className +'" style="'+ (options.style || '') +'">'+ text +'</div>'+
+ ' <div class="w2ui-tag-body '+ tag.options.className +'" style="'+ (tag.options.style || '') +'">'+ text +'</div>'+
' </div>' +
'</div>');
- $tags = $('#w2ui-tag-'+tagID);
- $(el).data('w2tag', $tags.get(0)).data('checkIfMoved', checkIfMoved);
+ tag.box = $('#w2ui-tag-' + tmpID);
+ $(tag.attachedTo).data('w2tag', tag); // make available to element tag attached to
+ setTimeout(init, 1);
}
+ return;
- // need time out to allow tag to be rendered
- setTimeout(function () {
- $tags.css('display', 'block');
- if (!$(el).offset()) return;
- var pos = checkIfMoved(true);
- if (pos == null) return;
- $tags.css({
+ function init() {
+ tag.box.css('display', 'block');
+ if (!tag || !tag.box || !$(tag.attachedTo).offset()) return;
+ var pos = tag.getPos();
+ tag.box.css({
opacity : '1',
left : pos.left + 'px',
top : pos.top + 'px'
})
- .data('options', options)
- .data('taged-el', el)
- .data('position', pos.left + 'x' + pos.top)
- .data('timer', setTimeout(checkIfMoved, 100))
+ .data('w2tag', tag)
.find('.w2ui-tag-body').addClass(pos['posClass']);
+ tag.tmp.pos = pos.left + 'x' + pos.top;
- $(el).css(options.css)
+ $(tag.attachedTo)
.off('.w2tag')
- .addClass(options.inputClass);
+ .css(tag.options.css)
+ .addClass(tag.options.inputClass);
- if (options.hideOnKeyPress) {
- $(el).on('keypress.w2tag', hideTag);
+ if (tag.options.hideOnKeyPress) {
+ $(tag.attachedTo).on('keypress.w2tag', tag.hide);
+ }
+ if (options.hideOnChange) {
+ if (el.nodeName === 'INPUT') {
+ $(el).on('change.w2tag', tag.hide);
+ } else {
+ $(el).find('input').on('change.w2tag', tag.hide);
+ }
}
- if (options.hideOnBlur) {
- $(el).on('blur.w2tag', hideTag);
+ if (tag.options.hideOnBlur) {
+ $(tag.attachedTo).on('blur.w2tag', tag.hide);
}
- if (options.hideOnClick) {
- $(document).on('click.w2tag', hideTag)
+ if (tag.options.hideOnClick) {
+ $(document).on('click.w2tag', tag.hide);
}
- if (typeof options.onShow === 'function') options.onShow();
- }, 1);
+ if (typeof tag.options.onShow === 'function') {
+ tag.options.onShow();
+ }
+ isMoved();
+ }
// bind event to hide it
- function hideTag() {
- $tags = $('#w2ui-tag-'+tagID);
- if ($tags.length <= 0) return;
- clearInterval($tags.data('timer'));
- $tags.remove();
- $(document).off('.w2tag');
- $(el).off('.w2tag', hideTag)
- .removeClass(options.inputClass)
- .removeData('w2tag')
- .removeData('checkIfMoved');
- if ($(el).length > 0) $(el)[0].style.cssText = originalCSS;
- if (typeof options.onHide === 'function') options.onHide();
- }
-
- function checkIfMoved(checkOnly, instant) {
+ function hide() {
+ if (tag.box.length <= 0) return;
+ if (tag.tmp.timer) clearTimeout(tag.tmp.timer);
+ tag.box.remove();
+ if (tag.options.hideOnClick) {
+ $(document).off('.w2tag');
+ }
+ $(tag.attachedTo).off('.w2tag')
+ .removeClass(tag.options.inputClass)
+ .removeData('w2tag');
+ // restore original CSS
+ if ($(tag.attachedTo).length > 0) {
+ $(tag.attachedTo)[0].style.cssText = tag.tmp.originalCSS;
+ }
+ if (typeof tag.options.onHide === 'function') {
+ tag.options.onHide();
+ }
+ }
+
+ function isMoved(instant) {
// monitor if destroyed
- var offset = $(el).offset();
- if ($(el).length === 0 || (offset.left === 0 && offset.top === 0) || $tags.find('.w2ui-tag-body').length === 0) {
- clearInterval($tags.data('timer'));
- hideTag();
+ var offset = $(tag.attachedTo).offset();
+ if ($(tag.attachedTo).length === 0 || (offset.left === 0 && offset.top === 0) || tag.box.find('.w2ui-tag-body').length === 0) {
+ tag.hide();
return;
}
- if (!instant) setTimeout(checkIfMoved, 100);
- // monitor if moved
+ var pos = getPos();
+ if (tag.tmp.pos !== pos.left + 'x' + pos.top) {
+ tag.box
+ .css(w2utils.cssPrefix({ 'transition': (instant ? '0s' : '.2s') }))
+ .css({
+ left: pos.left + 'px',
+ top : pos.top + 'px'
+ });
+ tag.tmp.pos = pos.left + 'x' + pos.top;
+ }
+ if (tag.tmp.timer) clearTimeout(tag.tmp.timer);
+ tag.tmp.timer = setTimeout(isMoved, 100);
+ }
+
+ function getPos() {
+ var offset = $(tag.attachedTo).offset();
var posClass = 'w2ui-tag-right';
- var posLeft = parseInt(offset.left + el.offsetWidth + (options.left ? options.left : 0));
- var posTop = parseInt(offset.top + (options.top ? options.top : 0));
- var tagBody = $tags.find('.w2ui-tag-body');
+ var posLeft = parseInt(offset.left + tag.attachedTo.offsetWidth + (tag.options.left ? tag.options.left : 0));
+ var posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0));
+ var tagBody = tag.box.find('.w2ui-tag-body');
var width = tagBody[0].offsetWidth;
var height = tagBody[0].offsetHeight;
- if (typeof options.position == 'string' && options.position.indexOf('|') != -1) {
- options.position = options.position.split('|');
+ if (typeof tag.options.position === 'string' && tag.options.position.indexOf('|') !== -1) {
+ tag.options.position = tag.options.position.split('|');
}
- if (options.position == 'top') {
+ if (tag.options.position === 'top') {
posClass = 'w2ui-tag-top';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14;
- posTop = parseInt(offset.top + (options.top ? options.top : 0)) - height - 10;
- }
- else if (options.position == 'bottom') {
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - 14;
+ posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0)) - height - 10;
+ } else if (tag.options.position === 'bottom') {
posClass = 'w2ui-tag-bottom';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14;
- posTop = parseInt(offset.top + el.offsetHeight + (options.top ? options.top : 0)) + 10;
- }
- else if (options.position == 'left') {
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - 14;
+ posTop = parseInt(offset.top + tag.attachedTo.offsetHeight + (tag.options.top ? tag.options.top : 0)) + 10;
+ } else if (tag.options.position === 'left') {
posClass = 'w2ui-tag-left';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - width - 20;
- posTop = parseInt(offset.top + (options.top ? options.top : 0));
- }
- else if (Array.isArray(options.position)) {
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - width - 20;
+ posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0));
+ } else if (Array.isArray(tag.options.position)) {
// try to fit the tag on screen in the order defined in the array
var maxWidth = window.innerWidth;
- var maxHeight = window.innerHeight
- for (var i=0; i<options.position.length; i++) {
- var pos = options.position[i];
- if (pos == 'right') {
+ var maxHeight = window.innerHeight;
+ for (var i = 0; i < tag.options.position.length; i++) {
+ var pos = tag.options.position[i];
+ if (pos === 'right') {
posClass = 'w2ui-tag-right';
- posLeft = parseInt(offset.left + el.offsetWidth + (options.left ? options.left : 0));
- posTop = parseInt(offset.top + (options.top ? options.top : 0));
+ posLeft = parseInt(offset.left + tag.attachedTo.offsetWidth + (tag.options.left ? tag.options.left : 0));
+ posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0));
if (posLeft+width <= maxWidth) break;
- }
- else if (pos == 'left') {
+ } else if (pos === 'left') {
posClass = 'w2ui-tag-left';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - width - 20;
- posTop = parseInt(offset.top + (options.top ? options.top : 0));
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - width - 20;
+ posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0));
if (posLeft >= 0) break;
- }
- else if (pos == 'top') {
+ } else if (pos === 'top') {
posClass = 'w2ui-tag-top';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14;
- posTop = parseInt(offset.top + (options.top ? options.top : 0)) - height - 10;
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - 14;
+ posTop = parseInt(offset.top + (tag.options.top ? tag.options.top : 0)) - height - 10;
if(posLeft+width <= maxWidth && posTop >= 0) break;
- }
- else if (pos == 'bottom') {
+ } else if (pos === 'bottom') {
posClass = 'w2ui-tag-bottom';
- posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14;
- posTop = parseInt(offset.top + el.offsetHeight + (options.top ? options.top : 0)) + 10;
+ posLeft = parseInt(offset.left + (tag.options.left ? tag.options.left : 0)) - 14;
+ posTop = parseInt(offset.top + tag.attachedTo.offsetHeight + (tag.options.top ? tag.options.top : 0)) + 10;
if (posLeft+width <= maxWidth && posTop+height <= maxHeight) break;
}
}
@@ -2156,12 +2369,6 @@ w2utils.event = {
.data('posClass', posClass);
}
}
- if ($tags.data('position') !== posLeft + 'x' + posTop && checkOnly !== true) {
- $tags.css(w2utils.cssPrefix({ 'transition': (instant ? '0s' : '.2s') })).css({
- left: posLeft + 'px',
- top : posTop + 'px'
- }).data('position', posLeft + 'x' + posTop);
- }
return { left: posLeft, top: posTop, posClass: posClass };
}
});
@@ -2197,14 +2404,14 @@ w2utils.event = {
openAbove : false, // show above control
tmp : {}
};
- if (arguments.length == 1) {
- if (typeof html == 'object') {
+ if (arguments.length === 1) {
+ if (typeof html === 'object') {
options = html;
} else {
options = { html: html };
}
}
- if (arguments.length == 2) options.html = html;
+ if (arguments.length === 2) options.html = html;
if (!$.isPlainObject(options)) options = {};
options = $.extend({}, defaults, options);
if (options.name) name = '-' + options.name;
@@ -2222,10 +2429,10 @@ w2utils.event = {
// hide previous if any
if ($('#w2ui-overlay'+ name).length > 0) {
tmp_hide = $('#w2ui-overlay'+ name)[0].hide;
- $(document).off('.w2overlayHide');
+ $(document).off('.w2overlay'+ name);
if (typeof tmp_hide === 'function') tmp_hide();
}
- if (obj.length > 0 && (obj[0].tagName == null || obj[0].tagName.toUpperCase() == 'BODY')) options.contextMenu = true;
+ if (obj.length > 0 && (obj[0].tagName == null || obj[0].tagName.toUpperCase() === 'BODY')) options.contextMenu = true;
if (options.contextMenu && options.originalEvent) {
options.pageX = options.originalEvent.pageX;
options.pageY = options.originalEvent.pageY;
@@ -2255,12 +2462,13 @@ w2utils.event = {
.data('position', offset.left + 'x' + offset.top)
.fadeIn('fast')
.on('click', function (event) {
+ $('#w2ui-overlay'+ name).data('keepOpen', true);
// if there is label for input, it will produce 2 click events
- if (event.target.tagName.toUpperCase() == 'LABEL') event.stopPropagation();
+ if (event.target.tagName.toUpperCase() === 'LABEL') event.stopPropagation();
})
.on('mousedown', function (event) {
- $('#w2ui-overlay'+ name).data('keepOpen', true);
- if (['INPUT', 'TEXTAREA', 'SELECT'].indexOf(event.target.tagName.toUpperCase()) == -1 && !options.selectable) {
+ var tmp = event.target.tagName.toUpperCase();
+ if (['INPUT', 'TEXTAREA', 'SELECT'].indexOf(tmp) === -1 && !options.selectable) {
event.preventDefault();
}
});
@@ -2269,9 +2477,9 @@ w2utils.event = {
// need time to display
setTimeout(function () {
- resize();
- $(document).off('.w2overlayHide').on('click.w2overlayHide', hide);
+ $(document).off('.w2overlay'+ name).on('click.w2overlay'+ name, hide);
if (typeof options.onShow === 'function') options.onShow();
+ resize();
}, 10);
monitor();
@@ -2295,6 +2503,8 @@ w2utils.event = {
function hide(event) {
if (event && event.button !== 0) return; // only for left click button
var div1 = $('#w2ui-overlay'+ name);
+ // Allow clicking inside other overlays which belong to the elements inside this overlay
+ if (event && $($(event.target).closest('.w2ui-overlay').data('element')).closest('.w2ui-overlay')[0] === div1[0]) return;
if (div1.data('keepOpen') === true) {
div1.removeData('keepOpen');
return;
@@ -2303,11 +2513,11 @@ w2utils.event = {
if (typeof options.onHide === 'function') result = options.onHide();
if (result === false) return;
div1.remove();
- $(document).off('click', hide);
+ $(document).off('.w2overlay'+ name);
clearInterval(div1.data('timer'));
}
- function resize () {
+ function resize() {
var div1 = $('#w2ui-overlay'+ name);
var div2 = div1.find(' > div');
var menu = $('#w2ui-overlay'+ name +' div.menu');
@@ -2334,10 +2544,10 @@ w2utils.event = {
}, 1);
setTimeout(function () {
var $div = div2.find('div.menu');
- if ($div.css('overflow-y') != 'auto') $div.css('overflow-y', 'auto');
+ if ($div.css('overflow-y') !== 'auto') $div.css('overflow-y', 'auto');
}, 10);
}
- if (options.tmp.contentWidth && options.align != 'both') {
+ if (options.tmp.contentWidth && options.align !== 'both') {
w = parseInt(options.tmp.contentWidth);
div2.width(w);
setTimeout(function () {
@@ -2370,7 +2580,7 @@ w2utils.event = {
}
if (w === 30 && !boxWidth) boxWidth = 30; else boxWidth = (options.width ? options.width : 'auto');
var tmp = (w - 17) / 2;
- if (boxWidth != 'auto') tmp = (boxWidth - 17) / 2;
+ if (boxWidth !== 'auto') tmp = (boxWidth - 17) / 2;
if (tmp < 25) {
boxLeft = 25 - tmp;
tipLeft = Math.floor(tmp);
@@ -2453,7 +2663,7 @@ w2utils.event = {
);
}
// check scroll bar (needed to avoid horizontal scrollbar)
- if (overflowY && options.align != 'both') div2.width(w + w2utils.scrollBarSize() + 2);
+ if (overflowY && options.align !== 'both') div2.width(w + w2utils.scrollBarSize() + 2);
}
menu.css('overflow-y', 'auto');
}
@@ -2477,7 +2687,7 @@ w2utils.event = {
}
*/
// if items is a function
- if (options && typeof options.items == 'function') {
+ if (options && typeof options.items === 'function') {
options.items = options.items();
}
var defaults = {
@@ -2529,44 +2739,52 @@ w2utils.event = {
// since only one overlay can exist at a time
$.fn.w2menuClick = function (event, index) {
var keepOpen = false;
- if (['radio', 'check'].indexOf(options.type) != -1) {
+ if (['radio', 'check'].indexOf(options.type) !== -1) {
if (event.shiftKey || event.metaKey || event.ctrlKey) keepOpen = true;
}
if (typeof options.onSelect === 'function') {
- // need time so that menu first hides
- setTimeout(function () {
- options.onSelect({
- index: index,
- item: options.items[index],
- keepOpen: keepOpen,
- originalEvent: event
- });
- }, 10);
+ options.onSelect({
+ index : index,
+ item : options.items[index],
+ keepOpen: keepOpen,
+ originalEvent: event
+ });
}
// do not uncomment (or enum search type is not working in grid)
// setTimeout(function () { $(document).click(); }, 50);
// -- hide
var div = $('#w2ui-overlay'+ name);
div.removeData('keepOpen');
- if (typeof div[0].hide === 'function' && !keepOpen) {
+ if (div.length > 0 && typeof div[0].hide === 'function' && !keepOpen) {
div[0].hide();
}
};
$.fn.w2menuDown = function (event, index) {
var $el = $(event.target).parents('tr');
var tmp = $el.find('.w2ui-icon');
- if ((options.type == 'check') || (options.type == 'radio')) {
+ if (options.type === 'check' || options.type === 'radio') {
var item = options.items[index];
item.checked = !item.checked;
if (item.checked) {
- if (options.type == 'radio') {
+ if (options.type === 'radio') {
tmp.parents('table').find('.w2ui-icon')
.removeClass('w2ui-icon-check')
.addClass('w2ui-icon-empty');
- }
- tmp.removeClass('w2ui-icon-empty').addClass('w2ui-icon-check');
- } else if (options.type == 'check') {
- tmp.removeClass('w2ui-icon-check').addClass('w2ui-icon-empty');
+ }
+ // groups of checkboxes
+ if (options.type === 'check' && item.group != null) {
+ options.items.forEach(function (sub, ind) {
+ if (sub.group === item.group && sub.checked) {
+ tmp.parents('table').find('tr[index='+ ind +'] .w2ui-icon')
+ .removeClass('w2ui-icon-check')
+ .addClass('w2ui-icon-empty');
+ sub.checked = false;
+ }
+ });
+ }
+ tmp.removeClass('w2ui-icon-empty').addClass('w2ui-icon-check');
+ } else if (options.type === 'check' && item.group == null) {
+ tmp.removeClass('w2ui-icon-check').addClass('w2ui-icon-empty');
}
}
// highlight record
@@ -2596,7 +2814,7 @@ w2utils.event = {
if (event.keyCode === 9) { event.stopPropagation(); event.preventDefault(); }
});
if (options.search) {
- if (['text', 'password'].indexOf($(obj)[0].type) != -1 || $(obj)[0].tagName.toUpperCase() == 'TEXTAREA') return;
+ if (['text', 'password'].indexOf($(obj)[0].type) !== -1 || $(obj)[0].tagName.toUpperCase() === 'TEXTAREA') return;
$('#w2ui-overlay'+ name +' #menu-search').focus();
}
mresize();
@@ -2614,7 +2832,7 @@ w2utils.event = {
var scrTop = $('#w2ui-overlay'+ name +' div.menu').scrollTop();
cur.addClass('w2ui-selected');
if (options.tmp) options.tmp.contentHeight = $('#w2ui-overlay'+ name +' table').height() + (options.search ? 50 : 10);
- if (options.tmp) options.tmp.contentWidth = $('#w2ui-overlay'+ name +' table').width();
+ if (options.tmp) options.tmp.contentWidth = $('#w2ui-overlay'+ name +' table').width() + 1;
if ($('#w2ui-overlay'+ name).length > 0) $('#w2ui-overlay'+ name)[0].resize();
// scroll into view
if (cur.length > 0) {
@@ -2722,7 +2940,7 @@ w2utils.event = {
if (img) imgd = '<td class="menu-icon"><div class="w2ui-tb-image w2ui-icon '+ img +'"></div></td>';
if (icon) imgd = '<td class="menu-icon" align="center"><span class="w2ui-icon '+ icon +'"></span></td>';
// render only if non-empty
- if (txt != null && txt !== '' && !(/^-+$/.test(txt))) {
+ if (mitem.type !== 'break' && txt != null && txt !== '' && !(/^-+$/.test(txt))) {
var bg = (count % 2 === 0 ? 'w2ui-item-even' : 'w2ui-item-odd');
if (options.altRows !== true) bg = '';
var colspan = 1;
@@ -2761,62 +2979,85 @@ w2utils.event = {
};
$.fn.w2color = function (options, callBack) {
- var obj = this;
- var el = $(this)[0];
+ var obj = this;
+ var $el = $(this);
+ var el = $el[0];
+ // no need to init
+ if ($el.data('skipInit')) {
+ $el.removeData('skipInit');
+ return;
+ }
+ // needed for keyboard navigation
var index = [-1, -1];
if ($.fn.w2colorPalette == null) {
$.fn.w2colorPalette = [
- ['000000', '555555', '888888', 'BBBBBB', 'DDDDDD', 'EEEEEE', 'F7F7F7', 'FFFFFF'],
- ['FF011B', 'FF9838', 'FFFD59', '01FD55', '00FFFE', '006CE7', '9B24F4', 'FF21F5'],
- ['FFEAEA', 'FCEFE1', 'FCF5E1', 'EBF7E7', 'E9F3F5', 'ECF4FC', 'EAE6F4', 'F5E7ED'],
- ['F4CCCC', 'FCE5CD', 'FFF2CC', 'D9EAD3', 'D0E0E3', 'CFE2F3', 'D9D1E9', 'EAD1DC'],
- ['EA9899', 'F9CB9C', 'FEE599', 'B6D7A8', 'A2C4C9', '9FC5E8', 'B4A7D6', 'D5A6BD'],
- ['E06666', 'F6B26B', 'FED966', '93C47D', '76A5AF', '6FA8DC', '8E7CC3', 'C27BA0'],
- ['CC0814', 'E69138', 'F1C232', '6AA84F', '45818E', '3D85C6', '674EA7', 'A54D79'],
- ['99050C', 'B45F17', 'BF901F', '37761D', '124F5C', '0A5394', '351C75', '741B47'],
- // ['660205', '783F0B', '7F6011', '274E12', '0C343D', '063762', '20124D', '4C1030'],
- ['F2F2F2', 'F2F2F2', 'F2F2F2', 'F2F2F2', 'F2F2F2'] // custom colors (up to 4)
+ ['000000', '333333', '555555', '777777', '888888', '999999', 'AAAAAA', 'CCCCCC', 'DDDDDD', 'EEEEEE', 'F7F7F7', 'FFFFFF'],
+ ['FF011B', 'FF9838', 'FFC300', 'FFFD59', '86FF14', '14FF7A', '2EFFFC', '2693FF', '006CE7', '9B24F4', 'FF21F5', 'FF0099'],
+ ['FFEAEA', 'FCEFE1', 'FCF4DC', 'FFFECF', 'EBFFD9', 'D9FFE9', 'E0FFFF', 'E8F4FF', 'ECF4FC', 'EAE6F4', 'FFF5FE', 'FCF0F7'],
+ ['F4CCCC', 'FCE5CD', 'FFF1C2', 'FFFDA1', 'D5FCB1', 'B5F7D0', 'BFFFFF', 'D6ECFF', 'CFE2F3', 'D9D1E9', 'FFE3FD', 'FFD9F0'],
+ ['EA9899', 'F9CB9C', 'FFE48C', 'F7F56F', 'B9F77E', '84F0B1', '83F7F7', 'B5DAFF', '9FC5E8', 'B4A7D6', 'FAB9F6', 'FFADDE'],
+ ['E06666', 'F6B26B', 'DEB737', 'E0DE51', '8FDB48', '52D189', '4EDEDB', '76ACE3', '6FA8DC', '8E7CC3', 'E07EDA', 'F26DBD'],
+ ['CC0814', 'E69138', 'AB8816', 'B5B20E', '6BAB30', '27A85F', '1BA8A6', '3C81C7', '3D85C6', '674EA7', 'A14F9D', 'BF4990'],
+ ['99050C', 'B45F17', '80650E', '737103', '395E14', '10783D', '13615E', '094785', '0A5394', '351C75', '780172', '782C5A']
];
}
var pal = $.fn.w2colorPalette;
- if (typeof options == 'string') options = {
+ if (typeof options === 'string') options = {
color: options,
transparent: true
};
+ if (options.onSelect == null && callBack != null) options.onSelect = callBack;
// add remove transarent color
- if (options.transparent && pal[0][1] == '555555') {
+ if (options.transparent && pal[0][1] == '333333') {
pal[0].splice(1, 1);
pal[0].push('');
}
- if (!options.transparent && pal[0][1] != '555555') {
- pal[0].splice(1, 0, '555555');
+ if (!options.transparent && pal[0][1] != '333333') {
+ pal[0].splice(1, 0, '333333');
pal[0].pop();
}
if (options.color) options.color = String(options.color).toUpperCase();
+ if (typeof options.color === 'string' && options.color.substr(0,1) === '#') options.color = options.color.substr(1);
+ if (options.fireChange == null) options.fireChange = true;
if ($('#w2ui-overlay').length === 0) {
- $(el).w2overlay(getColorHTML(options), {
- onHide: function () {
- if (typeof callBack == 'function') callBack($(el).data('_color'));
- $(el).removeData('_color');
- }
- });
+ $(el).w2overlay(getColorHTML(options), options);
} else { // only refresh contents
$('#w2ui-overlay .w2ui-color').parent().html(getColorHTML(options));
+ $('#w2ui-overlay').show();
}
// bind events
$('#w2ui-overlay .color')
.off('.w2color')
.on('mousedown.w2color', function (event) {
- var color = $(event.originalEvent.target).attr('name');
+ var color = $(event.originalEvent.target).attr('name'); // should not have #
index = $(event.originalEvent.target).attr('index').split(':');
- $(el).data('_color', color);
+ if (el.tagName.toUpperCase() === 'INPUT') {
+ if (options.fireChange) $(el).change();
+ $(el).next().find('>div').css('background-color', color);
+ } else {
+ $(el).data('_color', color);
+ }
+ if (typeof options.onSelect === 'function') options.onSelect(color);
})
.on('mouseup.w2color', function () {
setTimeout(function () {
if ($("#w2ui-overlay").length > 0) $('#w2ui-overlay').removeData('keepOpen')[0].hide();
}, 10);
});
+ $('#w2ui-overlay .color-original')
+ .off('.w2color')
+ .on('click.w2color', function (event) {
+ // restore original color
+ var tmp = w2utils.parseColor($(event.target).css('background-color'));
+ if (tmp != null) {
+ rgb = tmp;
+ hsv = w2utils.rgb2hsv(rgb);
+ setColor(hsv);
+ updateSlides();
+ refreshPalette();
+ }
+ });
$('#w2ui-overlay input')
.off('.w2color')
.on('mousedown.w2color', function (event) {
@@ -2824,22 +3065,177 @@ w2utils.event = {
setTimeout(function () { $('#w2ui-overlay').data('keepOpen', true); }, 10);
event.stopPropagation();
})
- .on('keyup.w2color', function (event) {
- if (this.value !== '' && this.value[0] !== '#') this.value = '#' + this.value;
- })
- .on('change.w2color', function (event) {
- var tmp = this.value;
- if (tmp.substr(0, 1) == '#') tmp = tmp.substr(1);
- if (tmp.length != 6) {
- $(this).w2tag('Invalid color.');
- return;
+ .on('change.w2color', function () {
+ var $el = $(this);
+ var val = parseFloat($el.val());
+ var max = parseFloat($el.attr('max'));
+ if (isNaN(val)) val = 0;
+ if (max > 1) val = parseInt(val);
+ if (max > 0 && val > max) {
+ $el.val(max);
+ val = max;
+ }
+ if (val < 0) {
+ $el.val(0);
+ val = 0;
+ }
+ var name = $el.attr('name');
+ var color = {};
+ if (['r', 'g', 'b', 'a'].indexOf(name) !== -1) {
+ rgb[name] = val;
+ hsv = w2utils.rgb2hsv(rgb);
+ } else if (['h', 's', 'v'].indexOf(name) !== -1) {
+ color[name] = val;
+ }
+ setColor(color);
+ updateSlides();
+ refreshPalette();
+ });
+ // advanced color events
+ var initial;
+ var hsv, rgb = w2utils.parseColor(options.color);
+ if (rgb == null) {
+ rgb = { r: 140, g: 150, b: 160, a: 1 };
+ hsv = w2utils.rgb2hsv(rgb);
+ }
+ hsv = w2utils.rgb2hsv(rgb);
+
+ var setColor = function (color, silent) {
+ if (color.h != null) hsv.h = color.h;
+ if (color.s != null) hsv.s = color.s;
+ if (color.v != null) hsv.v = color.v;
+ if (color.a != null) { rgb.a = color.a; hsv.a = color.a; }
+ rgb = w2utils.hsv2rgb(hsv);
+ var newColor = 'rgba('+ rgb.r +','+ rgb.g +','+ rgb.b +','+ rgb.a +')';
+ var cl = [
+ Number(rgb.r).toString(16).toUpperCase(),
+ Number(rgb.g).toString(16).toUpperCase(),
+ Number(rgb.b).toString(16).toUpperCase()
+ ];
+ cl.forEach(function (item, ind) { if (item.length === 1) cl[ind] = '0' + item; });
+ if (rgb.a === 1) {
+ newColor = cl[0] + cl[1] + cl[2];
+ }
+ $('#w2ui-overlay .color-preview').css('background-color', newColor);
+ $('#w2ui-overlay input').each(function (index, el) {
+ if (el.name) {
+ if (rgb[el.name] != null) el.value = rgb[el.name];
+ if (hsv[el.name] != null) el.value = hsv[el.name];
+ if (el.name === 'a') el.value = rgb.a;
}
- $.fn.w2colorPalette[pal.length - 1].unshift(tmp.toUpperCase());
- $(el).w2color(options, callBack);
- setTimeout(function() { $('#w2ui-overlay input')[0].focus(); }, 100);
- })
- .w2field('hex');
+ });
+ if (!silent) {
+ if (el.tagName.toUpperCase() === 'INPUT') {
+ $(el).val(newColor).data('skipInit', true);
+ if (options.fireChange) $(el).change();
+ $(el).next().find('>div').css('background-color', newColor);
+ } else {
+ $(el).data('_color', newColor);
+ }
+ if (typeof options.onSelect === 'function') options.onSelect(newColor);
+ } else {
+ $('#w2ui-overlay .color-original').css('background-color', newColor);
+ }
+ }
+ var updateSlides = function () {
+ var $el1 = $('#w2ui-overlay .palette .value1');
+ var $el2 = $('#w2ui-overlay .rainbow .value2');
+ var $el3 = $('#w2ui-overlay .alpha .value2');
+ var offset1 = parseInt($el1.width()) / 2;
+ var offset2 = parseInt($el2.width()) / 2;
+ $el1.css({ 'left': hsv.s * 150 / 100 - offset1, 'top': (100 - hsv.v) * 125 / 100 - offset1});
+ $el2.css('left', hsv.h/(360/150) - offset2);
+ $el3.css('left', rgb.a*150 - offset2);
+ }
+ var refreshPalette = function() {
+ var cl = w2utils.hsv2rgb(hsv.h, 100, 100);
+ var rgb = cl.r + ',' + cl.g + ',' + cl.b;
+ $('#w2ui-overlay .palette').css('background-image',
+ 'linear-gradient(90deg, rgba('+ rgb +',0) 0%, rgba(' + rgb + ',1) 100%)');
+ }
+ var mouseDown = function (event) {
+ var $el = $(this).find('.value1, .value2');
+ var offset = parseInt($el.width()) / 2;
+ if ($el.hasClass('move-x')) $el.css({ left: (event.offsetX - offset) + 'px' });
+ if ($el.hasClass('move-y')) $el.css({ top: (event.offsetY - offset) + 'px' });
+ initial = {
+ $el : $el,
+ x : event.pageX,
+ y : event.pageY,
+ width : $el.parent().width(),
+ height : $el.parent().height(),
+ left : parseInt($el.css('left')),
+ top : parseInt($el.css('top'))
+ };
+ mouseMove(event);
+ $('body').off('.w2color')
+ .on(mMove, mouseMove)
+ .on(mUp, mouseUp);
+ };
+ var mouseUp = function(event) {
+ $('body').off('.w2color');
+ };
+ var mouseMove = function(event) {
+ var $el = initial.$el;
+ var divX = event.pageX - initial.x;
+ var divY = event.pageY - initial.y;
+ var newX = initial.left + divX;
+ var newY = initial.top + divY;
+ var offset = parseInt($el.width()) / 2;
+ if (newX < -offset) newX = -offset;
+ if (newY < -offset) newY = -offset;
+ if (newX > initial.width - offset) newX = initial.width - offset;
+ if (newY > initial.height - offset) newY = initial.height - offset
+ if ($el.hasClass('move-x')) $el.css({ left : newX + 'px' });
+ if ($el.hasClass('move-y')) $el.css({ top : newY + 'px' });
+
+ // move
+ var name = $el.parent().attr('name');
+ var x = parseInt($el.css('left')) + offset;
+ var y = parseInt($el.css('top')) + offset;
+ if (name === 'palette') {
+ setColor({
+ s: Math.round(x / initial.width * 100),
+ v: Math.round(100 - (y / initial.height * 100))
+ });
+ }
+ if (name === 'rainbow') {
+ var h = Math.round(360 / 150 * x);
+ setColor({ h: h });
+ refreshPalette();
+ }
+ if (name === 'alpha') {
+ setColor({ a: parseFloat(Number(x / 150).toFixed(2)) });
+ }
+ }
+ if ($.fn._colorAdvanced === true || options.advanced === true) {
+ $('#w2ui-overlay .w2ui-color-tabs :nth-child(2)').click();
+ $('#w2ui-overlay').removeData('keepOpen');
+ }
+ setColor({}, true);
+ refreshPalette();
+ updateSlides();
+
+ // Events of iOS
+ var mDown = 'mousedown.w2color';
+ var mUp = 'mouseup.w2color';
+ var mMove = 'mousemove.w2color';
+ if (w2utils.isIOS) {
+ mDown = 'touchstart.w2color';
+ mUp = 'touchend.w2color';
+ mMove = 'touchmove.w2color ';
+ }
+ $('#w2ui-overlay .palette')
+ .off('.w2color')
+ .on('mousedown.w2color', mouseDown);
+ $('#w2ui-overlay .rainbow')
+ .off('.w2color')
+ .on('mousedown.w2color', mouseDown);
+ $('#w2ui-overlay .alpha')
+ .off('.w2color')
+ .on('mousedown.w2color', mouseDown);
+ // keyboard navigation
el.nav = function (direction) {
switch (direction) {
case 'up':
@@ -2866,14 +3262,16 @@ w2utils.event = {
};
function getColorHTML(options) {
- var color = options.color;
- var html = '<div class="w2ui-color" onmousedown="event.stopPropagation(); event.preventDefault()">'+ // prevent default is needed otherwiser selection gets unselected
+ var color = options.color, bor;
+ var html = '<div class="w2ui-color" onmousedown="jQuery(this).parents(\'.w2ui-overlay\').data(\'keepOpen\', true)">'+
+ '<div class="w2ui-color-palette">'+
'<table cellspacing="5"><tbody>';
- for (var i = 0; i < pal.length - 1; i++) {
+ for (var i = 0; i < pal.length; i++) {
html += '<tr>';
for (var j = 0; j < pal[i].length; j++) {
+ if (pal[i][j] === 'FFFFFF') bor = ';border: 1px solid #efefef'; else bor = '';
html += '<td>'+
- ' <div class="color '+ (pal[i][j] === '' ? 'no-color' : '') +'" style="background-color: #'+ pal[i][j] +';" ' +
+ ' <div class="color '+ (pal[i][j] === '' ? 'no-color' : '') +'" style="background-color: #'+ pal[i][j] + bor +';" ' +
' name="'+ pal[i][j] +'" index="'+ i + ':' + j +'">'+ (options.color == pal[i][j] ? '' : ' ') +
' </div>'+
'</td>';
@@ -2882,23 +3280,73 @@ w2utils.event = {
html += '</tr>';
if (i < 2) html += '<tr><td style="height: 8px" colspan="8"></td></tr>';
}
- var tmp = pal[pal.length - 1];
- html += '<tr><td style="height: 8px" colspan="8"></td></tr>'+
- '<tr>'+
- ' <td colspan="4" style="text-align: left"><input placeholder="#FFF000" style="margin-left: 1px; width: 74px" maxlength="7"/></td>'+
- ' <td><div class="color" style="background-color: #'+ tmp[0] +';" name="'+ tmp[0] +'" index="8:0">'+ (options.color == tmp[0] ? '' : ' ') +'</div></td>'+
- ' <td><div class="color" style="background-color: #'+ tmp[1] +';" name="'+ tmp[1] +'" index="8:0">'+ (options.color == tmp[1] ? '' : ' ') +'</div></td>'+
- ' <td><div class="color" style="background-color: #'+ tmp[2] +';" name="'+ tmp[2] +'" index="8:0">'+ (options.color == tmp[2] ? '' : ' ') +'</div></td>'+
- ' <td><div class="color" style="background-color: #'+ tmp[3] +';" name="'+ tmp[3] +'" index="8:0">'+ (options.color == tmp[3] ? '' : ' ') +'</div></td>'+
- '</tr>'+
- '<tr><td style="height: 4px" colspan="8"></td></tr>';
- html += '</tbody></table></div>';
+ html += '</tbody></table>'+
+ '</div>';
+ if (true) {
+ html += '<div class="w2ui-color-advanced" style="display: none">'+
+ ' <div class="color-info">'+
+ ' <div class="color-preview-bg"><div class="color-preview"></div><div class="color-original"></div></div>'+
+ ' <div class="color-part">'+
+ ' <span>H</span> <input name="h" maxlength="3" max="360" tabindex="101">'+
+ ' <span>R</span> <input name="r" maxlength="3" max="255" tabindex="104">'+
+ ' </div>'+
+ ' <div class="color-part">'+
+ ' <span>S</span> <input name="s" maxlength="3" max="100" tabindex="102">'+
+ ' <span>G</span> <input name="g" maxlength="3" max="255" tabindex="105">'+
+ ' </div>'+
+ ' <div class="color-part">'+
+ ' <span>V</span> <input name="v" maxlength="3" max="100" tabindex="103">'+
+ ' <span>B</span> <input name="b" maxlength="3" max="255" tabindex="106">'+
+ ' </div>'+
+ ' <div class="color-part" style="margin: 30px 0px 0px 2px">'+
+ ' <span style="width: 40px">Opacity</span> '+
+ ' <input name="a" maxlength="5" max="1" style="width: 32px !important" tabindex="107">'+
+ ' </div>'+
+ ' </div>'+
+ ' <div class="palette" name="palette">'+
+ ' <div class="palette-bg"></div>'+
+ ' <div class="value1 move-x move-y"></div>'+
+ ' </div>'+
+ ' <div class="rainbow" name="rainbow">'+
+ ' <div class="value2 move-x"></div>'+
+ ' </div>'+
+ ' <div class="alpha" name="alpha">'+
+ ' <div class="alpha-bg"></div>'+
+ ' <div class="value2 move-x"></div>'+
+ ' </div>'+
+ '</div>';
+ }
+ html += '<div class="w2ui-color-tabs">'+
+ ' <div class="w2ui-color-tab selected" onclick="jQuery(this).addClass(\'selected\').next().removeClass(\'selected\').parents(\'.w2ui-overlay\').find(\'.w2ui-color-advanced\').hide().parent().find(\'.w2ui-color-palette\').show(); jQuery.fn._colorAdvanced = false; jQuery(\'#w2ui-overlay\')[0].resize()"><span class="w2ui-icon w2ui-icon-colors"></span></div>'+
+ ' <div class="w2ui-color-tab" onclick="jQuery(this).addClass(\'selected\').prev().removeClass(\'selected\').parents(\'.w2ui-overlay\').find(\'.w2ui-color-advanced\').show().parent().find(\'.w2ui-color-palette\').hide(); jQuery.fn._colorAdvanced = true; jQuery(\'#w2ui-overlay\')[0].resize()"><span class="w2ui-icon w2ui-icon-settings"></span></div>'+
+ '</div>'+
+ '</div>'+
+ '<div style="clear: both; height: 0"></div>';
return html;
}
};
})(jQuery);
+/***********************************************************
+* Compatibility with CommonJS and AMD modules
+*
+*********************************************************/
+
+(function(global, w2ui) {
+ if (typeof define=='function' && define.amd) {
+ return define(function(){ return w2ui; });
+ }
+ if (typeof exports!='undefined') {
+ if (typeof module!='undefined' && module.exports)
+ return exports = module.exports = w2ui;
+ global = exports;
+ }
+ for (var m in w2ui) {
+ global[m] = w2ui[m];
+ }
+})(this, { w2ui: w2ui, w2obj: w2obj, w2utils: w2utils });
+
/************************************************************************
* Library: Web 2.0 UI for jQuery (using prototypical inheritance)
* - Following objects defined
@@ -2951,8 +3399,8 @@ w2utils.event = {
* - added focus(), blur(), onFocus, onBlur
* - search.simple - if false, will not show up in simple search
* - search.operator - default operator to use with search field
-* - search.operators - array of operators for the serach
-* - search.hidden - could not be clearned by the user
+* - search.operators - array of operators for the search
+* - search.hidden - could not be cleared by the user
* - search.value - only for hidden searches
* - if .search(val) - search all fields
* - refactor reorderRow (not finished)
@@ -2991,6 +3439,7 @@ w2utils.event = {
w2ui: {
colspan: { field: 5, ...}
editable: true/false
+ hideCheckBox: true/false,
changes: {
field: chagned_value,
....
@@ -3007,6 +3456,7 @@ w2utils.event = {
}
* - added this.show.toolbarInput
* - disableCVS
+* - added useFieldDot: use field name containing dots as separator to look into objects
* - grid.message
* - added noReset option to localSort()
* - onColumnSelect
@@ -3027,6 +3477,9 @@ w2utils.event = {
* - columnTooltip
* - expendable grids are still working
* - added search.type = 'color'
+* - added getFirst
+* - added stateSaveColumnProperties
+* - added stateSaveColumnFallbackValues
*
************************************************************************/
@@ -3049,7 +3502,7 @@ w2utils.event = {
this.postData = {};
this.httpHeaders = {};
this.toolbar = {}; // if not empty object; then it is toolbar object
- this.stateId = null; // Custom state name for satateSave, stateRestore and stateReset
+ this.stateId = null; // Custom state name for stateSave, stateRestore and stateReset
this.show = {
header : false,
@@ -3096,10 +3549,12 @@ w2utils.event = {
this.multiSort = true;
this.reorderColumns = false;
this.reorderRows = false;
+ this.searchContextRows = 0;
this.markSearch = true;
this.columnTooltip = 'normal'; // can be normal, top, bottom, left, right
this.disableCVS = false; // disable Column Virtual Scroll
this.textSearch = 'begins'; // default search type for text
+ this.useFieldDot = true; // use field name containing dots as separator to look into object
this.total = 0; // server total
this.limit = 100;
@@ -3108,6 +3563,7 @@ w2utils.event = {
this.ranges = [];
this.menu = [];
this.method = null; // if defined, then overwrited ajax method
+ this.dataType = null; // if defined, then overwrited w2utils.settings.dataType
this.recid = null;
this.parser = null;
@@ -3139,6 +3595,58 @@ w2utils.event = {
isSafari : (/^((?!chrome|android).)*safari/i).test(navigator.userAgent)
};
+ // these column properties will be saved in stateSave()
+ this.stateSaveColumnProperties = {
+ caption : false,
+ field : true,
+ size : true,
+ min : false,
+ max : false,
+ gridMinWidth : false,
+ sizeCorrected : false,
+ sizeCalculated : true,
+ sizeOriginal : true,
+ sizeType : true,
+ hidden : true,
+ sortable : false,
+ searchable : false,
+ resizable : false,
+ hideable : false,
+ attr : false,
+ style : false,
+ render : false,
+ title : false,
+ editable : false,
+ frozen : true,
+ info : false,
+ };
+
+ // these are the stateSave() fallback values if the property to save is not a property of the column object
+ this.stateSaveColumnFallbackValues = {
+ caption : '', // column caption
+ field : '', // field name to map column to a record
+ size : null, // size of column in px or %
+ min : 20, // minimum width of column in px
+ max : null, // maximum width of column in px
+ gridMinWidth : null, // minimum width of the grid when column is visible
+ sizeCorrected : null, // read only, corrected size (see explanation below)
+ sizeCalculated : null, // read only, size in px (see explanation below)
+ sizeOriginal : null,
+ sizeType : null,
+ hidden : false, // indicates if column is hidden
+ sortable : false, // indicates if column is sortable
+ searchable : false, // indicates if column is searchable, bool/string: int,float,date,...
+ resizable : true, // indicates if column is resizable
+ hideable : true, // indicates if column can be hidden
+ attr : '', // string that will be inside the <td ... attr> tag
+ style : '', // additional style for the td tag
+ render : null, // string or render function
+ title : null, // string or function for the title property for the column cells
+ editable : {}, // editable object if column fields are editable
+ frozen : false, // indicates if the column is fixed to the left
+ info : null // info bubble, can be bool/object
+ };
+
$.extend(true, this, w2obj.grid, options);
};
@@ -3162,7 +3670,6 @@ w2utils.event = {
// extend items
var object = new w2grid(method);
$.extend(object, { postData: {}, httpHeaders: {}, records: [], columns: [], searches: [], toolbar: {}, sortData: [], searchData: [], handlers: [] });
- if (object.onExpand != null) object.show.expandColumn = true;
$.extend(true, object.toolbar, toolbar);
// reassign variables
var p;
@@ -3250,7 +3757,7 @@ w2utils.event = {
"hex" : ['is', 'between'],
"color" : ['is', 'begins', 'contains', 'ends'],
"enum" : ['in', 'not in']
- // -- all posible
+ // -- all possible
// "text" : ['is', 'begins', 'contains', 'ends'],
// "number" : ['is', 'between', 'less:less than', 'more:more than', 'null:is null', 'not null:is not null'],
// "list" : ['is', 'null:is null', 'not null:is not null'],
@@ -3296,6 +3803,7 @@ w2utils.event = {
onColumnClick : null,
onColumnDblClick : null,
onColumnResize : null,
+ onColumnAutoResize : null,
onSort : null,
onSearch : null,
onSearchOpen : null,
@@ -3377,7 +3885,7 @@ w2utils.event = {
},
set: function (recid, record, noRefresh) { // does not delete existing, but overrides on top of it
- if (typeof recid == 'object') {
+ if ((typeof recid == 'object') && (recid !== null)) {
noRefresh = record;
record = recid;
recid = null;
@@ -3406,34 +3914,42 @@ w2utils.event = {
// search records
if ($.isArray(recid)) {
var recs = [];
- for (var i = 0; i < this.records.length; i++) {
- if ($.inArray(this.records[i].recid, recid) != -1) {
- if (returnIndex === true) {
- recs.push(i);
- } else {
- recs.push(this.records[i]);
- }
- }
- }
- for (var i = 0; i < this.summary.length; i++) {
- if ($.inArray(this.summary[i].recid, recid) != -1) {
- if (returnIndex === true) {
- recs.push(i);
- } else {
- recs.push(this.summary[i]);
- }
- }
+ for (var i = 0; i < recid.length; i++) {
+ var v = this.get(recid[i], returnIndex);
+ if (v !== null)
+ recs.push(v);
}
return recs;
} else {
+ // get() must be fast, implements a cache to bypass loop over all records
+ // most of the time.
+ var idCache = this.last.idCache;
+ if (!idCache) {
+ this.last.idCache = idCache = {};
+ }
+ var i = idCache[recid];
+ if (typeof(i) === "number") {
+ if (i >= 0 && i < this.records.length && this.records[i].recid == recid) {
+ if (returnIndex === true) return i; else return this.records[i];
+ }
+ // summary indexes are stored as negative numbers, try them now.
+ i = ~i;
+ if (i >= 0 && i < this.summary.length && this.summary[i].recid == recid) {
+ if (returnIndex === true) return i; else return this.summary[i];
+ }
+ // wrong index returned, clear cache
+ this.last.idCache = idCache = {};
+ }
for (var i = 0; i < this.records.length; i++) {
if (this.records[i].recid == recid) {
+ idCache[recid] = i;
if (returnIndex === true) return i; else return this.records[i];
}
}
// search summary
for (var i = 0; i < this.summary.length; i++) {
if (this.summary[i].recid == recid) {
+ idCache[recid] = ~i;
if (returnIndex === true) return i; else return this.summary[i];
}
}
@@ -3441,6 +3957,20 @@ w2utils.event = {
}
},
+ getFirst: function () {
+ if (this.records.length == 0) return null;
+ var recid = this.records[0].recid;
+ var tmp = this.last.searchIds;
+ if (this.searchData.length > 0) {
+ if (Array.isArray(tmp) && tmp.length > 0) {
+ recid = this.records[tmp[0]].recid;
+ } else {
+ recid = null;
+ }
+ }
+ return recid;
+ },
+
remove: function () {
var removed = 0;
for (var a = 0; a < arguments.length; a++) {
@@ -3547,6 +4077,7 @@ w2utils.event = {
}
this.refreshBody();
this.resizeRecords();
+ this.scroll(); // scroll needed because of column virtual scroll
return shown;
},
@@ -3563,6 +4094,7 @@ w2utils.event = {
}
this.refreshBody();
this.resizeRecords();
+ this.scroll(); // scroll needed because of column virtual scroll
return hidden;
},
@@ -3711,8 +4243,9 @@ w2utils.event = {
function preparePaths() {
for (var i = 0; i < obj.records.length; i++) {
var rec = obj.records[i];
- if (rec.w2ui && rec.w2ui.parent_recid != null)
+ if (rec.w2ui && rec.w2ui.parent_recid != null) {
rec.w2ui._path = getRecordPath(rec);
+ }
}
}
@@ -3720,8 +4253,9 @@ w2utils.event = {
function cleanupPaths() {
for (var i = 0; i < obj.records.length; i++) {
var rec = obj.records[i];
- if (rec.w2ui && rec.w2ui.parent_recid != null)
+ if (rec.w2ui && rec.w2ui.parent_recid != null) {
rec.w2ui._path = null;
+ }
}
}
@@ -3761,30 +4295,29 @@ w2utils.event = {
if (a === b) return 0; // optimize, same object
for (var i = 0; i < obj.sortData.length; i++) {
var fld = obj.sortData[i].field;
- if (obj.sortData[i].field_) fld = obj.sortData[i].field_;
- var aa = a[fld];
- var bb = b[fld];
+ var sortFld = (obj.sortData[i].field_) ? obj.sortData[i].field_ : fld;
+ var aa = a[sortFld];
+ var bb = b[sortFld];
if (String(fld).indexOf('.') != -1) {
- aa = obj.parseField(a, fld);
- bb = obj.parseField(b, fld);
+ aa = obj.parseField(a, sortFld);
+ bb = obj.parseField(b, sortFld);
}
var col = obj.getColumn(fld);
if (col && col.editable != null) { // for drop editable fields and drop downs
if ($.isPlainObject(aa) && aa.text) aa = aa.text;
if ($.isPlainObject(bb) && bb.text) bb = bb.text;
}
- var ret = compareCells(aa, bb, i, obj.sortData[i].direction);
+ var ret = compareCells(aa, bb, i, obj.sortData[i].direction, col.sortMode || 'default');
if (ret !== 0) return ret;
}
// break tie for similar records,
// required to have consistent ordering for tree paths
var ret = compareCells(a.recid, b.recid, -1, 'asc');
- if (ret !== 0) return ret;
- return 0;
+ return ret;
}
// compare two values, aa and bb, producing consistent ordering
- function compareCells(aa, bb, i, direction) {
+ function compareCells(aa, bb, i, direction, sortMode) {
// if both objects are strictly equal, we're done
if (aa === bb)
return 0;
@@ -3793,7 +4326,7 @@ w2utils.event = {
return 1;
if ((aa != null && aa !== "") && (bb == null || bb === ""))
return -1;
- var dir = (direction == 'asc') ? 1 : -1;
+ var dir = (direction.toLowerCase() === 'asc') ? 1 : -1;
// for different kind of objects, sort by object type
if (typeof aa != typeof bb)
return (typeof aa > typeof bb) ? dir : -dir;
@@ -3813,11 +4346,22 @@ w2utils.event = {
aa = String(aa);
if (bb && typeof bb == 'object' && bb.toString != defaultToString)
bb = String(bb);
- // do case-insensitive string comparaison
+ // do case-insensitive string comparison
if (typeof aa == 'string')
aa = $.trim(aa.toLowerCase());
if (typeof bb == 'string')
bb = $.trim(bb.toLowerCase());
+
+ switch (sortMode) {
+ case 'natural':
+ sortMode = w2utils.naturalCompare;
+ break;
+ }
+
+ if (typeof sortMode == 'function') {
+ return sortMode(aa,bb) * dir;
+ }
+
// compare both objects
if (aa > bb)
return dir;
@@ -3851,7 +4395,43 @@ w2utils.event = {
if (match) {
if (rec && rec.w2ui)
addParent(rec.w2ui.parent_recid);
- this.last.searchIds.push(i);
+
+ if (this.searchContextRows && this.searchContextRows > 0)
+ {
+ var beforeItemCount = this.searchContextRows;
+ var afterItemCount = this.searchContextRows;
+
+ if (i < beforeItemCount)
+ beforeItemCount = i;
+
+ if (i + afterItemCount > this.records.length)
+ afterItemCount = this.records.length - i;
+
+ if (beforeItemCount > 0)
+ {
+ for (var j = i - beforeItemCount; j < i; j++)
+ {
+ if (this.last.searchIds.indexOf(j) < 0)
+ this.last.searchIds.push(j);
+ }
+ }
+
+ if (this.last.searchIds.indexOf(i) < 0)
+ this.last.searchIds.push(i);
+
+ if (afterItemCount > 0)
+ {
+ for (var j = (i + 1) ; j <= (i + afterItemCount) ; j++)
+ {
+ if (this.last.searchIds.indexOf(j) < 0)
+ this.last.searchIds.push(j);
+ }
+ }
+ }
+ else
+ {
+ this.last.searchIds.push(i);
+ }
}
}
this.total = this.last.searchIds.length;
@@ -3911,7 +4491,8 @@ w2utils.event = {
if (parseFloat(obj.parseField(rec, search.field)) >= parseFloat(val2) && parseFloat(obj.parseField(rec, search.field)) <= parseFloat(val3)) fl++;
}
else if (search.type == 'date') {
- var val1 = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field));
+ var tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field));
+ var val1 = w2utils.isDate(tmp, w2utils.settings.dateFormat, true);
var val2 = w2utils.isDate(val2, w2utils.settings.dateFormat, true);
var val3 = w2utils.isDate(val3, w2utils.settings.dateFormat, true);
if (val3 != null) val3 = new Date(val3.getTime() + 86400000); // 1 day
@@ -3939,7 +4520,7 @@ w2utils.event = {
}
else if (search.type == 'date') {
var tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field));
- var val1 = w2utils.formatDate(tmp, 'yyyy-mm-dd');
+ var val1 = w2utils.formatDate(w2utils.isDate(tmp, w2utils.settings.dateFormat, true), 'yyyy-mm-dd');
var val2 = w2utils.formatDate(w2utils.isDate(val2, w2utils.settings.dateFormat, true), 'yyyy-mm-dd');
if (val1 <= val2) fl++;
}
@@ -3962,7 +4543,7 @@ w2utils.event = {
}
else if (search.type == 'date') {
var tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field));
- var val1 = w2utils.formatDate(tmp, 'yyyy-mm-dd');
+ var val1 = w2utils.formatDate(w2utils.isDate(tmp, w2utils.settings.dateFormat, true), 'yyyy-mm-dd');
var val2 = w2utils.formatDate(w2utils.isDate(val2, w2utils.settings.dateFormat, true), 'yyyy-mm-dd');
if (val1 >= val2) fl++;
}
@@ -3982,14 +4563,12 @@ w2utils.event = {
case 'in':
var tmp = sdata.value;
if (sdata.svalue) tmp = sdata.svalue;
- if (tmp.indexOf(w2utils.isFloat(val1) ? parseFloat(val1) : val1) !== -1) fl++;
- if (tmp.indexOf(w2utils.isFloat(val1b) ? parseFloat(val1b) : val1b) !== -1) fl++;
+ if ((tmp.indexOf(w2utils.isFloat(val1b) ? parseFloat(val1b) : val1b) !== -1) || tmp.indexOf(val1) !== -1) fl++;
break;
case 'not in':
var tmp = sdata.value;
if (sdata.svalue) tmp = sdata.svalue;
- if (tmp.indexOf(w2utils.isFloat(val1) ? parseFloat(val1) : val1) == -1) fl++;
- if (tmp.indexOf(w2utils.isFloat(val1b) ? parseFloat(val1b) : val1b) == -1) fl++;
+ if (!((tmp.indexOf(w2utils.isFloat(val1b) ? parseFloat(val1b) : val1b) !== -1) || tmp.indexOf(val1) !== -1)) fl++;
break;
case 'begins':
case 'begins with': // need for back compatib.
@@ -4289,8 +4868,10 @@ w2utils.event = {
originalRange : [{ recid: sel[0].recid, column: sel[0].column }, { recid: sel[sel.length-1].recid, column: sel[sel.length-1].column }],
newRange : [{ recid: sel[0].recid, column: sel[0].column }, { recid: sel[sel.length-1].recid, column: sel[sel.length-1].column }]
};
- $(document).off('mousemove', mouseMove).on('mousemove', mouseMove);
- $(document).off('mouseup', mouseStop).on('mouseup', mouseStop);
+ $(document)
+ .off('.w2ui-' + obj.name)
+ .on('mousemove.w2ui-' + obj.name, mouseMove)
+ .on('mouseup.w2ui-' + obj.name, mouseStop);
// do not blur grid
event.preventDefault();
}
@@ -4332,8 +4913,7 @@ w2utils.event = {
// default behavior
obj.removeRange('grid-selection-expand');
delete obj.last.move;
- $(document).off('mousemove', mouseMove);
- $(document).off('mouseup', mouseStop);
+ $(document).off('.w2ui-' + obj.name);
// event after
obj.trigger($.extend(edata, { phase: 'after' }));
}
@@ -4595,6 +5175,7 @@ w2utils.event = {
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list