bat-ria
Version:
RIA extension for Brand Ads Team
378 lines (339 loc) • 14 kB
JavaScript
/**
* UB RIA Base
* Copyright 2013 Baidu Inc. All rights reserved.
*
* @ignore
* @file UI组件模块扩展
* @author otakustay
*/
define(
function (require) {
var u = require('underscore');
var lib = require('esui/lib');
var Control = require('esui/Control');
/**
* 加载并配置验证规则
*
* @ignore
*/
function initializeValidationRules() {
// 加载所有验证规则
require('esui/validator/MaxByteLengthRule');
require('esui/validator/MinByteLengthRule');
require('esui/validator/MaxLengthRule');
require('esui/validator/MinLengthRule');
var RequiredRule = require('esui/validator/RequiredRule');
var PatternRule = require('esui/validator/PatternRule');
var MaxRule = require('esui/validator/MaxRule');
var MinRule = require('esui/validator/MinRule');
RequiredRule.prototype.errorMessage = '请填写${title}';
var INTEGER_REGEX = {
'^\\d+$': true,
'/^\\d+$/': true
};
var FLOAT_REGEX = {
'^\\d+(\\.\\d{1,2})?$': true,
'/^\\d+(\\.\\d{1,2})?$/': true
};
var NUMBER_REGEX = u.extend({}, INTEGER_REGEX, FLOAT_REGEX);
function getRangeErrorMessage(control) {
var min = control.get('min');
var max = control.get('max');
var pattern = control.get('pattern') + '';
if (min != null && max != null
&& NUMBER_REGEX.hasOwnProperty(pattern)
) {
// 把数字变成3位一个逗号的
var regex = /\B(?=(\d{3})+(?!\d))/g;
var start = (min + '').replace(regex, ',');
var end = (max + '').replace(regex, ',');
// 根据正则选择整数或浮点数的信息
if (INTEGER_REGEX.hasOwnProperty(pattern)) {
return u.escape(control.get('title')) + '请填写'
+ '≥' + start + '且≤' + end + '的整数';
}
else {
return u.escape(control.get('title')) + '请填写'
+ '≥' + start + '且≤' + end + '的数字,'
+ '最多可保存至小数点后两位';
}
}
else {
return null;
}
}
var Rule = require('esui/validator/Rule');
var defaultGetErrorMessage = Rule.prototype.getErrorMessage;
function getErrorMessage(control) {
if (control.get(this.type + 'ErrorMessage')) {
return defaultGetErrorMessage.apply(this, arguments);
}
var rangeErrorMessage = getRangeErrorMessage(control);
if (rangeErrorMessage) {
return rangeErrorMessage;
}
return defaultGetErrorMessage.apply(this, arguments);
}
MaxRule.prototype.getErrorMessage = getErrorMessage;
MinRule.prototype.getErrorMessage = getErrorMessage;
PatternRule.prototype.getErrorMessage = function (control) {
var pattern = control.get('pattern') + '';
if (control.get('patternErrorMessage') || !NUMBER_REGEX.hasOwnProperty(pattern)) {
return defaultGetErrorMessage.apply(this, arguments);
}
var rangeErrorMessage = getRangeErrorMessage(control);
if (rangeErrorMessage) {
return rangeErrorMessage;
}
return defaultGetErrorMessage.apply(this, arguments);
};
}
/**
* 为几个控件添加链接模式的内容模板
*
* @ignore
*/
function addControlLinkMode() {
var CommandMenu = require('esui/CommandMenu');
CommandMenu.prototype.linkTemplate =
'<a target="${target}" href="${href}">${text}</a>';
CommandMenu.prototype.getItemHTML = function (item) {
var data = {
text: lib.encodeHTML(item.text),
href: item.href && lib.encodeHTML(item.href),
target: item.target || '_self'
};
var template = item.href
? this.linkTemplate
: this.itemTemplate;
return lib.format(template, data);
};
var Tab = require('esui/Tab');
Tab.prototype.linkTemplate = '<a href="${href}">${title}</a>';
Tab.prototype.getContentHTML = function (item) {
var data = {
title: lib.encodeHTML(item.title),
href: item.href && lib.encodeHTML(item.href)
};
var template = item.href
? this.linkTemplate
: this.contentTemplate;
return lib.format(template, data);
};
}
/**
* 激活全局ESUI扩展
*
* @ignore
*/
function initializeGlobalExtensions() {
var ui = require('esui');
var globalExtensions = [
// { type: 'CustomData', options: {} }
];
u.each(globalExtensions, function (extension) {
ui.attachExtension(extension.type, extension.options);
});
}
/**
* esui升级前region的过渡扩展
* 增加获取最大地域个数的方法
* 增加多选状态下是否处于全选状态的判断
* 增加获取选中文本的方法
* 增加获取rawValue的时候即使省下边没有全选也把省份id返回的方法(adrc地区格式需求)
* 增加设置rawValue时去掉非子节点的省份,并返回选中文本的方法(adrc地区格式需求)
*
* @ignore
*/
function addRegionExtension() {
var Region = require('esui/Region');
Region.prototype.getMaxRegionSize = function () {
if (!this.maxRegionSize) {
this.maxRegionSize = u.size(this.regionDataIndex);
}
return this.maxRegionSize;
};
Region.prototype.isAllSelected = function () {
if (this.mode === 'multi') {
return this.getMaxRegionSize() === this.getRawValue().length;
}
// 不是多选就直接返回false吧
return false;
};
/*
* 获取地区的文本
*
* @param isFilterParentNode {boolean} 是不是要把有子节点省份的文本过滤掉
* @param region {array} 指定地区的id范围,默认使用已选地区
* @return {string} 选中的地区的文本
*/
Region.prototype.getRegionText = function (isFilterParentNode, region) {
var me = this;
var rawValue = region || this.getRawValue();
var regionTextArr = [];
if (isFilterParentNode) {
u.each(rawValue, function (id) {
var item = me.regionDataIndex[id];
if (!item.children) {
var tmpText = item.text;
if (tmpText) {
regionTextArr.push(tmpText);
}
}
});
}
else {
u.each(rawValue, function (id) {
var tmpText = me.regionDataIndex[id] && me.regionDataIndex[id].text;
if (tmpText) {
regionTextArr.push(tmpText);
}
});
}
return regionTextArr.join(',');
};
/*
* 主要用于adrc地域获取要发送到后端的值
*
* @return {array} 不论省是不是全选都得带上的一个地区id数组
*/
Region.prototype.getRawValueWithProv = function () {
var me = this;
var rawValue = this.getRawValue();
var returnRawValue = [];
u.each(rawValue, function (id) {
var node = me.regionDataIndex[id];
// 检查叶子节点
if (node && !node.children) {
// 如果不是最深叶节点,那就是我们要的特殊的省
if (node.level !== 4) {
returnRawValue.push(id);
}
else {
// 深度为4就是最深的叶节点,是个市,把它的省也搞进来
returnRawValue.push(id);
returnRawValue.push(node.parent.id);
}
}
});
return u.uniq(returnRawValue);
};
/*
* 主要用于adrc设置控件值
*
* @param rawValue {array} 地区的id数组
* @return {string} 返回这些地区的展示文本,不包含省份以上的文本
*/
Region.prototype.setRawValueWithoutProv = function (rawValue) {
if (typeof rawValue === 'string' && rawValue.length) {
rawValue = rawValue.split(',');
}
var me = this;
var regionTextArr = [];
var rawValueToBeSet = [];
u.each(rawValue, function (id) {
var node = me.regionDataIndex[id];
if (node && !node.children) {
regionTextArr.push(node.text);
rawValueToBeSet.push(node.id);
}
});
this.setRawValue(rawValueToBeSet);
return regionTextArr.join(',');
};
}
/**
* esui升级前Crumb的过渡扩展,增加global-redirect的功能
*
* @ignore
*/
function addCrumbGlobalRedirect() {
var Crumb = require('esui/Crumb');
/**
* 链接节点的内容HTML模板
*
* 模板中可以使用以下占位符:
*
* - `{string} text`:文本内容,经过HTML转义
* - `{string} href`:链接地址,经过HTML转义
* - `{string} scope`:当Crumb在一个子action中时是否global跳转,经过HTML转义
* 值为`global`时全局跳转,其他值或空在子action中跳转
*
* @type {string}
* @override
*/
Crumb.prototype.linkNodeTemplate =
'<a class="${classes}" href="${href}" data-redirect="${scope}">${text}</a>';
/**
* 获取节点的HTML内容
*
* @param {meta.CrumbItem} node 节点数据项
* @param {number} index 节点索引序号
* @return {string}
*
* @override
*/
Crumb.prototype.getNodeHTML = function (node, index) {
var classes = this.helper.getPartClasses('node');
if (index === 0) {
classes.push.apply(
classes,
this.helper.getPartClasses('node-first')
);
}
if (index === this.path.length - 1) {
classes.push.apply(
classes,
this.helper.getPartClasses('node-last')
);
}
var template = node.href
? this.linkNodeTemplate
: this.textNodeTemplate;
var data = {
href: u.escape(node.href),
scope: u.escape(node.scope),
text: u.escape(node.text),
classes: classes.join(' ')
};
return lib.format(template, data);
};
}
function addTreeNodeTitle() {
var Tree = require('esui/Tree');
Tree.prototype.itemTemplate = '<span title="${text}">${text}</span>';
}
function fixSidebarHide() {
var Sidebar = require('esui/Sidebar');
/**
* 隐藏控件
*/
Sidebar.prototype.hide = function () {
Control.prototype.hide.call(this);
var mat = lib.g(this.helper.getId('mat'));
if (mat) {
mat.style.display = 'none';
}
// 隐藏主区域
this.main.style.display = 'none';
// minibar
var miniBar = lib.g(this.helper.getId('minibar'));
if (miniBar) {
miniBar.style.display = 'none';
}
};
}
function activate() {
initializeValidationRules();
addControlLinkMode();
initializeGlobalExtensions();
addRegionExtension();
addCrumbGlobalRedirect();
addTreeNodeTitle();
fixSidebarHide();
}
return {
activate: u.once(activate)
};
}
);