yvanui.yvtreegrid.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. /**
  2. * yvan.yvtreegrid.js
  3. * @author luoyifan
  4. * 2019-07-18 21:30:00
  5. */
  6. 'use strict';
  7. (function ($) {
  8. var filterable = false;
  9. var pageable = false;
  10. if (!jqxTreeGrid) {
  11. console.warn('no jqxTreeGrid!!');
  12. return;
  13. }
  14. function buildColumns($dom, option) {
  15. if (option.filterable == false) {
  16. filterable = false;
  17. } else {
  18. filterable = true;
  19. }
  20. if (option.pageable == true) {
  21. pageable = true;
  22. }
  23. else {
  24. pageable = false;
  25. }
  26. /*===== Columns ======*/
  27. var columns = option.columns;
  28. if ($.type(columns) === 'array' && $.type(columns[0]) === 'array') {
  29. //easyui 的设置方法
  30. columns = columns[0];
  31. var columnsNew = [];
  32. for (var i = 0; i < columns.length; i++) {
  33. if (columns[i].hidden === true) {
  34. continue;
  35. }
  36. var vv = columns[i];
  37. var ret = {
  38. dataField: vv.field,
  39. text: vv.title,
  40. type: vv.type || 'string'
  41. };
  42. if (vv.type === 'number') {
  43. $.extend(ret, {cellsalign: 'right', cellsformat: 'd'});
  44. }
  45. if (vv.align == 'right') {
  46. $.extend(ret, {cellsalign: 'right', cellsformat: 'd'});
  47. }
  48. if (vv.align == 'center') {
  49. $.extend(ret, {cellsalign: 'center', cellsformat: 'd'});
  50. }
  51. if ($.type(vv.width) !== 'undefined') {
  52. $.extend(ret, {width: vv.width});
  53. } else {
  54. if (option.autoSizeColumns) {
  55. $.extend(ret, {width: 80});
  56. }
  57. }
  58. if (vv.type === 'bool') {
  59. ret.cellsrenderer = (function (onOffValue) {
  60. return function (row, columnfield, value, defaulthtml, columnproperties) {
  61. if ($.trim(value) === onOffValue.on) {
  62. return '<div style="position: absolute; top: 50%; left: 50%; margin-top: -9px; margin-left: -12px;" class="jqx-widget jqx-checkbox" checked="checked"><div class="jqx-checkbox-default jqx-fill-state-normal jqx-rc-all"><div style="width: 16px; height: 16px;"><span style="width: 16px; height: 16px;" class="jqx-checkbox-check-checked"></span></div></div><div style="clear: both;"></div></div>';
  63. }
  64. if ($.trim(value) === onOffValue.off) {
  65. return '<div style="position: absolute; top: 50%; left: 50%; margin-top: -9px; margin-left: -12px;" class="jqx-widget jqx-checkbox"><div class="jqx-checkbox-default jqx-fill-state-normal jqx-rc-all"><div style="width: 16px; height: 16px;"><span style="width: 16px; height: 16px;"></span></div></div><div style="clear: both;"></div></div>';
  66. }
  67. return defaulthtml;
  68. };
  69. })({on: vv.on, off: vv.off});
  70. }
  71. if ($.type(vv.formatter) === 'function') {
  72. ret.cellsrenderer = (function (formatter) {
  73. return function (row, columnfield, value, defaulthtml, columnproperties) {
  74. value = formatter.call(this, value);
  75. if (!columnproperties) {
  76. columnproperties = {cellsalign: 'left'};
  77. }
  78. return '<span class="jqx-grid-cell-' + columnproperties.cellsalign + '-align" title="' + value + '" style="margin-top: 8px;padding: 0 10px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">' + value + '</span>';
  79. };
  80. })(vv.formatter);
  81. } else if ($.type(vv.formatter) === 'array') {
  82. ret.cellsrenderer = (function (formatter) {
  83. return function (row, columnfield, value, defaulthtml, columnproperties) {
  84. for (var i = 0; i < formatter.length; i++) {
  85. if (formatter[i]['id'] === $.trim(value)) {
  86. value = formatter[i]['text'];
  87. break;
  88. }
  89. }
  90. if (!columnproperties) {
  91. columnproperties = {cellsalign: 'left'};
  92. }
  93. // 如果formatter中有html标签处理标签之后再赋值到title
  94. if (value.indexOf('>') > -1) {
  95. return '<span class="jqx-grid-cell-' + columnproperties.cellsalign + '-align" title="' + filterHTMLTag(value) + '" style="margin-top: 8px;">' + value + '</span>';
  96. }
  97. return '<span class="jqx-grid-cell-' + columnproperties.cellsalign + '-align" style="margin-top: 8px;">' + value + '</span>';
  98. };
  99. })(vv.formatter);
  100. } else {
  101. ret.cellsrenderer = (function () {
  102. return function (row, columnfield, value, defaulthtml, columnproperties) {
  103. return '<span class="jqx-grid-cell-' + columnproperties.cellsalign + '-align" title="' + value + '" style="margin-top: 8px;padding: 0 10px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">' + value + '</span>';
  104. };
  105. })(vv.formatter);
  106. }
  107. // 标题居中
  108. if (vv.titleAlign === 'left') {
  109. ret.renderer = function (value) {
  110. return '<div class="jqx-grid-cell-left-align" style="margin-top: 8px;">' + value + '</div>';
  111. }
  112. } else if (vv.titleAlign === 'right') {
  113. ret.renderer = function (value) {
  114. return '<div class="jqx-grid-cell-right-align" style="margin-top: 8px;">' + value + '</div>';
  115. }
  116. } else {
  117. ret.renderer = function (value) {
  118. return '<div class="jqx-grid-cell-center-align" style="margin-top: 8px;">' + value + '</div>';
  119. }
  120. }
  121. columnsNew.push(ret);
  122. }
  123. columns = columnsNew;
  124. }
  125. if (option.rownumbers) {
  126. columns = [{
  127. pinned: true,
  128. exportable: false,
  129. text: "",
  130. columntype: 'number',
  131. resizable: false,
  132. sortable: false,
  133. filterable: filterable,
  134. dataField: '__NO__',
  135. editable: false,
  136. cellsAlign: 'right',
  137. align: 'right',
  138. cellsrenderer: function (row, column, value) {
  139. return '<div class="jqx-grid-cell-right-align" style="margin-top: 8.5px;">' + (value + 1) + '</div>';
  140. },
  141. createEverPresentRowWidget: function (datafield, htmlElement, popup, addCallback) {
  142. var editor = $("<div class='asterisk'>*</div>").appendTo(htmlElement);
  143. return editor;
  144. },
  145. initEverPresentRowWidget: function (datafield, htmlElement) {
  146. },
  147. getEverPresentRowWidgetValue: function (datafield, htmlElement, validate) {
  148. },
  149. resetEverPresentRowWidgetValue: function (datafield, htmlElement) {
  150. }
  151. }].concat(columns);
  152. }
  153. return columns;
  154. }
  155. function buildDataSource($dom, easyuiOpt, columns, data, jqxOption) {
  156. var dataAdapter, source;
  157. //本地直接给数据
  158. if ($.type(data) === 'array') {
  159. source = {
  160. localdata: data,
  161. datatype: "json",
  162. id: easyuiOpt.idField,
  163. hierarchy: {
  164. keyDataField: {name: easyuiOpt.keyDataField},
  165. parentDataField: {name: easyuiOpt.parentDataField}
  166. },
  167. //datafields: datafields, //这里不能给定 fields ,给定了就无法动态计算列了
  168. //beforeprocessing: function (root) { //本地数据 不支持分页数
  169. // $dom.jqxGrid('source')._source.totalrecords = root.length;
  170. //}
  171. };
  172. dataAdapter = new $.jqx.dataAdapter(source);
  173. }
  174. return dataAdapter;
  175. }
  176. function init(target) {
  177. var state = $.data(target, 'yvtreegrid');
  178. var easyuiOpt = state.options;
  179. var $dom = $(target);
  180. var columns = buildColumns($dom, easyuiOpt);
  181. /*===== 复制新的 option ======*/
  182. var jqxOption = {
  183. height: '100%',
  184. width: '100%',
  185. columnsResize: true,
  186. columnsHeight: 36,
  187. altRows: true,
  188. //sortable: true,
  189. enableBrowserSelection: true,
  190. checkboxes: easyuiOpt.checkbox,
  191. filterable: filterable,
  192. filterMode: 'simple',
  193. columns: columns,
  194. };
  195. /*===== 数据源 ======*/
  196. var dataAdapter = buildDataSource($dom, easyuiOpt, columns, easyuiOpt.data, jqxOption);
  197. $.extend(jqxOption, {
  198. source: dataAdapter
  199. });
  200. delete easyuiOpt.data;
  201. /*===== 分页 ======*/
  202. $.extend(jqxOption, {
  203. pageable: pageable,
  204. });
  205. /*====== 工具栏 ======*/
  206. if (easyuiOpt.hasOwnProperty('toolbar')) {
  207. var toolbar = easyuiOpt.toolbar;
  208. $.extend(jqxOption, {
  209. showtoolbar: true,
  210. rendertoolbar: function ($dom) {
  211. if ($.type(toolbar) === 'array') {
  212. $dom.power('renderEach', {
  213. $target: $dom,
  214. items: toolbar,
  215. });
  216. } else if ($.type(toolbar) === 'object') {
  217. $dom.power('renderDispatch', {
  218. $target: $dom,
  219. item: toolbar,
  220. });
  221. }
  222. },
  223. });
  224. if (toolbar.hasOwnProperty('height')) {
  225. jqxOption.toolbarheight = toolbar.height || 38;
  226. }
  227. }
  228. //execute DOM
  229. $dom.jqxTreeGrid(jqxOption);
  230. $dom.on('rowDoubleClick', function (event) {
  231. if (event.args.row.expanded) {
  232. $dom.jqxTreeGrid('collapseRow', event.args.key);
  233. } else {
  234. $dom.jqxTreeGrid('expandRow', event.args.key);
  235. }
  236. });
  237. $dom.on('rowClick', function () {
  238. if ($.type(easyuiOpt.onRowClick) === 'function') {
  239. easyuiOpt.onRowClick.apply(this, arguments);
  240. }
  241. });
  242. $dom.on('rowSelect', function () {
  243. if ($.type(easyuiOpt.onRowSelect) === 'function') {
  244. easyuiOpt.onRowSelect.apply(this, arguments);
  245. }
  246. });
  247. $dom.on('rowCheck', function () {
  248. if ($.type(easyuiOpt.onRowCheck) === 'function') {
  249. easyuiOpt.onRowCheck.apply(this, arguments);
  250. }
  251. });
  252. $dom.on('rowUncheck', function () {
  253. if ($.type(easyuiOpt.onRowCheck) === 'function') {
  254. easyuiOpt.onRowCheck.apply(this, arguments);
  255. }
  256. });
  257. if (!easyuiOpt.border) {
  258. $dom.css({
  259. "border-style": 'none'
  260. });
  261. }
  262. // function resizeMe() {
  263. // var $panel = $(this).parent();
  264. // var d = $panel[0].offsetHeight - 20;
  265. // // $dom.css({
  266. // // "height":d+'px'
  267. // // });
  268. // // var id = $dom.attr('id');
  269. // // $('#horizontalScrollBar' + id).css({
  270. // // "top":d-16+'px'
  271. // // });
  272. // // //d = $('#verticalScrollBar' + id)[0].offsetHeight - 20;
  273. // // $('#verticalScrollBar' + id).css({
  274. // // "height":d+'px'
  275. // // });
  276. //
  277. // //d = $('#content' + id)[0].offsetHeight - 20;
  278. // // $('#content' + id).css({
  279. // // "height":d+'px'
  280. // // });
  281. // $panel.css({
  282. // "height": d + 'px'
  283. // });
  284. // }
  285. // var $panel = $dom.parent();
  286. //
  287. // if ($panel.data().hasOwnProperty('panel')) {
  288. // $panel.panel({onResize: resizeMe});
  289. // resizeMe.call($panel[0]);
  290. // }
  291. // // var id = 'super_'+$dom.attr('id');
  292. // // var d = $('#'+id)[0].offsetHeight-20;
  293. // // $dom.css({
  294. // // "height":d+'px'
  295. // // });
  296. return $dom;
  297. }
  298. $.fn.power.defaults.xtype.yvtreegrid = function ($targetDOM, option, context, id) {
  299. var tid = 'toalCount' + id;
  300. var $dom = $('<div id="' + id + '" xtype="yvtreegrid"></div>');
  301. $targetDOM.append($dom);
  302. $targetDOM.parent().append('<div style="height: 30px; width: 100%; background-color: #f6f6f6;"> <div id="' + tid + '" style=" float:right;">暂无数据</div></div>');
  303. return $dom.yvtreegrid(option, context);
  304. };
  305. $.fn.yvtreegrid = function (options, param) {
  306. if (typeof options == 'string') {
  307. var method = $.fn.yvtreegrid.methods[options];
  308. if (method) {
  309. var args = [this];
  310. for (var i = 1; i < arguments.length; i++) {
  311. args.push(arguments[i]);
  312. }
  313. return method.apply(this, args);
  314. } else {
  315. console.error('not found method:' + options);
  316. }
  317. }
  318. options = options || {};
  319. return this.each(function () {
  320. var state = $.data(this, 'yvtreegrid');
  321. if (state) {
  322. $.extend(state.options, options);
  323. } else {
  324. $.data(this, 'yvtreegrid', {
  325. options: $.extend({}, $.fn.yvtreegrid.defaults, options)
  326. });
  327. }
  328. init(this, param);
  329. });
  330. };
  331. /**
  332. * 获取指定的行编号的对应数据
  333. * 如果不设置参数就获取当前或被选中的行数据
  334. */
  335. function getSelected($dom) {
  336. var selection = $dom.jqxTreeGrid('getSelection');
  337. if (selection && selection.length > 0) {
  338. return selection[0];
  339. }
  340. return null;
  341. }
  342. function getCheckedRows($dom) {
  343. return $dom.jqxTreeGrid('getCheckedRows');
  344. }
  345. $.fn.yvtreegrid.methods = {
  346. /**
  347. * 获取指定的行编号的对应数据
  348. * 如果不设置参数就获取当前或被选中的行数据
  349. */
  350. rowData: getSelected,
  351. currentRowData: getSelected,
  352. getSelected: getSelected,
  353. /**
  354. * 获取被勾选的行
  355. */
  356. getCheckedRows: getCheckedRows,
  357. selectRow: function ($dom, value) {
  358. $dom.jqxTreeGrid('selectRow', value);
  359. },
  360. reload: function (jq, option) {
  361. return jq.each(function () {
  362. var target = this;
  363. var state = $.data(target, 'yvtreegrid');
  364. var $dom = $(target);
  365. option = $.extend(state.options, option);
  366. var ttt = '暂无数据';
  367. if (option && option.data && option.data.length > 0) {
  368. ttt = '共' + option.data.length + '条';
  369. }
  370. $('#toalCount' + $(this).attr('id')).html(ttt);
  371. var columns = buildColumns($dom, option);
  372. var jqxOption = {};
  373. var dataAdapter = buildDataSource($dom, option, columns, option.data, jqxOption);
  374. $.extend(jqxOption, {
  375. source: dataAdapter
  376. });
  377. //console.log('build source queryParams:', option.queryParams);
  378. $dom.jqxTreeGrid(jqxOption);
  379. delete option.data;
  380. });
  381. },
  382. expandAll: function ($dom) {
  383. $dom.jqxTreeGrid('expandAll');
  384. }
  385. };
  386. $.fn.yvtreegrid.defaults = {
  387. width: '100%',
  388. height: '90%',
  389. checkbox: false,
  390. autoSizeColumns: true,
  391. columnsHeight: 36,
  392. border: false
  393. };
  394. //yvtreegrid
  395. })(jQuery);