diff --git a/spm_modules/bui-common/1.1.2/HISTORY.md b/spm_modules/bui-common/1.1.2/HISTORY.md deleted file mode 100644 index b322954..0000000 --- a/spm_modules/bui-common/1.1.2/HISTORY.md +++ /dev/null @@ -1,7 +0,0 @@ -# History - ---- - -## 1.1.0 - -`new` It is the first version of bui-common. diff --git a/spm_modules/bui-common/1.1.2/README.md b/spm_modules/bui-common/1.1.2/README.md deleted file mode 100644 index 867dac1..0000000 --- a/spm_modules/bui-common/1.1.2/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# bui-common - ---- - -[](http://spmjs.io/package/bui-common) - -An awesome spm package! - ---- - -## Install - -``` -$ spm install bui-common --save -``` - -## Usage - -```js -var common = require('bui-common'); -// use common -``` - -## Api - -Here is more details. - diff --git a/spm_modules/bui-common/1.1.2/common.js b/spm_modules/bui-common/1.1.2/common.js deleted file mode 100644 index b7ab2fd..0000000 --- a/spm_modules/bui-common/1.1.2/common.js +++ /dev/null @@ -1,14 +0,0 @@ -var BUI = require('./src/util'); - -BUI.mix(BUI, { - UA: require('./src/ua'), - JSON: require('./src/json'), - Date: require('./src/date'), - Array: require('./src/array'), - KeyCode: require('./src/keycode'), - Observable: require('./src/observable'), - Base: require('./src/base'), - Component: require('./src/component/component') -}); - -module.exports = BUI; diff --git a/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common-debug.js b/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common-debug.js deleted file mode 100644 index ab96338..0000000 --- a/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common-debug.js +++ /dev/null @@ -1,10860 +0,0 @@ -define("bui-common/1.1.2/common-debug", ["jquery"], function(require, exports, module){ -var BUI = require("bui-common/1.1.2/src/util-debug"); - -BUI.mix(BUI, { - UA: require("bui-common/1.1.2/src/ua-debug"), - JSON: require("bui-common/1.1.2/src/json-debug"), - Date: require("bui-common/1.1.2/src/date-debug"), - Array: require("bui-common/1.1.2/src/array-debug"), - KeyCode: require("bui-common/1.1.2/src/keycode-debug"), - Observable: require("bui-common/1.1.2/src/observable-debug"), - Base: require("bui-common/1.1.2/src/base-debug"), - Component: require("bui-common/1.1.2/src/component/component-debug") -}); - -module.exports = BUI; - -}); -define("bui-common/1.1.2/src/util-debug", ["jquery"], function(require, exports, module){ -/** - * @class BUI - * 控件库的工具方法,这些工具方法直接绑定到BUI对象上 - *
- * BUI.isString(str);
- *
- * BUI.extend(A,B);
- *
- * BUI.mix(A,{a:'a'});
- *
- * @singleton
- */
-
-var $ = require('jquery');
-
-//兼容jquery 1.6以下
-(function($) {
- if ($.fn) {
- $.fn.on = $.fn.on || $.fn.bind;
- $.fn.off = $.fn.off || $.fn.unbind;
- }
-})($);
-/**
- * @ignore
- * 处于效率的目的,复制属性
- */
-function mixAttrs(to, from) {
-
- for (var c in from) {
- if (from.hasOwnProperty(c)) {
- to[c] = to[c] || {};
- mixAttr(to[c], from[c]);
- }
- }
-
-}
-//合并属性
-function mixAttr(attr, attrConfig) {
- for (var p in attrConfig) {
- if (attrConfig.hasOwnProperty(p)) {
- if (p == 'value') {
- if (BUI.isObject(attrConfig[p])) {
- attr[p] = attr[p] || {};
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else if (BUI.isArray(attrConfig[p])) {
- attr[p] = attr[p] || [];
- //BUI.mix(/*true,*/attr[p], attrConfig[p]);
- attr[p] = attr[p].concat(attrConfig[p]);
- } else {
- attr[p] = attrConfig[p];
- }
- } else {
- attr[p] = attrConfig[p];
- }
- }
- };
-}
-
-var win = window,
- doc = document,
- objectPrototype = Object.prototype,
- toString = objectPrototype.toString,
- BODY = 'body',
- DOC_ELEMENT = 'documentElement',
- SCROLL = 'scroll',
- SCROLL_WIDTH = SCROLL + 'Width',
- SCROLL_HEIGHT = SCROLL + 'Height',
- ATTRS = 'ATTRS',
- PARSER = 'PARSER',
- GUID_DEFAULT = 'guid';
-
-window.BUI = window.BUI || {};
-
-$.extend(BUI, {
- /**
- * 版本号
- * @memberOf BUI
- * @type {Number}
- */
- version: '1.1.0',
- /**
- * 是否为函数
- * @param {*} fn 对象
- * @return {Boolean} 是否函数
- */
- isFunction: function(fn) {
- return typeof(fn) === 'function';
- },
- /**
- * 是否数组
- * @method
- * @param {*} obj 是否数组
- * @return {Boolean} 是否数组
- */
- isArray: ('isArray' in Array) ? Array.isArray : function(value) {
- return toString.call(value) === '[object Array]';
- },
- /**
- * 是否日期
- * @param {*} value 对象
- * @return {Boolean} 是否日期
- */
- isDate: function(value) {
- return toString.call(value) === '[object Date]';
- },
- /**
- * 是否是javascript对象
- * @param {Object} value The value to test
- * @return {Boolean}
- * @method
- */
- isObject: (toString.call(null) === '[object Object]') ?
- function(value) {
- // check ownerDocument here as well to exclude DOM nodes
- return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
- } : function(value) {
- return toString.call(value) === '[object Object]';
- },
- /**
- * 是否是数字或者数字字符串
- * @param {String} value 数字字符串
- * @return {Boolean} 是否是数字或者数字字符串
- */
- isNumeric: function(value) {
- return !isNaN(parseFloat(value)) && isFinite(value);
- },
- /**
- * 将指定的方法或属性放到构造函数的原型链上,
- * 函数支持多于2个变量,后面的变量同s1一样将其成员复制到构造函数的原型链上。
- * @param {Function} r 构造函数
- * @param {Object} s1 将s1 的成员复制到构造函数的原型链上
- * @example
- * BUI.augment(class1,{
- * method1: function(){
- *
- * }
- * });
- */
- augment: function(r, s1) {
- if (!BUI.isFunction(r)) {
- return r;
- }
- for (var i = 1; i < arguments.length; i++) {
- BUI.mix(r.prototype, arguments[i].prototype || arguments[i]);
- };
- return r;
- },
- /**
- * 拷贝对象
- * @param {Object} obj 要拷贝的对象
- * @return {Object} 拷贝生成的对象
- */
- cloneObject: function(obj) {
- var result = BUI.isArray(obj) ? [] : {};
-
- return BUI.mix(true, result, obj);
- },
- /**
- * 抛出错误
- */
- error: function(msg) {
- if (BUI.debug) {
- throw msg;
- }
- },
-
- /**
- * 实现类的继承,通过父类生成子类
- * @param {Function} subclass
- * @param {Function} superclass 父类构造函数
- * @param {Object} overrides 子类的属性或者方法
- * @return {Function} 返回的子类构造函数
- * 示例:
- * @example
- * //父类
- * function base(){
- *
- * }
- *
- * function sub(){
- *
- * }
- * //子类
- * BUI.extend(sub,base,{
- * method : function(){
- *
- * }
- * });
- *
- * //或者
- * var sub = BUI.extend(base,{});
- */
- extend: function(subclass, superclass, overrides, staticOverrides) {
- //如果只提供父类构造函数,则自动生成子类构造函数
- if (!BUI.isFunction(superclass)) {
-
- overrides = superclass;
- superclass = subclass;
- subclass = function() {};
- }
-
- var create = Object.create ?
- function(proto, c) {
- return Object.create(proto, {
- constructor: {
- value: c
- }
- });
- } :
- function(proto, c) {
- function F() {}
-
- F.prototype = proto;
-
- var o = new F();
- o.constructor = c;
- return o;
- };
- var superObj = create(superclass.prototype, subclass); //new superclass(),//实例化父类作为子类的prototype
- subclass.prototype = BUI.mix(superObj, subclass.prototype); //指定子类的prototype
- subclass.superclass = create(superclass.prototype, superclass);
- BUI.mix(superObj, overrides);
- BUI.mix(subclass, staticOverrides);
- return subclass;
- },
- /**
- * 生成唯一的Id
- * @method
- * @param {String} prefix 前缀
- * @default 'bui-guid'
- * @return {String} 唯一的编号
- */
- guid: (function() {
- var map = {};
- return function(prefix) {
- prefix = prefix || BUI.prefix + GUID_DEFAULT;
- if (!map[prefix]) {
- map[prefix] = 1;
- } else {
- map[prefix] += 1;
- }
- return prefix + map[prefix];
- };
- })(),
- /**
- * 判断是否是字符串
- * @return {Boolean} 是否是字符串
- */
- isString: function(value) {
- return typeof value === 'string';
- },
- /**
- * 判断是否数字,由于$.isNumberic方法会把 '123'认为数字
- * @return {Boolean} 是否数字
- */
- isNumber: function(value) {
- return typeof value === 'number';
- },
- /**
- * 是否是布尔类型
- *
- * @param {Object} value 测试的值
- * @return {Boolean}
- */
- isBoolean: function(value) {
- return typeof value === 'boolean';
- },
- /**
- * 控制台输出日志
- * @param {Object} obj 输出的数据
- */
- log: function(obj) {
- if (BUI.debug && win.console && win.console.log) {
- win.console.log(obj);
- }
- },
- /**
- * 将多个对象的属性复制到一个新的对象
- */
- merge: function() {
- var args = $.makeArray(arguments),
- first = args[0];
- if (BUI.isBoolean(first)) {
- args.shift();
- args.unshift({});
- args.unshift(first);
- } else {
- args.unshift({});
- }
-
- return BUI.mix.apply(null, args);
-
- },
- /**
- * 封装 jQuery.extend 方法,将多个对象的属性merge到第一个对象中
- * @return {Object}
- */
- mix: function() {
- return $.extend.apply(null, arguments);
- },
- /**
- * 创造顶层的命名空间,附加到window对象上,
- * 包含namespace方法
- */
- app: function(name) {
- if (!window[name]) {
- window[name] = {
- namespace: function(nsName) {
- return BUI.namespace(nsName, window[name]);
- }
- };
- }
- return window[name];
- },
-
- mixAttrs: mixAttrs,
-
- mixAttr: mixAttr,
-
- /**
- * 将其他类作为mixin集成到指定类上面
- * @param {Function} c 构造函数
- * @param {Array} mixins 扩展类
- * @param {Array} attrs 扩展的静态属性,默认为['ATTRS']
- * @return {Function} 传入的构造函数
- */
- mixin: function(c, mixins, attrs) {
- attrs = attrs || [ATTRS, PARSER];
- var extensions = mixins;
- if (extensions) {
- c.mixins = extensions;
-
- var desc = {
- // ATTRS:
- // HTML_PARSER:
- },
- constructors = extensions['concat'](c);
-
- // [ex1,ex2],扩展类后面的优先,ex2 定义的覆盖 ex1 定义的
- // 主类最优先
- BUI.each(constructors, function(ext) {
- if (ext) {
- // 合并 ATTRS/HTML_PARSER 到主类
- BUI.each(attrs, function(K) {
- if (ext[K]) {
- desc[K] = desc[K] || {};
- // 不覆盖主类上的定义,因为继承层次上扩展类比主类层次高
- // 但是值是对象的话会深度合并
- // 注意:最好值是简单对象,自定义 new 出来的对象就会有问题(用 function return 出来)!
- if (K == 'ATTRS') {
- //BUI.mix(true,desc[K], ext[K]);
- mixAttrs(desc[K], ext[K]);
- } else {
- BUI.mix(desc[K], ext[K]);
- }
-
- }
- });
- }
- });
-
- BUI.each(desc, function(v, k) {
- c[k] = v;
- });
-
- var prototype = {};
-
- // 主类最优先
- BUI.each(constructors, function(ext) {
- if (ext) {
- var proto = ext.prototype;
- // 合并功能代码到主类,不覆盖
- for (var p in proto) {
- // 不覆盖主类,但是主类的父类还是覆盖吧
- if (proto.hasOwnProperty(p)) {
- prototype[p] = proto[p];
- }
- }
- }
- });
-
- BUI.each(prototype, function(v, k) {
- c.prototype[k] = v;
- });
- }
- return c;
- },
- /**
- * 生成命名空间
- * @param {String} name 命名空间的名称
- * @param {Object} baseNS 在已有的命名空间上创建命名空间,默认“BUI”
- * @return {Object} 返回的命名空间对象
- * @example
- * BUI.namespace("Grid"); // BUI.Grid
- */
- namespace: function(name, baseNS) {
- baseNS = baseNS || BUI;
- if (!name) {
- return baseNS;
- }
- var list = name.split('.'),
- //firstNS = win[list[0]],
- curNS = baseNS;
-
- for (var i = 0; i < list.length; i++) {
- var nsName = list[i];
- if (!curNS[nsName]) {
- curNS[nsName] = {};
- }
- curNS = curNS[nsName];
- };
- return curNS;
- },
- /**
- * BUI 控件的公用前缀
- * @type {String}
- */
- prefix: 'bui-',
- /**
- * 替换字符串中的字段.
- * @param {String} str 模版字符串
- * @param {Object} o json data
- * @param {RegExp} [regexp] 匹配字符串的正则表达式
- */
- substitute: function(str, o, regexp) {
- if (!BUI.isString(str) || (!BUI.isObject(o)) && !BUI.isArray(o)) {
- return str;
- }
-
- return str.replace(regexp || /\\?\{([^{}]+)\}/g, function(match, name) {
- if (match.charAt(0) === '\\') {
- return match.slice(1);
- }
- return (o[name] === undefined) ? '' : o[name];
- });
- },
- /**
- * 将$.param的反操作
- * jquery只提供param方法
- * @return {[type]} [description]
- */
- unparam: function(str){
- if (typeof str != 'string' || !(str = $.trim(str))) {
- return {};
- }
- var pairs = str.split('&'),
- pairsArr,
- rst = {};
- for(var i = pairs.length - 1; i >= 0; i--) {
- pairsArr = pairs[i].split('=');
- rst[pairsArr[0]] = decodeURIComponent(pairsArr[1]);
- }
- return rst;
- },
- /**
- * 使第一个字母变成大写
- * @param {String} s 字符串
- * @return {String} 首字母大写后的字符串
- */
- ucfirst: function(s) {
- s += '';
- return s.charAt(0).toUpperCase() + s.substring(1);
- },
- /**
- * 页面上的一点是否在用户的视图内
- * @param {Object} offset 坐标,left,top
- * @return {Boolean} 是否在视图内
- */
- isInView: function(offset) {
- var left = offset.left,
- top = offset.top,
- viewWidth = BUI.viewportWidth(),
- wiewHeight = BUI.viewportHeight(),
- scrollTop = BUI.scrollTop(),
- scrollLeft = BUI.scrollLeft();
- //判断横坐标
- if (left < scrollLeft || left > scrollLeft + viewWidth) {
- return false;
- }
- //判断纵坐标
- if (top < scrollTop || top > scrollTop + wiewHeight) {
- return false;
- }
- return true;
- },
- /**
- * 页面上的一点纵向坐标是否在用户的视图内
- * @param {Object} top 纵坐标
- * @return {Boolean} 是否在视图内
- */
- isInVerticalView: function(top) {
- var wiewHeight = BUI.viewportHeight(),
- scrollTop = BUI.scrollTop();
-
- //判断纵坐标
- if (top < scrollTop || top > scrollTop + wiewHeight) {
- return false;
- }
- return true;
- },
- /**
- * 页面上的一点横向坐标是否在用户的视图内
- * @param {Object} left 横坐标
- * @return {Boolean} 是否在视图内
- */
- isInHorizontalView: function(left) {
- var viewWidth = BUI.viewportWidth(),
- scrollLeft = BUI.scrollLeft();
- //判断横坐标
- if (left < scrollLeft || left > scrollLeft + viewWidth) {
- return false;
- }
- return true;
- },
- /**
- * 获取窗口可视范围宽度
- * @return {Number} 可视区宽度
- */
- viewportWidth: function() {
- return $(window).width();
- },
- /**
- * 获取窗口可视范围高度
- * @return {Number} 可视区高度
- */
- viewportHeight: function() {
- return $(window).height();
- },
- /**
- * 滚动到窗口的left位置
- */
- scrollLeft: function() {
- return $(window).scrollLeft();
- },
- /**
- * 滚动到横向位置
- */
- scrollTop: function() {
- return $(window).scrollTop();
- },
- /**
- * 窗口宽度
- * @return {Number} 窗口宽度
- */
- docWidth: function() {
- return Math.max(this.viewportWidth(), doc[DOC_ELEMENT][SCROLL_WIDTH], doc[BODY][SCROLL_WIDTH]);
- },
- /**
- * 窗口高度
- * @return {Number} 窗口高度
- */
- docHeight: function() {
- return Math.max(this.viewportHeight(), doc[DOC_ELEMENT][SCROLL_HEIGHT], doc[BODY][SCROLL_HEIGHT]);
- },
- /**
- * 遍历数组或者对象
- * @param {Object|Array} element/Object 数组中的元素或者对象的值
- * @param {Function} func 遍历的函数 function(elememt,index){} 或者 function(value,key){}
- */
- each: function(elements, func) {
- if (!elements) {
- return;
- }
- $.each(elements, function(k, v) {
- return func(v, k);
- });
- },
- /**
- * 封装事件,便于使用上下文this,和便于解除事件时使用
- * @protected
- * @param {Object} self 对象
- * @param {String} action 事件名称
- */
- wrapBehavior: function(self, action) {
- return self['__bui_wrap_' + action] = function(e) {
- if (!self.get('disabled')) {
- self[action](e);
- }
- };
- },
- /**
- * 获取封装的事件
- * @protected
- * @param {Object} self 对象
- * @param {String} action 事件名称
- */
- getWrapBehavior: function(self, action) {
- return self['__bui_wrap_' + action];
- },
- /**
- * 获取页面上使用了此id的控件
- * @param {String} id 控件id
- * @return {BUI.Component.Controller} 查找的控件
- */
- getControl: function(id) {
- return BUI.Component.Manager.getComponent(id);
- }
-
-});
-
-/**
- * 表单帮助类,序列化、反序列化,设置值
- * @class BUI.FormHelper
- * @singleton
- */
-var FormHelper = {
- /**
- * 将表单格式化成键值对形式
- * @param {HTMLElement} form 表单
- * @return {Object} 键值对的对象
- */
- serializeToObject: function(form) {
- var array = $(form).serializeArray(),
- result = {};
- BUI.each(array, function(item) {
- var name = item.name;
- if (!result[name]) { //如果是单个值,直接赋值
- result[name] = item.value;
- } else { //多值使用数组
- if (!BUI.isArray(result[name])) {
- result[name] = [result[name]];
- }
- result[name].push(item.value);
- }
- });
- return result;
- },
- /**
- * 设置表单的值
- * @param {HTMLElement} form 表单
- * @param {Object} obj 键值对
- */
- setFields: function(form, obj) {
- for (var name in obj) {
- if (obj.hasOwnProperty(name)) {
- BUI.FormHelper.setField(form, name, obj[name]);
- }
- }
- },
- /**
- * 清空表单
- * @param {HTMLElement} form 表单元素
- */
- clear: function(form) {
- var elements = $.makeArray(form.elements);
-
- BUI.each(elements, function(element) {
- if (element.type === 'checkbox' || element.type === 'radio') {
- $(element).attr('checked', false);
- } else {
- $(element).val('');
- }
- $(element).change();
- });
- },
- /**
- * 设置表单字段
- * @param {HTMLElement} form 表单元素
- * @param {string} field 字段名
- * @param {string} value 字段值
- */
- setField: function(form, fieldName, value) {
- var fields = form.elements[fieldName];
- if (fields && fields.type) {
- formHelper._setFieldValue(fields, value);
- } else if (BUI.isArray(fields) || (fields && fields.length)) {
- BUI.each(fields, function(field) {
- formHelper._setFieldValue(field, value);
- });
- }
- },
- //设置字段的值
- _setFieldValue: function(field, value) {
- if (field.type === 'checkbox') {
- if (field.value == '' + value || (BUI.isArray(value) && BUI.Array.indexOf(field.value, value) !== -1)) {
- $(field).attr('checked', true);
- } else {
- $(field).attr('checked', false);
- }
- } else if (field.type === 'radio') {
- if (field.value == '' + value) {
- $(field).attr('checked', true);
- } else {
- $(field).attr('checked', false);
- }
- } else {
- $(field).val(value);
- }
- },
- /**
- * 获取表单字段值
- * @param {HTMLElement} form 表单元素
- * @param {string} field 字段名
- * @return {String} 字段值
- */
- getField: function(form, fieldName) {
- return BUI.FormHelper.serializeToObject(form)[fieldName];
- }
-};
-
-
-BUI.FormHelper = FormHelper;
-
-module.exports = BUI;
-
-});
-define("bui-common/1.1.2/src/ua-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview UA,jQuery的 $.browser 对象非常难使用
- * @ignore
- * @author dxq613@gmail.com
- */
-
-var $ = require('jquery');
-
-function numberify(s) {
- var c = 0;
- // convert '1.2.3.4' to 1.234
- return parseFloat(s.replace(/\./g, function() {
- return (c++ === 0) ? '.' : '';
- }));
-};
-
-function uaMatch(s) {
- s = s.toLowerCase();
- var r = /(chrome)[ \/]([\w.]+)/.exec(s) || /(webkit)[ \/]([\w.]+)/.exec(s) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(s) || /(msie) ([\w.]+)/.exec(s) || s.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(s) || [],
- a = {
- browser: r[1] || "",
- version: r[2] || "0"
- },
- b = {};
- a.browser && (b[a.browser] = !0, b.version = a.version),
- b.chrome ? b.webkit = !0 : b.webkit && (b.safari = !0);
- return b;
-}
-
-var UA = $.UA || (function() {
- var browser = $.browser || uaMatch(navigator.userAgent),
- versionNumber = numberify(browser.version),
- /**
- * 浏览器版本检测
- * @class BUI.UA
- * @singleton
- */
- ua = {
- /**
- * ie 版本
- * @type {Number}
- */
- ie: browser.msie && versionNumber,
-
- /**
- * webkit 版本
- * @type {Number}
- */
- webkit: browser.webkit && versionNumber,
- /**
- * opera 版本
- * @type {Number}
- */
- opera: browser.opera && versionNumber,
- /**
- * mozilla 火狐版本
- * @type {Number}
- */
- mozilla: browser.mozilla && versionNumber
- };
- return ua;
-})();
-
-module.exports = UA;
-
-});
-define("bui-common/1.1.2/src/json-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 由于jQuery只有 parseJSON ,没有stringify所以使用过程不方便
- * @ignore
- */
-
-var $ = require('jquery'),
- UA = require("bui-common/1.1.2/src/ua-debug"),
- win = window,
- JSON = win.JSON;
-
-// ie 8.0.7600.16315@win7 json 有问题
-if (!JSON || UA['ie'] < 9) {
- JSON = win.JSON = {};
-}
-
-function f(n) {
- // Format integers to have at least two digits.
- return n < 10 ? '0' + n : n;
-}
-
-if (typeof Date.prototype.toJSON !== 'function') {
-
- Date.prototype.toJSON = function(key) {
-
- return isFinite(this.valueOf()) ?
- this.getUTCFullYear() + '-' +
- f(this.getUTCMonth() + 1) + '-' +
- f(this.getUTCDate()) + 'T' +
- f(this.getUTCHours()) + ':' +
- f(this.getUTCMinutes()) + ':' +
- f(this.getUTCSeconds()) + 'Z' : null;
- };
-
- String.prototype.toJSON =
- Number.prototype.toJSON =
- Boolean.prototype.toJSON = function(key) {
- return this.valueOf();
- };
-}
-
-
-var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
- escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
- gap,
- indent,
- meta = { // table of character substitutions
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"': '\\"',
- '\\': '\\\\'
- },
- rep;
-
-function quote(string) {
-
- // If the string contains no control characters, no quote characters, and no
- // backslash characters, then we can safely slap some quotes around it.
- // Otherwise we must also replace the offending characters with safe escape
- // sequences.
-
- escapable['lastIndex'] = 0;
- return escapable.test(string) ?
- '"' + string.replace(escapable, function(a) {
- var c = meta[a];
- return typeof c === 'string' ? c :
- '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"' :
- '"' + string + '"';
-}
-
-function str(key, holder) {
-
- // Produce a string from holder[key].
-
- var i, // The loop counter.
- k, // The member key.
- v, // The member value.
- length,
- mind = gap,
- partial,
- value = holder[key];
-
- // If the value has a toJSON method, call it to obtain a replacement value.
-
- if (value && typeof value === 'object' &&
- typeof value.toJSON === 'function') {
- value = value.toJSON(key);
- }
-
- // If we were called with a replacer function, then call the replacer to
- // obtain a replacement value.
-
- if (typeof rep === 'function') {
- value = rep.call(holder, key, value);
- }
-
- // What happens next depends on the value's type.
-
- switch (typeof value) {
- case 'string':
- return quote(value);
-
- case 'number':
-
- // JSON numbers must be finite. Encode non-finite numbers as null.
-
- return isFinite(value) ? String(value) : 'null';
-
- case 'boolean':
- case 'null':
-
- // If the value is a boolean or null, convert it to a string. Note:
- // typeof null does not produce 'null'. The case is included here in
- // the remote chance that this gets fixed someday.
-
- return String(value);
-
- // If the type is 'object', we might be dealing with an object or an array or
- // null.
-
- case 'object':
-
- // Due to a specification blunder in ECMAScript, typeof null is 'object',
- // so watch out for that case.
-
- if (!value) {
- return 'null';
- }
-
- // Make an array to hold the partial results of stringifying this object value.
-
- gap += indent;
- partial = [];
-
- // Is the value an array?
-
- if (Object.prototype.toString.apply(value) === '[object Array]') {
-
- // The value is an array. Stringify every element. Use null as a placeholder
- // for non-JSON values.
-
- length = value.length;
- for (i = 0; i < length; i += 1) {
- partial[i] = str(i, value) || 'null';
- }
-
- // Join all of the elements together, separated with commas, and wrap them in
- // brackets.
-
- v = partial.length === 0 ? '[]' :
- gap ? '[\n' + gap +
- partial.join(',\n' + gap) + '\n' +
- mind + ']' :
- '[' + partial.join(',') + ']';
- gap = mind;
- return v;
- }
-
- // If the replacer is an array, use it to select the members to be stringified.
-
- if (rep && typeof rep === 'object') {
- length = rep.length;
- for (i = 0; i < length; i += 1) {
- k = rep[i];
- if (typeof k === 'string') {
- v = str(k, value);
- if (v) {
- partial.push(quote(k) + (gap ? ': ' : ':') + v);
- }
- }
- }
- } else {
-
- // Otherwise, iterate through all of the keys in the object.
-
- for (k in value) {
- if (Object.hasOwnProperty.call(value, k)) {
- v = str(k, value);
- if (v) {
- partial.push(quote(k) + (gap ? ': ' : ':') + v);
- }
- }
- }
- }
-
- // Join all of the member texts together, separated with commas,
- // and wrap them in braces.
-
- v = partial.length === 0 ? '{}' :
- gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
- mind + '}' : '{' + partial.join(',') + '}';
- gap = mind;
- return v;
- }
-}
-
-if (typeof JSON.stringify !== 'function') {
- JSON.stringify = function(value, replacer, space) {
-
- // The stringify method takes a value and an optional replacer, and an optional
- // space parameter, and returns a JSON text. The replacer can be a function
- // that can replace values, or an array of strings that will select the keys.
- // A default replacer method can be provided. Use of the space parameter can
- // produce text that is more easily readable.
-
- var i;
- gap = '';
- indent = '';
-
- // If the space parameter is a number, make an indent string containing that
- // many spaces.
-
- if (typeof space === 'number') {
- for (i = 0; i < space; i += 1) {
- indent += ' ';
- }
-
- // If the space parameter is a string, it will be used as the indent string.
-
- } else if (typeof space === 'string') {
- indent = space;
- }
-
- // If there is a replacer, it must be a function or an array.
- // Otherwise, throw an error.
-
- rep = replacer;
- if (replacer && typeof replacer !== 'function' &&
- (typeof replacer !== 'object' ||
- typeof replacer.length !== 'number')) {
- throw new Error('JSON.stringify');
- }
-
- // Make a fake root object containing our value under the key of ''.
- // Return the result of stringifying the value.
-
- return str('', {
- '': value
- });
- };
-}
-
-function looseParse(data) {
- try {
- return new Function('return ' + data + ';')();
- } catch (e) {
- throw 'Json parse error!';
- }
-}
-/**
- * JSON 格式化
- * @class BUI.JSON
- * @singleton
- */
-var JSON = {
- /**
- * 转成json 等同于$.parseJSON
- * @method
- * @param {String} jsonstring 合法的json 字符串
- */
- parse: $.parseJSON,
- /**
- * 业务中有些字符串组成的json数据不是严格的json数据,如使用单引号,或者属性名不是字符串
- * 如 : {a:'abc'}
- * @method
- * @param {String} jsonstring
- */
- looseParse: looseParse,
- /**
- * 将Json转成字符串
- * @method
- * @param {Object} json json 对象
- */
- stringify: JSON.stringify
-}
-
-module.exports = JSON;
-
-});
-define("bui-common/1.1.2/src/date-debug", [], function(require, exports, module){
-/*
- * @fileOverview Date Format 1.2.3
- * @ignore
- * (c) 2007-2009 Steven Levithan
- * var control = new Control();
- * control.on('click',function(ev){
- *
- * });
- *
- * control.off(); //移除所有事件
- *
- * @class BUI.Observable
- * @abstract
- * @param {Object} config 配置项键值对
- */
-var Observable = function(config) {
- this._events = [];
- this._eventMap = {};
- this._bubblesEvents = [];
- this._initEvents(config);
-};
-
-BUI.augment(Observable, {
-
- /**
- * @cfg {Object} listeners
- * 初始化事件,快速注册事件
- *
- * var list = new BUI.List.SimpleList({
- * listeners : {
- * itemclick : function(ev){},
- * itemrendered : function(ev){}
- * },
- * items : []
- * });
- * list.render();
- *
- */
-
- /**
- * @cfg {Function} handler
- * 点击事件的处理函数,快速配置点击事件而不需要写listeners属性
- *
- * var list = new BUI.List.SimpleList({
- * handler : function(ev){} //click 事件
- * });
- * list.render();
- *
- */
-
- /**
- * 支持的事件名列表
- * @private
- */
- _events: [],
-
- /**
- * 绑定的事件
- * @private
- */
- _eventMap: {},
-
- _bubblesEvents: [],
-
- _bubbleTarget: null,
-
- //获取回调集合
- _getCallbacks: function(eventType) {
- var _self = this,
- eventMap = _self._eventMap;
- return eventMap[eventType];
- },
- //初始化事件列表
- _initEvents: function(config) {
- var _self = this,
- listeners = null;
-
- if (!config) {
- return;
- }
- listeners = config.listeners || {};
- if (config.handler) {
- listeners.click = config.handler;
- }
- if (listeners) {
- for (var name in listeners) {
- if (listeners.hasOwnProperty(name)) {
- _self.on(name, listeners[name]);
- }
- };
- }
- },
- //事件是否支持冒泡
- _isBubbles: function(eventType) {
- return ArrayUtil.indexOf(eventType, this._bubblesEvents) >= 0;
- },
- /**
- * 添加冒泡的对象
- * @protected
- * @param {Object} target 冒泡的事件源
- */
- addTarget: function(target) {
- this._bubbleTarget = target;
- },
- /**
- * 添加支持的事件
- * @protected
- * @param {String|String[]} events 事件
- */
- addEvents: function(events) {
- var _self = this,
- existEvents = _self._events,
- eventMap = _self._eventMap;
-
- function addEvent(eventType) {
- if (ArrayUtil.indexOf(eventType, existEvents) === -1) {
- eventMap[eventType] = getCallbacks();
- existEvents.push(eventType);
- }
- }
- if (BUI.isArray(events)) {
- BUI.each(events, function(eventType) {
- addEvent(eventType);
- });
- } else {
- addEvent(events);
- }
- },
- /**
- * 移除所有绑定的事件
- * @protected
- */
- clearListeners: function() {
- var _self = this,
- eventMap = _self._eventMap;
- for (var name in eventMap) {
- if (eventMap.hasOwnProperty(name)) {
- eventMap[name].empty();
- }
- }
- },
- /**
- * 触发事件
- *
- * //绑定事件
- * list.on('itemclick',function(ev){
- * alert('21');
- * });
- * //触发事件
- * list.fire('itemclick');
- *
- * @param {String} eventType 事件类型
- * @param {Object} eventData 事件触发时传递的数据
- * @return {Boolean|undefined} 如果其中一个事件处理器返回 false , 则返回 false, 否则返回最后一个事件处理器的返回值
- */
- fire: function(eventType, eventData) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType),
- args = $.makeArray(arguments),
- result;
- if (!eventData) {
- eventData = {};
- args.push(eventData);
- }
- if (!eventData.target) {
- eventData.target = _self;
- }
- if (callbacks) {
- result = callbacks.fireWith(_self, Array.prototype.slice.call(args, 1));
- }
- if (_self._isBubbles(eventType)) {
- var bubbleTarget = _self._bubbleTarget;
- if (bubbleTarget && bubbleTarget.fire) {
- bubbleTarget.fire(eventType, eventData);
- }
- }
- return result;
- },
- /**
- * 暂停事件的执行
- *
- * list.pauseEvent('itemclick');
- *
- * @param {String} eventType 事件类型
- */
- pauseEvent: function(eventType) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- callbacks && callbacks.pause();
- },
- /**
- * 唤醒事件
- *
- * list.resumeEvent('itemclick');
- *
- * @param {String} eventType 事件类型
- */
- resumeEvent: function(eventType) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- callbacks && callbacks.resume();
- },
- /**
- * 添加绑定事件
- *
- * //绑定单个事件
- * list.on('itemclick',function(ev){
- * alert('21');
- * });
- * //绑定多个事件
- * list.on('itemrendered itemupdated',function(){
- * //列表项创建、更新时触发操作
- * });
- *
- * @param {String} eventType 事件类型
- * @param {Function} fn 回调函数
- */
- on: function(eventType, fn) {
- //一次监听多个事件
- var arr = eventType.split(' '),
- _self = this,
- callbacks = null;
- if (arr.length > 1) {
- BUI.each(arr, function(name) {
- _self.on(name, fn);
- });
- } else {
- callbacks = _self._getCallbacks(eventType);
- if (callbacks) {
- callbacks.add(fn);
- } else {
- _self.addEvents(eventType);
- _self.on(eventType, fn);
- }
- }
- return _self;
- },
- /**
- * 移除绑定的事件
- *
- * //移除所有事件
- * list.off();
- *
- * //移除特定事件
- * function callback(ev){}
- * list.on('click',callback);
- *
- * list.off('click',callback);//需要保存回调函数的引用
- *
- *
- * @param {String} eventType 事件类型
- * @param {Function} fn 回调函数
- */
- off: function(eventType, fn) {
- if (!eventType && !fn) {
- this.clearListeners();
- return this;
- }
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- if (callbacks) {
- if (fn) {
- callbacks.remove(fn);
- } else {
- callbacks.empty();
- }
-
- }
- return _self;
- },
- /**
- * 配置事件是否允许冒泡
- * @protected
- * @param {String} eventType 支持冒泡的事件
- * @param {Object} cfg 配置项
- * @param {Boolean} cfg.bubbles 是否支持冒泡
- */
- publish: function(eventType, cfg) {
- var _self = this,
- bubblesEvents = _self._bubblesEvents;
-
- if (cfg.bubbles) {
- if (BUI.Array.indexOf(eventType, bubblesEvents) === -1) {
- bubblesEvents.push(eventType);
- }
- } else {
- var index = BUI.Array.indexOf(eventType, bubblesEvents);
- if (index !== -1) {
- bubblesEvents.splice(index, 1);
- }
- }
- }
-});
-
-module.exports = Observable;
-
-});
-define("bui-common/1.1.2/src/base-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview Base UI控件的最基础的类
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-var INVALID = {},
- Observable = require("bui-common/1.1.2/src/observable-debug");
-
-function ensureNonEmpty(obj, name, create) {
- var ret = obj[name] || {};
- if (create) {
- obj[name] = ret;
- }
- return ret;
-}
-
-function normalFn(host, method) {
- if (BUI.isString(method)) {
- return host[method];
- }
- return method;
-}
-
-function __fireAttrChange(self, when, name, prevVal, newVal) {
- var attrName = name;
- return self.fire(when + BUI.ucfirst(name) + 'Change', {
- attrName: attrName,
- prevVal: prevVal,
- newVal: newVal
- });
-}
-
-function setInternal(self, name, value, opts, attrs) {
- opts = opts || {};
-
- var ret,
- subVal,
- prevVal;
-
- prevVal = self.get(name);
-
- //如果未改变值不进行修改
- if (!$.isPlainObject(value) && !BUI.isArray(value) && prevVal === value) {
- return undefined;
- }
- // check before event
- if (!opts['silent']) {
- if (false === __fireAttrChange(self, 'before', name, prevVal, value)) {
- return false;
- }
- }
- // set it
- ret = self._set(name, value, opts);
-
- if (ret === false) {
- return ret;
- }
-
- // fire after event
- if (!opts['silent']) {
- value = self.__attrVals[name];
- __fireAttrChange(self, 'after', name, prevVal, value);
- }
- return self;
-}
-
-function initClassAttrs(c) {
- if (c._attrs || c == Base) {
- return;
- }
-
- var superCon = c.superclass.constructor;
- if (superCon && !superCon._attrs) {
- initClassAttrs(superCon);
- }
- c._attrs = {};
-
- BUI.mixAttrs(c._attrs, superCon._attrs);
- BUI.mixAttrs(c._attrs, c.ATTRS);
-}
-/**
- * 基础类,此类提供以下功能
- * - 提供设置获取属性
- * - 提供事件支持
- * - 属性变化时会触发对应的事件
- * - 将配置项自动转换成属性
- *
- * ** 创建类,继承BUI.Base类 **
- *
- * var Control = function(cfg){
- * Control.superclass.constructor.call(this,cfg); //调用BUI.Base的构造方法,将配置项变成属性
- * };
- *
- * BUI.extend(Control,BUI.Base);
- *
- *
- * ** 声明默认属性 **
- *
- * Control.ATTRS = {
- * id : {
- * value : 'id' //value 是此属性的默认值
- * },
- * renderTo : {
- *
- * },
- * el : {
- * valueFn : function(){ //第一次调用的时候将renderTo的DOM转换成el属性
- * return $(this.get('renderTo'));
- * }
- * },
- * text : {
- * getter : function(){ //getter 用于获取值,而不是设置的值
- * return this.get('el').val();
- * },
- * setter : function(v){ //不仅仅是设置值,可以进行相应的操作
- * this.get('el').val(v);
- * }
- * }
- * };
- *
- *
- * ** 声明类的方法 **
- *
- * BUI.augment(Control,{
- * getText : function(){
- * return this.get('text'); //可以用get方法获取属性值
- * },
- * setText : function(txt){
- * this.set('text',txt); //使用set 设置属性值
- * }
- * });
- *
- *
- * ** 创建对象 **
- *
- * var c = new Control({
- * id : 'oldId',
- * text : '测试文本',
- * renderTo : '#t1'
- * });
- *
- * var el = c.get(el); //$(#t1);
- * el.val(); //text的值 : '测试文本'
- * c.set('text','修改的值');
- * el.val(); //'修改的值'
- *
- * c.set('id','newId') //会触发2个事件: beforeIdChange,afterIdChange 2个事件 ev.newVal 和ev.prevVal标示新旧值
- *
- * @class BUI.Base
- * @abstract
- * @extends BUI.Observable
- * @param {Object} config 配置项
- */
-var Base = function(config) {
- var _self = this,
- c = _self.constructor,
- constructors = [];
- this.__attrs = {};
- this.__attrVals = {};
- Observable.apply(this, arguments);
- // define
- while (c) {
- constructors.push(c);
- if (c.extensions) { //延迟执行mixin
- BUI.mixin(c, c.extensions);
- delete c.extensions;
- }
- //_self.addAttrs(c['ATTRS']);
- c = c.superclass ? c.superclass.constructor : null;
- }
- //以当前对象的属性最终添加到属性中,覆盖之前的属性
- /*for (var i = constructors.length - 1; i >= 0; i--) {
- _self.addAttrs(constructors[i]['ATTRS'],true);
- };*/
- var con = _self.constructor;
- initClassAttrs(con);
- _self._initStaticAttrs(con._attrs);
- _self._initAttrs(config);
-};
-
-Base.INVALID = INVALID;
-
-BUI.extend(Base, Observable);
-
-BUI.augment(Base, {
- _initStaticAttrs: function(attrs) {
- var _self = this,
- __attrs;
-
- __attrs = _self.__attrs = {};
- for (var p in attrs) {
- if (attrs.hasOwnProperty(p)) {
- var attr = attrs[p];
- /*if(BUI.isObject(attr.value) || BUI.isArray(attr.value) || attr.valueFn){*/
- if (attr.shared === false || attr.valueFn) {
- __attrs[p] = {};
- BUI.mixAttr(__attrs[p], attrs[p]);
- } else {
- __attrs[p] = attrs[p];
- }
- }
- };
- },
- /**
- * 添加属性定义
- * @protected
- * @param {String} name 属性名
- * @param {Object} attrConfig 属性定义
- * @param {Boolean} overrides 是否覆盖字段
- */
- addAttr: function(name, attrConfig, overrides) {
- var _self = this,
- attrs = _self.__attrs,
- attr = attrs[name];
-
- if (!attr) {
- attr = attrs[name] = {};
- }
- for (var p in attrConfig) {
- if (attrConfig.hasOwnProperty(p)) {
- if (p == 'value') {
- if (BUI.isObject(attrConfig[p])) {
- attr[p] = attr[p] || {};
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else if (BUI.isArray(attrConfig[p])) {
- attr[p] = attr[p] || [];
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else {
- attr[p] = attrConfig[p];
- }
- } else {
- attr[p] = attrConfig[p];
- }
- }
-
- };
- return _self;
- },
- /**
- * 添加属性定义
- * @protected
- * @param {Object} attrConfigs An object with attribute name/configuration pairs.
- * @param {Object} initialValues user defined initial values
- * @param {Boolean} overrides 是否覆盖字段
- */
- addAttrs: function(attrConfigs, initialValues, overrides) {
- var _self = this;
- if (!attrConfigs) {
- return _self;
- }
- if (typeof(initialValues) === 'boolean') {
- overrides = initialValues;
- initialValues = null;
- }
- BUI.each(attrConfigs, function(attrConfig, name) {
- _self.addAttr(name, attrConfig, overrides);
- });
- if (initialValues) {
- _self.set(initialValues);
- }
- return _self;
- },
- /**
- * 是否包含此属性
- * @protected
- * @param {String} name 值
- * @return {Boolean} 是否包含
- */
- hasAttr: function(name) {
- return name && this.__attrs.hasOwnProperty(name);
- },
- /**
- * 获取默认的属性值
- * @protected
- * @return {Object} 属性值的键值对
- */
- getAttrs: function() {
- return this.__attrs; //ensureNonEmpty(this, '__attrs', true);
- },
- /**
- * 获取属性名/属性值键值对
- * @protected
- * @return {Object} 属性对象
- */
- getAttrVals: function() {
- return this.__attrVals; //ensureNonEmpty(this, '__attrVals', true);
- },
- /**
- * 获取属性值,所有的配置项和属性都可以通过get方法获取
- *
- * var control = new Control({
- * text : 'control text'
- * });
- * control.get('text'); //control text
- *
- * control.set('customValue','value'); //临时变量
- * control.get('customValue'); //value
- *
- * ** 属性值/配置项 **
- *
- * Control.ATTRS = { //声明属性值
- * text : {
- * valueFn : function(){},
- * value : 'value',
- * getter : function(v){}
- * }
- * };
- * var c = new Control({
- * text : 'text value'
- * });
- * //get 函数取的顺序为:是否有修改值(配置项、set)、默认值(第一次调用执行valueFn),如果有getter,则将值传入getter返回
- *
- * c.get('text') //text value
- * c.set('text','new text');//修改值
- * c.get('text');//new text
- *
- * @param {String} name 属性名
- * @return {Object} 属性值
- */
- get: function(name) {
- var _self = this,
- //declared = _self.hasAttr(name),
- attrVals = _self.__attrVals,
- attrConfig,
- getter,
- ret;
-
- attrConfig = ensureNonEmpty(_self.__attrs, name);
- getter = attrConfig['getter'];
-
- // get user-set value or default value
- //user-set value takes privilege
- ret = name in attrVals ?
- attrVals[name] :
- _self._getDefAttrVal(name);
-
- // invoke getter for this attribute
- if (getter && (getter = normalFn(_self, getter))) {
- ret = getter.call(_self, ret, name);
- }
-
- return ret;
- },
- /**
- * @清理所有属性值
- * @protected
- */
- clearAttrVals: function() {
- this.__attrVals = {};
- },
- /**
- * 移除属性定义
- * @protected
- */
- removeAttr: function(name) {
- var _self = this;
-
- if (_self.hasAttr(name)) {
- delete _self.__attrs[name];
- delete _self.__attrVals[name];
- }
-
- return _self;
- },
- /**
- * 设置属性值,会触发before+Name+Change,和 after+Name+Change事件
- *
- * control.on('beforeTextChange',function(ev){
- * var newVal = ev.newVal,
- * attrName = ev.attrName,
- * preVal = ev.prevVal;
- *
- * //TO DO
- * });
- * control.set('text','new text'); //此时触发 beforeTextChange,afterTextChange
- * control.set('text','modify text',{silent : true}); //此时不触发事件
- *
- * @param {String|Object} name 属性名
- * @param {Object} value 值
- * @param {Object} opts 配置项
- * @param {Boolean} opts.silent 配置属性时,是否不触发事件
- */
- set: function(name, value, opts) {
- var _self = this;
- if ($.isPlainObject(name)) {
- opts = value;
- var all = Object(name),
- attrs = [];
-
- for (name in all) {
- if (all.hasOwnProperty(name)) {
- setInternal(_self, name, all[name], opts);
- }
- }
- return _self;
- }
- return setInternal(_self, name, value, opts);
- },
- /**
- * 设置属性,不触发事件
- *
- * control.setInternal('text','text');//此时不触发事件
- *
- * @param {String} name 属性名
- * @param {Object} value 属性值
- * @return {Boolean|undefined} 如果值无效则返回false,否则返回undefined
- */
- setInternal: function(name, value, opts) {
- return this._set(name, value, opts);
- },
- //获取属性默认值
- _getDefAttrVal: function(name) {
- var _self = this,
- attrs = _self.__attrs,
- attrConfig = ensureNonEmpty(attrs, name),
- valFn = attrConfig.valueFn,
- val;
-
- if (valFn && (valFn = normalFn(_self, valFn))) {
- val = valFn.call(_self);
- if (val !== undefined) {
- attrConfig.value = val;
- }
- delete attrConfig.valueFn;
- attrs[name] = attrConfig;
- }
-
- return attrConfig.value;
- },
- //仅仅设置属性值
- _set: function(name, value, opts) {
- var _self = this,
- setValue,
- // if host does not have meta info corresponding to (name,value)
- // then register on demand in order to collect all data meta info
- // 一定要注册属性元数据,否则其他模块通过 _attrs 不能枚举到所有有效属性
- // 因为属性在声明注册前可以直接设置值
- attrConfig = ensureNonEmpty(_self.__attrs, name, true),
- setter = attrConfig['setter'];
-
- // if setter has effect
- if (setter && (setter = normalFn(_self, setter))) {
- setValue = setter.call(_self, value, name);
- }
-
- if (setValue === INVALID) {
- return false;
- }
-
- if (setValue !== undefined) {
- value = setValue;
- }
-
- // finally set
- _self.__attrVals[name] = value;
- return _self;
- },
- //初始化属性
- _initAttrs: function(config) {
- var _self = this;
- if (config) {
- for (var attr in config) {
- if (config.hasOwnProperty(attr)) {
- // 用户设置会调用 setter/validator 的,但不会触发属性变化事件
- _self._set(attr, config[attr]);
- }
-
- }
- }
- }
-});
-module.exports = Base;
-
-});
-define("bui-common/1.1.2/src/component/component-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview Component命名空间的入口文件
- * @ignore
- */
-
-/**
- * @class BUI.Component
- *
- *
- *
- *
- *
- * //默认状态下创建对象,并没有进行render
- * var control = new Control();
- * control.render(); //需要调用render方法
- *
- * //设置autoRender后,不需要调用render方法
- * var control = new Control({
- * autoRender : true
- * });
- *
- * @cfg {Boolean} autoRender
- */
- /**
- * 是否自动渲染,如果不自动渲染,需要用户调用 render()方法
- * @type {Boolean}
- * @ignore
- */
- autoRender: {
- value: false
- },
- /**
- * @type {Object}
- * 事件处理函数:
- * {
- * 'click':function(e){}
- * }
- * @ignore
- */
- listeners: {
- value: {}
- },
- /**
- * 插件集合
- *
- * var grid = new Grid({
- * columns : [{},{}],
- * plugins : [Grid.Plugins.RadioSelection]
- * });
- *
- * @cfg {Array} plugins
- */
- /**
- * 插件集合
- * @type {Array}
- * @readOnly
- */
- plugins: {
- //value : []
- },
- /**
- * 是否已经渲染完成
- * @type {Boolean}
- * @default false
- * @readOnly
- */
- rendered: {
- value: false
- },
- /**
- * 获取控件的 xclass
- * @readOnly
- * @type {String}
- * @protected
- */
- xclass: {
- valueFn: function() {
- return Manager.getXClassByConstructor(this.constructor);
- }
- }
-};
-
-BUI.extend(UIBase, Base);
-
-BUI.augment(UIBase, {
- /**
- * 创建DOM结构
- * @protected
- */
- create: function() {
- var self = this;
- // 是否生成过节点
- if (!self.get('created')) {
- /**
- * @event beforeCreateDom
- * fired before root node is created
- * @param e
- */
- self.fire('beforeCreateDom');
- callMethodByHierarchy(self, 'createDom', '__createDom');
- self._set('created', true);
- /**
- * @event afterCreateDom
- * fired when root node is created
- * @param e
- */
- self.fire('afterCreateDom');
- actionPlugins(self, self.get('plugins'), 'createDom');
- }
- return self;
- },
- /**
- * 渲染
- */
- render: function() {
- var _self = this;
- // 是否已经渲染过
- if (!_self.get('rendered')) {
- var plugins = _self.get('plugins');
- _self.create(undefined);
- _self.set('created', true);
- /**
- * @event beforeRenderUI
- * fired when root node is ready
- * @param e
- */
- _self.fire('beforeRenderUI');
- callMethodByHierarchy(_self, 'renderUI', '__renderUI');
-
- /**
- * @event afterRenderUI
- * fired after root node is rendered into dom
- * @param e
- */
-
- _self.fire('afterRenderUI');
- actionPlugins(_self, plugins, 'renderUI');
-
- /**
- * @event beforeBindUI
- * fired before UIBase 's internal event is bind.
- * @param e
- */
-
- _self.fire('beforeBindUI');
- bindUI(_self);
- callMethodByHierarchy(_self, 'bindUI', '__bindUI');
- _self.set('binded', true);
- /**
- * @event afterBindUI
- * fired when UIBase 's internal event is bind.
- * @param e
- */
-
- _self.fire('afterBindUI');
- actionPlugins(_self, plugins, 'bindUI');
-
- /**
- * @event beforeSyncUI
- * fired before UIBase 's internal state is synchronized.
- * @param e
- */
-
- _self.fire('beforeSyncUI');
-
- syncUI(_self);
- callMethodByHierarchy(_self, 'syncUI', '__syncUI');
-
- /**
- * @event afterSyncUI
- * fired after UIBase 's internal state is synchronized.
- * @param e
- */
-
- _self.fire('afterSyncUI');
- actionPlugins(_self, plugins, 'syncUI');
- _self._set('rendered', true);
- }
- return _self;
- },
- /**
- * 子类可继承此方法,当DOM创建时调用
- * @protected
- * @method
- */
- createDom: noop,
- /**
- * 子类可继承此方法,渲染UI时调用
- * @protected
- * @method
- */
- renderUI: noop,
- /**
- * 子类可继承此方法,绑定事件时调用
- * @protected
- * @method
- */
- bindUI: noop,
- /**
- * 同步属性值到UI上
- * @protected
- * @method
- */
- syncUI: noop,
-
- /**
- * 析构函数
- */
- destroy: function() {
- var _self = this;
- if (_self.destroyed) { //防止返回销毁
- return _self;
- }
- /**
- * @event beforeDestroy
- * fired before UIBase 's destroy.
- * @param e
- */
- _self.fire('beforeDestroy');
-
- actionPlugins(_self, _self.get('plugins'), 'destructor');
- destroyHierarchy(_self);
- /**
- * @event afterDestroy
- * fired before UIBase 's destroy.
- * @param e
- */
- _self.fire('afterDestroy');
- _self.off();
- _self.clearAttrVals();
- _self.destroyed = true;
- return _self;
- }
-});
-
-//延时处理构造函数
-function initConstuctor(c) {
- var constructors = [];
- while (c.base) {
- constructors.push(c);
- c = c.base;
- }
- for (var i = constructors.length - 1; i >= 0; i--) {
- var C = constructors[i];
- //BUI.extend(C,C.base,C.px,C.sx);
- BUI.mix(C.prototype, C.px);
- BUI.mix(C, C.sx);
- C.base = null;
- C.px = null;
- C.sx = null;
- }
-}
-
-BUI.mix(UIBase, {
- /**
- * 定义一个类
- * @static
- * @param {Function} base 基类构造函数
- * @param {Array} extensions 扩展
- * @param {Object} px 原型链上的扩展
- * @param {Object} sx
- * @return {Function} 继承与基类的构造函数
- */
- define: function(base, extensions, px, sx) {
- if ($.isPlainObject(extensions)) {
- sx = px;
- px = extensions;
- extensions = [];
- }
-
- function C() {
- var c = this.constructor;
- if (c.base) {
- initConstuctor(c);
- }
- UIBase.apply(this, arguments);
- }
-
- BUI.extend(C, base); //无法延迟
- C.base = base;
- C.px = px; //延迟复制原型链上的函数
- C.sx = sx; //延迟复制静态属性
-
- //BUI.mixin(C,extensions);
- if (extensions.length) { //延迟执行mixin
- C.extensions = extensions;
- }
-
- return C;
- },
- /**
- * 扩展一个类,基类就是类本身
- * @static
- * @param {Array} extensions 扩展
- * @param {Object} px 原型链上的扩展
- * @param {Object} sx
- * @return {Function} 继承与基类的构造函数
- */
- extend: function extend(extensions, px, sx) {
- var args = $.makeArray(arguments),
- ret,
- last = args[args.length - 1];
- args.unshift(this);
- if (last.xclass) {
- args.pop();
- args.push(last.xclass);
- }
- ret = UIBase.define.apply(UIBase, args);
- if (last.xclass) {
- var priority = last.priority || (this.priority ? (this.priority + 1) : 1);
-
- Manager.setConstructorByXClass(last.xclass, {
- constructor: ret,
- priority: priority
- });
- //方便调试
- ret.__xclass = last.xclass;
- ret.priority = priority;
- ret.toString = function() {
- return last.xclass;
- }
- }
- ret.extend = extend;
- return ret;
- }
-});
-
-module.exports = UIBase;
-
-});
-define("bui-common/1.1.2/src/component/uibase/align-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 跟指定的元素项对齐的方式
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-
-var $ = require('jquery'),
- UA = require("bui-common/1.1.2/src/ua-debug"),
- CLS_ALIGN_PREFIX ='x-align-',
- win = window;
-
-// var ieMode = document.documentMode || UA.ie;
-
-/*
- inspired by closure library by Google
- see http://yiminghe.iteye.com/blog/1124720
- */
-
-/**
- * 得到会导致元素显示不全的祖先元素
- * @ignore
- */
-function getOffsetParent(element) {
- // ie 这个也不是完全可行
- /**
-
- @ignore
- **/
- // element.offsetParent does the right thing in ie7 and below. Return parent with layout!
- // In other browsers it only includes elements with position absolute, relative or
- // fixed, not elements with overflow set to auto or scroll.
- // if (UA.ie && ieMode < 8) {
- // return element.offsetParent;
- // }
- // 统一的 offsetParent 方法
- var doc = element.ownerDocument,
- body = doc.body,
- parent,
- positionStyle = $(element).css('position'),
- skipStatic = positionStyle == 'fixed' || positionStyle == 'absolute';
-
- if (!skipStatic) {
- return element.nodeName.toLowerCase() == 'html' ? null : element.parentNode;
- }
-
- for (parent = element.parentNode; parent && parent != body; parent = parent.parentNode) {
- positionStyle = $(parent).css('position');
- if (positionStyle != 'static') {
- return parent;
- }
- }
- return null;
-}
-
-/**
- * 获得元素的显示部分的区域
- * @private
- * @ignore
- */
-function getVisibleRectForElement(element) {
- var visibleRect = {
- left:0,
- right:Infinity,
- top:0,
- bottom:Infinity
- },
- el,
- scrollX,
- scrollY,
- winSize,
- doc = element.ownerDocument,
- body = doc.body,
- documentElement = doc.documentElement;
-
- // Determine the size of the visible rect by climbing the dom accounting for
- // all scrollable containers.
- for (el = element; el = getOffsetParent(el);) {
- // clientWidth is zero for inline block elements in ie.
- if ((!UA.ie || el.clientWidth != 0) &&
- // body may have overflow set on it, yet we still get the entire
- // viewport. In some browsers, el.offsetParent may be
- // document.documentElement, so check for that too.
- (el != body && el != documentElement && $(el).css('overflow') != 'visible')) {
- var pos = $(el).offset();
- // add border
- pos.left += el.clientLeft;
- pos.top += el.clientTop;
-
- visibleRect.top = Math.max(visibleRect.top, pos.top);
- visibleRect.right = Math.min(visibleRect.right,
- // consider area without scrollBar
- pos.left + el.clientWidth);
- visibleRect.bottom = Math.min(visibleRect.bottom,
- pos.top + el.clientHeight);
- visibleRect.left = Math.max(visibleRect.left, pos.left);
- }
- }
-
- // Clip by window's viewport.
- scrollX = $(win).scrollLeft();
- scrollY = $(win).scrollTop();
- visibleRect.left = Math.max(visibleRect.left, scrollX);
- visibleRect.top = Math.max(visibleRect.top, scrollY);
- winSize = {
- width:BUI.viewportWidth(),
- height:BUI.viewportHeight()
- };
- visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width);
- visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height);
- return visibleRect.top >= 0 && visibleRect.left >= 0 &&
- visibleRect.bottom > visibleRect.top &&
- visibleRect.right > visibleRect.left ?
- visibleRect : null;
-}
-
-function getElFuturePos(elRegion, refNodeRegion, points, offset) {
- var xy,
- diff,
- p1,
- p2;
-
- xy = {
- left:elRegion.left,
- top:elRegion.top
- };
-
- p1 = getAlignOffset(refNodeRegion, points[0]);
- p2 = getAlignOffset(elRegion, points[1]);
-
- diff = [p2.left - p1.left, p2.top - p1.top];
-
- return {
- left:xy.left - diff[0] + (+offset[0]),
- top:xy.top - diff[1] + (+offset[1])
- };
-}
-
-function isFailX(elFuturePos, elRegion, visibleRect) {
- return elFuturePos.left < visibleRect.left ||
- elFuturePos.left + elRegion.width > visibleRect.right;
-}
-
-function isFailY(elFuturePos, elRegion, visibleRect) {
- return elFuturePos.top < visibleRect.top ||
- elFuturePos.top + elRegion.height > visibleRect.bottom;
-}
-
-function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
- var pos = BUI.cloneObject(elFuturePos),
- size = {
- width:elRegion.width,
- height:elRegion.height
- };
-
- if (overflow.adjustX && pos.left < visibleRect.left) {
- pos.left = visibleRect.left;
- }
-
- // Left edge inside and right edge outside viewport, try to resize it.
- if (overflow['resizeWidth'] &&
- pos.left >= visibleRect.left &&
- pos.left + size.width > visibleRect.right) {
- size.width -= (pos.left + size.width) - visibleRect.right;
- }
-
- // Right edge outside viewport, try to move it.
- if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
- // 保证左边界和可视区域左边界对齐
- pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
- }
-
- // Top edge outside viewport, try to move it.
- if (overflow.adjustY && pos.top < visibleRect.top) {
- pos.top = visibleRect.top;
- }
-
- // Top edge inside and bottom edge outside viewport, try to resize it.
- if (overflow['resizeHeight'] &&
- pos.top >= visibleRect.top &&
- pos.top + size.height > visibleRect.bottom) {
- size.height -= (pos.top + size.height) - visibleRect.bottom;
- }
-
- // Bottom edge outside viewport, try to move it.
- if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
- // 保证上边界和可视区域上边界对齐
- pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
- }
-
- return BUI.mix(pos, size);
-}
-
-
-function flip(points, reg, map) {
- var ret = [];
- $.each(points, function (index,p) {
- ret.push(p.replace(reg, function (m) {
- return map[m];
- }));
- });
- return ret;
-}
-
-function flipOffset(offset, index) {
- offset[index] = -offset[index];
- return offset;
-}
-
-
-/**
- * @class BUI.Component.UIBase.Align
- * Align extension class.
- * Align component with specified element.
- *
- * var overlay = new Overlay( {
- * align :{
- * node: null, // 参考元素, falsy 或 window 为可视区域, 'trigger' 为触发元素, 其他为指定元素
- * points: ['cc','cc'], // ['tr', 'tl'] 表示 overlay 的 tl 与参考节点的 tr 对齐
- * offset: [0, 0] // 有效值为 [n, m]
- * }
- * });
- *
- */
-
- /**
- * 设置对齐属性
- * @type {Object}
- * @field
- *
- * var align = {
- * node: null, // 参考元素, falsy 或 window 为可视区域, 'trigger' 为触发元素, 其他为指定元素
- * points: ['cc','cc'], // ['tr', 'tl'] 表示 overlay 的 tl 与参考节点的 tr 对齐
- * offset: [0, 0] // 有效值为 [n, m]
- * };
- * overlay.set('align',align);
- *
- */
- align:{
- shared : false,
- value:{}
- }
-};
-
-function getRegion(node) {
- var offset, w, h;
- if (node.length && !$.isWindow(node[0])) {
- offset = node.offset();
- w = node.outerWidth();
- h = node.outerHeight();
- } else {
- offset = { left:BUI.scrollLeft(), top:BUI.scrollTop() };
- w = BUI.viewportWidth();
- h = BUI.viewportHeight();
- }
- offset.width = w;
- offset.height = h;
- return offset;
-}
-
-/**
- * 获取 node 上的 align 对齐点 相对于页面的坐标
- * @param region
- * @param align
- */
-function getAlignOffset(region, align) {
- var V = align.charAt(0),
- H = align.charAt(1),
- w = region.width,
- h = region.height,
- x, y;
-
- x = region.left;
- y = region.top;
-
- if (V === 'c') {
- y += h / 2;
- } else if (V === 'b') {
- y += h;
- }
-
- if (H === 'c') {
- x += w / 2;
- } else if (H === 'r') {
- x += w;
- }
-
- return { left:x, top:y };
-}
-
-//清除对齐的css样式
-function clearAlignCls(el){
- var cls = el.attr('class'),
- regex = new RegExp('\s?'+CLS_ALIGN_PREFIX+'[a-z]{2}-[a-z]{2}','ig'),
- arr = regex.exec(cls);
- if(arr){
- el.removeClass(arr.join(' '));
- }
-}
-
-Align.prototype =
-{
- _uiSetAlign:function (v,ev) {
- var alignCls = '',
- el,
- selfAlign; //points 的第二个参数,是自己对齐于其他节点的的方式
- if (v && v.points) {
- this.align(v.node, v.points, v.offset, v.overflow);
- this.set('cachePosition',null);
- el = this.get('el');
- clearAlignCls(el);
- selfAlign = v.points.join('-');
- alignCls = CLS_ALIGN_PREFIX + selfAlign;
- el.addClass(alignCls);
- /**/
- }
- },
- __bindUI : function(){
- var _self = this;
-
- var fn = BUI.wrapBehavior(_self,'handleWindowResize');
-
- _self.on('show',function(){
- $(window).on('resize',fn);
- });
-
- _self.on('hide',function(){
- $(window).off('resize',fn);
- });
- },
- //处理window resize事件
- handleWindowResize : function(){
- var _self = this,
- align = _self.get('align');
-
- _self.set('align',align);
- },
- /*
- 对齐 Overlay 到 node 的 points 点, 偏移 offset 处
- @method
- @ignore
- @param {Element} node 参照元素, 可取配置选项中的设置, 也可是一元素
- @param {String[]} points 对齐方式
- @param {Number[]} [offset] 偏移
- */
- align:function (refNode, points, offset, overflow) {
- refNode = $(refNode || win);
- offset = offset && [].concat(offset) || [0, 0];
- overflow = overflow || {};
-
- var self = this,
- el = self.get('el'),
- fail = 0,
- // 当前节点可以被放置的显示区域
- visibleRect = getVisibleRectForElement(el[0]),
- // 当前节点所占的区域, left/top/width/height
- elRegion = getRegion(el),
- // 参照节点所占的区域, left/top/width/height
- refNodeRegion = getRegion(refNode),
- // 当前节点将要被放置的位置
- elFuturePos = getElFuturePos(elRegion, refNodeRegion, points, offset),
- // 当前节点将要所处的区域
- newElRegion = BUI.merge(elRegion, elFuturePos);
-
- // 如果可视区域不能完全放置当前节点时允许调整
- if (visibleRect && (overflow.adjustX || overflow.adjustY)) {
-
- // 如果横向不能放下
- if (isFailX(elFuturePos, elRegion, visibleRect)) {
- fail = 1;
- // 对齐位置反下
- points = flip(points, /[lr]/ig, {
- l:'r',
- r:'l'
- });
- // 偏移量也反下
- offset = flipOffset(offset, 0);
- }
-
- // 如果纵向不能放下
- if (isFailY(elFuturePos, elRegion, visibleRect)) {
- fail = 1;
- // 对齐位置反下
- points = flip(points, /[tb]/ig, {
- t:'b',
- b:'t'
- });
- // 偏移量也反下
- offset = flipOffset(offset, 1);
- }
-
- // 如果失败,重新计算当前节点将要被放置的位置
- if (fail) {
- elFuturePos = getElFuturePos(elRegion, refNodeRegion, points, offset);
- BUI.mix(newElRegion, elFuturePos);
- }
-
- var newOverflowCfg = {};
-
- // 检查反下后的位置是否可以放下了
- // 如果仍然放不下只有指定了可以调整当前方向才调整
- newOverflowCfg.adjustX = overflow.adjustX &&
- isFailX(elFuturePos, elRegion, visibleRect);
-
- newOverflowCfg.adjustY = overflow.adjustY &&
- isFailY(elFuturePos, elRegion, visibleRect);
-
- // 确实要调整,甚至可能会调整高度宽度
- if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
- newElRegion = adjustForViewport(elFuturePos, elRegion,
- visibleRect, newOverflowCfg);
- }
- }
-
- // 新区域位置发生了变化
- if (newElRegion.left != elRegion.left) {
- self.setInternal('x', null);
- self.get('view').setInternal('x', null);
- self.set('x', newElRegion.left);
- }
-
- if (newElRegion.top != elRegion.top) {
- // https://github.com/kissyteam/kissy/issues/190
- // 相对于屏幕位置没变,而 left/top 变了
- // 例如
- * control.center('#t1'); //控件处于容器#t1的中间位置
- *
- * @param {undefined|String|HTMLElement|jQuery} node
- *
- */
- center:function (node) {
- var self = this;
- self.set('align', {
- node:node,
- points:['cc', 'cc'],
- offset:[0, 0]
- });
- return self;
- }
-};
-
-module.exports = Align;
-
-});
-define("bui-common/1.1.2/src/component/uibase/autoshow-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview click,focus,hover等引起控件显示,并且定位
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * 处理自动显示控件的扩展,一般用于显示menu,picker,tip等
- * @class BUI.Component.UIBase.AutoShow
- */
-function autoShow() {
-
-}
-
-autoShow.ATTRS = {
-
- /**
- * 触发显示控件的DOM选择器
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {HTMLElement|String|jQuery} trigger
- */
- /**
- * 触发显示控件的DOM选择器
- * @type {HTMLElement|String|jQuery}
- */
- trigger: {
-
- },
- delegateTigger: {
- getter: function() {
- this.get('delegateTrigger'); //兼容之前的版本
- },
- setter: function(v) {
- this.set('delegateTrigger', v);
- }
-
- },
- /**
- * 是否使用代理的方式触发显示控件,如果tigger不是字符串,此属性无效
- *
- * var overlay = new Overlay({ //点击.t1(无论创建控件时.t1是否存在)时显示,点击.t1,overlay之外的元素隐藏
- * trigger : '.t1',
- * autoHide : true,
- * delegateTrigger : true, //使用委托的方式触发显示控件
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Boolean} [delegateTrigger = false]
- */
- /**
- * 是否使用代理的方式触发显示控件,如果tigger不是字符串,此属性无效
- * @type {Boolean}
- * @ignore
- */
- delegateTrigger: {
- value: false
- },
- /**
- * 选择器是否始终跟随触发器对齐
- * @cfg {Boolean} autoAlign
- * @ignore
- */
- /**
- * 选择器是否始终跟随触发器对齐
- * @type {Boolean}
- * @protected
- */
- autoAlign: {
- value: true
- },
- /**
- * 显示时是否默认获取焦点
- * @type {Boolean}
- */
- autoFocused: {
- value: true
- },
- /**
- * 如果设置了这个样式,那么触发显示(overlay)时trigger会添加此样式
- * @type {Object}
- */
- triggerActiveCls: {
-
- },
- /**
- * 控件显示时由此trigger触发,当配置项 trigger 选择器代表多个DOM 对象时,
- * 控件可由多个DOM对象触发显示。
- *
- * overlay.on('show',function(){
- * var curTrigger = overlay.get('curTrigger');
- * //TO DO
- * });
- *
- * @type {jQuery}
- * @readOnly
- */
- curTrigger: {
-
- },
- /**
- * 触发显示时的回调函数
- * @cfg {Function} triggerCallback
- * @ignore
- */
- /**
- * 触发显示时的回调函数
- * @type {Function}
- * @ignore
- */
- triggerCallback: {
-
- },
- /**
- * 显示菜单的事件
- *
- * var overlay = new Overlay({ //移动到#t1时显示,移动出#t1,overlay之外控件隐藏
- * trigger : '#t1',
- * autoHide : true,
- * triggerEvent :'mouseover',
- * autoHideType : 'leave',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- *
- * @cfg {String} [triggerEvent='click']
- * @default 'click'
- */
- /**
- * 显示菜单的事件
- * @type {String}
- * @default 'click'
- * @ignore
- */
- triggerEvent: {
- value: 'click'
- },
- /**
- * 因为触发元素发生改变而导致控件隐藏
- * @cfg {String} triggerHideEvent
- * @ignore
- */
- /**
- * 因为触发元素发生改变而导致控件隐藏
- * @type {String}
- * @ignore
- */
- triggerHideEvent: {
-
- },
- events: {
- value: {
- /**
- * 当触发器(触发选择器出现)发生改变时,经常用于一个选择器对应多个触发器的情况
- *
- * overlay.on('triggerchange',function(ev){
- * var curTrigger = ev.curTrigger;
- * overlay.set('content',curTrigger.html());
- * });
- *
- * @event
- * @param {Object} e 事件对象
- * @param {jQuery} e.prevTrigger 之前触发器,可能为null
- * @param {jQuery} e.curTrigger 当前的触发器
- */
- 'triggerchange': false
- }
- }
-};
-
-autoShow.prototype = {
-
- __createDom: function() {
- this._setTrigger();
- },
- __bindUI: function() {
- var _self = this,
- triggerActiveCls = _self.get('triggerActiveCls');
- if (triggerActiveCls) {
- _self.on('hide', function() {
- var curTrigger = _self.get('curTrigger');
- if (curTrigger) {
- curTrigger.removeClass(triggerActiveCls);
- }
- });
- }
-
- },
- _setTrigger: function() {
- var _self = this,
- triggerEvent = _self.get('triggerEvent'),
- triggerHideEvent = _self.get('triggerHideEvent'),
- triggerCallback = _self.get('triggerCallback'),
- triggerActiveCls = _self.get('triggerActiveCls') || '',
- trigger = _self.get('trigger'),
- isDelegate = _self.get('delegateTrigger'),
- triggerEl = $(trigger);
-
- //触发显示
- function tiggerShow(ev) {
- if (_self.get('disabled')) { //如果禁用则中断
- return;
- }
- var prevTrigger = _self.get('curTrigger'),
- curTrigger = isDelegate ? $(ev.currentTarget) : $(this),
- align = _self.get('align');
- if (!prevTrigger || prevTrigger[0] != curTrigger[0]) {
- if (prevTrigger) {
- prevTrigger.removeClass(triggerActiveCls);
- }
- _self.set('curTrigger', curTrigger);
- _self.fire('triggerchange', {
- prevTrigger: prevTrigger,
- curTrigger: curTrigger
- });
- }
- curTrigger.addClass(triggerActiveCls);
- if (_self.get('autoAlign')) {
- align.node = curTrigger;
-
- }
- _self.set('align', align);
- _self.show();
-
-
- triggerCallback && triggerCallback(ev);
- }
-
- //触发隐藏
- function tiggerHide(ev) {
- var toElement = ev.toElement || ev.relatedTarget;
- if (!toElement || !_self.containsElement(toElement)) { //mouseleave时,如果移动到当前控件上,取消消失
- _self.hide();
- }
- }
-
- if (triggerEvent) {
- if (isDelegate && BUI.isString(trigger)) {
- $(document).delegate(trigger, triggerEvent, tiggerShow);
- } else {
- triggerEl.on(triggerEvent, tiggerShow);
- }
-
- }
-
- if (triggerHideEvent) {
- if (isDelegate && BUI.isString(trigger)) {
- $(document).delegate(trigger, triggerHideEvent, tiggerHide);
- } else {
- triggerEl.on(triggerHideEvent, tiggerHide);
- }
- }
- },
- __renderUI: function() {
- var _self = this,
- align = _self.get('align');
- //如果控件显示时不是由trigger触发,则同父元素对齐
- if (align && !align.node) {
- align.node = _self.get('render') || _self.get('trigger');
- }
- }
-};
-
-module.exports = autoShow;
-
-});
-define("bui-common/1.1.2/src/component/uibase/autohide-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 点击或移出控件外部,控件隐藏
- * @author dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery'),
- wrapBehavior = BUI.wrapBehavior,
- getWrapBehavior = BUI.getWrapBehavior;
-
-function isExcept(self, elem) {
- var hideExceptNode = self.get('hideExceptNode');
- if (hideExceptNode && hideExceptNode.length) {
- return $.contains(hideExceptNode[0], elem);
- }
- return false;
-}
-/**
- * 点击隐藏控件的扩展
- * @class BUI.Component.UIBase.AutoHide
- */
-function autoHide() {
-
-}
-
-autoHide.ATTRS = {
-
- /**
- * 控件自动隐藏的事件,这里支持2种:
- * - 'click'
- * - 'leave'
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * var overlay = new Overlay({ //移动到#t1时显示,移动出#t1,overlay之外控件隐藏
- * trigger : '#t1',
- * autoHide : true,
- * triggerEvent :'mouseover',
- * autoHideType : 'leave',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- *
- * @cfg {String} [autoHideType = 'click']
- */
- /**
- * 控件自动隐藏的事件,这里支持2种:
- * 'click',和'leave',默认为'click'
- * @type {String}
- */
- autoHideType: {
- value: 'click'
- },
- /**
- * 是否自动隐藏
- *
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Object} autoHide
- */
- /**
- * 是否自动隐藏
- * @type {Object}
- * @ignore
- */
- autoHide: {
- value: false
- },
- /**
- * 点击或者移动到此节点时不触发自动隐藏
- *
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,#t2,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * hideExceptNode : '#t2',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Object} hideExceptNode
- */
- hideExceptNode: {
-
- },
- events: {
- value: {
- /**
- * @event autohide
- * 点击控件外部时触发,只有在控件设置自动隐藏(autoHide = true)有效
- * 可以阻止控件隐藏,通过在事件监听函数中 return false
- *
- * overlay.on('autohide',function(){
- * var curTrigger = overlay.curTrigger; //当前触发的项
- * if(condtion){
- * return false; //阻止隐藏
- * }
- * });
- *
- */
- autohide: false
- }
- }
-};
-
-autoHide.prototype = {
-
- __bindUI: function() {
- var _self = this;
-
- _self.on('afterVisibleChange', function(ev) {
- var visible = ev.newVal;
- if (_self.get('autoHide')) {
- if (visible) {
- _self._bindHideEvent();
- } else {
- _self._clearHideEvent();
- }
- }
- });
- },
- /**
- * 处理鼠标移出事件,不影响{BUI.Component.Controller#handleMouseLeave}事件
- * @param {jQuery.Event} ev 事件对象
- */
- handleMoveOuter: function(ev) {
- var _self = this,
- target = ev.toElement || ev.relatedTarget;
- if (!_self.containsElement(target) && !isExcept(_self, target)) {
- if (_self.fire('autohide') !== false) {
- _self.hide();
- }
- }
- },
- /**
- * 点击页面时的处理函数
- * @param {jQuery.Event} ev 事件对象
- * @protected
- */
- handleDocumentClick: function(ev) {
- var _self = this,
- target = ev.target;
- if (!_self.containsElement(target) && !isExcept(_self, target)) {
- if (_self.fire('autohide') !== false) {
- _self.hide();
- }
- }
- },
- _bindHideEvent: function() {
- var _self = this,
- trigger = _self.get('curTrigger'),
- autoHideType = _self.get('autoHideType');
- if (autoHideType === 'click') {
- $(document).on('mousedown', wrapBehavior(_self, 'handleDocumentClick'));
- } else {
- _self.get('el').on('mouseleave', wrapBehavior(_self, 'handleMoveOuter'));
- if (trigger) {
- $(trigger).on('mouseleave', wrapBehavior(_self, 'handleMoveOuter'))
- }
- }
-
- },
- //清除绑定的隐藏事件
- _clearHideEvent: function() {
- var _self = this,
- trigger = _self.get('curTrigger'),
- autoHideType = _self.get('autoHideType');
- if (autoHideType === 'click') {
- $(document).off('mousedown', getWrapBehavior(_self, 'handleDocumentClick'));
- } else {
- _self.get('el').off('mouseleave', getWrapBehavior(_self, 'handleMoveOuter'));
- if (trigger) {
- $(trigger).off('mouseleave', getWrapBehavior(_self, 'handleMoveOuter'))
- }
- }
- }
-};
-
-module.exports = autoHide;
-
-});
-define("bui-common/1.1.2/src/component/uibase/close-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview close 关闭或隐藏控件
- * @author yiminghe@gmail.com
- * copied and modified by dxq613@gmail.com
- * @ignore
- */
-
-
-var $ = require('jquery');
-
-
-var CLS_PREFIX = BUI.prefix + 'ext-';
-
-function getCloseRenderBtn(self) {
- return $(self.get('closeTpl'));
-}
-
-/**
- * 关闭按钮的视图类
- * @class BUI.Component.UIBase.CloseView
- * @private
- */
-function CloseView() {}
-
-CloseView.ATTRS = {
- closeTpl: {
- value: '' +
- '关闭<' + '/span>' +
- '<' + '/a>'
- },
- closeable: {
- value: true
- },
- closeBtn: {}
-};
-
-CloseView.prototype = {
- _uiSetCloseable: function(v) {
- var self = this,
- btn = self.get('closeBtn');
- if (v) {
- if (!btn) {
- self.setInternal('closeBtn', btn = getCloseRenderBtn(self));
- }
- btn.appendTo(self.get('el'), undefined);
- } else {
- if (btn) {
- btn.remove();
- }
- }
- }
-};
-
-/**
- * @class BUI.Component.UIBase.Close
- * Close extension class.
- * Represent a close button.
- */
-function Close() {}
-
-var HIDE = 'hide';
-Close.ATTRS = {
- /**
- * 关闭按钮的默认模版
- *
- * var overlay = new Overlay({
- * closeTpl : 'x',
- * closeable : true,
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {String} closeTpl
- */
- /**
- * 关闭按钮的默认模版
- * @type {String}
- * @protected
- */
- closeTpl: {
- view: true
- },
- /**
- * 是否出现关闭按钮
- * @cfg {Boolean} [closeable = false]
- */
- /**
- * 是否出现关闭按钮
- * @type {Boolean}
- */
- closeable: {
- view: 1
- },
-
- /**
- * 关闭按钮.
- * @protected
- * @type {jQuery}
- */
- closeBtn: {
- view: 1
- },
- /**
- * 关闭时隐藏还是移除DOM结构
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @class BUI.Component.UIBase.Drag
- */
-var drag = function() {
-
-};
-
-drag.ATTRS = {
-
- /**
- * 点击拖动的节点
- *
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @cfg {jQuery} dragNode
- */
- /**
- * 点击拖动的节点
- * @type {jQuery}
- * @ignore
- */
- dragNode: {
-
- },
- /**
- * 是否正在拖动
- * @type {Boolean}
- * @protected
- */
- draging: {
- setter: function(v) {
- if (v === true) {
- return {};
- }
- },
- value: null
- },
- /**
- * 拖动的限制范围
- *
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @cfg {jQuery} constraint
- */
- /**
- * 拖动的限制范围
- * @type {jQuery}
- * @ignore
- */
- constraint: {
-
- },
- /**
- * @private
- * @type {jQuery}
- */
- dragBackEl: {
- /** @private **/
- getter: function() {
- return $('#' + dragBackId);
- }
- }
-};
-var dragTpl = '';
-
-function initBack() {
- var el = $(dragTpl).css('opacity', 0).prependTo('body');
- return el;
-}
-drag.prototype = {
-
- __bindUI: function() {
- var _self = this,
- constraint = _self.get('constraint'),
- dragNode = _self.get('dragNode');
- if (!dragNode) {
- return;
- }
- dragNode.on('mousedown', function(e) {
-
- if (e.which == 1) {
- e.preventDefault();
- _self.set('draging', {
- elX: _self.get('x'),
- elY: _self.get('y'),
- startX: e.pageX,
- startY: e.pageY
- });
- registEvent();
- }
- });
- /**
- * @private
- */
- function mouseMove(e) {
- var draging = _self.get('draging');
- if (draging) {
- e.preventDefault();
- _self._dragMoveTo(e.pageX, e.pageY, draging, constraint);
- }
- }
- /**
- * @private
- */
- function mouseUp(e) {
- if (e.which == 1) {
- _self.set('draging', false);
- var dragBackEl = _self.get('dragBackEl');
- if (dragBackEl) {
- dragBackEl.hide();
- }
- unregistEvent();
- }
- }
- /**
- * @private
- */
- function registEvent() {
- $(document).on('mousemove', mouseMove);
- $(document).on('mouseup', mouseUp);
- }
- /**
- * @private
- */
- function unregistEvent() {
- $(document).off('mousemove', mouseMove);
- $(document).off('mouseup', mouseUp);
- }
-
- },
- _dragMoveTo: function(x, y, draging, constraint) {
- var _self = this,
- dragBackEl = _self.get('dragBackEl'),
- draging = draging || _self.get('draging'),
- offsetX = draging.startX - x,
- offsetY = draging.startY - y;
- if (!dragBackEl.length) {
- dragBackEl = initBack();
- }
- dragBackEl.css({
- cursor: 'move',
- display: 'block'
- });
- _self.set('xy', [_self._getConstrainX(draging.elX - offsetX, constraint),
- _self._getConstrainY(draging.elY - offsetY, constraint)
- ]);
-
- },
- _getConstrainX: function(x, constraint) {
- var _self = this,
- width = _self.get('el').outerWidth(),
- endX = x + width,
- curX = _self.get('x');
- //如果存在约束
- if (constraint) {
- var constraintOffset = constraint.offset();
- if (constraintOffset.left >= x) {
- return constraintOffset.left;
- }
- if (constraintOffset.left + constraint.width() < endX) {
- return constraintOffset.left + constraint.width() - width;
- }
- return x;
- }
- //当左右顶点都在视图内,移动到此点
- if (BUI.isInHorizontalView(x) && BUI.isInHorizontalView(endX)) {
- return x;
- }
-
- return curX;
- },
- _getConstrainY: function(y, constraint) {
- var _self = this,
- height = _self.get('el').outerHeight(),
- endY = y + height,
- curY = _self.get('y');
- //如果存在约束
- if (constraint) {
- var constraintOffset = constraint.offset();
- if (constraintOffset.top > y) {
- return constraintOffset.top;
- }
- if (constraintOffset.top + constraint.height() < endY) {
- return constraintOffset.top + constraint.height() - height;
- }
- return y;
- }
- //当左右顶点都在视图内,移动到此点
- if (BUI.isInVerticalView(y) && BUI.isInVerticalView(endY)) {
- return y;
- }
-
- return curY;
- }
-};
-
-module.exports = drag;
-
-});
-define("bui-common/1.1.2/src/component/uibase/keynav-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 使用键盘导航
- * @ignore
- */
-
-
- var $ = require('jquery'),
- KeyCode = require("bui-common/1.1.2/src/keycode-debug"),
- wrapBehavior = BUI.wrapBehavior,
- getWrapBehavior = BUI.getWrapBehavior;
- /**
- * 键盘导航
- * @class BUI.Component.UIBase.KeyNav
- */
- var keyNav = function() {
-
- };
-
- keyNav.ATTRS = {
-
- /**
- * 是否允许键盘导航
- * @cfg {Boolean} [allowKeyNav = true]
- */
- allowKeyNav: {
- value: true
- },
- /**
- * 导航使用的事件
- * @cfg {String} [navEvent = 'keydown']
- */
- navEvent: {
- value: 'keydown'
- },
- /**
- * 当获取事件的DOM是 input,textarea,select等时,不处理键盘导航
- * @cfg {Object} [ignoreInputFields='true']
- */
- ignoreInputFields: {
- value: true
- }
-
- };
-
- keyNav.prototype = {
-
- __bindUI: function() {
-
- },
- _uiSetAllowKeyNav: function(v) {
- var _self = this,
- eventName = _self.get('navEvent'),
- el = _self.get('el');
- if (v) {
- el.on(eventName, wrapBehavior(_self, '_handleKeyDown'));
- } else {
- el.off(eventName, getWrapBehavior(_self, '_handleKeyDown'));
- }
- },
- /**
- * 处理键盘导航
- * @private
- */
- _handleKeyDown: function(ev) {
- var _self = this,
- ignoreInputFields = _self.get('ignoreInputFields'),
- code = ev.which;
- if (ignoreInputFields && $(ev.target).is('input,select,textarea')) {
- return;
- }
-
- switch (code) {
- case KeyCode.UP:
- //ev.preventDefault();
- _self.handleNavUp(ev);
- break;
- case KeyCode.DOWN:
- //ev.preventDefault();
- _self.handleNavDown(ev);
- break;
- case KeyCode.RIGHT:
- // ev.preventDefault();
- _self.handleNavRight(ev);
- break;
- case KeyCode.LEFT:
- //ev.preventDefault();
- _self.handleNavLeft(ev);
- break;
- case KeyCode.ENTER:
- _self.handleNavEnter(ev);
- break;
- case KeyCode.ESC:
- _self.handleNavEsc(ev);
- break;
- case KeyCode.TAB:
- _self.handleNavTab(ev);
- break;
- default:
- break;
- }
- },
- /**
- * 处理向上导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavUp: function(ev) {
- // body...
- },
- /**
- * 处理向下导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavDown: function(ev) {
- // body...
- },
- /**
- * 处理向左导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavLeft: function(ev) {
- // body...
- },
- /**
- * 处理向右导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavRight: function(ev) {
- // body...
- },
- /**
- * 处理确认键
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavEnter: function(ev) {
- // body...
- },
- /**
- * 处理 esc 键
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavEsc: function(ev) {
- // body...
- },
- /**
- * 处理Tab键
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavTab: function(ev) {
-
- }
-
- };
-
-module.exports = keyNav;
-
-});
-define("bui-common/1.1.2/src/component/uibase/list-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 所有子元素都是同一类的集合
- * @ignore
- */
-
-
-var $ = require('jquery'),
- Selection = require("bui-common/1.1.2/src/component/uibase/selection-debug");
-
-/**
- * 列表一类的控件的扩展,list,menu,grid都是可以从此类扩展
- * @class BUI.Component.UIBase.List
- */
-var list = function() {
-
-};
-
-list.ATTRS = {
-
- /**
- * 选择的数据集合
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- * list.render();
- *
- * @cfg {Array} items
- */
- /**
- * 选择的数据集合
- *
- * list.set('items',items); //列表会直接替换内容
- * //等同于
- * list.clearItems();
- * list.addItems(items);
- *
- * @type {Array}
- */
- items: {
- shared: false,
- view: true
- },
- /**
- * 选项的默认key值
- * @cfg {String} [idField = 'id']
- */
- idField: {
- value: 'id'
- },
- /**
- * 列表项的默认模板,仅在初始化时传入。
- * @type {String}
- * @ignore
- */
- itemTpl: {
- view: true
- },
- /**
- * 列表项的渲染函数,应对列表项之间有很多差异时
- *
- * var list = new List.SimpleList({
- * itemTplRender : function(item){
- * if(item.type == '1'){
- * return '<li><img src="xxx.jpg"/>'+item.text+'</li>'
- * }else{
- * return '<li>item.text</li>'
- * }
- * },
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1',type : '0'},{value : '2',text : '2',type : '1'}]
- * });
- * list.render();
- *
- * @type {Function}
- */
- itemTplRender: {
- view: true
- },
- /**
- * 子控件各个状态默认采用的样式
- *
- * var list = new List.SimpleList({
- * render : '#t1',
- * itemStatusCls : {
- * selected : 'active', //默认样式为list-item-selected,现在变成'active'
- * hover : 'hover' //默认样式为list-item-hover,现在变成'hover'
- * },
- * items : [{id : '1',text : '1',type : '0'},{id : '2',text : '2',type : '1'}]
- * });
- * list.render();
- *
- * see {@link BUI.Component.Controller#property-statusCls}
- * @type {Object}
- */
- itemStatusCls: {
- view: true,
- value: {}
- },
- events: {
-
- value: {
- /**
- * 选项点击事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.UIBase.ListItem} e.item 点击的选项
- * @param {HTMLElement} e.element 选项代表的DOM对象
- * @param {HTMLElement} e.domTarget 点击的DOM对象
- * @param {HTMLElement} e.domEvent 点击的原生事件对象
- */
- 'itemclick': true
- }
- }
-};
-
-list.prototype = {
-
- /**
- * 获取选项的数量
- *
- * var count = list.getItemCount();
- *
- * @return {Number} 选项数量
- */
- getItemCount: function() {
- return this.getItems().length;
- },
- /**
- * 获取字段的值
- * @param {*} item 字段名
- * @param {String} field 字段名
- * @return {*} 字段的值
- * @protected
- */
- getValueByField: function(item, field) {
-
- },
- /**
- * 获取所有选项值,如果选项是子控件,则是所有子控件
- *
- * var items = list.getItems();
- * //等同
- * list.get(items);
- *
- * @return {Array} 选项值集合
- */
- getItems: function() {
-
- },
- /**
- * 获取第一项
- *
- * var item = list.getFirstItem();
- * //等同
- * list.getItemAt(0);
- *
- * @return {Object|BUI.Component.Controller} 选项值(子控件)
- */
- getFirstItem: function() {
- return this.getItemAt(0);
- },
- /**
- * 获取最后一项
- *
- * var item = list.getLastItem();
- * //等同
- * list.getItemAt(list.getItemCount()-1);
- *
- * @return {Object|BUI.Component.Controller} 选项值(子控件)
- */
- getLastItem: function() {
- return this.getItemAt(this.getItemCount() - 1);
- },
- /**
- * 通过索引获取选项值(子控件)
- *
- * var item = list.getItemAt(0); //获取第1个
- * var item = list.getItemAt(2); //获取第3个
- *
- * @param {Number} index 索引值
- * @return {Object|BUI.Component.Controller} 选项(子控件)
- */
- getItemAt: function(index) {
- return this.getItems()[index] || null;
- },
- /**
- * 通过Id获取选项,如果是改变了idField则通过改变的idField来查找选项
- *
- * //如果idField = 'id'
- * var item = list.getItem('2');
- * //等同于
- * list.findItemByField('id','2');
- *
- * //如果idField = 'value'
- * var item = list.getItem('2');
- * //等同于
- * list.findItemByField('value','2');
- *
- * @param {String} id 编号
- * @return {Object|BUI.Component.Controller} 选项(子控件)
- */
- getItem: function(id) {
- var field = this.get('idField');
- return this.findItemByField(field, id);
- },
- /**
- * 返回指定项的索引
- *
- * var index = list.indexOf(item); //返回索引,不存在则返回-1
- *
- * @param {Object|BUI.Component.Controller} item 选项
- * @return {Number} 项的索引值
- */
- indexOfItem: function(item) {
- return BUI.Array.indexOf(item, this.getItems());
- },
- /**
- * 添加多条选项
- *
- * var items = [{id : '1',text : '1'},{id : '2',text : '2'}];
- * list.addItems(items);
- *
- * @param {Array} items 记录集合(子控件配置项)
- */
- addItems: function(items) {
- var _self = this;
- BUI.each(items, function(item) {
- _self.addItem(item);
- });
- },
- /**
- * 插入多条记录
- *
- * var items = [{id : '1',text : '1'},{id : '2',text : '2'}];
- * list.addItemsAt(items,0); // 在最前面插入
- * list.addItemsAt(items,2); //第三个位置插入
- *
- * @param {Array} items 多条记录
- * @param {Number} start 起始位置
- */
- addItemsAt: function(items, start) {
- var _self = this;
- BUI.each(items, function(item, index) {
- _self.addItemAt(item, start + index);
- });
- },
- /**
- * 更新列表项,修改选项值后,DOM跟随变化
- *
- * var item = list.getItem('2');
- * list.text = '新内容'; //此时对应的DOM不会变化
- * list.updateItem(item); //DOM进行相应的变化
- *
- * @param {Object} item 选项值
- */
- updateItem: function(item) {
-
- },
- /**
- * 添加选项,添加在控件最后
- *
- *
- * list.addItem({id : '3',text : '3',type : '0'});
- *
- *
- * @param {Object|BUI.Component.Controller} item 选项,子控件配置项、子控件
- * @return {Object|BUI.Component.Controller} 子控件或者选项记录
- */
- addItem: function(item) {
- return this.addItemAt(item, this.getItemCount());
- },
- /**
- * 在指定位置添加选项
- *
- * list.addItemAt({id : '3',text : '3',type : '0'},0); //第一个位置
- *
- * @param {Object|BUI.Component.Controller} item 选项,子控件配置项、子控件
- * @param {Number} index 索引
- * @return {Object|BUI.Component.Controller} 子控件或者选项记录
- */
- addItemAt: function(item, index) {
-
- },
- /**
- * 根据字段查找指定的项
- * @param {String} field 字段名
- * @param {Object} value 字段值
- * @return {Object} 查询出来的项(传入的记录或者子控件)
- * @protected
- */
- findItemByField: function(field, value) {
-
- },
- /**
- *
- * 获取此项显示的文本
- * @param {Object} item 获取记录显示的文本
- * @protected
- */
- getItemText: function(item) {
-
- },
- /**
- * 清除所有选项,不等同于删除全部,此时不会触发删除事件
- *
- * list.clearItems();
- * //等同于
- * list.set('items',items);
- *
- */
- clearItems: function() {
- var _self = this,
- items = _self.getItems();
- items.splice(0);
- _self.clearControl();
- },
- /**
- * 删除选项
- *
- * var item = list.getItem('1');
- * list.removeItem(item);
- *
- * @param {Object|BUI.Component.Controller} item 选项(子控件)
- */
- removeItem: function(item) {
-
- },
- /**
- * 移除选项集合
- *
- * var items = list.getSelection();
- * list.removeItems(items);
- *
- * @param {Array} items 选项集合
- */
- removeItems: function(items) {
- var _self = this;
-
- BUI.each(items, function(item) {
- _self.removeItem(item);
- });
- },
- /**
- * 通过索引删除选项
- *
- * list.removeItemAt(0); //删除第一个
- *
- * @param {Number} index 索引
- */
- removeItemAt: function(index) {
- this.removeItem(this.getItemAt(index));
- },
- /**
- * @protected
- * @template
- * 清除所有的子控件或者列表项的DOM
- */
- clearControl: function() {
-
- }
-}
-
-
-
-
-
-function clearSelected(item) {
- if (item.selected) {
- item.selected = false;
- }
- if (item.set) {
- item.set('selected', false);
- }
-}
-
-function beforeAddItem(self, item) {
-
- var c = item.isController ? item.getAttrVals() : item,
- defaultTpl = self.get('itemTpl'),
- defaultStatusCls = self.get('itemStatusCls'),
- defaultTplRender = self.get('itemTplRender');
-
- //配置默认模板
- if (defaultTpl && !c.tpl) {
- setItemAttr(item, 'tpl', defaultTpl);
- // c.tpl = defaultTpl;
- }
- //配置默认渲染函数
- if (defaultTplRender && !c.tplRender) {
- setItemAttr(item, 'tplRender', defaultTplRender);
- //c.tplRender = defaultTplRender;
- }
- //配置默认状态样式
- if (defaultStatusCls) {
- var statusCls = c.statusCls || item.isController ? item.get('statusCls') : {};
- BUI.each(defaultStatusCls, function(v, k) {
- if (v && !statusCls[k]) {
- statusCls[k] = v;
- }
- });
- setItemAttr(item, 'statusCls', statusCls)
- //item.statusCls = statusCls;
- }
- // clearSelected(item);
-}
-
-function setItemAttr(item, name, val) {
- if (item.isController) {
- item.set(name, val);
- } else {
- item[name] = val;
- }
-}
-
-/**
- * @class BUI.Component.UIBase.ChildList
- * 选中其中的DOM结构
- * @extends BUI.Component.UIBase.List
- * @mixins BUI.Component.UIBase.Selection
- */
-var childList = function() {
- this.__init();
-};
-
-childList.ATTRS = BUI.merge(true, list.ATTRS, Selection.ATTRS, {
- items: {
- sync: false
- },
- /**
- * 配置的items 项是在初始化时作为children
- * @protected
- * @type {Boolean}
- */
- autoInitItems: {
- value: true
- },
- /**
- * 使用srcNode时,是否将内部的DOM转换成子控件
- * @type {Boolean}
- */
- isDecorateChild: {
- value: true
- },
- /**
- * 默认的加载控件内容的配置,默认值:
- * - * { - * property : 'children', - * dataType : 'json' - * } - *- * @type {Object} - */ - defaultLoaderCfg: { - value: { - property: 'children', - dataType: 'json' - } - } -}); - -BUI.augment(childList, list, Selection, { - //初始化,将items转换成children - __init: function() { - var _self = this, - items = _self.get('items'); - if (items && _self.get('autoInitItems')) { - _self.addItems(items); - } - _self.on('beforeRenderUI', function() { - _self._beforeRenderUI(); - }); - }, - _uiSetItems: function(items) { - var _self = this; - //清理子控件 - _self.clearControl(); - _self.addItems(items); - }, - //渲染子控件 - _beforeRenderUI: function() { - var _self = this, - children = _self.get('children'), - items = _self.get('items'); - BUI.each(children, function(item) { - beforeAddItem(_self, item); - }); - }, - //绑定事件 - __bindUI: function() { - var _self = this, - selectedEvent = _self.get('selectedEvent'); - - _self.on(selectedEvent, function(e) { - var item = e.target; - if (item.get('selectable')) { - if (!item.get('selected')) { - _self.setSelected(item); - } else if (_self.get('multipleSelect')) { - _self.clearSelected(item); - } - } - }); - - _self.on('click', function(e) { - if (e.target !== _self) { - _self.fire('itemclick', { - item: e.target, - domTarget: e.domTarget, - domEvent: e - }); - } - }); - _self.on('beforeAddChild', function(ev) { - beforeAddItem(_self, ev.child); - }); - _self.on('beforeRemoveChild', function(ev) { - var item = ev.child, - selected = item.get('selected'); - //清理选中状态 - if (selected) { - if (_self.get('multipleSelect')) { - _self.clearSelected(item); - } else { - _self.setSelected(null); - } - } - item.set('selected', false); - }); - }, - /** - * @protected - * @override - * 清除者列表项的DOM - */ - clearControl: function() { - this.removeChildren(true); - }, - /** - * 获取所有子控件 - * @return {Array} 子控件集合 - * @override - */ - getItems: function() { - return this.get('children'); - }, - /** - * 更新列表项 - * @param {Object} item 选项值 - */ - updateItem: function(item) { - var _self = this, - idField = _self.get('idField'), - element = _self.findItemByField(idField, item[idField]); - if (element) { - element.setTplContent(); - } - return element; - }, - /** - * 删除项,子控件作为选项 - * @param {Object} element 子控件 - */ - removeItem: function(item) { - var _self = this, - idField = _self.get('idField'); - if (!(item instanceof BUI.Component.Controller)) { - item = _self.findItemByField(idField, item[idField]); - } - this.removeChild(item, true); - }, - /** - * 在指定位置添加选项,此处选项指子控件 - * @param {Object|BUI.Component.Controller} item 子控件配置项、子控件 - * @param {Number} index 索引 - * @return {Object|BUI.Component.Controller} 子控件 - */ - addItemAt: function(item, index) { - return this.addChild(item, index); - }, - findItemByField: function(field, value, root) { - - root = root || this; - var _self = this, - children = root.get('children'), - result = null; - $(children).each(function(index, item) { - if (item.get(field) == value) { - result = item; - } else if (item.get('children').length) { - result = _self.findItemByField(field, value, item); - } - if (result) { - return false; - } - }); - return result; - }, - getItemText: function(item) { - return item.get('el').text(); - }, - getValueByField: function(item, field) { - return item && item.get(field); - }, - /** - * @protected - * @ignore - */ - setItemSelectedStatus: function(item, selected) { - var _self = this, - method = selected ? 'addClass' : 'removeClass', - element = null; - - if (item) { - item.set('selected', selected); - element = item.get('el'); - } - _self.afterSelected(item, selected, element); - }, - /** - * 选项是否被选中 - * @override - * @param {*} item 选项 - * @return {Boolean} 是否选中 - */ - isItemSelected: function(item) { - return item ? item.get('selected') : false; - }, - /** - * 设置所有选项选中 - * @override - */ - setAllSelection: function() { - var _self = this, - items = _self.getItems(); - _self.setSelection(items); - }, - /** - * 获取选中的项的值 - * @return {Array} - * @override - * @ignore - */ - getSelection: function() { - var _self = this, - items = _self.getItems(), - rst = []; - BUI.each(items, function(item) { - if (_self.isItemSelected(item)) { - rst.push(item); - } - - }); - return rst; - } -}); - -list.ChildList = childList; - -module.exports = list; - -/** - * @ignore - * 2013-1-22 - * 更改显示数据的方式,使用 _uiSetItems - */ - -}); -define("bui-common/1.1.2/src/component/uibase/selection-debug", ["jquery"], function(require, exports, module){ -/** - * @fileOverview 单选或者多选 - * @author dxq613@gmail.com - * @ignore - */ -var $ = require('jquery'); -var SINGLE_SELECTED = 'single'; - -/** - * @class BUI.Component.UIBase.Selection - * 选中控件中的项(子元素或者DOM),此类选择的内容有2种 - *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * selectedEvent : 'mouseenter',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {String} [selectedEvent = 'click']
- */
- selectedEvent: {
- value: 'click'
- },
- events: {
- value: {
- /**
- * 选中的菜单改变时发生,
- * 多选时,选中,取消选中都触发此事件,单选时,只有选中时触发此事件
- * @name BUI.Component.UIBase.Selection#selectedchange
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- * @param {Boolean} e.selected 是否选中
- */
- 'selectedchange': false,
-
- /**
- * 选择改变前触发,可以通过return false,阻止selectedchange事件
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {Boolean} e.selected 是否选中
- */
- 'beforeselectedchange': false,
-
- /**
- * 菜单选中
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- */
- 'itemselected': false,
- /**
- * 菜单取消选中
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- */
- 'itemunselected': false
- }
- },
- /**
- * 数据的id字段名称,通过此字段查找对应的数据
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {String} [idField = 'id']
- */
- /**
- * 数据的id字段名称,通过此字段查找对应的数据
- * @type {String}
- * @ignore
- */
- idField: {
- value: 'id'
- },
- /**
- * 是否多选
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * multipleSelect : true,
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {Boolean} [multipleSelect=false]
- */
- /**
- * 是否多选
- * @type {Boolean}
- * @default false
- */
- multipleSelect: {
- value: false
- }
-
-};
-
-selection.prototype =
-
-{
- /**
- * 清理选中的项
- *
- * list.clearSelection();
- *
- *
- */
- clearSelection: function() {
- var _self = this,
- selection = _self.getSelection();
- BUI.each(selection, function(item) {
- _self.clearSelected(item);
- });
- },
- /**
- * 获取选中的项的值
- * @template
- * @return {Array}
- */
- getSelection: function() {
-
- },
- /**
- * 获取选中的第一项
- *
- * var item = list.getSelected(); //多选模式下第一条
- *
- * @return {Object} 选中的第一项或者为undefined
- */
- getSelected: function() {
- return this.getSelection()[0];
- },
- /**
- * 根据 idField 获取到的值
- * @protected
- * @return {Object} 选中的值
- */
- getSelectedValue: function() {
- var _self = this,
- field = _self.get('idField'),
- item = _self.getSelected();
-
- return _self.getValueByField(item, field);
- },
- /**
- * 获取选中的值集合
- * @protected
- * @return {Array} 选中值得集合
- */
- getSelectionValues: function() {
- var _self = this,
- field = _self.get('idField'),
- items = _self.getSelection();
- return $.map(items, function(item) {
- return _self.getValueByField(item, field);
- });
- },
- /**
- * 获取选中的文本
- * @protected
- * @return {Array} 选中的文本集合
- */
- getSelectionText: function() {
- var _self = this,
- items = _self.getSelection();
- return $.map(items, function(item) {
- return _self.getItemText(item);
- });
- },
- /**
- * 移除选中
- *
- * var item = list.getItem('id'); //通过id 获取选项
- * list.setSelected(item); //选中
- *
- * list.clearSelected();//单选模式下清除所选,多选模式下清除选中的第一项
- * list.clearSelected(item); //清除选项的选中状态
- *
- * @param {Object} [item] 清除选项的选中状态,如果未指定则清除选中的第一个选项的选中状态
- */
- clearSelected: function(item) {
- var _self = this;
- item = item || _self.getSelected();
- if (item) {
- _self.setItemSelected(item, false);
- }
- },
- /**
- * 获取选项显示的文本
- * @protected
- */
- getSelectedText: function() {
- var _self = this,
- item = _self.getSelected();
- return _self.getItemText(item);
- },
- /**
- * 设置选中的项
- *
- * var items = list.getItemsByStatus('active'); //获取某种状态的选项
- * list.setSelection(items);
- *
- * @param {Array} items 项的集合
- */
- setSelection: function(items) {
- var _self = this;
-
- items = BUI.isArray(items) ? items : [items];
-
- BUI.each(items, function(item) {
- _self.setSelected(item);
- });
- },
- /**
- * 设置选中的项
- *
- * var item = list.getItem('id');
- * list.setSelected(item);
- *
- * @param {Object} item 记录或者子控件
- */
- setSelected: function(item) {
- var _self = this,
- multipleSelect = _self.get('multipleSelect');
-
- if (!_self.isItemSelectable(item)) {
- return;
- }
- if (!multipleSelect) {
- var selectedItem = _self.getSelected();
- if (item != selectedItem) {
- //如果是单选,清除已经选中的项
- _self.clearSelected(selectedItem);
- }
-
- }
- _self.setItemSelected(item, true);
-
- },
- /**
- * 选项是否被选中
- * @template
- * @param {*} item 选项
- * @return {Boolean} 是否选中
- */
- isItemSelected: function(item) {
-
- },
- /**
- * 选项是否可以选中
- * @protected
- * @param {*} item 选项
- * @return {Boolean} 选项是否可以选中
- */
- isItemSelectable: function(item) {
- return true;
- },
- /**
- * 设置选项的选中状态
- * @param {*} item 选项
- * @param {Boolean} selected 选中或者取消选中
- * @protected
- */
- setItemSelected: function(item, selected) {
- var _self = this,
- isSelected;
-
- //当前状态等于要设置的状态时,不触发改变事件
- if (item) {
- isSelected = _self.isItemSelected(item);
- if (isSelected == selected) {
- return;
- }
- }
- if (_self.fire('beforeselectedchange', {
- item: item,
- selected: selected
- }) !== false) {
- _self.setItemSelectedStatus(item, selected);
- }
- },
- /**
- * 设置选项的选中状态
- * @template
- * @param {*} item 选项
- * @param {Boolean} selected 选中或者取消选中
- * @protected
- */
- setItemSelectedStatus: function(item, selected) {
-
- },
- /**
- * 设置所有选项选中
- *
- * list.setAllSelection(); //选中全部,多选状态下有效
- *
- * @template
- */
- setAllSelection: function() {
-
- },
- /**
- * 设置项选中,通过字段和值
- * @param {String} field 字段名,默认为配置项'idField',所以此字段可以不填写,仅填写值
- * @param {Object} value 值
- * @example
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{id}">{text}</li>',
- * idField : 'id', //id 字段作为key
- * render : '#t1',
- * items : [{id : '1',text : '1'},{id : '2',text : '2'}]
- * });
- *
- * list.setSelectedByField('123'); //默认按照id字段查找
- * //或者
- * list.setSelectedByField('id','123');
- *
- * list.setSelectedByField('value','123');
- *
- */
- setSelectedByField: function(field, value) {
- if (!value) {
- value = field;
- field = this.get('idField');
- }
- var _self = this,
- item = _self.findItemByField(field, value);
- _self.setSelected(item);
- },
- /**
- * 设置多个选中,根据字段和值
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value', //value 字段作为key
- * render : '#t1',
- * multipleSelect : true,
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- * var values = ['1','2','3'];
- * list.setSelectionByField(values);//
- *
- * //等于
- * list.setSelectionByField('value',values);
- *
- * @param {String} field 默认为idField
- * @param {Array} values 值得集合
- */
- setSelectionByField: function(field, values) {
- if (!values) {
- values = field;
- field = this.get('idField');
- }
- var _self = this;
- BUI.each(values, function(value) {
- _self.setSelectedByField(field, value);
- });
- },
- /**
- * 选中完成后,触发事件
- * @protected
- * @param {*} item 选项
- * @param {Boolean} selected 是否选中
- * @param {jQuery} element
- */
- afterSelected: function(item, selected, element) {
- var _self = this;
-
- if (selected) {
- _self.fire('itemselected', {
- item: item,
- domTarget: element
- });
- _self.fire('selectedchange', {
- item: item,
- domTarget: element,
- selected: selected
- });
- } else {
- _self.fire('itemunselected', {
- item: item,
- domTarget: element
- });
- if (_self.get('multipleSelect')) { //只有当多选时,取消选中才触发selectedchange
- _self.fire('selectedchange', {
- item: item,
- domTarget: element,
- selected: selected
- });
- }
- }
- }
-
-}
-
-module.exports = selection;
-
-});
-define("bui-common/1.1.2/src/component/uibase/listitem-debug", [], function(require, exports, module){
-/**
- * @fileOverview 可选中的控件,父控件支持selection扩展
- * @ignore
- */
-
-
-/**
- * 列表项控件的视图层
- * @class BUI.Component.UIBase.ListItemView
- * @private
- */
-function listItemView() {
- // body...
-}
-
-listItemView.ATTRS = {
- /**
- * 是否选中
- * @type {Boolean}
- */
- selected: {
-
- }
-};
-
-listItemView.prototype = {
- _uiSetSelected: function(v) {
- var _self = this,
- cls = _self.getStatusCls('selected'),
- el = _self.get('el');
- if (v) {
- el.addClass(cls);
- } else {
- el.removeClass(cls);
- }
- }
-};
-/**
- * 列表项的扩展
- * @class BUI.Component.UIBase.ListItem
- */
-function listItem() {
-
-}
-
-listItem.ATTRS = {
-
- /**
- * 是否可以被选中
- * @cfg {Boolean} [selectable=true]
- */
- /**
- * 是否可以被选中
- * @type {Boolean}
- */
- selectable: {
- value: true
- },
-
- /**
- * 是否选中,只能通过设置父类的选中方法来实现选中
- * @type {Boolean}
- * @readOnly
- */
- selected: {
- view: true,
- sync: false,
- value: false
- }
-};
-
-listItem.prototype = {
-
-};
-
-listItem.View = listItemView;
-
-module.exports = listItem;
-
-});
-define("bui-common/1.1.2/src/component/uibase/mask-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview mask 遮罩层
- * @author yiminghe@gmail.com
- * copied and modified by dxq613@gmail.com
- * @ignore
- */
-
-
-var $ = require('jquery'),
- UA = require("bui-common/1.1.2/src/ua-debug"),
-
- /**
- * 每组相同 prefixCls 的 position 共享一个遮罩
- * @ignore
- */
- maskMap = {
- /**
- * @ignore
- * {
- * node:
- * num:
- * }
- */
-
- },
- ie6 = UA.ie == 6;
-
-function getMaskCls(self) {
- return self.get('prefixCls') + 'ext-mask';
-}
-
-function docWidth() {
- return ie6 ? BUI.docWidth() + 'px' : '100%';
-}
-
-function docHeight() {
- return ie6 ? BUI.docHeight() + 'px' : '100%';
-}
-
-function initMask(maskCls) {
- var mask = $('
- * var overlay = new Overlay({ //显示overlay时,屏蔽body
- * mask : true,
- * maskNode : 'body',
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {Boolean} [mask = false]
- */
- /**
- * 控件显示时,是否显示屏蔽层
- * @type {Boolean}
- * @protected
- */
- mask: {
- value: false
- },
- /**
- * 屏蔽的内容
- *
- * var overlay = new Overlay({ //显示overlay时,屏蔽body
- * mask : true,
- * maskNode : 'body',
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {jQuery} maskNode
- */
- /**
- * 屏蔽的内容
- * @type {jQuery}
- * @protected
- */
- maskNode: {
- view: 1
- },
- /**
- * Whether to share mask with other overlays.
- * @default true.
- * @type {Boolean}
- * @protected
- */
- maskShared: {
- view: 1
- }
-};
-
-Mask.prototype = {
-
- __bindUI: function() {
- var self = this,
- view = self.get('view'),
- _maskExtShow = view._maskExtShow,
- _maskExtHide = view._maskExtHide;
- if (self.get('mask')) {
- self.on('show', function() {
- view._maskExtShow();
- });
- self.on('hide', function() {
- view._maskExtHide();
- });
- }
- }
-};
-
-Mask = Mask;
-Mask.View = MaskView;
-
-module.exports = Mask;
-
-});
-define("bui-common/1.1.2/src/component/uibase/position-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 位置,控件绝对定位
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * 对齐的视图类
- * @class BUI.Component.UIBase.PositionView
- * @private
- */
-function PositionView() {
-
-}
-
-PositionView.ATTRS = {
- x: {
- /**
- * 水平方向绝对位置
- * @private
- * @ignore
- */
- valueFn: function() {
- var self = this;
- // 读到这里时,el 一定是已经加到 dom 树中了,否则报未知错误
- // el 不在 dom 树中 offset 报错的
- // 最早读就是在 syncUI 中,一点重复设置(读取自身 X 再调用 _uiSetX)无所谓了
- return self.get('el') && self.get('el').offset().left;
- }
- },
- y: {
- /**
- * 垂直方向绝对位置
- * @private
- * @ignore
- */
- valueFn: function() {
- var self = this;
- return self.get('el') && self.get('el').offset().top;
- }
- },
- zIndex: {},
- /**
- * @private
- * see {@link BUI.Component.UIBase.Box#visibleMode}.
- * @default "visibility"
- * @ignore
- */
- visibleMode: {
- value: 'visibility'
- }
-};
-
-
-PositionView.prototype = {
-
- __createDom: function() {
- this.get('el').addClass(BUI.prefix + 'ext-position');
- },
-
- _uiSetZIndex: function(x) {
- this.get('el').css('z-index', x);
- },
- _uiSetX: function(x) {
- if (x != null) {
- this.get('el').offset({
- left: x
- });
- }
- },
- _uiSetY: function(y) {
- if (y != null) {
- this.get('el').offset({
- top: y
- });
- }
- },
- _uiSetLeft: function(left) {
- if (left != null) {
- this.get('el').css({
- left: left
- });
- }
- },
- _uiSetTop: function(top) {
- if (top != null) {
- this.get('el').css({
- top: top
- });
- }
- }
-};
-
-/**
- * @class BUI.Component.UIBase.Position
- * Position extension class.
- * Make component positionable
- */
-function Position() {}
-
-Position.ATTRS = {
- /**
- * 水平坐标
- * @cfg {Number} x
- */
- /**
- * 水平坐标
- *
- * overlay.set('x',100);
- *
- * @type {Number}
- */
- x: {
- view: 1
- },
- /**
- * 垂直坐标
- * @cfg {Number} y
- */
- /**
- * 垂直坐标
- *
- * overlay.set('y',100);
- *
- * @type {Number}
- */
- y: {
- view: 1
- },
- /**
- * 相对于父元素的水平位置
- * @type {Number}
- * @protected
- */
- left: {
- view: 1
- },
- /**
- * 相对于父元素的垂直位置
- * @type {Number}
- * @protected
- */
- top: {
- view: 1
- },
- /**
- * 水平和垂直坐标
- *
- * var overlay = new Overlay({
- * xy : [100,100],
- * trigger : '#t1',
- * srcNode : '#c1'
- * });
- *
- * @cfg {Number[]} xy
- */
- /**
- * 水平和垂直坐标
- *
- * overlay.set('xy',[100,100]);
- *
- * @type {Number[]}
- */
- xy: {
- // 相对 page 定位, 有效值为 [n, m], 为 null 时, 选 align 设置
- setter: function(v) {
- var self = this,
- xy = $.makeArray(v);
- /*
- 属性内分发特别注意:
- xy -> x,y
- */
- if (xy.length) {
- xy[0] && self.set('x', xy[0]);
- xy[1] && self.set('y', xy[1]);
- }
- return v;
- },
- /**
- * xy 纯中转作用
- * @ignore
- */
- getter: function() {
- return [this.get('x'), this.get('y')];
- }
- },
- /**
- * z-index value.
- *
- * var overlay = new Overlay({
- * zIndex : '1000'
- * });
- *
- * @cfg {Number} zIndex
- */
- /**
- * z-index value.
- *
- * overlay.set('zIndex','1200');
- *
- * @type {Number}
- */
- zIndex: {
- view: 1
- },
- /**
- * Positionable element is by default visible false.
- * For compatibility in overlay and PopupMenu.
- * @default false
- * @ignore
- */
- visible: {
- view: true,
- value: true
- }
-};
-
-
-Position.prototype = {
- /**
- * Move to absolute position.
- * @param {Number|Number[]} x
- * @param {Number} [y]
- * @example
- *
- * move(x, y);
- * move(x);
- * move([x,y])
- *
- */
- move: function(x, y) {
- var self = this;
- if (BUI.isArray(x)) {
- y = x[1];
- x = x[0];
- }
- self.set('xy', [x, y]);
- return self;
- },
- //设置 x 坐标时,重置 left
- _uiSetX: function(v) {
- if (v != null) {
- var _self = this,
- el = _self.get('el');
- _self.setInternal('left', el.position().left);
- if (v != -999) {
- this.set('cachePosition', null);
- }
-
- }
-
- },
- //设置 y 坐标时,重置 top
- _uiSetY: function(v) {
- if (v != null) {
- var _self = this,
- el = _self.get('el');
- _self.setInternal('top', el.position().top);
- if (v != -999) {
- this.set('cachePosition', null);
- }
- }
- },
- //设置 left时,重置 x
- _uiSetLeft: function(v) {
- var _self = this,
- el = _self.get('el');
- if (v != null) {
- _self.setInternal('x', el.offset().left);
- }
- /*else{ //如果lef 为null,同时设置过left和top,那么取对应的值
- _self.setInternal('left',el.position().left);
- }*/
- },
- //设置top 时,重置y
- _uiSetTop: function(v) {
- var _self = this,
- el = _self.get('el');
- if (v != null) {
- _self.setInternal('y', el.offset().top);
- }
- /*else{ //如果lef 为null,同时设置过left和top,那么取对应的值
- _self.setInternal('top',el.position().top);
- }*/
- }
-};
-
-Position.View = PositionView;
-
-module.exports = Position;
-
-});
-define("bui-common/1.1.2/src/component/uibase/stdmod-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview
- * 控件包含头部(head)、内容(content)和尾部(foot)
- * @ignore
- */
-
-var $ = require('jquery'),
- CLS_PREFIX = BUI.prefix + 'stdmod-';
-
-
-/**
- * 标准模块组织的视图类
- * @class BUI.Component.UIBase.StdModView
- * @private
- */
-function StdModView() {}
-
-StdModView.ATTRS = {
- header: {},
- body: {},
- footer: {},
- bodyStyle: {},
- footerStyle: {},
- headerStyle: {},
- headerContent: {},
- bodyContent: {},
- footerContent: {}
-};
-
-StdModView.PARSER = {
- header: function(el) {
- return el.one("." + CLS_PREFIX + "header");
- },
- body: function(el) {
- return el.one("." + CLS_PREFIX + "body");
- },
- footer: function(el) {
- return el.one("." + CLS_PREFIX + "footer");
- }
-}; /**/
-
-function createUI(self, part) {
- var el = self.get('contentEl'),
- partEl = self.get(part);
- if (!partEl) {
- partEl = $('
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} headerContent
- */
- /**
- * 控件头部的html
- * @type {jQuery|String}
- */
- headerContent: {
- view: 1
- },
- /**
- * 控件内容的html
- *
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} bodyContent
- */
- /**
- * 控件内容的html
- * @type {jQuery|String}
- */
- bodyContent: {
- view: 1
- },
- /**
- * 控件底部的html
- *
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} footerContent
- */
- /**
- * 控件底部的html
- * @type {jQuery|String}
- */
- footerContent: {
- view: 1
- }
-};
-
-StdMod.View = StdModView;
-
-module.exports = StdMod;
-
-});
-define("bui-common/1.1.2/src/component/uibase/decorate-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 使用wrapper
- * @ignore
- */
-
-
-var $ = require('jquery'),
- ArrayUtil = require("bui-common/1.1.2/src/array-debug"),
- JSON = require("bui-common/1.1.2/src/json-debug"),
- prefixCls = BUI.prefix,
- FIELD_PREFIX = 'data-',
- FIELD_CFG = FIELD_PREFIX + 'cfg',
- PARSER = 'PARSER',
- Manager = require("bui-common/1.1.2/src/component/manage-debug"),
- RE_DASH_WORD = /-([a-z])/g,
- regx = /^[\{\[]/;
-
-function isConfigField(name, cfgFields) {
- if (cfgFields[name]) {
- return true;
- }
- var reg = new RegExp("^" + FIELD_PREFIX);
- if (name !== FIELD_CFG && reg.test(name)) {
- return true;
- }
- return false;
-}
-
-// 收集单继承链,子类在前,父类在后
-function collectConstructorChains(self) {
- var constructorChains = [],
- c = self.constructor;
- while (c) {
- constructorChains.push(c);
- c = c.superclass && c.superclass.constructor;
- }
- return constructorChains;
-}
-
-function camelCase(str) {
- return str.toLowerCase().replace(RE_DASH_WORD, function(all, letter) {
- return (letter + '').toUpperCase()
- })
-}
-
-//如果属性为对象或者数组,则进行转换
-function parseFieldValue(value) {
-
- value = $.trim(value);
- if (value.toLowerCase() === 'false') {
- value = false
- } else if (value.toLowerCase() === 'true') {
- value = true
- } else if (regx.test(value)) {
- value = JSON.looseParse(value);
- } else if (/\d/.test(value) && /[^a-z]/i.test(value)) {
- var number = parseFloat(value)
- if (number + '' === value) {
- value = number
- }
- }
-
- return value;
-}
-
-function setConfigFields(self, cfg) {
-
- var userConfig = self.userConfig || {};
- for (var p in cfg) {
- // 用户设置过那么这里不从 dom 节点取
- // 用户设置 > html parser > default value
- if (!(p in userConfig)) {
- self.setInternal(p, cfg[p]);
- }
- }
-}
-
-function applyParser(srcNode, parser) {
- var self = this,
- p, v,
- userConfig = self.userConfig || {};
-
- // 从 parser 中,默默设置属性,不触发事件
- for (p in parser) {
- // 用户设置过那么这里不从 dom 节点取
- // 用户设置 > html parser > default value
- if (!(p in userConfig)) {
- v = parser[p];
- // 函数
- if (BUI.isFunction(v)) {
- self.setInternal(p, v.call(self, srcNode));
- }
- // 单选选择器
- else if (typeof v == 'string') {
- self.setInternal(p, srcNode.find(v));
- }
- // 多选选择器
- else if (BUI.isArray(v) && v[0]) {
- self.setInternal(p, srcNode.find(v[0]))
- }
- }
- }
-}
-
-function initParser(self, srcNode) {
-
- var c = self.constructor,
- len,
- p,
- constructorChains;
-
- constructorChains = collectConstructorChains(self);
-
- // 从父类到子类开始从 html 读取属性
- for (len = constructorChains.length - 1; len >= 0; len--) {
- c = constructorChains[len];
- if (p = c[PARSER]) {
- applyParser.call(self, srcNode, p);
- }
- }
-}
-
-function initDecorate(self) {
- var _self = self,
- srcNode = _self.get('srcNode'),
- userConfig,
- decorateCfg;
- if (srcNode) {
- srcNode = $(srcNode);
- _self.setInternal('el', srcNode);
- _self.setInternal('srcNode', srcNode);
-
- userConfig = _self.get('userConfig');
- decorateCfg = _self.getDecorateConfig(srcNode);
- setConfigFields(self, decorateCfg);
-
- //如果从DOM中读取子控件
- if (_self.get('isDecorateChild') && _self.decorateInternal) {
- _self.decorateInternal(srcNode);
- }
- initParser(self, srcNode);
- }
-}
-
-/**
- * @class BUI.Component.UIBase.Decorate
- * 将DOM对象封装成控件
- */
-function decorate() {
- initDecorate(this);
-}
-
-decorate.ATTRS = {
-
- /**
- * 配置控件的根节点的DOM
- *
- * new Form.Form({
- * srcNode : '#J_Form'
- * }).render();
- *
- * @cfg {jQuery} srcNode
- */
- /**
- * 配置控件的根节点的DOM
- * @type {jQuery}
- */
- srcNode: {
- view: true
- },
- /**
- * 是否根据DOM生成子控件
- * @type {Boolean}
- * @protected
- */
- isDecorateChild: {
- value: false
- },
- /**
- * 此配置项配置使用那些srcNode上的节点作为配置项
- * - 当时用 decorate 时,取 srcNode上的节点的属性作为控件的配置信息
- * - 默认id,name,value,title 都会作为属性传入
- * - 使用 'data-cfg' 作为整体的配置属性
- *
- *
- * //会生成以下配置项:
- * {
- * name : 'txtName',
- * id : 'id',
- * allowBlank:false
- * }
- * new Form.Field({
- * src:'#c1'
- * }).render();
- *
- * @type {Object}
- * @protected
- */
- decorateCfgFields: {
- value: {
- 'id': true,
- 'name': true,
- 'value': true,
- 'title': true
- }
- }
-};
-
-decorate.prototype = {
-
- /**
- * 获取控件的配置信息
- * @protected
- */
- getDecorateConfig: function(el) {
- if (!el.length) {
- return null;
- }
- var _self = this,
- dom = el[0],
- attributes = dom.attributes,
- decorateCfgFields = _self.get('decorateCfgFields'),
- config = {},
- statusCfg = _self._getStautsCfg(el);
-
- BUI.each(attributes, function(attr) {
- var name = attr.nodeName;
- try {
- if (name === FIELD_CFG) {
- var cfg = parseFieldValue(attr.nodeValue);
- BUI.mix(config, cfg);
- } else if (isConfigField(name, decorateCfgFields)) {
- var value = attr.nodeValue;
- if (name.indexOf(FIELD_PREFIX) !== -1) {
- name = name.replace(FIELD_PREFIX, '');
- name = camelCase(name);
- value = parseFieldValue(value);
- }
-
- if (config[name] && BUI.isObject(value)) {
- BUI.mix(config[name], value);
- } else {
- config[name] = value;
- }
- }
- } catch (e) {
- BUI.log('parse field error,the attribute is:' + name);
- }
- });
- return BUI.mix(config, statusCfg);
- },
- //根据css class获取状态属性
- //如: selected,disabled等属性
- _getStautsCfg: function(el) {
- var _self = this,
- rst = {},
- statusCls = _self.get('statusCls');
- BUI.each(statusCls, function(v, k) {
- if (el.hasClass(v)) {
- rst[k] = true;
- }
- });
- return rst;
- },
- /**
- * 获取封装成子控件的节点集合
- * @protected
- * @return {Array} 节点集合
- */
- getDecorateElments: function() {
- var _self = this,
- el = _self.get('el'),
- contentContainer = _self.get('childContainer');
- if (contentContainer) {
- return el.find(contentContainer).children();
- } else {
- return el.children();
- }
- },
-
- /**
- * 封装所有的子控件
- * @protected
- * @param {jQuery} el Root element of current component.
- */
- decorateInternal: function(el) {
- var self = this;
- self.decorateChildren(el);
- },
- /**
- * 获取子控件的xclass类型
- * @protected
- * @param {jQuery} childNode 子控件的根节点
- */
- findXClassByNode: function(childNode, ignoreError) {
- var _self = this,
- cls = childNode.attr("class") || '',
- childClass = _self.get('defaultChildClass'); //如果没有样式或者查找不到对应的类,使用默认的子控件类型
-
- // 过滤掉特定前缀
- cls = cls.replace(new RegExp("\\b" + prefixCls, "ig"), "");
-
- var UI = Manager.getConstructorByXClass(cls) || Manager.getConstructorByXClass(childClass);
-
- if (!UI && !ignoreError) {
- BUI.log(childNode);
- BUI.error("can not find ui " + cls + " from this markup");
- }
- return Manager.getXClassByConstructor(UI);
- },
- // 生成一个组件
- decorateChildrenInternal: function(xclass, c) {
- var _self = this,
- children = _self.get('children');
- children.push({
- xclass: xclass,
- srcNode: c
- });
- },
- /**
- * 封装子控件
- * @private
- * @param {jQuery} el component's root element.
- */
- decorateChildren: function(el) {
- var _self = this,
- children = _self.getDecorateElments();
- BUI.each(children, function(c) {
- var xclass = _self.findXClassByNode($(c));
- _self.decorateChildrenInternal(xclass, $(c));
- });
- }
-};
-
-module.exports = decorate;
-
-});
-define("bui-common/1.1.2/src/component/uibase/tpl-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 控件模板
- * @author dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * @private
- * 控件模板扩展类的渲染类(view)
- * @class BUI.Component.UIBase.TplView
- */
-function tplView() {
-
-}
-
-tplView.ATTRS = {
- /**
- * 模板
- * @protected
- * @type {String}
- */
- tpl: {
-
- },
- tplEl: {
-
- }
-};
-
-tplView.prototype = {
- __renderUI: function() {
- var _self = this,
- contentContainer = _self.get('childContainer'),
- contentEl;
-
- if (contentContainer) {
- contentEl = _self.get('el').find(contentContainer);
- if (contentEl.length) {
- _self.set('contentEl', contentEl);
- }
- }
- },
- /**
- * 获取生成控件的模板
- * @protected
- * @param {Object} attrs 属性值
- * @return {String} 模板
- */
- getTpl: function(attrs) {
- var _self = this,
- tpl = _self.get('tpl'),
- tplRender = _self.get('tplRender');
- attrs = attrs || _self.getAttrVals();
-
- if (tplRender) {
- return tplRender(attrs);
- }
- if (tpl) {
- return BUI.substitute(tpl, attrs);
- }
- return '';
- },
- /**
- * 如果控件设置了模板,则根据模板和属性值生成DOM
- * 如果设置了content属性,此模板不应用
- * @protected
- * @param {Object} attrs 属性值,默认为初始化时传入的值
- */
- setTplContent: function(attrs) {
- var _self = this,
- el = _self.get('el'),
- content = _self.get('content'),
- tplEl = _self.get('tplEl'),
- tpl = _self.getTpl(attrs);
-
- //tplEl.remove();
- if (!content && tpl) { //替换掉原先的内容
- el.empty();
- el.html(tpl);
- /*if(tplEl){
- var node = $(tpl).insertBefore(tplEl);
- tplEl.remove();
- tplEl = node;
- }else{
- tplEl = $(tpl).appendTo(el);
- }
- _self.set('tplEl',tplEl)
- */
- }
- }
-}
-
-/**
- * 控件的模板扩展
- * @class BUI.Component.UIBase.Tpl
- */
-function tpl() {
-
-}
-
-tpl.ATTRS = {
- /**
- * 控件的模版,用于初始化
- *
- * var list = new List.List({
- * tpl : '<div class="toolbar"></div><ul></ul>',
- * childContainer : 'ul'
- * });
- * //用于统一子控件模板
- * var list = new List.List({
- * defaultChildCfg : {
- * tpl : '<span>{text}</span>'
- * }
- * });
- * list.render();
- *
- * @cfg {String} tpl
- */
- /**
- * 控件的模板
- *
- * list.set('tpl','<div class="toolbar"></div><ul></ul><div class="bottom"></div>')
- *
- * @type {String}
- */
- tpl: {
- view: true,
- sync: false
- },
- /**
- * 控件的渲染函数,应对一些简单模板解决不了的问题,例如有if,else逻辑,有循环逻辑, - * 函数原型是function(data){},其中data是控件的属性值
- *控件模板的加强模式,此属性会覆盖@see {BUI.Component.UIBase.Tpl#property-tpl}属性
- * //用于统一子控件模板 - * var list = new List.List({ - * defaultChildCfg : { - * tplRender : funciton(item){ - * if(item.type == '1'){ - * return 'type1 html'; - * }else{ - * return 'type2 html'; - * } - * } - * } - * }); - * list.render(); - * @cfg {Function} tplRender - */ - tplRender: { - view: true, - value: null - }, - /** - * 这是一个选择器,使用了模板后,子控件可能会添加到模板对应的位置, - * - 默认为null,此时子控件会将控件最外层 el 作为容器 - *
- * var list = new List.List({
- * tpl : '<div class="toolbar"></div><ul></ul>',
- * childContainer : 'ul'
- * });
- *
- * @cfg {String} childContainer
- */
- childContainer: {
- view: true
- }
-};
-
-tpl.prototype = {
-
- __renderUI: function() {
- //使用srcNode时,不使用模板
- if (!this.get('srcNode')) {
- this.setTplContent();
- }
- },
- /**
- * 控件信息发生改变时,控件内容跟模板相关时需要调用这个函数,
- * 重新通过模板和控件信息构造内容
- */
- updateContent: function() {
- this.setTplContent();
- },
- /**
- * 根据控件的属性和模板生成控件内容
- * @protected
- */
- setTplContent: function() {
- var _self = this,
- attrs = _self.getAttrVals();
- _self.get('view').setTplContent(attrs);
- },
- //模板发生改变
- _uiSetTpl: function() {
- this.setTplContent();
- }
-};
-
-tpl.View = tplView;
-
-module.exports = tpl;
-
-});
-define("bui-common/1.1.2/src/component/uibase/childcfg-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 子控件的默认配置项
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * @class BUI.Component.UIBase.ChildCfg
- * 子控件默认配置项的扩展类
- */
-var childCfg = function(config) {
- this._init();
-};
-
-childCfg.ATTRS = {
- /**
- * 默认的子控件配置项,在初始化控件时配置
- *
- * - 如果控件已经渲染过,此配置项无效,
- * - 控件生成后,修改此配置项无效。
- *
- * var control = new Control({
- * defaultChildCfg : {
- * tpl : '<li>{text}</li>',
- * xclass : 'a-b'
- * }
- * });
- *
- * @cfg {Object} defaultChildCfg
- */
- /**
- * @ignore
- */
- defaultChildCfg: {
-
- }
-};
-
-childCfg.prototype = {
-
- _init: function() {
- var _self = this,
- defaultChildCfg = _self.get('defaultChildCfg');
- if (defaultChildCfg) {
- _self.on('beforeAddChild', function(ev) {
- var child = ev.child;
- if ($.isPlainObject(child)) {
- BUI.each(defaultChildCfg, function(v, k) {
- if (child[k] == null) { //如果未在配置项中设置,则使用默认值
- child[k] = v;
- }
- });
- }
- });
- }
- }
-
-};
-
-module.exports = childCfg;
-
-});
-define("bui-common/1.1.2/src/component/uibase/bindable-debug", [], function(require, exports, module){
-/**
- * @fileOverview bindable extension class.
- * @author dxq613@gmail.com
- * @ignore
- */
-
-/**
- * bindable extension class.
- *
- * BUI.use(['bui/list','bui/data','bui/mask'],function(List,Data,Mask){
- * var store = new Data.Store({
- * url : 'data/xx.json'
- * });
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store,
- * loadMask : new Mask.LoadMask({el : '#t1'})
- * });
- *
- * list.render();
- * store.load();
- * });
- *
- * 使控件绑定store,处理store的事件 {@link BUI.Data.Store}
- * @class BUI.Component.UIBase.Bindable
- */
-function bindable() {
-
-}
-
-bindable.ATTRS = {
- /**
- * 绑定 {@link BUI.Data.Store}的事件
- *
- * var store = new Data.Store({
- * url : 'data/xx.json',
- * autoLoad : true
- * });
- *
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store
- * });
- *
- * list.render();
- *
- * @cfg {BUI.Data.Store} store
- */
- /**
- * 绑定 {@link BUI.Data.Store}的事件
- *
- * var store = list.get('store');
- *
- * @type {BUI.Data.Store}
- */
- store: {
-
- },
- /**
- * 加载数据时,是否显示等待加载的屏蔽层
- *
- * BUI.use(['bui/list','bui/data','bui/mask'],function(List,Data,Mask){
- * var store = new Data.Store({
- * url : 'data/xx.json'
- * });
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store,
- * loadMask : new Mask.LoadMask({el : '#t1'})
- * });
- *
- * list.render();
- * store.load();
- * });
- *
- * @cfg {Boolean|Object} loadMask
- */
- /**
- * 加载数据时,是否显示等待加载的屏蔽层
- * @type {Boolean|Object}
- * @ignore
- */
- loadMask: {
- value: false
- }
-};
-
-
-BUI.augment(bindable, {
-
- __bindUI: function() {
- var _self = this,
- store = _self.get('store'),
- loadMask = _self.get('loadMask');
- if (!store) {
- return;
- }
- store.on('beforeload', function(e) {
- _self.onBeforeLoad(e);
- if (loadMask && loadMask.show) {
- loadMask.show();
- }
- });
- store.on('load', function(e) {
- _self.onLoad(e);
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- });
- store.on('exception', function(e) {
- _self.onException(e);
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- });
- store.on('add', function(e) {
- _self.onAdd(e);
- });
- store.on('remove', function(e) {
- _self.onRemove(e);
- });
- store.on('update', function(e) {
- _self.onUpdate(e);
- });
- store.on('localsort', function(e) {
- _self.onLocalSort(e);
- });
- store.on('filtered', function(e) {
- _self.onFiltered(e);
- });
- },
- __syncUI: function() {
- var _self = this,
- store = _self.get('store');
- if (!store) {
- return;
- }
- if (store.hasData()) {
- _self.onLoad();
- }
- },
- /**
- * @protected
- * @template
- * before store load data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-beforeload}
- */
- onBeforeLoad: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after store load data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-load}
- */
- onLoad: function(e) {
-
- },
- /**
- * @protected
- * @template
- * occurred exception when store is loading data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-exception}
- */
- onException: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after added data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-add}
- */
- onAdd: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after remvoed data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-remove}
- */
- onRemove: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after updated data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-update}
- */
- onUpdate: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after local sorted data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-localsort}
- */
- onLocalSort: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after filter data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-filtered}
- */
- onFiltered: function(e) {}
-});
-
-module.exports = bindable;
-
-});
-define("bui-common/1.1.2/src/component/uibase/depends-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 依赖扩展,用于观察者模式中的观察者
- * @ignore
- */
-
-
-var $ = require('jquery'),
- regexp = /^#(.*):(.*)$/,
- Manager = require("bui-common/1.1.2/src/component/manage-debug");
-
-//获取依赖信息
-function getDepend(name) {
-
- var arr = regexp.exec(name),
- id = arr[1],
- eventType = arr[2],
- source = getSource(id);
- return {
- source: source,
- eventType: eventType
- };
-}
-
-//绑定依赖
-function bindDepend(self, name, action) {
- var depend = getDepend(name),
- source = depend.source,
- eventType = depend.eventType,
- callbak;
- if (source && action && eventType) {
-
- if (BUI.isFunction(action)) { //如果action是一个函数
- callbak = action;
- } else if (BUI.isArray(action)) { //如果是一个数组,构建一个回调函数
- callbak = function() {
- BUI.each(action, function(methodName) {
- if (self[methodName]) {
- self[methodName]();
- }
- });
- }
- }
- }
- if (callbak) {
- depend.callbak = callbak;
- source.on(eventType, callbak);
- return depend;
- }
- return null;
-}
-//去除依赖
-function offDepend(depend) {
- var source = depend.source,
- eventType = depend.eventType,
- callbak = depend.callbak;
- source.off(eventType, callbak);
-}
-
-//获取绑定的事件源
-function getSource(id) {
- var control = Manager.getComponent(id);
- if (!control) {
- control = $('#' + id);
- if (!control.length) {
- control = null;
- }
- }
- return control;
-}
-
-/**
- * @class BUI.Component.UIBase.Depends
- * 依赖事件源的扩展
- *
- * var control = new Control({
- * depends : {
- * '#btn:click':['toggle'],//当点击id为'btn'的按钮时,执行 control 的toggle方法
- * '#checkbox1:checked':['show'],//当勾选checkbox时,显示控件
- * '#menu:click',function(){}
- * }
- * });
- *
- */
-function Depends() {
-
-};
-
-Depends.ATTRS = {
- /**
- * 控件的依赖事件,是一个数组集合,每一条记录是一个依赖关系
- * var control = new Control({
- * depends : {
- * '#btn:click':['toggle'],//当点击id为'btn'的按钮时,执行 control 的toggle方法
- * '#checkbox1:checked':['show'],//当勾选checkbox时,显示控件
- * '#menu:click',function(){}
- * }
- * });
- *
- * ** 注意:** 这些依赖项是在控件渲染(render)后进行的。
- * @type {Object}
- */
- depends: {
-
- },
- /**
- * @private
- * 依赖的映射集合
- * @type {Object}
- */
- dependencesMap: {
- shared: false,
- value: {}
- }
-};
-
-Depends.prototype = {
-
- __syncUI: function() {
- this.initDependences();
- },
- /**
- * 初始化依赖项
- * @protected
- */
- initDependences: function() {
- var _self = this,
- depends = _self.get('depends');
- BUI.each(depends, function(action, name) {
- _self.addDependence(name, action);
- });
- },
- /**
- * 添加依赖,如果已经有同名的事件,则移除,再添加
- *
- * form.addDependence('#btn:click',['toggle']); //当按钮#btn点击时,表单交替显示隐藏
- *
- * form.addDependence('#btn:click',function(){//当按钮#btn点击时,表单交替显示隐藏
- * //TO DO
- * });
- *
- * @param {String} name 依赖项的名称
- * @param {Array|Function} action 依赖项的事件
- */
- addDependence: function(name, action) {
- var _self = this,
- dependencesMap = _self.get('dependencesMap'),
- depend;
- _self.removeDependence(name);
- depend = bindDepend(_self, name, action)
- if (depend) {
- dependencesMap[name] = depend;
- }
- },
- /**
- * 移除依赖
- *
- * form.removeDependence('#btn:click'); //当按钮#btn点击时,表单不在监听
- *
- * @param {String} name 依赖名称
- */
- removeDependence: function(name) {
- var _self = this,
- dependencesMap = _self.get('dependencesMap'),
- depend = dependencesMap[name];
- if (depend) {
- offDepend(depend);
- delete dependencesMap[name];
- }
- },
- /**
- * 清除所有的依赖
- *
- * form.clearDependences();
- *
- */
- clearDependences: function() {
- var _self = this,
- map = _self.get('dependencesMap');
- BUI.each(map, function(depend, name) {
- offDepend(depend);
- });
- _self.set('dependencesMap', {});
- },
- __destructor: function() {
- this.clearDependences();
- }
-
-};
-
-module.exports = Depends;
-
-});
-define("bui-common/1.1.2/src/component/view-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 控件的视图层
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery'),
- win = window,
- Manager = require("bui-common/1.1.2/src/component/manage-debug"),
- UIBase = require("bui-common/1.1.2/src/component/uibase/uibase-debug"), //BUI.Component.UIBase,
- doc = document;
-
-/**
- * 控件的视图层基类
- * @class BUI.Component.View
- * @protected
- * @extends BUI.Component.UIBase
- * @mixins BUI.Component.UIBase.TplView
- */
-var View = UIBase.extend([UIBase.TplView], {
-
- /**
- * Get all css class name to be applied to the root element of this component for given state.
- * the css class names are prefixed with component name.
- * @param {String} [state] This component's state info.
- */
- getComponentCssClassWithState: function(state) {
- var self = this,
- componentCls = self.get('ksComponentCss');
- state = state || '';
- return self.getCssClassWithPrefix(componentCls.split(/\s+/).join(state + ' ') + state);
- },
-
- /**
- * Get full class name (with prefix) for current component
- * @param classes {String} class names without prefixCls. Separated by space.
- * @method
- * @return {String} class name with prefixCls
- * @private
- */
- getCssClassWithPrefix: Manager.getCssClassWithPrefix,
-
- /**
- * Returns the dom element which is responsible for listening keyboard events.
- * @return {jQuery}
- */
- getKeyEventTarget: function() {
- return this.get('el');
- },
- /**
- * Return the dom element into which child component to be rendered.
- * @return {jQuery}
- */
- getContentElement: function() {
- return this.get('contentEl') || this.get('el');
- },
- /**
- * 获取状态对应的css样式
- * @param {String} name 状态名称 例如:hover,disabled等等
- * @return {String} 状态样式
- */
- getStatusCls: function(name) {
- var self = this,
- statusCls = self.get('statusCls'),
- cls = statusCls[name];
- if (!cls) {
- cls = self.getComponentCssClassWithState('-' + name);
- }
- return cls;
- },
- /**
- * 渲染控件
- * @protected
- */
- renderUI: function() {
- var self = this;
-
- // 新建的节点才需要摆放定位,不支持srcNode模式
- if (!self.get('srcNode')) {
- var render = self.get('render'),
- el = self.get('el'),
- renderBefore = self.get('elBefore');
- if (renderBefore) {
- el.insertBefore(renderBefore, undefined);
- } else if (render) {
- el.appendTo(render, undefined);
- } else {
- el.appendTo(doc.body, undefined);
- }
- }
- },
- /**
- * 只负责建立节点,如果是 decorate 过来的,甚至内容会丢失
- * @protected
- * 通过 render 来重建原有的内容
- */
- createDom: function() {
- var self = this,
- contentEl = self.get('contentEl'),
- el = self.get('el');
- if (!self.get('srcNode')) {
-
- el = $('<' + self.get('elTagName') + '>');
-
- if (contentEl) {
- el.append(contentEl);
- }
-
- self.setInternal('el', el);
- }
-
- el.addClass(self.getComponentCssClassWithState());
- if (!contentEl) {
- // 没取到,这里设下值, uiSet 时可以 set('content') 取到
- self.setInternal('contentEl', el);
- }
- },
- /**
- * 设置高亮显示
- * @protected
- */
- _uiSetHighlighted: function(v) {
- var self = this,
- componentCls = self.getStatusCls('hover'),
- el = self.get('el');
- el[v ? 'addClass' : 'removeClass'](componentCls);
- },
-
- /**
- * 设置禁用
- * @protected
- */
- _uiSetDisabled: function(v) {
- var self = this,
- componentCls = self.getStatusCls('disabled'),
- el = self.get('el');
- el[v ? 'addClass' : 'removeClass'](componentCls)
- .attr('aria-disabled', v);
-
- //如果禁用控件时,处于hover状态,则清除
- if (v && self.get('highlighted')) {
- self.set('highlighted', false);
- }
-
- if (self.get('focusable')) {
- //不能被 tab focus 到
- self.getKeyEventTarget().attr('tabIndex', v ? -1 : 0);
- }
- },
- /**
- * 设置激活状态
- * @protected
- */
- _uiSetActive: function(v) {
- var self = this,
- componentCls = self.getStatusCls('active');
- self.get('el')[v ? 'addClass' : 'removeClass'](componentCls)
- .attr('aria-pressed', !!v);
- },
- /**
- * 设置获得焦点
- * @protected
- */
- _uiSetFocused: function(v) {
- var self = this,
- el = self.get('el'),
- componentCls = self.getStatusCls('focused');
- el[v ? 'addClass' : 'removeClass'](componentCls);
- },
- /**
- * 设置控件最外层DOM的属性
- * @protected
- */
- _uiSetElAttrs: function(attrs) {
- this.get('el').attr(attrs);
- },
- /**
- * 设置应用到控件最外层DOM的css class
- * @protected
- */
- _uiSetElCls: function(cls) {
- this.get('el').addClass(cls);
- },
- /**
- * 设置应用到控件最外层DOM的css style
- * @protected
- */
- _uiSetElStyle: function(style) {
- this.get('el').css(style);
- },
- //设置role
- _uiSetRole: function(role) {
- if (role) {
- this.get('el').attr('role', role);
- }
- },
- /**
- * 设置应用到控件宽度
- * @protected
- */
- _uiSetWidth: function(w) {
- this.get('el').width(w);
- },
- /**
- * 设置应用到控件高度
- * @protected
- */
- _uiSetHeight: function(h) {
- var self = this;
- self.get('el').height(h);
- },
- /**
- * 设置应用到控件的内容
- * @protected
- */
- _uiSetContent: function(c) {
- var self = this,
- el;
- // srcNode 时不重新渲染 content
- // 防止内部有改变,而 content 则是老的 html 内容
- if (self.get('srcNode') && !self.get('rendered')) {} else {
- el = self.get('contentEl');
- if (typeof c == 'string') {
- el.html(c);
- } else if (c) {
- el.empty().append(c);
- }
- }
- },
- /**
- * 设置应用到控件是否可见
- * @protected
- */
- _uiSetVisible: function(isVisible) {
- var self = this,
- el = self.get('el'),
- visibleMode = self.get('visibleMode');
- if (visibleMode === 'visibility') {
- el.css('visibility', isVisible ? 'visible' : 'hidden');
- } else {
- el.css('display', isVisible ? '' : 'none');
- }
- },
- set: function(name, value) {
- var _self = this,
- attr = _self.__attrs[name],
- ev,
- ucName,
- m;
-
- if (!attr || !_self.get('binded')) { //未初始化view或者没用定义属性
- View.superclass.set.call(this, name, value);
- return _self;
- }
-
- var prevVal = View.superclass.get.call(this, name);
-
- //如果未改变值不进行修改
- if (!$.isPlainObject(value) && !BUI.isArray(value) && prevVal === value) {
- return _self;
- }
- View.superclass.set.call(this, name, value);
-
- value = _self.__attrVals[name];
- ev = {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- };
- ucName = BUI.ucfirst(name);
- m = '_uiSet' + ucName;
- if (_self[m]) {
- _self[m](value, ev);
- }
-
- return _self;
-
- },
- /**
- * 析构函数
- * @protected
- */
- destructor: function() {
- var el = this.get('el');
- if (el) {
- el.remove();
- }
- }
-}, {
- xclass: 'view',
- priority: 0
-});
-
-
-View.ATTRS = {
- /**
- * 控件根节点
- * @readOnly
- * see {@link BUI.Component.Controller#property-el}
- */
- el: {
- /**
- * @private
- */
- setter: function(v) {
- return $(v);
- }
- },
-
- /**
- * 控件根节点样式
- * see {@link BUI.Component.Controller#property-elCls}
- */
- elCls: {},
- /**
- * 控件根节点样式属性
- * see {@link BUI.Component.Controller#property-elStyle}
- */
- elStyle: {},
- /**
- * ARIA 标准中的role
- * @type {String}
- */
- role: {
-
- },
- /**
- * 控件宽度
- * see {@link BUI.Component.Controller#property-width}
- */
- width: {},
- /**
- * 控件高度
- * see {@link BUI.Component.Controller#property-height}
- */
- height: {},
- /**
- * 状态相关的样式,默认情况下会使用 前缀名 + xclass + '-' + 状态名
- * see {@link BUI.Component.Controller#property-statusCls}
- * @type {Object}
- */
- statusCls: {
- value: {}
- },
- /**
- * 控件根节点使用的标签
- * @type {String}
- */
- elTagName: {
- // 生成标签名字
- value: 'div'
- },
- /**
- * 控件根节点属性
- * see {@link BUI.Component.Controller#property-elAttrs}
- * @ignore
- */
- elAttrs: {},
- /**
- * 控件内容,html,文本等
- * see {@link BUI.Component.Controller#property-content}
- */
- content: {},
- /**
- * 控件插入到指定元素前
- * see {@link BUI.Component.Controller#property-tpl}
- */
- elBefore: {
- // better named to renderBefore, too late !
- },
- /**
- * 控件在指定元素内部渲染
- * see {@link BUI.Component.Controller#property-render}
- * @ignore
- */
- render: {},
- /**
- * 是否可见
- * see {@link BUI.Component.Controller#property-visible}
- */
- visible: {
- value: true
- },
- /**
- * 可视模式
- * see {@link BUI.Component.Controller#property-visibleMode}
- */
- visibleMode: {
- value: 'display'
- },
- /**
- * @private
- * 缓存隐藏时的位置,对应visibleMode = 'visiblity' 的场景
- * @type {Object}
- */
- cachePosition: {
-
- },
- /**
- * content 设置的内容节点,默认根节点
- * @type {jQuery}
- * @default el
- */
- contentEl: {
- valueFn: function() {
- return this.get('el');
- }
- },
- /**
- * 样式前缀
- * see {@link BUI.Component.Controller#property-prefixCls}
- */
- prefixCls: {
- value: BUI.prefix
- },
- /**
- * 可以获取焦点
- * @protected
- * see {@link BUI.Component.Controller#property-focusable}
- */
- focusable: {
- value: true
- },
- /**
- * 获取焦点
- * see {@link BUI.Component.Controller#property-focused}
- */
- focused: {},
- /**
- * 激活
- * see {@link BUI.Component.Controller#property-active}
- */
- active: {},
- /**
- * 禁用
- * see {@link BUI.Component.Controller#property-disabled}
- */
- disabled: {},
- /**
- * 高亮显示
- * see {@link BUI.Component.Controller#property-highlighted}
- */
- highlighted: {}
-};
-
-module.exports = View;
-
-});
-define("bui-common/1.1.2/src/component/controller-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 控件可以实例化的基类
- * @ignore
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- */
-
-/**
- * jQuery 事件
- * @class jQuery.Event
- * @private
- */
-
-
-'use strict';
-
-var $ = require('jquery'),
- UIBase = require("bui-common/1.1.2/src/component/uibase/uibase-debug"),
- Manager = require("bui-common/1.1.2/src/component/manage-debug"),
- View = require("bui-common/1.1.2/src/component/view-debug"),
- Loader = require("bui-common/1.1.2/src/component/loader-debug"),
- wrapBehavior = BUI.wrapBehavior,
- getWrapBehavior = BUI.getWrapBehavior;
-
-/**
- * @ignore
- */
-function wrapperViewSetter(attrName) {
- return function(ev) {
- var self = this;
- // in case bubbled from sub component
- if (self === ev.target) {
- var value = ev.newVal,
- view = self.get('view');
- if (view) {
- view.set(attrName, value);
- }
-
- }
- };
-}
-
-/**
- * @ignore
- */
-function wrapperViewGetter(attrName) {
- return function(v) {
- var self = this,
- view = self.get('view');
- return v === undefined ? view.get(attrName) : v;
- };
-}
-
-/**
- * @ignore
- */
-function initChild(self, c, renderBefore) {
- // 生成父组件的 dom 结构
- self.create();
- var contentEl = self.getContentElement(),
- defaultCls = self.get('defaultChildClass');
- //配置默认 xclass
- if (!c.xclass && !(c instanceof Controller)) {
- if (!c.xtype) {
- c.xclass = defaultCls;
- } else {
- c.xclass = defaultCls + '-' + c.xtype;
- }
-
- }
-
- c = BUI.Component.create(c, self);
- c.setInternal('parent', self);
- // set 通知 view 也更新对应属性
- c.set('render', contentEl);
- c.set('elBefore', renderBefore);
- // 如果 parent 也没渲染,子组件 create 出来和 parent 节点关联
- // 子组件和 parent 组件一起渲染
- // 之前设好属性,view ,logic 同步还没 bind ,create 不是 render ,还没有 bindUI
- c.create(undefined);
- return c;
-}
-
-/**
- * 不使用 valueFn,
- * 只有 render 时需要找到默认,其他时候不需要,防止莫名其妙初始化
- * @ignore
- */
-function constructView(self) {
- // 逐层找默认渲染器
- var attrs,
- attrCfg,
- attrName,
- cfg = {},
- v,
- Render = self.get('xview');
-
-
- //将渲染层初始化所需要的属性,直接构造器设置过去
-
- attrs = self.getAttrs();
-
- // 整理属性,对纯属于 view 的属性,添加 getter setter 直接到 view
- for (attrName in attrs) {
- if (attrs.hasOwnProperty(attrName)) {
- attrCfg = attrs[attrName];
- if (attrCfg.view) {
- // 先取后 getter
- // 防止死循环
- if ((v = self.get(attrName)) !== undefined) {
- cfg[attrName] = v;
- }
-
- // setter 不应该有实际操作,仅用于正规化比较好
- // attrCfg.setter = wrapperViewSetter(attrName);
- // 不更改attrCfg的定义,可以多个实例公用一份attrCfg
- /*self.on('after' + BUI.ucfirst(attrName) + 'Change',
- wrapperViewSetter(attrName));
- */
- // 逻辑层读值直接从 view 层读
- // 那么如果存在默认值也设置在 view 层
- // 逻辑层不要设置 getter
- //attrCfg.getter = wrapperViewGetter(attrName);
- }
- }
- }
- // does not autoRender for view
- delete cfg.autoRender;
- cfg.ksComponentCss = getComponentCss(self);
- return new Render(cfg);
-}
-
-function getComponentCss(self) {
- var constructor = self.constructor,
- cls,
- re = [];
- while (constructor && constructor !== Controller) {
- cls = Manager.getXClassByConstructor(constructor);
- if (cls) {
- re.push(cls);
- }
- constructor = constructor.superclass && constructor.superclass.constructor;
- }
- return re.join(' ');
-}
-
-function isMouseEventWithinElement(e, elem) {
- var relatedTarget = e.relatedTarget;
- // 在里面或等于自身都不算 mouseenter/leave
- return relatedTarget &&
- (relatedTarget === elem[0] || $.contains(elem, relatedTarget));
-}
-
-/**
- * 可以实例化的控件,作为最顶层的控件类,一切用户控件都继承此控件
- * xclass: 'controller'.
- * ** 创建子控件 **
- *
- * var Control = Controller.extend([mixin1,mixin2],{ //原型链上的函数
- * renderUI : function(){ //创建DOM
- *
- * },
- * bindUI : function(){ //绑定事件
- *
- * },
- * destructor : funciton(){ //析构函数
- *
- * }
- * },{
- * ATTRS : { //默认的属性
- * text : {
- *
- * }
- * }
- * },{
- * xclass : 'a' //用于把对象解析成类
- * });
- *
- *
- * ** 创建对象 **
- *
- * var c1 = new Control({
- * render : '#t1', //在t1上创建
- * text : 'text1',
- * children : [{xclass : 'a',text : 'a1'},{xclass : 'b',text : 'b1'}]
- * });
- *
- * c1.render();
- *
- * @extends BUI.Component.UIBase
- * @mixins BUI.Component.UIBase.Tpl
- * @mixins BUI.Component.UIBase.Decorate
- * @mixins BUI.Component.UIBase.Depends
- * @mixins BUI.Component.UIBase.ChildCfg
- * @class BUI.Component.Controller
- */
-var Controller = UIBase.extend([UIBase.Decorate, UIBase.Tpl, UIBase.ChildCfg, UIBase.KeyNav, UIBase.Depends], {
- /**
- * 是否是控件,标示对象是否是一个UI 控件
- * @type {Boolean}
- */
- isController: true,
-
- /**
- * 使用前缀获取类的名字
- * @param classes {String} class names without prefixCls. Separated by space.
- * @method
- * @protected
- * @return {String} class name with prefixCls
- */
- getCssClassWithPrefix: Manager.getCssClassWithPrefix,
-
- /**
- * From UIBase, Initialize this component. *
- * @protected
- */
- initializer: function() {
- var self = this;
-
- if (!self.get('id')) {
- self.set('id', self.getNextUniqueId());
- }
- Manager.addComponent(self.get('id'), self);
- // initialize view
- var view = constructView(self);
- self.setInternal('view', view);
- self.__view = view;
- },
-
- /**
- * 返回新的唯一的Id,结果是 'xclass' + number
- * @protected
- * @return {String} 唯一id
- */
- getNextUniqueId: function() {
- var self = this,
- xclass = Manager.getXClassByConstructor(self.constructor);
- return BUI.guid(xclass);
- },
- /**
- * From UIBase. Constructor(or get) view object to create ui elements.
- * @protected
- *
- */
- createDom: function() {
- var self = this,
- //el,
- view = self.get('view');
- view.create(undefined);
- //el = view.getKeyEventTarget();
- /*if (!self.get('allowTextSelection')) {
- //el.unselectable(undefined);
- }*/
- },
-
- /**
- * From UIBase. Call view object to render ui elements.
- * @protected
- *
- */
- renderUI: function() {
- var self = this,
- loader = self.get('loader');
- self.get('view').render();
- self._initChildren();
- if (loader) {
- self.setInternal('loader', loader);
- }
- /**/
-
- },
- _initChildren: function(children) {
- var self = this,
- i,
- children,
- child;
- // then render my children
- children = children || self.get('children').concat();
- self.get('children').length = 0;
- for (i = 0; i < children.length; i++) {
- child = self.addChild(children[i]);
- child.render();
- }
- },
- /**
- * bind ui for box
- * @private
- */
- bindUI: function() {
- var self = this,
- events = self.get('events');
- this.on('afterVisibleChange', function(e) {
- this.fire(e.newVal ? 'show' : 'hide');
- });
- //处理控件事件,设置事件是否冒泡
- BUI.each(events, function(v, k) {
- self.publish(k, {
- bubbles: v
- });
- });
- },
- /**
- * 控件是否包含指定的DOM元素,包括根节点
- *
- * var control = new Control();
- * $(document).on('click',function(ev){
- * var target = ev.target;
- *
- * if(!control.containsElement(elem)){ //未点击在控件内部
- * control.hide();
- * }
- * });
- *
- * @param {HTMLElement} elem DOM 元素
- * @return {Boolean} 是否包含
- */
- containsElement: function(elem) {
- var _self = this,
- el = _self.get('el'),
- children = _self.get('children'),
- result = false;
- if (!_self.get('rendered')) {
- return false;
- }
- if ($.contains(el[0], elem) || el[0] === elem) {
- result = true;
- } else {
- BUI.each(children, function(item) {
- if (item.containsElement(elem)) {
- result = true;
- return false;
- }
- });
- }
- return result;
- },
- /**
- * 是否是子控件的DOM元素
- * @protected
- * @return {Boolean} 是否子控件的DOM元素
- */
- isChildrenElement: function(elem) {
- var _self = this,
- children = _self.get('children'),
- rst = false;
- BUI.each(children, function(child) {
- if (child.containsElement(elem)) {
- rst = true;
- return false;
- }
- });
- return rst;
- },
- /**
- * 显示控件
- */
- show: function() {
- var self = this;
- self.render();
- self.set('visible', true);
- return self;
- },
-
- /**
- * 隐藏控件
- */
- hide: function() {
- var self = this;
- self.set('visible', false);
- return self;
- },
- /**
- * 交替显示或者隐藏
- *
- * control.show(); //显示
- * control.toggle(); //隐藏
- * control.toggle(); //显示
- *
- */
- toggle: function() {
- this.set('visible', !this.get('visible'));
- return this;
- },
- _uiSetFocusable: function(focusable) {
- var self = this,
- t,
- el = self.getKeyEventTarget();
- if (focusable) {
- el.attr('tabIndex', 0)
- // remove smart outline in ie
- // set outline in style for other standard browser
- .attr('hideFocus', true)
- .on('focus', wrapBehavior(self, 'handleFocus'))
- .on('blur', wrapBehavior(self, 'handleBlur'))
- .on('keydown', wrapBehavior(self, 'handleKeydown'))
- .on('keyup', wrapBehavior(self, 'handleKeyUp'));
- } else {
- el.removeAttr('tabIndex');
- if (t = getWrapBehavior(self, 'handleFocus')) {
- el.off('focus', t);
- }
- if (t = getWrapBehavior(self, 'handleBlur')) {
- el.off('blur', t);
- }
- if (t = getWrapBehavior(self, 'handleKeydown')) {
- el.off('keydown', t);
- }
- if (t = getWrapBehavior(self, 'handleKeyUp')) {
- el.off('keyup', t);
- }
- }
- },
-
- _uiSetHandleMouseEvents: function(handleMouseEvents) {
- var self = this,
- el = self.get('el'),
- t;
- if (handleMouseEvents) {
- el.on('mouseenter', wrapBehavior(self, 'handleMouseEnter'))
- .on('mouseleave', wrapBehavior(self, 'handleMouseLeave'))
- .on('contextmenu', wrapBehavior(self, 'handleContextMenu'))
- .on('mousedown', wrapBehavior(self, 'handleMouseDown'))
- .on('mouseup', wrapBehavior(self, 'handleMouseUp'))
- .on('dblclick', wrapBehavior(self, 'handleDblClick'));
- } else {
- t = getWrapBehavior(self, 'handleMouseEnter') &&
- el.off('mouseenter', t);
- t = getWrapBehavior(self, 'handleMouseLeave') &&
- el.off('mouseleave', t);
- t = getWrapBehavior(self, 'handleContextMenu') &&
- el.off('contextmenu', t);
- t = getWrapBehavior(self, 'handleMouseDown') &&
- el.off('mousedown', t);
- t = getWrapBehavior(self, 'handleMouseUp') &&
- el.off('mouseup', t);
- t = getWrapBehavior(self, 'handleDblClick') &&
- el.off('dblclick', t);
- }
- },
-
- _uiSetFocused: function(v) {
- if (v) {
- this.getKeyEventTarget()[0].focus();
- }
- },
- //当使用visiblity显示隐藏时,隐藏时把DOM移除出视图内,显示时回复原位置
- _uiSetVisible: function(isVisible) {
- var self = this,
- el = self.get('el'),
- visibleMode = self.get('visibleMode');
- if (visibleMode === 'visibility') {
- if (isVisible) {
- var position = self.get('cachePosition');
- if (position) {
- self.set('xy', position);
- }
- }
- if (!isVisible) {
- var position = [
- self.get('x'), self.get('y')
- ];
- self.set('cachePosition', position);
- self.set('xy', [-999, -999]);
- }
- }
- },
- //设置children时
- _uiSetChildren: function(v) {
- var self = this,
- children = BUI.cloneObject(v);
- //self.removeChildren(true);
- self._initChildren(children);
- },
- /**
- * 使控件可用
- */
- enable: function() {
- this.set('disabled', false);
- return this;
- },
- /**
- * 使控件不可用,控件不可用时,点击等事件不会触发
- *
- * control.disable(); //禁用
- * control.enable(); //解除禁用
- *
- */
- disable: function() {
- this.set('disabled', true);
- return this;
- },
- /**
- * 控件获取焦点
- */
- focus: function() {
- if (this.get('focusable')) {
- this.set('focused', true);
- }
- },
- /**
- * 子组件将要渲染到的节点,在 render 类上覆盖对应方法
- * @protected
- * @ignore
- */
- getContentElement: function() {
- return this.get('view').getContentElement();
- },
-
- /**
- * 焦点所在元素即键盘事件处理元素,在 render 类上覆盖对应方法
- * @protected
- * @ignore
- */
- getKeyEventTarget: function() {
- return this.get('view').getKeyEventTarget();
- },
-
- /**
- * 添加控件的子控件,索引值为 0-based
- *
- * control.add(new Control());//添加controller对象
- * control.add({xclass : 'a'});//添加xclass 为a 的一个对象
- * control.add({xclass : 'b'},2);//插入到第三个位置
- *
- * @param {BUI.Component.Controller|Object} c 子控件的实例或者配置项
- * @param {String} [c.xclass] 如果c为配置项,设置c的xclass
- * @param {Number} [index] 0-based 如果未指定索引值,则插在控件的最后
- */
- addChild: function(c, index) {
- var self = this,
- children = self.get('children'),
- renderBefore;
- if (index === undefined) {
- index = children.length;
- }
- /**
- * 添加子控件前触发
- * @event beforeAddChild
- * @param {Object} e
- * @param {Object} e.child 添加子控件时传入的配置项或者子控件
- * @param {Number} e.index 添加的位置
- */
- self.fire('beforeAddChild', {
- child: c,
- index: index
- });
- renderBefore = children[index] && children[index].get('el') || null;
- c = initChild(self, c, renderBefore);
- children.splice(index, 0, c);
- // 先 create 占位 再 render
- // 防止 render 逻辑里读 parent.get('children') 不同步
- // 如果 parent 已经渲染好了子组件也要立即渲染,就 创建 dom ,绑定事件
- if (self.get('rendered')) {
- c.render();
- }
-
- /**
- * 添加子控件后触发
- * @event afterAddChild
- * @param {Object} e
- * @param {Object} e.child 添加子控件
- * @param {Number} e.index 添加的位置
- */
- self.fire('afterAddChild', {
- child: c,
- index: index
- });
- return c;
- },
- /**
- * 将自己从父控件中移除
- *
- * control.remove(); //将控件从父控件中移除,并未删除
- * parent.addChild(control); //还可以添加回父控件
- *
- * control.remove(true); //从控件中移除并调用控件的析构函数
- *
- * @param {Boolean} destroy 是否删除DON节点
- * @return {BUI.Component.Controller} 删除的子对象.
- */
- remove: function(destroy) {
- var self = this,
- parent = self.get('parent');
- if (parent) {
- parent.removeChild(self, destroy);
- } else if (destroy) {
- self.destroy();
- }
- return self;
- },
- /**
- * 移除子控件,并返回移除的控件
- *
- * ** 如果 destroy=true,调用移除控件的 {@link BUI.Component.UIBase#destroy} 方法,
- * 同时删除对应的DOM **
- *
- * var child = control.getChild(id);
- * control.removeChild(child); //仅仅移除
- *
- * control.removeChild(child,true); //移除,并调用析构函数
- *
- * @param {BUI.Component.Controller} c 要移除的子控件.
- * @param {Boolean} [destroy=false] 如果是true,
- * 调用控件的方法 {@link BUI.Component.UIBase#destroy} .
- * @return {BUI.Component.Controller} 移除的子控件.
- */
- removeChild: function(c, destroy) {
- var self = this,
- children = self.get('children'),
- index = BUI.Array.indexOf(c, children);
-
- if (index === -1) {
- return;
- }
- /**
- * 删除子控件前触发
- * @event beforeRemoveChild
- * @param {Object} e
- * @param {Object} e.child 子控件
- * @param {Boolean} e.destroy 是否清除DOM
- */
- self.fire('beforeRemoveChild', {
- child: c,
- destroy: destroy
- });
-
- if (index !== -1) {
- children.splice(index, 1);
- }
- if (destroy &&
- // c is still json
- c.destroy) {
- c.destroy();
- }
- /**
- * 删除子控件前触发
- * @event afterRemoveChild
- * @param {Object} e
- * @param {Object} e.child 子控件
- * @param {Boolean} e.destroy 是否清除DOM
- */
- self.fire('afterRemoveChild', {
- child: c,
- destroy: destroy
- });
-
- return c;
- },
-
- /**
- * 删除当前控件的子控件
- *
- * control.removeChildren();//删除所有子控件
- * control.removeChildren(true);//删除所有子控件,并调用子控件的析构函数
- *
- * @see Component.Controller#removeChild
- * @param {Boolean} [destroy] 如果设置 true,
- * 调用子控件的 {@link BUI.Component.UIBase#destroy}方法.
- */
- removeChildren: function(destroy) {
- var self = this,
- i,
- t = [].concat(self.get('children'));
- for (i = 0; i < t.length; i++) {
- self.removeChild(t[i], destroy);
- }
- },
-
- /**
- * 根据索引获取子控件
- *
- * control.getChildAt(0);//获取第一个子控件
- * control.getChildAt(2); //获取第三个子控件
- *
- * @param {Number} index 0-based 索引值.
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChildAt: function(index) {
- var children = this.get('children');
- return children[index] || null;
- },
- /**
- * 根据Id获取子控件
- *
- * control.getChild('id'); //从控件的直接子控件中查找
- * control.getChild('id',true);//递归查找所有子控件,包含子控件的子控件
- *
- * @param {String} id 控件编号
- * @param {Boolean} deep 是否继续查找在子控件中查找
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChild: function(id, deep) {
- return this.getChildBy(function(item) {
- return item.get('id') === id;
- }, deep);
- },
- /**
- * 通过匹配函数查找子控件,返回第一个匹配的对象
- *
- * control.getChildBy(function(child){//从控件的直接子控件中查找
- * return child.get('id') = '1243';
- * });
- *
- * control.getChild(function(child){//递归查找所有子控件,包含子控件的子控件
- * return child.get('id') = '1243';
- * },true);
- *
- * @param {Function} math 查找的匹配函数
- * @param {Boolean} deep 是否继续查找在子控件中查找
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChildBy: function(math, deep) {
- return this.getChildrenBy(math, deep)[0] || null;
- },
- /**
- * 获取控件的附加高度 = control.get('el').outerHeight() - control.get('el').height()
- * @protected
- * @return {Number} 附加宽度
- */
- getAppendHeight: function() {
- var el = this.get('el');
- return el.outerHeight() - el.height();
- },
- /**
- * 获取控件的附加宽度 = control.get('el').outerWidth() - control.get('el').width()
- * @protected
- * @return {Number} 附加宽度
- */
- getAppendWidth: function() {
- var el = this.get('el');
- return el.outerWidth() - el.width();
- },
- /**
- * 查找符合条件的子控件
- *
- * control.getChildrenBy(function(child){//从控件的直接子控件中查找
- * return child.get('type') = '1';
- * });
- *
- * control.getChildrenBy(function(child){//递归查找所有子控件,包含子控件的子控件
- * return child.get('type') = '1';
- * },true);
- *
- * @param {Function} math 查找的匹配函数
- * @param {Boolean} deep 是否继续查找在子控件中查找,如果符合上面的匹配函数,则不再往下查找
- * @return {BUI.Component.Controller[]} 子控件数组
- */
- getChildrenBy: function(math, deep) {
- var self = this,
- results = [];
- if (!math) {
- return results;
- }
-
- self.eachChild(function(child) {
- if (math(child)) {
- results.push(child);
- } else if (deep) {
-
- results = results.concat(child.getChildrenBy(math, deep));
- }
- });
- return results;
- },
- /**
- * 遍历子元素
- *
- * control.eachChild(function(child,index){ //遍历子控件
- *
- * });
- *
- * @param {Function} func 迭代函数,函数原型function(child,index)
- */
- eachChild: function(func) {
- BUI.each(this.get('children'), func);
- },
- /**
- * Handle dblclick events. By default, this performs its associated action by calling
- * {@link BUI.Component.Controller#performActionInternal}.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleDblClick: function(ev) {
- this.performActionInternal(ev);
- if (!this.isChildrenElement(ev.target)) {
- this.fire('dblclick', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Called by it's container component to dispatch mouseenter event.
- * @private
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseOver: function(ev) {
- var self = this,
- el = self.get('el');
- if (!isMouseEventWithinElement(ev, el)) {
- self.handleMouseEnter(ev);
-
- }
- },
-
- /**
- * Called by it's container component to dispatch mouseleave event.
- * @private
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseOut: function(ev) {
- var self = this,
- el = self.get('el');
- if (!isMouseEventWithinElement(ev, el)) {
- self.handleMouseLeave(ev);
-
- }
- },
-
- /**
- * Handle mouseenter events. If the component is not disabled, highlights it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseEnter: function(ev) {
- var self = this;
- this.set('highlighted', !!ev);
- self.fire('mouseenter', {
- domTarget: ev.target,
- domEvent: ev
- });
- },
-
- /**
- * Handle mouseleave events. If the component is not disabled, de-highlights it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseLeave: function(ev) {
- var self = this;
- self.set('active', false);
- self.set('highlighted', !ev);
- self.fire('mouseleave', {
- domTarget: ev.target,
- domEvent: ev
- });
- },
-
- /**
- * Handles mousedown events. If the component is not disabled,
- * If the component is activeable, then activate it.
- * If the component is focusable, then focus it,
- * else prevent it from receiving keyboard focus.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseDown: function(ev) {
- var self = this,
- n,
- target = $(ev.target),
- isMouseActionButton = ev['which'] === 1,
- el;
- if (isMouseActionButton) {
- el = self.getKeyEventTarget();
- if (self.get('activeable')) {
- self.set('active', true);
- }
- if (self.get('focusable')) {
- //如果不是input,select,area等可以获取焦点的控件,那么设置此控件的focus
- /*if(target[0] == el[0] || (!target.is('input,select,area') && !target.attr('tabindex'))){
- el[0].focus();
-
- }*/
- self.setInternal('focused', true);
- }
-
- if (!self.get('allowTextSelection')) {
- // firefox /chrome 不会引起焦点转移
- n = ev.target.nodeName;
- n = n && n.toLowerCase();
- // do not prevent focus when click on editable element
- if (n !== 'input' && n !== 'textarea') {
- ev.preventDefault();
- }
- }
- if (!self.isChildrenElement(ev.target)) {
- self.fire('mousedown', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
-
- }
- },
-
- /**
- * Handles mouseup events.
- * If this component is not disabled, performs its associated action by calling
- * {@link BUI.Component.Controller#performActionInternal}, then deactivates it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseUp: function(ev) {
- var self = this,
- isChildrenElement = self.isChildrenElement(ev.target);
- // 左键
- if (self.get('active') && ev.which === 1) {
- self.performActionInternal(ev);
- self.set('active', false);
- if (!isChildrenElement) {
- self.fire('click', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- }
- if (!isChildrenElement) {
- self.fire('mouseup', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Handles context menu.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleContextMenu: function(ev) {},
-
- /**
- * Handles focus events. Style focused class.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleFocus: function(ev) {
- this.set('focused', !!ev);
- this.fire('focus', {
- domEvent: ev,
- domTarget: ev.target
- });
- },
-
- /**
- * Handles blur events. Remove focused class.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleBlur: function(ev) {
- this.set('focused', !ev);
- this.fire('blur', {
- domEvent: ev,
- domTarget: ev.target
- });
- },
-
- /**
- * Handle enter keydown event to {@link BUI.Component.Controller#performActionInternal}.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleKeyEventInternal: function(ev) {
- var self = this,
- isChildrenElement = self.isChildrenElement(ev.target);
- if (ev.which === 13) {
- if (!isChildrenElement) {
- self.fire('click', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
-
- return this.performActionInternal(ev);
- }
- if (!isChildrenElement) {
- self.fire('keydown', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Handle keydown events.
- * If the component is not disabled, call {@link BUI.Component.Controller#handleKeyEventInternal}
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleKeydown: function(ev) {
- var self = this;
- if (self.handleKeyEventInternal(ev)) {
- ev.halt();
- return true;
- }
- },
- handleKeyUp: function(ev) {
- var self = this;
- if (!self.isChildrenElement(ev.target)) {
- self.fire('keyup', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
- /**
- * Performs the appropriate action when this component is activated by the user.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- performActionInternal: function(ev) {},
- /**
- * 析构函数
- * @protected
- */
- destructor: function() {
- var self = this,
- id,
- i,
- view,
- children = self.get('children');
- id = self.get('id');
- for (i = 0; i < children.length; i++) {
- children[i].destroy && children[i].destroy();
- }
- self.get('view').destroy();
- Manager.removeComponent(id);
- },
- //覆写set方法
- set: function(name, value, opt) {
- var _self = this,
- view = _self.__view,
- attr = _self.__attrs[name],
- ucName,
- ev,
- m;
- if (BUI.isObject(name)) {
- opt = value;
- BUI.each(name, function(v, k) {
- _self.set(k, v, opt);
- });
- }
- if (!view || !attr || (opt && opt.silent)) { //未初始化view或者没用定义属性
- Controller.superclass.set.call(this, name, value, opt);
- return _self;
- }
-
- var prevVal = Controller.superclass.get.call(this, name);
-
- //如果未改变值不进行修改
- if (!$.isPlainObject(value) && !BUI.isArray(value) && prevVal === value) {
- return _self;
- }
- ucName = BUI.ucfirst(name);
- m = '_uiSet' + ucName;
- //触发before事件
- _self.fire('before' + ucName + 'Change', {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- });
-
- _self.setInternal(name, value);
-
- value = _self.__attrVals[name];
- if (view && attr.view) {
- view.set(name, value);
- //return _self;
- }
- ev = {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- };
-
- //触发before事件
- _self.fire('after' + ucName + 'Change', ev);
- if (_self.get('binded') && _self[m]) {
- _self[m](value, ev);
- }
- return _self;
- },
- //覆写get方法,改变时同时改变view的值
- get: function(name) {
- var _self = this,
- view = _self.__view,
- attr = _self.__attrs[name],
- value = Controller.superclass.get.call(this, name);
- if (value !== undefined) {
- return value;
- }
- if (view && attr && attr.view) {
- return view.get(name);
- }
-
- return value;
- }
-}, {
- ATTRS: {
- /**
- * 控件的Html 内容
- *
- * new Control({
- * content : '内容',
- * render : '#c1'
- * });
- *
- * @cfg {String|jQuery} content
- */
- /**
- * 控件的Html 内容
- * @type {String|jQuery}
- */
- content: {
- view: 1
- },
- /**
- * 控件根节点使用的标签
- *
- * new Control({
- * elTagName : 'ul',
- * content : '内容 ', //控件的DOM <ul><li>内容</li></ul>
- * render : '#c1'
- * });
- *
- * @cfg {String} elTagName
- */
- elTagName: {
- // 生成标签名字
- view: true,
- value: 'div'
- },
- /**
- * 子元素的默认 xclass,配置child的时候没必要每次都填写xclass
- * @type {String}
- */
- defaultChildClass: {
-
- },
- /**
- * 如果控件未设置 xclass,同时父元素设置了 defaultChildClass,那么
- * xclass = defaultChildClass + '-' + xtype
- *
- * A.ATTRS = {
- * defaultChildClass : {
- * value : 'b'
- * }
- * }
- * //类B 的xclass = 'b'类 B1的xclass = 'b-1',类 B2的xclass = 'b-2',那么
- * var a = new A({
- * children : [
- * {content : 'b'}, //B类
- * {content : 'b1',xtype:'1'}, //B1类
- * {content : 'b2',xtype:'2'}, //B2类
- * ]
- * });
- *
- * @type {String}
- */
- xtype: {
-
- },
- /**
- * 标示控件的唯一编号,默认会自动生成
- * @cfg {String} id
- */
- /**
- * 标示控件的唯一编号,默认会自动生成
- * @type {String}
- */
- id: {
- view: true
- },
- /**
- * 控件宽度
- *
- * new Control({
- * width : 200 // 200,'200px','20%'
- * });
- *
- * @cfg {Number|String} width
- */
- /**
- * 控件宽度
- *
- * control.set('width',200);
- * control.set('width','200px');
- * control.set('width','20%');
- *
- * @type {Number|String}
- */
- width: {
- view: 1
- },
- /**
- * 控件宽度
- *
- * new Control({
- * height : 200 // 200,'200px','20%'
- * });
- *
- * @cfg {Number|String} height
- */
- /**
- * 控件宽度
- *
- * control.set('height',200);
- * control.set('height','200px');
- * control.set('height','20%');
- *
- * @type {Number|String}
- */
- height: {
- view: 1
- },
- /**
- * 控件根节点应用的样式
- *
- * new Control({
- * elCls : 'test',
- * content : '内容',
- * render : '#t1' //<div id='t1'><div class="test">内容</div></div>
- * });
- *
- * @cfg {String} elCls
- */
- /**
- * 控件根节点应用的样式 css class
- * @type {String}
- */
- elCls: {
- view: 1
- },
- /**
- * @cfg {Object} elStyle
- * 控件根节点应用的css属性
- *
- * var cfg = {elStyle : {width:'100px', height:'200px'}};
- *
- */
- /**
- * 控件根节点应用的css属性,以键值对形式
- * @type {Object}
- *
- * control.set('elStyle', {
- * width:'100px',
- * height:'200px'
- * });
- *
- */
- elStyle: {
- view: 1
- },
- /**
- * @cfg {Object} elAttrs
- * 控件根节点应用的属性,以键值对形式:
- *
- * new Control({
- * elAttrs :{title : 'tips'}
- * });
- *
- */
- /**
- * @type {Object}
- * 控件根节点应用的属性,以键值对形式:
- * { title : 'tips'}
- * @ignore
- */
- elAttrs: {
- view: 1
- },
- /**
- * 将控件插入到指定元素前
- *
- * new Control({
- * elBefore : '#t1'
- * });
- *
- * @cfg {jQuery} elBefore
- */
- /**
- * 将控件插入到指定元素前
- * @type {jQuery}
- * @ignore
- */
- elBefore: {
- // better named to renderBefore, too late !
- view: 1
- },
-
- /**
- * 只读属性,根节点DOM
- * @type {jQuery}
- */
- el: {
- view: 1
- },
- /**
- * 控件支持的事件
- * @type {Object}
- * @protected
- */
- events: {
- value: {
- /**
- * 点击事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'click': true,
- /**
- * 双击事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'dblclick': true,
- /**
- * 鼠标移入控件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseenter': true,
- /**
- * 鼠标移出控件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseleave': true,
- /**
- * 键盘按下按键事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'keydown': true,
- /**
- * 键盘按键抬起控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'keyup': true,
- /**
- * 控件获取焦点事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'focus': false,
- /**
- * 控件丢失焦点事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'blur': false,
- /**
- * 鼠标按下控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mousedown': true,
- /**
- * 鼠标抬起控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseup': true,
- /**
- * 控件显示
- * @event
- */
- 'show': false,
- /**
- * 控件隐藏
- * @event
- */
- 'hide': false
- }
- },
- /**
- * 指定控件的容器
- *
- * new Control({
- * render : '#t1',
- * elCls : 'test',
- * content : '123' //<div id="t1"><div class="test bui-xclass"><span>123</span></div></div>
- * });
- *
- * @cfg {jQuery} render
- */
- /**
- * 指定控件的容器
- * @type {jQuery}
- * @ignore
- */
- render: {
- view: 1
- },
- /**
- * ARIA 标准中的role,不要更改此属性
- * @type {String}
- * @protected
- */
- role: {
- view: 1
- },
- /**
- * 状态相关的样式,默认情况下会使用 前缀名 + xclass + '-' + 状态名
- *
- * new Control({
- * visibleMode: 'visibility'
- * });
- *
- * @cfg {String} [visibleMode = 'display']
- */
- /**
- * 控件的可视方式,使用 css
- * - 'display' 或者
- * - 'visibility'
- *
- * control.set('visibleMode','display')
- *
- * @type {String}
- */
- visibleMode: {
- view: 1,
- value: 'display'
- },
- /**
- * 控件是否可见
- *
- * new Control({
- * visible : false //隐藏
- * });
- *
- * @cfg {Boolean} [visible = true]
- */
- /**
- * 控件是否可见
- *
- * control.set('visible',true); //control.show();
- * control.set('visible',false); //control.hide();
- *
- * @type {Boolean}
- * @default true
- */
- visible: {
- value: true,
- view: 1
- },
- /**
- * 是否允许处理鼠标事件
- * @default true.
- * @type {Boolean}
- * @protected
- */
- handleMouseEvents: {
- value: true
- },
-
- /**
- * 控件是否可以获取焦点
- * @default true.
- * @protected
- * @type {Boolean}
- */
- focusable: {
- value: false,
- view: 1
- },
- /**
- * 一旦使用loader的默认配置
- * @protected
- * @type {Object}
- */
- defaultLoaderCfg: {
- value: {
- property: 'content',
- autoLoad: true
- }
- },
- /**
- * 控件内容的加载器
- * @type {BUI.Component.Loader}
- */
- loader: {
- getter: function(v) {
- var _self = this,
- defaultCfg;
- if (v && !v.isLoader) {
- v.target = _self;
- defaultCfg = _self.get('defaultLoaderCfg')
- v = new Loader(BUI.merge(defaultCfg, v));
- _self.setInternal('loader', v);
- }
- return v;
- }
- },
- /**
- * 1. Whether allow select this component's text.
- * control.set('disabled',true); //== control.disable();
- * control.set('disabled',false); //== control.enable();
- *
- * @type {Boolean}
- * @default false
- */
- disabled: {
- view: 1,
- value: false
- },
- /**
- * 渲染控件的View类.
- * @protected
- * @cfg {BUI.Component.View} [xview = BUI.Component.View]
- */
- /**
- * 渲染控件的View类.
- * @protected
- * @type {BUI.Component.View}
- */
- xview: {
- value: View
- }
- },
- PARSER: {
- visible: function(el) {
- var _self = this,
- display = el.css('display'),
-
- visibility = el.css('visibility'),
- visibleMode = _self.get('visibleMode');
- if ((display == 'none' && visibleMode == 'display') || (visibility == 'hidden' && visibleMode == 'visibility')) {
- return false;
- }
- return true;
- },
- disabled: function(el){
- var _self = this,
- cls = _self.get('prefixCls') + _self.get('xclass') + '-disabled';
- return el.hasClass(cls);
- }
- }
-}, {
- xclass: 'controller',
- priority: 0
-});
-module.exports = Controller;
-
-});
-define("bui-common/1.1.2/src/component/loader-debug", ["jquery"], function(require, exports, module){
-/**
- * @fileOverview 加载控件内容
- * @ignore
- */
-
-'use strict';
-var $ = require('jquery'),
- BUI = require("bui-common/1.1.2/src/util-debug"),
- Base = require("bui-common/1.1.2/src/base-debug"),
- /**
- * @class BUI.Component.Loader
- * @extends BUI.Base
- * ** 控件的默认Loader属性是:**
- *
- *
- * defaultLoader : {
- * value : {
- * property : 'content',
- * autoLoad : true
- * }
- * }
- *
- * ** 一般的控件默认读取html,作为控件的content值 **
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json'
- * }
- * });
- *
- * control.render();
- *
- *
- * ** 可以修改Loader的默认属性,加载children **
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/children.json',
- * property : 'children',
- * dataType : 'json'
- * }
- * });
- *
- * control.render();
- *
- * 加载控件内容的类,一般不进行实例化
- */
- Loader = function(config) {
- Loader.superclass.constructor.call(this, config);
- this._init();
- };
-
-Loader.ATTRS = {
-
- /**
- * 加载内容的地址
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} url
- */
- url: {
-
- },
- /**
- * 对应的控件,加载完成后设置属性到对应的控件
- * @readOnly
- * @type {BUI.Component.Controller}
- */
- target: {
-
- },
- /**
- * @private
- * 是否load 过
- */
- hasLoad: {
- value: false
- },
- /**
- * 是否自动加载数据
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * autoLoad : false
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Boolean} [autoLoad = true]
- */
- autoLoad: {
-
- },
- /**
- * 延迟加载
- *
- * - event : 触发加载的事件
- * - repeat :是否重复加载
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * lazyLoad : {
- * event : 'show',
- * repeat : true
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Object} [lazyLoad = null]
- */
- lazyLoad: {
-
- },
- /**
- * 加载返回的数据作为控件的那个属性
- *
- * var control = new BUI.List.SimpleList({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * dataType : 'json',
- * property : 'items'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} property
- */
- property: {
-
- },
- /**
- * 格式化返回的数据
- * @cfg {Function} renderer
- */
- renderer: {
- value: function(value) {
- return value;
- }
- },
- /**
- * 加载数据时是否显示屏蔽层和加载提示 {@link BUI.Mask.LoadMask}
- *
- * - loadMask : true时使用loadMask 默认的配置信息
- * - loadMask : {msg : '正在加载,请稍后。。'} LoadMask的配置信息
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * loadMask : true
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Boolean|Object} [loadMask = false]
- */
- loadMask: {
- value: false
- },
- /**
- * ajax 请求返回数据的类型
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * dataType : 'json',
- * property : 'items'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} [dataType = 'text']
- */
- dataType: {
- value: 'text'
- },
- /**
- * Ajax请求的配置项,会覆盖 url,dataType数据
- * @cfg {Object} ajaxOptions
- */
- ajaxOptions: {
- //shared : false,
- value: {
- type: 'get',
- cache: false
- }
- },
- /**
- * 初始化的请求参数
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * params : {
- * a : 'a',
- * b : 'b'
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Object} params
- * @default null
- */
- params: {
-
- },
- /**
- * 附加参数,每次请求都带的参数
- * @cfg {Object} appendParams
- */
- appendParams: {
-
- },
- /**
- * 最后一次请求的参数
- * @readOnly
- * @private
- * @type {Object}
- */
- lastParams: {
- shared: false,
- value: {}
- },
- /**
- * 加载数据,并添加属性到控件后的回调函数
- * - data : 加载的数据
- * - params : 加载的参数
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * callback : function(text){
- * var target = this.get('target');//control
- * //TO DO
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Function} callback
- */
- callback: {
-
- },
- /**
- * 失败的回调函数
- * - response : 返回的错误对象
- * - params : 加载的参数
- * @cfg {Function} failure
- */
- failure: {
-
- }
-
-};
-
-BUI.extend(Loader, Base);
-
-BUI.augment(Loader, {
- /**
- * @protected
- * 是否是Loader
- * @type {Boolean}
- */
- isLoader: true,
- //初始化
- _init: function() {
- var _self = this,
- autoLoad = _self.get('autoLoad'),
- params = _self.get('params');
-
- _self._initMask();
- if (autoLoad) {
- _self.load(params);
- } else {
- _self._initParams();
- _self._initLazyLoad();
- }
- },
- //初始化延迟加载
- _initLazyLoad: function() {
- var _self = this,
- target = _self.get('target'),
- lazyLoad = _self.get('lazyLoad');
-
- if (target && lazyLoad && lazyLoad.event) {
- target.on(lazyLoad.event, function() {
- if (!_self.get('hasLoad') || lazyLoad.repeat) {
- _self.load();
- }
- });
- }
- },
- /**
- * 初始化mask
- * @private
- */
- _initMask: function() {
- var _self = this,
- target = _self.get('target'),
- loadMask = _self.get('loadMask');
- if (target && loadMask) {
- require.async('bui-mask/1.1.0/index', function(Mask) {
- var cfg = $.isPlainObject(loadMask) ? loadMask : {};
- loadMask = new Mask.LoadMask(BUI.mix({
- el: target.get('el')
- }, cfg));
- _self.set('loadMask', loadMask);
- });
- }
- },
- //初始化查询参数
- _initParams: function() {
- var _self = this,
- lastParams = _self.get('lastParams'),
- params = _self.get('params');
-
- //初始化 参数
- BUI.mix(lastParams, params);
- },
- /**
- * 加载内容
- * @param {Object} params 加载数据的参数
- */
- load: function(params) {
- var _self = this,
- url = _self.get('url'),
- ajaxOptions = _self.get('ajaxOptions'),
- lastParams = _self.get('lastParams'),
- appendParams = _self.get('appendParams');
-
- //BUI.mix(true,lastParams,appendParams,params);
- params = params || lastParams;
- params = BUI.merge(appendParams, params); //BUI.cloneObject(lastParams);
- _self.set('lastParams', params);
- //未提供加载地址,阻止加载
- if (!url) {
- return;
- }
-
- _self.onBeforeLoad();
- _self.set('hasLoad', true);
- $.ajax(BUI.mix({
- dataType: _self.get('dataType'),
- data: params,
- url: url,
- success: function(data) {
- _self.onload(data, params);
- },
- error: function(jqXHR, textStatus, errorThrown) {
- _self.onException({
- jqXHR: jqXHR,
- textStatus: textStatus,
- errorThrown: errorThrown
- }, params);
- }
- }, ajaxOptions));
- },
- /**
- * @private
- * 加载前
- */
- onBeforeLoad: function() {
- var _self = this,
- loadMask = _self.get('loadMask');
- if (loadMask && loadMask.show) {
- loadMask.show();
- }
- },
- /**
- * @private
- * 加载完毕
- */
- onload: function(data, params) {
- var _self = this,
- loadMask = _self.get('loadMask'),
- property = _self.get('property'),
- callback = _self.get('callback'),
- renderer = _self.get('renderer'),
- target = _self.get('target');
-
- if (BUI.isString(data)) {
- target.set(property, ''); //防止2次返回的数据一样
- }
- target.set(property, renderer.call(_self, data));
-
- /**/
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- if (callback) {
- callback.call(this, data, params);
- }
- },
- /**
- * @private
- * 加载出错
- */
- onException: function(response, params) {
- var _self = this,
- failure = _self.get('failure');
- if (failure) {
- failure.call(this, response, params);
- }
- }
-
-});
-module.exports = Loader;
-
-});
diff --git a/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common.js b/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common.js
deleted file mode 100644
index b7099ff..0000000
--- a/spm_modules/bui-common/1.1.2/dist/bui-common/1.1.2/common.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define("bui-common/1.1.2/common",["jquery"],function(e,t,n){var i=e("bui-common/1.1.2/src/util");i.mix(i,{UA:e("bui-common/1.1.2/src/ua"),JSON:e("bui-common/1.1.2/src/json"),Date:e("bui-common/1.1.2/src/date"),Array:e("bui-common/1.1.2/src/array"),KeyCode:e("bui-common/1.1.2/src/keycode"),Observable:e("bui-common/1.1.2/src/observable"),Base:e("bui-common/1.1.2/src/base"),Component:e("bui-common/1.1.2/src/component/component")}),n.exports=i}),define("bui-common/1.1.2/src/util",["jquery"],function(e,t,n){function i(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=e[n]||{},r(e[n],t[n]))}function r(e,t){for(var n in t)t.hasOwnProperty(n)&&("value"==n?BUI.isObject(t[n])?(e[n]=e[n]||{},BUI.mix(e[n],t[n])):BUI.isArray(t[n])?(e[n]=e[n]||[],e[n]=e[n].concat(t[n])):e[n]=t[n]:e[n]=t[n])}var o=e("jquery");!function(e){e.fn&&(e.fn.on=e.fn.on||e.fn.bind,e.fn.off=e.fn.off||e.fn.unbind)}(o);var a=window,s=document,u=Object.prototype,c=u.toString,l="body",d="documentElement",f="scroll",h=f+"Width",g=f+"Height",m="ATTRS",v="PARSER",p="guid";window.BUI=window.BUI||{},o.extend(BUI,{version:"1.1.0",isFunction:function(e){return"function"==typeof e},isArray:"isArray"in Array?Array.isArray:function(e){return"[object Array]"===c.call(e)},isDate:function(e){return"[object Date]"===c.call(e)},isObject:"[object Object]"===c.call(null)?function(e){return null!==e&&void 0!==e&&"[object Object]"===c.call(e)&&void 0===e.ownerDocument}:function(e){return"[object Object]"===c.call(e)},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},augment:function(e){if(!BUI.isFunction(e))return e;for(var t=1;t
- * var Control = function(cfg){
- * Control.superclass.constructor.call(this,cfg); //调用BUI.Base的构造方法,将配置项变成属性
- * };
- *
- * BUI.extend(Control,BUI.Base);
- *
- *
- * ** 声明默认属性 **
- *
- * Control.ATTRS = {
- * id : {
- * value : 'id' //value 是此属性的默认值
- * },
- * renderTo : {
- *
- * },
- * el : {
- * valueFn : function(){ //第一次调用的时候将renderTo的DOM转换成el属性
- * return $(this.get('renderTo'));
- * }
- * },
- * text : {
- * getter : function(){ //getter 用于获取值,而不是设置的值
- * return this.get('el').val();
- * },
- * setter : function(v){ //不仅仅是设置值,可以进行相应的操作
- * this.get('el').val(v);
- * }
- * }
- * };
- *
- *
- * ** 声明类的方法 **
- *
- * BUI.augment(Control,{
- * getText : function(){
- * return this.get('text'); //可以用get方法获取属性值
- * },
- * setText : function(txt){
- * this.set('text',txt); //使用set 设置属性值
- * }
- * });
- *
- *
- * ** 创建对象 **
- *
- * var c = new Control({
- * id : 'oldId',
- * text : '测试文本',
- * renderTo : '#t1'
- * });
- *
- * var el = c.get(el); //$(#t1);
- * el.val(); //text的值 : '测试文本'
- * c.set('text','修改的值');
- * el.val(); //'修改的值'
- *
- * c.set('id','newId') //会触发2个事件: beforeIdChange,afterIdChange 2个事件 ev.newVal 和ev.prevVal标示新旧值
- *
- * @class BUI.Base
- * @abstract
- * @extends BUI.Observable
- * @param {Object} config 配置项
- */
-var Base = function(config) {
- var _self = this,
- c = _self.constructor,
- constructors = [];
- this.__attrs = {};
- this.__attrVals = {};
- Observable.apply(this, arguments);
- // define
- while (c) {
- constructors.push(c);
- if (c.extensions) { //延迟执行mixin
- BUI.mixin(c, c.extensions);
- delete c.extensions;
- }
- //_self.addAttrs(c['ATTRS']);
- c = c.superclass ? c.superclass.constructor : null;
- }
- //以当前对象的属性最终添加到属性中,覆盖之前的属性
- /*for (var i = constructors.length - 1; i >= 0; i--) {
- _self.addAttrs(constructors[i]['ATTRS'],true);
- };*/
- var con = _self.constructor;
- initClassAttrs(con);
- _self._initStaticAttrs(con._attrs);
- _self._initAttrs(config);
-};
-
-Base.INVALID = INVALID;
-
-BUI.extend(Base, Observable);
-
-BUI.augment(Base, {
- _initStaticAttrs: function(attrs) {
- var _self = this,
- __attrs;
-
- __attrs = _self.__attrs = {};
- for (var p in attrs) {
- if (attrs.hasOwnProperty(p)) {
- var attr = attrs[p];
- /*if(BUI.isObject(attr.value) || BUI.isArray(attr.value) || attr.valueFn){*/
- if (attr.shared === false || attr.valueFn) {
- __attrs[p] = {};
- BUI.mixAttr(__attrs[p], attrs[p]);
- } else {
- __attrs[p] = attrs[p];
- }
- }
- };
- },
- /**
- * 添加属性定义
- * @protected
- * @param {String} name 属性名
- * @param {Object} attrConfig 属性定义
- * @param {Boolean} overrides 是否覆盖字段
- */
- addAttr: function(name, attrConfig, overrides) {
- var _self = this,
- attrs = _self.__attrs,
- attr = attrs[name];
-
- if (!attr) {
- attr = attrs[name] = {};
- }
- for (var p in attrConfig) {
- if (attrConfig.hasOwnProperty(p)) {
- if (p == 'value') {
- if (BUI.isObject(attrConfig[p])) {
- attr[p] = attr[p] || {};
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else if (BUI.isArray(attrConfig[p])) {
- attr[p] = attr[p] || [];
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else {
- attr[p] = attrConfig[p];
- }
- } else {
- attr[p] = attrConfig[p];
- }
- }
-
- };
- return _self;
- },
- /**
- * 添加属性定义
- * @protected
- * @param {Object} attrConfigs An object with attribute name/configuration pairs.
- * @param {Object} initialValues user defined initial values
- * @param {Boolean} overrides 是否覆盖字段
- */
- addAttrs: function(attrConfigs, initialValues, overrides) {
- var _self = this;
- if (!attrConfigs) {
- return _self;
- }
- if (typeof(initialValues) === 'boolean') {
- overrides = initialValues;
- initialValues = null;
- }
- BUI.each(attrConfigs, function(attrConfig, name) {
- _self.addAttr(name, attrConfig, overrides);
- });
- if (initialValues) {
- _self.set(initialValues);
- }
- return _self;
- },
- /**
- * 是否包含此属性
- * @protected
- * @param {String} name 值
- * @return {Boolean} 是否包含
- */
- hasAttr: function(name) {
- return name && this.__attrs.hasOwnProperty(name);
- },
- /**
- * 获取默认的属性值
- * @protected
- * @return {Object} 属性值的键值对
- */
- getAttrs: function() {
- return this.__attrs; //ensureNonEmpty(this, '__attrs', true);
- },
- /**
- * 获取属性名/属性值键值对
- * @protected
- * @return {Object} 属性对象
- */
- getAttrVals: function() {
- return this.__attrVals; //ensureNonEmpty(this, '__attrVals', true);
- },
- /**
- * 获取属性值,所有的配置项和属性都可以通过get方法获取
- *
- * var control = new Control({
- * text : 'control text'
- * });
- * control.get('text'); //control text
- *
- * control.set('customValue','value'); //临时变量
- * control.get('customValue'); //value
- *
- * ** 属性值/配置项 **
- *
- * Control.ATTRS = { //声明属性值
- * text : {
- * valueFn : function(){},
- * value : 'value',
- * getter : function(v){}
- * }
- * };
- * var c = new Control({
- * text : 'text value'
- * });
- * //get 函数取的顺序为:是否有修改值(配置项、set)、默认值(第一次调用执行valueFn),如果有getter,则将值传入getter返回
- *
- * c.get('text') //text value
- * c.set('text','new text');//修改值
- * c.get('text');//new text
- *
- * @param {String} name 属性名
- * @return {Object} 属性值
- */
- get: function(name) {
- var _self = this,
- //declared = _self.hasAttr(name),
- attrVals = _self.__attrVals,
- attrConfig,
- getter,
- ret;
-
- attrConfig = ensureNonEmpty(_self.__attrs, name);
- getter = attrConfig['getter'];
-
- // get user-set value or default value
- //user-set value takes privilege
- ret = name in attrVals ?
- attrVals[name] :
- _self._getDefAttrVal(name);
-
- // invoke getter for this attribute
- if (getter && (getter = normalFn(_self, getter))) {
- ret = getter.call(_self, ret, name);
- }
-
- return ret;
- },
- /**
- * @清理所有属性值
- * @protected
- */
- clearAttrVals: function() {
- this.__attrVals = {};
- },
- /**
- * 移除属性定义
- * @protected
- */
- removeAttr: function(name) {
- var _self = this;
-
- if (_self.hasAttr(name)) {
- delete _self.__attrs[name];
- delete _self.__attrVals[name];
- }
-
- return _self;
- },
- /**
- * 设置属性值,会触发before+Name+Change,和 after+Name+Change事件
- *
- * control.on('beforeTextChange',function(ev){
- * var newVal = ev.newVal,
- * attrName = ev.attrName,
- * preVal = ev.prevVal;
- *
- * //TO DO
- * });
- * control.set('text','new text'); //此时触发 beforeTextChange,afterTextChange
- * control.set('text','modify text',{silent : true}); //此时不触发事件
- *
- * @param {String|Object} name 属性名
- * @param {Object} value 值
- * @param {Object} opts 配置项
- * @param {Boolean} opts.silent 配置属性时,是否不触发事件
- */
- set: function(name, value, opts) {
- var _self = this;
- if ($.isPlainObject(name)) {
- opts = value;
- var all = Object(name),
- attrs = [];
-
- for (name in all) {
- if (all.hasOwnProperty(name)) {
- setInternal(_self, name, all[name], opts);
- }
- }
- return _self;
- }
- return setInternal(_self, name, value, opts);
- },
- /**
- * 设置属性,不触发事件
- *
- * control.setInternal('text','text');//此时不触发事件
- *
- * @param {String} name 属性名
- * @param {Object} value 属性值
- * @return {Boolean|undefined} 如果值无效则返回false,否则返回undefined
- */
- setInternal: function(name, value, opts) {
- return this._set(name, value, opts);
- },
- //获取属性默认值
- _getDefAttrVal: function(name) {
- var _self = this,
- attrs = _self.__attrs,
- attrConfig = ensureNonEmpty(attrs, name),
- valFn = attrConfig.valueFn,
- val;
-
- if (valFn && (valFn = normalFn(_self, valFn))) {
- val = valFn.call(_self);
- if (val !== undefined) {
- attrConfig.value = val;
- }
- delete attrConfig.valueFn;
- attrs[name] = attrConfig;
- }
-
- return attrConfig.value;
- },
- //仅仅设置属性值
- _set: function(name, value, opts) {
- var _self = this,
- setValue,
- // if host does not have meta info corresponding to (name,value)
- // then register on demand in order to collect all data meta info
- // 一定要注册属性元数据,否则其他模块通过 _attrs 不能枚举到所有有效属性
- // 因为属性在声明注册前可以直接设置值
- attrConfig = ensureNonEmpty(_self.__attrs, name, true),
- setter = attrConfig['setter'];
-
- // if setter has effect
- if (setter && (setter = normalFn(_self, setter))) {
- setValue = setter.call(_self, value, name);
- }
-
- if (setValue === INVALID) {
- return false;
- }
-
- if (setValue !== undefined) {
- value = setValue;
- }
-
- // finally set
- _self.__attrVals[name] = value;
- return _self;
- },
- //初始化属性
- _initAttrs: function(config) {
- var _self = this;
- if (config) {
- for (var attr in config) {
- if (config.hasOwnProperty(attr)) {
- // 用户设置会调用 setter/validator 的,但不会触发属性变化事件
- _self._set(attr, config[attr]);
- }
-
- }
- }
- }
-});
-module.exports = Base;
diff --git a/spm_modules/bui-common/1.1.2/src/component/component.js b/spm_modules/bui-common/1.1.2/src/component/component.js
deleted file mode 100644
index 0ef4003..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/component.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @fileOverview Component命名空间的入口文件
- * @ignore
- */
-
-/**
- * @class BUI.Component
- *
- *
- *
- * var Control = Controller.extend([mixin1,mixin2],{ //原型链上的函数
- * renderUI : function(){ //创建DOM
- *
- * },
- * bindUI : function(){ //绑定事件
- *
- * },
- * destructor : funciton(){ //析构函数
- *
- * }
- * },{
- * ATTRS : { //默认的属性
- * text : {
- *
- * }
- * }
- * },{
- * xclass : 'a' //用于把对象解析成类
- * });
- *
- *
- * ** 创建对象 **
- *
- * var c1 = new Control({
- * render : '#t1', //在t1上创建
- * text : 'text1',
- * children : [{xclass : 'a',text : 'a1'},{xclass : 'b',text : 'b1'}]
- * });
- *
- * c1.render();
- *
- * @extends BUI.Component.UIBase
- * @mixins BUI.Component.UIBase.Tpl
- * @mixins BUI.Component.UIBase.Decorate
- * @mixins BUI.Component.UIBase.Depends
- * @mixins BUI.Component.UIBase.ChildCfg
- * @class BUI.Component.Controller
- */
-var Controller = UIBase.extend([UIBase.Decorate, UIBase.Tpl, UIBase.ChildCfg, UIBase.KeyNav, UIBase.Depends], {
- /**
- * 是否是控件,标示对象是否是一个UI 控件
- * @type {Boolean}
- */
- isController: true,
-
- /**
- * 使用前缀获取类的名字
- * @param classes {String} class names without prefixCls. Separated by space.
- * @method
- * @protected
- * @return {String} class name with prefixCls
- */
- getCssClassWithPrefix: Manager.getCssClassWithPrefix,
-
- /**
- * From UIBase, Initialize this component. *
- * @protected
- */
- initializer: function() {
- var self = this;
-
- if (!self.get('id')) {
- self.set('id', self.getNextUniqueId());
- }
- Manager.addComponent(self.get('id'), self);
- // initialize view
- var view = constructView(self);
- self.setInternal('view', view);
- self.__view = view;
- },
-
- /**
- * 返回新的唯一的Id,结果是 'xclass' + number
- * @protected
- * @return {String} 唯一id
- */
- getNextUniqueId: function() {
- var self = this,
- xclass = Manager.getXClassByConstructor(self.constructor);
- return BUI.guid(xclass);
- },
- /**
- * From UIBase. Constructor(or get) view object to create ui elements.
- * @protected
- *
- */
- createDom: function() {
- var self = this,
- //el,
- view = self.get('view');
- view.create(undefined);
- //el = view.getKeyEventTarget();
- /*if (!self.get('allowTextSelection')) {
- //el.unselectable(undefined);
- }*/
- },
-
- /**
- * From UIBase. Call view object to render ui elements.
- * @protected
- *
- */
- renderUI: function() {
- var self = this,
- loader = self.get('loader');
- self.get('view').render();
- self._initChildren();
- if (loader) {
- self.setInternal('loader', loader);
- }
- /**/
-
- },
- _initChildren: function(children) {
- var self = this,
- i,
- children,
- child;
- // then render my children
- children = children || self.get('children').concat();
- self.get('children').length = 0;
- for (i = 0; i < children.length; i++) {
- child = self.addChild(children[i]);
- child.render();
- }
- },
- /**
- * bind ui for box
- * @private
- */
- bindUI: function() {
- var self = this,
- events = self.get('events');
- this.on('afterVisibleChange', function(e) {
- this.fire(e.newVal ? 'show' : 'hide');
- });
- //处理控件事件,设置事件是否冒泡
- BUI.each(events, function(v, k) {
- self.publish(k, {
- bubbles: v
- });
- });
- },
- /**
- * 控件是否包含指定的DOM元素,包括根节点
- *
- * var control = new Control();
- * $(document).on('click',function(ev){
- * var target = ev.target;
- *
- * if(!control.containsElement(elem)){ //未点击在控件内部
- * control.hide();
- * }
- * });
- *
- * @param {HTMLElement} elem DOM 元素
- * @return {Boolean} 是否包含
- */
- containsElement: function(elem) {
- var _self = this,
- el = _self.get('el'),
- children = _self.get('children'),
- result = false;
- if (!_self.get('rendered')) {
- return false;
- }
- if ($.contains(el[0], elem) || el[0] === elem) {
- result = true;
- } else {
- BUI.each(children, function(item) {
- if (item.containsElement(elem)) {
- result = true;
- return false;
- }
- });
- }
- return result;
- },
- /**
- * 是否是子控件的DOM元素
- * @protected
- * @return {Boolean} 是否子控件的DOM元素
- */
- isChildrenElement: function(elem) {
- var _self = this,
- children = _self.get('children'),
- rst = false;
- BUI.each(children, function(child) {
- if (child.containsElement(elem)) {
- rst = true;
- return false;
- }
- });
- return rst;
- },
- /**
- * 显示控件
- */
- show: function() {
- var self = this;
- self.render();
- self.set('visible', true);
- return self;
- },
-
- /**
- * 隐藏控件
- */
- hide: function() {
- var self = this;
- self.set('visible', false);
- return self;
- },
- /**
- * 交替显示或者隐藏
- *
- * control.show(); //显示
- * control.toggle(); //隐藏
- * control.toggle(); //显示
- *
- */
- toggle: function() {
- this.set('visible', !this.get('visible'));
- return this;
- },
- _uiSetFocusable: function(focusable) {
- var self = this,
- t,
- el = self.getKeyEventTarget();
- if (focusable) {
- el.attr('tabIndex', 0)
- // remove smart outline in ie
- // set outline in style for other standard browser
- .attr('hideFocus', true)
- .on('focus', wrapBehavior(self, 'handleFocus'))
- .on('blur', wrapBehavior(self, 'handleBlur'))
- .on('keydown', wrapBehavior(self, 'handleKeydown'))
- .on('keyup', wrapBehavior(self, 'handleKeyUp'));
- } else {
- el.removeAttr('tabIndex');
- if (t = getWrapBehavior(self, 'handleFocus')) {
- el.off('focus', t);
- }
- if (t = getWrapBehavior(self, 'handleBlur')) {
- el.off('blur', t);
- }
- if (t = getWrapBehavior(self, 'handleKeydown')) {
- el.off('keydown', t);
- }
- if (t = getWrapBehavior(self, 'handleKeyUp')) {
- el.off('keyup', t);
- }
- }
- },
-
- _uiSetHandleMouseEvents: function(handleMouseEvents) {
- var self = this,
- el = self.get('el'),
- t;
- if (handleMouseEvents) {
- el.on('mouseenter', wrapBehavior(self, 'handleMouseEnter'))
- .on('mouseleave', wrapBehavior(self, 'handleMouseLeave'))
- .on('contextmenu', wrapBehavior(self, 'handleContextMenu'))
- .on('mousedown', wrapBehavior(self, 'handleMouseDown'))
- .on('mouseup', wrapBehavior(self, 'handleMouseUp'))
- .on('dblclick', wrapBehavior(self, 'handleDblClick'));
- } else {
- t = getWrapBehavior(self, 'handleMouseEnter') &&
- el.off('mouseenter', t);
- t = getWrapBehavior(self, 'handleMouseLeave') &&
- el.off('mouseleave', t);
- t = getWrapBehavior(self, 'handleContextMenu') &&
- el.off('contextmenu', t);
- t = getWrapBehavior(self, 'handleMouseDown') &&
- el.off('mousedown', t);
- t = getWrapBehavior(self, 'handleMouseUp') &&
- el.off('mouseup', t);
- t = getWrapBehavior(self, 'handleDblClick') &&
- el.off('dblclick', t);
- }
- },
-
- _uiSetFocused: function(v) {
- if (v) {
- this.getKeyEventTarget()[0].focus();
- }
- },
- //当使用visiblity显示隐藏时,隐藏时把DOM移除出视图内,显示时回复原位置
- _uiSetVisible: function(isVisible) {
- var self = this,
- el = self.get('el'),
- visibleMode = self.get('visibleMode');
- if (visibleMode === 'visibility') {
- if (isVisible) {
- var position = self.get('cachePosition');
- if (position) {
- self.set('xy', position);
- }
- }
- if (!isVisible) {
- var position = [
- self.get('x'), self.get('y')
- ];
- self.set('cachePosition', position);
- self.set('xy', [-999, -999]);
- }
- }
- },
- //设置children时
- _uiSetChildren: function(v) {
- var self = this,
- children = BUI.cloneObject(v);
- //self.removeChildren(true);
- self._initChildren(children);
- },
- /**
- * 使控件可用
- */
- enable: function() {
- this.set('disabled', false);
- return this;
- },
- /**
- * 使控件不可用,控件不可用时,点击等事件不会触发
- *
- * control.disable(); //禁用
- * control.enable(); //解除禁用
- *
- */
- disable: function() {
- this.set('disabled', true);
- return this;
- },
- /**
- * 控件获取焦点
- */
- focus: function() {
- if (this.get('focusable')) {
- this.set('focused', true);
- }
- },
- /**
- * 子组件将要渲染到的节点,在 render 类上覆盖对应方法
- * @protected
- * @ignore
- */
- getContentElement: function() {
- return this.get('view').getContentElement();
- },
-
- /**
- * 焦点所在元素即键盘事件处理元素,在 render 类上覆盖对应方法
- * @protected
- * @ignore
- */
- getKeyEventTarget: function() {
- return this.get('view').getKeyEventTarget();
- },
-
- /**
- * 添加控件的子控件,索引值为 0-based
- *
- * control.add(new Control());//添加controller对象
- * control.add({xclass : 'a'});//添加xclass 为a 的一个对象
- * control.add({xclass : 'b'},2);//插入到第三个位置
- *
- * @param {BUI.Component.Controller|Object} c 子控件的实例或者配置项
- * @param {String} [c.xclass] 如果c为配置项,设置c的xclass
- * @param {Number} [index] 0-based 如果未指定索引值,则插在控件的最后
- */
- addChild: function(c, index) {
- var self = this,
- children = self.get('children'),
- renderBefore;
- if (index === undefined) {
- index = children.length;
- }
- /**
- * 添加子控件前触发
- * @event beforeAddChild
- * @param {Object} e
- * @param {Object} e.child 添加子控件时传入的配置项或者子控件
- * @param {Number} e.index 添加的位置
- */
- self.fire('beforeAddChild', {
- child: c,
- index: index
- });
- renderBefore = children[index] && children[index].get('el') || null;
- c = initChild(self, c, renderBefore);
- children.splice(index, 0, c);
- // 先 create 占位 再 render
- // 防止 render 逻辑里读 parent.get('children') 不同步
- // 如果 parent 已经渲染好了子组件也要立即渲染,就 创建 dom ,绑定事件
- if (self.get('rendered')) {
- c.render();
- }
-
- /**
- * 添加子控件后触发
- * @event afterAddChild
- * @param {Object} e
- * @param {Object} e.child 添加子控件
- * @param {Number} e.index 添加的位置
- */
- self.fire('afterAddChild', {
- child: c,
- index: index
- });
- return c;
- },
- /**
- * 将自己从父控件中移除
- *
- * control.remove(); //将控件从父控件中移除,并未删除
- * parent.addChild(control); //还可以添加回父控件
- *
- * control.remove(true); //从控件中移除并调用控件的析构函数
- *
- * @param {Boolean} destroy 是否删除DON节点
- * @return {BUI.Component.Controller} 删除的子对象.
- */
- remove: function(destroy) {
- var self = this,
- parent = self.get('parent');
- if (parent) {
- parent.removeChild(self, destroy);
- } else if (destroy) {
- self.destroy();
- }
- return self;
- },
- /**
- * 移除子控件,并返回移除的控件
- *
- * ** 如果 destroy=true,调用移除控件的 {@link BUI.Component.UIBase#destroy} 方法,
- * 同时删除对应的DOM **
- *
- * var child = control.getChild(id);
- * control.removeChild(child); //仅仅移除
- *
- * control.removeChild(child,true); //移除,并调用析构函数
- *
- * @param {BUI.Component.Controller} c 要移除的子控件.
- * @param {Boolean} [destroy=false] 如果是true,
- * 调用控件的方法 {@link BUI.Component.UIBase#destroy} .
- * @return {BUI.Component.Controller} 移除的子控件.
- */
- removeChild: function(c, destroy) {
- var self = this,
- children = self.get('children'),
- index = BUI.Array.indexOf(c, children);
-
- if (index === -1) {
- return;
- }
- /**
- * 删除子控件前触发
- * @event beforeRemoveChild
- * @param {Object} e
- * @param {Object} e.child 子控件
- * @param {Boolean} e.destroy 是否清除DOM
- */
- self.fire('beforeRemoveChild', {
- child: c,
- destroy: destroy
- });
-
- if (index !== -1) {
- children.splice(index, 1);
- }
- if (destroy &&
- // c is still json
- c.destroy) {
- c.destroy();
- }
- /**
- * 删除子控件前触发
- * @event afterRemoveChild
- * @param {Object} e
- * @param {Object} e.child 子控件
- * @param {Boolean} e.destroy 是否清除DOM
- */
- self.fire('afterRemoveChild', {
- child: c,
- destroy: destroy
- });
-
- return c;
- },
-
- /**
- * 删除当前控件的子控件
- *
- * control.removeChildren();//删除所有子控件
- * control.removeChildren(true);//删除所有子控件,并调用子控件的析构函数
- *
- * @see Component.Controller#removeChild
- * @param {Boolean} [destroy] 如果设置 true,
- * 调用子控件的 {@link BUI.Component.UIBase#destroy}方法.
- */
- removeChildren: function(destroy) {
- var self = this,
- i,
- t = [].concat(self.get('children'));
- for (i = 0; i < t.length; i++) {
- self.removeChild(t[i], destroy);
- }
- },
-
- /**
- * 根据索引获取子控件
- *
- * control.getChildAt(0);//获取第一个子控件
- * control.getChildAt(2); //获取第三个子控件
- *
- * @param {Number} index 0-based 索引值.
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChildAt: function(index) {
- var children = this.get('children');
- return children[index] || null;
- },
- /**
- * 根据Id获取子控件
- *
- * control.getChild('id'); //从控件的直接子控件中查找
- * control.getChild('id',true);//递归查找所有子控件,包含子控件的子控件
- *
- * @param {String} id 控件编号
- * @param {Boolean} deep 是否继续查找在子控件中查找
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChild: function(id, deep) {
- return this.getChildBy(function(item) {
- return item.get('id') === id;
- }, deep);
- },
- /**
- * 通过匹配函数查找子控件,返回第一个匹配的对象
- *
- * control.getChildBy(function(child){//从控件的直接子控件中查找
- * return child.get('id') = '1243';
- * });
- *
- * control.getChild(function(child){//递归查找所有子控件,包含子控件的子控件
- * return child.get('id') = '1243';
- * },true);
- *
- * @param {Function} math 查找的匹配函数
- * @param {Boolean} deep 是否继续查找在子控件中查找
- * @return {BUI.Component.Controller} 子控件或者null
- */
- getChildBy: function(math, deep) {
- return this.getChildrenBy(math, deep)[0] || null;
- },
- /**
- * 获取控件的附加高度 = control.get('el').outerHeight() - control.get('el').height()
- * @protected
- * @return {Number} 附加宽度
- */
- getAppendHeight: function() {
- var el = this.get('el');
- return el.outerHeight() - el.height();
- },
- /**
- * 获取控件的附加宽度 = control.get('el').outerWidth() - control.get('el').width()
- * @protected
- * @return {Number} 附加宽度
- */
- getAppendWidth: function() {
- var el = this.get('el');
- return el.outerWidth() - el.width();
- },
- /**
- * 查找符合条件的子控件
- *
- * control.getChildrenBy(function(child){//从控件的直接子控件中查找
- * return child.get('type') = '1';
- * });
- *
- * control.getChildrenBy(function(child){//递归查找所有子控件,包含子控件的子控件
- * return child.get('type') = '1';
- * },true);
- *
- * @param {Function} math 查找的匹配函数
- * @param {Boolean} deep 是否继续查找在子控件中查找,如果符合上面的匹配函数,则不再往下查找
- * @return {BUI.Component.Controller[]} 子控件数组
- */
- getChildrenBy: function(math, deep) {
- var self = this,
- results = [];
- if (!math) {
- return results;
- }
-
- self.eachChild(function(child) {
- if (math(child)) {
- results.push(child);
- } else if (deep) {
-
- results = results.concat(child.getChildrenBy(math, deep));
- }
- });
- return results;
- },
- /**
- * 遍历子元素
- *
- * control.eachChild(function(child,index){ //遍历子控件
- *
- * });
- *
- * @param {Function} func 迭代函数,函数原型function(child,index)
- */
- eachChild: function(func) {
- BUI.each(this.get('children'), func);
- },
- /**
- * Handle dblclick events. By default, this performs its associated action by calling
- * {@link BUI.Component.Controller#performActionInternal}.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleDblClick: function(ev) {
- this.performActionInternal(ev);
- if (!this.isChildrenElement(ev.target)) {
- this.fire('dblclick', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Called by it's container component to dispatch mouseenter event.
- * @private
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseOver: function(ev) {
- var self = this,
- el = self.get('el');
- if (!isMouseEventWithinElement(ev, el)) {
- self.handleMouseEnter(ev);
-
- }
- },
-
- /**
- * Called by it's container component to dispatch mouseleave event.
- * @private
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseOut: function(ev) {
- var self = this,
- el = self.get('el');
- if (!isMouseEventWithinElement(ev, el)) {
- self.handleMouseLeave(ev);
-
- }
- },
-
- /**
- * Handle mouseenter events. If the component is not disabled, highlights it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseEnter: function(ev) {
- var self = this;
- this.set('highlighted', !!ev);
- self.fire('mouseenter', {
- domTarget: ev.target,
- domEvent: ev
- });
- },
-
- /**
- * Handle mouseleave events. If the component is not disabled, de-highlights it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseLeave: function(ev) {
- var self = this;
- self.set('active', false);
- self.set('highlighted', !ev);
- self.fire('mouseleave', {
- domTarget: ev.target,
- domEvent: ev
- });
- },
-
- /**
- * Handles mousedown events. If the component is not disabled,
- * If the component is activeable, then activate it.
- * If the component is focusable, then focus it,
- * else prevent it from receiving keyboard focus.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseDown: function(ev) {
- var self = this,
- n,
- target = $(ev.target),
- isMouseActionButton = ev['which'] === 1,
- el;
- if (isMouseActionButton) {
- el = self.getKeyEventTarget();
- if (self.get('activeable')) {
- self.set('active', true);
- }
- if (self.get('focusable')) {
- //如果不是input,select,area等可以获取焦点的控件,那么设置此控件的focus
- /*if(target[0] == el[0] || (!target.is('input,select,area') && !target.attr('tabindex'))){
- el[0].focus();
-
- }*/
- self.setInternal('focused', true);
- }
-
- if (!self.get('allowTextSelection')) {
- // firefox /chrome 不会引起焦点转移
- n = ev.target.nodeName;
- n = n && n.toLowerCase();
- // do not prevent focus when click on editable element
- if (n !== 'input' && n !== 'textarea') {
- ev.preventDefault();
- }
- }
- if (!self.isChildrenElement(ev.target)) {
- self.fire('mousedown', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
-
- }
- },
-
- /**
- * Handles mouseup events.
- * If this component is not disabled, performs its associated action by calling
- * {@link BUI.Component.Controller#performActionInternal}, then deactivates it.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleMouseUp: function(ev) {
- var self = this,
- isChildrenElement = self.isChildrenElement(ev.target);
- // 左键
- if (self.get('active') && ev.which === 1) {
- self.performActionInternal(ev);
- self.set('active', false);
- if (!isChildrenElement) {
- self.fire('click', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- }
- if (!isChildrenElement) {
- self.fire('mouseup', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Handles context menu.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleContextMenu: function(ev) {},
-
- /**
- * Handles focus events. Style focused class.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleFocus: function(ev) {
- this.set('focused', !!ev);
- this.fire('focus', {
- domEvent: ev,
- domTarget: ev.target
- });
- },
-
- /**
- * Handles blur events. Remove focused class.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleBlur: function(ev) {
- this.set('focused', !ev);
- this.fire('blur', {
- domEvent: ev,
- domTarget: ev.target
- });
- },
-
- /**
- * Handle enter keydown event to {@link BUI.Component.Controller#performActionInternal}.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleKeyEventInternal: function(ev) {
- var self = this,
- isChildrenElement = self.isChildrenElement(ev.target);
- if (ev.which === 13) {
- if (!isChildrenElement) {
- self.fire('click', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
-
- return this.performActionInternal(ev);
- }
- if (!isChildrenElement) {
- self.fire('keydown', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
-
- /**
- * Handle keydown events.
- * If the component is not disabled, call {@link BUI.Component.Controller#handleKeyEventInternal}
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- handleKeydown: function(ev) {
- var self = this;
- if (self.handleKeyEventInternal(ev)) {
- ev.halt();
- return true;
- }
- },
- handleKeyUp: function(ev) {
- var self = this;
- if (!self.isChildrenElement(ev.target)) {
- self.fire('keyup', {
- domTarget: ev.target,
- domEvent: ev
- });
- }
- },
- /**
- * Performs the appropriate action when this component is activated by the user.
- * @protected
- * @param {jQuery.Event} ev DOM event to handle.
- */
- performActionInternal: function(ev) {},
- /**
- * 析构函数
- * @protected
- */
- destructor: function() {
- var self = this,
- id,
- i,
- view,
- children = self.get('children');
- id = self.get('id');
- for (i = 0; i < children.length; i++) {
- children[i].destroy && children[i].destroy();
- }
- self.get('view').destroy();
- Manager.removeComponent(id);
- },
- //覆写set方法
- set: function(name, value, opt) {
- var _self = this,
- view = _self.__view,
- attr = _self.__attrs[name],
- ucName,
- ev,
- m;
- if (BUI.isObject(name)) {
- opt = value;
- BUI.each(name, function(v, k) {
- _self.set(k, v, opt);
- });
- }
- if (!view || !attr || (opt && opt.silent)) { //未初始化view或者没用定义属性
- Controller.superclass.set.call(this, name, value, opt);
- return _self;
- }
-
- var prevVal = Controller.superclass.get.call(this, name);
-
- //如果未改变值不进行修改
- if (!$.isPlainObject(value) && !BUI.isArray(value) && prevVal === value) {
- return _self;
- }
- ucName = BUI.ucfirst(name);
- m = '_uiSet' + ucName;
- //触发before事件
- _self.fire('before' + ucName + 'Change', {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- });
-
- _self.setInternal(name, value);
-
- value = _self.__attrVals[name];
- if (view && attr.view) {
- view.set(name, value);
- //return _self;
- }
- ev = {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- };
-
- //触发before事件
- _self.fire('after' + ucName + 'Change', ev);
- if (_self.get('binded') && _self[m]) {
- _self[m](value, ev);
- }
- return _self;
- },
- //覆写get方法,改变时同时改变view的值
- get: function(name) {
- var _self = this,
- view = _self.__view,
- attr = _self.__attrs[name],
- value = Controller.superclass.get.call(this, name);
- if (value !== undefined) {
- return value;
- }
- if (view && attr && attr.view) {
- return view.get(name);
- }
-
- return value;
- }
-}, {
- ATTRS: {
- /**
- * 控件的Html 内容
- *
- * new Control({
- * content : '内容',
- * render : '#c1'
- * });
- *
- * @cfg {String|jQuery} content
- */
- /**
- * 控件的Html 内容
- * @type {String|jQuery}
- */
- content: {
- view: 1
- },
- /**
- * 控件根节点使用的标签
- *
- * new Control({
- * elTagName : 'ul',
- * content : '内容 ', //控件的DOM <ul><li>内容</li></ul>
- * render : '#c1'
- * });
- *
- * @cfg {String} elTagName
- */
- elTagName: {
- // 生成标签名字
- view: true,
- value: 'div'
- },
- /**
- * 子元素的默认 xclass,配置child的时候没必要每次都填写xclass
- * @type {String}
- */
- defaultChildClass: {
-
- },
- /**
- * 如果控件未设置 xclass,同时父元素设置了 defaultChildClass,那么
- * xclass = defaultChildClass + '-' + xtype
- *
- * A.ATTRS = {
- * defaultChildClass : {
- * value : 'b'
- * }
- * }
- * //类B 的xclass = 'b'类 B1的xclass = 'b-1',类 B2的xclass = 'b-2',那么
- * var a = new A({
- * children : [
- * {content : 'b'}, //B类
- * {content : 'b1',xtype:'1'}, //B1类
- * {content : 'b2',xtype:'2'}, //B2类
- * ]
- * });
- *
- * @type {String}
- */
- xtype: {
-
- },
- /**
- * 标示控件的唯一编号,默认会自动生成
- * @cfg {String} id
- */
- /**
- * 标示控件的唯一编号,默认会自动生成
- * @type {String}
- */
- id: {
- view: true
- },
- /**
- * 控件宽度
- *
- * new Control({
- * width : 200 // 200,'200px','20%'
- * });
- *
- * @cfg {Number|String} width
- */
- /**
- * 控件宽度
- *
- * control.set('width',200);
- * control.set('width','200px');
- * control.set('width','20%');
- *
- * @type {Number|String}
- */
- width: {
- view: 1
- },
- /**
- * 控件宽度
- *
- * new Control({
- * height : 200 // 200,'200px','20%'
- * });
- *
- * @cfg {Number|String} height
- */
- /**
- * 控件宽度
- *
- * control.set('height',200);
- * control.set('height','200px');
- * control.set('height','20%');
- *
- * @type {Number|String}
- */
- height: {
- view: 1
- },
- /**
- * 控件根节点应用的样式
- *
- * new Control({
- * elCls : 'test',
- * content : '内容',
- * render : '#t1' //<div id='t1'><div class="test">内容</div></div>
- * });
- *
- * @cfg {String} elCls
- */
- /**
- * 控件根节点应用的样式 css class
- * @type {String}
- */
- elCls: {
- view: 1
- },
- /**
- * @cfg {Object} elStyle
- * 控件根节点应用的css属性
- *
- * var cfg = {elStyle : {width:'100px', height:'200px'}};
- *
- */
- /**
- * 控件根节点应用的css属性,以键值对形式
- * @type {Object}
- *
- * control.set('elStyle', {
- * width:'100px',
- * height:'200px'
- * });
- *
- */
- elStyle: {
- view: 1
- },
- /**
- * @cfg {Object} elAttrs
- * 控件根节点应用的属性,以键值对形式:
- *
- * new Control({
- * elAttrs :{title : 'tips'}
- * });
- *
- */
- /**
- * @type {Object}
- * 控件根节点应用的属性,以键值对形式:
- * { title : 'tips'}
- * @ignore
- */
- elAttrs: {
- view: 1
- },
- /**
- * 将控件插入到指定元素前
- *
- * new Control({
- * elBefore : '#t1'
- * });
- *
- * @cfg {jQuery} elBefore
- */
- /**
- * 将控件插入到指定元素前
- * @type {jQuery}
- * @ignore
- */
- elBefore: {
- // better named to renderBefore, too late !
- view: 1
- },
-
- /**
- * 只读属性,根节点DOM
- * @type {jQuery}
- */
- el: {
- view: 1
- },
- /**
- * 控件支持的事件
- * @type {Object}
- * @protected
- */
- events: {
- value: {
- /**
- * 点击事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'click': true,
- /**
- * 双击事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'dblclick': true,
- /**
- * 鼠标移入控件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseenter': true,
- /**
- * 鼠标移出控件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseleave': true,
- /**
- * 键盘按下按键事件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'keydown': true,
- /**
- * 键盘按键抬起控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'keyup': true,
- /**
- * 控件获取焦点事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'focus': false,
- /**
- * 控件丢失焦点事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'blur': false,
- /**
- * 鼠标按下控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mousedown': true,
- /**
- * 鼠标抬起控件,此事件会冒泡,所以可以在父元素上监听所有子元素的此事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.Controller} e.target 触发事件的对象
- * @param {jQuery.Event} e.domEvent DOM触发的事件
- * @param {HTMLElement} e.domTarget 触发事件的DOM节点
- */
- 'mouseup': true,
- /**
- * 控件显示
- * @event
- */
- 'show': false,
- /**
- * 控件隐藏
- * @event
- */
- 'hide': false
- }
- },
- /**
- * 指定控件的容器
- *
- * new Control({
- * render : '#t1',
- * elCls : 'test',
- * content : '123' //<div id="t1"><div class="test bui-xclass"><span>123</span></div></div>
- * });
- *
- * @cfg {jQuery} render
- */
- /**
- * 指定控件的容器
- * @type {jQuery}
- * @ignore
- */
- render: {
- view: 1
- },
- /**
- * ARIA 标准中的role,不要更改此属性
- * @type {String}
- * @protected
- */
- role: {
- view: 1
- },
- /**
- * 状态相关的样式,默认情况下会使用 前缀名 + xclass + '-' + 状态名
- *
- * new Control({
- * visibleMode: 'visibility'
- * });
- *
- * @cfg {String} [visibleMode = 'display']
- */
- /**
- * 控件的可视方式,使用 css
- * - 'display' 或者
- * - 'visibility'
- *
- * control.set('visibleMode','display')
- *
- * @type {String}
- */
- visibleMode: {
- view: 1,
- value: 'display'
- },
- /**
- * 控件是否可见
- *
- * new Control({
- * visible : false //隐藏
- * });
- *
- * @cfg {Boolean} [visible = true]
- */
- /**
- * 控件是否可见
- *
- * control.set('visible',true); //control.show();
- * control.set('visible',false); //control.hide();
- *
- * @type {Boolean}
- * @default true
- */
- visible: {
- value: true,
- view: 1
- },
- /**
- * 是否允许处理鼠标事件
- * @default true.
- * @type {Boolean}
- * @protected
- */
- handleMouseEvents: {
- value: true
- },
-
- /**
- * 控件是否可以获取焦点
- * @default true.
- * @protected
- * @type {Boolean}
- */
- focusable: {
- value: false,
- view: 1
- },
- /**
- * 一旦使用loader的默认配置
- * @protected
- * @type {Object}
- */
- defaultLoaderCfg: {
- value: {
- property: 'content',
- autoLoad: true
- }
- },
- /**
- * 控件内容的加载器
- * @type {BUI.Component.Loader}
- */
- loader: {
- getter: function(v) {
- var _self = this,
- defaultCfg;
- if (v && !v.isLoader) {
- v.target = _self;
- defaultCfg = _self.get('defaultLoaderCfg')
- v = new Loader(BUI.merge(defaultCfg, v));
- _self.setInternal('loader', v);
- }
- return v;
- }
- },
- /**
- * 1. Whether allow select this component's text.
- * control.set('disabled',true); //== control.disable();
- * control.set('disabled',false); //== control.enable();
- *
- * @type {Boolean}
- * @default false
- */
- disabled: {
- view: 1,
- value: false
- },
- /**
- * 渲染控件的View类.
- * @protected
- * @cfg {BUI.Component.View} [xview = BUI.Component.View]
- */
- /**
- * 渲染控件的View类.
- * @protected
- * @type {BUI.Component.View}
- */
- xview: {
- value: View
- }
- },
- PARSER: {
- visible: function(el) {
- var _self = this,
- display = el.css('display'),
-
- visibility = el.css('visibility'),
- visibleMode = _self.get('visibleMode');
- if ((display == 'none' && visibleMode == 'display') || (visibility == 'hidden' && visibleMode == 'visibility')) {
- return false;
- }
- return true;
- },
- disabled: function(el){
- var _self = this,
- cls = _self.get('prefixCls') + _self.get('xclass') + '-disabled';
- return el.hasClass(cls);
- }
- }
-}, {
- xclass: 'controller',
- priority: 0
-});
-module.exports = Controller;
diff --git a/spm_modules/bui-common/1.1.2/src/component/loader.js b/spm_modules/bui-common/1.1.2/src/component/loader.js
deleted file mode 100644
index 4627407..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/loader.js
+++ /dev/null
@@ -1,435 +0,0 @@
-/**
- * @fileOverview 加载控件内容
- * @ignore
- */
-
-'use strict';
-var $ = require('jquery'),
- BUI = require('../util'),
- Base = require('../base'),
- /**
- * @class BUI.Component.Loader
- * @extends BUI.Base
- * ** 控件的默认Loader属性是:**
- *
- *
- * defaultLoader : {
- * value : {
- * property : 'content',
- * autoLoad : true
- * }
- * }
- *
- * ** 一般的控件默认读取html,作为控件的content值 **
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json'
- * }
- * });
- *
- * control.render();
- *
- *
- * ** 可以修改Loader的默认属性,加载children **
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/children.json',
- * property : 'children',
- * dataType : 'json'
- * }
- * });
- *
- * control.render();
- *
- * 加载控件内容的类,一般不进行实例化
- */
- Loader = function(config) {
- Loader.superclass.constructor.call(this, config);
- this._init();
- };
-
-Loader.ATTRS = {
-
- /**
- * 加载内容的地址
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} url
- */
- url: {
-
- },
- /**
- * 对应的控件,加载完成后设置属性到对应的控件
- * @readOnly
- * @type {BUI.Component.Controller}
- */
- target: {
-
- },
- /**
- * @private
- * 是否load 过
- */
- hasLoad: {
- value: false
- },
- /**
- * 是否自动加载数据
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * autoLoad : false
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Boolean} [autoLoad = true]
- */
- autoLoad: {
-
- },
- /**
- * 延迟加载
- *
- * - event : 触发加载的事件
- * - repeat :是否重复加载
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * lazyLoad : {
- * event : 'show',
- * repeat : true
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Object} [lazyLoad = null]
- */
- lazyLoad: {
-
- },
- /**
- * 加载返回的数据作为控件的那个属性
- *
- * var control = new BUI.List.SimpleList({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * dataType : 'json',
- * property : 'items'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} property
- */
- property: {
-
- },
- /**
- * 格式化返回的数据
- * @cfg {Function} renderer
- */
- renderer: {
- value: function(value) {
- return value;
- }
- },
- /**
- * 加载数据时是否显示屏蔽层和加载提示 {@link BUI.Mask.LoadMask}
- *
- * - loadMask : true时使用loadMask 默认的配置信息
- * - loadMask : {msg : '正在加载,请稍后。。'} LoadMask的配置信息
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * loadMask : true
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Boolean|Object} [loadMask = false]
- */
- loadMask: {
- value: false
- },
- /**
- * ajax 请求返回数据的类型
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * dataType : 'json',
- * property : 'items'
- * }
- * });
- *
- * control.render();
- *
- * @cfg {String} [dataType = 'text']
- */
- dataType: {
- value: 'text'
- },
- /**
- * Ajax请求的配置项,会覆盖 url,dataType数据
- * @cfg {Object} ajaxOptions
- */
- ajaxOptions: {
- //shared : false,
- value: {
- type: 'get',
- cache: false
- }
- },
- /**
- * 初始化的请求参数
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * params : {
- * a : 'a',
- * b : 'b'
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Object} params
- * @default null
- */
- params: {
-
- },
- /**
- * 附加参数,每次请求都带的参数
- * @cfg {Object} appendParams
- */
- appendParams: {
-
- },
- /**
- * 最后一次请求的参数
- * @readOnly
- * @private
- * @type {Object}
- */
- lastParams: {
- shared: false,
- value: {}
- },
- /**
- * 加载数据,并添加属性到控件后的回调函数
- * - data : 加载的数据
- * - params : 加载的参数
- *
- * var control = new BUI.Component.Controller({
- * render : '#c1',
- * loader : {
- * url : 'data/text.json',
- * callback : function(text){
- * var target = this.get('target');//control
- * //TO DO
- * }
- * }
- * });
- *
- * control.render();
- *
- * @cfg {Function} callback
- */
- callback: {
-
- },
- /**
- * 失败的回调函数
- * - response : 返回的错误对象
- * - params : 加载的参数
- * @cfg {Function} failure
- */
- failure: {
-
- }
-
-};
-
-BUI.extend(Loader, Base);
-
-BUI.augment(Loader, {
- /**
- * @protected
- * 是否是Loader
- * @type {Boolean}
- */
- isLoader: true,
- //初始化
- _init: function() {
- var _self = this,
- autoLoad = _self.get('autoLoad'),
- params = _self.get('params');
-
- _self._initMask();
- if (autoLoad) {
- _self.load(params);
- } else {
- _self._initParams();
- _self._initLazyLoad();
- }
- },
- //初始化延迟加载
- _initLazyLoad: function() {
- var _self = this,
- target = _self.get('target'),
- lazyLoad = _self.get('lazyLoad');
-
- if (target && lazyLoad && lazyLoad.event) {
- target.on(lazyLoad.event, function() {
- if (!_self.get('hasLoad') || lazyLoad.repeat) {
- _self.load();
- }
- });
- }
- },
- /**
- * 初始化mask
- * @private
- */
- _initMask: function() {
- var _self = this,
- target = _self.get('target'),
- loadMask = _self.get('loadMask');
- if (target && loadMask) {
- require.async('bui-mask/1.1.0/index', function(Mask) {
- var cfg = $.isPlainObject(loadMask) ? loadMask : {};
- loadMask = new Mask.LoadMask(BUI.mix({
- el: target.get('el')
- }, cfg));
- _self.set('loadMask', loadMask);
- });
- }
- },
- //初始化查询参数
- _initParams: function() {
- var _self = this,
- lastParams = _self.get('lastParams'),
- params = _self.get('params');
-
- //初始化 参数
- BUI.mix(lastParams, params);
- },
- /**
- * 加载内容
- * @param {Object} params 加载数据的参数
- */
- load: function(params) {
- var _self = this,
- url = _self.get('url'),
- ajaxOptions = _self.get('ajaxOptions'),
- lastParams = _self.get('lastParams'),
- appendParams = _self.get('appendParams');
-
- //BUI.mix(true,lastParams,appendParams,params);
- params = params || lastParams;
- params = BUI.merge(appendParams, params); //BUI.cloneObject(lastParams);
- _self.set('lastParams', params);
- //未提供加载地址,阻止加载
- if (!url) {
- return;
- }
-
- _self.onBeforeLoad();
- _self.set('hasLoad', true);
- $.ajax(BUI.mix({
- dataType: _self.get('dataType'),
- data: params,
- url: url,
- success: function(data) {
- _self.onload(data, params);
- },
- error: function(jqXHR, textStatus, errorThrown) {
- _self.onException({
- jqXHR: jqXHR,
- textStatus: textStatus,
- errorThrown: errorThrown
- }, params);
- }
- }, ajaxOptions));
- },
- /**
- * @private
- * 加载前
- */
- onBeforeLoad: function() {
- var _self = this,
- loadMask = _self.get('loadMask');
- if (loadMask && loadMask.show) {
- loadMask.show();
- }
- },
- /**
- * @private
- * 加载完毕
- */
- onload: function(data, params) {
- var _self = this,
- loadMask = _self.get('loadMask'),
- property = _self.get('property'),
- callback = _self.get('callback'),
- renderer = _self.get('renderer'),
- target = _self.get('target');
-
- if (BUI.isString(data)) {
- target.set(property, ''); //防止2次返回的数据一样
- }
- target.set(property, renderer.call(_self, data));
-
- /**/
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- if (callback) {
- callback.call(this, data, params);
- }
- },
- /**
- * @private
- * 加载出错
- */
- onException: function(response, params) {
- var _self = this,
- failure = _self.get('failure');
- if (failure) {
- failure.call(this, response, params);
- }
- }
-
-});
-module.exports = Loader;
diff --git a/spm_modules/bui-common/1.1.2/src/component/manage.js b/spm_modules/bui-common/1.1.2/src/component/manage.js
deleted file mode 100644
index 8531d46..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/manage.js
+++ /dev/null
@@ -1,143 +0,0 @@
-/**
- * @fileOverview Base UI控件的管理类
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-
-
-//控件类的管理器
-
-
-var $ = require('jquery');
-
-var uis = {
- // 不带前缀 prefixCls
- /*
- "menu" :{
- priority:0,
- constructor:Menu
- }
- */
-};
-
-function getConstructorByXClass(cls) {
- var cs = cls.split(/\s+/),
- p = -1,
- t,
- ui = null;
- for (var i = 0; i < cs.length; i++) {
- var uic = uis[cs[i]];
- if (uic && (t = uic.priority) > p) {
- p = t;
- ui = uic.constructor;
- }
- }
- return ui;
-}
-
-function getXClassByConstructor(constructor) {
- for (var u in uis) {
- var ui = uis[u];
- if (ui.constructor == constructor) {
- return u;
- }
- }
- return 0;
-}
-
-function setConstructorByXClass(cls, uic) {
- if (BUI.isFunction(uic)) {
- uis[cls] = {
- constructor: uic,
- priority: 0
- };
- } else {
- uic.priority = uic.priority || 0;
- uis[cls] = uic;
- }
-}
-
-
-function getCssClassWithPrefix(cls) {
- var cs = $.trim(cls).split(/\s+/);
- for (var i = 0; i < cs.length; i++) {
- if (cs[i]) {
- cs[i] = this.get('prefixCls') + cs[i];
- }
- }
- return cs.join(' ');
-}
-
-
-
-var componentInstances = {};
-
-/**
- * Manage component metadata.
- * @class BUI.Component.Manager
- * @singleton
- */
-var Manager = {
-
- __instances: componentInstances,
- /**
- * 每实例化一个控件,就注册到管理器上
- * @param {String} id 控件 id
- * @param {BUI.Component.Controller} component 控件对象
- */
- addComponent: function(id, component) {
- componentInstances[id] = component;
- },
- /**
- * 移除注册的控件
- * @param {String} id 控件 id
- */
- removeComponent: function(id) {
- delete componentInstances[id];
- },
- /**
- * 遍历所有的控件
- * @param {Function} fn 遍历函数
- */
- eachComponent: function(fn) {
- BUI.each(componentInstances, fn);
- },
- /**
- * 根据Id获取控件
- * @param {String} id 编号
- * @return {BUI.Component.UIBase} 继承 UIBase的类对象
- */
- getComponent: function(id) {
- return componentInstances[id];
- },
-
- getCssClassWithPrefix: getCssClassWithPrefix,
- /**
- * 通过构造函数获取xclass.
- * @param {Function} constructor 控件的构造函数.
- * @type {Function}
- * @return {String}
- * @method
- */
- getXClassByConstructor: getXClassByConstructor,
- /**
- * 通过xclass获取控件的构造函数
- * @param {String} classNames Class names separated by space.
- * @type {Function}
- * @return {Function}
- * @method
- */
- getConstructorByXClass: getConstructorByXClass,
- /**
- * 将 xclass 同构造函数相关联.
- * @type {Function}
- * @param {String} className 控件的xclass名称.
- * @param {Function} componentConstructor 构造函数
- * @method
- */
- setConstructorByXClass: setConstructorByXClass
-};
-
-module.exports = Manager;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/align.js b/spm_modules/bui-common/1.1.2/src/component/uibase/align.js
deleted file mode 100644
index 8667e5a..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/align.js
+++ /dev/null
@@ -1,482 +0,0 @@
-/**
- * @fileOverview 跟指定的元素项对齐的方式
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-
-var $ = require('jquery'),
- UA = require('../../ua'),
- CLS_ALIGN_PREFIX ='x-align-',
- win = window;
-
-// var ieMode = document.documentMode || UA.ie;
-
-/*
- inspired by closure library by Google
- see http://yiminghe.iteye.com/blog/1124720
- */
-
-/**
- * 得到会导致元素显示不全的祖先元素
- * @ignore
- */
-function getOffsetParent(element) {
- // ie 这个也不是完全可行
- /**
-
- @ignore
- **/
- // element.offsetParent does the right thing in ie7 and below. Return parent with layout!
- // In other browsers it only includes elements with position absolute, relative or
- // fixed, not elements with overflow set to auto or scroll.
- // if (UA.ie && ieMode < 8) {
- // return element.offsetParent;
- // }
- // 统一的 offsetParent 方法
- var doc = element.ownerDocument,
- body = doc.body,
- parent,
- positionStyle = $(element).css('position'),
- skipStatic = positionStyle == 'fixed' || positionStyle == 'absolute';
-
- if (!skipStatic) {
- return element.nodeName.toLowerCase() == 'html' ? null : element.parentNode;
- }
-
- for (parent = element.parentNode; parent && parent != body; parent = parent.parentNode) {
- positionStyle = $(parent).css('position');
- if (positionStyle != 'static') {
- return parent;
- }
- }
- return null;
-}
-
-/**
- * 获得元素的显示部分的区域
- * @private
- * @ignore
- */
-function getVisibleRectForElement(element) {
- var visibleRect = {
- left:0,
- right:Infinity,
- top:0,
- bottom:Infinity
- },
- el,
- scrollX,
- scrollY,
- winSize,
- doc = element.ownerDocument,
- body = doc.body,
- documentElement = doc.documentElement;
-
- // Determine the size of the visible rect by climbing the dom accounting for
- // all scrollable containers.
- for (el = element; el = getOffsetParent(el);) {
- // clientWidth is zero for inline block elements in ie.
- if ((!UA.ie || el.clientWidth != 0) &&
- // body may have overflow set on it, yet we still get the entire
- // viewport. In some browsers, el.offsetParent may be
- // document.documentElement, so check for that too.
- (el != body && el != documentElement && $(el).css('overflow') != 'visible')) {
- var pos = $(el).offset();
- // add border
- pos.left += el.clientLeft;
- pos.top += el.clientTop;
-
- visibleRect.top = Math.max(visibleRect.top, pos.top);
- visibleRect.right = Math.min(visibleRect.right,
- // consider area without scrollBar
- pos.left + el.clientWidth);
- visibleRect.bottom = Math.min(visibleRect.bottom,
- pos.top + el.clientHeight);
- visibleRect.left = Math.max(visibleRect.left, pos.left);
- }
- }
-
- // Clip by window's viewport.
- scrollX = $(win).scrollLeft();
- scrollY = $(win).scrollTop();
- visibleRect.left = Math.max(visibleRect.left, scrollX);
- visibleRect.top = Math.max(visibleRect.top, scrollY);
- winSize = {
- width:BUI.viewportWidth(),
- height:BUI.viewportHeight()
- };
- visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width);
- visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height);
- return visibleRect.top >= 0 && visibleRect.left >= 0 &&
- visibleRect.bottom > visibleRect.top &&
- visibleRect.right > visibleRect.left ?
- visibleRect : null;
-}
-
-function getElFuturePos(elRegion, refNodeRegion, points, offset) {
- var xy,
- diff,
- p1,
- p2;
-
- xy = {
- left:elRegion.left,
- top:elRegion.top
- };
-
- p1 = getAlignOffset(refNodeRegion, points[0]);
- p2 = getAlignOffset(elRegion, points[1]);
-
- diff = [p2.left - p1.left, p2.top - p1.top];
-
- return {
- left:xy.left - diff[0] + (+offset[0]),
- top:xy.top - diff[1] + (+offset[1])
- };
-}
-
-function isFailX(elFuturePos, elRegion, visibleRect) {
- return elFuturePos.left < visibleRect.left ||
- elFuturePos.left + elRegion.width > visibleRect.right;
-}
-
-function isFailY(elFuturePos, elRegion, visibleRect) {
- return elFuturePos.top < visibleRect.top ||
- elFuturePos.top + elRegion.height > visibleRect.bottom;
-}
-
-function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
- var pos = BUI.cloneObject(elFuturePos),
- size = {
- width:elRegion.width,
- height:elRegion.height
- };
-
- if (overflow.adjustX && pos.left < visibleRect.left) {
- pos.left = visibleRect.left;
- }
-
- // Left edge inside and right edge outside viewport, try to resize it.
- if (overflow['resizeWidth'] &&
- pos.left >= visibleRect.left &&
- pos.left + size.width > visibleRect.right) {
- size.width -= (pos.left + size.width) - visibleRect.right;
- }
-
- // Right edge outside viewport, try to move it.
- if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
- // 保证左边界和可视区域左边界对齐
- pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
- }
-
- // Top edge outside viewport, try to move it.
- if (overflow.adjustY && pos.top < visibleRect.top) {
- pos.top = visibleRect.top;
- }
-
- // Top edge inside and bottom edge outside viewport, try to resize it.
- if (overflow['resizeHeight'] &&
- pos.top >= visibleRect.top &&
- pos.top + size.height > visibleRect.bottom) {
- size.height -= (pos.top + size.height) - visibleRect.bottom;
- }
-
- // Bottom edge outside viewport, try to move it.
- if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
- // 保证上边界和可视区域上边界对齐
- pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
- }
-
- return BUI.mix(pos, size);
-}
-
-
-function flip(points, reg, map) {
- var ret = [];
- $.each(points, function (index,p) {
- ret.push(p.replace(reg, function (m) {
- return map[m];
- }));
- });
- return ret;
-}
-
-function flipOffset(offset, index) {
- offset[index] = -offset[index];
- return offset;
-}
-
-
-/**
- * @class BUI.Component.UIBase.Align
- * Align extension class.
- * Align component with specified element.
- *
- * var overlay = new Overlay( {
- * align :{
- * node: null, // 参考元素, falsy 或 window 为可视区域, 'trigger' 为触发元素, 其他为指定元素
- * points: ['cc','cc'], // ['tr', 'tl'] 表示 overlay 的 tl 与参考节点的 tr 对齐
- * offset: [0, 0] // 有效值为 [n, m]
- * }
- * });
- *
- */
-
- /**
- * 设置对齐属性
- * @type {Object}
- * @field
- *
- * var align = {
- * node: null, // 参考元素, falsy 或 window 为可视区域, 'trigger' 为触发元素, 其他为指定元素
- * points: ['cc','cc'], // ['tr', 'tl'] 表示 overlay 的 tl 与参考节点的 tr 对齐
- * offset: [0, 0] // 有效值为 [n, m]
- * };
- * overlay.set('align',align);
- *
- */
- align:{
- shared : false,
- value:{}
- }
-};
-
-function getRegion(node) {
- var offset, w, h;
- if (node.length && !$.isWindow(node[0])) {
- offset = node.offset();
- w = node.outerWidth();
- h = node.outerHeight();
- } else {
- offset = { left:BUI.scrollLeft(), top:BUI.scrollTop() };
- w = BUI.viewportWidth();
- h = BUI.viewportHeight();
- }
- offset.width = w;
- offset.height = h;
- return offset;
-}
-
-/**
- * 获取 node 上的 align 对齐点 相对于页面的坐标
- * @param region
- * @param align
- */
-function getAlignOffset(region, align) {
- var V = align.charAt(0),
- H = align.charAt(1),
- w = region.width,
- h = region.height,
- x, y;
-
- x = region.left;
- y = region.top;
-
- if (V === 'c') {
- y += h / 2;
- } else if (V === 'b') {
- y += h;
- }
-
- if (H === 'c') {
- x += w / 2;
- } else if (H === 'r') {
- x += w;
- }
-
- return { left:x, top:y };
-}
-
-//清除对齐的css样式
-function clearAlignCls(el){
- var cls = el.attr('class'),
- regex = new RegExp('\s?'+CLS_ALIGN_PREFIX+'[a-z]{2}-[a-z]{2}','ig'),
- arr = regex.exec(cls);
- if(arr){
- el.removeClass(arr.join(' '));
- }
-}
-
-Align.prototype =
-{
- _uiSetAlign:function (v,ev) {
- var alignCls = '',
- el,
- selfAlign; //points 的第二个参数,是自己对齐于其他节点的的方式
- if (v && v.points) {
- this.align(v.node, v.points, v.offset, v.overflow);
- this.set('cachePosition',null);
- el = this.get('el');
- clearAlignCls(el);
- selfAlign = v.points.join('-');
- alignCls = CLS_ALIGN_PREFIX + selfAlign;
- el.addClass(alignCls);
- /**/
- }
- },
- __bindUI : function(){
- var _self = this;
-
- var fn = BUI.wrapBehavior(_self,'handleWindowResize');
-
- _self.on('show',function(){
- $(window).on('resize',fn);
- });
-
- _self.on('hide',function(){
- $(window).off('resize',fn);
- });
- },
- //处理window resize事件
- handleWindowResize : function(){
- var _self = this,
- align = _self.get('align');
-
- _self.set('align',align);
- },
- /*
- 对齐 Overlay 到 node 的 points 点, 偏移 offset 处
- @method
- @ignore
- @param {Element} node 参照元素, 可取配置选项中的设置, 也可是一元素
- @param {String[]} points 对齐方式
- @param {Number[]} [offset] 偏移
- */
- align:function (refNode, points, offset, overflow) {
- refNode = $(refNode || win);
- offset = offset && [].concat(offset) || [0, 0];
- overflow = overflow || {};
-
- var self = this,
- el = self.get('el'),
- fail = 0,
- // 当前节点可以被放置的显示区域
- visibleRect = getVisibleRectForElement(el[0]),
- // 当前节点所占的区域, left/top/width/height
- elRegion = getRegion(el),
- // 参照节点所占的区域, left/top/width/height
- refNodeRegion = getRegion(refNode),
- // 当前节点将要被放置的位置
- elFuturePos = getElFuturePos(elRegion, refNodeRegion, points, offset),
- // 当前节点将要所处的区域
- newElRegion = BUI.merge(elRegion, elFuturePos);
-
- // 如果可视区域不能完全放置当前节点时允许调整
- if (visibleRect && (overflow.adjustX || overflow.adjustY)) {
-
- // 如果横向不能放下
- if (isFailX(elFuturePos, elRegion, visibleRect)) {
- fail = 1;
- // 对齐位置反下
- points = flip(points, /[lr]/ig, {
- l:'r',
- r:'l'
- });
- // 偏移量也反下
- offset = flipOffset(offset, 0);
- }
-
- // 如果纵向不能放下
- if (isFailY(elFuturePos, elRegion, visibleRect)) {
- fail = 1;
- // 对齐位置反下
- points = flip(points, /[tb]/ig, {
- t:'b',
- b:'t'
- });
- // 偏移量也反下
- offset = flipOffset(offset, 1);
- }
-
- // 如果失败,重新计算当前节点将要被放置的位置
- if (fail) {
- elFuturePos = getElFuturePos(elRegion, refNodeRegion, points, offset);
- BUI.mix(newElRegion, elFuturePos);
- }
-
- var newOverflowCfg = {};
-
- // 检查反下后的位置是否可以放下了
- // 如果仍然放不下只有指定了可以调整当前方向才调整
- newOverflowCfg.adjustX = overflow.adjustX &&
- isFailX(elFuturePos, elRegion, visibleRect);
-
- newOverflowCfg.adjustY = overflow.adjustY &&
- isFailY(elFuturePos, elRegion, visibleRect);
-
- // 确实要调整,甚至可能会调整高度宽度
- if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
- newElRegion = adjustForViewport(elFuturePos, elRegion,
- visibleRect, newOverflowCfg);
- }
- }
-
- // 新区域位置发生了变化
- if (newElRegion.left != elRegion.left) {
- self.setInternal('x', null);
- self.get('view').setInternal('x', null);
- self.set('x', newElRegion.left);
- }
-
- if (newElRegion.top != elRegion.top) {
- // https://github.com/kissyteam/kissy/issues/190
- // 相对于屏幕位置没变,而 left/top 变了
- // 例如
- * control.center('#t1'); //控件处于容器#t1的中间位置
- *
- * @param {undefined|String|HTMLElement|jQuery} node
- *
- */
- center:function (node) {
- var self = this;
- self.set('align', {
- node:node,
- points:['cc', 'cc'],
- offset:[0, 0]
- });
- return self;
- }
-};
-
-module.exports = Align;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/autohide.js b/spm_modules/bui-common/1.1.2/src/component/uibase/autohide.js
deleted file mode 100644
index 9b57d66..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/autohide.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * @fileOverview 点击或移出控件外部,控件隐藏
- * @author dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery'),
- wrapBehavior = BUI.wrapBehavior,
- getWrapBehavior = BUI.getWrapBehavior;
-
-function isExcept(self, elem) {
- var hideExceptNode = self.get('hideExceptNode');
- if (hideExceptNode && hideExceptNode.length) {
- return $.contains(hideExceptNode[0], elem);
- }
- return false;
-}
-/**
- * 点击隐藏控件的扩展
- * @class BUI.Component.UIBase.AutoHide
- */
-function autoHide() {
-
-}
-
-autoHide.ATTRS = {
-
- /**
- * 控件自动隐藏的事件,这里支持2种:
- * - 'click'
- * - 'leave'
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * var overlay = new Overlay({ //移动到#t1时显示,移动出#t1,overlay之外控件隐藏
- * trigger : '#t1',
- * autoHide : true,
- * triggerEvent :'mouseover',
- * autoHideType : 'leave',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- *
- * @cfg {String} [autoHideType = 'click']
- */
- /**
- * 控件自动隐藏的事件,这里支持2种:
- * 'click',和'leave',默认为'click'
- * @type {String}
- */
- autoHideType: {
- value: 'click'
- },
- /**
- * 是否自动隐藏
- *
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Object} autoHide
- */
- /**
- * 是否自动隐藏
- * @type {Object}
- * @ignore
- */
- autoHide: {
- value: false
- },
- /**
- * 点击或者移动到此节点时不触发自动隐藏
- *
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,#t2,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * hideExceptNode : '#t2',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Object} hideExceptNode
- */
- hideExceptNode: {
-
- },
- events: {
- value: {
- /**
- * @event autohide
- * 点击控件外部时触发,只有在控件设置自动隐藏(autoHide = true)有效
- * 可以阻止控件隐藏,通过在事件监听函数中 return false
- *
- * overlay.on('autohide',function(){
- * var curTrigger = overlay.curTrigger; //当前触发的项
- * if(condtion){
- * return false; //阻止隐藏
- * }
- * });
- *
- */
- autohide: false
- }
- }
-};
-
-autoHide.prototype = {
-
- __bindUI: function() {
- var _self = this;
-
- _self.on('afterVisibleChange', function(ev) {
- var visible = ev.newVal;
- if (_self.get('autoHide')) {
- if (visible) {
- _self._bindHideEvent();
- } else {
- _self._clearHideEvent();
- }
- }
- });
- },
- /**
- * 处理鼠标移出事件,不影响{BUI.Component.Controller#handleMouseLeave}事件
- * @param {jQuery.Event} ev 事件对象
- */
- handleMoveOuter: function(ev) {
- var _self = this,
- target = ev.toElement || ev.relatedTarget;
- if (!_self.containsElement(target) && !isExcept(_self, target)) {
- if (_self.fire('autohide') !== false) {
- _self.hide();
- }
- }
- },
- /**
- * 点击页面时的处理函数
- * @param {jQuery.Event} ev 事件对象
- * @protected
- */
- handleDocumentClick: function(ev) {
- var _self = this,
- target = ev.target;
- if (!_self.containsElement(target) && !isExcept(_self, target)) {
- if (_self.fire('autohide') !== false) {
- _self.hide();
- }
- }
- },
- _bindHideEvent: function() {
- var _self = this,
- trigger = _self.get('curTrigger'),
- autoHideType = _self.get('autoHideType');
- if (autoHideType === 'click') {
- $(document).on('mousedown', wrapBehavior(_self, 'handleDocumentClick'));
- } else {
- _self.get('el').on('mouseleave', wrapBehavior(_self, 'handleMoveOuter'));
- if (trigger) {
- $(trigger).on('mouseleave', wrapBehavior(_self, 'handleMoveOuter'))
- }
- }
-
- },
- //清除绑定的隐藏事件
- _clearHideEvent: function() {
- var _self = this,
- trigger = _self.get('curTrigger'),
- autoHideType = _self.get('autoHideType');
- if (autoHideType === 'click') {
- $(document).off('mousedown', getWrapBehavior(_self, 'handleDocumentClick'));
- } else {
- _self.get('el').off('mouseleave', getWrapBehavior(_self, 'handleMoveOuter'));
- if (trigger) {
- $(trigger).off('mouseleave', getWrapBehavior(_self, 'handleMoveOuter'))
- }
- }
- }
-};
-
-module.exports = autoHide;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/autoshow.js b/spm_modules/bui-common/1.1.2/src/component/uibase/autoshow.js
deleted file mode 100644
index a9c7f85..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/autoshow.js
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * @fileOverview click,focus,hover等引起控件显示,并且定位
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * 处理自动显示控件的扩展,一般用于显示menu,picker,tip等
- * @class BUI.Component.UIBase.AutoShow
- */
-function autoShow() {
-
-}
-
-autoShow.ATTRS = {
-
- /**
- * 触发显示控件的DOM选择器
- *
- * var overlay = new Overlay({ //点击#t1时显示,点击#t1,overlay之外的元素隐藏
- * trigger : '#t1',
- * autoHide : true,
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {HTMLElement|String|jQuery} trigger
- */
- /**
- * 触发显示控件的DOM选择器
- * @type {HTMLElement|String|jQuery}
- */
- trigger: {
-
- },
- delegateTigger: {
- getter: function() {
- this.get('delegateTrigger'); //兼容之前的版本
- },
- setter: function(v) {
- this.set('delegateTrigger', v);
- }
-
- },
- /**
- * 是否使用代理的方式触发显示控件,如果tigger不是字符串,此属性无效
- *
- * var overlay = new Overlay({ //点击.t1(无论创建控件时.t1是否存在)时显示,点击.t1,overlay之外的元素隐藏
- * trigger : '.t1',
- * autoHide : true,
- * delegateTrigger : true, //使用委托的方式触发显示控件
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- * @cfg {Boolean} [delegateTrigger = false]
- */
- /**
- * 是否使用代理的方式触发显示控件,如果tigger不是字符串,此属性无效
- * @type {Boolean}
- * @ignore
- */
- delegateTrigger: {
- value: false
- },
- /**
- * 选择器是否始终跟随触发器对齐
- * @cfg {Boolean} autoAlign
- * @ignore
- */
- /**
- * 选择器是否始终跟随触发器对齐
- * @type {Boolean}
- * @protected
- */
- autoAlign: {
- value: true
- },
- /**
- * 显示时是否默认获取焦点
- * @type {Boolean}
- */
- autoFocused: {
- value: true
- },
- /**
- * 如果设置了这个样式,那么触发显示(overlay)时trigger会添加此样式
- * @type {Object}
- */
- triggerActiveCls: {
-
- },
- /**
- * 控件显示时由此trigger触发,当配置项 trigger 选择器代表多个DOM 对象时,
- * 控件可由多个DOM对象触发显示。
- *
- * overlay.on('show',function(){
- * var curTrigger = overlay.get('curTrigger');
- * //TO DO
- * });
- *
- * @type {jQuery}
- * @readOnly
- */
- curTrigger: {
-
- },
- /**
- * 触发显示时的回调函数
- * @cfg {Function} triggerCallback
- * @ignore
- */
- /**
- * 触发显示时的回调函数
- * @type {Function}
- * @ignore
- */
- triggerCallback: {
-
- },
- /**
- * 显示菜单的事件
- *
- * var overlay = new Overlay({ //移动到#t1时显示,移动出#t1,overlay之外控件隐藏
- * trigger : '#t1',
- * autoHide : true,
- * triggerEvent :'mouseover',
- * autoHideType : 'leave',
- * content : '悬浮内容'
- * });
- * overlay.render();
- *
- *
- * @cfg {String} [triggerEvent='click']
- * @default 'click'
- */
- /**
- * 显示菜单的事件
- * @type {String}
- * @default 'click'
- * @ignore
- */
- triggerEvent: {
- value: 'click'
- },
- /**
- * 因为触发元素发生改变而导致控件隐藏
- * @cfg {String} triggerHideEvent
- * @ignore
- */
- /**
- * 因为触发元素发生改变而导致控件隐藏
- * @type {String}
- * @ignore
- */
- triggerHideEvent: {
-
- },
- events: {
- value: {
- /**
- * 当触发器(触发选择器出现)发生改变时,经常用于一个选择器对应多个触发器的情况
- *
- * overlay.on('triggerchange',function(ev){
- * var curTrigger = ev.curTrigger;
- * overlay.set('content',curTrigger.html());
- * });
- *
- * @event
- * @param {Object} e 事件对象
- * @param {jQuery} e.prevTrigger 之前触发器,可能为null
- * @param {jQuery} e.curTrigger 当前的触发器
- */
- 'triggerchange': false
- }
- }
-};
-
-autoShow.prototype = {
-
- __createDom: function() {
- this._setTrigger();
- },
- __bindUI: function() {
- var _self = this,
- triggerActiveCls = _self.get('triggerActiveCls');
- if (triggerActiveCls) {
- _self.on('hide', function() {
- var curTrigger = _self.get('curTrigger');
- if (curTrigger) {
- curTrigger.removeClass(triggerActiveCls);
- }
- });
- }
-
- },
- _setTrigger: function() {
- var _self = this,
- triggerEvent = _self.get('triggerEvent'),
- triggerHideEvent = _self.get('triggerHideEvent'),
- triggerCallback = _self.get('triggerCallback'),
- triggerActiveCls = _self.get('triggerActiveCls') || '',
- trigger = _self.get('trigger'),
- isDelegate = _self.get('delegateTrigger'),
- triggerEl = $(trigger);
-
- //触发显示
- function tiggerShow(ev) {
- if (_self.get('disabled')) { //如果禁用则中断
- return;
- }
- var prevTrigger = _self.get('curTrigger'),
- curTrigger = isDelegate ? $(ev.currentTarget) : $(this),
- align = _self.get('align');
- if (!prevTrigger || prevTrigger[0] != curTrigger[0]) {
- if (prevTrigger) {
- prevTrigger.removeClass(triggerActiveCls);
- }
- _self.set('curTrigger', curTrigger);
- _self.fire('triggerchange', {
- prevTrigger: prevTrigger,
- curTrigger: curTrigger
- });
- }
- curTrigger.addClass(triggerActiveCls);
- if (_self.get('autoAlign')) {
- align.node = curTrigger;
-
- }
- _self.set('align', align);
- _self.show();
-
-
- triggerCallback && triggerCallback(ev);
- }
-
- //触发隐藏
- function tiggerHide(ev) {
- var toElement = ev.toElement || ev.relatedTarget;
- if (!toElement || !_self.containsElement(toElement)) { //mouseleave时,如果移动到当前控件上,取消消失
- _self.hide();
- }
- }
-
- if (triggerEvent) {
- if (isDelegate && BUI.isString(trigger)) {
- $(document).delegate(trigger, triggerEvent, tiggerShow);
- } else {
- triggerEl.on(triggerEvent, tiggerShow);
- }
-
- }
-
- if (triggerHideEvent) {
- if (isDelegate && BUI.isString(trigger)) {
- $(document).delegate(trigger, triggerHideEvent, tiggerHide);
- } else {
- triggerEl.on(triggerHideEvent, tiggerHide);
- }
- }
- },
- __renderUI: function() {
- var _self = this,
- align = _self.get('align');
- //如果控件显示时不是由trigger触发,则同父元素对齐
- if (align && !align.node) {
- align.node = _self.get('render') || _self.get('trigger');
- }
- }
-};
-
-module.exports = autoShow;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/base.js b/spm_modules/bui-common/1.1.2/src/component/uibase/base.js
deleted file mode 100644
index e915956..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/base.js
+++ /dev/null
@@ -1,557 +0,0 @@
-/**
- * @fileOverview UI控件的流程控制
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-var Manager = require('../manage'),
-
- UI_SET = '_uiSet',
- ATTRS = 'ATTRS',
- ucfirst = BUI.ucfirst,
- noop = $.noop,
- Base = require('../../base');
-/**
- * 模拟多继承
- * init attr using constructors ATTRS meta info
- * @ignore
- */
-function initHierarchy(host, config) {
- callMethodByHierarchy(host, 'initializer', 'constructor');
-}
-
-function callMethodByHierarchy(host, mainMethod, extMethod) {
- var c = host.constructor,
- extChains = [],
- ext,
- main,
- exts,
- t;
-
- // define
- while (c) {
-
- // 收集扩展类
- t = [];
- if (exts = c.mixins) {
- for (var i = 0; i < exts.length; i++) {
- ext = exts[i];
- if (ext) {
- if (extMethod != 'constructor') {
- //只调用真正自己构造器原型的定义,继承原型链上的不要管
- if (ext.prototype.hasOwnProperty(extMethod)) {
- ext = ext.prototype[extMethod];
- } else {
- ext = null;
- }
- }
- ext && t.push(ext);
- }
- }
- }
-
- // 收集主类
- // 只调用真正自己构造器原型的定义,继承原型链上的不要管 !important
- // 所以不用自己在 renderUI 中调用 superclass.renderUI 了,UIBase 构造器自动搜寻
- // 以及 initializer 等同理
- if (c.prototype.hasOwnProperty(mainMethod) && (main = c.prototype[mainMethod])) {
- t.push(main);
- }
-
- // 原地 reverse
- if (t.length) {
- extChains.push.apply(extChains, t.reverse());
- }
-
- c = c.superclass && c.superclass.constructor;
- }
-
- // 初始化函数
- // 顺序:父类的所有扩展类函数 -> 父类对应函数 -> 子类的所有扩展函数 -> 子类对应函数
- for (i = extChains.length - 1; i >= 0; i--) {
- extChains[i] && extChains[i].call(host);
- }
-}
-
-/**
- * 销毁组件顺序: 子类 destructor -> 子类扩展 destructor -> 父类 destructor -> 父类扩展 destructor
- * @ignore
- */
-function destroyHierarchy(host) {
- var c = host.constructor,
- extensions,
- d,
- i;
-
- while (c) {
- // 只触发该类真正的析构器,和父亲没关系,所以不要在子类析构器中调用 superclass
- if (c.prototype.hasOwnProperty('destructor')) {
- c.prototype.destructor.apply(host);
- }
-
- if ((extensions = c.mixins)) {
- for (i = extensions.length - 1; i >= 0; i--) {
- d = extensions[i] && extensions[i].prototype.__destructor;
- d && d.apply(host);
- }
- }
-
- c = c.superclass && c.superclass.constructor;
- }
-}
-
-/**
- * 构建 插件
- * @ignore
- */
-function constructPlugins(plugins) {
- if (!plugins) {
- return;
- }
- BUI.each(plugins, function(plugin, i) {
- if (BUI.isFunction(plugin)) {
- plugins[i] = new plugin();
- }
- });
-}
-
-/**
- * 调用插件的方法
- * @ignore
- */
-function actionPlugins(self, plugins, action) {
- if (!plugins) {
- return;
- }
- BUI.each(plugins, function(plugin, i) {
- if (plugin[action]) {
- plugin[action](self);
- }
- });
-}
-
-/**
- * 根据属性变化设置 UI
- * @ignore
- */
-function bindUI(self) {
- /*var attrs = self.getAttrs(),
- attr,
- m;
-
- for (attr in attrs) {
- if (attrs.hasOwnProperty(attr)) {
- m = UI_SET + ucfirst(attr);
- if (self[m]) {
- // 自动绑定事件到对应函数
- (function (attr, m) {
- self.on('after' + ucfirst(attr) + 'Change', function (ev) {
- // fix! 防止冒泡过来的
- if (ev.target === self) {
- self[m](ev.newVal, ev);
- }
- });
- })(attr, m);
- }
- }
- }
- */
-}
-
-/**
- * 根据当前(初始化)状态来设置 UI
- * @ignore
- */
-function syncUI(self) {
- var v,
- f,
- attrs = self.getAttrs();
- for (var a in attrs) {
- if (attrs.hasOwnProperty(a)) {
- var m = UI_SET + ucfirst(a);
- //存在方法,并且用户设置了初始值或者存在默认值,就同步状态
- if ((f = self[m])
- // 用户如果设置了显式不同步,就不同步,比如一些值从 html 中读取,不需要同步再次设置
- && attrs[a].sync !== false && (v = self.get(a)) !== undefined) {
- f.call(self, v);
- }
- }
- }
-}
-
-/**
- * 控件库的基类,包括控件的生命周期,下面是基本的扩展类
- *
- *
- *
- * //默认状态下创建对象,并没有进行render
- * var control = new Control();
- * control.render(); //需要调用render方法
- *
- * //设置autoRender后,不需要调用render方法
- * var control = new Control({
- * autoRender : true
- * });
- *
- * @cfg {Boolean} autoRender
- */
- /**
- * 是否自动渲染,如果不自动渲染,需要用户调用 render()方法
- * @type {Boolean}
- * @ignore
- */
- autoRender: {
- value: false
- },
- /**
- * @type {Object}
- * 事件处理函数:
- * {
- * 'click':function(e){}
- * }
- * @ignore
- */
- listeners: {
- value: {}
- },
- /**
- * 插件集合
- *
- * var grid = new Grid({
- * columns : [{},{}],
- * plugins : [Grid.Plugins.RadioSelection]
- * });
- *
- * @cfg {Array} plugins
- */
- /**
- * 插件集合
- * @type {Array}
- * @readOnly
- */
- plugins: {
- //value : []
- },
- /**
- * 是否已经渲染完成
- * @type {Boolean}
- * @default false
- * @readOnly
- */
- rendered: {
- value: false
- },
- /**
- * 获取控件的 xclass
- * @readOnly
- * @type {String}
- * @protected
- */
- xclass: {
- valueFn: function() {
- return Manager.getXClassByConstructor(this.constructor);
- }
- }
-};
-
-BUI.extend(UIBase, Base);
-
-BUI.augment(UIBase, {
- /**
- * 创建DOM结构
- * @protected
- */
- create: function() {
- var self = this;
- // 是否生成过节点
- if (!self.get('created')) {
- /**
- * @event beforeCreateDom
- * fired before root node is created
- * @param e
- */
- self.fire('beforeCreateDom');
- callMethodByHierarchy(self, 'createDom', '__createDom');
- self._set('created', true);
- /**
- * @event afterCreateDom
- * fired when root node is created
- * @param e
- */
- self.fire('afterCreateDom');
- actionPlugins(self, self.get('plugins'), 'createDom');
- }
- return self;
- },
- /**
- * 渲染
- */
- render: function() {
- var _self = this;
- // 是否已经渲染过
- if (!_self.get('rendered')) {
- var plugins = _self.get('plugins');
- _self.create(undefined);
- _self.set('created', true);
- /**
- * @event beforeRenderUI
- * fired when root node is ready
- * @param e
- */
- _self.fire('beforeRenderUI');
- callMethodByHierarchy(_self, 'renderUI', '__renderUI');
-
- /**
- * @event afterRenderUI
- * fired after root node is rendered into dom
- * @param e
- */
-
- _self.fire('afterRenderUI');
- actionPlugins(_self, plugins, 'renderUI');
-
- /**
- * @event beforeBindUI
- * fired before UIBase 's internal event is bind.
- * @param e
- */
-
- _self.fire('beforeBindUI');
- bindUI(_self);
- callMethodByHierarchy(_self, 'bindUI', '__bindUI');
- _self.set('binded', true);
- /**
- * @event afterBindUI
- * fired when UIBase 's internal event is bind.
- * @param e
- */
-
- _self.fire('afterBindUI');
- actionPlugins(_self, plugins, 'bindUI');
-
- /**
- * @event beforeSyncUI
- * fired before UIBase 's internal state is synchronized.
- * @param e
- */
-
- _self.fire('beforeSyncUI');
-
- syncUI(_self);
- callMethodByHierarchy(_self, 'syncUI', '__syncUI');
-
- /**
- * @event afterSyncUI
- * fired after UIBase 's internal state is synchronized.
- * @param e
- */
-
- _self.fire('afterSyncUI');
- actionPlugins(_self, plugins, 'syncUI');
- _self._set('rendered', true);
- }
- return _self;
- },
- /**
- * 子类可继承此方法,当DOM创建时调用
- * @protected
- * @method
- */
- createDom: noop,
- /**
- * 子类可继承此方法,渲染UI时调用
- * @protected
- * @method
- */
- renderUI: noop,
- /**
- * 子类可继承此方法,绑定事件时调用
- * @protected
- * @method
- */
- bindUI: noop,
- /**
- * 同步属性值到UI上
- * @protected
- * @method
- */
- syncUI: noop,
-
- /**
- * 析构函数
- */
- destroy: function() {
- var _self = this;
- if (_self.destroyed) { //防止返回销毁
- return _self;
- }
- /**
- * @event beforeDestroy
- * fired before UIBase 's destroy.
- * @param e
- */
- _self.fire('beforeDestroy');
-
- actionPlugins(_self, _self.get('plugins'), 'destructor');
- destroyHierarchy(_self);
- /**
- * @event afterDestroy
- * fired before UIBase 's destroy.
- * @param e
- */
- _self.fire('afterDestroy');
- _self.off();
- _self.clearAttrVals();
- _self.destroyed = true;
- return _self;
- }
-});
-
-//延时处理构造函数
-function initConstuctor(c) {
- var constructors = [];
- while (c.base) {
- constructors.push(c);
- c = c.base;
- }
- for (var i = constructors.length - 1; i >= 0; i--) {
- var C = constructors[i];
- //BUI.extend(C,C.base,C.px,C.sx);
- BUI.mix(C.prototype, C.px);
- BUI.mix(C, C.sx);
- C.base = null;
- C.px = null;
- C.sx = null;
- }
-}
-
-BUI.mix(UIBase, {
- /**
- * 定义一个类
- * @static
- * @param {Function} base 基类构造函数
- * @param {Array} extensions 扩展
- * @param {Object} px 原型链上的扩展
- * @param {Object} sx
- * @return {Function} 继承与基类的构造函数
- */
- define: function(base, extensions, px, sx) {
- if ($.isPlainObject(extensions)) {
- sx = px;
- px = extensions;
- extensions = [];
- }
-
- function C() {
- var c = this.constructor;
- if (c.base) {
- initConstuctor(c);
- }
- UIBase.apply(this, arguments);
- }
-
- BUI.extend(C, base); //无法延迟
- C.base = base;
- C.px = px; //延迟复制原型链上的函数
- C.sx = sx; //延迟复制静态属性
-
- //BUI.mixin(C,extensions);
- if (extensions.length) { //延迟执行mixin
- C.extensions = extensions;
- }
-
- return C;
- },
- /**
- * 扩展一个类,基类就是类本身
- * @static
- * @param {Array} extensions 扩展
- * @param {Object} px 原型链上的扩展
- * @param {Object} sx
- * @return {Function} 继承与基类的构造函数
- */
- extend: function extend(extensions, px, sx) {
- var args = $.makeArray(arguments),
- ret,
- last = args[args.length - 1];
- args.unshift(this);
- if (last.xclass) {
- args.pop();
- args.push(last.xclass);
- }
- ret = UIBase.define.apply(UIBase, args);
- if (last.xclass) {
- var priority = last.priority || (this.priority ? (this.priority + 1) : 1);
-
- Manager.setConstructorByXClass(last.xclass, {
- constructor: ret,
- priority: priority
- });
- //方便调试
- ret.__xclass = last.xclass;
- ret.priority = priority;
- ret.toString = function() {
- return last.xclass;
- }
- }
- ret.extend = extend;
- return ret;
- }
-});
-
-module.exports = UIBase;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/bindable.js b/spm_modules/bui-common/1.1.2/src/component/uibase/bindable.js
deleted file mode 100644
index 55627d5..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/bindable.js
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * @fileOverview bindable extension class.
- * @author dxq613@gmail.com
- * @ignore
- */
-
-/**
- * bindable extension class.
- *
- * BUI.use(['bui/list','bui/data','bui/mask'],function(List,Data,Mask){
- * var store = new Data.Store({
- * url : 'data/xx.json'
- * });
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store,
- * loadMask : new Mask.LoadMask({el : '#t1'})
- * });
- *
- * list.render();
- * store.load();
- * });
- *
- * 使控件绑定store,处理store的事件 {@link BUI.Data.Store}
- * @class BUI.Component.UIBase.Bindable
- */
-function bindable() {
-
-}
-
-bindable.ATTRS = {
- /**
- * 绑定 {@link BUI.Data.Store}的事件
- *
- * var store = new Data.Store({
- * url : 'data/xx.json',
- * autoLoad : true
- * });
- *
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store
- * });
- *
- * list.render();
- *
- * @cfg {BUI.Data.Store} store
- */
- /**
- * 绑定 {@link BUI.Data.Store}的事件
- *
- * var store = list.get('store');
- *
- * @type {BUI.Data.Store}
- */
- store: {
-
- },
- /**
- * 加载数据时,是否显示等待加载的屏蔽层
- *
- * BUI.use(['bui/list','bui/data','bui/mask'],function(List,Data,Mask){
- * var store = new Data.Store({
- * url : 'data/xx.json'
- * });
- * var list = new List.SimpleList({
- * render : '#l1',
- * store : store,
- * loadMask : new Mask.LoadMask({el : '#t1'})
- * });
- *
- * list.render();
- * store.load();
- * });
- *
- * @cfg {Boolean|Object} loadMask
- */
- /**
- * 加载数据时,是否显示等待加载的屏蔽层
- * @type {Boolean|Object}
- * @ignore
- */
- loadMask: {
- value: false
- }
-};
-
-
-BUI.augment(bindable, {
-
- __bindUI: function() {
- var _self = this,
- store = _self.get('store'),
- loadMask = _self.get('loadMask');
- if (!store) {
- return;
- }
- store.on('beforeload', function(e) {
- _self.onBeforeLoad(e);
- if (loadMask && loadMask.show) {
- loadMask.show();
- }
- });
- store.on('load', function(e) {
- _self.onLoad(e);
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- });
- store.on('exception', function(e) {
- _self.onException(e);
- if (loadMask && loadMask.hide) {
- loadMask.hide();
- }
- });
- store.on('add', function(e) {
- _self.onAdd(e);
- });
- store.on('remove', function(e) {
- _self.onRemove(e);
- });
- store.on('update', function(e) {
- _self.onUpdate(e);
- });
- store.on('localsort', function(e) {
- _self.onLocalSort(e);
- });
- store.on('filtered', function(e) {
- _self.onFiltered(e);
- });
- },
- __syncUI: function() {
- var _self = this,
- store = _self.get('store');
- if (!store) {
- return;
- }
- if (store.hasData()) {
- _self.onLoad();
- }
- },
- /**
- * @protected
- * @template
- * before store load data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-beforeload}
- */
- onBeforeLoad: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after store load data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-load}
- */
- onLoad: function(e) {
-
- },
- /**
- * @protected
- * @template
- * occurred exception when store is loading data
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-exception}
- */
- onException: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after added data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-add}
- */
- onAdd: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after remvoed data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-remove}
- */
- onRemove: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after updated data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-update}
- */
- onUpdate: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after local sorted data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-localsort}
- */
- onLocalSort: function(e) {
-
- },
- /**
- * @protected
- * @template
- * after filter data to store
- * @param {Object} e The event object
- * @see {@link BUI.Data.Store#event-filtered}
- */
- onFiltered: function(e) {}
-});
-
-module.exports = bindable;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/childCfg.js b/spm_modules/bui-common/1.1.2/src/component/uibase/childCfg.js
deleted file mode 100644
index 745c03c..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/childCfg.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @fileOverview 子控件的默认配置项
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * @class BUI.Component.UIBase.ChildCfg
- * 子控件默认配置项的扩展类
- */
-var childCfg = function(config) {
- this._init();
-};
-
-childCfg.ATTRS = {
- /**
- * 默认的子控件配置项,在初始化控件时配置
- *
- * - 如果控件已经渲染过,此配置项无效,
- * - 控件生成后,修改此配置项无效。
- *
- * var control = new Control({
- * defaultChildCfg : {
- * tpl : '<li>{text}</li>',
- * xclass : 'a-b'
- * }
- * });
- *
- * @cfg {Object} defaultChildCfg
- */
- /**
- * @ignore
- */
- defaultChildCfg: {
-
- }
-};
-
-childCfg.prototype = {
-
- _init: function() {
- var _self = this,
- defaultChildCfg = _self.get('defaultChildCfg');
- if (defaultChildCfg) {
- _self.on('beforeAddChild', function(ev) {
- var child = ev.child;
- if ($.isPlainObject(child)) {
- BUI.each(defaultChildCfg, function(v, k) {
- if (child[k] == null) { //如果未在配置项中设置,则使用默认值
- child[k] = v;
- }
- });
- }
- });
- }
- }
-
-};
-
-module.exports = childCfg;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/close.js b/spm_modules/bui-common/1.1.2/src/component/uibase/close.js
deleted file mode 100644
index ff9b006..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/close.js
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * @fileOverview close 关闭或隐藏控件
- * @author yiminghe@gmail.com
- * copied and modified by dxq613@gmail.com
- * @ignore
- */
-
-
-var $ = require('jquery');
-
-
-var CLS_PREFIX = BUI.prefix + 'ext-';
-
-function getCloseRenderBtn(self) {
- return $(self.get('closeTpl'));
-}
-
-/**
- * 关闭按钮的视图类
- * @class BUI.Component.UIBase.CloseView
- * @private
- */
-function CloseView() {}
-
-CloseView.ATTRS = {
- closeTpl: {
- value: '' +
- '关闭<' + '/span>' +
- '<' + '/a>'
- },
- closeable: {
- value: true
- },
- closeBtn: {}
-};
-
-CloseView.prototype = {
- _uiSetCloseable: function(v) {
- var self = this,
- btn = self.get('closeBtn');
- if (v) {
- if (!btn) {
- self.setInternal('closeBtn', btn = getCloseRenderBtn(self));
- }
- btn.appendTo(self.get('el'), undefined);
- } else {
- if (btn) {
- btn.remove();
- }
- }
- }
-};
-
-/**
- * @class BUI.Component.UIBase.Close
- * Close extension class.
- * Represent a close button.
- */
-function Close() {}
-
-var HIDE = 'hide';
-Close.ATTRS = {
- /**
- * 关闭按钮的默认模版
- *
- * var overlay = new Overlay({
- * closeTpl : 'x',
- * closeable : true,
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {String} closeTpl
- */
- /**
- * 关闭按钮的默认模版
- * @type {String}
- * @protected
- */
- closeTpl: {
- view: true
- },
- /**
- * 是否出现关闭按钮
- * @cfg {Boolean} [closeable = false]
- */
- /**
- * 是否出现关闭按钮
- * @type {Boolean}
- */
- closeable: {
- view: 1
- },
-
- /**
- * 关闭按钮.
- * @protected
- * @type {jQuery}
- */
- closeBtn: {
- view: 1
- },
- /**
- * 关闭时隐藏还是移除DOM结构
- * new Form.Form({
- * srcNode : '#J_Form'
- * }).render();
- *
- * @cfg {jQuery} srcNode
- */
- /**
- * 配置控件的根节点的DOM
- * @type {jQuery}
- */
- srcNode: {
- view: true
- },
- /**
- * 是否根据DOM生成子控件
- * @type {Boolean}
- * @protected
- */
- isDecorateChild: {
- value: false
- },
- /**
- * 此配置项配置使用那些srcNode上的节点作为配置项
- * - 当时用 decorate 时,取 srcNode上的节点的属性作为控件的配置信息
- * - 默认id,name,value,title 都会作为属性传入
- * - 使用 'data-cfg' 作为整体的配置属性
- *
- *
- * //会生成以下配置项:
- * {
- * name : 'txtName',
- * id : 'id',
- * allowBlank:false
- * }
- * new Form.Field({
- * src:'#c1'
- * }).render();
- *
- * @type {Object}
- * @protected
- */
- decorateCfgFields: {
- value: {
- 'id': true,
- 'name': true,
- 'value': true,
- 'title': true
- }
- }
-};
-
-decorate.prototype = {
-
- /**
- * 获取控件的配置信息
- * @protected
- */
- getDecorateConfig: function(el) {
- if (!el.length) {
- return null;
- }
- var _self = this,
- dom = el[0],
- attributes = dom.attributes,
- decorateCfgFields = _self.get('decorateCfgFields'),
- config = {},
- statusCfg = _self._getStautsCfg(el);
-
- BUI.each(attributes, function(attr) {
- var name = attr.nodeName;
- try {
- if (name === FIELD_CFG) {
- var cfg = parseFieldValue(attr.nodeValue);
- BUI.mix(config, cfg);
- } else if (isConfigField(name, decorateCfgFields)) {
- var value = attr.nodeValue;
- if (name.indexOf(FIELD_PREFIX) !== -1) {
- name = name.replace(FIELD_PREFIX, '');
- name = camelCase(name);
- value = parseFieldValue(value);
- }
-
- if (config[name] && BUI.isObject(value)) {
- BUI.mix(config[name], value);
- } else {
- config[name] = value;
- }
- }
- } catch (e) {
- BUI.log('parse field error,the attribute is:' + name);
- }
- });
- return BUI.mix(config, statusCfg);
- },
- //根据css class获取状态属性
- //如: selected,disabled等属性
- _getStautsCfg: function(el) {
- var _self = this,
- rst = {},
- statusCls = _self.get('statusCls');
- BUI.each(statusCls, function(v, k) {
- if (el.hasClass(v)) {
- rst[k] = true;
- }
- });
- return rst;
- },
- /**
- * 获取封装成子控件的节点集合
- * @protected
- * @return {Array} 节点集合
- */
- getDecorateElments: function() {
- var _self = this,
- el = _self.get('el'),
- contentContainer = _self.get('childContainer');
- if (contentContainer) {
- return el.find(contentContainer).children();
- } else {
- return el.children();
- }
- },
-
- /**
- * 封装所有的子控件
- * @protected
- * @param {jQuery} el Root element of current component.
- */
- decorateInternal: function(el) {
- var self = this;
- self.decorateChildren(el);
- },
- /**
- * 获取子控件的xclass类型
- * @protected
- * @param {jQuery} childNode 子控件的根节点
- */
- findXClassByNode: function(childNode, ignoreError) {
- var _self = this,
- cls = childNode.attr("class") || '',
- childClass = _self.get('defaultChildClass'); //如果没有样式或者查找不到对应的类,使用默认的子控件类型
-
- // 过滤掉特定前缀
- cls = cls.replace(new RegExp("\\b" + prefixCls, "ig"), "");
-
- var UI = Manager.getConstructorByXClass(cls) || Manager.getConstructorByXClass(childClass);
-
- if (!UI && !ignoreError) {
- BUI.log(childNode);
- BUI.error("can not find ui " + cls + " from this markup");
- }
- return Manager.getXClassByConstructor(UI);
- },
- // 生成一个组件
- decorateChildrenInternal: function(xclass, c) {
- var _self = this,
- children = _self.get('children');
- children.push({
- xclass: xclass,
- srcNode: c
- });
- },
- /**
- * 封装子控件
- * @private
- * @param {jQuery} el component's root element.
- */
- decorateChildren: function(el) {
- var _self = this,
- children = _self.getDecorateElments();
- BUI.each(children, function(c) {
- var xclass = _self.findXClassByNode($(c));
- _self.decorateChildrenInternal(xclass, $(c));
- });
- }
-};
-
-module.exports = decorate;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/depends.js b/spm_modules/bui-common/1.1.2/src/component/uibase/depends.js
deleted file mode 100644
index b3cdceb..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/depends.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * @fileOverview 依赖扩展,用于观察者模式中的观察者
- * @ignore
- */
-
-
-var $ = require('jquery'),
- regexp = /^#(.*):(.*)$/,
- Manager = require('../manage');
-
-//获取依赖信息
-function getDepend(name) {
-
- var arr = regexp.exec(name),
- id = arr[1],
- eventType = arr[2],
- source = getSource(id);
- return {
- source: source,
- eventType: eventType
- };
-}
-
-//绑定依赖
-function bindDepend(self, name, action) {
- var depend = getDepend(name),
- source = depend.source,
- eventType = depend.eventType,
- callbak;
- if (source && action && eventType) {
-
- if (BUI.isFunction(action)) { //如果action是一个函数
- callbak = action;
- } else if (BUI.isArray(action)) { //如果是一个数组,构建一个回调函数
- callbak = function() {
- BUI.each(action, function(methodName) {
- if (self[methodName]) {
- self[methodName]();
- }
- });
- }
- }
- }
- if (callbak) {
- depend.callbak = callbak;
- source.on(eventType, callbak);
- return depend;
- }
- return null;
-}
-//去除依赖
-function offDepend(depend) {
- var source = depend.source,
- eventType = depend.eventType,
- callbak = depend.callbak;
- source.off(eventType, callbak);
-}
-
-//获取绑定的事件源
-function getSource(id) {
- var control = Manager.getComponent(id);
- if (!control) {
- control = $('#' + id);
- if (!control.length) {
- control = null;
- }
- }
- return control;
-}
-
-/**
- * @class BUI.Component.UIBase.Depends
- * 依赖事件源的扩展
- *
- * var control = new Control({
- * depends : {
- * '#btn:click':['toggle'],//当点击id为'btn'的按钮时,执行 control 的toggle方法
- * '#checkbox1:checked':['show'],//当勾选checkbox时,显示控件
- * '#menu:click',function(){}
- * }
- * });
- *
- */
-function Depends() {
-
-};
-
-Depends.ATTRS = {
- /**
- * 控件的依赖事件,是一个数组集合,每一条记录是一个依赖关系
- * var control = new Control({
- * depends : {
- * '#btn:click':['toggle'],//当点击id为'btn'的按钮时,执行 control 的toggle方法
- * '#checkbox1:checked':['show'],//当勾选checkbox时,显示控件
- * '#menu:click',function(){}
- * }
- * });
- *
- * ** 注意:** 这些依赖项是在控件渲染(render)后进行的。
- * @type {Object}
- */
- depends: {
-
- },
- /**
- * @private
- * 依赖的映射集合
- * @type {Object}
- */
- dependencesMap: {
- shared: false,
- value: {}
- }
-};
-
-Depends.prototype = {
-
- __syncUI: function() {
- this.initDependences();
- },
- /**
- * 初始化依赖项
- * @protected
- */
- initDependences: function() {
- var _self = this,
- depends = _self.get('depends');
- BUI.each(depends, function(action, name) {
- _self.addDependence(name, action);
- });
- },
- /**
- * 添加依赖,如果已经有同名的事件,则移除,再添加
- *
- * form.addDependence('#btn:click',['toggle']); //当按钮#btn点击时,表单交替显示隐藏
- *
- * form.addDependence('#btn:click',function(){//当按钮#btn点击时,表单交替显示隐藏
- * //TO DO
- * });
- *
- * @param {String} name 依赖项的名称
- * @param {Array|Function} action 依赖项的事件
- */
- addDependence: function(name, action) {
- var _self = this,
- dependencesMap = _self.get('dependencesMap'),
- depend;
- _self.removeDependence(name);
- depend = bindDepend(_self, name, action)
- if (depend) {
- dependencesMap[name] = depend;
- }
- },
- /**
- * 移除依赖
- *
- * form.removeDependence('#btn:click'); //当按钮#btn点击时,表单不在监听
- *
- * @param {String} name 依赖名称
- */
- removeDependence: function(name) {
- var _self = this,
- dependencesMap = _self.get('dependencesMap'),
- depend = dependencesMap[name];
- if (depend) {
- offDepend(depend);
- delete dependencesMap[name];
- }
- },
- /**
- * 清除所有的依赖
- *
- * form.clearDependences();
- *
- */
- clearDependences: function() {
- var _self = this,
- map = _self.get('dependencesMap');
- BUI.each(map, function(depend, name) {
- offDepend(depend);
- });
- _self.set('dependencesMap', {});
- },
- __destructor: function() {
- this.clearDependences();
- }
-
-};
-
-module.exports = Depends;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/drag.js b/spm_modules/bui-common/1.1.2/src/component/uibase/drag.js
deleted file mode 100644
index 78ee9c4..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/drag.js
+++ /dev/null
@@ -1,236 +0,0 @@
-/**
- * @fileOverview 拖拽
- * @author by dxq613@gmail.com
- * @ignore
- */
-
-
-
-var $ = require('jquery'),
- dragBackId = BUI.guid('drag');
-
-/**
- * 拖拽控件的扩展
- *
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @class BUI.Component.UIBase.Drag
- */
-var drag = function() {
-
-};
-
-drag.ATTRS = {
-
- /**
- * 点击拖动的节点
- *
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @cfg {jQuery} dragNode
- */
- /**
- * 点击拖动的节点
- * @type {jQuery}
- * @ignore
- */
- dragNode: {
-
- },
- /**
- * 是否正在拖动
- * @type {Boolean}
- * @protected
- */
- draging: {
- setter: function(v) {
- if (v === true) {
- return {};
- }
- },
- value: null
- },
- /**
- * 拖动的限制范围
- *
- * var Control = Overlay.extend([UIBase.Drag],{
- *
- * });
- *
- * var c = new Contol({ //拖动控件时,在#t2内
- * content : '',
- * dragNode : '#header',
- * constraint : '#t2'
- * });
- *
- * @cfg {jQuery} constraint
- */
- /**
- * 拖动的限制范围
- * @type {jQuery}
- * @ignore
- */
- constraint: {
-
- },
- /**
- * @private
- * @type {jQuery}
- */
- dragBackEl: {
- /** @private **/
- getter: function() {
- return $('#' + dragBackId);
- }
- }
-};
-var dragTpl = '';
-
-function initBack() {
- var el = $(dragTpl).css('opacity', 0).prependTo('body');
- return el;
-}
-drag.prototype = {
-
- __bindUI: function() {
- var _self = this,
- constraint = _self.get('constraint'),
- dragNode = _self.get('dragNode');
- if (!dragNode) {
- return;
- }
- dragNode.on('mousedown', function(e) {
-
- if (e.which == 1) {
- e.preventDefault();
- _self.set('draging', {
- elX: _self.get('x'),
- elY: _self.get('y'),
- startX: e.pageX,
- startY: e.pageY
- });
- registEvent();
- }
- });
- /**
- * @private
- */
- function mouseMove(e) {
- var draging = _self.get('draging');
- if (draging) {
- e.preventDefault();
- _self._dragMoveTo(e.pageX, e.pageY, draging, constraint);
- }
- }
- /**
- * @private
- */
- function mouseUp(e) {
- if (e.which == 1) {
- _self.set('draging', false);
- var dragBackEl = _self.get('dragBackEl');
- if (dragBackEl) {
- dragBackEl.hide();
- }
- unregistEvent();
- }
- }
- /**
- * @private
- */
- function registEvent() {
- $(document).on('mousemove', mouseMove);
- $(document).on('mouseup', mouseUp);
- }
- /**
- * @private
- */
- function unregistEvent() {
- $(document).off('mousemove', mouseMove);
- $(document).off('mouseup', mouseUp);
- }
-
- },
- _dragMoveTo: function(x, y, draging, constraint) {
- var _self = this,
- dragBackEl = _self.get('dragBackEl'),
- draging = draging || _self.get('draging'),
- offsetX = draging.startX - x,
- offsetY = draging.startY - y;
- if (!dragBackEl.length) {
- dragBackEl = initBack();
- }
- dragBackEl.css({
- cursor: 'move',
- display: 'block'
- });
- _self.set('xy', [_self._getConstrainX(draging.elX - offsetX, constraint),
- _self._getConstrainY(draging.elY - offsetY, constraint)
- ]);
-
- },
- _getConstrainX: function(x, constraint) {
- var _self = this,
- width = _self.get('el').outerWidth(),
- endX = x + width,
- curX = _self.get('x');
- //如果存在约束
- if (constraint) {
- var constraintOffset = constraint.offset();
- if (constraintOffset.left >= x) {
- return constraintOffset.left;
- }
- if (constraintOffset.left + constraint.width() < endX) {
- return constraintOffset.left + constraint.width() - width;
- }
- return x;
- }
- //当左右顶点都在视图内,移动到此点
- if (BUI.isInHorizontalView(x) && BUI.isInHorizontalView(endX)) {
- return x;
- }
-
- return curX;
- },
- _getConstrainY: function(y, constraint) {
- var _self = this,
- height = _self.get('el').outerHeight(),
- endY = y + height,
- curY = _self.get('y');
- //如果存在约束
- if (constraint) {
- var constraintOffset = constraint.offset();
- if (constraintOffset.top > y) {
- return constraintOffset.top;
- }
- if (constraintOffset.top + constraint.height() < endY) {
- return constraintOffset.top + constraint.height() - height;
- }
- return y;
- }
- //当左右顶点都在视图内,移动到此点
- if (BUI.isInVerticalView(y) && BUI.isInVerticalView(endY)) {
- return y;
- }
-
- return curY;
- }
-};
-
-module.exports = drag;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/keynav.js b/spm_modules/bui-common/1.1.2/src/component/uibase/keynav.js
deleted file mode 100644
index 6a571d1..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/keynav.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * @fileOverview 使用键盘导航
- * @ignore
- */
-
-
- var $ = require('jquery'),
- KeyCode = require('../../keycode'),
- wrapBehavior = BUI.wrapBehavior,
- getWrapBehavior = BUI.getWrapBehavior;
- /**
- * 键盘导航
- * @class BUI.Component.UIBase.KeyNav
- */
- var keyNav = function() {
-
- };
-
- keyNav.ATTRS = {
-
- /**
- * 是否允许键盘导航
- * @cfg {Boolean} [allowKeyNav = true]
- */
- allowKeyNav: {
- value: true
- },
- /**
- * 导航使用的事件
- * @cfg {String} [navEvent = 'keydown']
- */
- navEvent: {
- value: 'keydown'
- },
- /**
- * 当获取事件的DOM是 input,textarea,select等时,不处理键盘导航
- * @cfg {Object} [ignoreInputFields='true']
- */
- ignoreInputFields: {
- value: true
- }
-
- };
-
- keyNav.prototype = {
-
- __bindUI: function() {
-
- },
- _uiSetAllowKeyNav: function(v) {
- var _self = this,
- eventName = _self.get('navEvent'),
- el = _self.get('el');
- if (v) {
- el.on(eventName, wrapBehavior(_self, '_handleKeyDown'));
- } else {
- el.off(eventName, getWrapBehavior(_self, '_handleKeyDown'));
- }
- },
- /**
- * 处理键盘导航
- * @private
- */
- _handleKeyDown: function(ev) {
- var _self = this,
- ignoreInputFields = _self.get('ignoreInputFields'),
- code = ev.which;
- if (ignoreInputFields && $(ev.target).is('input,select,textarea')) {
- return;
- }
-
- switch (code) {
- case KeyCode.UP:
- //ev.preventDefault();
- _self.handleNavUp(ev);
- break;
- case KeyCode.DOWN:
- //ev.preventDefault();
- _self.handleNavDown(ev);
- break;
- case KeyCode.RIGHT:
- // ev.preventDefault();
- _self.handleNavRight(ev);
- break;
- case KeyCode.LEFT:
- //ev.preventDefault();
- _self.handleNavLeft(ev);
- break;
- case KeyCode.ENTER:
- _self.handleNavEnter(ev);
- break;
- case KeyCode.ESC:
- _self.handleNavEsc(ev);
- break;
- case KeyCode.TAB:
- _self.handleNavTab(ev);
- break;
- default:
- break;
- }
- },
- /**
- * 处理向上导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavUp: function(ev) {
- // body...
- },
- /**
- * 处理向下导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavDown: function(ev) {
- // body...
- },
- /**
- * 处理向左导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavLeft: function(ev) {
- // body...
- },
- /**
- * 处理向右导航
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavRight: function(ev) {
- // body...
- },
- /**
- * 处理确认键
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavEnter: function(ev) {
- // body...
- },
- /**
- * 处理 esc 键
- * @protected
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavEsc: function(ev) {
- // body...
- },
- /**
- * 处理Tab键
- * @param {jQuery.Event} ev 事件对象
- */
- handleNavTab: function(ev) {
-
- }
-
- };
-
-module.exports = keyNav;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/list.js b/spm_modules/bui-common/1.1.2/src/component/uibase/list.js
deleted file mode 100644
index 7296fd7..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/list.js
+++ /dev/null
@@ -1,671 +0,0 @@
-/**
- * @fileOverview 所有子元素都是同一类的集合
- * @ignore
- */
-
-
-var $ = require('jquery'),
- Selection = require('./selection');
-
-/**
- * 列表一类的控件的扩展,list,menu,grid都是可以从此类扩展
- * @class BUI.Component.UIBase.List
- */
-var list = function() {
-
-};
-
-list.ATTRS = {
-
- /**
- * 选择的数据集合
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- * list.render();
- *
- * @cfg {Array} items
- */
- /**
- * 选择的数据集合
- *
- * list.set('items',items); //列表会直接替换内容
- * //等同于
- * list.clearItems();
- * list.addItems(items);
- *
- * @type {Array}
- */
- items: {
- shared: false,
- view: true
- },
- /**
- * 选项的默认key值
- * @cfg {String} [idField = 'id']
- */
- idField: {
- value: 'id'
- },
- /**
- * 列表项的默认模板,仅在初始化时传入。
- * @type {String}
- * @ignore
- */
- itemTpl: {
- view: true
- },
- /**
- * 列表项的渲染函数,应对列表项之间有很多差异时
- *
- * var list = new List.SimpleList({
- * itemTplRender : function(item){
- * if(item.type == '1'){
- * return '<li><img src="xxx.jpg"/>'+item.text+'</li>'
- * }else{
- * return '<li>item.text</li>'
- * }
- * },
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1',type : '0'},{value : '2',text : '2',type : '1'}]
- * });
- * list.render();
- *
- * @type {Function}
- */
- itemTplRender: {
- view: true
- },
- /**
- * 子控件各个状态默认采用的样式
- *
- * var list = new List.SimpleList({
- * render : '#t1',
- * itemStatusCls : {
- * selected : 'active', //默认样式为list-item-selected,现在变成'active'
- * hover : 'hover' //默认样式为list-item-hover,现在变成'hover'
- * },
- * items : [{id : '1',text : '1',type : '0'},{id : '2',text : '2',type : '1'}]
- * });
- * list.render();
- *
- * see {@link BUI.Component.Controller#property-statusCls}
- * @type {Object}
- */
- itemStatusCls: {
- view: true,
- value: {}
- },
- events: {
-
- value: {
- /**
- * 选项点击事件
- * @event
- * @param {Object} e 事件对象
- * @param {BUI.Component.UIBase.ListItem} e.item 点击的选项
- * @param {HTMLElement} e.element 选项代表的DOM对象
- * @param {HTMLElement} e.domTarget 点击的DOM对象
- * @param {HTMLElement} e.domEvent 点击的原生事件对象
- */
- 'itemclick': true
- }
- }
-};
-
-list.prototype = {
-
- /**
- * 获取选项的数量
- *
- * var count = list.getItemCount();
- *
- * @return {Number} 选项数量
- */
- getItemCount: function() {
- return this.getItems().length;
- },
- /**
- * 获取字段的值
- * @param {*} item 字段名
- * @param {String} field 字段名
- * @return {*} 字段的值
- * @protected
- */
- getValueByField: function(item, field) {
-
- },
- /**
- * 获取所有选项值,如果选项是子控件,则是所有子控件
- *
- * var items = list.getItems();
- * //等同
- * list.get(items);
- *
- * @return {Array} 选项值集合
- */
- getItems: function() {
-
- },
- /**
- * 获取第一项
- *
- * var item = list.getFirstItem();
- * //等同
- * list.getItemAt(0);
- *
- * @return {Object|BUI.Component.Controller} 选项值(子控件)
- */
- getFirstItem: function() {
- return this.getItemAt(0);
- },
- /**
- * 获取最后一项
- *
- * var item = list.getLastItem();
- * //等同
- * list.getItemAt(list.getItemCount()-1);
- *
- * @return {Object|BUI.Component.Controller} 选项值(子控件)
- */
- getLastItem: function() {
- return this.getItemAt(this.getItemCount() - 1);
- },
- /**
- * 通过索引获取选项值(子控件)
- *
- * var item = list.getItemAt(0); //获取第1个
- * var item = list.getItemAt(2); //获取第3个
- *
- * @param {Number} index 索引值
- * @return {Object|BUI.Component.Controller} 选项(子控件)
- */
- getItemAt: function(index) {
- return this.getItems()[index] || null;
- },
- /**
- * 通过Id获取选项,如果是改变了idField则通过改变的idField来查找选项
- *
- * //如果idField = 'id'
- * var item = list.getItem('2');
- * //等同于
- * list.findItemByField('id','2');
- *
- * //如果idField = 'value'
- * var item = list.getItem('2');
- * //等同于
- * list.findItemByField('value','2');
- *
- * @param {String} id 编号
- * @return {Object|BUI.Component.Controller} 选项(子控件)
- */
- getItem: function(id) {
- var field = this.get('idField');
- return this.findItemByField(field, id);
- },
- /**
- * 返回指定项的索引
- *
- * var index = list.indexOf(item); //返回索引,不存在则返回-1
- *
- * @param {Object|BUI.Component.Controller} item 选项
- * @return {Number} 项的索引值
- */
- indexOfItem: function(item) {
- return BUI.Array.indexOf(item, this.getItems());
- },
- /**
- * 添加多条选项
- *
- * var items = [{id : '1',text : '1'},{id : '2',text : '2'}];
- * list.addItems(items);
- *
- * @param {Array} items 记录集合(子控件配置项)
- */
- addItems: function(items) {
- var _self = this;
- BUI.each(items, function(item) {
- _self.addItem(item);
- });
- },
- /**
- * 插入多条记录
- *
- * var items = [{id : '1',text : '1'},{id : '2',text : '2'}];
- * list.addItemsAt(items,0); // 在最前面插入
- * list.addItemsAt(items,2); //第三个位置插入
- *
- * @param {Array} items 多条记录
- * @param {Number} start 起始位置
- */
- addItemsAt: function(items, start) {
- var _self = this;
- BUI.each(items, function(item, index) {
- _self.addItemAt(item, start + index);
- });
- },
- /**
- * 更新列表项,修改选项值后,DOM跟随变化
- *
- * var item = list.getItem('2');
- * list.text = '新内容'; //此时对应的DOM不会变化
- * list.updateItem(item); //DOM进行相应的变化
- *
- * @param {Object} item 选项值
- */
- updateItem: function(item) {
-
- },
- /**
- * 添加选项,添加在控件最后
- *
- *
- * list.addItem({id : '3',text : '3',type : '0'});
- *
- *
- * @param {Object|BUI.Component.Controller} item 选项,子控件配置项、子控件
- * @return {Object|BUI.Component.Controller} 子控件或者选项记录
- */
- addItem: function(item) {
- return this.addItemAt(item, this.getItemCount());
- },
- /**
- * 在指定位置添加选项
- *
- * list.addItemAt({id : '3',text : '3',type : '0'},0); //第一个位置
- *
- * @param {Object|BUI.Component.Controller} item 选项,子控件配置项、子控件
- * @param {Number} index 索引
- * @return {Object|BUI.Component.Controller} 子控件或者选项记录
- */
- addItemAt: function(item, index) {
-
- },
- /**
- * 根据字段查找指定的项
- * @param {String} field 字段名
- * @param {Object} value 字段值
- * @return {Object} 查询出来的项(传入的记录或者子控件)
- * @protected
- */
- findItemByField: function(field, value) {
-
- },
- /**
- *
- * 获取此项显示的文本
- * @param {Object} item 获取记录显示的文本
- * @protected
- */
- getItemText: function(item) {
-
- },
- /**
- * 清除所有选项,不等同于删除全部,此时不会触发删除事件
- *
- * list.clearItems();
- * //等同于
- * list.set('items',items);
- *
- */
- clearItems: function() {
- var _self = this,
- items = _self.getItems();
- items.splice(0);
- _self.clearControl();
- },
- /**
- * 删除选项
- *
- * var item = list.getItem('1');
- * list.removeItem(item);
- *
- * @param {Object|BUI.Component.Controller} item 选项(子控件)
- */
- removeItem: function(item) {
-
- },
- /**
- * 移除选项集合
- *
- * var items = list.getSelection();
- * list.removeItems(items);
- *
- * @param {Array} items 选项集合
- */
- removeItems: function(items) {
- var _self = this;
-
- BUI.each(items, function(item) {
- _self.removeItem(item);
- });
- },
- /**
- * 通过索引删除选项
- *
- * list.removeItemAt(0); //删除第一个
- *
- * @param {Number} index 索引
- */
- removeItemAt: function(index) {
- this.removeItem(this.getItemAt(index));
- },
- /**
- * @protected
- * @template
- * 清除所有的子控件或者列表项的DOM
- */
- clearControl: function() {
-
- }
-}
-
-
-
-
-
-function clearSelected(item) {
- if (item.selected) {
- item.selected = false;
- }
- if (item.set) {
- item.set('selected', false);
- }
-}
-
-function beforeAddItem(self, item) {
-
- var c = item.isController ? item.getAttrVals() : item,
- defaultTpl = self.get('itemTpl'),
- defaultStatusCls = self.get('itemStatusCls'),
- defaultTplRender = self.get('itemTplRender');
-
- //配置默认模板
- if (defaultTpl && !c.tpl) {
- setItemAttr(item, 'tpl', defaultTpl);
- // c.tpl = defaultTpl;
- }
- //配置默认渲染函数
- if (defaultTplRender && !c.tplRender) {
- setItemAttr(item, 'tplRender', defaultTplRender);
- //c.tplRender = defaultTplRender;
- }
- //配置默认状态样式
- if (defaultStatusCls) {
- var statusCls = c.statusCls || item.isController ? item.get('statusCls') : {};
- BUI.each(defaultStatusCls, function(v, k) {
- if (v && !statusCls[k]) {
- statusCls[k] = v;
- }
- });
- setItemAttr(item, 'statusCls', statusCls)
- //item.statusCls = statusCls;
- }
- // clearSelected(item);
-}
-
-function setItemAttr(item, name, val) {
- if (item.isController) {
- item.set(name, val);
- } else {
- item[name] = val;
- }
-}
-
-/**
- * @class BUI.Component.UIBase.ChildList
- * 选中其中的DOM结构
- * @extends BUI.Component.UIBase.List
- * @mixins BUI.Component.UIBase.Selection
- */
-var childList = function() {
- this.__init();
-};
-
-childList.ATTRS = BUI.merge(true, list.ATTRS, Selection.ATTRS, {
- items: {
- sync: false
- },
- /**
- * 配置的items 项是在初始化时作为children
- * @protected
- * @type {Boolean}
- */
- autoInitItems: {
- value: true
- },
- /**
- * 使用srcNode时,是否将内部的DOM转换成子控件
- * @type {Boolean}
- */
- isDecorateChild: {
- value: true
- },
- /**
- * 默认的加载控件内容的配置,默认值:
- * - * { - * property : 'children', - * dataType : 'json' - * } - *- * @type {Object} - */ - defaultLoaderCfg: { - value: { - property: 'children', - dataType: 'json' - } - } -}); - -BUI.augment(childList, list, Selection, { - //初始化,将items转换成children - __init: function() { - var _self = this, - items = _self.get('items'); - if (items && _self.get('autoInitItems')) { - _self.addItems(items); - } - _self.on('beforeRenderUI', function() { - _self._beforeRenderUI(); - }); - }, - _uiSetItems: function(items) { - var _self = this; - //清理子控件 - _self.clearControl(); - _self.addItems(items); - }, - //渲染子控件 - _beforeRenderUI: function() { - var _self = this, - children = _self.get('children'), - items = _self.get('items'); - BUI.each(children, function(item) { - beforeAddItem(_self, item); - }); - }, - //绑定事件 - __bindUI: function() { - var _self = this, - selectedEvent = _self.get('selectedEvent'); - - _self.on(selectedEvent, function(e) { - var item = e.target; - if (item.get('selectable')) { - if (!item.get('selected')) { - _self.setSelected(item); - } else if (_self.get('multipleSelect')) { - _self.clearSelected(item); - } - } - }); - - _self.on('click', function(e) { - if (e.target !== _self) { - _self.fire('itemclick', { - item: e.target, - domTarget: e.domTarget, - domEvent: e - }); - } - }); - _self.on('beforeAddChild', function(ev) { - beforeAddItem(_self, ev.child); - }); - _self.on('beforeRemoveChild', function(ev) { - var item = ev.child, - selected = item.get('selected'); - //清理选中状态 - if (selected) { - if (_self.get('multipleSelect')) { - _self.clearSelected(item); - } else { - _self.setSelected(null); - } - } - item.set('selected', false); - }); - }, - /** - * @protected - * @override - * 清除者列表项的DOM - */ - clearControl: function() { - this.removeChildren(true); - }, - /** - * 获取所有子控件 - * @return {Array} 子控件集合 - * @override - */ - getItems: function() { - return this.get('children'); - }, - /** - * 更新列表项 - * @param {Object} item 选项值 - */ - updateItem: function(item) { - var _self = this, - idField = _self.get('idField'), - element = _self.findItemByField(idField, item[idField]); - if (element) { - element.setTplContent(); - } - return element; - }, - /** - * 删除项,子控件作为选项 - * @param {Object} element 子控件 - */ - removeItem: function(item) { - var _self = this, - idField = _self.get('idField'); - if (!(item instanceof BUI.Component.Controller)) { - item = _self.findItemByField(idField, item[idField]); - } - this.removeChild(item, true); - }, - /** - * 在指定位置添加选项,此处选项指子控件 - * @param {Object|BUI.Component.Controller} item 子控件配置项、子控件 - * @param {Number} index 索引 - * @return {Object|BUI.Component.Controller} 子控件 - */ - addItemAt: function(item, index) { - return this.addChild(item, index); - }, - findItemByField: function(field, value, root) { - - root = root || this; - var _self = this, - children = root.get('children'), - result = null; - $(children).each(function(index, item) { - if (item.get(field) == value) { - result = item; - } else if (item.get('children').length) { - result = _self.findItemByField(field, value, item); - } - if (result) { - return false; - } - }); - return result; - }, - getItemText: function(item) { - return item.get('el').text(); - }, - getValueByField: function(item, field) { - return item && item.get(field); - }, - /** - * @protected - * @ignore - */ - setItemSelectedStatus: function(item, selected) { - var _self = this, - method = selected ? 'addClass' : 'removeClass', - element = null; - - if (item) { - item.set('selected', selected); - element = item.get('el'); - } - _self.afterSelected(item, selected, element); - }, - /** - * 选项是否被选中 - * @override - * @param {*} item 选项 - * @return {Boolean} 是否选中 - */ - isItemSelected: function(item) { - return item ? item.get('selected') : false; - }, - /** - * 设置所有选项选中 - * @override - */ - setAllSelection: function() { - var _self = this, - items = _self.getItems(); - _self.setSelection(items); - }, - /** - * 获取选中的项的值 - * @return {Array} - * @override - * @ignore - */ - getSelection: function() { - var _self = this, - items = _self.getItems(), - rst = []; - BUI.each(items, function(item) { - if (_self.isItemSelected(item)) { - rst.push(item); - } - - }); - return rst; - } -}); - -list.ChildList = childList; - -module.exports = list; - -/** - * @ignore - * 2013-1-22 - * 更改显示数据的方式,使用 _uiSetItems - */ diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/listitem.js b/spm_modules/bui-common/1.1.2/src/component/uibase/listitem.js deleted file mode 100644 index 6d1910a..0000000 --- a/spm_modules/bui-common/1.1.2/src/component/uibase/listitem.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @fileOverview 可选中的控件,父控件支持selection扩展 - * @ignore - */ - - -/** - * 列表项控件的视图层 - * @class BUI.Component.UIBase.ListItemView - * @private - */ -function listItemView() { - // body... -} - -listItemView.ATTRS = { - /** - * 是否选中 - * @type {Boolean} - */ - selected: { - - } -}; - -listItemView.prototype = { - _uiSetSelected: function(v) { - var _self = this, - cls = _self.getStatusCls('selected'), - el = _self.get('el'); - if (v) { - el.addClass(cls); - } else { - el.removeClass(cls); - } - } -}; -/** - * 列表项的扩展 - * @class BUI.Component.UIBase.ListItem - */ -function listItem() { - -} - -listItem.ATTRS = { - - /** - * 是否可以被选中 - * @cfg {Boolean} [selectable=true] - */ - /** - * 是否可以被选中 - * @type {Boolean} - */ - selectable: { - value: true - }, - - /** - * 是否选中,只能通过设置父类的选中方法来实现选中 - * @type {Boolean} - * @readOnly - */ - selected: { - view: true, - sync: false, - value: false - } -}; - -listItem.prototype = { - -}; - -listItem.View = listItemView; - -module.exports = listItem; diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/mask.js b/spm_modules/bui-common/1.1.2/src/component/uibase/mask.js deleted file mode 100644 index 0849340..0000000 --- a/spm_modules/bui-common/1.1.2/src/component/uibase/mask.js +++ /dev/null @@ -1,236 +0,0 @@ -/** - * @fileOverview mask 遮罩层 - * @author yiminghe@gmail.com - * copied and modified by dxq613@gmail.com - * @ignore - */ - - -var $ = require('jquery'), - UA = require('../../ua'), - - /** - * 每组相同 prefixCls 的 position 共享一个遮罩 - * @ignore - */ - maskMap = { - /** - * @ignore - * { - * node: - * num: - * } - */ - - }, - ie6 = UA.ie == 6; - -function getMaskCls(self) { - return self.get('prefixCls') + 'ext-mask'; -} - -function docWidth() { - return ie6 ? BUI.docWidth() + 'px' : '100%'; -} - -function docHeight() { - return ie6 ? BUI.docHeight() + 'px' : '100%'; -} - -function initMask(maskCls) { - var mask = $('
- * var overlay = new Overlay({ //显示overlay时,屏蔽body
- * mask : true,
- * maskNode : 'body',
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {Boolean} [mask = false]
- */
- /**
- * 控件显示时,是否显示屏蔽层
- * @type {Boolean}
- * @protected
- */
- mask: {
- value: false
- },
- /**
- * 屏蔽的内容
- *
- * var overlay = new Overlay({ //显示overlay时,屏蔽body
- * mask : true,
- * maskNode : 'body',
- * trigger : '#t1'
- * });
- * overlay.render();
- *
- * @cfg {jQuery} maskNode
- */
- /**
- * 屏蔽的内容
- * @type {jQuery}
- * @protected
- */
- maskNode: {
- view: 1
- },
- /**
- * Whether to share mask with other overlays.
- * @default true.
- * @type {Boolean}
- * @protected
- */
- maskShared: {
- view: 1
- }
-};
-
-Mask.prototype = {
-
- __bindUI: function() {
- var self = this,
- view = self.get('view'),
- _maskExtShow = view._maskExtShow,
- _maskExtHide = view._maskExtHide;
- if (self.get('mask')) {
- self.on('show', function() {
- view._maskExtShow();
- });
- self.on('hide', function() {
- view._maskExtHide();
- });
- }
- }
-};
-
-Mask = Mask;
-Mask.View = MaskView;
-
-module.exports = Mask;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/position.js b/spm_modules/bui-common/1.1.2/src/component/uibase/position.js
deleted file mode 100644
index 36a2099..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/position.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * @fileOverview 位置,控件绝对定位
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * 对齐的视图类
- * @class BUI.Component.UIBase.PositionView
- * @private
- */
-function PositionView() {
-
-}
-
-PositionView.ATTRS = {
- x: {
- /**
- * 水平方向绝对位置
- * @private
- * @ignore
- */
- valueFn: function() {
- var self = this;
- // 读到这里时,el 一定是已经加到 dom 树中了,否则报未知错误
- // el 不在 dom 树中 offset 报错的
- // 最早读就是在 syncUI 中,一点重复设置(读取自身 X 再调用 _uiSetX)无所谓了
- return self.get('el') && self.get('el').offset().left;
- }
- },
- y: {
- /**
- * 垂直方向绝对位置
- * @private
- * @ignore
- */
- valueFn: function() {
- var self = this;
- return self.get('el') && self.get('el').offset().top;
- }
- },
- zIndex: {},
- /**
- * @private
- * see {@link BUI.Component.UIBase.Box#visibleMode}.
- * @default "visibility"
- * @ignore
- */
- visibleMode: {
- value: 'visibility'
- }
-};
-
-
-PositionView.prototype = {
-
- __createDom: function() {
- this.get('el').addClass(BUI.prefix + 'ext-position');
- },
-
- _uiSetZIndex: function(x) {
- this.get('el').css('z-index', x);
- },
- _uiSetX: function(x) {
- if (x != null) {
- this.get('el').offset({
- left: x
- });
- }
- },
- _uiSetY: function(y) {
- if (y != null) {
- this.get('el').offset({
- top: y
- });
- }
- },
- _uiSetLeft: function(left) {
- if (left != null) {
- this.get('el').css({
- left: left
- });
- }
- },
- _uiSetTop: function(top) {
- if (top != null) {
- this.get('el').css({
- top: top
- });
- }
- }
-};
-
-/**
- * @class BUI.Component.UIBase.Position
- * Position extension class.
- * Make component positionable
- */
-function Position() {}
-
-Position.ATTRS = {
- /**
- * 水平坐标
- * @cfg {Number} x
- */
- /**
- * 水平坐标
- *
- * overlay.set('x',100);
- *
- * @type {Number}
- */
- x: {
- view: 1
- },
- /**
- * 垂直坐标
- * @cfg {Number} y
- */
- /**
- * 垂直坐标
- *
- * overlay.set('y',100);
- *
- * @type {Number}
- */
- y: {
- view: 1
- },
- /**
- * 相对于父元素的水平位置
- * @type {Number}
- * @protected
- */
- left: {
- view: 1
- },
- /**
- * 相对于父元素的垂直位置
- * @type {Number}
- * @protected
- */
- top: {
- view: 1
- },
- /**
- * 水平和垂直坐标
- *
- * var overlay = new Overlay({
- * xy : [100,100],
- * trigger : '#t1',
- * srcNode : '#c1'
- * });
- *
- * @cfg {Number[]} xy
- */
- /**
- * 水平和垂直坐标
- *
- * overlay.set('xy',[100,100]);
- *
- * @type {Number[]}
- */
- xy: {
- // 相对 page 定位, 有效值为 [n, m], 为 null 时, 选 align 设置
- setter: function(v) {
- var self = this,
- xy = $.makeArray(v);
- /*
- 属性内分发特别注意:
- xy -> x,y
- */
- if (xy.length) {
- xy[0] && self.set('x', xy[0]);
- xy[1] && self.set('y', xy[1]);
- }
- return v;
- },
- /**
- * xy 纯中转作用
- * @ignore
- */
- getter: function() {
- return [this.get('x'), this.get('y')];
- }
- },
- /**
- * z-index value.
- *
- * var overlay = new Overlay({
- * zIndex : '1000'
- * });
- *
- * @cfg {Number} zIndex
- */
- /**
- * z-index value.
- *
- * overlay.set('zIndex','1200');
- *
- * @type {Number}
- */
- zIndex: {
- view: 1
- },
- /**
- * Positionable element is by default visible false.
- * For compatibility in overlay and PopupMenu.
- * @default false
- * @ignore
- */
- visible: {
- view: true,
- value: true
- }
-};
-
-
-Position.prototype = {
- /**
- * Move to absolute position.
- * @param {Number|Number[]} x
- * @param {Number} [y]
- * @example
- *
- * move(x, y);
- * move(x);
- * move([x,y])
- *
- */
- move: function(x, y) {
- var self = this;
- if (BUI.isArray(x)) {
- y = x[1];
- x = x[0];
- }
- self.set('xy', [x, y]);
- return self;
- },
- //设置 x 坐标时,重置 left
- _uiSetX: function(v) {
- if (v != null) {
- var _self = this,
- el = _self.get('el');
- _self.setInternal('left', el.position().left);
- if (v != -999) {
- this.set('cachePosition', null);
- }
-
- }
-
- },
- //设置 y 坐标时,重置 top
- _uiSetY: function(v) {
- if (v != null) {
- var _self = this,
- el = _self.get('el');
- _self.setInternal('top', el.position().top);
- if (v != -999) {
- this.set('cachePosition', null);
- }
- }
- },
- //设置 left时,重置 x
- _uiSetLeft: function(v) {
- var _self = this,
- el = _self.get('el');
- if (v != null) {
- _self.setInternal('x', el.offset().left);
- }
- /*else{ //如果lef 为null,同时设置过left和top,那么取对应的值
- _self.setInternal('left',el.position().left);
- }*/
- },
- //设置top 时,重置y
- _uiSetTop: function(v) {
- var _self = this,
- el = _self.get('el');
- if (v != null) {
- _self.setInternal('y', el.offset().top);
- }
- /*else{ //如果lef 为null,同时设置过left和top,那么取对应的值
- _self.setInternal('top',el.position().top);
- }*/
- }
-};
-
-Position.View = PositionView;
-
-module.exports = Position;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/selection.js b/spm_modules/bui-common/1.1.2/src/component/uibase/selection.js
deleted file mode 100644
index 9a810d1..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/selection.js
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * @fileOverview 单选或者多选
- * @author dxq613@gmail.com
- * @ignore
- */
-var $ = require('jquery');
-var SINGLE_SELECTED = 'single';
-
-/**
- * @class BUI.Component.UIBase.Selection
- * 选中控件中的项(子元素或者DOM),此类选择的内容有2种
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * selectedEvent : 'mouseenter',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {String} [selectedEvent = 'click']
- */
- selectedEvent: {
- value: 'click'
- },
- events: {
- value: {
- /**
- * 选中的菜单改变时发生,
- * 多选时,选中,取消选中都触发此事件,单选时,只有选中时触发此事件
- * @name BUI.Component.UIBase.Selection#selectedchange
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- * @param {Boolean} e.selected 是否选中
- */
- 'selectedchange': false,
-
- /**
- * 选择改变前触发,可以通过return false,阻止selectedchange事件
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {Boolean} e.selected 是否选中
- */
- 'beforeselectedchange': false,
-
- /**
- * 菜单选中
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- */
- 'itemselected': false,
- /**
- * 菜单取消选中
- * @event
- * @param {Object} e 事件对象
- * @param {Object} e.item 当前选中的项
- * @param {HTMLElement} e.domTarget 当前选中的项的DOM结构
- */
- 'itemunselected': false
- }
- },
- /**
- * 数据的id字段名称,通过此字段查找对应的数据
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {String} [idField = 'id']
- */
- /**
- * 数据的id字段名称,通过此字段查找对应的数据
- * @type {String}
- * @ignore
- */
- idField: {
- value: 'id'
- },
- /**
- * 是否多选
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value',
- * render : '#t1',
- * multipleSelect : true,
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- *
- * @cfg {Boolean} [multipleSelect=false]
- */
- /**
- * 是否多选
- * @type {Boolean}
- * @default false
- */
- multipleSelect: {
- value: false
- }
-
-};
-
-selection.prototype =
-
-{
- /**
- * 清理选中的项
- *
- * list.clearSelection();
- *
- *
- */
- clearSelection: function() {
- var _self = this,
- selection = _self.getSelection();
- BUI.each(selection, function(item) {
- _self.clearSelected(item);
- });
- },
- /**
- * 获取选中的项的值
- * @template
- * @return {Array}
- */
- getSelection: function() {
-
- },
- /**
- * 获取选中的第一项
- *
- * var item = list.getSelected(); //多选模式下第一条
- *
- * @return {Object} 选中的第一项或者为undefined
- */
- getSelected: function() {
- return this.getSelection()[0];
- },
- /**
- * 根据 idField 获取到的值
- * @protected
- * @return {Object} 选中的值
- */
- getSelectedValue: function() {
- var _self = this,
- field = _self.get('idField'),
- item = _self.getSelected();
-
- return _self.getValueByField(item, field);
- },
- /**
- * 获取选中的值集合
- * @protected
- * @return {Array} 选中值得集合
- */
- getSelectionValues: function() {
- var _self = this,
- field = _self.get('idField'),
- items = _self.getSelection();
- return $.map(items, function(item) {
- return _self.getValueByField(item, field);
- });
- },
- /**
- * 获取选中的文本
- * @protected
- * @return {Array} 选中的文本集合
- */
- getSelectionText: function() {
- var _self = this,
- items = _self.getSelection();
- return $.map(items, function(item) {
- return _self.getItemText(item);
- });
- },
- /**
- * 移除选中
- *
- * var item = list.getItem('id'); //通过id 获取选项
- * list.setSelected(item); //选中
- *
- * list.clearSelected();//单选模式下清除所选,多选模式下清除选中的第一项
- * list.clearSelected(item); //清除选项的选中状态
- *
- * @param {Object} [item] 清除选项的选中状态,如果未指定则清除选中的第一个选项的选中状态
- */
- clearSelected: function(item) {
- var _self = this;
- item = item || _self.getSelected();
- if (item) {
- _self.setItemSelected(item, false);
- }
- },
- /**
- * 获取选项显示的文本
- * @protected
- */
- getSelectedText: function() {
- var _self = this,
- item = _self.getSelected();
- return _self.getItemText(item);
- },
- /**
- * 设置选中的项
- *
- * var items = list.getItemsByStatus('active'); //获取某种状态的选项
- * list.setSelection(items);
- *
- * @param {Array} items 项的集合
- */
- setSelection: function(items) {
- var _self = this;
-
- items = BUI.isArray(items) ? items : [items];
-
- BUI.each(items, function(item) {
- _self.setSelected(item);
- });
- },
- /**
- * 设置选中的项
- *
- * var item = list.getItem('id');
- * list.setSelected(item);
- *
- * @param {Object} item 记录或者子控件
- */
- setSelected: function(item) {
- var _self = this,
- multipleSelect = _self.get('multipleSelect');
-
- if (!_self.isItemSelectable(item)) {
- return;
- }
- if (!multipleSelect) {
- var selectedItem = _self.getSelected();
- if (item != selectedItem) {
- //如果是单选,清除已经选中的项
- _self.clearSelected(selectedItem);
- }
-
- }
- _self.setItemSelected(item, true);
-
- },
- /**
- * 选项是否被选中
- * @template
- * @param {*} item 选项
- * @return {Boolean} 是否选中
- */
- isItemSelected: function(item) {
-
- },
- /**
- * 选项是否可以选中
- * @protected
- * @param {*} item 选项
- * @return {Boolean} 选项是否可以选中
- */
- isItemSelectable: function(item) {
- return true;
- },
- /**
- * 设置选项的选中状态
- * @param {*} item 选项
- * @param {Boolean} selected 选中或者取消选中
- * @protected
- */
- setItemSelected: function(item, selected) {
- var _self = this,
- isSelected;
-
- //当前状态等于要设置的状态时,不触发改变事件
- if (item) {
- isSelected = _self.isItemSelected(item);
- if (isSelected == selected) {
- return;
- }
- }
- if (_self.fire('beforeselectedchange', {
- item: item,
- selected: selected
- }) !== false) {
- _self.setItemSelectedStatus(item, selected);
- }
- },
- /**
- * 设置选项的选中状态
- * @template
- * @param {*} item 选项
- * @param {Boolean} selected 选中或者取消选中
- * @protected
- */
- setItemSelectedStatus: function(item, selected) {
-
- },
- /**
- * 设置所有选项选中
- *
- * list.setAllSelection(); //选中全部,多选状态下有效
- *
- * @template
- */
- setAllSelection: function() {
-
- },
- /**
- * 设置项选中,通过字段和值
- * @param {String} field 字段名,默认为配置项'idField',所以此字段可以不填写,仅填写值
- * @param {Object} value 值
- * @example
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{id}">{text}</li>',
- * idField : 'id', //id 字段作为key
- * render : '#t1',
- * items : [{id : '1',text : '1'},{id : '2',text : '2'}]
- * });
- *
- * list.setSelectedByField('123'); //默认按照id字段查找
- * //或者
- * list.setSelectedByField('id','123');
- *
- * list.setSelectedByField('value','123');
- *
- */
- setSelectedByField: function(field, value) {
- if (!value) {
- value = field;
- field = this.get('idField');
- }
- var _self = this,
- item = _self.findItemByField(field, value);
- _self.setSelected(item);
- },
- /**
- * 设置多个选中,根据字段和值
- *
- * var list = new List.SimpleList({
- * itemTpl : '<li id="{value}">{text}</li>',
- * idField : 'value', //value 字段作为key
- * render : '#t1',
- * multipleSelect : true,
- * items : [{value : '1',text : '1'},{value : '2',text : '2'}]
- * });
- * var values = ['1','2','3'];
- * list.setSelectionByField(values);//
- *
- * //等于
- * list.setSelectionByField('value',values);
- *
- * @param {String} field 默认为idField
- * @param {Array} values 值得集合
- */
- setSelectionByField: function(field, values) {
- if (!values) {
- values = field;
- field = this.get('idField');
- }
- var _self = this;
- BUI.each(values, function(value) {
- _self.setSelectedByField(field, value);
- });
- },
- /**
- * 选中完成后,触发事件
- * @protected
- * @param {*} item 选项
- * @param {Boolean} selected 是否选中
- * @param {jQuery} element
- */
- afterSelected: function(item, selected, element) {
- var _self = this;
-
- if (selected) {
- _self.fire('itemselected', {
- item: item,
- domTarget: element
- });
- _self.fire('selectedchange', {
- item: item,
- domTarget: element,
- selected: selected
- });
- } else {
- _self.fire('itemunselected', {
- item: item,
- domTarget: element
- });
- if (_self.get('multipleSelect')) { //只有当多选时,取消选中才触发selectedchange
- _self.fire('selectedchange', {
- item: item,
- domTarget: element,
- selected: selected
- });
- }
- }
- }
-
-}
-
-module.exports = selection;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/stdmod.js b/spm_modules/bui-common/1.1.2/src/component/uibase/stdmod.js
deleted file mode 100644
index 85a08cc..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/stdmod.js
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * @fileOverview
- * 控件包含头部(head)、内容(content)和尾部(foot)
- * @ignore
- */
-
-var $ = require('jquery'),
- CLS_PREFIX = BUI.prefix + 'stdmod-';
-
-
-/**
- * 标准模块组织的视图类
- * @class BUI.Component.UIBase.StdModView
- * @private
- */
-function StdModView() {}
-
-StdModView.ATTRS = {
- header: {},
- body: {},
- footer: {},
- bodyStyle: {},
- footerStyle: {},
- headerStyle: {},
- headerContent: {},
- bodyContent: {},
- footerContent: {}
-};
-
-StdModView.PARSER = {
- header: function(el) {
- return el.one("." + CLS_PREFIX + "header");
- },
- body: function(el) {
- return el.one("." + CLS_PREFIX + "body");
- },
- footer: function(el) {
- return el.one("." + CLS_PREFIX + "footer");
- }
-}; /**/
-
-function createUI(self, part) {
- var el = self.get('contentEl'),
- partEl = self.get(part);
- if (!partEl) {
- partEl = $('
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} headerContent
- */
- /**
- * 控件头部的html
- * @type {jQuery|String}
- */
- headerContent: {
- view: 1
- },
- /**
- * 控件内容的html
- *
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} bodyContent
- */
- /**
- * 控件内容的html
- * @type {jQuery|String}
- */
- bodyContent: {
- view: 1
- },
- /**
- * 控件底部的html
- *
- * var dialog = new Dialog({
- * headerContent: '<div class="header"></div>',
- * bodyContent : '#c1',
- * footerContent : '<div class="footer"></div>'
- * });
- * dialog.show();
- *
- * @cfg {jQuery|String} footerContent
- */
- /**
- * 控件底部的html
- * @type {jQuery|String}
- */
- footerContent: {
- view: 1
- }
-};
-
-StdMod.View = StdModView;
-
-module.exports = StdMod;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/tpl.js b/spm_modules/bui-common/1.1.2/src/component/uibase/tpl.js
deleted file mode 100644
index ae1e9d6..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/tpl.js
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * @fileOverview 控件模板
- * @author dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery');
-
-/**
- * @private
- * 控件模板扩展类的渲染类(view)
- * @class BUI.Component.UIBase.TplView
- */
-function tplView() {
-
-}
-
-tplView.ATTRS = {
- /**
- * 模板
- * @protected
- * @type {String}
- */
- tpl: {
-
- },
- tplEl: {
-
- }
-};
-
-tplView.prototype = {
- __renderUI: function() {
- var _self = this,
- contentContainer = _self.get('childContainer'),
- contentEl;
-
- if (contentContainer) {
- contentEl = _self.get('el').find(contentContainer);
- if (contentEl.length) {
- _self.set('contentEl', contentEl);
- }
- }
- },
- /**
- * 获取生成控件的模板
- * @protected
- * @param {Object} attrs 属性值
- * @return {String} 模板
- */
- getTpl: function(attrs) {
- var _self = this,
- tpl = _self.get('tpl'),
- tplRender = _self.get('tplRender');
- attrs = attrs || _self.getAttrVals();
-
- if (tplRender) {
- return tplRender(attrs);
- }
- if (tpl) {
- return BUI.substitute(tpl, attrs);
- }
- return '';
- },
- /**
- * 如果控件设置了模板,则根据模板和属性值生成DOM
- * 如果设置了content属性,此模板不应用
- * @protected
- * @param {Object} attrs 属性值,默认为初始化时传入的值
- */
- setTplContent: function(attrs) {
- var _self = this,
- el = _self.get('el'),
- content = _self.get('content'),
- tplEl = _self.get('tplEl'),
- tpl = _self.getTpl(attrs);
-
- //tplEl.remove();
- if (!content && tpl) { //替换掉原先的内容
- el.empty();
- el.html(tpl);
- /*if(tplEl){
- var node = $(tpl).insertBefore(tplEl);
- tplEl.remove();
- tplEl = node;
- }else{
- tplEl = $(tpl).appendTo(el);
- }
- _self.set('tplEl',tplEl)
- */
- }
- }
-}
-
-/**
- * 控件的模板扩展
- * @class BUI.Component.UIBase.Tpl
- */
-function tpl() {
-
-}
-
-tpl.ATTRS = {
- /**
- * 控件的模版,用于初始化
- *
- * var list = new List.List({
- * tpl : '<div class="toolbar"></div><ul></ul>',
- * childContainer : 'ul'
- * });
- * //用于统一子控件模板
- * var list = new List.List({
- * defaultChildCfg : {
- * tpl : '<span>{text}</span>'
- * }
- * });
- * list.render();
- *
- * @cfg {String} tpl
- */
- /**
- * 控件的模板
- *
- * list.set('tpl','<div class="toolbar"></div><ul></ul><div class="bottom"></div>')
- *
- * @type {String}
- */
- tpl: {
- view: true,
- sync: false
- },
- /**
- * 控件的渲染函数,应对一些简单模板解决不了的问题,例如有if,else逻辑,有循环逻辑, - * 函数原型是function(data){},其中data是控件的属性值
- *控件模板的加强模式,此属性会覆盖@see {BUI.Component.UIBase.Tpl#property-tpl}属性
- * //用于统一子控件模板 - * var list = new List.List({ - * defaultChildCfg : { - * tplRender : funciton(item){ - * if(item.type == '1'){ - * return 'type1 html'; - * }else{ - * return 'type2 html'; - * } - * } - * } - * }); - * list.render(); - * @cfg {Function} tplRender - */ - tplRender: { - view: true, - value: null - }, - /** - * 这是一个选择器,使用了模板后,子控件可能会添加到模板对应的位置, - * - 默认为null,此时子控件会将控件最外层 el 作为容器 - *
- * var list = new List.List({
- * tpl : '<div class="toolbar"></div><ul></ul>',
- * childContainer : 'ul'
- * });
- *
- * @cfg {String} childContainer
- */
- childContainer: {
- view: true
- }
-};
-
-tpl.prototype = {
-
- __renderUI: function() {
- //使用srcNode时,不使用模板
- if (!this.get('srcNode')) {
- this.setTplContent();
- }
- },
- /**
- * 控件信息发生改变时,控件内容跟模板相关时需要调用这个函数,
- * 重新通过模板和控件信息构造内容
- */
- updateContent: function() {
- this.setTplContent();
- },
- /**
- * 根据控件的属性和模板生成控件内容
- * @protected
- */
- setTplContent: function() {
- var _self = this,
- attrs = _self.getAttrVals();
- _self.get('view').setTplContent(attrs);
- },
- //模板发生改变
- _uiSetTpl: function() {
- this.setTplContent();
- }
-};
-
-tpl.View = tplView;
-
-module.exports = tpl;
diff --git a/spm_modules/bui-common/1.1.2/src/component/uibase/uibase.js b/spm_modules/bui-common/1.1.2/src/component/uibase/uibase.js
deleted file mode 100644
index d3add3e..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/uibase/uibase.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @fileOverview uibase的入口文件
- * @ignore
- */
-var UIBase = require('./base');
-
-BUI.mix(UIBase, {
- Align: require('./align'),
- AutoShow: require('./autoshow'),
- AutoHide: require('./autohide'),
- Close: require('./close'),
- Collapsable: require('./collapsable'),
- Drag: require('./drag'),
- KeyNav: require('./keynav'),
- List: require('./list'),
- ListItem: require('./listitem'),
- Mask: require('./mask'),
- Position: require('./position'),
- Selection: require('./selection'),
- StdMod: require('./stdmod'),
- Decorate: require('./decorate'),
- Tpl: require('./tpl'),
- ChildCfg: require('./childcfg'),
- Bindable: require('./bindable'),
- Depends: require('./depends')
-});
-
-BUI.mix(UIBase, {
- CloseView: UIBase.Close.View,
- CollapsableView: UIBase.Collapsable.View,
- ChildList: UIBase.List.ChildList,
- /*DomList : UIBase.List.DomList,
- DomListView : UIBase.List.DomList.View,*/
- ListItemView: UIBase.ListItem.View,
- MaskView: UIBase.Mask.View,
- PositionView: UIBase.Position.View,
- StdModView: UIBase.StdMod.View,
- TplView: UIBase.Tpl.View
-});
-
-module.exports = UIBase;
diff --git a/spm_modules/bui-common/1.1.2/src/component/view.js b/spm_modules/bui-common/1.1.2/src/component/view.js
deleted file mode 100644
index 18505e3..0000000
--- a/spm_modules/bui-common/1.1.2/src/component/view.js
+++ /dev/null
@@ -1,447 +0,0 @@
-/**
- * @fileOverview 控件的视图层
- * @author yiminghe@gmail.com
- * copied by dxq613@gmail.com
- * @ignore
- */
-
-var $ = require('jquery'),
- win = window,
- Manager = require('./manage'),
- UIBase = require('./uibase/uibase'), //BUI.Component.UIBase,
- doc = document;
-
-/**
- * 控件的视图层基类
- * @class BUI.Component.View
- * @protected
- * @extends BUI.Component.UIBase
- * @mixins BUI.Component.UIBase.TplView
- */
-var View = UIBase.extend([UIBase.TplView], {
-
- /**
- * Get all css class name to be applied to the root element of this component for given state.
- * the css class names are prefixed with component name.
- * @param {String} [state] This component's state info.
- */
- getComponentCssClassWithState: function(state) {
- var self = this,
- componentCls = self.get('ksComponentCss');
- state = state || '';
- return self.getCssClassWithPrefix(componentCls.split(/\s+/).join(state + ' ') + state);
- },
-
- /**
- * Get full class name (with prefix) for current component
- * @param classes {String} class names without prefixCls. Separated by space.
- * @method
- * @return {String} class name with prefixCls
- * @private
- */
- getCssClassWithPrefix: Manager.getCssClassWithPrefix,
-
- /**
- * Returns the dom element which is responsible for listening keyboard events.
- * @return {jQuery}
- */
- getKeyEventTarget: function() {
- return this.get('el');
- },
- /**
- * Return the dom element into which child component to be rendered.
- * @return {jQuery}
- */
- getContentElement: function() {
- return this.get('contentEl') || this.get('el');
- },
- /**
- * 获取状态对应的css样式
- * @param {String} name 状态名称 例如:hover,disabled等等
- * @return {String} 状态样式
- */
- getStatusCls: function(name) {
- var self = this,
- statusCls = self.get('statusCls'),
- cls = statusCls[name];
- if (!cls) {
- cls = self.getComponentCssClassWithState('-' + name);
- }
- return cls;
- },
- /**
- * 渲染控件
- * @protected
- */
- renderUI: function() {
- var self = this;
-
- // 新建的节点才需要摆放定位,不支持srcNode模式
- if (!self.get('srcNode')) {
- var render = self.get('render'),
- el = self.get('el'),
- renderBefore = self.get('elBefore');
- if (renderBefore) {
- el.insertBefore(renderBefore, undefined);
- } else if (render) {
- el.appendTo(render, undefined);
- } else {
- el.appendTo(doc.body, undefined);
- }
- }
- },
- /**
- * 只负责建立节点,如果是 decorate 过来的,甚至内容会丢失
- * @protected
- * 通过 render 来重建原有的内容
- */
- createDom: function() {
- var self = this,
- contentEl = self.get('contentEl'),
- el = self.get('el');
- if (!self.get('srcNode')) {
-
- el = $('<' + self.get('elTagName') + '>');
-
- if (contentEl) {
- el.append(contentEl);
- }
-
- self.setInternal('el', el);
- }
-
- el.addClass(self.getComponentCssClassWithState());
- if (!contentEl) {
- // 没取到,这里设下值, uiSet 时可以 set('content') 取到
- self.setInternal('contentEl', el);
- }
- },
- /**
- * 设置高亮显示
- * @protected
- */
- _uiSetHighlighted: function(v) {
- var self = this,
- componentCls = self.getStatusCls('hover'),
- el = self.get('el');
- el[v ? 'addClass' : 'removeClass'](componentCls);
- },
-
- /**
- * 设置禁用
- * @protected
- */
- _uiSetDisabled: function(v) {
- var self = this,
- componentCls = self.getStatusCls('disabled'),
- el = self.get('el');
- el[v ? 'addClass' : 'removeClass'](componentCls)
- .attr('aria-disabled', v);
-
- //如果禁用控件时,处于hover状态,则清除
- if (v && self.get('highlighted')) {
- self.set('highlighted', false);
- }
-
- if (self.get('focusable')) {
- //不能被 tab focus 到
- self.getKeyEventTarget().attr('tabIndex', v ? -1 : 0);
- }
- },
- /**
- * 设置激活状态
- * @protected
- */
- _uiSetActive: function(v) {
- var self = this,
- componentCls = self.getStatusCls('active');
- self.get('el')[v ? 'addClass' : 'removeClass'](componentCls)
- .attr('aria-pressed', !!v);
- },
- /**
- * 设置获得焦点
- * @protected
- */
- _uiSetFocused: function(v) {
- var self = this,
- el = self.get('el'),
- componentCls = self.getStatusCls('focused');
- el[v ? 'addClass' : 'removeClass'](componentCls);
- },
- /**
- * 设置控件最外层DOM的属性
- * @protected
- */
- _uiSetElAttrs: function(attrs) {
- this.get('el').attr(attrs);
- },
- /**
- * 设置应用到控件最外层DOM的css class
- * @protected
- */
- _uiSetElCls: function(cls) {
- this.get('el').addClass(cls);
- },
- /**
- * 设置应用到控件最外层DOM的css style
- * @protected
- */
- _uiSetElStyle: function(style) {
- this.get('el').css(style);
- },
- //设置role
- _uiSetRole: function(role) {
- if (role) {
- this.get('el').attr('role', role);
- }
- },
- /**
- * 设置应用到控件宽度
- * @protected
- */
- _uiSetWidth: function(w) {
- this.get('el').width(w);
- },
- /**
- * 设置应用到控件高度
- * @protected
- */
- _uiSetHeight: function(h) {
- var self = this;
- self.get('el').height(h);
- },
- /**
- * 设置应用到控件的内容
- * @protected
- */
- _uiSetContent: function(c) {
- var self = this,
- el;
- // srcNode 时不重新渲染 content
- // 防止内部有改变,而 content 则是老的 html 内容
- if (self.get('srcNode') && !self.get('rendered')) {} else {
- el = self.get('contentEl');
- if (typeof c == 'string') {
- el.html(c);
- } else if (c) {
- el.empty().append(c);
- }
- }
- },
- /**
- * 设置应用到控件是否可见
- * @protected
- */
- _uiSetVisible: function(isVisible) {
- var self = this,
- el = self.get('el'),
- visibleMode = self.get('visibleMode');
- if (visibleMode === 'visibility') {
- el.css('visibility', isVisible ? 'visible' : 'hidden');
- } else {
- el.css('display', isVisible ? '' : 'none');
- }
- },
- set: function(name, value) {
- var _self = this,
- attr = _self.__attrs[name],
- ev,
- ucName,
- m;
-
- if (!attr || !_self.get('binded')) { //未初始化view或者没用定义属性
- View.superclass.set.call(this, name, value);
- return _self;
- }
-
- var prevVal = View.superclass.get.call(this, name);
-
- //如果未改变值不进行修改
- if (!$.isPlainObject(value) && !BUI.isArray(value) && prevVal === value) {
- return _self;
- }
- View.superclass.set.call(this, name, value);
-
- value = _self.__attrVals[name];
- ev = {
- attrName: name,
- prevVal: prevVal,
- newVal: value
- };
- ucName = BUI.ucfirst(name);
- m = '_uiSet' + ucName;
- if (_self[m]) {
- _self[m](value, ev);
- }
-
- return _self;
-
- },
- /**
- * 析构函数
- * @protected
- */
- destructor: function() {
- var el = this.get('el');
- if (el) {
- el.remove();
- }
- }
-}, {
- xclass: 'view',
- priority: 0
-});
-
-
-View.ATTRS = {
- /**
- * 控件根节点
- * @readOnly
- * see {@link BUI.Component.Controller#property-el}
- */
- el: {
- /**
- * @private
- */
- setter: function(v) {
- return $(v);
- }
- },
-
- /**
- * 控件根节点样式
- * see {@link BUI.Component.Controller#property-elCls}
- */
- elCls: {},
- /**
- * 控件根节点样式属性
- * see {@link BUI.Component.Controller#property-elStyle}
- */
- elStyle: {},
- /**
- * ARIA 标准中的role
- * @type {String}
- */
- role: {
-
- },
- /**
- * 控件宽度
- * see {@link BUI.Component.Controller#property-width}
- */
- width: {},
- /**
- * 控件高度
- * see {@link BUI.Component.Controller#property-height}
- */
- height: {},
- /**
- * 状态相关的样式,默认情况下会使用 前缀名 + xclass + '-' + 状态名
- * see {@link BUI.Component.Controller#property-statusCls}
- * @type {Object}
- */
- statusCls: {
- value: {}
- },
- /**
- * 控件根节点使用的标签
- * @type {String}
- */
- elTagName: {
- // 生成标签名字
- value: 'div'
- },
- /**
- * 控件根节点属性
- * see {@link BUI.Component.Controller#property-elAttrs}
- * @ignore
- */
- elAttrs: {},
- /**
- * 控件内容,html,文本等
- * see {@link BUI.Component.Controller#property-content}
- */
- content: {},
- /**
- * 控件插入到指定元素前
- * see {@link BUI.Component.Controller#property-tpl}
- */
- elBefore: {
- // better named to renderBefore, too late !
- },
- /**
- * 控件在指定元素内部渲染
- * see {@link BUI.Component.Controller#property-render}
- * @ignore
- */
- render: {},
- /**
- * 是否可见
- * see {@link BUI.Component.Controller#property-visible}
- */
- visible: {
- value: true
- },
- /**
- * 可视模式
- * see {@link BUI.Component.Controller#property-visibleMode}
- */
- visibleMode: {
- value: 'display'
- },
- /**
- * @private
- * 缓存隐藏时的位置,对应visibleMode = 'visiblity' 的场景
- * @type {Object}
- */
- cachePosition: {
-
- },
- /**
- * content 设置的内容节点,默认根节点
- * @type {jQuery}
- * @default el
- */
- contentEl: {
- valueFn: function() {
- return this.get('el');
- }
- },
- /**
- * 样式前缀
- * see {@link BUI.Component.Controller#property-prefixCls}
- */
- prefixCls: {
- value: BUI.prefix
- },
- /**
- * 可以获取焦点
- * @protected
- * see {@link BUI.Component.Controller#property-focusable}
- */
- focusable: {
- value: true
- },
- /**
- * 获取焦点
- * see {@link BUI.Component.Controller#property-focused}
- */
- focused: {},
- /**
- * 激活
- * see {@link BUI.Component.Controller#property-active}
- */
- active: {},
- /**
- * 禁用
- * see {@link BUI.Component.Controller#property-disabled}
- */
- disabled: {},
- /**
- * 高亮显示
- * see {@link BUI.Component.Controller#property-highlighted}
- */
- highlighted: {}
-};
-
-module.exports = View;
diff --git a/spm_modules/bui-common/1.1.2/src/date.js b/spm_modules/bui-common/1.1.2/src/date.js
deleted file mode 100644
index eadecc2..0000000
--- a/spm_modules/bui-common/1.1.2/src/date.js
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * @fileOverview Date Format 1.2.3
- * @ignore
- * (c) 2007-2009 Steven Levithan
- * var control = new Control();
- * control.on('click',function(ev){
- *
- * });
- *
- * control.off(); //移除所有事件
- *
- * @class BUI.Observable
- * @abstract
- * @param {Object} config 配置项键值对
- */
-var Observable = function(config) {
- this._events = [];
- this._eventMap = {};
- this._bubblesEvents = [];
- this._initEvents(config);
-};
-
-BUI.augment(Observable, {
-
- /**
- * @cfg {Object} listeners
- * 初始化事件,快速注册事件
- *
- * var list = new BUI.List.SimpleList({
- * listeners : {
- * itemclick : function(ev){},
- * itemrendered : function(ev){}
- * },
- * items : []
- * });
- * list.render();
- *
- */
-
- /**
- * @cfg {Function} handler
- * 点击事件的处理函数,快速配置点击事件而不需要写listeners属性
- *
- * var list = new BUI.List.SimpleList({
- * handler : function(ev){} //click 事件
- * });
- * list.render();
- *
- */
-
- /**
- * 支持的事件名列表
- * @private
- */
- _events: [],
-
- /**
- * 绑定的事件
- * @private
- */
- _eventMap: {},
-
- _bubblesEvents: [],
-
- _bubbleTarget: null,
-
- //获取回调集合
- _getCallbacks: function(eventType) {
- var _self = this,
- eventMap = _self._eventMap;
- return eventMap[eventType];
- },
- //初始化事件列表
- _initEvents: function(config) {
- var _self = this,
- listeners = null;
-
- if (!config) {
- return;
- }
- listeners = config.listeners || {};
- if (config.handler) {
- listeners.click = config.handler;
- }
- if (listeners) {
- for (var name in listeners) {
- if (listeners.hasOwnProperty(name)) {
- _self.on(name, listeners[name]);
- }
- };
- }
- },
- //事件是否支持冒泡
- _isBubbles: function(eventType) {
- return ArrayUtil.indexOf(eventType, this._bubblesEvents) >= 0;
- },
- /**
- * 添加冒泡的对象
- * @protected
- * @param {Object} target 冒泡的事件源
- */
- addTarget: function(target) {
- this._bubbleTarget = target;
- },
- /**
- * 添加支持的事件
- * @protected
- * @param {String|String[]} events 事件
- */
- addEvents: function(events) {
- var _self = this,
- existEvents = _self._events,
- eventMap = _self._eventMap;
-
- function addEvent(eventType) {
- if (ArrayUtil.indexOf(eventType, existEvents) === -1) {
- eventMap[eventType] = getCallbacks();
- existEvents.push(eventType);
- }
- }
- if (BUI.isArray(events)) {
- BUI.each(events, function(eventType) {
- addEvent(eventType);
- });
- } else {
- addEvent(events);
- }
- },
- /**
- * 移除所有绑定的事件
- * @protected
- */
- clearListeners: function() {
- var _self = this,
- eventMap = _self._eventMap;
- for (var name in eventMap) {
- if (eventMap.hasOwnProperty(name)) {
- eventMap[name].empty();
- }
- }
- },
- /**
- * 触发事件
- *
- * //绑定事件
- * list.on('itemclick',function(ev){
- * alert('21');
- * });
- * //触发事件
- * list.fire('itemclick');
- *
- * @param {String} eventType 事件类型
- * @param {Object} eventData 事件触发时传递的数据
- * @return {Boolean|undefined} 如果其中一个事件处理器返回 false , 则返回 false, 否则返回最后一个事件处理器的返回值
- */
- fire: function(eventType, eventData) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType),
- args = $.makeArray(arguments),
- result;
- if (!eventData) {
- eventData = {};
- args.push(eventData);
- }
- if (!eventData.target) {
- eventData.target = _self;
- }
- if (callbacks) {
- result = callbacks.fireWith(_self, Array.prototype.slice.call(args, 1));
- }
- if (_self._isBubbles(eventType)) {
- var bubbleTarget = _self._bubbleTarget;
- if (bubbleTarget && bubbleTarget.fire) {
- bubbleTarget.fire(eventType, eventData);
- }
- }
- return result;
- },
- /**
- * 暂停事件的执行
- *
- * list.pauseEvent('itemclick');
- *
- * @param {String} eventType 事件类型
- */
- pauseEvent: function(eventType) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- callbacks && callbacks.pause();
- },
- /**
- * 唤醒事件
- *
- * list.resumeEvent('itemclick');
- *
- * @param {String} eventType 事件类型
- */
- resumeEvent: function(eventType) {
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- callbacks && callbacks.resume();
- },
- /**
- * 添加绑定事件
- *
- * //绑定单个事件
- * list.on('itemclick',function(ev){
- * alert('21');
- * });
- * //绑定多个事件
- * list.on('itemrendered itemupdated',function(){
- * //列表项创建、更新时触发操作
- * });
- *
- * @param {String} eventType 事件类型
- * @param {Function} fn 回调函数
- */
- on: function(eventType, fn) {
- //一次监听多个事件
- var arr = eventType.split(' '),
- _self = this,
- callbacks = null;
- if (arr.length > 1) {
- BUI.each(arr, function(name) {
- _self.on(name, fn);
- });
- } else {
- callbacks = _self._getCallbacks(eventType);
- if (callbacks) {
- callbacks.add(fn);
- } else {
- _self.addEvents(eventType);
- _self.on(eventType, fn);
- }
- }
- return _self;
- },
- /**
- * 移除绑定的事件
- *
- * //移除所有事件
- * list.off();
- *
- * //移除特定事件
- * function callback(ev){}
- * list.on('click',callback);
- *
- * list.off('click',callback);//需要保存回调函数的引用
- *
- *
- * @param {String} eventType 事件类型
- * @param {Function} fn 回调函数
- */
- off: function(eventType, fn) {
- if (!eventType && !fn) {
- this.clearListeners();
- return this;
- }
- var _self = this,
- callbacks = _self._getCallbacks(eventType);
- if (callbacks) {
- if (fn) {
- callbacks.remove(fn);
- } else {
- callbacks.empty();
- }
-
- }
- return _self;
- },
- /**
- * 配置事件是否允许冒泡
- * @protected
- * @param {String} eventType 支持冒泡的事件
- * @param {Object} cfg 配置项
- * @param {Boolean} cfg.bubbles 是否支持冒泡
- */
- publish: function(eventType, cfg) {
- var _self = this,
- bubblesEvents = _self._bubblesEvents;
-
- if (cfg.bubbles) {
- if (BUI.Array.indexOf(eventType, bubblesEvents) === -1) {
- bubblesEvents.push(eventType);
- }
- } else {
- var index = BUI.Array.indexOf(eventType, bubblesEvents);
- if (index !== -1) {
- bubblesEvents.splice(index, 1);
- }
- }
- }
-});
-
-module.exports = Observable;
diff --git a/spm_modules/bui-common/1.1.2/src/ua.js b/spm_modules/bui-common/1.1.2/src/ua.js
deleted file mode 100644
index f3c3300..0000000
--- a/spm_modules/bui-common/1.1.2/src/ua.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * @fileOverview UA,jQuery的 $.browser 对象非常难使用
- * @ignore
- * @author dxq613@gmail.com
- */
-
-var $ = require('jquery');
-
-function numberify(s) {
- var c = 0;
- // convert '1.2.3.4' to 1.234
- return parseFloat(s.replace(/\./g, function() {
- return (c++ === 0) ? '.' : '';
- }));
-};
-
-function uaMatch(s) {
- s = s.toLowerCase();
- var r = /(chrome)[ \/]([\w.]+)/.exec(s) || /(webkit)[ \/]([\w.]+)/.exec(s) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(s) || /(msie) ([\w.]+)/.exec(s) || s.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(s) || [],
- a = {
- browser: r[1] || "",
- version: r[2] || "0"
- },
- b = {};
- a.browser && (b[a.browser] = !0, b.version = a.version),
- b.chrome ? b.webkit = !0 : b.webkit && (b.safari = !0);
- return b;
-}
-
-var UA = $.UA || (function() {
- var browser = $.browser || uaMatch(navigator.userAgent),
- versionNumber = numberify(browser.version),
- /**
- * 浏览器版本检测
- * @class BUI.UA
- * @singleton
- */
- ua = {
- /**
- * ie 版本
- * @type {Number}
- */
- ie: browser.msie && versionNumber,
-
- /**
- * webkit 版本
- * @type {Number}
- */
- webkit: browser.webkit && versionNumber,
- /**
- * opera 版本
- * @type {Number}
- */
- opera: browser.opera && versionNumber,
- /**
- * mozilla 火狐版本
- * @type {Number}
- */
- mozilla: browser.mozilla && versionNumber
- };
- return ua;
-})();
-
-module.exports = UA;
diff --git a/spm_modules/bui-common/1.1.2/src/util.js b/spm_modules/bui-common/1.1.2/src/util.js
deleted file mode 100644
index 036eb8d..0000000
--- a/spm_modules/bui-common/1.1.2/src/util.js
+++ /dev/null
@@ -1,704 +0,0 @@
-/**
- * @class BUI
- * 控件库的工具方法,这些工具方法直接绑定到BUI对象上
- *
- * BUI.isString(str);
- *
- * BUI.extend(A,B);
- *
- * BUI.mix(A,{a:'a'});
- *
- * @singleton
- */
-
-var $ = require('jquery');
-
-//兼容jquery 1.6以下
-(function($) {
- if ($.fn) {
- $.fn.on = $.fn.on || $.fn.bind;
- $.fn.off = $.fn.off || $.fn.unbind;
- }
-})($);
-/**
- * @ignore
- * 处于效率的目的,复制属性
- */
-function mixAttrs(to, from) {
-
- for (var c in from) {
- if (from.hasOwnProperty(c)) {
- to[c] = to[c] || {};
- mixAttr(to[c], from[c]);
- }
- }
-
-}
-//合并属性
-function mixAttr(attr, attrConfig) {
- for (var p in attrConfig) {
- if (attrConfig.hasOwnProperty(p)) {
- if (p == 'value') {
- if (BUI.isObject(attrConfig[p])) {
- attr[p] = attr[p] || {};
- BUI.mix( /*true,*/ attr[p], attrConfig[p]);
- } else if (BUI.isArray(attrConfig[p])) {
- attr[p] = attr[p] || [];
- //BUI.mix(/*true,*/attr[p], attrConfig[p]);
- attr[p] = attr[p].concat(attrConfig[p]);
- } else {
- attr[p] = attrConfig[p];
- }
- } else {
- attr[p] = attrConfig[p];
- }
- }
- };
-}
-
-var win = window,
- doc = document,
- objectPrototype = Object.prototype,
- toString = objectPrototype.toString,
- BODY = 'body',
- DOC_ELEMENT = 'documentElement',
- SCROLL = 'scroll',
- SCROLL_WIDTH = SCROLL + 'Width',
- SCROLL_HEIGHT = SCROLL + 'Height',
- ATTRS = 'ATTRS',
- PARSER = 'PARSER',
- GUID_DEFAULT = 'guid';
-
-window.BUI = window.BUI || {};
-
-$.extend(BUI, {
- /**
- * 版本号
- * @memberOf BUI
- * @type {Number}
- */
- version: '1.1.0',
- /**
- * 是否为函数
- * @param {*} fn 对象
- * @return {Boolean} 是否函数
- */
- isFunction: function(fn) {
- return typeof(fn) === 'function';
- },
- /**
- * 是否数组
- * @method
- * @param {*} obj 是否数组
- * @return {Boolean} 是否数组
- */
- isArray: ('isArray' in Array) ? Array.isArray : function(value) {
- return toString.call(value) === '[object Array]';
- },
- /**
- * 是否日期
- * @param {*} value 对象
- * @return {Boolean} 是否日期
- */
- isDate: function(value) {
- return toString.call(value) === '[object Date]';
- },
- /**
- * 是否是javascript对象
- * @param {Object} value The value to test
- * @return {Boolean}
- * @method
- */
- isObject: (toString.call(null) === '[object Object]') ?
- function(value) {
- // check ownerDocument here as well to exclude DOM nodes
- return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
- } : function(value) {
- return toString.call(value) === '[object Object]';
- },
- /**
- * 是否是数字或者数字字符串
- * @param {String} value 数字字符串
- * @return {Boolean} 是否是数字或者数字字符串
- */
- isNumeric: function(value) {
- return !isNaN(parseFloat(value)) && isFinite(value);
- },
- /**
- * 将指定的方法或属性放到构造函数的原型链上,
- * 函数支持多于2个变量,后面的变量同s1一样将其成员复制到构造函数的原型链上。
- * @param {Function} r 构造函数
- * @param {Object} s1 将s1 的成员复制到构造函数的原型链上
- * @example
- * BUI.augment(class1,{
- * method1: function(){
- *
- * }
- * });
- */
- augment: function(r, s1) {
- if (!BUI.isFunction(r)) {
- return r;
- }
- for (var i = 1; i < arguments.length; i++) {
- BUI.mix(r.prototype, arguments[i].prototype || arguments[i]);
- };
- return r;
- },
- /**
- * 拷贝对象
- * @param {Object} obj 要拷贝的对象
- * @return {Object} 拷贝生成的对象
- */
- cloneObject: function(obj) {
- var result = BUI.isArray(obj) ? [] : {};
-
- return BUI.mix(true, result, obj);
- },
- /**
- * 抛出错误
- */
- error: function(msg) {
- if (BUI.debug) {
- throw msg;
- }
- },
-
- /**
- * 实现类的继承,通过父类生成子类
- * @param {Function} subclass
- * @param {Function} superclass 父类构造函数
- * @param {Object} overrides 子类的属性或者方法
- * @return {Function} 返回的子类构造函数
- * 示例:
- * @example
- * //父类
- * function base(){
- *
- * }
- *
- * function sub(){
- *
- * }
- * //子类
- * BUI.extend(sub,base,{
- * method : function(){
- *
- * }
- * });
- *
- * //或者
- * var sub = BUI.extend(base,{});
- */
- extend: function(subclass, superclass, overrides, staticOverrides) {
- //如果只提供父类构造函数,则自动生成子类构造函数
- if (!BUI.isFunction(superclass)) {
-
- overrides = superclass;
- superclass = subclass;
- subclass = function() {};
- }
-
- var create = Object.create ?
- function(proto, c) {
- return Object.create(proto, {
- constructor: {
- value: c
- }
- });
- } :
- function(proto, c) {
- function F() {}
-
- F.prototype = proto;
-
- var o = new F();
- o.constructor = c;
- return o;
- };
- var superObj = create(superclass.prototype, subclass); //new superclass(),//实例化父类作为子类的prototype
- subclass.prototype = BUI.mix(superObj, subclass.prototype); //指定子类的prototype
- subclass.superclass = create(superclass.prototype, superclass);
- BUI.mix(superObj, overrides);
- BUI.mix(subclass, staticOverrides);
- return subclass;
- },
- /**
- * 生成唯一的Id
- * @method
- * @param {String} prefix 前缀
- * @default 'bui-guid'
- * @return {String} 唯一的编号
- */
- guid: (function() {
- var map = {};
- return function(prefix) {
- prefix = prefix || BUI.prefix + GUID_DEFAULT;
- if (!map[prefix]) {
- map[prefix] = 1;
- } else {
- map[prefix] += 1;
- }
- return prefix + map[prefix];
- };
- })(),
- /**
- * 判断是否是字符串
- * @return {Boolean} 是否是字符串
- */
- isString: function(value) {
- return typeof value === 'string';
- },
- /**
- * 判断是否数字,由于$.isNumberic方法会把 '123'认为数字
- * @return {Boolean} 是否数字
- */
- isNumber: function(value) {
- return typeof value === 'number';
- },
- /**
- * 是否是布尔类型
- *
- * @param {Object} value 测试的值
- * @return {Boolean}
- */
- isBoolean: function(value) {
- return typeof value === 'boolean';
- },
- /**
- * 控制台输出日志
- * @param {Object} obj 输出的数据
- */
- log: function(obj) {
- if (BUI.debug && win.console && win.console.log) {
- win.console.log(obj);
- }
- },
- /**
- * 将多个对象的属性复制到一个新的对象
- */
- merge: function() {
- var args = $.makeArray(arguments),
- first = args[0];
- if (BUI.isBoolean(first)) {
- args.shift();
- args.unshift({});
- args.unshift(first);
- } else {
- args.unshift({});
- }
-
- return BUI.mix.apply(null, args);
-
- },
- /**
- * 封装 jQuery.extend 方法,将多个对象的属性merge到第一个对象中
- * @return {Object}
- */
- mix: function() {
- return $.extend.apply(null, arguments);
- },
- /**
- * 创造顶层的命名空间,附加到window对象上,
- * 包含namespace方法
- */
- app: function(name) {
- if (!window[name]) {
- window[name] = {
- namespace: function(nsName) {
- return BUI.namespace(nsName, window[name]);
- }
- };
- }
- return window[name];
- },
-
- mixAttrs: mixAttrs,
-
- mixAttr: mixAttr,
-
- /**
- * 将其他类作为mixin集成到指定类上面
- * @param {Function} c 构造函数
- * @param {Array} mixins 扩展类
- * @param {Array} attrs 扩展的静态属性,默认为['ATTRS']
- * @return {Function} 传入的构造函数
- */
- mixin: function(c, mixins, attrs) {
- attrs = attrs || [ATTRS, PARSER];
- var extensions = mixins;
- if (extensions) {
- c.mixins = extensions;
-
- var desc = {
- // ATTRS:
- // HTML_PARSER:
- },
- constructors = extensions['concat'](c);
-
- // [ex1,ex2],扩展类后面的优先,ex2 定义的覆盖 ex1 定义的
- // 主类最优先
- BUI.each(constructors, function(ext) {
- if (ext) {
- // 合并 ATTRS/HTML_PARSER 到主类
- BUI.each(attrs, function(K) {
- if (ext[K]) {
- desc[K] = desc[K] || {};
- // 不覆盖主类上的定义,因为继承层次上扩展类比主类层次高
- // 但是值是对象的话会深度合并
- // 注意:最好值是简单对象,自定义 new 出来的对象就会有问题(用 function return 出来)!
- if (K == 'ATTRS') {
- //BUI.mix(true,desc[K], ext[K]);
- mixAttrs(desc[K], ext[K]);
- } else {
- BUI.mix(desc[K], ext[K]);
- }
-
- }
- });
- }
- });
-
- BUI.each(desc, function(v, k) {
- c[k] = v;
- });
-
- var prototype = {};
-
- // 主类最优先
- BUI.each(constructors, function(ext) {
- if (ext) {
- var proto = ext.prototype;
- // 合并功能代码到主类,不覆盖
- for (var p in proto) {
- // 不覆盖主类,但是主类的父类还是覆盖吧
- if (proto.hasOwnProperty(p)) {
- prototype[p] = proto[p];
- }
- }
- }
- });
-
- BUI.each(prototype, function(v, k) {
- c.prototype[k] = v;
- });
- }
- return c;
- },
- /**
- * 生成命名空间
- * @param {String} name 命名空间的名称
- * @param {Object} baseNS 在已有的命名空间上创建命名空间,默认“BUI”
- * @return {Object} 返回的命名空间对象
- * @example
- * BUI.namespace("Grid"); // BUI.Grid
- */
- namespace: function(name, baseNS) {
- baseNS = baseNS || BUI;
- if (!name) {
- return baseNS;
- }
- var list = name.split('.'),
- //firstNS = win[list[0]],
- curNS = baseNS;
-
- for (var i = 0; i < list.length; i++) {
- var nsName = list[i];
- if (!curNS[nsName]) {
- curNS[nsName] = {};
- }
- curNS = curNS[nsName];
- };
- return curNS;
- },
- /**
- * BUI 控件的公用前缀
- * @type {String}
- */
- prefix: 'bui-',
- /**
- * 替换字符串中的字段.
- * @param {String} str 模版字符串
- * @param {Object} o json data
- * @param {RegExp} [regexp] 匹配字符串的正则表达式
- */
- substitute: function(str, o, regexp) {
- if (!BUI.isString(str) || (!BUI.isObject(o)) && !BUI.isArray(o)) {
- return str;
- }
-
- return str.replace(regexp || /\\?\{([^{}]+)\}/g, function(match, name) {
- if (match.charAt(0) === '\\') {
- return match.slice(1);
- }
- return (o[name] === undefined) ? '' : o[name];
- });
- },
- /**
- * 将$.param的反操作
- * jquery只提供param方法
- * @return {[type]} [description]
- */
- unparam: function(str){
- if (typeof str != 'string' || !(str = $.trim(str))) {
- return {};
- }
- var pairs = str.split('&'),
- pairsArr,
- rst = {};
- for(var i = pairs.length - 1; i >= 0; i--) {
- pairsArr = pairs[i].split('=');
- rst[pairsArr[0]] = decodeURIComponent(pairsArr[1]);
- }
- return rst;
- },
- /**
- * 使第一个字母变成大写
- * @param {String} s 字符串
- * @return {String} 首字母大写后的字符串
- */
- ucfirst: function(s) {
- s += '';
- return s.charAt(0).toUpperCase() + s.substring(1);
- },
- /**
- * 页面上的一点是否在用户的视图内
- * @param {Object} offset 坐标,left,top
- * @return {Boolean} 是否在视图内
- */
- isInView: function(offset) {
- var left = offset.left,
- top = offset.top,
- viewWidth = BUI.viewportWidth(),
- wiewHeight = BUI.viewportHeight(),
- scrollTop = BUI.scrollTop(),
- scrollLeft = BUI.scrollLeft();
- //判断横坐标
- if (left < scrollLeft || left > scrollLeft + viewWidth) {
- return false;
- }
- //判断纵坐标
- if (top < scrollTop || top > scrollTop + wiewHeight) {
- return false;
- }
- return true;
- },
- /**
- * 页面上的一点纵向坐标是否在用户的视图内
- * @param {Object} top 纵坐标
- * @return {Boolean} 是否在视图内
- */
- isInVerticalView: function(top) {
- var wiewHeight = BUI.viewportHeight(),
- scrollTop = BUI.scrollTop();
-
- //判断纵坐标
- if (top < scrollTop || top > scrollTop + wiewHeight) {
- return false;
- }
- return true;
- },
- /**
- * 页面上的一点横向坐标是否在用户的视图内
- * @param {Object} left 横坐标
- * @return {Boolean} 是否在视图内
- */
- isInHorizontalView: function(left) {
- var viewWidth = BUI.viewportWidth(),
- scrollLeft = BUI.scrollLeft();
- //判断横坐标
- if (left < scrollLeft || left > scrollLeft + viewWidth) {
- return false;
- }
- return true;
- },
- /**
- * 获取窗口可视范围宽度
- * @return {Number} 可视区宽度
- */
- viewportWidth: function() {
- return $(window).width();
- },
- /**
- * 获取窗口可视范围高度
- * @return {Number} 可视区高度
- */
- viewportHeight: function() {
- return $(window).height();
- },
- /**
- * 滚动到窗口的left位置
- */
- scrollLeft: function() {
- return $(window).scrollLeft();
- },
- /**
- * 滚动到横向位置
- */
- scrollTop: function() {
- return $(window).scrollTop();
- },
- /**
- * 窗口宽度
- * @return {Number} 窗口宽度
- */
- docWidth: function() {
- return Math.max(this.viewportWidth(), doc[DOC_ELEMENT][SCROLL_WIDTH], doc[BODY][SCROLL_WIDTH]);
- },
- /**
- * 窗口高度
- * @return {Number} 窗口高度
- */
- docHeight: function() {
- return Math.max(this.viewportHeight(), doc[DOC_ELEMENT][SCROLL_HEIGHT], doc[BODY][SCROLL_HEIGHT]);
- },
- /**
- * 遍历数组或者对象
- * @param {Object|Array} element/Object 数组中的元素或者对象的值
- * @param {Function} func 遍历的函数 function(elememt,index){} 或者 function(value,key){}
- */
- each: function(elements, func) {
- if (!elements) {
- return;
- }
- $.each(elements, function(k, v) {
- return func(v, k);
- });
- },
- /**
- * 封装事件,便于使用上下文this,和便于解除事件时使用
- * @protected
- * @param {Object} self 对象
- * @param {String} action 事件名称
- */
- wrapBehavior: function(self, action) {
- return self['__bui_wrap_' + action] = function(e) {
- if (!self.get('disabled')) {
- self[action](e);
- }
- };
- },
- /**
- * 获取封装的事件
- * @protected
- * @param {Object} self 对象
- * @param {String} action 事件名称
- */
- getWrapBehavior: function(self, action) {
- return self['__bui_wrap_' + action];
- },
- /**
- * 获取页面上使用了此id的控件
- * @param {String} id 控件id
- * @return {BUI.Component.Controller} 查找的控件
- */
- getControl: function(id) {
- return BUI.Component.Manager.getComponent(id);
- }
-
-});
-
-/**
- * 表单帮助类,序列化、反序列化,设置值
- * @class BUI.FormHelper
- * @singleton
- */
-var FormHelper = {
- /**
- * 将表单格式化成键值对形式
- * @param {HTMLElement} form 表单
- * @return {Object} 键值对的对象
- */
- serializeToObject: function(form) {
- var array = $(form).serializeArray(),
- result = {};
- BUI.each(array, function(item) {
- var name = item.name;
- if (!result[name]) { //如果是单个值,直接赋值
- result[name] = item.value;
- } else { //多值使用数组
- if (!BUI.isArray(result[name])) {
- result[name] = [result[name]];
- }
- result[name].push(item.value);
- }
- });
- return result;
- },
- /**
- * 设置表单的值
- * @param {HTMLElement} form 表单
- * @param {Object} obj 键值对
- */
- setFields: function(form, obj) {
- for (var name in obj) {
- if (obj.hasOwnProperty(name)) {
- BUI.FormHelper.setField(form, name, obj[name]);
- }
- }
- },
- /**
- * 清空表单
- * @param {HTMLElement} form 表单元素
- */
- clear: function(form) {
- var elements = $.makeArray(form.elements);
-
- BUI.each(elements, function(element) {
- if (element.type === 'checkbox' || element.type === 'radio') {
- $(element).attr('checked', false);
- } else {
- $(element).val('');
- }
- $(element).change();
- });
- },
- /**
- * 设置表单字段
- * @param {HTMLElement} form 表单元素
- * @param {string} field 字段名
- * @param {string} value 字段值
- */
- setField: function(form, fieldName, value) {
- var fields = form.elements[fieldName];
- if (fields && fields.type) {
- formHelper._setFieldValue(fields, value);
- } else if (BUI.isArray(fields) || (fields && fields.length)) {
- BUI.each(fields, function(field) {
- formHelper._setFieldValue(field, value);
- });
- }
- },
- //设置字段的值
- _setFieldValue: function(field, value) {
- if (field.type === 'checkbox') {
- if (field.value == '' + value || (BUI.isArray(value) && BUI.Array.indexOf(field.value, value) !== -1)) {
- $(field).attr('checked', true);
- } else {
- $(field).attr('checked', false);
- }
- } else if (field.type === 'radio') {
- if (field.value == '' + value) {
- $(field).attr('checked', true);
- } else {
- $(field).attr('checked', false);
- }
- } else {
- $(field).val(value);
- }
- },
- /**
- * 获取表单字段值
- * @param {HTMLElement} form 表单元素
- * @param {string} field 字段名
- * @return {String} 字段值
- */
- getField: function(form, fieldName) {
- return BUI.FormHelper.serializeToObject(form)[fieldName];
- }
-};
-
-
-BUI.FormHelper = FormHelper;
-
-module.exports = BUI;
diff --git a/spm_modules/expect.js/0.3.1/.gitignore b/spm_modules/expect.js/0.3.1/.gitignore
deleted file mode 100644
index fd4f2b0..0000000
--- a/spm_modules/expect.js/0.3.1/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-.DS_Store
diff --git a/spm_modules/expect.js/0.3.1/.npmignore b/spm_modules/expect.js/0.3.1/.npmignore
deleted file mode 100644
index 26ef5d8..0000000
--- a/spm_modules/expect.js/0.3.1/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-support
-test
-Makefile
diff --git a/spm_modules/expect.js/0.3.1/History.md b/spm_modules/expect.js/0.3.1/History.md
deleted file mode 100644
index e03f91f..0000000
--- a/spm_modules/expect.js/0.3.1/History.md
+++ /dev/null
@@ -1,54 +0,0 @@
-
-0.3.0 / 2014-02-20
-==================
-
- * renmaed to `index.js`
- * added repository to package.json
- * remove unused variable and merge
- * simpify isDate() and remove unnecessary semicolon.
- * Add .withArgs() syntax for building scenario
- * eql(): fix wrong order of actual vs. expected.
- * Added formatting for Error objects
- * Add support for 'regexp' type and eql comparison of regular expressions.
- * Better to follow the same coding style
- * Use 'showDiff' flag
- * Add 'actual' & 'expected' property to the thrown error
- * Pass .fail() unit test
- * Ignore 'script*' global leak in chrome
- * Exposed object stringification function
- * Use isRegExp in Assertion::throwException. Fix #25
- * Cleaned up local variables
-
-0.2.0 / 2012-10-19
-==================
-
- * fix isRegExp bug in some edge cases
- * add closure to all assertion messages deferring costly inspects
- until there is actually a failure
- * fix `make test` for recent mochas
- * add inspect() case for DOM elements
- * relax failure msg null check
- * add explicit failure through `expect().fail()`
- * clarified all `empty` functionality in README example
- * added docs for throwException fn/regexp signatures
-
-0.1.2 / 2012-02-04
-==================
-
- * Added regexp matching support for exceptions.
- * Added support for throwException callback.
- * Added `throwError` synonym to `throwException`.
- * Added object support for `.empty`.
- * Fixed `.a('object')` with nulls, and english error in error message.
- * Fix bug `indexOf` (IE). [hokaccha]
- * Fixed object property checking with `undefined` as value. [vovik]
-
-0.1.1 / 2011-12-18
-==================
-
- * Fixed typo
-
-0.1.0 / 2011-12-18
-==================
-
- * Initial import
diff --git a/spm_modules/expect.js/0.3.1/Makefile b/spm_modules/expect.js/0.3.1/Makefile
deleted file mode 100644
index fa83171..0000000
--- a/spm_modules/expect.js/0.3.1/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-
-REPORTER = dot
-
-test:
- @./node_modules/.bin/mocha \
- --require ./test/common \
- --reporter $(REPORTER) \
- --growl \
- test/expect.js
-
-test-browser:
- @./node_modules/.bin/serve .
-
-.PHONY: test
diff --git a/spm_modules/expect.js/0.3.1/README.md b/spm_modules/expect.js/0.3.1/README.md
deleted file mode 100644
index 5e6a88f..0000000
--- a/spm_modules/expect.js/0.3.1/README.md
+++ /dev/null
@@ -1,263 +0,0 @@
-# Expect
-
-Minimalistic BDD assertion toolkit based on
-[should.js](http://github.com/visionmedia/should.js)
-
-```js
-expect(window.r).to.be(undefined);
-expect({ a: 'b' }).to.eql({ a: 'b' })
-expect(5).to.be.a('number');
-expect([]).to.be.an('array');
-expect(window).not.to.be.an(Image);
-```
-
-## Features
-
-- Cross-browser: works on IE6+, Firefox, Safari, Chrome, Opera.
-- Compatible with all test frameworks.
-- Node.JS ready (`require('expect.js')`).
-- Standalone. Single global with no prototype extensions or shims.
-
-## How to use
-
-### Node
-
-Install it with NPM or add it to your `package.json`:
-
-```
-$ npm install expect.js
-```
-
-Then:
-
-```js
-var expect = require('expect.js');
-```
-
-### Browser
-
-Expose the `index.js` found at the top level of this repository.
-
-```html
-
-```
-
-## API
-
-**ok**: asserts that the value is _truthy_ or not
-
-```js
-expect(1).to.be.ok();
-expect(true).to.be.ok();
-expect({}).to.be.ok();
-expect(0).to.not.be.ok();
-```
-
-**be** / **equal**: asserts `===` equality
-
-```js
-expect(1).to.be(1)
-expect(NaN).not.to.equal(NaN);
-expect(1).not.to.be(true)
-expect('1').to.not.be(1);
-```
-
-**eql**: asserts loose equality that works with objects
-
-```js
-expect({ a: 'b' }).to.eql({ a: 'b' });
-expect(1).to.eql('1');
-```
-
-**a**/**an**: asserts `typeof` with support for `array` type and `instanceof`
-
-```js
-// typeof with optional `array`
-expect(5).to.be.a('number');
-expect([]).to.be.an('array'); // works
-expect([]).to.be.an('object'); // works too, since it uses `typeof`
-
-// constructors
-expect(5).to.be.a(Number);
-expect([]).to.be.an(Array);
-expect(tobi).to.be.a(Ferret);
-expect(person).to.be.a(Mammal);
-```
-
-**match**: asserts `String` regular expression match
-
-```js
-expect(program.version).to.match(/[0-9]+\.[0-9]+\.[0-9]+/);
-```
-
-**contain**: asserts indexOf for an array or string
-
-```js
-expect([1, 2]).to.contain(1);
-expect('hello world').to.contain('world');
-```
-
-**length**: asserts array `.length`
-
-```js
-expect([]).to.have.length(0);
-expect([1,2,3]).to.have.length(3);
-```
-
-**empty**: asserts that an array is empty or not
-
-```js
-expect([]).to.be.empty();
-expect({}).to.be.empty();
-expect({ length: 0, duck: 'typing' }).to.be.empty();
-expect({ my: 'object' }).to.not.be.empty();
-expect([1,2,3]).to.not.be.empty();
-```
-
-**property**: asserts presence of an own property (and value optionally)
-
-```js
-expect(window).to.have.property('expect')
-expect(window).to.have.property('expect', expect)
-expect({a: 'b'}).to.have.property('a');
-```
-
-**key**/**keys**: asserts the presence of a key. Supports the `only` modifier
-
-```js
-expect({ a: 'b' }).to.have.key('a');
-expect({ a: 'b', c: 'd' }).to.only.have.keys('a', 'c');
-expect({ a: 'b', c: 'd' }).to.only.have.keys(['a', 'c']);
-expect({ a: 'b', c: 'd' }).to.not.only.have.key('a');
-```
-
-**throwException**/**throwError**: asserts that the `Function` throws or not when called
-
-```js
-expect(fn).to.throwError(); // synonym of throwException
-expect(fn).to.throwException(function (e) { // get the exception object
- expect(e).to.be.a(SyntaxError);
-});
-expect(fn).to.throwException(/matches the exception message/);
-expect(fn2).to.not.throwException();
-```
-
-**withArgs**: creates anonymous function to call fn with arguments
-
-```js
-expect(fn).withArgs(invalid, arg).to.throwException();
-expect(fn).withArgs(valid, arg).to.not.throwException();
-```
-
-**within**: asserts a number within a range
-
-```js
-expect(1).to.be.within(0, Infinity);
-```
-
-**greaterThan**/**above**: asserts `>`
-
-```js
-expect(3).to.be.above(0);
-expect(5).to.be.greaterThan(3);
-```
-
-**lessThan**/**below**: asserts `<`
-
-```js
-expect(0).to.be.below(3);
-expect(1).to.be.lessThan(3);
-```
-
-**fail**: explicitly forces failure.
-
-```js
-expect().fail()
-expect().fail("Custom failure message")
-```
-
-## Using with a test framework
-
-For example, if you create a test suite with
-[mocha](http://github.com/visionmedia/mocha).
-
-Let's say we wanted to test the following program:
-
-**math.js**
-
-```js
-function add (a, b) { return a + b; };
-```
-
-Our test file would look like this:
-
-```js
-describe('test suite', function () {
- it('should expose a function', function () {
- expect(add).to.be.a('function');
- });
-
- it('should do math', function () {
- expect(add(1, 3)).to.equal(4);
- });
-});
-```
-
-If a certain expectation fails, an exception will be raised which gets captured
-and shown/processed by the test runner.
-
-## Differences with should.js
-
-- No need for static `should` methods like `should.strictEqual`. For example,
- `expect(obj).to.be(undefined)` works well.
-- Some API simplifications / changes.
-- API changes related to browser compatibility.
-
-## Running tests
-
-Clone the repository and install the developer dependencies:
-
-```
-git clone git://github.com/LearnBoost/expect.js.git expect
-cd expect && npm install
-```
-
-### Node
-
-`make test`
-
-### Browser
-
-`make test-browser`
-
-and point your browser(s) to `http://localhost:3000/test/`
-
-## Credits
-
-(The MIT License)
-
-Copyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-### 3rd-party
-
-Heavily borrows from [should.js](http://github.com/visionmedia/should.js) by TJ
-Holowaychuck - MIT.
diff --git a/spm_modules/expect.js/0.3.1/index.js b/spm_modules/expect.js/0.3.1/index.js
deleted file mode 100644
index b1e921d..0000000
--- a/spm_modules/expect.js/0.3.1/index.js
+++ /dev/null
@@ -1,1284 +0,0 @@
-(function (global, module) {
-
- var exports = module.exports;
-
- /**
- * Exports.
- */
-
- module.exports = expect;
- expect.Assertion = Assertion;
-
- /**
- * Exports version.
- */
-
- expect.version = '0.3.1';
-
- /**
- * Possible assertion flags.
- */
-
- var flags = {
- not: ['to', 'be', 'have', 'include', 'only']
- , to: ['be', 'have', 'include', 'only', 'not']
- , only: ['have']
- , have: ['own']
- , be: ['an']
- };
-
- function expect (obj) {
- return new Assertion(obj);
- }
-
- /**
- * Constructor
- *
- * @api private
- */
-
- function Assertion (obj, flag, parent) {
- this.obj = obj;
- this.flags = {};
-
- if (undefined != parent) {
- this.flags[flag] = true;
-
- for (var i in parent.flags) {
- if (parent.flags.hasOwnProperty(i)) {
- this.flags[i] = true;
- }
- }
- }
-
- var $flags = flag ? flags[flag] : keys(flags)
- , self = this;
-
- if ($flags) {
- for (var i = 0, l = $flags.length; i < l; i++) {
- // avoid recursion
- if (this.flags[$flags[i]]) continue;
-
- var name = $flags[i]
- , assertion = new Assertion(this.obj, name, this)
-
- if ('function' == typeof Assertion.prototype[name]) {
- // clone the function, make sure we dont touch the prot reference
- var old = this[name];
- this[name] = function () {
- return old.apply(self, arguments);
- };
-
- for (var fn in Assertion.prototype) {
- if (Assertion.prototype.hasOwnProperty(fn) && fn != name) {
- this[name][fn] = bind(assertion[fn], assertion);
- }
- }
- } else {
- this[name] = assertion;
- }
- }
- }
- }
-
- /**
- * Performs an assertion
- *
- * @api private
- */
-
- Assertion.prototype.assert = function (truth, msg, error, expected) {
- var msg = this.flags.not ? error : msg
- , ok = this.flags.not ? !truth : truth
- , err;
-
- if (!ok) {
- err = new Error(msg.call(this));
- if (arguments.length > 3) {
- err.actual = this.obj;
- err.expected = expected;
- err.showDiff = true;
- }
- throw err;
- }
-
- this.and = new Assertion(this.obj);
- };
-
- /**
- * Check if the value is truthy
- *
- * @api public
- */
-
- Assertion.prototype.ok = function () {
- this.assert(
- !!this.obj
- , function(){ return 'expected ' + i(this.obj) + ' to be truthy' }
- , function(){ return 'expected ' + i(this.obj) + ' to be falsy' });
- };
-
- /**
- * Creates an anonymous function which calls fn with arguments.
- *
- * @api public
- */
-
- Assertion.prototype.withArgs = function() {
- expect(this.obj).to.be.a('function');
- var fn = this.obj;
- var args = Array.prototype.slice.call(arguments);
- return expect(function() { fn.apply(null, args); });
- };
-
- /**
- * Assert that the function throws.
- *
- * @param {Function|RegExp} callback, or regexp to match error string against
- * @api public
- */
-
- Assertion.prototype.throwError =
- Assertion.prototype.throwException = function (fn) {
- expect(this.obj).to.be.a('function');
-
- var thrown = false
- , not = this.flags.not;
-
- try {
- this.obj();
- } catch (e) {
- if (isRegExp(fn)) {
- var subject = 'string' == typeof e ? e : e.message;
- if (not) {
- expect(subject).to.not.match(fn);
- } else {
- expect(subject).to.match(fn);
- }
- } else if ('function' == typeof fn) {
- fn(e);
- }
- thrown = true;
- }
-
- if (isRegExp(fn) && not) {
- // in the presence of a matcher, ensure the `not` only applies to
- // the matching.
- this.flags.not = false;
- }
-
- var name = this.obj.name || 'fn';
- this.assert(
- thrown
- , function(){ return 'expected ' + name + ' to throw an exception' }
- , function(){ return 'expected ' + name + ' not to throw an exception' });
- };
-
- /**
- * Checks if the array is empty.
- *
- * @api public
- */
-
- Assertion.prototype.empty = function () {
- var expectation;
-
- if ('object' == typeof this.obj && null !== this.obj && !isArray(this.obj)) {
- if ('number' == typeof this.obj.length) {
- expectation = !this.obj.length;
- } else {
- expectation = !keys(this.obj).length;
- }
- } else {
- if ('string' != typeof this.obj) {
- expect(this.obj).to.be.an('object');
- }
-
- expect(this.obj).to.have.property('length');
- expectation = !this.obj.length;
- }
-
- this.assert(
- expectation
- , function(){ return 'expected ' + i(this.obj) + ' to be empty' }
- , function(){ return 'expected ' + i(this.obj) + ' to not be empty' });
- return this;
- };
-
- /**
- * Checks if the obj exactly equals another.
- *
- * @api public
- */
-
- Assertion.prototype.be =
- Assertion.prototype.equal = function (obj) {
- this.assert(
- obj === this.obj
- , function(){ return 'expected ' + i(this.obj) + ' to equal ' + i(obj) }
- , function(){ return 'expected ' + i(this.obj) + ' to not equal ' + i(obj) });
- return this;
- };
-
- /**
- * Checks if the obj sortof equals another.
- *
- * @api public
- */
-
- Assertion.prototype.eql = function (obj) {
- this.assert(
- expect.eql(this.obj, obj)
- , function(){ return 'expected ' + i(this.obj) + ' to sort of equal ' + i(obj) }
- , function(){ return 'expected ' + i(this.obj) + ' to sort of not equal ' + i(obj) }
- , obj);
- return this;
- };
-
- /**
- * Assert within start to finish (inclusive).
- *
- * @param {Number} start
- * @param {Number} finish
- * @api public
- */
-
- Assertion.prototype.within = function (start, finish) {
- var range = start + '..' + finish;
- this.assert(
- this.obj >= start && this.obj <= finish
- , function(){ return 'expected ' + i(this.obj) + ' to be within ' + range }
- , function(){ return 'expected ' + i(this.obj) + ' to not be within ' + range });
- return this;
- };
-
- /**
- * Assert typeof / instance of
- *
- * @api public
- */
-
- Assertion.prototype.a =
- Assertion.prototype.an = function (type) {
- if ('string' == typeof type) {
- // proper english in error msg
- var n = /^[aeiou]/.test(type) ? 'n' : '';
-
- // typeof with support for 'array'
- this.assert(
- 'array' == type ? isArray(this.obj) :
- 'regexp' == type ? isRegExp(this.obj) :
- 'object' == type
- ? 'object' == typeof this.obj && null !== this.obj
- : type == typeof this.obj
- , function(){ return 'expected ' + i(this.obj) + ' to be a' + n + ' ' + type }
- , function(){ return 'expected ' + i(this.obj) + ' not to be a' + n + ' ' + type });
- } else {
- // instanceof
- var name = type.name || 'supplied constructor';
- this.assert(
- this.obj instanceof type
- , function(){ return 'expected ' + i(this.obj) + ' to be an instance of ' + name }
- , function(){ return 'expected ' + i(this.obj) + ' not to be an instance of ' + name });
- }
-
- return this;
- };
-
- /**
- * Assert numeric value above _n_.
- *
- * @param {Number} n
- * @api public
- */
-
- Assertion.prototype.greaterThan =
- Assertion.prototype.above = function (n) {
- this.assert(
- this.obj > n
- , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n }
- , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n });
- return this;
- };
-
- /**
- * Assert numeric value below _n_.
- *
- * @param {Number} n
- * @api public
- */
-
- Assertion.prototype.lessThan =
- Assertion.prototype.below = function (n) {
- this.assert(
- this.obj < n
- , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n }
- , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n });
- return this;
- };
-
- /**
- * Assert string value matches _regexp_.
- *
- * @param {RegExp} regexp
- * @api public
- */
-
- Assertion.prototype.match = function (regexp) {
- this.assert(
- regexp.exec(this.obj)
- , function(){ return 'expected ' + i(this.obj) + ' to match ' + regexp }
- , function(){ return 'expected ' + i(this.obj) + ' not to match ' + regexp });
- return this;
- };
-
- /**
- * Assert property "length" exists and has value of _n_.
- *
- * @param {Number} n
- * @api public
- */
-
- Assertion.prototype.length = function (n) {
- expect(this.obj).to.have.property('length');
- var len = this.obj.length;
- this.assert(
- n == len
- , function(){ return 'expected ' + i(this.obj) + ' to have a length of ' + n + ' but got ' + len }
- , function(){ return 'expected ' + i(this.obj) + ' to not have a length of ' + len });
- return this;
- };
-
- /**
- * Assert property _name_ exists, with optional _val_.
- *
- * @param {String} name
- * @param {Mixed} val
- * @api public
- */
-
- Assertion.prototype.property = function (name, val) {
- if (this.flags.own) {
- this.assert(
- Object.prototype.hasOwnProperty.call(this.obj, name)
- , function(){ return 'expected ' + i(this.obj) + ' to have own property ' + i(name) }
- , function(){ return 'expected ' + i(this.obj) + ' to not have own property ' + i(name) });
- return this;
- }
-
- if (this.flags.not && undefined !== val) {
- if (undefined === this.obj[name]) {
- throw new Error(i(this.obj) + ' has no property ' + i(name));
- }
- } else {
- var hasProp;
- try {
- hasProp = name in this.obj
- } catch (e) {
- hasProp = undefined !== this.obj[name]
- }
-
- this.assert(
- hasProp
- , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name) }
- , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name) });
- }
-
- if (undefined !== val) {
- this.assert(
- val === this.obj[name]
- , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name)
- + ' of ' + i(val) + ', but got ' + i(this.obj[name]) }
- , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name)
- + ' of ' + i(val) });
- }
-
- this.obj = this.obj[name];
- return this;
- };
-
- /**
- * Assert that the array contains _obj_ or string contains _obj_.
- *
- * @param {Mixed} obj|string
- * @api public
- */
-
- Assertion.prototype.string =
- Assertion.prototype.contain = function (obj) {
- if ('string' == typeof this.obj) {
- this.assert(
- ~this.obj.indexOf(obj)
- , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) }
- , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) });
- } else {
- this.assert(
- ~indexOf(this.obj, obj)
- , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) }
- , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) });
- }
- return this;
- };
-
- /**
- * Assert exact keys or inclusion of keys by using
- * the `.own` modifier.
- *
- * @param {Array|String ...} keys
- * @api public
- */
-
- Assertion.prototype.key =
- Assertion.prototype.keys = function ($keys) {
- var str
- , ok = true;
-
- $keys = isArray($keys)
- ? $keys
- : Array.prototype.slice.call(arguments);
-
- if (!$keys.length) throw new Error('keys required');
-
- var actual = keys(this.obj)
- , len = $keys.length;
-
- // Inclusion
- ok = every($keys, function (key) {
- return ~indexOf(actual, key);
- });
-
- // Strict
- if (!this.flags.not && this.flags.only) {
- ok = ok && $keys.length == actual.length;
- }
-
- // Key string
- if (len > 1) {
- $keys = map($keys, function (key) {
- return i(key);
- });
- var last = $keys.pop();
- str = $keys.join(', ') + ', and ' + last;
- } else {
- str = i($keys[0]);
- }
-
- // Form
- str = (len > 1 ? 'keys ' : 'key ') + str;
-
- // Have / include
- str = (!this.flags.only ? 'include ' : 'only have ') + str;
-
- // Assertion
- this.assert(
- ok
- , function(){ return 'expected ' + i(this.obj) + ' to ' + str }
- , function(){ return 'expected ' + i(this.obj) + ' to not ' + str });
-
- return this;
- };
-
- /**
- * Assert a failure.
- *
- * @param {String ...} custom message
- * @api public
- */
- Assertion.prototype.fail = function (msg) {
- var error = function() { return msg || "explicit failure"; }
- this.assert(false, error, error);
- return this;
- };
-
- /**
- * Function bind implementation.
- */
-
- function bind (fn, scope) {
- return function () {
- return fn.apply(scope, arguments);
- }
- }
-
- /**
- * Array every compatibility
- *
- * @see bit.ly/5Fq1N2
- * @api public
- */
-
- function every (arr, fn, thisObj) {
- var scope = thisObj || global;
- for (var i = 0, j = arr.length; i < j; ++i) {
- if (!fn.call(scope, arr[i], i, arr)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Array indexOf compatibility.
- *
- * @see bit.ly/a5Dxa2
- * @api public
- */
-
- function indexOf (arr, o, i) {
- if (Array.prototype.indexOf) {
- return Array.prototype.indexOf.call(arr, o, i);
- }
-
- if (arr.length === undefined) {
- return -1;
- }
-
- for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0
- ; i < j && arr[i] !== o; i++);
-
- return j <= i ? -1 : i;
- }
-
- // https://gist.github.com/1044128/
- var getOuterHTML = function(element) {
- if ('outerHTML' in element) return element.outerHTML;
- var ns = "http://www.w3.org/1999/xhtml";
- var container = document.createElementNS(ns, '_');
- var xmlSerializer = new XMLSerializer();
- var html;
- if (document.xmlVersion) {
- return xmlSerializer.serializeToString(element);
- } else {
- container.appendChild(element.cloneNode(false));
- html = container.innerHTML.replace('><', '>' + element.innerHTML + '<');
- container.innerHTML = '';
- return html;
- }
- };
-
- // Returns true if object is a DOM element.
- var isDOMElement = function (object) {
- if (typeof HTMLElement === 'object') {
- return object instanceof HTMLElement;
- } else {
- return object &&
- typeof object === 'object' &&
- object.nodeType === 1 &&
- typeof object.nodeName === 'string';
- }
- };
-
- /**
- * Inspects an object.
- *
- * @see taken from node.js `util` module (copyright Joyent, MIT license)
- * @api private
- */
-
- function i (obj, showHidden, depth) {
- var seen = [];
-
- function stylize (str) {
- return str;
- }
-
- function format (value, recurseTimes) {
- // Provide a hook for user-specified inspect functions.
- // Check that value is an object with an inspect function on it
- if (value && typeof value.inspect === 'function' &&
- // Filter out the util module, it's inspect function is special
- value !== exports &&
- // Also filter out any prototype objects using the circular check.
- !(value.constructor && value.constructor.prototype === value)) {
- return value.inspect(recurseTimes);
- }
-
- // Primitive types cannot have properties
- switch (typeof value) {
- case 'undefined':
- return stylize('undefined', 'undefined');
-
- case 'string':
- var simple = '\'' + json.stringify(value).replace(/^"|"$/g, '')
- .replace(/'/g, "\\'")
- .replace(/\\"/g, '"') + '\'';
- return stylize(simple, 'string');
-
- case 'number':
- return stylize('' + value, 'number');
-
- case 'boolean':
- return stylize('' + value, 'boolean');
- }
- // For some reason typeof null is "object", so special case here.
- if (value === null) {
- return stylize('null', 'null');
- }
-
- if (isDOMElement(value)) {
- return getOuterHTML(value);
- }
-
- // Look up the keys of the object.
- var visible_keys = keys(value);
- var $keys = showHidden ? Object.getOwnPropertyNames(value) : visible_keys;
-
- // Functions without properties can be shortcutted.
- if (typeof value === 'function' && $keys.length === 0) {
- if (isRegExp(value)) {
- return stylize('' + value, 'regexp');
- } else {
- var name = value.name ? ': ' + value.name : '';
- return stylize('[Function' + name + ']', 'special');
- }
- }
-
- // Dates without properties can be shortcutted
- if (isDate(value) && $keys.length === 0) {
- return stylize(value.toUTCString(), 'date');
- }
-
- // Error objects can be shortcutted
- if (value instanceof Error) {
- return stylize("["+value.toString()+"]", 'Error');
- }
-
- var base, type, braces;
- // Determine the object type
- if (isArray(value)) {
- type = 'Array';
- braces = ['[', ']'];
- } else {
- type = 'Object';
- braces = ['{', '}'];
- }
-
- // Make functions say that they are functions
- if (typeof value === 'function') {
- var n = value.name ? ': ' + value.name : '';
- base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']';
- } else {
- base = '';
- }
-
- // Make dates with properties first say the date
- if (isDate(value)) {
- base = ' ' + value.toUTCString();
- }
-
- if ($keys.length === 0) {
- return braces[0] + base + braces[1];
- }
-
- if (recurseTimes < 0) {
- if (isRegExp(value)) {
- return stylize('' + value, 'regexp');
- } else {
- return stylize('[Object]', 'special');
- }
- }
-
- seen.push(value);
-
- var output = map($keys, function (key) {
- var name, str;
- if (value.__lookupGetter__) {
- if (value.__lookupGetter__(key)) {
- if (value.__lookupSetter__(key)) {
- str = stylize('[Getter/Setter]', 'special');
- } else {
- str = stylize('[Getter]', 'special');
- }
- } else {
- if (value.__lookupSetter__(key)) {
- str = stylize('[Setter]', 'special');
- }
- }
- }
- if (indexOf(visible_keys, key) < 0) {
- name = '[' + key + ']';
- }
- if (!str) {
- if (indexOf(seen, value[key]) < 0) {
- if (recurseTimes === null) {
- str = format(value[key]);
- } else {
- str = format(value[key], recurseTimes - 1);
- }
- if (str.indexOf('\n') > -1) {
- if (isArray(value)) {
- str = map(str.split('\n'), function (line) {
- return ' ' + line;
- }).join('\n').substr(2);
- } else {
- str = '\n' + map(str.split('\n'), function (line) {
- return ' ' + line;
- }).join('\n');
- }
- }
- } else {
- str = stylize('[Circular]', 'special');
- }
- }
- if (typeof name === 'undefined') {
- if (type === 'Array' && key.match(/^\d+$/)) {
- return str;
- }
- name = json.stringify('' + key);
- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
- name = name.substr(1, name.length - 2);
- name = stylize(name, 'name');
- } else {
- name = name.replace(/'/g, "\\'")
- .replace(/\\"/g, '"')
- .replace(/(^"|"$)/g, "'");
- name = stylize(name, 'string');
- }
- }
-
- return name + ': ' + str;
- });
-
- seen.pop();
-
- var numLinesEst = 0;
- var length = reduce(output, function (prev, cur) {
- numLinesEst++;
- if (indexOf(cur, '\n') >= 0) numLinesEst++;
- return prev + cur.length + 1;
- }, 0);
-
- if (length > 50) {
- output = braces[0] +
- (base === '' ? '' : base + '\n ') +
- ' ' +
- output.join(',\n ') +
- ' ' +
- braces[1];
-
- } else {
- output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
- }
-
- return output;
- }
- return format(obj, (typeof depth === 'undefined' ? 2 : depth));
- }
-
- expect.stringify = i;
-
- function isArray (ar) {
- return Object.prototype.toString.call(ar) === '[object Array]';
- }
-
- function isRegExp(re) {
- var s;
- try {
- s = '' + re;
- } catch (e) {
- return false;
- }
-
- return re instanceof RegExp || // easy case
- // duck-type for context-switching evalcx case
- typeof(re) === 'function' &&
- re.constructor.name === 'RegExp' &&
- re.compile &&
- re.test &&
- re.exec &&
- s.match(/^\/.*\/[gim]{0,3}$/);
- }
-
- function isDate(d) {
- return d instanceof Date;
- }
-
- function keys (obj) {
- if (Object.keys) {
- return Object.keys(obj);
- }
-
- var keys = [];
-
- for (var i in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, i)) {
- keys.push(i);
- }
- }
-
- return keys;
- }
-
- function map (arr, mapper, that) {
- if (Array.prototype.map) {
- return Array.prototype.map.call(arr, mapper, that);
- }
-
- var other= new Array(arr.length);
-
- for (var i= 0, n = arr.length; it |