diff --git a/assets/align/align.js b/assets/align/align.js
index c03abe2..1bca403 100644
--- a/assets/align/align.js
+++ b/assets/align/align.js
@@ -113,7 +113,7 @@ kit.PluginManager.register('align',function(module, exports, require) {
/**
- * @param node
+ * @param node {HTMLElement}
* @param axis
* @property start
* @property end
@@ -360,7 +360,15 @@ kit.PluginManager.register('align',function(module, exports, require) {
* @return {AlignCalc}
*/
AlignCalc.prototype.updateMetrics = function(){
+ var node = this.nodeMetricsLine.node;
+ var o = node.style.overflow, w = node.style.width, h = node.style.height;
+ node.style.overflow = 'hidden';
+ node.style.width = '';
+ node.style.height = '';
this.limiterMetricsLine.update();
+ node.style.overflow = o;
+ node.style.width = w;
+ node.style.height = h;
this.parentMetricsLine.update();
this.nodeMetricsLine.update();
return this;
@@ -568,7 +576,7 @@ kit.PluginManager.register('align',function(module, exports, require) {
this.reset(axis === 'horizontal', axis === 'vertical');
this.__setAdditionalStyles();
-
+//todo
this.condition[axis].direction = direction;
this.condition[axis].align = align;
@@ -623,6 +631,7 @@ kit.PluginManager.register('align',function(module, exports, require) {
* @memberOf kit
*/
var align = {
+ AlignCalc: AlignCalc,
Class: AlignClass,
getInstance: function (node, parentNode) {
if(node instanceof HTMLElement && node.kit && node.kit.align) {
diff --git a/assets/cookie/cookie.js b/assets/cookie/cookie.js
index 7d21b8c..da22823 100644
--- a/assets/cookie/cookie.js
+++ b/assets/cookie/cookie.js
@@ -1,3 +1,6 @@
+/**
+ * @module cookie
+ **/
kit.PluginManager.register('cookie', function(module, exports, require){
var defaultConverter = {
@@ -96,9 +99,9 @@ kit.PluginManager.register('cookie', function(module, exports, require){
/**
- * @class kitCookie
+ * @memberOf kit
*/
- return Object.create(
+ var cookie = Object.create(
{
set: set,
get: get,
@@ -122,7 +125,8 @@ kit.PluginManager.register('cookie', function(module, exports, require){
attributes: { value: Object.freeze(defaultAttributes) },
converter: { value: Object.freeze(converter) }
}
- )
+ );
+ return cookie;
}
module.exports = init(defaultConverter, { path: '/' });
diff --git a/assets/core/core.js b/assets/core/core.js
index d6850d6..9724246 100644
--- a/assets/core/core.js
+++ b/assets/core/core.js
@@ -161,6 +161,7 @@ window.kit = window.kit || {};
* @return {PluginManager}
*/
__proto.load = function (pluginId, callback) {
+ var self = this;
//console.log('PluginManager.load: plugin ' + pluginId + ' ('+(this.plugins[pluginId]?this.plugins[pluginId].state:'0')+')');
if(typeof callback !== 'function') {
callback = function(){};
@@ -204,6 +205,7 @@ window.kit = window.kit || {};
var getModulePromise = (function () {
function loadScript(src, resolveCallback, rejectCallback) {
+ src = String(src).split('?')[0];
if(typeof resolveCallback !== 'function'){
resolveCallback = function(){};
}
@@ -213,16 +215,17 @@ window.kit = window.kit || {};
};
}
return new Promise(function(resolve, reject) {
+ var meta = document.querySelector('meta[name="'+src+'"]');
var script = document.querySelector('script[src^="'+src+'"]');
- if (!script) {
+ if (script || meta) {
+ global.config.debug && console.warn(`Скрип ${src} уже загружен`);
+ self.__ready(resolve, [script]);
+ } else {
script = document.createElement('script');
script.src = '' + src + '?__pm' + (new Date()).getTime();
script.onload = () => resolve(script);
script.onerror = () => reject(new Error(`Ошибка загрузки скрипта ${src}`));
document.head.append(script);
- } else {
- global.config.debug && console.warn(`Скрип ${src} уже загружен`);
- resolve(script);
}
}).then(resolveCallback, rejectCallback);
}
@@ -246,15 +249,16 @@ window.kit = window.kit || {};
list.forEach(function(item, i, arr){
syncPromise.then(function(){
var src = configModule.path + item;
+ var meta = document.querySelector('meta[name="'+src+'"]');
var script = document.querySelector('script[src^="'+src+'"]');
- if (!script) {
+ if(meta || script){
+ self.__ready(resolve, [src, true]);
+ } else {
script = document.createElement('script');
script.src = '' + src + '?__pm' + (new Date()).getTime();
script.onload = () => checkResolve(src, true);
script.onerror = () => checkResolve(src, false);
document.head.append(script);
- } else {
- checkResolve(src, true);
}
});
});
@@ -262,8 +266,12 @@ window.kit = window.kit || {};
}
function loadStyle(src) {
return new Promise(function(resolve, reject) {
+ var meta = document.querySelector('meta[name="'+src+'"]');
var link = document.querySelector('link[href^="'+src+'"]');
- if (!link) {
+ if(link || meta) {
+ global.config.debug && console.warn(`Скрип ${src} уже загружен`);
+ self.__ready(resolve, [src]);
+ } else {
link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
@@ -271,9 +279,6 @@ window.kit = window.kit || {};
link.media = 'all';
document.head.append(link);
resolve(link);
- } else {
- global.config.debug && console.warn(`Скрип ${src} уже загружен`);
- resolve(link);
}
});
}
@@ -563,14 +568,15 @@ window.kit = window.kit || {};
callback = deps;
deps = [];
}
+ this.__ready(this.exec, [deps, callback], this);
+ };
+ __proto.__ready = function(fn, args = [], context = window) {
+ context = context || this;
if (/complete|interactive|loaded/.test(document.readyState)) {
- // In case the document has finished parsing, document's readyState will
- // be one of "complete", "interactive" or (non-standard) "loaded".
- this.exec(deps, callback);
+ fn.apply(context, args);
} else {
- // The document is not ready yet, so wait for the DOMContentLoaded event
document.addEventListener("DOMContentLoaded", function () {
- this.exec(deps, callback);
+ fn.apply(context, args);
}.bind(this));
}
};
diff --git a/assets/core/core.register.js b/assets/core/core.register.js
index 3213907..d57e623 100644
--- a/assets/core/core.register.js
+++ b/assets/core/core.register.js
@@ -183,6 +183,24 @@ __PluginManager__.registerPlugins({
type: 'loader',
deps: ['support'],
},
+ date: {
+ path: __pmConfig__.assetsPath + '/date',
+ module: '/date.js',
+ type: 'loader',
+ deps: [],
+ },
+ testing: {
+ path: __pmConfig__.assetsPath + '/testing',
+ module: '/testing.js',
+ type: 'loader',
+ deps: ['Logger'],
+ },
+ Logger: {
+ path: __pmConfig__.assetsPath + '/logger',
+ module: '/logger.js',
+ css: '/logger.css',
+ type: 'loader',
+ },
});
diff --git a/assets/date/date.js b/assets/date/date.js
new file mode 100644
index 0000000..92f2cfa
--- /dev/null
+++ b/assets/date/date.js
@@ -0,0 +1,369 @@
+/**
+ * date-php.js v1.7.15
+ * :-) date('Y-m-d', 1563148800000)
+ * This is a Javascript mimicking PHP datetime formatting function. It is very similar to PHP, has rich template
+ * characters, and enhances some template characters on the basis of the original.
+ *
+ * -- repository https://github.com/toviLau/date-php.git
+ *
+ * (c) 2019-2020 ToviLau. Released under the MIT License.
+ *
+ * @module date
+ **/
+kit.PluginManager.register('date',function(module, exports, require, global) {
+
+ (function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.date = factory());
+ }(this, function () { 'use strict';
+
+ /**
+ * 补前导零(0)
+ * @param {number} str 字符
+ * @param {number} len 长度
+ * @param {string} placeholder 前导占位符
+ * @returns {string}
+ */
+ function pad(str, len, placeholder) {
+ if ( placeholder === void 0 ) placeholder = '0';
+ str = '' + str;
+ if (str.length < len) {
+ return new Array(++len - str.length).join(placeholder) + str;
+ } else {
+ return str;
+ }
+ }var longDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
+ var txt_ordin = {
+ 1: 'st',
+ 2: 'nd',
+ 3: 'rd',
+ 21: 'st',
+ 22: 'nd',
+ 23: 'rd',
+ 31: 'st',
+ };
+ var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+ var baseFigure = {
+ 1: '一',
+ 2: '二',
+ 3: '三',
+ 4: '四',
+ 5: '五',
+ 6: '六',
+ };
+ var lunarTime = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
+ var ordinal = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth'];
+
+ var lunarKe = Object.assign.apply(
+ Object, [ {},
+ {
+ 0: '零',
+ 7: '七',
+ } ].concat( baseFigure )
+ );
+
+ var weekDay = Object.assign.apply(
+ Object, [ {},
+ {
+ 0: '日',
+ } ].concat( baseFigure )
+ );
+
+ var dateFigure = Object.assign.apply(
+ Object, [ {},
+ {
+ 0: '〇', 7: '七', 8: '八', 9: '九', 10: '十',
+ 20: '廿', 30: '卅',
+ } ].concat( baseFigure )
+ );
+ var lMonth = Object.assign.apply(
+ Object, [ {},
+ {
+ 7: '七', 8: '八', 9: '九', 10: '十', 11: '冬', 12: '腊',
+ } ].concat( baseFigure )
+ );
+
+ // 取中文日期(廿七)
+ var textReplace = function (res) { return res.toString()
+ .split('')
+ .reverse()
+ .map(function (val, key) {
+ var v = Math.pow(10, key) * val;
+ return v ? dateFigure[v] : null;
+ })
+ .reverse()
+ .join(''); };
+
+ // 取中文日期2(例:一九八七)
+ var textReplace2 = function (succ) { return (succ + '').split('').map(function (res) { return dateFigure[res]; }).join(''); };
+
+ function defP(obj, key, val) {
+ Object.defineProperty(obj, key, {
+ get: function () { return val; },
+ });
+ }
+
+ /**
+ *
+ * 计算持续时长
+ * @param {String} fmt 模板字符串
+ * @param {Number} timestamp 时间戳
+ * @param {Boolean} ms 是否是 含有毫秒
+ * @return 相印时间
+ */
+ function duration(fmt, timestamp, ms) {
+ if ( fmt === void 0 ) fmt = 'D天h:i:s';
+ if ( timestamp === void 0 ) timestamp = 0;
+ if ( ms === void 0 ) ms = true;
+
+ var conversion = {
+ y: 12,
+ m: 30.4375,
+ d: 24,
+ h: 60,
+ i: 60,
+ s: 1000,
+ v: 1000,
+ };
+ var tChars = {
+ y: function () { return tChars.Y(); }, // 当前剩余年数,
+ Y: function () { return Math.floor(tChars.M() / conversion.y); }, // 总剩余年数,
+
+ m: function () { return pad(tChars.n(), 2); }, // 当前剩余月数(有前导零)
+ n: function () { return tChars.M() % conversion.y; }, // 当前剩余月数(无前导零)
+ M: function () { return Math.floor(tChars.D() / conversion.m); }, // 总剩余月数
+
+ d: function () { return pad(tChars.j(), 2); }, // 当前剩余天数(有前导零)
+ j: function () { return Math.floor(tChars.D() % conversion.m); }, // 当前剩余天数(无前导零)。
+ D: function () { return Math.floor(tChars.H() / conversion.d); }, // 总剩余天数
+
+ h: function () { return pad(tChars.g(), 2); }, // 当前小时剩余数(有前导零)
+ g: function () { return Math.floor(tChars.H() % conversion.d); }, // 当前小时剩余数(无前导零)
+ H: function () { return Math.floor(tChars.I() / conversion.h); }, // 总剩余小时数
+
+ i: function () { return pad(Math.floor(tChars.I() % conversion.h),2); }, // 当前分钟剩余点数
+ I: function () { return Math.floor(tChars.S() / conversion.i); }, // 总剩余分钟数
+
+ s: function () { return pad(Math.floor(tChars.S() % conversion.i), 2); }, // 当前秒钟剩余点数
+ S: function () { return Math.floor(tChars.V() / conversion.s); }, // 总剩余秒数
+
+ v: function () { return pad(Math.floor(tChars.V() % conversion.s), 3); }, // 当前毫秒剩余数
+ V: function () { return ms ? new Date(timestamp)-0 : new Date(timestamp) * conversion.v; }, // 总剩余毫秒数
+ };
+
+ return fmt.replace(/(\\?([a-z]))/ig, function (res, key) {
+ var result = '';
+ if (res !== key) {
+ result = key;
+ } else {
+ if (tChars[key]) {
+ result = tChars[key]();
+ } else {
+ result = key.replace('\\', '');
+ }
+ }
+ return result;
+ });
+ }
+
+ /**
+ * 计算持续时间
+ * @param fmt
+ * @param timestamp1
+ * @param timestamp2
+ * @param ms
+ * @return 相印时间
+ */
+ function countTime(fmt, timestamp1, timestamp2, ms) {
+ if ( fmt === void 0 ) fmt = 'D天h:i:s';
+ if ( timestamp1 === void 0 ) timestamp1 = 0;
+ if ( timestamp2 === void 0 ) timestamp2 = 0;
+ if ( ms === void 0 ) ms = true;
+
+ var count = new Date(timestamp1) - new Date(timestamp2) || 0;
+ return duration(fmt, Math.abs(count), ms);
+ }
+
+ var isDate = function (d) {
+ return new Date(d).toString() !== 'Invalid Date';
+ };
+
+ /**
+ * @memberOf kit
+ * @param fmt
+ * @param now
+ * @param ms
+ * @return {string}
+ */
+ var date = function (fmt, now, ms) {
+ if ( fmt === void 0 ) fmt = 'Y-m-d';
+ if ( now === void 0 ) now = new Date;
+ if ( ms === void 0 ) ms = true;
+
+ now = isDate(this)
+ ? this
+ : isDate(now)
+ ? new Date(now)
+ : new Date;
+ if (ms === false) { now = new Date(now * 1000); }
+
+ if (!isDate(now)) { throw Error((function (D) {
+ return '' +
+ '参数2不正确,须传入 “日期时间对象”,或 “Unix时间戳” 或 “时间戳字符串”。\n可以参考以下值:\n' +
+ " \"" + D + "\"\n" +
+ " \"" + (D.toUTCString()) + "\"\n" +
+ " " + (D.getTime()) + " -- 推荐\n";
+ })(new Date())); }
+
+
+ // 模板字串替换函数
+ var tChars = {
+ // 日
+ d: function () { return pad(tChars.j(), 2); },
+ k: function () { return textReplace(tChars.j()); }, // 中文日(1.3.2+), PHP中无此功能
+ D: function () { return tChars.l().substr(0, 3); },
+ j: function () { return now.getDate(); },
+ lt: function () { return lunarTime[Math.floor((tChars.G() >= 23 ? 0 : tChars.G() + 1) / 2)]; },
+ lg: function () { return tChars.G() > 18 || tChars.G() < 5 ? Math.ceil((tChars.G() < 19 ? tChars.G() + 24 : tChars.G()) / 2) - 9 : ''; },
+ lG: function () { return ("" + (tChars.lg() ? baseFigure[tChars.lg()] + '更' : '')); },
+ lk: function () { return lunarKe[Math.floor(((tChars.U() + 60 * 60) % (60 * 60 * 2)) / 60 / 15)]; },
+ fh: function () { return (getFestival(tChars.Y() + tChars.m() + tChars.d()).cn || []).join(); },
+ lh: function () { return (getFestival(tChars.Y() + tChars.m() + tChars.d()).en || []).join(); },
+ l: function () { return longDays[tChars.w()]; },
+ N: function () { return tChars.w() === 0 ? 7 : tChars.w(); },
+ S: function () { return txt_ordin[tChars.j()] ? txt_ordin[tChars.j()] : 'th'; },
+ w: function () { return now.getDay(); },
+ K: function () { return weekDay[tChars.w()]; }, // 中文周(1.3.2+)
+ z: function () { return Math.ceil((now - new Date(tChars.Y() + '/1/1')) / (60 * 60 * 24 * 1e3)); },
+
+ // 周
+ W: function () {
+ var inYearDay = tChars.z(); // 当前年份中的第n天
+ var yDay = new Date(tChars.Y() + '1/1').getDay(); // 第一天周几
+ var diffDay = (yDay > 0) - 0;
+ return Math.ceil((inYearDay - yDay) / 7) + diffDay;
+ },
+
+ // 月
+ F: function () { return txt_months[tChars.n()]; },
+ f: function () { return textReplace(tChars.n()); }, // 中文月(1.3.2+), PHP中无此功能
+ m: function () { return pad(tChars.n(), 2); },
+ M: function () { return tChars.F().substr(0, 3); },
+ n: function () { return now.getMonth() + 1; },
+ t: function () {
+ var year = tChars.Y();
+ var nextMonth = tChars.n();
+ if (nextMonth === 12) {
+ year += 1;
+ nextMonth = 0;
+ }
+ return new Date(year, nextMonth, 0).getDate();
+ },
+ lq: function () { return Math.ceil((tChars.n() - 0) / 3); }, // 季度数字
+ lQ: function () { return baseFigure[tChars.lq()]; }, // 季度汉字(1.6.0+)
+ q: function () { return txt_ordin[tChars.lq()] ? tChars.lq() + '' + txt_ordin[tChars.lq()] : tChars.lq() + 'th'; }, // 季度英文缩写
+ Q: function () { return ordinal[tChars.lq() - 1]; }, // 李度英文(1.6.0+)
+
+ // 年
+ L: function () { return Number(tChars.Y() % 400 === 0 || (tChars.Y() % 100 !== 0 && tChars.Y() % 4 === 0)); },
+ o: function () {
+ var yearWeek = new Date(tChars.Y(), 0, 1).getDay();
+ var diffTime = 60 * 60 * 24 * 1000 * (7 - yearWeek);
+ var timestramp = yearWeek > 3 ? now.getTime() - diffTime : now.getTime();
+ return new Date(timestramp).getFullYear();
+
+ },
+ Y: function () { return now.getFullYear(); },
+ y: function () { return (tChars.Y() + '').slice(2); },
+ C: function () { return textReplace2(tChars.Y()); }, // 中文年(1.3.2+), PHP中无此功能
+
+ // 时间
+ a: function () { return tChars.G() > 11 ? 'pm' : 'am'; },
+ A: function () { return tChars.a().toUpperCase(); },
+ B: function () {
+ var off = (now.getTimezoneOffset() + 60) * 60;
+ var theSeconds = (tChars.G() * 3600) + (now.getMinutes() * 60) + now.getSeconds() + off;
+ var beat = Math.floor(theSeconds / 86.4);
+ // beat > 1000 ? beat -= 1000 : beat += 1000
+ if (beat > 1000) { beat -= 1000; }
+ if (beat < 0) { beat += 1000; }
+
+ return pad(beat, 3);
+ },
+ g: function () { return tChars.G() % 12 || 12; },
+ G: function () { return now.getHours(); },
+ h: function () { return pad(tChars.g(), 2); },
+ H: function () { return pad(tChars.G(), 2); },
+ i: function () { return pad(now.getMinutes(), 2); },
+ s: function () { return pad(now.getSeconds(), 2); },
+ u: function () { return tChars.v() + pad(Math.floor(Math.random() * 1000), 3); },
+ v: function () { return (now.getTime() + '').substr(-3); },
+
+ // 时区
+ e: function () { return Intl.DateTimeFormat().resolvedOptions().timeZone; },
+ I: function () {
+ var DST = null;
+ for (var i = 0; i < 12; ++i) {
+ var d = new Date(tChars.Y(), i, 1);
+ var offset = d.getTimezoneOffset();
+
+ if (DST === null) { DST = offset; }
+ else if (offset < DST) {
+ DST = offset;
+ break;
+ } else if (offset > DST) { break; }
+ }
+ return (now.getTimezoneOffset() === DST) | 0;
+ },
+ O: function () { return (now.getTimezoneOffset() > 0 ? '-' : '+') + pad(Math.abs(now.getTimezoneOffset() / 60 * 100), 4); },
+ P: function () { return tChars.O().match(/[+-]?\d{2}/g).join(':'); },
+ T: function () {
+ var tz = now.toLocaleTimeString(navigator.language, { timeZoneName: 'short' }).split(/\s/);
+ return tz[tz.length - 1];
+ },
+ Z: function () { return -(now.getTimezoneOffset() * 60); },
+
+ // 完整日期时间
+ c: function () { return tChars.Y() + '-' + tChars.m() + '-' + tChars.d() + 'T' + tChars.h() + ':' + tChars.i() + ':' + tChars.s() + tChars.P(); },
+ r: function () { return now.toString(); },
+ U: function () { return Math.round(now.getTime() / 1000); },
+ };
+
+ if (fmt === 'json' || fmt === 'all' || fmt === -1 || fmt === '-1') {
+ var json = {};
+ Object.keys(tChars).forEach(function (res, idx) { return json[res] = tChars[res](); });
+ return json;
+ }
+ return fmt.replace(/\\?(([lf][a-z])|([a-z]))/ig, function (res, key) {
+ var result = '';
+ if (res !== key) {
+ result = key;
+ } else {
+ if (tChars[key]) {
+ result = tChars[key]();
+ } else {
+ result = key.replace('\\', '');
+ }
+ }
+ return result;
+ });
+ };
+
+ defP(Date.prototype, 'format', date);
+
+ defP(date, 'version', '1.7.15');
+ defP(date, 'description', function () { return (console.info('%cdate-php使用说明:\n' +
+ '已经废弃,查看使用说明请移步这里\nhttps://github.com/toviLau/date-php/blob/master/README.md'
+ , 'color:#c63'
+ )); });
+ date.duration = duration;
+
+ date.countTime = countTime;
+
+ return date;
+ }));
+
+ return module.exports;
+});
+
diff --git a/assets/logger/logger.css b/assets/logger/logger.css
new file mode 100644
index 0000000..00b23b5
--- /dev/null
+++ b/assets/logger/logger.css
@@ -0,0 +1,99 @@
+:root {
+ --logger-color-emergency: hsl(0, 100%, 55%);
+ --logger-color-alert: hsl(192, 100%, 98%);
+ --logger-color-critical: hsl(0, 100%, 55%);
+ --logger-color-error: hsl(0, 100%, 55%);
+ --logger-color-warning: hsl(31, 100%, 55%);
+ --logger-color-notice: #909090;
+ --logger-color-info: hsl(205, 100%, 61%);
+ --logger-color-debug: #909090;
+ --logger-color-success: #8bc34a;
+}
+.kit-logger, #kit-logger {
+ margin: 0;
+ padding: 5px;
+ font-family: monospace;
+ background: hsla(0, 0%, 11%, 1);
+ color: #909090;
+ height: 100%;
+ overflow-y: scroll !important;
+ word-break: break-all;
+ display: block;
+}
+.kit-logger--fixed {
+ position: sticky;
+ bottom: 0;
+ height: 30vh;
+}
+bx_kit_log {
+ margin: 0;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ -webkit-align-content: flex-start;
+ -ms-flex-line-pack: start;
+ align-content: flex-start;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ white-space: pre-line;
+
+ font-size: 12px !important;
+ line-height: 14px !important;
+}
+bx_kit_log_value * {
+ color: inherit;
+}
+bx_kit_log_msg {
+
+}
+bx_kit_log_key {
+ min-width: 25px;
+ padding-right: 5px;
+ white-space: nowrap;
+ color: var(--logger-color-key, #909090);
+}
+bx_kit_log_key:empty {
+ display: none;
+}
+bx_kit_log_lvl {
+ min-width: 25px;
+}
+bx_kit_log_value {
+ flex: 1 0 0;
+ white-space: pre-wrap;
+ color: var(--logger-color-value, #c1c1c1);
+}
+bx_kit_log_value * {
+ font-size: inherit !important;
+ line-height: inherit !important;
+ color: inherit !important;
+ white-space: inherit !important;
+}
+
+
+.kit-logger-row--error {
+ --logger-color-key: var(--logger-color-error);
+ --logger-color-value: var(--logger-color-error);
+}
+.kit-logger-row--info {
+ --logger-color-key: var(--logger-color-info);
+ --logger-color-value: var(--logger-color-info);
+}
+.kit-logger-row--warning {
+ --logger-color-key: var(--logger-color-warning);
+ --logger-color-value: var(--logger-color-warning);
+}
+.kit-logger-row--success {
+ --logger-color-key: var(--logger-color-success);
+ --logger-color-value: var(--logger-color-success);
+}
\ No newline at end of file
diff --git a/assets/logger/logger.js b/assets/logger/logger.js
new file mode 100644
index 0000000..a26a5b8
--- /dev/null
+++ b/assets/logger/logger.js
@@ -0,0 +1,159 @@
+/** @module logger */
+__PluginManager__.register('Logger', function(module, exports, require, global){
+
+ function makeNode(html = '') {
+ var nodeWrap = document.createElement('div');
+ nodeWrap.innerHTML = html;
+ var r = nodeWrap.firstElementChild;
+ r.remove();
+ return r;
+ }
+ var lightMap = [
+ {class: '', keys: []},
+ {class: 'text-danger', keys: []},
+ {class: 'text-secondary', keys: []},
+ ];
+ var getLightClass = function(key) {
+ var addClass = '', ar;
+ for(var i=0; i < lightMap.length; i++){
+ ar = lightMap[i]['keys'];
+ addClass = ar.includes(String(key))?lightMap[i]['class']:addClass;
+ }
+ return addClass;
+ };
+ var collectionTemplater = '
';
+ // function dump(value) {
+ // var rArray = [];
+ // if(value === null) {
+ // rArray[0] = 'null';
+ // } else {
+ // rArray[0] = String(typeof value);
+ // rArray[1] = emptyPHP(value)?'empty':'';
+ // }
+ // return rArray.join(' ');
+ // };
+ function getRowNode(level, key, value, opClass){
+ if(opClass) {
+ opClass = ' kit-logger-row--'+opClass;
+ }
+ var i = 0, lvlTemplate = '', setStyle = '';
+ level = Number(level);
+ key = String(key);
+ value = String(value);
+ for(i = 0; i < level; i++){
+ lvlTemplate += '';
+ }
+ var result = ''+lvlTemplate+''+key+''+value+'';
+
+ return makeNode(result);
+ }
+
+ function args2array(arguments) {
+ var args = [];
+ for (var i = 0; i < arguments.length; i++) {
+ args.push(arguments[i]);
+ }
+ return args;
+ }
+
+ /**
+ * @class Logger
+ * @memberOf kit
+ */
+ var Logger = function() {
+ this.collection = undefined;
+ };
+ /**
+ * @param node {HTMLElement}
+ */
+ Logger.prototype.setCollection = function (node) {
+ /**
+ * @type {HTMLElement}
+ */
+ this.collection = node || document.getElementById('kit-logger') || document.querySelector('.kit-logger') || makeNode(collectionTemplater);
+
+ if(!this.collection.parentElement) {
+ document.body.appendChild(this.collection)
+ }
+ };
+ Logger.prototype.__row = function(message, lvl = 0, opClass = '') {
+ if (!this.collection) {
+ this.setCollection();
+ }
+ var log = this.collection;
+ var k = 0, j = 0, i = 0, m = 0, rowNode;
+
+ if(typeof message == 'object') {
+ for(k in message) {
+ log.appendChild(getRowNode(lvl, k, message[k], opClass));
+ if(typeof message[k] == 'object') {
+ for(j in message[k]) {
+ log.appendChild(getRowNode(lvl+1, j, message[k][j]));
+ if(typeof message[k][j] == 'object') {
+ for(i in message[k][j]) {
+ log.appendChild(getRowNode(lvl+2, i, message[k][j][i]));
+ if(typeof message[k][j][i] == 'object') {
+ for(m in message[k][j][i]) {
+ log.appendChild(getRowNode(lvl+3, m, message[k][j][i][m]));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ log.appendChild(getRowNode(lvl, '', message, opClass));
+ }
+ log.scrollTop = log.scrollHeight;
+ };
+
+ Logger.prototype.__log = function(lvl, type, message, context){
+ lvl = Number(lvl);
+ var opClass = '';
+ if(arguments.length >= 2) opClass = type;
+ if(arguments.length >= 3)
+ this.__row(message, lvl, opClass);
+ if(arguments.length >= 4)
+ this.__row(context, lvl+1);
+ };
+
+ Logger.prototype.emergency = function (message, context) {
+ this.__log.apply(this, [0, 'emergency'].concat(args2array(arguments)));
+ };
+ Logger.prototype.alert = function (message, context) {
+ this.__log.apply(this, [0, 'alert'].concat(args2array(arguments)));
+ };
+ Logger.prototype.critical = function (message, context) {
+ this.__log.apply(this, [0, 'critical'].concat(args2array(arguments)));
+ };
+ Logger.prototype.error = function (message, context) {
+ this.__log.apply(this, [0, 'error'].concat(args2array(arguments)));
+ };
+ Logger.prototype.warning = function (message, context) {
+ this.__log.apply(this, [0, 'warning'].concat(args2array(arguments)));
+ };
+ Logger.prototype.notice = function (message, context) {
+ this.__log.apply(this, [0, 'notice'].concat(args2array(arguments)));
+ };
+ Logger.prototype.info = function (message, context) {
+ this.__log.apply(this, [0, 'info'].concat(args2array(arguments)));
+ };
+ Logger.prototype.debug = function (message, context) {
+ this.__log.apply(this, [0, 'debug'].concat(args2array(arguments)));
+ };
+ Logger.prototype.success = function (message, context) {
+ this.__log.apply(this, [0, 'success'].concat(args2array(arguments)));
+ };
+ Logger.prototype.log = function (lvl = 0, message = '', context, type) {
+ lvl = Number(lvl);
+ var opClass = '';
+ if(arguments.length >= 4) opClass = type;
+ if(arguments.length >= 2)
+ this.__row(message, lvl, opClass);
+ if(arguments.length >= 3)
+ this.__row(context, lvl+1, opClass);
+ };
+
+ return module.exports = Logger;
+});
diff --git a/assets/menu/menu.js b/assets/menu/menu.js
index f23cc98..5ef48c6 100644
--- a/assets/menu/menu.js
+++ b/assets/menu/menu.js
@@ -121,12 +121,14 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
};
Menu.prototype.setPosition = function () {
- //console.log('setPosition ' + this.id);
+ //console.log('setPosition', this.id);
if(!(this.getParent() instanceof Element)) {
console.warn('Menu.options.parent NOT instanceof Element');
return false;
}
-
+ if(!support.isA(this.align, align.Class)){
+ return;
+ }
this.node.style.position = 'absolute';
this.node.style.width = 'fit-content';
@@ -163,7 +165,7 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
*/
Menu.prototype.getParentMenu = function() {
var p = this.getParent();
- if(p instanceof Element && p.hasOwnProperty('kit') && p.kit[MENU_ITEM_PLUGIN_NAME] instanceof MenuItemClass) {
+ if(p instanceof Element && p.hasOwnProperty('kit') && p.kit[MENU_ITEM_PLUGIN_NAME] instanceof MenuItem) {
return p.kit[MENU_ITEM_PLUGIN_NAME].getMenu();
}
};
@@ -181,9 +183,9 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
* @param options {kitMenuItemOptions}
* @return {MenuItem}
*/
- Menu.prototype.addItem = function (options = {}) {
+ Menu.prototype.addItem = function (options = {}){
var id;
- if(options instanceof MenuItemClass) {
+ if(options instanceof MenuItem) {
options.parentId = this.id;
id = options.options.id;
this.itemList[id] = options;
@@ -192,25 +194,26 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
options.id = support.uniqueId(8);
}
id = options.id;
- this.itemList[id] = (new this.MenuItem(this.id)).setOptions(options).init();
+ this.itemList[id] = (new MenuItem(this.id)).setOptions(options).init();
}
return this.itemList[id];
};
Menu.prototype.addItemList = function(itemList = []){
+ var result = [];
itemList.forEach((function(element, index, array){
- this.addItem(element);
+ result.push(this.addItem(element));
}).bind(this));
- return this;
+ return result;
};
Menu.prototype.sortItems = function() {
this.itemList = Object.entries(this.itemList)
.sort(function(a, b){
- return a[1].options.sort >>> 0 - b[1].options.sort >>> 0;
+ return Number(a[1].options.sort) - Number(b[1].options.sort);
})
.reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
};
Menu.prototype.render = function() {
- //console.log('Menu: render');
+ //console.log('Menu: render', this.id);
this.sortItems();
this.node.innerHTML = '';
if(global.config.debug) {
@@ -334,315 +337,315 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
return this;
};
- var MenuItemClass = function () {
- function MenuItem(parentId) {
- var _thisMenuItem = this;
- this.parentId = Number(parentId);
- this.node = Element;
- this.bInit = false;
- this.bActive = false;
- this.child = null;
+ /**
+ * @class kit.menu.MenuItem
+ * @param parentId
+ */
+ function MenuItem(parentId) {
+ var _thisMenuItem = this;
+ this.parentId = Number(parentId);
+ this.node = Element;
+ this.bInit = false;
+ this.bActive = false;
+ this.child = null;
- /**
- * @class kitMenuItemOptions
- */
- this.options = {
- id: '',
- icon: libModule.svg.options,
- arrow: libModule.svg.arrowMenu,
- label: 'menu',
- href: 'javascript:void(0);',
- class: '',
- sort: 500,
- visible: true,
- /** @type {kitMenuItemHandler} */
- hover: this.defaultHoverHandler,
- /** @type {kitMenuItemHandler} */
- click: this.defaultClickHandler,
- dblclick: this.defaultDblClickHandler,
- };
+ /**
+ * @class kitMenuItemOptions
+ */
+ this.options = {
+ id: '',
+ icon: libModule.svg.options,
+ arrow: libModule.svg.arrowMenu,
+ label: 'menu',
+ href: 'javascript:void(0);',
+ class: '',
+ sort: 500,
+ visible: true,
+ /** @type {kitMenuItemHandler} */
+ hover: this.defaultHoverHandler,
+ /** @type {kitMenuItemHandler} */
+ click: this.defaultClickHandler,
+ dblclick: this.defaultDblClickHandler,
+ };
- this.handleEvent = function(event) {
- event.stopPropagation();
- switch(event.type) {
- case 'mouseover':
- this.options.hover(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
- break;
- case 'click':
- this.options.click(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
- break;
- case 'dblclick':
- this.options.dblclick(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
- break;
+ this.handleEvent = function(event) {
+ event.stopPropagation();
+ switch(event.type) {
+ case 'mouseover':
+ this.options.hover(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
+ break;
+ case 'click':
+ this.options.click(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
+ break;
+ case 'dblclick':
+ this.options.dblclick(event, _thisMenuItem, MenuList[_thisMenuItem.parentId]);
+ break;
+ }
+ };
+ this.createNode();
+ }
+
+ /**
+ * @param event {MouseEvent}
+ * @param menuItem {MenuItem}
+ * @param menu {Menu}
+ */
+ MenuItem.prototype.defaultHoverHandler = function (event, menuItem, menu) {
+ console.log('hover: ' + menuItem.options.label);
+ };
+ /**
+ * @param event {MouseEvent}
+ * @param menuItem {MenuItem}
+ * @param menu {Menu}
+ */
+ MenuItem.prototype.defaultClickHandler = function (event, menuItem, menu) {
+ console.log('click: ' + menuItem.options.label);
+ menu.hide();
+ };
+ /**
+ * @param event {MouseEvent}
+ * @param menuItem {MenuItem}
+ * @param menu {Menu}
+ */
+ MenuItem.prototype.defaultDblClickHandler = function (event, menuItem, menu) {
+ console.log('dblclick: ' + menuItem.options.label);
+ };
+
+ MenuItem.prototype.getMenu = function () {
+ return MenuList[this.parentId];
+ };
+
+ MenuItem.prototype.getParent = function () {
+ if(MenuList[this.parentId] instanceof Menu) {
+ return MenuList[this.parentId].node;
+ }
+ return null;
+ };
+
+ MenuItem.prototype.getId = function () {
+ return this.options.id;
+ };
+
+ /**
+ * @returns HTMLElement
+ */
+ MenuItem.prototype.getNode = function () {
+ return this.node;
+ };
+
+ MenuItem.prototype.createNode = function () {
+ this.node = document.createElement('a');
+ this.node.style.position = 'relative';
+ this.node.dataset.parentId = this.parentId;
+ this.node.kit = this.node.kit || {};
+ this.node.kit.menuItem = this;
+ };
+
+ /**
+ * @param content HTMLElement | string
+ * @returns {MenuItem}
+ */
+ MenuItem.prototype.setLabel = function (content = '') {
+ this.options.label = content;
+ var wrap = this.getNodeScopeElementByClassName('kit-menu-item__label');
+ this.setContent(wrap, content);
+ return this;
+ };
+
+ /**
+ * @param href
+ * @returns {MenuItem}
+ */
+ MenuItem.prototype.setHref = function (href = 'javascript:void(0);') {
+ this.options.href = href;
+ this.getNode().setAttribute('href', href);
+ return this;
+ };
+
+ /**
+ * @param content HTMLElement | string
+ * @returns {MenuItem}
+ */
+ MenuItem.prototype.setIcon = function (content = '') {
+ this.options.icon = content;
+ var wrap = this.getNodeScopeElementByClassName('kit-menu-item__icon');
+ this.setContent(wrap, content);
+ return this;
+ };
+
+ /**
+ * @param sort int
+ * @returns {MenuItem}
+ */
+ MenuItem.prototype.setSort = function (sort = 500) {
+ this.options.sort = Number(sort);
+ return this;
+ };
+
+ /**
+ * @param content HTMLElement | string
+ * @returns {MenuItem}
+ */
+ MenuItem.prototype.setArrow = function (content = '') {
+ this.options.arrow = content;
+ var wrap = this.getNodeScopeElementByClassName('kit-menu-item__arrow');
+ this.setContent(wrap, content);
+ return this;
+ };
+ MenuItem.prototype.setId = function (id = '') {
+ if(id) {
+ this.options.id = id;
+ }
+ this.node.id = this.options.id;
+ return this;
+ };
+ MenuItem.prototype.setVisible = function (visible = true) {
+ this.options.visible = visible;
+ this.node.style.display = this.options.visible?'':'none';
+ return this;
+ };
+
+ /**
+ * @param {Menu} menu
+ * @return {MenuItem}
+ */
+ MenuItem.prototype.setChild = function (menu) {
+ if(menu instanceof Menu) {
+ menu.setParent(this.node);
+ menu.init();
+ }
+ else if( Array.isArray(menu) ) {
+ var menuClass;
+ menuClass = new Menu();
+ menu.forEach(function (item, i) {
+ if(typeof item === 'object') {
+ menuClass.addItem(item);
+ }
+ });
+ menuClass.setParent(this.node);
+ menuClass.init();
+ }
+ return this;
+ };
+ MenuItem.prototype.addClass = function (addClass = '') {
+ if(addClass) {
+ this.node.classList.add(addClass);
+ }
+ return this;
+ };
+
+ /**
+ * @param options Object
+ * @return {MenuItem}
+ */
+ MenuItem.prototype.setOptions = function (options = {}) {
+ /**
+ * @type {kitMenuItemOptions}
+ */
+ this.options = Object.assign({}, this.options, options);
+
+ return this;
+ };
+
+ /**
+ * @return {MenuItem}
+ */
+ MenuItem.prototype.render = function () {
+
+ this.setLabel(this.options.label);
+ this.setHref(this.options.href);
+ this.setId(this.options.id);
+ this.addClass(MENU_ITEM_CLASS);
+ this.addClass(this.options.class);
+ this.setChild(this.options.child);
+ this.setIcon(this.options.icon);
+ this.setArrow(this.options.arrow);
+ this.setVisible(this.options.visible);
+ this.setSort(this.options.sort);
+
+ return this;
+ };
+
+ MenuItem.prototype.init = function () {
+
+ if(this.bInit) {
+ return this;
+ }
+ this.render();
+
+ this.node.removeEventListener('click', this, false);
+ this.node.removeEventListener('dblclick', this, false);
+ this.node.addEventListener('click', this, false);
+ this.node.addEventListener('dblclick', this, false);
+
+ this.bInit = true;
+ return this;
+ };
+
+ MenuItem.prototype.reInit = function () {
+
+ this.render();
+
+ this.node.removeEventListener('click', this, false);
+ this.node.removeEventListener('dblclick', this, false);
+ this.node.addEventListener('click', this, false);
+ this.node.addEventListener('dblclick', this, false);
+
+ return this;
+ };
+
+ MenuItem.prototype.remove = function () {
+ this.node.removeEventListener('click', this, false);
+ this.node.removeEventListener('dblclick', this, false);
+ var id = this.options.id;
+ //console.log('remove item' + id);
+ setTimeout((function(parentId, id){
+ return function() {
+ if(MenuList.hasOwnProperty(parentId) && MenuList[parentId].itemList.hasOwnProperty(id)) {
+ delete MenuList[parentId].itemList[id];
+ MenuList[parentId].init();
}
};
- this.createNode();
+ })(this.parentId, this.options.id),0);
+ };
+
+ /**
+ * @param className
+ * @returns HTMLElement
+ */
+ MenuItem.prototype.getNodeScopeElementByClassName = function(className = ''){
+ var wrap;
+ this.node && (wrap = this.node.querySelector(':scope > .' + className));
+
+ if(!wrap) {
+ wrap = document.createElement('div');
+ wrap.classList.add(className);
+ this.node.append(wrap);
}
+ return wrap;
+ };
- /**
- * @param event {MouseEvent}
- * @param menuItem {MenuItem}
- * @param menu {Menu}
- */
- MenuItem.prototype.defaultHoverHandler = function (event, menuItem, menu) {
- console.log('hover: ' + menuItem.options.label);
- };
- /**
- * @param event {MouseEvent}
- * @param menuItem {MenuItem}
- * @param menu {Menu}
- */
- MenuItem.prototype.defaultClickHandler = function (event, menuItem, menu) {
- console.log('click: ' + menuItem.options.label);
- menu.hide();
- };
- /**
- * @param event {MouseEvent}
- * @param menuItem {MenuItem}
- * @param menu {Menu}
- */
- MenuItem.prototype.defaultDblClickHandler = function (event, menuItem, menu) {
- console.log('dblclick: ' + menuItem.options.label);
- };
-
- MenuItem.prototype.getMenu = function () {
- return MenuList[this.parentId];
- };
-
- MenuItem.prototype.getParent = function () {
- if(MenuList[this.parentId] instanceof Menu) {
- return MenuList[this.parentId].node;
- }
- return null;
- };
-
- MenuItem.prototype.getId = function () {
- return this.options.id;
- };
-
- /**
- * @returns HTMLElement
- */
- MenuItem.prototype.getNode = function () {
- return this.node;
- };
-
- MenuItem.prototype.createNode = function () {
- this.node = document.createElement('a');
- this.node.style.position = 'relative';
- this.node.dataset.parentId = this.parentId;
- this.node.kit = this.node.kit || {};
- this.node.kit.menuItem = this;
- };
-
- /**
- * @param content HTMLElement | string
- * @returns {MenuItem}
- */
- MenuItem.prototype.setLabel = function (content = '') {
- this.options.label = content;
- var wrap = this.getNodeScopeElementByClassName('kit-menu-item__label');
- this.setContent(wrap, content);
- return this;
- };
-
- /**
- * @param href
- * @returns {MenuItem}
- */
- MenuItem.prototype.setHref = function (href = 'javascript:void(0);') {
- this.options.href = href;
- this.getNode().setAttribute('href', href);
- return this;
- };
-
- /**
- * @param content HTMLElement | string
- * @returns {MenuItem}
- */
- MenuItem.prototype.setIcon = function (content = '') {
- this.options.icon = content;
- var wrap = this.getNodeScopeElementByClassName('kit-menu-item__icon');
- this.setContent(wrap, content);
- return this;
- };
-
- /**
- * @param sort int
- * @returns {MenuItem}
- */
- MenuItem.prototype.setSort = function (sort = 500) {
- this.options.sort = Number(sort);
- return this;
- };
-
- /**
- * @param content HTMLElement | string
- * @returns {MenuItem}
- */
- MenuItem.prototype.setArrow = function (content = '') {
- this.options.arrow = content;
- var wrap = this.getNodeScopeElementByClassName('kit-menu-item__arrow');
- this.setContent(wrap, content);
- return this;
- };
- MenuItem.prototype.setId = function (id = '') {
- if(id) {
- this.options.id = id;
- }
- this.node.id = this.options.id;
- return this;
- };
- MenuItem.prototype.setVisible = function (visible = true) {
- this.options.visible = visible;
- this.node.style.display = this.options.visible?'':'none';
- return this;
- };
-
- /**
- * @param {Menu} menu
- * @return {MenuItem}
- */
- MenuItem.prototype.setChild = function (menu) {
- if(menu instanceof Menu) {
- menu.setParent(this.node);
- menu.init();
- }
- else if( Array.isArray(menu) ) {
- var menuClass;
- menuClass = new Menu();
- menu.forEach(function (item, i) {
- if(typeof item === 'object') {
- menuClass.addItem(item);
- }
- });
- menuClass.setParent(this.node);
- menuClass.init();
- }
- return this;
- };
- MenuItem.prototype.addClass = function (addClass = '') {
- if(addClass) {
- this.node.classList.add(addClass);
- }
- return this;
- };
-
- /**
- * @param options Object
- * @return {MenuItem}
- */
- MenuItem.prototype.setOptions = function (options = {}) {
-
- this.options = Object.assign({}, this.options, options);
-
- return this;
- };
-
- /**
- * @return {MenuItem}
- */
- MenuItem.prototype.render = function () {
-
- this.setLabel(this.options.label);
- this.setHref(this.options.href);
- this.setId(this.options.id);
- this.addClass(MENU_ITEM_CLASS);
- this.addClass(this.options.class);
- this.setChild(this.options.child);
- this.setIcon(this.options.icon);
- this.setArrow(this.options.arrow);
- this.setVisible(this.options.visible);
- this.setSort(this.options.sort);
-
- return this;
- };
-
- MenuItem.prototype.init = function () {
-
- if(this.bInit) {
- return this;
- }
- this.render();
-
- this.node.removeEventListener('click', this, false);
- this.node.removeEventListener('dblclick', this, false);
- this.node.addEventListener('click', this, false);
- this.node.addEventListener('dblclick', this, false);
-
- this.bInit = true;
- return this;
- };
-
- MenuItem.prototype.reInit = function () {
-
- this.render();
-
- this.node.removeEventListener('click', this, false);
- this.node.removeEventListener('dblclick', this, false);
- this.node.addEventListener('click', this, false);
- this.node.addEventListener('dblclick', this, false);
-
- return this;
- };
-
- MenuItem.prototype.remove = function () {
- this.node.removeEventListener('click', this, false);
- this.node.removeEventListener('dblclick', this, false);
- var id = this.options.id;
- //console.log('remove item' + id);
- setTimeout((function(parentId, id){
- return function() {
- if(MenuList.hasOwnProperty(parentId) && MenuList[parentId].itemList.hasOwnProperty(id)) {
- delete MenuList[parentId].itemList[id];
- MenuList[parentId].init();
- }
- };
- })(this.parentId, this.options.id),0);
- };
-
- /**
- * @param className
- * @returns HTMLElement
- */
- MenuItem.prototype.getNodeScopeElementByClassName = function(className = ''){
- var wrap;
- this.node && (wrap = this.node.querySelector(':scope > .' + className));
-
- if(!wrap) {
- wrap = document.createElement('div');
- wrap.classList.add(className);
- this.node.append(wrap);
- }
- return wrap;
- };
-
- /**
- * @param node HTMLElement
- * @param content HTMLElement | string
- * @param isText boolean
- * @return boolean
- */
- MenuItem.prototype.setContent = function(node, content, isText = false){
- if(!(node instanceof Element)) {
- return false;
- }
- while (node.firstChild) {
- node.removeChild(node.firstChild);
- }
- if((content instanceof Element) || isText) {
- node.append(content);
- } else {
- node.innerHTML = content;
- }
- return true;
- };
-
-
- return MenuItem;
- }();
- Menu.prototype.MenuItem = MenuItemClass;
+ /**
+ * @param node HTMLElement
+ * @param content HTMLElement | string
+ * @param isText boolean
+ * @return boolean
+ */
+ MenuItem.prototype.setContent = function(node, content, isText = false){
+ if(!(node instanceof Element)) {
+ return false;
+ }
+ while (node.firstChild) {
+ node.removeChild(node.firstChild);
+ }
+ if((content instanceof Element) || isText) {
+ node.append(content);
+ } else {
+ node.innerHTML = content;
+ }
+ return true;
+ };
var getInstance = function(options = {}, items = []) {
@@ -786,6 +789,7 @@ __PluginManager__.register('menu',function(module, exports, require, global) {
* @memberOf kit
*/
var menu = {
+ MenuItem: MenuItem,
Class: Menu,
getInstance: getInstance,
reInitAllMenu: reInitAllMenu,
diff --git a/assets/support/support.js b/assets/support/support.js
index 50ba7c4..0a1e7c6 100644
--- a/assets/support/support.js
+++ b/assets/support/support.js
@@ -52,6 +52,13 @@ __PluginManager__.register('support', function(module, exports, require, global)
val === 0 ||
val === false;
}
+ function emptyEx(val) {
+ return empty(val) ||
+ (isObject(val) && (function () {
+ for(v in val) return false;
+ return true;
+ })());
+ }
function typeOf(value) {
return typeof value;
}
@@ -105,6 +112,9 @@ __PluginManager__.register('support', function(module, exports, require, global)
}
}
};
+ function isA(o,c){
+ return null!=c&&"undefined"!=typeof Symbol&&c[Symbol.hasInstance]?!!c[Symbol.hasInstance](o):o instanceof c
+ }
/**
@@ -127,6 +137,7 @@ __PluginManager__.register('support', function(module, exports, require, global)
isElement,
getNode,
extend,
+ isA
};
return module.exports = support;
diff --git a/assets/testing/testing.js b/assets/testing/testing.js
new file mode 100644
index 0000000..eb49a62
--- /dev/null
+++ b/assets/testing/testing.js
@@ -0,0 +1,32 @@
+/** @module testing */
+__PluginManager__.register('testing', function(module, exports, require, global){
+
+ /**
+ * @constructor
+ */
+ function Unit() {
+ this.logger = new kit.Logger();
+ }
+
+ Unit.prototype.assertSame = function (expected, actual, message) {
+ if(expected === actual) {
+ this.logger.success({pass: message});
+ return true;
+ }
+ if(expected == actual) {
+ this.logger.warning({warn: message}, {expected: expected, actual: actual});
+ return false;
+ }
+ this.logger.error({fail: message}, {expected: expected, actual: actual});
+ return false;
+ };
+
+ /**
+ * @memberOf kit
+ */
+ var testing = {
+ Unit,
+ };
+
+ return module.exports = testing;
+});
diff --git a/templates/input.php b/templates/input.php
index 5735dc4..e137688 100644
--- a/templates/input.php
+++ b/templates/input.php
@@ -60,8 +60,7 @@ if($isHint) {
]);
}
?>
- autocomplete="off"
- >
+ autocomplete="off">
if($isHint){
app()->service()->templater()->render('kit:field/hint', ['TITLE' => $arParams['HINT']]);
}
diff --git a/tests/align.php b/tests/alignTest.php
similarity index 100%
rename from tests/align.php
rename to tests/alignTest.php
diff --git a/tests/cheatsheet.php b/tests/cheatsheetTest.php
similarity index 100%
rename from tests/cheatsheet.php
rename to tests/cheatsheetTest.php
diff --git a/tests/dateTest.php b/tests/dateTest.php
new file mode 100644
index 0000000..1e7acbd
--- /dev/null
+++ b/tests/dateTest.php
@@ -0,0 +1,43 @@
+
+
+if(\Bitrix\Main\Loader::includeModule('wt.core')) {
+ app()->service()->assets()->setPlugins([
+ 'kit:config',
+ 'kit:flex-kit',
+ 'kit:core',
+ 'kit:bsCore',
+ 'kit:collapse',
+ 'kit:site',
+ 'kit:toolkit',
+ 'kit:theme',
+ ])->render();
+}
+$APPLICATION->ShowHead();
+
+?>
+
+
+
+
+?>
\ No newline at end of file
diff --git a/tests/flex-kit.php b/tests/flex-kitTest.php
similarity index 100%
rename from tests/flex-kit.php
rename to tests/flex-kitTest.php
diff --git a/tests/index.php b/tests/index.php
index ac0d9f2..6343ac7 100644
--- a/tests/index.php
+++ b/tests/index.php
@@ -1,13 +1,17 @@
+
\ No newline at end of file
diff --git a/tests/kit.Collection.php b/tests/kit.CollectionTest.php
similarity index 100%
rename from tests/kit.Collection.php
rename to tests/kit.CollectionTest.php
diff --git a/tests/loggerTest.php b/tests/loggerTest.php
new file mode 100644
index 0000000..76b2ca8
--- /dev/null
+++ b/tests/loggerTest.php
@@ -0,0 +1,53 @@
+
+
+if(\Bitrix\Main\Loader::includeModule('wt.core')) {
+ app()->service()->assets()->setPlugins([
+ 'kit:config',
+ 'kit:flex-kit',
+ 'kit:core',
+ 'kit:bsCore',
+ 'kit:collapse',
+ 'kit:site',
+ 'kit:toolkit',
+ 'kit:theme',
+ ])->render();
+}
+$APPLICATION->ShowHead();
+
+?>
+
+
+
+
+
+
+?>
\ No newline at end of file
diff --git a/tests/menu.php b/tests/menuTest.php
similarity index 97%
rename from tests/menu.php
rename to tests/menuTest.php
index 5145cdc..667c390 100644
--- a/tests/menu.php
+++ b/tests/menuTest.php
@@ -239,7 +239,12 @@ kit.ready(['menu', 'animations'], function () {
window.i = 0;
menuBase.addItem({
label: 'Добавить сюда меню',
- click: function(e, menuItem, menu) {
+ /**
+ * @param e {MouseEvent}
+ * @param menuItem {kit.menu.MenuItem}
+ * @param menu {kit.menu.Class}
+ * */
+ click: function(e, menuItem, menu) {
console.log('клик by ' + menuItem.options.label);
console.log(menu);
menu.addItem({
diff --git a/tests/templater.php b/tests/templaterTest.php
similarity index 100%
rename from tests/templater.php
rename to tests/templaterTest.php
diff --git a/tests/templates.svg.php b/tests/templates.svgTest.php
similarity index 100%
rename from tests/templates.svg.php
rename to tests/templates.svgTest.php
diff --git a/tests/userAction.php b/tests/userActionTest.php
similarity index 100%
rename from tests/userAction.php
rename to tests/userActionTest.php