gdoo/public/assets/dist/gdoo.min.js

6035 lines
163 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
(function ($, undefined) {
var pluginName = 'agDropdownCellEditor',
dataKey = 'ag.dropdown.celleditor';
var defaults = {
maxHeight: 200
}; // Utility functions
var keys = {
ESC: 27,
TAB: 9,
RETURN: 13,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
ENTER: 13,
SHIFT: 16
};
/**
* Constructor
* @param {[Node]} element [Select element]
* @param {[Object]} options [Option object]
*/
var Plugin = function Plugin(input, options) {
this.grid = options.grid;
this.config = options.config;
this.items = options.data.items;
this.selected = options.data.selected;
this.hook = options.hook;
this.arrow = options.arrow || 'icon-search';
this.name = options.name;
this.onSelect = options.select || function () {};
this.$input = $(input); // Settings
this.settings = $.extend({}, defaults, options); // Initialize
this.init();
$.fn[pluginName].instances.push(this);
};
$.extend(Plugin.prototype, {
init: function init() {
// Construct the comboselect
this._construct(); // Add event bindings
this._events();
},
_construct: function _construct() {
var me = this; // Wrap the Select
this.$container = $('<div class="combo-select combo-open combo-' + me.name + '" />'); // Append dropdown arrow
this.$arrow = $('<div class="combo-arrow"><i class="fa ' + this.arrow + '"></i></div>'); // Append dropdown
this.$dropdown = $('<ul class="combo-dropdown" />').appendTo(this.$container); // Create dropdown options
this._build();
this.$input.after(this.$arrow);
$('body').append(this.$container);
var height = this.$input.outerHeight();
var width = this.$input.outerWidth();
var offset = this.$input.offset();
this.$container.css({
width: width + 2,
left: offset.left - 1,
top: offset.top + height + 1
});
},
_build: function _build() {
var me = this;
var o = '',
k = 0;
o += '<li class="option-item-empty">无匹配选项</li>';
$.each(this.items, function (i, e) {
if (e == 'optgroup') {
return o += '<li class="option-group">' + this.label + '</li>';
}
o += '<li class="' + (this.disabled ? 'option-disabled' : "option-item") + ' ' + (this.id == me.selected ? 'option-selected' : '') + '" data-index="' + k + '" data-value="' + this.id + '">' + this.name + '<i>' + this.code + '</i></li>';
k++;
});
this.$dropdown.html(o); // Items
this.$items = this.$dropdown.children();
},
_events: function _events() {
var me = this;
this.$arrow.off();
this.$container.off();
this.$input.off(); // Dropdown Arrow: click
this.$arrow.on('click.arrow', $.proxy(this._toggle, this)); // Dropdown: close
this.$container.on('dropdown:close', $.proxy(this._close, this)); // Dropdown: open
this.$container.on('dropdown:open', $.proxy(this._open, this)); // Dropdown: update
this.$container.on('dropdown:update', $.proxy(this._update, this)); // Input: keydown
this.$input.on('keydown', $.proxy(this._keydown, this)); // Input: keyup
this.$input.on('keyup', $.proxy(this._keyup, this)); // Dropdown item: click
this.$container.on('click.item', '.option-item', $.proxy(this._select, this));
},
_keydown: function _keydown(event) {
switch (event.which) {
case keys.ESC:
this.$container.trigger('dropdown:close');
break;
case keys.UP:
this._move('up', event);
event.stopPropagation();
break;
case keys.DOWN:
this._move('down', event);
event.stopPropagation();
break;
case keys.TAB:
this._enter(event);
break;
case keys.RIGHT:
//this._autofill(event);
break;
case keys.ENTER:
this._enter(event);
break;
default:
break;
}
},
_keyup: function _keyup(event) {
switch (event.which) {
case keys.ESC:
case keys.ENTER:
case keys.UP:
case keys.DOWN:
case keys.LEFT:
case keys.RIGHT:
case keys.TAB:
case keys.SHIFT:
break;
default:
this._filter(event.target.value);
break;
}
},
_enter: function _enter(event) {
var item = this._getHovered();
this._select(item);
},
_move: function _move(dir, event) {
var items = this._getVisible(),
current = this._getHovered(),
index = current.prevAll('.option-item').filter(':visible').length,
total = items.length;
switch (dir) {
case 'up':
index--;
index < 0 && (index = total - 1);
break;
case 'down':
index++;
index >= total && (index = 0);
break;
}
items.removeClass('option-hover').eq(index).addClass('option-hover');
if (!this.opened) this.$container.trigger('dropdown:open');
this._fixScroll();
},
_select: function _select(event) {
var item = event.currentTarget ? $(event.currentTarget) : $(event); //if (!item.length) return;
var index = item.data('index');
this._selectByIndex(index);
this.$container.trigger('dropdown:close');
},
/**
* Set selected index and trigger change
* @type {[type]}
*/
_selectByIndex: function _selectByIndex(index) {
if (typeof index == 'undefined') {
// 为空设置不选中
index = -1;
}
this._getAll().removeClass('option-selected').filter(function () {
return $(this).data('index') == index;
}).addClass('option-selected');
this._change();
},
_autofill: function _autofill() {
var item = this._getHovered();
if (item.length) {
var index = item.data('index');
this._selectByIndex(index);
}
},
_filter: function _filter(search) {
var self = this,
items = this._getAll(),
needle = $.trim(search).toLowerCase(),
reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'),
pattern = '(' + search.replace(reEscape, '\\$1') + ')'; // Unwrap all markers
$('.combo-marker', items).contents().unwrap(); // Search
if (needle) {
// Hide Disabled and optgroups
this.$items.filter('.option-group, .option-disabled').hide();
items.hide().filter(function () {
var $this = $(this),
text = $.trim($this.text()).toLowerCase(); // Found
if (text.toString().indexOf(needle) != -1) {
// Wrap the selection
$this.html(function (index, oldhtml) {
return oldhtml.replace(new RegExp(pattern, 'gi'), '<span class="combo-marker">$1</span>');
});
return true;
}
}).show();
} else {
items.show();
} // Open the dropdown
this.$container.trigger('dropdown:open'); // 搜索结果为不存在时候显示
if (this._getVisible().length == 0) {
this.$items.filter('.option-item-empty').show();
} else {
this.$items.filter('.option-item-empty').hide();
}
},
_highlight: function _highlight() {
/*
1. Check if there is a selected item
2. Add hover class to it
3. If not add hover class to first item
*/
var visible = this._getVisible().removeClass('option-hover'),
$selected = visible.filter('.option-selected');
if ($selected.length) {
$selected.addClass('option-hover');
} else {
visible.removeClass('option-hover').first().addClass('option-hover');
}
},
_updateInput: function _updateInput() {
var item = this._getAll().filter('.option-selected');
var index = item.data('index');
this.onSelect.call(this, this.items[index]);
/*
if (index) {
this.onSelect.call(this, this.items[index]);
} else {
this.onSelect.call(this, this.items[index]);
}*/
},
_focus: function _focus(event) {
// Toggle focus class
this.$container.toggleClass('combo-focus', !this.opened); // Open combo
if (!this.opened) this.$container.trigger('dropdown:open');
},
_change: function _change() {
this._updateInput();
},
_getAll: function _getAll() {
return this.$items.filter('.option-item');
},
_getVisible: function _getVisible() {
return this.$items.filter('.option-item').filter(':visible');
},
_getHovered: function _getHovered() {
return this._getVisible().filter('.option-hover');
},
_open: function _open() {
var self = this;
this.$container.addClass('combo-open');
this.$arrow.addClass('combo-arrow-open');
this.opened = true; // Highligh the items
this._highlight(); // Fix scroll
this._fixScroll(); // Close all others
$.each($.fn[pluginName].instances, function (i, plugin) {
if (plugin != self && plugin.opened) plugin.$container.trigger('dropdown:close');
});
},
_toggle: function _toggle(e) {
this.opened ? this._close.call(this) : this._open.call(this);
this.$input.focus();
e.stopPropagation();
},
_close: function _close() {
this.$container.removeClass('combo-open combo-focus');
this.$arrow.removeClass('combo-arrow-open');
this.$container.trigger('dropdown:closed');
this.opened = false; // Show all items
this.$items.filter('.option-item').show();
},
_fixScroll: function _fixScroll() {
// If dropdown is hidden
if (this.$dropdown.is(':hidden')) return; // Else
var item = this._getHovered();
if (!item.length) return; // Scroll
var offsetTop,
upperBound,
lowerBound,
heightDelta = item.outerHeight();
offsetTop = item[0].offsetTop;
upperBound = this.$dropdown.scrollTop();
lowerBound = upperBound + this.settings.maxHeight - heightDelta;
if (offsetTop < upperBound) {
this.$dropdown.scrollTop(offsetTop);
} else if (offsetTop > lowerBound) {
this.$dropdown.scrollTop(offsetTop - this.settings.maxHeight + heightDelta);
}
},
/**
* 更新
*/
_update: function _update() {
this.$dropdown.empty();
this._build();
},
/**
* 销毁
*/
dispose: function dispose() {
// 删除dom
this.$arrow.remove();
this.$input.remove();
this.$dropdown.remove();
}
});
$.fn[pluginName] = function (options, args) {
this.each(function () {
var $e = $(this),
instance = $e.data('plugin_' + dataKey);
if (typeof options === 'string') {
if (instance && typeof instance[options] === 'function') {
instance[options](args);
}
} else {
if (instance && instance.dispose) {
instance.dispose();
}
$.data(this, "plugin_" + dataKey, new Plugin(this, options));
}
});
return this;
};
$.fn[pluginName].instances = [];
})(jQuery);
;
(function ($) {
var inputLock; // 用于中文输入法输入时锁定搜索
var grid = null;
/**
* 设置或获取输入框的 alt 值
*/
function setOrGetAlt($input, val) {
return val !== undefined ? $input.attr('alt', val) : $input.attr('alt');
}
/**
* 判断字段名是否在 options.effectiveFields 配置项中
* @param {String} field 要判断的字段名
* @param {Object} options
* @return {Boolean} effectiveFields 为空时始终返回 true
*/
function inEffectiveFields(field, options) {
var effectiveFields = options.effectiveFields;
return !(field === '__index' || effectiveFields.length && !~$.inArray(field, effectiveFields));
}
/**
* 判断字段名是否在 options.searchFields 搜索字段配置中
*/
function inSearchFields(field, options) {
return ~$.inArray(field, options.searchFields);
}
/**
* 显示下拉列表
*/
function showDropMenu($input, options) {
var $dropdownMenu = $('#gdoo-gird-suggest');
if (!$dropdownMenu.is(':visible')) {
$dropdownMenu.show();
$input.trigger('onShowDropdown', [options ? options.data : []]);
}
}
/**
* 隐藏下拉列表
*/
function hideDropMenu($input, options) {
var $dropdownMenu = $('#gdoo-gird-suggest');
if ($dropdownMenu.is(':visible')) {
$dropdownMenu.hide();
$input.trigger('onHideDropdown', [options ? options.data : []]);
}
}
/**
* 下拉列表刷新
* 作为 fnGetData 的 callback 函数调用
*/
function refreshDropMenu($input, data, options) {
showDropMenu($input, options);
grid.remoteParams.q = $input.val();
grid.remoteData();
return $input;
}
/**
* 下拉列表刷新
* 作为 fnGetData 的 callback 函数调用
*/
function refreshDropMenu2($input, options) {
var params = options.query;
params.suggest = true;
var $dropdownMenu = $('#gdoo-gird-suggest');
$dropdownMenu.html('<div style="height:180px;overflow:auto;width:auto;"><div id="suggest-' + params.id + '" class="ag-theme-balham" style="width:100%;height:180px;border-left:1px solid #BDC3C7;border-right:1px solid #BDC3C7;"></div></div>');
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params);
event.trigger('open', params);
var sid = params.prefix == 1 ? 'sid' : 'id';
var gridDiv = document.querySelector("#suggest-" + params.id);
grid = new agGridOptions();
var multiple = params.multi == 0 ? false : true;
grid.remoteDataUrl = app.url(params.url);
grid.remoteParams = params;
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.suppressRowClickSelection = true;
grid.columnDefs = [//{suppressMenu: true, cellClass:'text-center', checkboxSelection: true, headerCheckboxSelection: multiple, suppressSizeToFit: true, sortable: false, width: 40},
//{suppressMenu: true, cellClass:'text-center', sortable: false, suppressSizeToFit: true, cellRenderer: 'htmlCellRenderer', field: 'images', headerName: '图片', width: 40},
{
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'code',
headerName: '存货编码',
width: 100
}, {
suppressMenu: true,
cellClass: 'text-left',
sortable: true,
field: 'name',
headerName: '产品名称',
minWidth: 140
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'spec',
headerName: '规格型号',
width: 100
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'barcode',
headerName: '产品条码',
width: 120
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'unit_id_name',
headerName: '计量单位',
width: 80
}, {
suppressMenu: true,
cellClass: 'text-right',
field: 'price',
headerName: '价格',
width: 80
}];
grid.onRowClicked = function (row) {
var ret = grid.dialogSelected(row.data);
if (ret) {
hideDropMenu($input, options);
}
};
/**
* 写入选中
*/
grid.dialogSelected = function (selectedRow) {
var ret = true;
var list = gdoo.forms[params.form_id];
var links = list.links[params.id];
var item = options.item; // 如果传入的行id为0
if (query.grid_id == 0) {
query.grid_id = list.lastEditCell.data.id;
}
for (key in links) {
item[key] = selectedRow[links[key]];
}
if (event.exist('onSelect')) {
ret = event.trigger('onSelect', item, selectedRow);
}
list.lastEditCell.data = item;
list.api.memoryStore.update(item);
$input.trigger('onSelect', [item]);
list.generatePinnedBottomData();
return ret;
};
new agGrid.Grid(gridDiv, grid);
return $input;
}
/**
* 检测 keyword 与 value 是否存在互相包含
* @param {String} keyword 用户输入的关键字
* @param {String} key 匹配字段的 key
* @param {String} value key 字段对应的值
* @param {Object} options
* @return {Boolean} 包含/不包含
*/
function isInWord(keyword, key, value, options) {
value = $.trim(value);
if (options.ignorecase) {
keyword = keyword.toLocaleLowerCase();
value = value.toLocaleLowerCase();
}
return value && (inEffectiveFields(key, options) || inSearchFields(key, options)) && ( // 必须在有效的搜索字段中
~value.indexOf(keyword) || // 匹配值包含关键字
options.twoWayMatch && ~keyword.indexOf(value) // 关键字包含匹配值
);
}
/**
* 通过 ajax 或 json 参数获取数据
*/
function getData(keyword, $input, callback, options) {
var data,
validData,
filterData = [],
i,
key,
len;
keyword = keyword || ''; // 给了url参数则从服务器 ajax 请求
if (options.url) {
callback($input, options.data, options);
} else {
data = options.data;
validData = data; // 本地的 data 数据,则在本地过滤
if (validData) {
if (keyword) {
// 输入不为空时则进行匹配
len = data.length;
for (i = 0; i < len; i++) {
for (key in data[i]) {
if (data[i][key] && isInWord(keyword, key, data[i][key] + '', options)) {
filterData.push(data[i]);
filterData[filterData.length - 1].__index = i;
break;
}
}
}
} else {
filterData = data;
}
}
callback($input, filterData, options);
}
}
/**
* 取得 clearable 清除按钮
*/
function getIClear($input, options) {
var $iClear = $input.prev('i.clearable'); // 是否可清除已输入的内容(添加清除按钮)
if (options.clearable && !$iClear.length) {
$iClear = $('<i class="clearable glyphicon glyphicon-remove"></i>').prependTo($input.parent());
}
return $iClear.css({
position: 'absolute',
top: 12,
// right: options.showBtn ? Math.max($input.next('.input-group-btn').width(), 33) + 2 : 12,
zIndex: 4,
cursor: 'pointer',
fontSize: 12
}).hide();
}
/**
* 默认的配置选项
* @type {Object}
*/
var defaultOptions = {
query: {},
item: {},
data: [],
allowNoKeyword: true,
ignorecase: false,
searchFields: [],
twoWayMatch: true,
delay: 300,
showBtn: true,
clearable: false,
/* key */
keyLeft: 37,
keyUp: 38,
keyRight: 39,
keyDown: 40,
keyEnter: 13,
fnGetData: getData
};
var methods = {
init: function init(options) {
// 参数设置
var self = this;
options = options || {};
options = $.extend(true, {}, defaultOptions, options);
return self.each(function () {
var $input = $(this),
$parent = $input.parent(),
$iClear = getIClear($input, options),
isMouseenterMenu,
keyupTimer; // keyup 与 input 事件延时定时器
var $dropdownMenu = $('#gdoo-gird-suggest');
if ($dropdownMenu.length === 0) {
$dropdownMenu = $('<div class="gdoo-gird-suggest" id="gdoo-gird-suggest" style="position:absolute;display:none;box-shadow:0 2px 5px 0 rgb(0 0 0 / 26%);"></div>');
$('body').append($dropdownMenu);
}
refreshDropMenu2($input, options);
/*
var offset = $input.offset();
var height = $input.outerHeight();
$dropdownMenu.css({left: offset.left - 1, top: offset.top + height - 1});
*/
$input.off(); // 是否显示 button 按钮
if (!options.showBtn) {
$input.css('borderRadius', 4);
$parent.css('width', '100%').find('.btn:eq(0)').hide();
} // 移除 disabled 类,并禁用自动完成
$input.removeClass('disabled').prop('disabled', false).attr('autocomplete', 'off'); // 开始事件处理
$input.on('keydown', function (event) {
// 当提示层显示时才对键盘事件处理
if (!$dropdownMenu.is(':visible')) {
return;
}
if (event.keyCode === options.keyEnter) {
hideDropMenu($input, options);
}
}).on('compositionstart', function (event) {
// 中文输入开始,锁定
inputLock = true;
}).on('compositionend', function (event) {
// 中文输入结束,解除锁定
inputLock = false;
}).on('keyup input paste', function (event) {
var word; // 如果弹起的键是回车、向上或向下方向键则返回
if (~$.inArray(event.keyCode, [options.keyDown, options.keyUp, options.keyEnter])) {
$input.val($input.val()); // 让鼠标输入跳到最后
return;
}
clearTimeout(keyupTimer);
keyupTimer = setTimeout(function () {
// 锁定状态,返回
if (inputLock) {
return;
}
word = $input.val(); // 若输入框值没有改变则返回
if ($.trim(word) && word === setOrGetAlt($input)) {
return;
} // 是否允许空数据查询
if (!word.length && !options.allowNoKeyword) {
return;
}
options.fnGetData($.trim(word), $input, refreshDropMenu, options);
}, options.delay || 300);
}).on('blur', function () {
// 不是进入下拉列表状态,则隐藏列表
if (!isMouseenterMenu) {
hideDropMenu($input, options);
}
}).on('focus', function () {
$dropdownMenu.off();
var w = $(window).width();
var h = $(window).height();
var width = $input.outerWidth();
var height = $input.outerHeight();
var offset = $input.offset();
var dw = $dropdownMenu.outerWidth();
var dh = $dropdownMenu.outerHeight();
var css = {
top: offset.top + height
}; // 判断是否小于768
if (w < 768) {
css.minWidth = 360;
css.left = 14;
css.right = 14;
} else {
css.left = offset.left - 1; // 右边超出
if (w < offset.left + dw + 10) {
css.left = offset.left - dw + width + 1;
} // 下边超出
if (h < offset.top + dh + 10) {
css.top = offset.top - dh;
}
}
$dropdownMenu.css(css); // 列表中滑动时,输入框失去焦点
$dropdownMenu.on('mouseenter', function () {
isMouseenterMenu = 1;
$input.blur();
}).on('mouseleave', function () {
isMouseenterMenu = 0;
$input.focus();
}).on('click', function () {
// 阻止冒泡
return false;
});
}); // 存在清空按钮
if ($iClear.length) {
$iClear.click(function () {});
$parent.mouseenter(function () {
if (!$input.prop('disabled')) {
$iClear.css('right', options.showBtn ? Math.max($input.next('.input-group-btn').width(), 33) + 2 : 12).show();
}
}).mouseleave(function () {
$iClear.hide();
});
}
});
},
show: function show() {
return this.each(function () {
$(this).click();
});
},
hide: function hide() {
return this.each(function () {
hideDropMenu($(this));
});
},
disable: function disable() {
return this.each(function () {
$(this).attr('disabled', true).parent().find('.btn:eq(0)').prop('disabled', true);
});
},
enable: function enable() {
return this.each(function () {
$(this).attr('disabled', false).parent().find('.btn:eq(0)').prop('disabled', false);
});
},
destroy: function destroy() {
return this.each(function () {
$(this).off().removeData('gdooSuggest').removeAttr('style').parent().find('.btn:eq(0)').off().show().attr('data-toggle', 'dropdown').prop('disabled', false) // .addClass(disabled);
.next().css('display', '').off();
});
}
};
$.fn['gdooSuggest'] = function (options) {
// 方法判断
if (typeof options === 'string' && methods[options]) {
var inited = true;
this.each(function () {
if (!$(this).data('gdooSuggest')) {
return inited = false;
}
}); // 只要有一个未初始化,则全部都不执行方法,除非是 init 或 version
if (!inited && 'init' !== options && 'version' !== options) {
return this;
} // 如果是方法,则参数第一个为函数名,从第二个开始为函数参数
return methods[options].apply(this, [].slice.call(arguments, 1));
} else {
// 调用初始化方法
return methods.init.apply(this, arguments);
}
};
})(jQuery);
var formGridList = {};
function gridForms(master, table, options) {
options.master = master;
var grid = gridForm(table, options);
formGridList[master].push(grid);
return grid;
}
function gridForm(table, options) {
var defaults = {
heightTop: 70,
data: [],
dataType: 'local'
};
options = $.extend(defaults, options);
var grid = new agGridOptions();
grid.suppressLoadingOverlay = true;
grid.suppressNoRowsOverlay = true;
grid.rowMultiSelectWithClick = false;
grid.singleClickEdit = true;
grid.rowSelection = 'single';
grid.suppressCellSelection = false;
grid.suppressRowClickSelection = false;
grid.columnDefs = options.columns;
grid.links = options.links;
grid.tableTitle = options.title;
grid.tableKey = options.table;
grid.tableSaveDataNotEmpty = options.saveDataNotEmpty;
grid.defaultColDef.sortable = false;
grid.defaultColDef.filter = false;
grid.defaultColDef.suppressMenu = true;
grid.defaultColDef.suppressNavigable = true;
grid.isEditing = false;
grid.isEditingDialog = false;
var event = gdoo.event.get('grid.' + table);
var editable = event.args.editable || {};
grid.defaultColDef.editable = function (params) {
if (params.node.rowPinned) {
return false;
}
var col = params.colDef;
var fun = editable[col.field];
if (typeof fun == 'function') {
return fun.call(grid, params);
} else {
if (params.colDef._editable) {
return true;
}
return false;
}
};
grid.getRowNodeId = function (data) {
if (data.id) {
return data.id;
}
};
grid.onRowClicked = function (row) {};
grid.stopEditingWhenGridLosesFocus = false;
grid.onRowDoubleClicked = function (row) {};
grid.onCellEditingStarted = function (params) {
grid.lastEditCell = params;
grid.isEditingDialog = params.colDef.cellEditor == 'dialogCellEditor';
grid.isEditing = true;
};
grid.onCellEditingStopped = function () {
grid.isEditing = false;
if (grid.isEditingDialog) {
$('#gdoo-gird-suggest').hide();
}
};
var autoHeight = false;
var gridDiv = document.querySelector('#grid_' + table);
if (gridDiv.style.height == '') {
autoHeight = true;
gridDiv.style.height = getTabContentHeight() + 'px';
}
event.trigger('init', grid);
new agGrid.Grid(gridDiv, grid);
grid.api.dialogSelected = function (query, selectedRows) {
var dialogEvent = gdoo.event.get(query.form_id + '.' + query.id);
var links = options.links[query.id]; //var dialogGrid = gdoo.dialogs[query.form_id + '_' + query.id];
//var selectedRows = dialogGrid.getSelectedRows();
var store = grid.api.memoryStore;
var rows = [];
grid.api.forEachNode(function (rowNode, index) {
if (rowNode.data[query.id] == undefined) {
rows.push(rowNode.data);
}
}); // 如果传入的行id为0
if (query.grid_id == 0) {
query.grid_id = grid.lastEditCell.data.id;
}
for (var _i = 0; _i < selectedRows.length; _i++) {
var row = rows[_i];
var update = true;
if (row == undefined) {
row = {};
update = false;
}
if (selectedRows.length == 1) {
var res = grid.api.getSelectedRows();
if (res.length == 0) {
row = {};
if (query.grid_id) {
var node = grid.api.getRowNode(query.grid_id);
row = node.data;
update = true;
}
} else {
if (query.grid_id) {
row = res[0];
update = true;
}
}
}
var selectedRow = selectedRows[_i];
for (key in links) {
row[key] = selectedRow[links[key]];
}
dialogEvent.trigger('onSelect', row, selectedRow);
if (update) {
store.update(row);
} else {
store.create(row);
} // 数据设置
if (selectedRows.length == 1) {
if (query.grid_id) {
$('#' + query.name + '_' + query.grid_id).val(row[query.name]);
}
}
}
grid.generatePinnedBottomData();
};
grid.api.memoryStore = {
lastIndex: 1,
created: [],
updated: [],
deleted: [],
create: function create(row, index) {
this.lastIndex++;
row['id'] = 'draft_' + this.lastIndex;
row = grid.calcRow(row);
this.created.push(row);
grid.api.updateRowData({
add: [row],
addIndex: index
});
},
update: function update(row) {
row = grid.calcRow(row);
this.updated.push(row);
grid.api.updateRowData({
update: [row]
});
},
"delete": function _delete(row, draft) {
if (draft == false) {
this.deleted.push(row);
} // 删除创建里的草稿数据
this.created = this.created.filter(function (item) {
return item.id == row.id ? false : true;
}); // 删除更新后的数据
this.updated = this.updated.filter(function (item) {
return item.id == row.id ? false : true;
});
var res = grid.api.updateRowData({
remove: [row]
});
grid.generatePinnedBottomData();
}
};
grid.onFirstDataRendered = function (params) {
var api = this.api; // 计算合计行
this.generatePinnedBottomData();
};
grid.calcRow = function (row, col) {
for (var i = 0; i < options.columns.length; i++) {
var column = options.columns[i];
if (column.calcRow) {
var fun = new Function('data', 'column', column.calcRow);
var value = parseFloat(fun(row, col || {}));
if (isNaN(value) || value === 0) {
value = '';
}
row[column.field] = value;
}
}
return row;
};
grid.onCellValueChanged = function (params) {
var me = this;
if (params.oldValue == params.newValue) {
return;
}
var data = params.data;
data = me.calcRow(data, params.column);
me.api.updateRowData({
update: [data]
});
me.generatePinnedBottomData();
}; // 本地数据类型,初始化一条数据
if (options.dataType == 'local') {
if (options.data.length > 0) {
if (typeof event.dataLoaded == 'function') {
event.dataLoaded.call(grid, options.data);
}
grid.api.updateRowData({
add: options.data
});
} else {
grid.api.memoryStore.create({});
}
} // 删除方法
grid.api.deleteRow = function (data) {
var rowNode = grid.api.getRowNode(data.id);
var row = rowNode.data; // 检查删除的是否是草稿
var id = '' + row.id;
var draft = id.indexOf('draft_');
if (draft === 0) {
grid.api.memoryStore["delete"](row, true);
} else {
grid.api.memoryStore["delete"](row, false);
}
}; // 绑定自定义事件
var $gridDiv = $(gridDiv);
$gridDiv.off();
$gridDiv.on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.action == 'option') {
if (data.type == 'add') {
grid.api.memoryStore.create({});
} else {
// 最后一行不能删除
var count = grid.api.getDisplayedRowCount();
if (count > 1) {
grid.api.deleteRow(data);
}
}
}
}); // 编辑器失去焦点关闭
$gridDiv.on('blur', '.ag-input-wrapper', function () {
if (grid.isEditingDialog) {
return;
}
if (grid.isEditing) {
grid.api.stopEditing();
}
});
function getTabContentHeight() {
var list = $('#tab-content-' + options.master).position();
var height = $(window).height() - list.top - options.heightTop;
return height > 320 ? height : 320;
}
grid.onGridReady = function (params) {
event.trigger('ready', grid);
if (autoHeight) {
window.addEventListener('resize', function () {
setTimeout(function () {
gridDiv.style.height = getTabContentHeight() + 'px';
});
});
}
};
gdoo.forms[table] = grid;
return grid;
}
function getPanelHeight(v) {
var list = $('.gdoo-list-grid').position();
var position = list.top + v + 'px';
return 'calc(100vh - ' + position + ')';
}
(function (window, $) {
var localeText = {
page: "页",
more: "更多",
to: "到",
of: "至",
next: "下一页",
last: "上一页",
first: "首页",
previous: "上一页",
loadingOoo: "加载中...",
selectAll: "查询全部",
searchOoo: "查询...",
blanks: "空白",
filterOoo: "过滤...",
applyFilter: "daApplyFilter...",
equals: "相等",
notEqual: "不相等",
lessThan: "小于",
greaterThan: "大于",
lessThanOrEqual: "小于等于",
greaterThanOrEqual: "大于等于",
inRange: "范围",
contains: "包含",
notContains: "不包含",
startsWith: "开始于",
endsWith: "结束于",
group: "组",
columns: "列",
filters: "筛选",
rowGroupColumns: "laPivot Cols",
rowGroupColumnsEmptyMessage: "la drag cols to group",
valueColumns: "laValue Cols",
pivotMode: "laPivot-Mode",
groups: "laGroups",
values: "值",
pivots: "laPivots",
valueColumnsEmptyMessage: "la drag cols to aggregate",
pivotColumnsEmptyMessage: "la drag here to pivot",
toolPanelButton: "la tool panel",
noRowsToShow: "数据为空",
pinColumn: "laPin Column",
//valueAggregation: "laValue Agg",
//autosizeThiscolumn: "laAutosize Diz",
//autosizeAllColumns: "laAutsoie em All",
groupBy: "排序",
ungroupBy: "不排序",
resetColumns: "重置列",
expandAll: "展开全部",
collapseAll: "关闭",
toolPanel: "工具面板",
"export": "导出",
csvExport: "导出为CSV格式文件",
excelExport: "导出到Excel",
//pinLeft: "laPin &lt;&lt;",
//pinRight: "laPin &gt;&gt;",
//noPin: "laDontPin &lt;&gt;",
sum: "总数",
min: "最小值",
max: "最大值",
none: "无",
count: "总",
average: "平均值",
copy: "复制",
copyWithHeaders: "携带表头复制",
ctrlC: "ctrl + C",
paste: "粘贴",
ctrlV: "ctrl + V"
};
function OptionCellRenderer() {}
OptionCellRenderer.prototype.init = function (params) {
if (params.node.rowPinned) {
return;
}
this.eGui = document.createElement('div');
this.eGui.className = 'options';
this.eGui.innerHTML = '<a data-toggle="event" data-action="option" data-type="add" data-index="' + params.rowIndex + '" data-id="' + params.data.id + '" class="fa fa-plus" title="新增行"></a> <a data-toggle="event" data-action="option" data-type="delete" data-id="' + params.data.id + '" data-index="' + params.rowIndex + '" class="fa fa-times" title="删除行"></a></div>';
};
OptionCellRenderer.prototype.getGui = function () {
return this.eGui;
};
function HtmlCellRenderer() {}
HtmlCellRenderer.prototype.init = function (params) {
this.eGui = document.createElement('span');
this.eGui.innerHTML = params.value || '';
};
HtmlCellRenderer.prototype.getGui = function () {
return this.eGui;
};
function ActionCellRenderer() {}
ActionCellRenderer.prototype.init = function (params) {
var gridOptions = params.api.gridCore.gridOptions;
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
var data = params.data;
var links = '';
if (data.master_id > 0) {
params.colDef.options.forEach(function (action) {
if (action.display) {
var html = '<a data-toggle="event" class="option" data-action="' + action.action + '" data-master_name="' + data.name + '" data-master_id="' + data.master_id + '" href="javascript:;">' + action.name + '</a>';
links += gridOptions.actionCellBeforeRender(html, action, data) || '';
}
});
}
this.eGui = document.createElement('span');
this.eGui.innerHTML = links;
};
ActionCellRenderer.prototype.getGui = function () {
return this.eGui;
};
function SelectCellEditor() {}
SelectCellEditor.prototype.init = function (params) {
this.grid = params;
this.selectedKey = null;
this.items = params.colDef.cellEditorParams.values;
this.eInput = document.createElement('input');
this.eInput.value = params.value || '';
this.eInput.className = 'ag-cell-edit-input form-control';
};
SelectCellEditor.prototype.getGui = function (params) {
return this.eInput;
};
SelectCellEditor.prototype.afterGuiAttached = function () {
var me = this;
var grid = me.grid;
var oValue = me.eInput.value; // 初始化编辑器
$(me.eInput).agDropdownCellEditor({
grid: me,
arrow: 'fa-caret-down',
data: {
items: me.items,
selected: grid.data[grid.select_key]
},
select: function select(item) {
if (item) {
grid.data[grid.select_key] = item.id;
me.eInput.value = item.name;
me.selectedKey = item.id;
} else {
me.eInput.value = oValue;
}
grid.stopEditing();
}
});
me.eInput.focus();
me.eInput.select();
};
SelectCellEditor.prototype.getValue = function () {
return this.eInput.value;
};
SelectCellEditor.prototype.destroy = function () {
$('body').find('.combo-select').remove();
};
function CheckboxCellRenderer() {}
CheckboxCellRenderer.prototype.init = function (params) {
var value = params.value;
var values = params.colDef.cellEditorParams.values;
this.eGui = document.createElement('div');
this.eGui.innerHTML = values[value] || values[0];
};
CheckboxCellRenderer.prototype.getGui = function () {
return this.eGui;
};
function CheckboxCellEditor() {}
CheckboxCellEditor.prototype.init = function (params) {
var value = params.value;
this.eInput = document.createElement('input');
this.eInput.type = 'checkbox';
this.eInput.checked = value;
this.eInput.value = value;
};
CheckboxCellEditor.prototype.getGui = function (params) {
return this.eInput;
};
CheckboxCellEditor.prototype.afterGuiAttached = function () {
var me = this;
me.eInput.focus();
me.eInput.select();
};
CheckboxCellEditor.prototype.getValue = function () {
return this.eInput.checked ? 1 : 0;
};
CheckboxCellEditor.prototype.destroy = function () {};
function DialogCellEditor() {}
DialogCellEditor.prototype.init = function (params) {
this.params = params;
this.eInput = document.createElement('div');
this.eInput.tabIndex = '-1';
var key = params.colDef.field + '_' + params.data.id;
var query = params.query;
query.multi = 1;
query.is_grid = 1;
query.url = params.url;
query.grid_id = params.data.id;
query.title = params.title;
var url = '';
$.each(query, function (k, v) {
url += ' data-' + k + '="' + v + '"';
});
this.query = query;
this.eInput.innerHTML = '<input class="ag-cell-edit-input" value="' + (params.value || '') + '" id="' + key + '"><a class="combo-arrow" data-toggle="dialog-view" ' + url + '><i class="fa fa-search"></i></a>';
this.eInput.className = 'ag-input-wrapper ag-input-dialog-wrapper';
};
DialogCellEditor.prototype.getGui = function (params) {
return this.eInput;
};
DialogCellEditor.prototype.afterGuiAttached = function () {
var me = this;
$(me.eInput).find('input').gdooSuggest({
item: me.params.data,
query: me.query
}).on('onSelect', function (e, item) {
me.params.data[me.query.name] = item[me.query.name];
me.eInput.querySelector('input').value = item[me.query.name];
});
me.eInput.querySelector('input').select();
};
DialogCellEditor.prototype.getValue = function () {
return this.params.data[this.params.query.name];
};
DialogCellEditor.prototype.destroy = function () {
var me = this;
$(me.eInput).find('input').off();
};
DialogCellEditor.prototype.isPopup = function () {
return false;
};
function DateCellEditor() {}
DateCellEditor.prototype.init = function (params) {
this.params = params.colDef.cellEditorParams;
this.eInput = document.createElement('div');
this.eInput.innerHTML = '<input type="text" class="ag-cell-edit-input" data-toggle="date" value="' + (params.value || '') + '">';
this.eInput.className = 'ag-input-wrapper ag-input-date-wrapper';
};
DateCellEditor.prototype.getGui = function (params) {
return this.eInput;
};
DateCellEditor.prototype.afterGuiAttached = function () {
this.eInput.querySelector('input').click();
};
DateCellEditor.prototype.getValue = function () {
return this.eInput.querySelector('input').value;
};
DateCellEditor.prototype.destroy = function () {};
function agGridOptions() {
// 定义ag-grid默认参数
var gridOptions = {
defaultColDef: {
minWidth: 100,
enableRowGroup: true,
enablePivot: true,
enableValue: true,
sortable: true,
resizable: true,
filter: true,
comparator: function comparator(a, b) {
if (this.cellRenderer == 'htmlCellRenderer') {
a = delHtmlTag(a);
b = delHtmlTag(b);
return a.localeCompare(b);
}
return typeof a === 'string' ? a.localeCompare(b) : a > b ? 1 : a < b ? -1 : 0;
}
},
pinnedBottomRowData: [],
rowDragManaged: true,
suppressRowClickSelection: true,
rowMultiSelectWithClick: false,
rowSelection: 'multiple',
localeText: localeText,
suppressAnimationFrame: true,
suppressContextMenu: true,
// 关闭参数检查
suppressPropertyNamesCheck: true,
suppressCellSelection: true,
enableCellTextSelection: true,
// 自定义后端数据地址
remoteDataUrl: '',
remoteParams: {},
dialogList: {},
editableList: {},
autoColumnsToFit: true,
lastEditCell: {},
selectedRows: [],
pager: false,
pagerDom: null,
pagePer: 50,
// 格式化数字时候默认值是否强行为空
numberEmptyDefaultValue: false,
pageList: [50, 100, 500, 1000, 2000, 5000, 10000, 20000, 50000],
onCellEditingStarted: function onCellEditingStarted(params) {
this.lastEditCell = params;
},
remoteBeforeSuccess: function remoteBeforeSuccess() {},
remoteAfterSuccess: function remoteAfterSuccess() {},
onGridSizeChanged: function onGridSizeChanged() {},
onGridReady: function onGridReady() {},
onFirstDataRendered: function onFirstDataRendered(params) {
var me = this;
var api = me.api;
if (me.autoColumnsToFit) {
api.sizeColumnsToFit();
}
if (typeof me.onCustomFirstDataRendered == "function") {
me.onCustomFirstDataRendered.call(me, params);
} // 计算合计行
me.generatePinnedBottomData();
},
onCellValueChanged: function onCellValueChanged(params) {
this.generatePinnedBottomData();
},
getRowStyle: function getRowStyle(params) {},
onRowClicked: function onRowClicked(params) {
var selected = params.node.isSelected();
if (selected === false) {
params.node.setSelected(true, true);
}
},
getSelectedRows: function getSelectedRows() {
return this.selectedRows;
},
onRowSelected: function onRowSelected(params) {
var me = this;
var node = params.node;
if (node.selected) {
me.selectedRows.push(node.data);
} else {
for (var _i2 = 0; _i2 < me.selectedRows.length; _i2++) {
var select = me.selectedRows[_i2];
if (node.data.id == select.id) {
me.selectedRows.splice(_i2, 1);
}
}
}
},
columnTypes: {
number: {
cellClass: 'ag-cell-number',
valueFormatter: function valueFormatter(params) {
var me = this;
if (params.node.rowPinned) {
if (params.colDef.calcFooter) {} else {
return '';
}
}
var options = params.colDef.numberOptions || {};
var places = options.places == undefined ? 2 : options.places;
var separator = options.separator == undefined ? '.' : options.separator;
var thousands = options.thousands == undefined ? ',' : options.thousands;
var defaultValue = options["default"] == undefined ? 0 : options["default"];
var value = parseFloat(params.value);
if (isNaN(value) || value == 0) {
return gridOptions.numberEmptyDefaultValue == false ? defaultValue : '';
}
value = number_format(value, places, separator, thousands);
return value;
},
valueParser: function valueParser(params) {
var value = parseFloat(params.newValue);
if (isNaN(value)) {
return 0;
}
return value;
}
},
sn: {
cellClass: 'ag-cell-sn',
valueFormatter: function valueFormatter(params) {
if (params.node.rowPinned) {
return '';
}
return parseInt(params.node.childIndex) + 1;
},
valueParser: function valueParser(params) {
return parseFloat(params.newValue);
}
},
datetime: {
cellClass: 'ag-cell-datetime',
valueFormatter: function valueFormatter(params) {
if (params.node.rowPinned) {
return '';
}
return format_datetime(params.value);
},
valueParser: function valueParser(params) {
return parseFloat(params.newValue);
}
},
date: {
cellClass: 'ag-cell-date',
valueFormatter: function valueFormatter(params) {
if (params.node.rowPinned) {
return '';
}
return format_date(params.value);
},
valueParser: function valueParser(params) {
return parseFloat(params.newValue);
}
}
},
components: {
'optionCellRenderer': OptionCellRenderer,
'actionCellRenderer': ActionCellRenderer,
'htmlCellRenderer': HtmlCellRenderer,
'selectCellEditor': SelectCellEditor,
'dialogCellEditor': DialogCellEditor,
'dateCellEditor': DateCellEditor,
'checkboxCellEditor': CheckboxCellEditor,
'checkboxCellRenderer': CheckboxCellRenderer
},
overlayLoadingTemplate: '<span class="ag-overlay-loading-center">数据加载中...</span>',
overlayNoRowsTemplate: '<div style="padding-top:20px;"><img alt="暂无数据" src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxKSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgIDxlbGxpcHNlIGZpbGw9IiNGNUY1RjUiIGN4PSIzMiIgY3k9IjMzIiByeD0iMzIiIHJ5PSI3Ii8+CiAgICA8ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgIDxwYXRoIGQ9Ik01NSAxMi43Nkw0NC44NTQgMS4yNThDNDQuMzY3LjQ3NCA0My42NTYgMCA0Mi45MDcgMEgyMS4wOTNjLS43NDkgMC0xLjQ2LjQ3NC0xLjk0NyAxLjI1N0w5IDEyLjc2MVYyMmg0NnYtOS4yNHoiLz4KICAgICAgPHBhdGggZD0iTTQxLjYxMyAxNS45MzFjMC0xLjYwNS45OTQtMi45MyAyLjIyNy0yLjkzMUg1NXYxOC4xMzdDNTUgMzMuMjYgNTMuNjggMzUgNTIuMDUgMzVoLTQwLjFDMTAuMzIgMzUgOSAzMy4yNTkgOSAzMS4xMzdWMTNoMTEuMTZjMS4yMzMgMCAyLjIyNyAxLjMyMyAyLjIyNyAyLjkyOHYuMDIyYzAgMS42MDUgMS4wMDUgMi45MDEgMi4yMzcgMi45MDFoMTQuNzUyYzEuMjMyIDAgMi4yMzctMS4zMDggMi4yMzctMi45MTN2LS4wMDd6IiBmaWxsPSIjRkFGQUZBIi8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"><div style="padding-top:5px;color:#999;">暂无数据</div></div>'
};
gridOptions.generatePinnedBottomData = function () {
var me = this;
var result = {};
var renderer = false;
var columns = gridOptions.columnApi.getAllGridColumns();
columns.forEach(function (item) {
if (item.colDef.calcFooter) {
renderer = true;
result[item.colId] = me.calculatePinnedBottomData(item);
}
});
if (renderer) {
me.api.setPinnedBottomRowData([result]);
}
};
gridOptions.calculatePinnedBottomData = function (item) {
var value = 0;
gridOptions.api.forEachNode(function (row) {
value += toNumber(row.data[item.colId]);
});
return value == 0 ? '' : value;
}; // 格式化行按钮
gridOptions.actionCellBeforeRender = function (html, action, data) {
return html;
};
gridOptions.remoteData = function (params, success) {
var me = this;
var remoteParams = gridOptions.remoteParams;
for (var _key in params) {
remoteParams[_key] = params[_key];
}
gridOptions.api.showLoadingOverlay();
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
gridOptions.remoteBeforeSuccess.call(gridOptions, res);
if (typeof success === 'function') {
success(res);
}
if (res.per_page) {
if (me.pagerDom === null) {
var div = me.api.gridCore.eGridDiv;
var pageId = div.id + '-pager';
$(div).after('<div id="' + pageId + '" class="ag-pager"></div>');
me.pagerDom = $('#' + pageId).Paging({
pagesize: res.per_page,
count: res.total,
current: res.current_page,
pageSizeList: [50, 100, 500, 1000, 2000, 5000, 10000, 20000, 50000],
callback: function callback(page, size, count) {
me.remoteData2({
page: page,
limit: size
});
}
});
} else {
me.pagerDom[0].render({
pagesize: res.per_page,
count: res.total,
current: res.current_page
});
}
}
gridOptions.api.hideOverlay();
gridOptions.api.setRowData(res.data);
gridOptions.generatePinnedBottomData();
gridOptions.remoteAfterSuccess.call(gridOptions, res);
}, 'json');
};
gridOptions.remoteData2 = function (params, success) {
var me = this;
var remoteParams = gridOptions.remoteParams;
for (var _key2 in params) {
remoteParams[_key2] = params[_key2];
}
gridOptions.api.showLoadingOverlay();
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
gridOptions.remoteBeforeSuccess.call(gridOptions, res);
if (typeof success === 'function') {
success(res);
}
gridOptions.api.hideOverlay();
gridOptions.api.setRowData(res.data);
gridOptions.generatePinnedBottomData();
gridOptions.remoteAfterSuccess.call(gridOptions, res);
}, 'json');
};
return gridOptions;
}
window.agGridOptions = agGridOptions;
})(window, jQuery);
(function ($) {
var GdooEvent = function GdooEvent(args) {
var me = this;
me.args = args;
me.trigger = function (fun) {
if (typeof me.args[fun] == 'function') {
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
return me.args[fun].apply(me, args);
}
};
me.exist = function (fun) {
if (typeof me.args[fun] == 'function') {
return true;
}
return false;
};
};
var gdoo = {
formKey: function formKey(params) {
if (params.form_id) {
var key = params.form_id + '.' + params.id;
var id = params.form_id + '_' + params.id;
var name = params.form_id + '_' + params.name;
} else {
var key = params.id;
var id = params.id;
var name = params.name;
}
return {
id: id,
key: key,
name: name
};
},
widgets: {},
forms: {},
dialogs: {},
grids: {},
event: {
events: {},
set: function set(tag, fun) {
this.events[tag] = new GdooEvent(fun);
},
get: function get(tag) {
return this.events[tag] || new GdooEvent({});
}
}
};
/**
* 对话框初始化
*/
gdoo.dialogInit = function (params, grid) {
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('query', params); // 键盘按下和弹起事件
var ctrlNotActive = true;
document.onkeydown = function (event) {
event = event || window.event;
if (event.keyCode == 17) {
ctrlNotActive = false;
}
};
document.onkeyup = function (event) {
event = event || window.event;
if (event.keyCode == 17) {
ctrlNotActive = true;
}
};
var multiple = params.multi == 0 ? false : true; // 点击行不勾选
grid.suppressRowClickSelection = true; // 多选还是单选
grid.rowSelection = multiple ? 'multiple' : 'single';
grid.multiple = multiple;
grid.onRowClicked = function (row) {
var selected = row.node.isSelected();
if (multiple) {
if (selected === false) {
row.node.setSelected(true, ctrlNotActive);
}
if (selected === true && ctrlNotActive === false) {
row.node.setSelected(false, false);
}
} else {
if (selected === false) {
row.node.setSelected(true, true);
}
}
};
grid.onRowSelected = function (row) {
if (params.is_grid) {} else {
var sid = params.prefix == 1 ? 'sid' : 'id';
var res = dialogCacheSelected[option.id];
if (row.node.isSelected()) {
res[row.data[sid]] = row.data.name;
} else {
delete res[row.data[sid]];
}
dialogCacheSelected[option.id] = res;
}
};
grid.onRowDoubleClicked = function () {
var ret = gdoo.dialogSelected(event, params, option, grid);
if (ret == true) {
$('#gdoo-dialog-' + params.dialog_index).dialog('close');
}
}; // 数据加载后执行
grid.remoteAfterSuccess = function () {
gdoo.dialogInitSelected(params, option, grid);
};
gdoo.dialogs[option.id] = grid;
return option;
};
/**
* 对话框字段写入选中
*/
gdoo.dialogSelected = function (event, params, option, grid) {
var rows = grid.api.getSelectedRows();
if (params.is_grid) {
var list = gdoo.forms[params.form_id];
list.api.dialogSelected(params, rows);
} else {
var sid = params.prefix == 1 ? 'sid' : 'id';
var multiple = params.multi == 0 ? false : true;
var doc = getIframeDocument(params.iframe_id);
if (doc) {
var $option_id = $('#' + option.id, doc);
var $option_text = $('#' + option.id + '_text', doc);
} else {
var $option_id = $('#' + option.id);
var $option_text = $('#' + option.id + '_text');
}
var res = dialogCacheSelected[option.id] || {};
$.each(rows, function (k, row) {
res[row[sid]] = row.name;
});
$option_id.val(Object.keys(res).join(','));
$option_text.val(Object.values(res).join(','));
if (event.exist('onSelect')) {
return event.trigger('onSelect', multiple ? rows : rows[0]);
}
}
return true;
};
/**
* 初始化选择
*/
gdoo.dialogInitSelected = function (params, option, grid) {
if (params.is_grid) {} else {
var sid = params.prefix == 1 ? 'sid' : 'id';
var doc = getIframeDocument(params.iframe_id);
if (doc) {
var $option_id = $('#' + option.id, doc);
var $option_text = $('#' + option.id + '_text', doc);
} else {
var $option_id = $('#' + option.id);
var $option_text = $('#' + option.id + '_text');
}
if (params.is_org) {
var res = dialogCacheSelected[option.id];
} else {
var id = $option_id.val();
var text = $option_text.val();
var res = {};
if (id) {
var ids = id.split(',');
var texts = text.split(',');
for (var i = 0; i < ids.length; i++) {
res[ids[i]] = texts[i];
}
}
dialogCacheSelected[option.id] = res;
}
grid.api.forEachNode(function (node) {
var key = node.data[sid];
if (res[key] != undefined) {
node.setSelected(true);
}
});
}
};
/**
* grid列表显示构建
* @param {*} table
*/
gdoo.grid = function (table) {
var root = this;
this.table = table;
this.grid = new agGridOptions();
this.header = Vue.reactive({
init: false,
name: '',
master_table: '',
access: {},
create_btn: false,
trash_btn: false,
simple_search_form: true,
right_buttons: [],
left_buttons: [],
buttons: [],
tabs: {
items: [],
active: ''
},
search_form: {
columns: []
},
bys: {
name: '全部',
items: []
}
});
this.search = {
simple: {
el: null,
query: {}
},
advanced: {
el: null,
query: {}
}
};
this.action = new gridAction(); // 默认不自动计算栏目宽度
this.grid.autoColumnsToFit = false; // 默认点击行触发
this.grid.onRowDoubleClicked = function (params) {
if (params.node.rowPinned) {
return;
}
if (params.data == undefined) {
return;
}
if (params.data.master_id > 0) {
if (root.action.rowDoubleClick) {
root.action.rowDoubleClick(params.data);
}
}
};
this.div = function (height) {
var gridDiv = document.querySelector("#" + this.table + "-grid"); // 因为panel高度根据页面原素高度不一致这里设置修正值
gridDiv.style.height = this.getPanelHeight(height);
new agGrid.Grid(gridDiv, this.grid); // 绑定自定义事件
$(gridDiv).on('click', '[data-toggle="event"]', function () {
var data = $(this).data();
if (data.master_id > 0) {
root.action[data.action](data);
}
});
return gridDiv;
};
/**
* 获取panel计算整体窗口高度
*/
this.getPanelHeight = function (v) {
var list = $('.gdoo-list-grid').position();
var position = list.top + v + 'px';
return 'calc(100vh - ' + position + ')';
};
this.init = function (res) {
var me = this;
if (me.header.init == false) {
var header = res.header;
me.header.init = true;
me.header.create_btn = header.create_btn;
me.header.trash_btn = header.trash_btn;
me.header.name = header.name;
me.header.table = table; // 搜索
var search_form = header.search_form;
search_form.simple_search = header.simple_search_form;
me.header.search_form = search_form;
me.search.forms = search_form.forms; // 操作
me.action.table = table;
me.action.name = header.master_name;
me.action.bill_url = header.bill_uri; // access
if (header.access) {
me.header.access = header.access;
} // 按钮
if (header.right_buttons) {
me.header.right_buttons = header.right_buttons;
}
if (header.left_buttons) {
me.header.left_buttons = header.left_buttons;
}
if (header.buttons) {
me.header.center_buttons = header.buttons;
} // bys
if (header.bys) {
me.header.bys = header.bys;
if (search_form.params['by']) {
me.header.bys.active = search_form.params['by'];
for (var _i3 = 0; _i3 < header.bys.items.length; _i3++) {
var item = header.bys.items[_i3];
if (item.value == me.header.bys.active) {
me.header.bys.name = item.name;
}
}
} else {
me.header.bys.active = header.bys.items[0].value;
me.header.bys.name = header.bys.items[0].name;
}
} // tabs
if (header.tabs) {
me.header.tabs = header.tabs;
me.header.tabs.active = search_form.params['tab'] ? search_form.params['tab'] : header.tabs.items[0].value;
} // 设置栏目
me.grid.api.setColumnDefs(header.columns);
me.grid.columnDefs = header.columns;
me.grid.remoteParams = search_form.query; // 渲染完成显示div
$('#' + table + '-page').show();
setTimeout(function () {
me.searchForm();
}, 1);
}
};
this.searchForm = function () {
var me = this;
me.search.advanced.el = $('#' + me.table + '-search-form-advanced').searchForm({
data: me.search.forms,
advanced: true
});
me.search.simple.el = $('#' + me.table + '-search-form').searchForm({
data: me.search.forms
});
me.search.simple.el.find('#search-submit').on('click', function () {
var query = me.search.simple.el.serializeArray();
var params = {};
me.search.queryType = 'simple';
$.map(query, function (row) {
params[row.name] = row.value;
});
params['page'] = 1;
me.grid.remoteData(params);
return false;
});
};
this.setup = {
header: this.header,
action: this.action,
grid: this.grid
};
gdoo.grids[table] = {
grid: this.grid,
search: this.search
};
};
window.gdoo = gdoo;
})(jQuery);
var select2List = {};
(function ($) {
$.fn.select2Field = function (options) {
$this = $(this);
var key = $this.attr('key');
var event = gdoo.event.get(key);
var defaults = {
width: '100%',
placeholder: ' - ',
allowClear: true,
minimumInputLength: 0,
// 不需要每次都获取数据
resultCache: true,
ajax: {
type: 'POST',
url: '',
dataType: 'json',
delay: 250,
cache: false,
data: function data(params) {
var query = options.ajaxParams || {};
query.q = params.term || '';
query.page = params.page || 1;
query.resultCache = true;
event.trigger('query', query);
return query;
},
processResults: function processResults(res, params) {
return {
results: res.data,
pagination: {
more: res.current_page < res.last_page
}
};
}
},
escapeMarkup: function escapeMarkup(markup) {
return markup;
},
templateResult: function templateResult(m) {
return m.text;
},
// 函数用来渲染结果
templateSelection: function templateSelection(m) {
return m.text;
},
createTag: function createTag(params) {
var term = $.trim(params.term);
if (term === '') {
return null;
}
return {
id: 'draft_' + term,
text: term
};
},
initSelection: function initSelection(element, callback) {
var data = {
id: element.val(),
text: element.text()
};
callback(data);
}
};
options = $.extend(true, {}, defaults, options);
event.trigger('init', options);
var select2 = $this.select2(options);
select2.on('select2:select', function (e) {
event.trigger('onSelect', e.params.data);
});
select2.on('select2:opening', function () {});
select2.on('select2:open', function () {//select2.select2();
/*
var data = $(this).data('select2');
$('.select2-link').remove();
data.$results.parents('.select2-results')
.append('<div class="select2-link"><a> <i class="fa fa-plus-square"></i> 更多</a></div>')
.on('click', function () {
data.trigger('close');
});
*/
});
return select2;
};
})(jQuery);
(function ($) {
'use strict';
var grid = null;
/**
* 默认的配置选项
* @type {Object}
*/
var defaultOptions = {
query: {},
item: {},
data: [],
delay: 300,
showBtn: true,
clearable: false,
keyLeft: 37,
keyUp: 38,
keyRight: 39,
keyDown: 40,
keyEnter: 13
};
/**
* 显示下拉列表
*/
function showSuggest($input, options) {
var $dropdownMenu = $('#gdoo-suggest');
if (!$dropdownMenu.is(':visible')) {
$dropdownMenu.show();
$input.trigger('onShowSuggest', [options ? options.data : []]);
}
}
/**
* 隐藏下拉列表
*/
function hideSuggest($input, options) {
var $dropdownMenu = $('#gdoo-suggest');
if ($dropdownMenu.is(':visible')) {
$dropdownMenu.hide();
$input.trigger('onHideSuggest', [options ? options.data : []]);
}
}
/**
* 刷新数据
* ajax请求携带q参数
*/
function refreshData($input, options, params) {
showSuggest($input, options);
var event = gdoo.event.get(params.form_id + '.' + params.id);
event.trigger('open', params);
event.trigger('query', params);
params.suggest = true;
params.q = $input.val();
grid.rowSelection = params.multi == 1 ? 'multiple' : 'single';
grid.remoteDataUrl = app.url(params.url);
grid.remoteParams = params;
grid.remoteData();
return $input;
}
/**
* 构建 Suggest的agGrid
* 作为 fnGetData 的 callback 函数调用
*/
function buildSuggest($input, options, params) {
var $dropdownMenu = $('#gdoo-suggest');
$dropdownMenu.html('<div style="height:180px;overflow:auto;width:auto;"><div id="suggest-aggrid" class="ag-theme-balham" style="width:100%;height:180px;border-left:1px solid #BDC3C7;border-right:1px solid #BDC3C7;"></div></div>');
var gridDiv = document.querySelector("#suggest-aggrid");
grid = new agGridOptions();
grid.suppressRowClickSelection = true;
grid.columnDefs = [//{suppressMenu: true, cellClass:'text-center', checkboxSelection: true, headerCheckboxSelection: multiple, suppressSizeToFit: true, sortable: false, width: 40},
//{suppressMenu: true, cellClass:'text-center', sortable: false, suppressSizeToFit: true, cellRenderer: 'htmlCellRenderer', field: 'images', headerName: '图片', width: 40},
{
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'code',
headerName: '存货编码',
width: 100
}, {
suppressMenu: true,
cellClass: 'text-left',
sortable: true,
field: 'name',
headerName: '产品名称',
minWidth: 140
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'spec',
headerName: '规格型号',
width: 100
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'barcode',
headerName: '产品条码',
width: 120
}, {
suppressMenu: true,
cellClass: 'text-center',
sortable: true,
field: 'unit_id_name',
headerName: '计量单位',
width: 80
}, {
suppressMenu: true,
cellClass: 'text-right',
field: 'price',
headerName: '价格',
width: 80
}];
grid.onRowClicked = function (row) {
var ret = grid.dialogSelected([row.data]);
if (ret) {
hideSuggest($input, options);
}
};
/**
* 写入选中
*/
grid.dialogSelected = function (rows) {
var params = grid.remoteParams;
var sid = params.prefix == 1 ? 'sid' : 'id';
var id = [];
var text = [];
$.each(rows, function (index, row) {
id.push(row[sid]);
text.push(row.name);
});
var input_id = params.form_id + '_' + params.id;
$('#' + input_id).val(id.join(','));
$('#' + input_id + '_text').val(text.join(','));
var event = gdoo.event.get(params.form_id + '.' + params.id);
if (event.exist('onSelect')) {
return event.trigger('onSelect', grid.rowSelection == 'multiple' ? rows : rows[0]);
}
return true;
};
new agGrid.Grid(gridDiv, grid);
return $input;
}
$.fn.gdooDialogInput = function (options) {
var self = this;
options = options || {};
options = $.extend(true, {}, defaultOptions, options);
$('body').append('<div class="gdoo-gird-suggest" id="gdoo-suggest" style="position:absolute;display:none;box-shadow:0 2px 5px 0 rgb(0 0 0 / 26%);"></div>');
return self.each(function () {
var $input = $(this);
var params = $input.data();
var keyupTimer = null;
var isMouseenter = 0;
var $dropdownMenu = $('#gdoo-suggest');
buildSuggest($input, options, params);
$input.off(); // 开始事件处理
$input.on('keydown', function (event) {
// 当提示层显示时才对键盘事件处理
if (!$dropdownMenu.is(':visible')) {
return;
}
if (event.keyCode === options.keyEnter) {
hideSuggest($input, options);
}
}).on('keyup input paste', function (event) {
// 如果弹起的键是回车、向上或向下方向键则返回
if (~$.inArray(event.keyCode, [options.keyDown, options.keyUp, options.keyEnter])) {
$input.val($input.val()); // 让鼠标输入跳到最后
return;
}
clearTimeout(keyupTimer);
keyupTimer = setTimeout(function () {
refreshData($input, options, params);
}, options.delay);
}).on('focus', function () {
$dropdownMenu.off();
var w = $(window).width();
var h = $(window).height();
var width = $input.outerWidth();
var height = $input.outerHeight();
var offset = $input.offset();
var dw = $dropdownMenu.outerWidth();
var dh = $dropdownMenu.outerHeight();
var css = {
top: offset.top + height - 1
}; // 判断是否小于768
if (w < 768) {
css.minWidth = 360;
css.left = 14;
css.right = 14;
} else {
css.left = offset.left; // 右边超出
if (w < offset.left + dw + 10) {
css.left = offset.left - dw + width;
} // 下边超出
if (h < offset.top + dh + 10) {
css.top = offset.top - dh + 1;
}
}
$dropdownMenu.css(css); // 列表中滑动时,输入框失去焦点
$dropdownMenu.on('mouseenter', function () {
isMouseenter = 1;
$input.blur();
}).on('mouseleave', function () {
isMouseenter = 0;
$input.focus();
}).on('click', function () {
// 阻止冒泡
return false;
});
}).on('blur', function () {
// 隐藏对话框
if (!isMouseenter) {
hideSuggest($input, options);
}
});
});
};
})(jQuery);
(function ($) {
'use strict';
$.fn.searchForm = function (options) {
var self = this;
var element = [];
var data = options.data;
var advanced = options.advanced == 1 ? 1 : data.advanced == 1 ? 1 : 0;
var form_id = self.attr('id');
var assign = false;
var values = {};
var _field = 'search-field-';
var _condition = 'search-condition-';
var _value = 'search-value-';
if (advanced) {
_field = 'advanced-' + _field;
_condition = 'advanced-' + _condition;
_value = 'advanced-' + _value;
}
function init() {
if (advanced) {
$.each(data.field, function (i) {
var type = self.find('#' + _field + i).data('type');
setValues(type, i, data.option[i]);
});
} else {
var e = self.find('#' + _field + '0');
e.val(data['field'][0]);
var type = e.find('option:selected').data('type');
setValues(type, 0, data.option[0]);
e.on('change', function () {
assign = true;
var index = this.selectedIndex - 1;
var type = $(this).find('option:selected').data('type');
element[0].value.empty();
setValues(type, 0, data.option[index]);
});
}
}
function setValues(type, i, config) {
self.find('#' + _value + i);
element[i] = {
condition: self.find('#' + _condition + i),
value: self.find('#' + _value + i)
};
setCondition(i, type, data['condition'][i] || '');
handle[type].call(self, i, config);
}
function setCondition(i, type, selected) {
var e = element[i].condition.empty();
var condition = {};
if (assign == true) {
selected = '';
}
condition.number = [{
key: "eq",
value: '等于'
}, {
key: "neq",
value: '不等于'
}, {
key: "gt",
value: '大于'
}, {
key: "lt",
value: '小于'
}];
condition.date = [{
key: "eq",
value: '等于'
}, {
key: "neq",
value: '不等于'
}, {
key: "gt",
value: '大于'
}, {
key: "lt",
value: '小于'
}];
condition.second = [{
key: "eq",
value: '等于'
}, {
key: "neq",
value: '不等于'
}, {
key: "gt",
value: '大于'
}, {
key: "lt",
value: '小于'
}];
condition.text = [{
key: "like",
value: '包含'
}, {
key: "not_like",
value: '不包含'
}, {
key: "eq",
value: '等于'
}, {
key: "neq",
value: '不等于'
}, {
key: "gt",
value: '大于'
}, {
key: "lt",
value: '小于'
}, {
key: "empty",
value: '为空'
}, {
key: "not_empty",
value: '不为空'
}];
if (type == 'second' || type == 'text' || type == 'number' || type == 'date') {
var value = selected || condition[type][0].key;
$.map(condition[type], function (row) {
e.append('<option value="' + row.key + '">' + row.value + '</option>');
});
e.parent('div').css("display", "inline-block");
} else if (type == 'birthday') {
e.append('<option value="birthday">birthday</option>');
e.parent('div').hide();
var value = 'birthday';
} else if (type == 'date2') {
e.append('<option value="date2">date2</option>');
e.parent('div').hide();
var value = 'date2';
} else if (type == 'region') {
e.append('<option value="region">region</option>');
e.parent('div').hide();
var value = 'region';
} else if (type == 'second2') {
e.append('<option value="second2">second2</option>');
e.parent('div').hide();
var value = 'second2';
} else if (type == 'dialog') {
e.append('<option value="dialog">dialog</option>');
e.parent('div').hide();
var value = 'dialog';
} else {
e.append('<option value="eq">eq</option>');
e.parent('div').hide();
var value = 'eq';
}
e.val(value);
toggleValue(i, value);
e.on('change', function () {
toggleValue(i, $(this).val());
});
}
function toggleValue(i, value) {
var e = element[i].value;
if (value == 'empty' || value == 'not_empty') {
e.hide();
} else {
e.show();
}
}
function attr(i, id) {
var value = _value;
var name = 'search';
var res = {};
var id_0 = '';
var id_1 = '';
if (id != undefined) {
id_0 = '-' + id;
id_1 = '_' + id;
}
res.id = form_id + '_' + value + i + id_0;
res.name = name + '_' + i + id_1;
if (assign == false) {
if (id_0) {
var v1 = data['search'][i][id];
res.value = v1 == undefined ? '' : v1;
} else {
var v1 = data['search'][i];
res.value = v1 == undefined ? '' : v1;
}
} else {
res.value = '';
}
return res;
}
function _option(rows) {
var type = $.type(rows);
var option = advanced == true ? '<option value=""> - </option>' : '';
if (type == 'array' || type == 'object') {
$.map(rows, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
} else {
option = option.concat(rows);
}
return option;
}
self._select = function (config, i, id, space) {
var a = attr(i, id);
var d = _option(config);
var e = $('<select name="' + a.name + '" id="' + a.id + '" class="form-control input-sm">' + d + '</select>');
element[i].value.append(e);
if (a.value !== '') {
e.val(a.value);
}
};
self._text = function (i, id, space) {
var a = attr(i, id);
var e = $('<input name="' + a.name + '" id="' + a.id + '" value="' + a.value + '" type="text" class="form-control input-sm">');
element[i].value.append(e);
};
self._year = function (i, id, space) {
var a = attr(i, id);
var e = $('<input name="' + a.name + '" id="' + a.id + '" value="' + a.value + '" type="text" autocomplete="off" data-toggle="date" data-format="yyyy" class="form-control input-sm">');
element[i].value.append(e);
};
self._date = function (i, id, space) {
var a = attr(i, id);
var e = $('<input name="' + a.name + '" id="' + a.id + '" value="' + a.value + '" type="text" autocomplete="off" data-toggle="date" class="form-control input-sm">');
element[i].value.append(e);
};
self._date2 = function (i, id, space) {
var a0 = attr(i, 0);
var a1 = attr(i, 1);
var e = $('<table class="table date-field"><tr><td><input name="' + a0.name + '" id="' + a0.id + '" value="' + a0.value + '" type="text" data-toggle="date" autocomplete="off" class="form-control input-sm"></td><td class="date-apart"> - </td><td><input name="' + a1.name + '" id="' + a1.id + '" value="' + a1.value + '" type="text" autocomplete="off" data-toggle="date" class="form-control input-sm"></td></tr></table>');
element[i].value.append(e);
};
self._second2 = function (i, id, space) {
var a0 = attr(i, 0);
var a1 = attr(i, 1);
var e = $('<table class="table date-field"><tr><td><input name="' + a0.name + '" id="' + a0.id + '" value="' + a0.value + '" type="text" autocomplete="off" data-toggle="date" class="form-control input-sm"></td><td class="date-apart"> - </td><td><input name="' + a1.name + '" id="' + a1.id + '" value="' + a1.value + '" type="text" autocomplete="off" data-toggle="date" class="form-control input-sm"></td></tr></table>');
element[i].value.append(e);
};
self._birthday = function (i, id, space) {
var a0 = attr(i, 0);
var a1 = attr(i, 1);
var e = $('<input name="' + a0.name + '" id="' + a0.id + '" value="' + a0.value + '" type="text" data-toggle="date" autocomplete="off" data-format="MM-dd" class="form-control input-sm"> - <input name="' + a1.name + '" id="' + a1.id + '" value="' + a1.value + '" type="text" data-toggle="date" autocomplete="off" data-format="MM-dd" class="form-control input-sm">');
element[i].value.append(e);
};
self._birthday2 = function (i, id, space) {
var a0 = attr(i, 0);
var a1 = attr(i, 1);
var e = $('<input name="' + a0.name + '" id="' + a0.id + '" value="' + a0.value + '" type="text" data-toggle="date" autocomplete="off" data-format="MM-dd" class="form-control input-sm"> - <input name="' + a1.name + '" id="' + a1.id + '" value="' + a1.value + '" type="text" data-toggle="date" autocomplete="off" data-format="MM-dd" class="form-control input-sm">');
element[i].value.append(e);
};
self._dialog = function (config, i, id, space) {
var a0 = attr(i, id);
var query = [];
if (config.query) {
config.query['multi'] = config.query['multi'] == 'undefined' ? 1 : config.query['multi'];
$.each(config.query, function (k, v) {
query.push('data-' + k + '="' + v + '"');
});
}
if (advanced) {
var field = self.find('#' + _field + i);
} else {
var field = self.find('#' + _field + '0').find('option:selected');
}
var options = field.data();
var e = '<div class="select-group input-group">';
e += '<input class="form-control input-sm" data-toggle="dialog-view" readonly="readonly" data-title="' + options.title + '" data-url="' + config.url + '" data-id="' + a0.id + '" ' + query.join(' ') + ' style="min-width:153px;cursor:pointer;" id="' + a0.id + '_text" />';
e += '<input type="hidden" id="' + a0.id + '" name="' + a0.name + '" value="' + a0.value + '">';
e += '<div class="input-group-btn">';
e += '<a data-toggle="dialog-clear" data-id="' + a0.id + '" class="btn btn-sm btn-default"><i class="fa fa-times"></i></a>';
e += '</div>';
element[i].value.append($(e));
};
var handle = {
empty: function empty(i) {
element[i].value.empty();
},
text: function text(i) {
self._text(i);
},
select2: function select2(i) {
self._text(i);
},
select: function select(i, config) {
self._select(config, i);
},
number: function number(i) {
self._text(i);
},
year: function year(i) {
self._year(i);
},
date: function date(i) {
self._date(i);
},
date2: function date2(i) {
self._date2(i);
},
birthday: function birthday(i) {
self._birthday(i);
},
dialog: function dialog(i, config) {
self._dialog(config, i);
},
second: function second(i) {
self._date(i);
},
second2: function second2(i) {
self._second2(i);
},
option: function option(i, config) {
self._select(config, i);
},
address: function address(i) {
var province = attr(i, 0);
var city = attr(i, 1);
var e = '<select name="' + province.name + '" id="' + province.id + '" class="form-control input-sm"></select>&nbsp;<select name="' + city.name + '" id="' + city.id + '" class="form-control input-sm"></select>';
element[i].value.append(e);
new pcas(province.id, city.id, province.value, city.value);
},
region: function region(i) {
var province = attr(i, 0);
var city = attr(i, 1);
var county = attr(i, 2);
var province_id = province.value;
var city_id = city.value;
var county_id = county.value;
element[i].value.append('<select name="' + province.name + '" id="' + province.id + '" class="form-control input-sm"></select>&nbsp;<select name="' + city.name + '" id="' + city.id + '" class="form-control input-sm"></select>&nbsp;<select name="' + county.name + '" id="' + county.id + '" class="form-control input-sm"></select>');
$.get(app.url('index/api/region', {
layer: 1
}), function (res) {
var option = '';
$.map(res, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
var e = $('#' + province.id).html(option);
if (province_id) {
e.val(province_id);
}
_city(i);
_county(i);
self.on('change', '#' + province.id, function () {
province_id = this.value;
city_id = 0;
county_id = 0;
_city(i);
_county(i);
});
self.on('change', '#' + city.id, function () {
city_id = this.value;
county_id = 0;
_county(i);
});
});
function _city(i, space) {
$.get(app.url('index/api/region', {
layer: 2,
parent_id: province_id
}), function (res) {
var option = '';
$.map(res, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
var e = $('#' + city.id).html(option);
if (city_id) {
e.val(city_id);
}
});
}
function _county(i, space) {
$.get(app.url('index/api/region', {
layer: 3,
parent_id: city_id
}), function (res) {
var option = '';
$.map(res, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
var e = $('#' + county.id).html(option);
if (county_id) {
e.val(county_id);
}
});
}
},
circle: function circle(i) {
var circle = self.attr(i, 0);
var customer = self.attr(i, 1);
var circle_id = circle.value;
var customer_id = customer.value;
element[i].value.append('<select name="' + circle.name + '" id="' + circle.id + '" class="form-control input-sm"></select>&nbsp;<select name="' + customer.name + '" id="' + customer.id + '" class="form-control input-sm"></select>');
$.post(app.url('customer/circle/dialog'), function (res) {
var option = '<option value=""> - </option>';
$.map(res, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
var e = $('#' + circle.id).html(option);
if (circle_id) {
e.val(circle_id);
}
_customer(i);
});
self.on('change', '#' + circle.id, function () {
circle_id = this.value;
customer_id = 0;
_customer(i);
});
function _customer(i) {
var option = '<option value=""> - </option>';
if (circle_id) {
$.post(app.url('customer/customer/dialog', {
limit: 500,
circle_id: circle_id
}), function (res) {
$.map(res.data, function (row) {
option += '<option value="' + row.id + '">' + row.text + '</option>';
});
var e = $('#' + customer.id).html(option);
if (customer_id) {
e.val(customer_id);
}
});
} else {
$('#' + customer.id).html(option);
}
}
}
};
self.attr = attr;
self.element = element;
self.options = options;
if (typeof options.init == 'function') {
options.init.call(this, handle);
}
init();
return this;
};
})(jQuery);
(function ($) {
var COUNT = 0;
$.fn.dialog = function (options) {
var self = this,
$this = $(self),
$body = $(document.body),
$element = $this.closest('.dialog');
this.options = options;
var create = function create() {
// fade
var element = '<div class="dialog modal"><div class="modal-dialog"><div class="modal-content">';
if (options.title) {
element += '<div class="modal-header"><button type="button" data-dismiss="dialog" class="close">&times;</button><h4 class="modal-title"></h4></div>';
}
element += '<div class="modal-body"></div>';
if (options.buttons.length > 0) {
element += '<div class="modal-footer"></div>';
}
element += '</div></div></div>'; // 窗口创建一个以上遮罩只显示一层
// options.backdrop = COUNT > 0 ? '' : options.backdrop;
$element = $(element);
$body.append($element);
$element.find(".modal-body").append($this);
$element.modal({
backdrop: options.backdrop
}); //if(options.draggable === true) {
$('.modal-dialog').draggable({
handle: ".modal-header",
iframeFix: true
}); //}
};
var createButton = function createButton(_options) {
var buttons = (_options || options || {}).buttons || {},
$btnrow = $element.find(".modal-footer"); // clear old buttons
$btnrow.html('');
for (var button in buttons) {
var btn = buttons[button],
id = '',
text = '',
classed = 'btn-default',
click = '';
classed = btn['class'] || btn.classed || classed;
$button = $('<button type="button" class="btn btn-sm ' + classed + '">' + btn.text + '</button>');
$button.data('click', btn.click);
if (btn.id) {
$button.attr("id", btn.id);
}
$btnrow.append($button);
}
$btnrow.on('click', function (e) {
var click = $(e.target).data('click');
if (typeof click === 'function') {
click.call(self, e);
}
});
$btnrow.data('buttons', buttons);
};
var show = function show() {
$element.modal('show');
var showHandler = options.onShow || function () {};
showHandler.call(self);
};
var close = function close() {
$element.modal('hide');
};
var destroy = function destroy() {
$element.remove();
};
if (options.constructor == Object) {
var defaults = {
show: true,
backdrop: true,
destroy: false
};
options = $.extend(defaults, options);
if ($element.size() == 0) {
create();
createButton();
$element.find('.modal-title').html(options['title']);
if (options['dialogClass']) {
$element.find('.modal-dialog').addClass(options['dialogClass']);
}
$element.on('click', "[data-dismiss='dialog']", function () {
var closeHandler = options.onClose || close;
closeHandler.call(self);
});
$element.one('show.bs.modal', function () {
COUNT++;
});
$element.one('hidden.bs.modal', function () {
COUNT--;
if (COUNT > 0) {
$element.modal('checkScrollbar');
$body.addClass('modal-open');
$element.modal('setScrollbar');
} // 取消绑定的事件
// $element.off('click',"[data-dismiss='dialog']");
// 删除 $element
if (options.destroy == true) {
destroy();
}
});
if (options.modalClass) {
$element.addClass(options.modalClass);
}
}
if (options.show) {
show();
}
}
if (options == "destroy") {
options.destroy = true;
close();
}
if (options == "close") {
close();
}
if (options == "show") {
show();
}
return self;
};
})(jQuery);
(function ($) {
var modal = {
ok: {
text: "确定",
classed: 'btn-info'
},
cancel: {
text: "取消",
classed: 'btn-default'
}
};
$.messager = {};
$.messager.alert = function (title, message, callback) {
if (arguments.length < 2) {
message = title || "";
title = "&nbsp;";
}
$("<div>" + message + "</div>").dialog({
title: title,
destroy: true,
dialogClass: 'modal-sm',
buttons: [{
text: modal.ok.text,
classed: modal.ok.classed || "btn-success",
click: function click() {
if (typeof callback === 'function') {
callback();
}
$(this).dialog("destroy");
}
}]
});
};
$.messager.confirm = function (title, message, callback) {
$("<div>" + message + "</div>").dialog({
title: title,
destroy: true,
backdrop: 'static',
dialogClass: 'modal-sm modal-confirm',
buttons: [{
text: modal.cancel.text,
classed: modal.cancel.classed || "btn-danger",
click: function click() {
$(this).dialog("destroy");
if (typeof callback === 'function') {
callback(false);
}
}
}, {
text: modal.ok.text,
classed: modal.ok.classed || "btn-success",
click: function click() {
$(this).dialog("destroy");
if (typeof callback === 'function') {
callback(true);
}
}
}]
});
};
})(jQuery);
(function ($) {
var dialogIndex = 0;
$.dialog = function (options) {
var oldIndex = dialogIndex;
var defaultOptions = {
title: 'Dialog',
modalClass: 'no-padder',
dialogClass: 'modal-md',
destroy: true,
index: dialogIndex,
onShow: function onShow() {
var me = this;
var url = options['url'];
if (url) {
var url = url + (url.indexOf('?') < 0 ? '?' : '&') + 'dialog_index=' + oldIndex;
$.get(url, function (data) {
me.html(data);
});
}
if (options['html']) {
this.html(options['html']);
}
},
buttons: [{
text: "取消",
click: function click() {
$(this).dialog("close");
}
}, {
text: "确定",
'class': "btn-primary",
click: function click() {
$(this).dialog("close");
}
}]
};
options = $.extend(defaultOptions, options);
var id = 'gdoo-dialog-' + dialogIndex;
var $target = $('#' + id);
if ($target.length == 0) {
$target = $('<div/>', {
id: id
});
dialogIndex++;
}
$target.dialog(options);
return oldIndex;
};
})(jQuery);
(function ($) {
$.toastr = function (type, title, content) {
toastr.options = {
"closeButton": true,
"debug": false,
"progressBar": false,
"positionClass": "toast-top-right",
//"positionClass": "toast-top-center",
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
toastr[type](title, content);
};
})(jQuery);
(function (window) {
var calc = {
/**
* 人民币计算大写
* @param {type} currencyDigits
* @returns {String}
*/
'rmb': function rmb(currencyDigits) {
// Constants:
var MAXIMUM_NUMBER = 99999999999.99; // Predefine the radix characters and currency symbols for output:
var YUANCAPITAL = {
ZERO: "零",
ONE: "壹",
TWO: "贰",
THREE: "叁",
FOUR: "肆",
FIVE: "伍",
SIX: "陆",
SEVEN: "柒",
EIGHT: "捌",
NINE: "玖",
TEN: "拾",
HUNDRED: "佰",
THOUSAND: "仟",
TEN_THOUSAND: "万",
HUNDRED_MILLION: "亿",
DOLLAR: "元",
TEN_CENT: "角",
CENT: "分",
INTEGER: "整"
};
var CN_ZERO = YUANCAPITAL.ZERO;
var CN_ONE = YUANCAPITAL.ONE;
var CN_TWO = YUANCAPITAL.TWO;
var CN_THREE = YUANCAPITAL.THREE;
var CN_FOUR = YUANCAPITAL.FOUR;
var CN_FIVE = YUANCAPITAL.FIVE;
var CN_SIX = YUANCAPITAL.SIX;
var CN_SEVEN = YUANCAPITAL.SEVEN;
var CN_EIGHT = YUANCAPITAL.EIGHT;
var CN_NINE = YUANCAPITAL.NINE;
var CN_TEN = YUANCAPITAL.TEN;
var CN_HUNDRED = YUANCAPITAL.HUNDRED;
var CN_THOUSAND = YUANCAPITAL.THOUSAND;
var CN_TEN_THOUSAND = YUANCAPITAL.TEN_THOUSAND;
var CN_HUNDRED_MILLION = YUANCAPITAL.HUNDRED_MILLION;
var CN_DOLLAR = YUANCAPITAL.DOLLAR;
var CN_TEN_CENT = YUANCAPITAL.TEN_CENT;
var CN_CENT = YUANCAPITAL.CENT;
var CN_INTEGER = YUANCAPITAL.INTEGER; // Variables:
var integral; // Represent integral part of digit number.
var decimal; // Represent decimal part of digit number.
var outputCharacters; // The output result.
var parts;
var digits, radices, bigRadices, decimals;
var zeroCount;
var i, p, d;
var quotient, modulus; // Validate input string:
currencyDigits = currencyDigits.toString();
if (currencyDigits == "") {
return "";
}
if (currencyDigits.match(/[^,.\d]/) != null) {
return "";
}
if (currencyDigits.match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {
return "";
} // Normalize the format of input digits:
currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
// Assert the number is not greater than the maximum number.
if (Number(currencyDigits) > MAXIMUM_NUMBER) {
return "";
} // Process the coversion from currency digits to characters:
// Separate integral and decimal parts before processing coversion:
parts = currencyDigits.split(".");
if (parts.length > 1) {
integral = parts[0];
decimal = parts[1]; // Cut down redundant decimal digits that are after the second.
decimal = decimal.substr(0, 2);
} else {
integral = parts[0];
decimal = "";
} // Prepare the characters corresponding to the digits:
digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);
radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
decimals = new Array(CN_TEN_CENT, CN_CENT); // Start processing:
outputCharacters = ""; // Process integral part if it is larger than 0:
if (Number(integral) > 0) {
zeroCount = 0;
for (i = 0; i < integral.length; i++) {
p = integral.length - i - 1;
d = integral.substr(i, 1);
quotient = p / 4;
modulus = p % 4;
if (d == "0") {
zeroCount++;
} else {
if (zeroCount > 0) {
outputCharacters += digits[0];
}
zeroCount = 0;
outputCharacters += digits[Number(d)] + radices[modulus];
}
if (modulus == 0 && zeroCount < 4) {
outputCharacters += bigRadices[quotient];
}
}
outputCharacters += CN_DOLLAR;
} // Process decimal part if there is:
if (decimal != "") {
for (i = 0; i < decimal.length; i++) {
d = decimal.substr(i, 1);
if (d != "0") {
outputCharacters += digits[Number(d)] + decimals[i];
}
}
} // Confirm and return the final output string:
if (outputCharacters == "") {
outputCharacters = CN_ZERO + CN_DOLLAR;
}
if (decimal == "") {
outputCharacters += CN_INTEGER;
} //outputCharacters = CN_SYMBOL + outputCharacters;
return outputCharacters;
},
/**
* 最大值
* @returns {unresolved}
*/
'max': function max() {
if (arguments.length == 0) {
return;
}
var maxNum = arguments[0];
for (var i = 0; i < arguments.length; i++) {
maxNum = Math.max(maxNum, arguments[i]);
}
return parseFloat(maxNum);
},
/**
* 最小值
* @returns {unresolved}
*/
'min': function min() {
if (arguments.length == 0) {
return;
}
var minNum = arguments[0];
for (var i = 0; i < arguments.length; i++) {
minNum = Math.min(minNum, arguments[i]);
}
return parseFloat(minNum);
},
/**
* 平均值
* @returns {unresolved}
*/
'avg': function avg() {
var args = arguments,
len = args.length,
i = 0,
sum = 0;
for (; i < len && (sum += parseFloat(args[i])); i++) {}
return sum / len;
},
/**
* 取模运算
* @returns {String}
*/
'mod': function mod() {
if (arguments.length == 0) {
return;
}
var firstNum = arguments[0];
var secondNum = arguments[1];
var result = firstNum % secondNum;
result = isNaN(result) ? "" : parseFloat(result);
return result;
},
/**
* 绝对值
* @param {type} val
* @returns {@exp;Math@call;abs}
*/
'abs': function abs(val) {
return Math.abs(parseFloat(val));
},
/**
* 获取值
* @param {type} val
* @returns {@exp;Math@call;floor|Number}
*/
'val': function val(_val, prec) {
return isNaN(_val) || _val === Infinity ? 0 : _val.toFixed(prec);
},
/**
* 天数计算
* @param {type} val
* @returns {Number|@exp;Math@call;floor}
*/
'day': function day(val) {
return val == 0 ? 0 : Math.floor(val / 86400);
},
/**
* 小时
* @param {type} val
* @returns {@exp;Math@call;floor|Number}
*/
'hour': function hour(val) {
return val == 0 ? 0 : Math.floor(val / 3600);
},
/**
* 日期计算
* @param {type} val
* @returns {String}
*/
'date': function date(val) {
var TIME = {
YEAR: "年",
HALFYEAR: "半年",
QUARTER: "季",
MONTH: "月",
WEEK: "周",
DAY: "天",
HOUR: "小时",
MIN: "分",
MINS: "分钟",
SEC: "秒",
SECS: "秒钟",
INVALID_DATE: "日期格式无效",
WEEKS: "星期",
WEEKDAYS: "日一二三四五六"
};
return val >= 0 ? Math.floor(val / 86400) + TIME.DAY + Math.floor(val % 86400 / 3600) + TIME.HOUR + Math.floor(val % 3600 / 60) + TIME.MIN + Math.floor(val % 60) + TIME.SEC : TIME.INVALID_DATE; //'日期格式无效'
},
/**
* 列表控件计算
* @param {type} olist
* @param {type} col
* @returns {Number}
*/
'list': function list(table_id, col) {
var output = 0;
var tbody = document.getElementById('body_' + table_id);
for (var i = 0; i < tbody.rows.length; i++) {
for (var j = 0; j < tbody.rows[i].cells.length; j++) {
if (j == col) {
var child = tbody.rows[i].cells[j].firstChild;
if (child && child.tagName) {
var val = child.value || child.innerText;
val = val == "" || val.replace(/\s/g, '') == "" ? 0 : val;
val = isNaN(val) ? NaN : val;
output += parseFloat(val);
} else {
output += parseFloat(child.data);
}
}
}
}
return parseFloat(output);
},
/**
* 计算控件获取item的值
* @param {type} $item
* @returns {@exp;d@call;getTime|Number|@exp;document@call;getElementById}
*/
'getVal': function getVal(id, type) {
var $item = $('#' + id);
if ($item.length == 0) {
return 0;
} // $item.data('flag')
if (type == 'listview') {
return document.getElementById('lv_' + id);
} else if (type == 'date') {
var val = $('#' + id).val(); //var val = $item.parent().data("datetimepicker").getDate();
var d = new Date(val);
return d.getTime() / 1000;
} else {
var val = $item.val();
if (val == "") {
val = 0;
}
return val;
}
},
/**
数字合计
*/
sum: function sum() {
var args = [].slice.call(arguments, 0),
len,
item,
sum = 0;
for (len = args.length; len--;) {
item = parseFloat(args[len]); // if item=>NaN
sum += item === item ? item : 0;
}
return sum;
}
};
var listView = {
calc: calc,
field: {},
data: {},
total: {},
editor: function editor(key, i, j) {
var field = listView.field[key];
var type = field.type[j];
var size = field.size[j];
var css = field.checks[j] == 'SYS_NOT_NULL' ? 'input-required' : 'input-text';
var readonly = field.writes[j] == true ? false : true;
var value = '';
if (listView.data[key][i]) {
value = listView.data[key][i][j] == undefined ? '' : listView.data[key][i][j];
}
var name = key + '[' + i + '][' + j + ']';
var id = key + '_' + i + '_' + j;
switch (type) {
case "empty":
var out = '<span tyle="width:' + size + 'px;" id="' + id + '"></span>';
break;
case "text":
var out = readonly == 0 ? '<input autocomplete="off" type="text" style="width:' + size + 'px;" class="' + css + '" name="' + name + '" id="' + id + '" value="' + value + '">' : '<span id="' + id + '">' + value + '</span>';
break;
case "textarea":
var out = readonly == 0 ? '<textarea style="width:' + size + 'px;" class="' + css + '" name="' + name + '" id="' + id + '">' + value + '</textarea>' : '<span id="' + id + '">' + value + '</span>';
break;
case "calc":
var out = readonly == 0 ? '<input type="text" style="width:' + size + 'px;" class="readonly" name="' + name + '" id="' + id + '" value="' + value + '" readonly>' : '<span id="' + id + '">' + value + '</span>';
break;
case "select":
var option = field.value[j].split(',');
var r = [];
r.push('<select style=width:' + size + 'px;" name="' + name + '" id="' + id + '">');
for (var i = 0; i < option.length; i++) {
var selected = value == option[i] ? ' selected' : '';
r.push('<option value="' + option[i] + '"' + selected + '>' + option[i] + '</option>');
}
r.push('</select>');
out = readonly == 0 ? r.join("\n") : '<span id="' + id + '">' + value + '</span>';
break;
case "radio":
var option = field.value[j].split(',');
var r = [];
for (var i = 0; i < option.length; i++) {
var checked = value == option[i] ? ' checked' : '';
r.push('<label class="checkbox"><input type="radio" name="' + name + '" id="' + id + '"' + checked + '>' + option[i] + '</label>');
}
out = readonly == 0 ? r.join("\n") : '<span id="' + id + '">' + value + '</span>';
break;
case "checkbox":
var option = field.value[j].split(',');
var r = [];
for (var i = 0; i < option.length; i++) {
var checked = value == option[i] ? ' checked' : '';
r.push('<label class="checkbox"><input type="checkbox" name="' + name + '" id="' + id + '"' + checked + '>' + option[i] + '</label>');
}
out = readonly == 0 ? r.join("\n") : '<span id="' + id + '">' + value + '</span>';
break;
case "datetime":
out = readonly == 0 ? '<input autocomplete="off" type="text" style=width:' + size + 'px;" onfocus="datePicker({dateFmt:\'yyyy-MM-dd\'});" class="' + css + ' popDate" value="' + value + '" name="' + name + '" id="' + id + '">' : '<span id="' + id + '">' + value + '</span>';
break;
}
return out;
},
rowUpdate: function rowUpdate(obj) {
var e = obj.target.id.split('_');
if (e.length == 4) {
var key = e[0] + '_' + e[1];
listView.rowSum(key, e[2]);
listView.footerSum(key);
}
;
},
footerSum: function footerSum(key) {
var body = document.getElementById('body_' + key);
var field = listView.field[key];
var sum = field.sum;
var readonly = field.readonly;
for (var i = 0; i < sum.length; i++) {
if (sum[i] == true) {
var row = 0;
for (var j = 0; j < body.rows.length; j++) {
var td = body.rows[j].cells[i + 1];
var value = field.readonly == 0 ? $(td).find('input,select').val() : $(td).find('span').text();
value = parseFloat(value);
row += isNaN(value) ? 0 : Math.round(parseFloat(value) * 10000) / 10000;
}
row = row.toFixed(2);
$('#total_' + key + '_' + i).html(row);
}
}
},
rowSum: function rowSum(key, j) {
var field = listView.field[key];
var type = field.type;
var value = field.value;
var readonly = field.readonly;
var calc = [];
for (var i = 0; i < type.length; i++) {
if (type[i] == 'calc') {
calc[i] = value[i];
for (var k = 0; k < type.length; k++) {
var n = k + 1;
var td = $('#' + key + '_' + j + '_' + k);
var td_value = readonly == 0 ? td.val() : td.text();
calc[i] = calc[i].replace('[' + n + ']', parseFloat(td_value));
}
row = isNaN(eval(calc[i])) ? 0 : Math.round(parseFloat(eval(calc[i])) * 10000) / 10000;
row = row.toFixed(2);
var obj = $('#' + key + '_' + j + '_' + i);
readonly == 0 ? obj.val(row) : obj.text(row);
}
}
},
rowAdd: function rowAdd(key) {
i = listView.total[key];
var tr = [];
tr.push('<tr><td align="center">' + (i + 1) + '</td>');
for (var j = 0; j < listView.field[key].type.length; j++) {
tr.push('<td>' + listView.editor(key, i, j) + '</td>');
} // 检查字段是否为只读
if (listView.field[key].readonly == 0) {
var option = i > 0 ? '<a class="option" href="javascript:;" onclick="listView.deleteRow(\'' + key + '\',this);">删除</a>' : '<a class="option" onclick="listView.rowAdd(\'' + key + '\');" href="javascript:;">添加</a>';
tr.push('<td align="center" style="white-space:nowrap;">' + option + '</td></tr>');
}
$('#body_' + key).append(tr.join("\n")); // 累加行
listView.total[key]++;
},
deleteRow: function deleteRow(key, obj) {
var tr = obj.parentNode.parentNode;
tr.parentNode.removeChild(tr); // 总计列总数
listView.footerSum(key);
},
init: function init(key) {
// 初始化列表视图
listView.total[key] = 0; // 新建的时候默认显示一行
var length = listView.data[key].length > 0 ? listView.data[key].length : 1;
for (var i = 0; i < length; i++) {
// 添加一行
listView.rowAdd(key); // 计算小计行
listView.rowSum(key, i);
}
; // 总计列总数
listView.footerSum(key);
}
};
window.listView = listView;
})(window);
(function (window) {
// 循环子表
function gridListData(table) {
var gets = {};
var tables = formGridList[table] || [];
if (tables.length) {
for (var i = 0; i < tables.length; i++) {
var t = tables[i];
var store = t.api.memoryStore;
var rows = [];
t.api.stopEditing();
t.api.forEachNode(function (rowNode) {
var data = rowNode.data;
if (isNotEmpty(data[t.dataKey])) {
var id = '' + data.id;
var draft = id.indexOf('draft_');
if (draft === 0) {
data.id = 0;
}
rows.push(data);
}
});
var event = gdoo.event.get('grid.' + t.tableKey);
if (event.exist('onSaveBefore')) {
var ret = event.trigger('onSaveBefore', rows);
if (ret === false) {
return false;
}
}
if (rows.length == 0 && t.tableSaveDataNotEmpty === true) {
toastrError(t.tableTitle + '不能为空。');
return false;
} else {
gets[t.tableKey] = {
rows: rows,
deleteds: store.deleted
};
}
}
}
return gets;
} // 刷新所有相关grid
function reloadGrid(table) {
var iframes = top.document.getElementsByTagName("iframe");
for (var i = 0; i < iframes.length; i++) {
var iframe = iframes[i];
var $gdoo = iframe.contentWindow.gdoo;
if (iframe.id == 'tab_iframe_dashboard') {
// 刷新首页全部部件
var widgets = Object.values($gdoo.widgets);
widgets.forEach(function (grid) {
grid.remoteData();
});
} else {
// 刷新全部页面的相关grid
if ($gdoo && $gdoo.grids) {
var grids = $gdoo.grids;
if (grids[table]) {
grids[table].grid.remoteData();
}
}
}
}
}
window.gridListData = gridListData;
var model = {
bill_url: '',
audit: function audit(table) {
var form = $('#' + table);
var key = form.find('#master_key').val();
var run_id = form.find('#master_run_id').val();
var step_id = form.find('#master_step_id').val();
var run_log_id = form.find('#master_run_log_id').val();
var uri = $('#' + table).find('#master_uri').val();
var url = app.url(uri + '/flowAudit', {
key: key,
run_id: run_id,
step_id: step_id,
run_log_id: run_log_id
});
$.dialog({
title: '单据审批',
url: url,
buttons: [{
text: '取消',
'class': 'btn-default',
click: function click() {
$(this).dialog('close');
}
}, {
text: '提交',
'class': 'btn-info',
click: function click() {
var query = $('#myturn,#' + table).serialize(); // 循环子表
var gets = gridListData(table);
if (gets === false) {
return;
}
var loading = showLoading();
$.post(app.url(uri + '/flowAudit'), query + '&' + $.param(gets), function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
if (res.url) {
location.href = res.url;
}
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
}]
});
},
draft: function draft(table) {
var uri = $('#' + table).find('#master_uri').val();
var query = $('#myturn,#' + table).serialize(); // 循环子表
var gets = gridListData(table);
if (gets === false) {
return;
}
var loading = showLoading();
var event = gdoo.event.get('grid.' + table);
$.post(app.url(uri + '/flowDraft'), query + '&' + $.param(gets), function (res) {
if (event.exist('onSaveAfter')) {
res = event.trigger('onSaveAfter', res);
}
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
if (res.url) {
location.href = res.url;
}
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
},
remove: function remove(url) {
$.messager.confirm('操作警告', '确定要删除吗?', function (btn) {
if (btn == true) {
$.post(url, function (res) {
if (res.status) {
toastrSuccess(res.data);
location.reload();
} else {
toastrError(res.data);
}
}, 'json');
}
});
},
store: function store(table) {
var uri = $('#' + table).find('#master_uri').val();
var query = $('#' + table).serialize(); // 循环子表
var gets = gridListData(table);
if (gets === false) {
return;
}
var loading = showLoading();
$.post(app.url(uri + '/store'), query + '&' + $.param(gets), function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
if (res.url) {
location.href = res.url;
}
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
},
read: function read(table) {
var uri = $('#' + table).find('#master_uri').val();
var query = $('#' + table).serialize();
var loading = showLoading();
$.post(app.url(uri + '/flowRead'), query, function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
location.reload();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
},
reset: function reset(table) {
$.messager.confirm('操作警告', '确定要重置流程吗', function (btn) {
if (btn == true) {
var uri = $('#' + table).find('#master_uri').val();
var query = $('#' + table).serialize();
var loading = showLoading();
$.post(app.url(uri + '/flowReset'), query, function (res) {
if (res.status) {
location.reload();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
},
auditLog: function auditLog(key) {
var url = app.url('index/workflow/flowLog', {
key: key
});
$.dialog({
title: '审批记录',
dialogClass: 'modal-lg',
url: url,
buttons: [{
text: '取消',
'class': 'btn-default',
click: function click() {
$(this).dialog('close');
}
}]
});
},
revise: function revise(key) {
var url = app.url('index/workflow/flowRevise', {
key: key
});
formDialog({
title: '流程修正',
url: url,
dialogClass: 'modal-md',
id: 'revise-form',
success: function success(res) {
toastrSuccess(res.data);
location.reload();
$(this).dialog("close");
},
error: function error(res) {
toastrError(res.data);
}
});
}
}; // 流程撤回
model.recall = function (table) {
var key = $('#' + table).find('#master_key').val();
var uri = $('#' + table).find('#master_uri').val();
var log_id = $('#' + table).find('#master_recall_log_id').val();
var url = app.url(uri + '/recall', {
key: key,
log_id: log_id
});
$.dialog({
title: '撤回单据',
url: url,
buttons: [{
text: "取消",
'class': "btn-default",
click: function click() {
$(this).dialog("close");
}
}, {
text: "提交",
'class': "btn-info",
click: function click() {
var query = $('#myrecall').serialize();
var loading = showLoading();
$.post(app.url(uri + '/recall'), query, function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
location.reload();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
}]
});
}; // 弃审单据
model.abort = function (table) {
var key = $('#' + table).find('#master_key').val();
var uri = $('#' + table).find('#master_uri').val();
var url = app.url(uri + '/abort', {
key: key
});
$.dialog({
title: '弃审单据',
url: url,
buttons: [{
text: "取消",
'class': "btn-default",
click: function click() {
$(this).dialog("close");
}
}, {
text: "提交",
'class': "btn-info",
click: function click() {
var query = $('#myabort').serialize();
var loading = showLoading();
$.post(app.url(uri + '/abort'), query, function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
location.reload();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
}]
});
}; // 普通审核弃审
model.audit2 = function (table) {
var key = $('#' + table).find('#master_key').val();
var uri = $('#' + table).find('#master_uri').val();
$.messager.confirm('操作警告', '确定要审核单据吗', function (btn) {
if (btn == true) {
var loading = showLoading();
$.post(app.url(uri + '/audit'), {
key: key
}, function (res) {
if (res.status) {
reloadGrid(table);
toastrSuccess(res.data);
location.reload();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
}; // 普通审核弃审
model.abort2 = function (table) {
var key = $('#' + table).find('#master_key').val();
var uri = $('#' + table).find('#master_uri').val();
$.messager.confirm('操作警告', '确定要弃审单据吗', function (btn) {
if (btn == true) {
var loading = showLoading();
$.post(app.url(uri + '/abort'), {
key: key
}, function (res) {
if (res.status) {
reloadGrid(table);
top.$.toastr('success', res.data);
location.reload();
} else {
top.$.toastr('error', res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
}; // 子表新增
model.createRow = function (table) {
var grid = gdoo.forms[table];
var onCreateRow = window[table + '.onCreateRow'];
if (typeof onCreateRow == 'function') {
var ret = onCreateRow.call(grid, table);
if (ret === false) {
return false;
}
}
grid.api.memoryStore.create({});
}; // 子表删除
model.deleteRow = function (table) {
var grid = gdoo.forms[table];
var onDeleteRow = window[table + '.onDeleteRow'];
if (typeof onDeleteRow == 'function') {
var ret = onDeleteRow.call(grid, table);
if (ret === false) {
return false;
}
}
var selectedNodes = grid.api.getSelectedNodes();
if (selectedNodes && selectedNodes.length === 1) {
var selectedNode = selectedNodes[0];
grid.api.deleteRow(selectedNode.data);
grid.api.forEachNode(function (node) {
if (node.childIndex === selectedNode.childIndex) {
node.setSelected(true);
return;
}
});
}
}; // 快速搜索
model.quickFilter = function (table) {
var grid = gdoo.forms[table];
var $div = $('#' + table + '_quick_filter_text');
var $el = $div.dialog({
title: '<i class="fa fa-filter"></i> 过滤' + grid.tableTitle,
modalClass: 'no-padder',
dialogClass: 'modal-sm',
buttons: [{
text: "确定",
classed: 'btn-info',
click: function click() {
grid.api.setQuickFilter($div.find('input').val());
$el.dialog("close");
}
}, {
text: "取消",
classed: 'btn-default',
click: function click() {
$el.dialog("close");
}
}]
}).on('keydown', function (e) {
if (e.keyCode == 13) {
grid.api.setQuickFilter($div.find('input').val());
$el.dialog("close");
}
});
}; // 子表关闭
model.closeRow = function (table) {
var me = this;
var grid = gdoo.forms[table];
var rows = grid.api.getSelectedRows();
if (rows.length > 0) {
var id = rows[0].id;
top.$.messager.confirm('操作提醒', '是否要关闭选中的行数据?', function (btn) {
if (btn == true) {
var loading = showLoading();
$.post(app.url(me.bill_url + '/closeRow'), {
table: table,
id: id
}, function (res) {
if (res.status) {
toastrSuccess(res.data);
grid.remoteData();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
} else {
toastrError('最少选择一行记录。');
}
}; // 子表关闭所有
model.closeAllRow = function (table) {
var me = this;
var grid = gdoo.forms[table];
var ids = [];
grid.api.forEachNode(function (node) {
ids.push(node.data.id);
});
if (ids.length > 0) {
top.$.messager.confirm('操作提醒', '是否要关闭所有行数据?', function (btn) {
if (btn == true) {
var loading = showLoading();
$.post(app.url(me.bill_url + '/closeAllRow'), {
table: table,
ids: ids
}, function (res) {
if (res.status) {
toastrSuccess(res.data);
grid.remoteData();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
} else {
toastrError('最少选择一行记录。');
}
};
window.flow = model;
})(window);
(function ($) {
function gridAction(table, name) {
this.name = name;
this.table = table;
this.dialogType = 'dialog';
this.show = function (data, key, name) {
var me = this;
if (data.flow_form_edit == 1) {
me.audit(data);
return;
}
var url = app.url(me.bill_url + '/show', {
id: data.master_id
});
if (me.dialogType == 'dialog') {
viewDialog({
title: me.name,
dialogClass: 'modal-lg',
url: url,
close: function close() {
$(this).dialog("close");
}
});
} else {
if (isEmpty(key)) {
key = me.bill_url.replace(/\//g, '_') + '_show';
}
if (isEmpty(name)) {
name = me.name;
}
top.addTab(me.bill_url + '/show?id=' + data.master_id, key, name);
}
};
this["import"] = function () {
var me = this;
var grid = gdoo.grids[me.table].grid;
formDialog({
title: '数据导入',
url: app.url(me.bill_url + '/import'),
dialogClass: 'modal-md',
id: 'import-dialog',
onSubmit: function onSubmit() {
var fd = new FormData();
fd.append("file", $('#import_file')[0].files[0]);
var loading = showLoading();
$.ajax({
url: app.url(me.bill_url + '/import'),
type: "POST",
data: fd,
processData: false,
contentType: false,
complete: function complete() {
layer.close(loading);
},
success: function success(res) {
if (res.status) {
$('#modal-import-dialog').dialog('close');
grid.remoteData();
toastrSuccess(res.data);
} else {
toastrError(res.data);
}
}
});
}
});
};
this["delete"] = function () {
var me = this;
var grid = gdoo.grids[me.table].grid;
var rows = grid.api.getSelectedRows();
var ids = [];
$.each(rows, function (index, row) {
ids.push(row.master_id);
});
if (ids.length > 0) {
var content = ids.length + '个' + me.name + '将被删除?';
top.$.messager.confirm('删除' + me.name, content, function (btn) {
if (btn == true) {
var loading = showLoading();
$.post(app.url(me.bill_url + '/delete'), {
id: ids
}, function (res) {
if (res.status) {
toastrSuccess(res.data);
grid.remoteData();
} else {
toastrError(res.data);
}
}, 'json').complete(function () {
layer.close(loading);
});
}
});
} else {
toastrError('最少选择一行记录。');
}
};
this.created_by = function (data) {
var me = this;
var grid = gdoo.grids[me.table].grid;
formDialog({
title: '私信',
url: app.url('user/message/create', {
user_id: data.id
}),
storeUrl: app.url('model/form/store'),
id: 'user_message',
dialogClass: 'modal-md',
success: function success(res) {
toastrSuccess(res.data);
grid.remoteData();
$(this).dialog("close");
},
error: function error(res) {
toastrError(res.data);
}
});
};
this.create = function () {
var me = this;
var grid = gdoo.grids[me.table].grid;
if (me.dialogType == 'dialog') {
formDialog({
title: '新建' + me.name,
url: app.url(me.bill_url + '/create'),
storeUrl: app.url(me.bill_url + '/store'),
id: me.table,
table: me.table,
dialogClass: 'modal-lg',
success: function success(res) {
toastrSuccess(res.data);
grid.remoteData();
$(this).dialog("close");
},
error: function error(res) {
toastrError(res.data);
}
});
} else {
var key = me.bill_url.replace(/\//g, '_') + '_show';
top.addTab(me.bill_url + '/create', key, me.name);
}
};
this.edit = function (data) {
var me = this;
var grid = gdoo.grids[me.table].grid;
if (me.dialogType == 'dialog') {
formDialog({
title: '编辑' + me.name,
url: app.url(me.bill_url + '/edit', {
id: data.master_id
}),
storeUrl: app.url(me.bill_url + '/store'),
id: me.table,
table: me.table,
dialogClass: 'modal-lg',
success: function success(res) {
toastrSuccess(res.data);
grid.remoteData();
$(this).dialog("close");
},
error: function error(res) {
toastrError(res.data);
}
});
} else {
var key = me.bill_url.replace(/\//g, '_') + '_show';
top.addTab(me.bill_url + '/edit?id=' + data.master_id, key, me.name);
}
};
this.audit = function (data) {
var me = this;
var grid = gdoo.grids[me.table].grid;
if (me.dialogType == 'dialog') {
formDialog({
title: '审核' + me.name,
url: app.url(me.bill_url + '/audit', {
id: data.master_id
}),
storeUrl: app.url(me.bill_url + '/store'),
id: me.table,
table: me.table,
dialogClass: 'modal-lg',
success: function success(res) {
toastrSuccess(res.data);
grid.remoteData();
$(this).dialog("close");
},
error: function error(res) {
toastrError(res.data);
}
});
} else {
var key = me.bill_url.replace(/\//g, '_') + '_show';
top.addTab(me.bill_url + '/audit?id=' + data.master_id, key, me.name);
}
};
this.batchEdit = function () {
var me = this;
var grid = gdoo.grids[me.table].grid;
var rows = grid.api.getSelectedRows();
var ids = [];
$.each(rows, function (index, row) {
ids.push(row.master_id);
});
if (ids.length > 0) {
formDialog({
title: '批量编辑',
dialogClass: 'modal-sm',
id: 'batch-edit-form',
url: app.url(me.bill_url + '/batchEdit', {
ids: ids.join(',')
}),
success: function success(res) {
toastrSuccess(res.data);
grid.remoteData();
$(this).dialog("close");
},
close: function close() {
$(this).dialog("close");
}
});
} else {
toastrError('最少选择一行记录。');
}
}; // 导出
this["export"] = function () {
var me = this;
var grid = gdoo.grids[me.table].grid;
LocalExport(grid, me.name);
};
this.filter = function () {
var me = this;
var config = gdoo.grids[me.table];
var grid = config.grid;
var search = config.search; // 过滤数据
$(search.advanced.el).dialog({
title: '高级搜索',
modalClass: 'no-padder',
buttons: [{
text: "取消",
'class': "btn-default",
click: function click() {
$(this).dialog("close");
}
}, {
text: "确定",
'class': "btn-info",
click: function click() {
var query = search.advanced.el.serializeArray();
var params = {};
search.queryType = 'advanced';
$.map(query, function (row) {
params[row.name] = row.value;
});
params['page'] = 1;
grid.remoteData(params);
$(this).dialog("close");
return false;
}
}]
});
};
}
window.gridAction = gridAction;
})(jQuery);
var select2List = {};
var dialogCacheSelected = {};
$(function () {
var $document = $(document); // 注册jQuery Ajax全局错误提示
$document.ajaxError(function (event, xhr) {
if (xhr.responseJSON) {
toastrError(xhr.responseJSON.message);
}
});
var input_select2 = $document.find('.input-select2');
if (input_select2.length) {
input_select2.select2();
} // 新提示
$document.tooltip({
container: 'body',
placement: 'auto',
selector: '.hinted',
delay: {
show: 200,
hide: 0
}
}); // 批量操作
$('.select-all').on('click', function () {
var tr = $('.select-row').closest('tr');
if ($(this).prop('checked')) {
tr.addClass('success');
} else {
tr.removeClass('success');
}
$(".select-row").prop('checked', $(this).prop('checked'));
}); // 从子窗口关闭tab
$document.on('click', '[data-toggle="closetab"]', function () {
// 获取框架的名称
if (window.name) {
var id = window.name.replace('iframe_', '');
} else {
var id = $(this).data('id');
}
top.$.addtabs.close({
id: 'tab_' + id
});
}); // 点击td选择行
$('.table tbody tr').on('click', function (e) {
var tr = $(this);
var checkbox = tr.find('.select-row');
var checked = checkbox.prop('checked');
if (checkbox.length == 0) {
return;
}
if (e.target.tagName == 'INPUT') {
setCheckbox(checked);
}
if (e.target.tagName == 'DIV') {
setCheckbox(!checked);
}
if (e.target.tagName == 'TD') {
setCheckbox(!checked);
}
function setCheckbox(checked) {
if (checked) {
tr.addClass('success');
} else {
tr.removeClass('success');
}
checkbox.prop('checked', checked);
}
}); // 转到某些地址,单页面内类型切换
$document.on('change', '[data-toggle="redirect"]', function () {
// 从select的rel传递过来的地址
var url = $(this).data('url');
var id = $(this).attr('id');
var selected = $(this).find("option:selected").val();
location.href = url.replace(new RegExp('(' + id + '=)[^&]*', 'g'), '$1' + selected);
}); // 清除弹出层id
$document.on('click.dialog.search', '[data-toggle="dialog-clear"]', function () {
var params = $(this).data();
$('#' + params.id).val('');
$('#' + params.id + '_text').val('');
var event = gdoo.event.get(params.id);
event.trigger('clear', params);
}); // 弹出对话框表单
$document.on('click.dialog.view', '[data-toggle="dialog-view"]', function () {
var params = $(this).data();
var query = {};
$.each(params, function (k, v) {
if (k == 'url' || k == 'title' || k == 'toggle') {
return true;
}
query[k] = v;
}); // 传递当前iframe
var iframe_id = getIframeName();
if (iframe_id) {
query.iframe_id = iframe_id;
}
var option = gdoo.formKey(params);
var event = gdoo.event.get(option.key);
event.trigger('open', params, query);
var url = params['url'];
var title = params['title'];
var url = app.url(url, query);
$.dialog({
title: title,
url: url,
dialogClass: 'modal-lg',
buttons: [{
text: '取消',
"class": 'btn-default',
click: function click() {
var me = this;
$(me).dialog("close");
}
}, {
text: "确定",
'class': "btn-info",
click: function click() {
var grid = gdoo.dialogs[option.id];
if (grid) {
var ret = gdoo.dialogSelected(event, params, option, grid);
if (ret === true) {
$(this).dialog("close");
}
} else {
$(this).dialog("close");
}
}
}]
});
});
var gdoo_dialog_input = $document.find('.gdoo-dialog-input');
if (gdoo_dialog_input.length) {
gdoo_dialog_input.gdooDialogInput();
} // 弹出对话框表单
$document.on('click.dialog.image', '[data-toggle="dialog-image"]', function () {
var params = $(this).data();
$.dialog({
title: params.title,
html: '<img style="text-align:center;max-width:100%;" src="' + params.url + '" />',
buttons: [{
text: '确定',
'class': 'btn-default',
click: function click() {
$(this).dialog("close");
}
}]
});
}); // 弹出对话框表单
$document.on('click.dialog.form', '[data-toggle="dialog-form"]', function () {
var params = $(this).data();
params.id = params.id || 'myform';
params.size = params.size || 'md';
$.dialog({
title: params.title,
url: params.url,
dialogClass: 'modal-' + params.size,
buttons: [{
text: '取消',
"class": 'btn-default',
click: function click() {
var me = this;
if (typeof error === 'function') {
error.call(me, res);
} else {
$(me).dialog("close");
}
}
}, {
text: '保存',
"class": 'btn-info',
click: function click() {
var me = this;
var action = $('#' + params.id).attr('action');
var formData = $('#' + params.id).serialize();
$.post(action, formData, function (res) {
if (typeof success === 'function') {
success.call(me, res);
} else {
if (res.status) {
if (res.data == 'reload') {
window.location.reload();
} else {
toastrSuccess(res.data);
$(me).dialog('close');
}
} else {
toastrError(res.data);
}
}
}, 'json');
}
}]
});
}); // 日期选择
$document.on('click.date', '[data-toggle="date"]', function () {
var data = $(this).data();
var ops = {};
ops['dateFmt'] = data['format'] || 'yyyy-MM-dd';
var onpicked = window[this.id + '.onpicked'];
if (typeof onpicked == 'function') {
ops['onpicked'] = onpicked;
}
if (data['dchanging']) {
ops['dchanging'] = data['dchanging'];
}
datePicker(ops);
}); // 日期时间选项
$document.on('click.datetime', '[data-toggle="datetime"]', function () {
var data = $(this).data();
var ops = {};
ops['dateFmt'] = data['format'] || 'yyyy-MM-dd HH:mm';
if (data['dchanging']) {
ops['dchanging'] = data['dchanging'];
}
datePicker(ops);
}); // 关闭layerFrame
$document.on('click.frame.close', '[data-toggle="layer-frame-close"]', function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}); // 打开layerFrame
$document.on('click.frame.url', '[data-toggle="layer-frame-url"]', function () {
var url = $(this).data('url');
var title = $(this).data('title') || false;
var skin = $(this).data('skin') || 'frame';
var close = $(this).data('close') || false;
var index = layer.open({
skin: 'layui-layer-' + skin,
scrollbar: false,
closeBtn: close,
title: title,
type: 2,
move: false,
area: ['100%', '100%'],
content: url
});
}); // 打开tabFrame
$document.on('click.tab.frame', '[data-toggle="tab-frame-url"]', function () {
var url = $(this).data('url');
var id = $(this).data('id');
var name = $(this).data('name');
top.addTab(url, id, name);
}); // 媒体管理删除
$document.on('click', '[data-toggle="media-delete"]', function () {
var me = this;
var media = $(me).parent();
var rows = $(me).closest('.media-controller').find('.media-item');
if (rows.length > 1) {
media.remove();
} else {
media.find('img').attr('src', app.url('assets/images/nopic.jpg'));
media.find('input').val('');
}
});
$('a.image-show').hover(function (e) {
var params = $(this).data();
var img = $('<p id="image"><img src="' + params.url + '" alt="" /></p>');
$("body").append(img);
$(this).find('img').stop().fadeTo('slow', 0.5);
var $window = $(window);
var $image = $(document).find('#image');
var height = $image.height();
var width = $image.width();
var left = $window.scrollLeft() + ($window.width() - width) / 2 + 'px';
var top = $window.scrollTop() + ($window.height() - height) / 2 + 'px';
var offset = $(this).offset();
$image.css({
left: offset.left + 100,
top: top
});
$image.fadeIn('fast');
}, function () {
$(this).find('img').stop().fadeTo('slow', 1);
$("#image").remove();
}); // 表格拖动排序
$('#table-sortable tbody').sortable({
// opacity: 0.6,
delay: 50,
cursor: "move",
axis: "y",
items: "tr",
handle: 'td.move',
// containmentType:"parent",
// placeholder: "ui-sortable-placeholder",
helper: function helper(event, ui) {
// 在拖动时拖动行的cell单元格宽度会发生改变。
ui.children().each(function () {
$(this).width($(this).width());
});
return ui;
},
stop: function stop(event, ui) {},
start: function start(event, ui) {
ui.placeholder.outerHeight(ui.item.outerHeight());
},
update: function update() {
var url = $(this).parent().attr('url');
var orders = $(this).sortable("toArray");
$.post(url, {
sort: orders
}, function (res) {
toastrSuccess(res.data);
});
}
}); //.disableSelection();
});
var app = {
/**
* 确认窗口
*/
confirm: function confirm(url, content, title) {
title = title || '操作警告';
$.messager.confirm(title, content, function (btn) {
if (btn == true) {
location.href = url;
}
});
},
/**
* 警告窗口
*/
alert: function alert(title, content) {
$.messager.alert(title, content);
},
/**
* 获取附带基本路径的URL
*/
url: function url(uri, params) {
if (uri == '/') {
return settings.public_url;
}
query = params == '' || params === undefined ? '' : '?' + $.param(params);
return settings.public_url + '/' + uri + query;
},
redirect: function redirect(uri, params) {
return window.location.href = app.url(uri, params);
},
/**
* 汉字转换为拼音
*/
pinyin: function pinyin(read, write, type) {
type = type || 'first';
var field = $('#' + write).val();
if (field == '') {
$.get(app.url('index/api/pinyin?type=' + type + '&id=' + Math.random()), {
name: $('#' + read).val()
}, function (data) {
$('#' + write).val(data);
});
}
}
};
var uploader = {
file: function file(fileId) {
var id = $('#' + fileId).find(".id").val();
location.href = app.url('index/attachment/download', {
id: id
});
},
cancel: function cancel(fileId) {
var id = $('#' + fileId).find(".id").val();
if (id > 0) {
var name = $('#' + fileId).find(".file-name a").text();
$.messager.confirm('删除文件', '确定要删除 <strong>' + name + '</strong> 此文件吗', function (btn) {
if (btn == true) {
$.get(app.url('index/attachment/delete'), {
id: id
}, function (res) {
if (res == 1) {
$('#' + fileId).remove();
}
});
}
});
} else {
$('#' + fileId).remove();
}
},
insert: function insert(fileId) {
var id = $('#' + fileId).find(".id").val();
var name = $('#' + fileId).find(".file-name a").text(); // 检查图片类型
if (/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(name)) {
var html = '<img src="' + app.url('index/attachment/show', {
id: id
}) + '" title="' + name + '">';
} else {
var html = '<a href="' + app.url('index/attachment/download', {
id: id
}) + '" title="' + name + '">' + name + '</a>';
}
UE.getEditor("content").execCommand('insertHtml', html);
}
};
/**
* 媒体对话框
*/
function mediaDialog(url, name, id, multi) {
var params = {
id: id,
name: name,
multi: multi
};
var url = app.url(url, params);
$.dialog({
title: '媒体管理',
url: url,
dialogClass: 'modal-lg',
buttons: [{
text: '<i class="fa fa-remove"></i> 取消',
'class': "btn-default",
click: function click() {
$(this).dialog('close');
}
}, {
text: '<i class="fa fa-check"></i> 确定',
'class': "btn-info",
click: function click() {
if (window.saveMedia) {
window.saveMedia.call(this, params);
$(this).dialog('close');
}
}
}]
});
}
/**
* 显示窗口
*/
function viewBox(name, title, url, size) {
size = size || 'md';
$.dialog({
title: title,
url: url,
dialogClass: 'modal-' + size,
buttons: [{
text: "确定",
'class': "btn-default",
click: function click() {
$(this).dialog("close");
}
}]
});
}
var viewDialogIndex = 0;
/**
* 表单窗口
*/
function viewDialog(options) {
if (options.id === undefined) {
options.id = 'view-dialog-' + viewDialogIndex;
viewDialogIndex++;
}
var exist = $('#modal-' + options.id);
if (exist.length > 0) {
exist.dialog('show');
}
var defaults = {
title: name,
url: url,
buttons: [{
text: '确定',
'class': 'btn-default',
click: function click() {
$(this).dialog('close');
}
}]
};
var settings = $.extend({}, defaults, options);
$.dialog(settings);
}
var formDialogIndex = 0;
/**
* 表单窗口
*/
function formDialog(options) {
if (options.id === undefined) {
options.id = 'form-dialog-' + formDialogIndex;
formDialogIndex++;
}
var exist = $('#modal-' + options.id);
if (exist.length > 0) {
exist.dialog('show');
} else {
var defaults = {
title: 'formDialog',
backdrop: 'static',
buttons: [{
text: '取消',
"class": 'btn-default',
click: function click() {
var me = this;
if (typeof error === 'function') {
error.call(me);
} else {
$(me).dialog("close");
}
}
}, {
text: '保存',
"class": 'btn-info',
click: function click() {
var me = this;
var options = me.options; // 自定义提交函数
if (typeof options.onSubmit === 'function') {
options.onSubmit.call(me);
} else {
// 默认提交方法
if (me.options.storeUrl) {
var action = me.options.storeUrl;
} else {
var action = $('#' + options.id).attr('action');
}
var query = $('#' + options.id).serialize(); // 循环子表
var gets = gridListData(options.table);
if (gets === false) {
return;
}
var loading = showLoading();
$.post(action, query + '&' + $.param(gets), function (res) {
if (res.status) {
if (typeof options.success === 'function') {
options.success.call(me, res);
}
} else {
if (typeof options.error === 'function') {
options.error.call(me, res);
}
}
}, 'json').complete(function () {
layer.close(loading);
});
}
}
}]
};
var settings = $.extend({}, defaults, options);
$.dialog(settings);
}
}
/**
* 转换时间,计算差值
*/
function niceTime(timestamp) {
// 当前时间戳
var nowtime = new Date().getTime(); // 计算时间戳差值
var secondNum = parseInt((nowtime - timestamp * 1000) / 1000);
if (secondNum >= 0 && secondNum < 60) {
return secondNum + '秒前';
} else if (secondNum >= 60 && secondNum < 3600) {
var nTime = parseInt(secondNum / 60);
return nTime + '分钟前';
} else if (secondNum >= 3600 && secondNum < 3600 * 24) {
var nTime = parseInt(secondNum / 3600);
return nTime + '小时前';
} else {
var nTime = parseInt(secondNum / 86400);
return nTime + '天前';
}
}
/**
* 首字母大写
*/
function ucfirst(str) {
if (str) {
return str[0].toUpperCase() + str.substr(1);
} else {
return str;
}
}
/**
* 数字金额大写转换(可以处理整数,小数,负数)
*/
function digitUppercase(n) {
var fraction = ['角', '分'];
var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
var unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']];
var head = n < 0 ? '欠' : '';
n = Math.abs(n);
var s = '';
for (var i = 0; i < fraction.length; i++) {
s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
n = Math.floor(n);
for (var i = 0; i < unit[0].length && n > 0; i++) {
var p = '';
for (var j = 0; j < unit[1].length && n > 0; j++) {
p = digit[n % 10] + unit[1][j] + p;
n = Math.floor(n / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
;
/**
* 数字格式化
*/
function number_format(number, decimals, decPoint, thousandsSep) {
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number;
var prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
var sep = typeof thousandsSep === 'undefined' ? ',' : thousandsSep;
var dec = typeof decPoint === 'undefined' ? '.' : decPoint;
var s = '';
var toFixedFix = function toFixedFix(n, prec) {
if (('' + n).indexOf('e') === -1) {
return +(Math.round(n + 'e+' + prec) + 'e-' + prec);
} else {
var arr = ('' + n).split('e');
var sig = '';
if (+arr[1] + prec > 0) {
sig = '+';
}
return (+(Math.round(+arr[0] + 'e' + sig + (+arr[1] + prec)) + 'e-' + prec)).toFixed(prec);
}
}; // @todo: for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec).toString() : '' + Math.round(n)).split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}
/**
* 检查变量是否为空
*/
function isEmpty(val) {
try {
if (val == '' || val == null || val == undefined) {
return true;
} // 判断数字是否是NaN
if (typeof val === "number") {
if (isNaN(val)) {
return true;
} else {
return false;
}
} // 判断参数是否是布尔、函数、日期、正则是则返回false
if (typeof val === "boolean" || typeof val === "function" || val instanceof Date || val instanceof RegExp) {
return false;
} //判断参数是否是字符串去空如果长度为0则返回true
if (typeof val === "string") {
if (val.trim().length == 0) {
return true;
} else {
return false;
}
}
if (_typeof(val) === 'object') {
// 判断参数是否是数组数组为空则返回true
if (val instanceof Array) {
if (val.length == 0) {
return true;
} else {
return false;
}
} //判断参数是否是对象判断是否是空对象是则返回true
if (val instanceof Object) {
//判断对象属性个数
if (Object.getOwnPropertyNames(val).length == 0) {
return true;
} else {
return false;
}
}
}
} catch (e) {
return false;
}
}
/**
* 检查变量是否不为空
*/
function isNotEmpty(value) {
return !isEmpty(value);
}
/**
* 清除字符串两边的空格
*/
String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/g, '');
};
/**
* 封装全部替换字符串
*/
String.prototype.replaceAll = function (search, replace) {
return this.replace(new RegExp(search, "gm"), replace);
};
/**
* 正则去掉所有的html标记
* @param {*} str
*/
function delHtmlTag(str) {
return str.replace(/<[^>]+>/g, "");
}
function isWeiXin() {
var ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
return true;
} else {
return false;
}
}
function toastrSuccess(content) {
if (isWeiXin()) {
$.toastr('success', content);
} else {
top.$.toastr('success', content);
}
}
function toastrError(content) {
if (isWeiXin()) {
$.toastr('error', content);
} else {
top.$.toastr('error', content);
}
}
function url(uri, params) {
query = params == '' || params === undefined ? '' : '?' + $.param(params);
return settings.public_url + '/' + uri + query;
}
/**
* 时间戳格式化
*/
function format_datetime(value) {
function add0(v) {
return v < 10 ? '0' + v : v;
}
value = parseInt(value) * 1000;
var time = new Date(value);
var y = time.getFullYear();
var m = time.getMonth() + 1;
var d = time.getDate();
var h = time.getHours();
var mm = time.getMinutes();
var s = time.getSeconds();
return y + '-' + add0(m) + '-' + add0(d) + ' ' + add0(h) + ':' + add0(mm);
}
/**
* 时间戳格式化
*/
function format_date(value) {
function add0(v) {
return v < 10 ? '0' + v : v;
}
value = parseInt(value) * 1000;
var time = new Date(value);
var y = time.getFullYear();
var m = time.getMonth() + 1;
var d = time.getDate();
var h = time.getHours();
var mm = time.getMinutes();
var s = time.getSeconds();
return y + '-' + add0(m) + '-' + add0(d);
}
/**
* ajax 提交
* @param {*} table
* @param {*} callback
*/
function ajaxSubmit(table, callback) {
// 监听提交事件
$('#' + table + '-form-submit').on('click', function () {
var me = $('#' + table);
var url = me.attr('action');
var data = me.serialize();
var rows = {};
var rows = gridListData(table);
if (rows === false) {
return;
}
data = data + '&' + $.param(rows);
var loading = showLoading();
$.post(url, data, function (res) {
if (typeof callback === 'function') {
callback(res);
} else {
if (res.status) {
toastrSuccess(res.data);
if (res.url) {
self.location.href = res.url;
}
} else {
toastrError(res.data);
}
}
}, 'json').complete(function () {
layer.close(loading);
});
return false;
});
}
/**
* 获取框架的name
* @returns
*/
function getIframeName() {
var name = window.name;
return name ? name.replace('iframe_', '') : '';
}
/**
* 获取框架的document
* @param {*} iframe_id
* @returns
*/
function getIframeDocument(iframe_id) {
if (iframe_id) {
var iframe = window.frames['iframe_' + iframe_id];
if (iframe) {
return iframe.document;
} else {//toastrError('iframe_id参数无效。');
}
}
return null;
}
/**
* 数据加载提示
*/
function showLoading(msg) {
var loading = layer.msg(msg || '数据提交中...', {
icon: 16,
shade: 0.1,
time: 1000 * 120
});
return loading;
}
/**
* 格式化文件大小
* @param {*} fileSize
*/
function fileFormatSize(fileSize) {
if (fileSize < 1024) {
return fileSize + 'B';
} else if (fileSize < 1024 * 1024) {
var temp = fileSize / 1024;
temp = temp.toFixed(2);
return temp + 'KB';
} else if (fileSize < 1024 * 1024 * 1024) {
var temp = fileSize / (1024 * 1024);
temp = temp.toFixed(2);
return temp + 'MB';
} else {
var temp = fileSize / (1024 * 1024 * 1024);
temp = temp.toFixed(2);
return temp + 'GB';
}
}
/**
* 扫码上传功能
*/
function FindFile(inputId, key) {
$.post(app.url('index/attachment/draft'), {
key: key
}, function (data) {
var qrArray = [];
var fileDraft = "#fileDraft_" + inputId;
var items = $(fileDraft).find(".id");
$.each(items, function (i, row) {
qrArray.push($(this).val());
});
$.each(data, function (i, row) {
if (qrArray.indexOf(row.id + "") == -1) {
row.size = fileFormatSize(row.size);
var html = template("uploader-item-tpl", row);
$(fileDraft).append(html);
}
});
});
}
/**
* 格式为数值
* @param {*} value
*/
function toNumber(value) {
value = parseFloat(value);
return isNaN(value) ? 0 : isFinite(value) ? value : 0;
}
/**
* 实现StringBuilder
*/
function StringBuilder() {
this._stringArray = new Array();
}
StringBuilder.prototype.append = function (str) {
this._stringArray.push(str);
};
StringBuilder.prototype.appendLine = function (str) {
this._stringArray.push(str + "\n");
};
StringBuilder.prototype.toString = function (joinGap) {
return this._stringArray.join(joinGap);
};
/**
* 本地导出excel
* @param {*} grid
* @param {*} name
*/
function LocalExport(grid, name) {
if (grid.api.getDisplayedRowCount() == 0) {
toastrError("表格无数据,无法导出.");
return;
}
function getColumnsTable(columns) {
var table = [];
getColumnsRows(columns, 0, table);
return table;
}
function getColumnsRows(columns, level, table) {
var row = null;
if (table.length > level) {
row = table[level];
} else {
row = [];
table.push(row);
}
$.each(columns, function (name, column) {
var children = column['children'];
if (children != null) {
column['colspan'] = children.length;
getColumnsRows(children, level + 1, table);
}
column['rowspan'] = 1;
row.push(column);
});
}
function getColumnsBottom(columns) {
var columnsBottom = [];
$.each(columns, function (i, column) {
if (column['children'] != null) {
var children = column['children'];
$.each(getColumnsBottom(children), function (j, v) {
columnsBottom.push(v);
});
} else {
columnsBottom.push(column);
}
});
return columnsBottom;
}
var columns = [];
$.each(grid.columnDefs, function (i, column) {
if (column['checkboxSelection'] == true) {
return;
}
if (column['cellRenderer'] == '"actionCellRenderer"') {
return;
}
columns.push(column);
});
var columnsBottom = getColumnsBottom(columns);
var columnsTable = getColumnsTable(columns);
console.log("开始导出任务:" + name);
var sb = new StringBuilder(); // 写出列名
var columnsCount = columnsTable.length - 1;
$.each(columnsTable, function (i, rows) {
var columnsRow = rows;
sb.appendLine('<tr style="font-weight:bold;white-space:nowrap;">');
$.each(columnsRow, function (j, column) {
var rowspan = toNumber(column['rowspan']);
var colspan = toNumber(column['colspan']);
if (columnsCount > i) {
if (column['children'] == null) {
rowspan = rowspan + (i + 1);
}
}
var s = '<td colspan="' + colspan + '" rowspan="' + rowspan + '"';
var style = ['text-align:center'];
if (column['headerName'] == '序号') {
style.push('mso-number-format:\'@\'');
}
s = s + ' style="' + style.join(';') + '"';
s = s + '>' + column['headerName'] + '</td>';
sb.appendLine(s);
});
sb.appendLine('</tr>');
}); // 写出数据
var count = 0;
grid.api.forEachNode(function (rowNode, index) {
var row = rowNode.data;
sb.append("<tr>");
count++;
$.each(columnsBottom, function (n, column) {
var value;
if (column['field'] == null) {
value = '';
} else {
value = row[column['field']] || '';
}
if (column['cellRenderer'] == 'htmlCellRenderer') {
value = delHtmlTag(value);
}
if (column['headerName'] == '序号') {
value = count;
}
var style = [];
if (column.type == "number") {
var options = column.numberOptions || {};
var places = options.places == undefined ? 2 : options.places;
value = parseFloat(value);
value = isNaN(value) ? 0 : value.toFixed(places);
} else if (column.form_type == 'date') {} else {
style.push('mso-number-format:\'@\'');
}
sb.appendLine('<td style="' + style.join(';') + '">' + value + '</td>');
});
sb.appendLine("</tr>");
});
console.log("结束导出任务:" + name);
var worksheet = 'Sheet1';
var excel = sb.toString(" "); // 下载的表格模板数据
var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" ' + 'xmlns:x="urn:schemas-microsoft-com:office:excel" ' + 'xmlns="http://www.w3.org/TR/REC-html40">' + '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>' + '<x:Name>' + worksheet + '</x:Name>' + '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>' + '</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->' + '</head><body><table>' + excel + '</table></body></html>'; // 保存文件到本地
function saveShareContent(content, fileName) {
var downLink = document.createElement('a');
downLink.download = fileName; // 字符内容转换为blod地址
var blob = new Blob([content]);
downLink.href = URL.createObjectURL(blob); // 链接插入到页面
document.body.appendChild(downLink);
downLink.click(); // 移除下载链接
document.body.removeChild(downLink);
}
var d = new Date();
var date = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-');
saveShareContent(template, name + "-" + date + ".xls");
}
/**
* 导出普通table成xls
* @param {*} id
* @param {*} name
*/
function LocalTableExport(id, name) {
var table = $('#' + id);
var preserveColors = table.hasClass('table2excel_with_colors') ? true : false;
var d = new Date();
var date = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-');
table.table2excel({
exclude: ".noExl",
name: name,
filename: name + date + ".xls",
fileext: ".xls",
exclude_img: true,
exclude_links: true,
exclude_inputs: true,
preserveColors: preserveColors
});
}
/**
* 选择行政区域
*/
function regionSelect() {
var params = arguments;
var a = {
'a1': '省',
'a2': '市',
'a3': '县'
};
function getRegion(id, layer, parent_id, value) {
$.get(app.url('index/api/region', {
layer: layer,
parent_id: parent_id
}), function (res) {
var option = '';
$.map(res, function (row) {
option += '<option value="' + row.id + '">' + row.name + '</option>';
});
var e = $('#' + id).html(option);
if (value > 0) {
e.val(value);
}
});
}
$('#' + params[0]).on('change', function () {
getRegion(params[1], 2, this.value, 0);
$('#' + params[1]).html('<option value="">' + a['a' + 2] + '</option>');
$('#' + params[2]).html('<option value="">' + a['a' + 3] + '</option>');
});
$('#' + params[1]).on('change', function () {
getRegion(params[2], 3, this.value, 0);
$('#' + params[2]).html('<option value="">' + a['a' + 3] + '</option>');
});
getRegion(params[0], 1, 0, params[3]);
if (params[3]) {
getRegion(params[1], 2, params[3], params[4]);
if (params[4]) {
getRegion(params[2], 3, params[4], params[5]);
}
}
}
;