yvanui.power.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  1. /**
  2. * power
  3. * @author luoyifan
  4. * 2018-11-22 17:32:00
  5. */
  6. "use strict";
  7. $.parser.auto = false;
  8. (function ($) {
  9. function processFooter($target, item, context) {
  10. if (!item.hasOwnProperty('footer')) {
  11. return;
  12. }
  13. if ($.type(item.footer) === 'array') {
  14. var $toolbar = $('<div></div>');
  15. $target.append($toolbar);
  16. $toolbar = renderDispatch($toolbar, { xtype: 'toolbar', items: item.toolbar }, context);
  17. item.footer = $toolbar;
  18. return $toolbar;
  19. }
  20. if (($.type(item.footer) === 'object') || $.type(item.footer) === 'string') {
  21. if (!item.footer.id) {
  22. item.footer.id = $.yvan.createId();
  23. }
  24. var $toolbar = renderDispatch($target, item.footer, context);
  25. item.footer = $toolbar;
  26. return $toolbar;
  27. }
  28. }
  29. function processToolbar($target, item, context) {
  30. if (!item.hasOwnProperty('toolbar')) {
  31. return;
  32. }
  33. if ($.type(item.toolbar) === 'array') {
  34. var $toolbar = $('<div></div>');
  35. $target.append($toolbar);
  36. $toolbar = renderDispatch($toolbar, { xtype: 'toolbar', items: item.toolbar }, context);
  37. item.toolbar = $toolbar;
  38. return $toolbar;
  39. }
  40. if ($.type(item.toolbar) === 'object') {
  41. if (!item.toolbar.id) {
  42. item.toolbar.id = $.yvan.createId();
  43. }
  44. var $toolbar = renderDispatch($target, item.toolbar, context);
  45. item.toolbar = $toolbar;
  46. return $toolbar;
  47. }
  48. }
  49. function beforeRender($target, opts, context) {
  50. if ($.type(opts.onBeforeRender) === 'function') {
  51. var r = opts.onBeforeRender.apply(this, arguments);
  52. if (r === false) {
  53. return false;
  54. }
  55. }
  56. var funs = $.fn.power.defaults.beforeRender;
  57. for (var i = 0; i < funs.length; i++) {
  58. var fun = funs[i];
  59. if ($.type(fun) === 'function') {
  60. var r = fun.call(this, $target, opts, context);
  61. if (r === false) {
  62. return false;
  63. }
  64. }
  65. }
  66. return true;
  67. }
  68. function afterRender($target, opts, context) {
  69. var funs = $.fn.power.defaults.afterRender;
  70. for (var i = 0; i < funs.length; i++) {
  71. var fun = funs[i];
  72. if ($.type(fun) === 'function') {
  73. fun.apply(this, arguments);
  74. }
  75. }
  76. if ($.type(opts.onRender) === 'function') {
  77. opts.onRender.apply(this, arguments);
  78. }
  79. }
  80. function renderDispatch($target, item, context, parent) {
  81. if (!item) {
  82. return;
  83. }
  84. if ($.type(item) === 'array') {
  85. //元素是数组,用 row 隔开
  86. var $row = $('<div class="yvan-row"></div>');
  87. $target.append($row);
  88. renderEach($row, item, context, parent);
  89. return;
  90. }
  91. if ($.type(item) === 'string') {
  92. //元素是字符串,直接输出html
  93. $target.append(item);
  94. return;
  95. }
  96. if ($.type(item) === 'function') {
  97. //item 是函数
  98. var r = item.apply(this, context);
  99. renderDispatch($target, r, context);
  100. return;
  101. }
  102. // yvTreeGrid 专用方法
  103. function resizeMe() {
  104. var $panel = $(this).parent();
  105. var d = $panel.height() - 50;
  106. $target.css({
  107. "height": d + 'px'
  108. });
  109. }
  110. //if (item.importUrl) {
  111. // //带有url, 需要 ajax 获取配置内容
  112. // var $dom = $('<div></div>'); //带一个占位符
  113. // $target.append($dom);
  114. // $.yvan.readyJs({
  115. // url: item.importUrl,
  116. // success: function (data) {
  117. // var vv = eval(data);
  118. // var importBack = data.importUrl;
  119. // //扩展到当前属性
  120. // data = $.extend({}, vv(), item);
  121. // if (importBack) {
  122. // //配置 ajax 结果中带有 importUrl 属性,需要继续 importUrl
  123. // data.importUrl = importBack;
  124. // } else {
  125. // delete data.importUrl;
  126. // }
  127. // renderDispatch($dom, data, context);
  128. // }
  129. // });
  130. // return;
  131. //}
  132. item.xtype = item.xtype || 'textbox';
  133. switch (item.xtype) {
  134. case 'textbox':
  135. case 'combobox':
  136. case 'searchbox':
  137. case 'datebox':
  138. case 'numberbox':
  139. case 'combotree':
  140. case 'combotreegrid':
  141. case 'combogrid':
  142. case 'datetimebox':
  143. case 'tagbox':
  144. case 'yvselect':
  145. case 'maskedbox':
  146. case 'passwordbox':
  147. case 'filebox':
  148. case 'numberspinner':
  149. if (beforeRender.call(this, $target, item, context) === false) {
  150. return;
  151. }
  152. var css = 'easyui-' + item.xtype;
  153. //宽度计算
  154. if (!item.width) {
  155. item.span = item.span || 1;
  156. if (item.span === 1) {
  157. item.width = 280;
  158. } else if (item.span === 2) {
  159. item.width = 560;
  160. } else if (item.span === 3) {
  161. item.width = 840;
  162. }
  163. }
  164. //生成DOM
  165. var $dom = $('<input class="' + css + ' ctl_' + item.name + '" name="' + item.name + '" />');
  166. if(typeof(item.ff) === 'number'){
  167. $dom.attr('ff', item.ff)
  168. }
  169. $.yvan.fillCommonProperties($dom, item);
  170. $target.append($('<div class="vv"></div>').append($dom));
  171. if ($.inArray(item.xtype, ['textbox']) >= 0 && item.widget) {
  172. item.icons = [
  173. {
  174. iconCls: 'icon-clear',
  175. handler: widget.clear
  176. }, {
  177. iconCls: 'icon-search',
  178. handler: function (e) {
  179. widget.show(item.widget, this);
  180. }
  181. }];
  182. }
  183. if ($.inArray(item.xtype, ['textbox']) >= 0 && item.dialog) {
  184. item.icons = [
  185. {
  186. iconCls: 'icon-clear',
  187. handler: widget.clear
  188. }, {
  189. iconCls: 'icon-search',
  190. handler: function (e) {
  191. var me = this;
  192. $.yvan.showDialog(me, item.dialog);
  193. }
  194. }];
  195. }
  196. if (window.hasOwnProperty('shortcut')) {
  197. shortcut.processInput($dom, item, context);
  198. }
  199. if (parent) {
  200. //代入上级给的 subLabelWidth/subControlWidth
  201. if (parent.hasOwnProperty('subLabelWidth') && !item.hasOwnProperty('labelWidth')) {
  202. item.labelWidth = parent.subLabelWidth;
  203. }
  204. if (parent.hasOwnProperty('subControlWidth') && !item.hasOwnProperty('width')) {
  205. item.width = parent.subControlWidth;
  206. }
  207. }
  208. //初始化元素
  209. $dom[item.xtype](item);
  210. if(item.labelWidth!=='auto' && item.labelWrap===true){
  211. var labelDOM = $dom.prev();
  212. if(labelDOM.is('label')){
  213. labelDOM.css({
  214. 'line-height': '16px',
  215. 'white-space': 'pre-wrap'
  216. })
  217. }
  218. }
  219. if (item.xtype === 'searchbox') {
  220. $dom.searchbox('onSysRender');
  221. }
  222. if (item.xtype === 'maskedbox') {
  223. var $c = $dom.maskedbox('textbox');
  224. $c.css({ height: '30px', lineHeight: '30px' });
  225. $c.parent().css({ height: '30px' });
  226. }
  227. if (item.hasOwnProperty('maxlength') && $.type(item.maxlength) === 'number') {
  228. setTimeout(function () {
  229. if ($dom.data().hasOwnProperty('textbox')) {
  230. $dom.textbox('textbox').attr('maxlength', item.maxlength);
  231. }
  232. });
  233. }
  234. if (window.hasOwnProperty('shortcut')) {
  235. shortcut.processInputAfter($dom, item, context);
  236. }
  237. if (item.readonly) {
  238. //只读框,为span 增加一个 tooltip 属性
  239. var $span = $dom.next();
  240. $span.tooltip({
  241. position: 'bottom',
  242. onShow: function () {
  243. var value = $dom.val();
  244. if (!value || $.trim(value).length <= 10) {
  245. $(this).tooltip('destroy');
  246. } else {
  247. $(this).tooltip({
  248. content: value
  249. }).tooltip('tip').css({
  250. color: 'rgb(255, 255, 255)',
  251. 'background-color': 'rgb(255, 126, 0)'
  252. });
  253. }
  254. }
  255. });
  256. }
  257. if (item.xtype === 'combobox') {
  258. //combobox 点击后自动下拉
  259. $dom.next().on('click', 'input', function () {
  260. if (!$dom.combobox('options').readonly) {
  261. $dom.combobox("showPanel");
  262. }
  263. });
  264. item.isFirstLoad = true;
  265. $dom.combobox({
  266. onSelect: function (data) {
  267. if (item.onSelect && $.type(item.onSelect) === 'function') {
  268. item.onSelect(data);
  269. }
  270. setTimeout(function () {
  271. if (item.isFirstLoad && item.onValue && $.type(item.onValue) === 'function') {
  272. item.onValue(data);
  273. }
  274. item.isFirstLoad = false;
  275. }, 100);
  276. }
  277. });
  278. $dom.combobox({
  279. onChange: function (data, value) {
  280. if (item.onChange && $.type(item.onChange) === 'function') {
  281. item.onChange(data, value);
  282. }
  283. if (item.onValue && $.type(item.onValue) === 'function') {
  284. item.isFirstLoad = false;
  285. item.onValue(data, value);
  286. }
  287. }
  288. });
  289. //.bind('focus', function () {
  290. // $dom.combobox("showPanel");
  291. //})
  292. //.bind('blur', function () {
  293. // $dom.combobox("hidePanel");
  294. //});
  295. }
  296. if (item.xtype === 'datebox') {
  297. //datebox 点击后自动下拉
  298. $dom.textbox("textbox").bind('click', function () {
  299. if (!$dom.datebox('options').readonly) {
  300. $dom.datebox("showPanel");
  301. }
  302. });
  303. }
  304. if (item.xtype === 'datetimebox') {
  305. //datetimebox 点击后自动下拉
  306. $dom.textbox("textbox").bind('click', function () {
  307. if (!$dom.datebox('options').readonly) {
  308. $dom.datebox("showPanel");
  309. }
  310. });
  311. }
  312. afterRender.call($dom[0], $target, item, context);
  313. return $dom;
  314. case 'offset':
  315. if (beforeRender.call(this, $target, item, context) === false) {
  316. return;
  317. }
  318. var $dom = $('<div class="yvan-form-offset" />');
  319. $.yvan.fillCommonProperties($dom, item);
  320. $target.append($dom);
  321. if (parent) {
  322. //代入上级给的 subLabelWidth/subControlWidth
  323. if (parent.hasOwnProperty('subLabelWidth') && !item.hasOwnProperty('labelWidth')) {
  324. $dom.css({ width: parent.subLabelWidth });
  325. }
  326. }
  327. afterRender.call($dom[0], $target, item, context);
  328. return $dom;
  329. case 'menu':
  330. var $dom = $('<ul class="dropdown-menu user-menu"></ul>');
  331. $.yvan.fillCommonProperties($dom, item);
  332. var items = $.yvan.getItems(item);
  333. for (var i = 0; i < items.length; i++) {
  334. var $item = $('<li></li>');
  335. var $a = '<a>' + items[i].text + '</a>';
  336. var $icon = '<i class="yvan-icon fa fa-wpforms"></i>';
  337. $item.append($a);
  338. $a.append($icon);
  339. $dom.append($item);
  340. }
  341. return $dom;
  342. case 'checkgroup':
  343. if (beforeRender.call(this, $target, item, context) === false) {
  344. return;
  345. }
  346. var $dom = $('<div class="vv"></div>');
  347. $.yvan.fillCommonProperties($dom, item);
  348. $target.append($dom);
  349. $dom.checkgroup(item);
  350. afterRender.call($dom[0], $target, item, context);
  351. return $dom;
  352. case 'radiogroup':
  353. if (beforeRender.call(this, $target, item, context) === false) {
  354. return;
  355. }
  356. var $dom = $('<div class="vv"></div>');
  357. $.yvan.fillCommonProperties($dom, item);
  358. $target.append($dom);
  359. $dom.radiogroup(item);
  360. afterRender.call($dom[0], $target, item, context);
  361. return $dom;
  362. case 'checkbox':
  363. if (beforeRender.call(this, $target, item, context) === false) {
  364. return;
  365. }
  366. var $dom = $('<input type="checkbox" />');
  367. $.yvan.fillCommonProperties($dom, item);
  368. if (item.hasOwnProperty('name')) {
  369. $dom.attr('name', item.name);
  370. }
  371. if (item.hasOwnProperty('checked')) {
  372. $dom.attr('checked', item.checked);
  373. }
  374. if (item.hasOwnProperty('disable')) {
  375. $dom.attr('disable', item.disable);
  376. }
  377. if (item.hasOwnProperty('primary')) {
  378. $dom.attr('primary', item.primary);
  379. }
  380. $target.append($dom);
  381. $dom.checkbox(item);
  382. afterRender.call($dom[0], $target, item, context);
  383. return $dom;
  384. case 'radiobutton':
  385. if (beforeRender.call(this, $target, item, context) === false) {
  386. return;
  387. }
  388. var $dom = $('<input type="radio" />');
  389. $.yvan.fillCommonProperties($dom, item);
  390. if (item.hasOwnProperty('name')) {
  391. $dom.attr('name', item.name);
  392. }
  393. if (item.hasOwnProperty('checked')) {
  394. $dom.attr('checked', item.checked);
  395. }
  396. if (item.hasOwnProperty('disable')) {
  397. $dom.attr('disable', item.disable);
  398. }
  399. $target.append($dom);
  400. $dom.radiobutton(item);
  401. afterRender.call($dom[0], $target, item, context);
  402. return $dom;
  403. case 'hidden':
  404. if (beforeRender.call(this, $target, item, context) === false) {
  405. return;
  406. }
  407. var $dom = $('<input type="hidden" name="' + item.name + '" />');
  408. $.yvan.fillCommonProperties($dom, item);
  409. $dom.data({ options: item });
  410. if (item.hasOwnProperty('value')) {
  411. $dom.val(item.value);
  412. }
  413. $target.append($dom);
  414. afterRender.call($dom[0], $target, item, context);
  415. return $dom;
  416. case 'dialog':
  417. //对话框本身不增加任何DOM元素,但要在Power级别记录Options
  418. if (!context.options.hasOwnProperty('dialogs')) {
  419. context.options.dialogs = {};
  420. }
  421. context.options.dialogs[item.dialogId] = item;
  422. break;
  423. case 'div':
  424. if (beforeRender.call(this, $target, item, context) === false) {
  425. return;
  426. }
  427. var $dom = $('<div></div>');
  428. $.yvan.fillCommonProperties($dom, item);
  429. $target.append($dom);
  430. renderEach($dom, $.yvan.getItems(item), context);
  431. afterRender.call($dom[0], $target, item, context);
  432. return $dom;
  433. case 'layout':
  434. if (beforeRender.call(this, $target, item, context) === false) {
  435. return;
  436. }
  437. //布局
  438. var $dom = $('<div class="easyui-layout"></div>');
  439. $.yvan.fillCommonProperties($dom, item);
  440. $target.append($dom);
  441. layoutRender($dom, item, context, item);
  442. afterRender.call($dom[0], $target, item, context);
  443. break;
  444. case 'panel':
  445. if (beforeRender.call(this, $target, item, context) === false) {
  446. return;
  447. }
  448. var $dom = $('<div class="easyui-panel" style="width:100%"></div>');
  449. $.yvan.fillCommonProperties($dom, item);
  450. $target.append($dom);
  451. $dom.panel($.extend({ border: false }, item));
  452. afterRender.call($dom[0], $target, item, context);
  453. return $dom;
  454. case 'group':
  455. if (beforeRender.call(this, $target, item, context) === false) {
  456. return;
  457. }
  458. //表单分组
  459. var $dom = $('<div style="padding: 5px 10px"></div>');
  460. $.yvan.fillCommonProperties($dom, item);
  461. var $group = $('<fieldset class="yvan-form-groups"></fieldset>');
  462. $dom.append($group);
  463. if (item.title) {
  464. $group.append($('<legend>' + item.title + '</legend>'));
  465. }
  466. $target.append($dom);
  467. renderEach($group, $.yvan.getItems(item), context, item);
  468. afterRender.call($dom[0], $target, item, context);
  469. return $dom;
  470. case 'form':
  471. if (beforeRender.call(this, $target, item, context) === false) {
  472. return;
  473. }
  474. var $dom = $('<form></form>');
  475. if ($.trim(item.name)) {
  476. $dom.attr('name', item.name);
  477. }
  478. $.yvan.fillCommonProperties($dom, item);
  479. $target.append($dom);
  480. //枚举下级所有元素
  481. renderEach($dom, $.yvan.getItems(item), context, item);
  482. afterRender.call($dom[0], $target, item, context);
  483. return $dom;
  484. case 'formgroup':
  485. if (beforeRender.call(this, $target, item, context) === false) {
  486. return;
  487. }
  488. var $dom = $('<form style="padding: 5px 10px"></form>');
  489. $.yvan.fillCommonProperties($dom, item);
  490. if ($.trim(item.name)) {
  491. $dom.attr('name', item.name);
  492. }
  493. var $group = $('<fieldset class="yvan-form-groups"></fieldset>');
  494. $dom.append($group);
  495. if (item.title) {
  496. $group.append($('<legend>' + item.title + '</legend>'));
  497. }
  498. $target.append($dom);
  499. renderEach($group, $.yvan.getItems(item), context, item);
  500. afterRender.call($dom[0], $target, item, context);
  501. return $dom;
  502. case 'toolbar':
  503. if (beforeRender.call(this, $target, item, context) === false) {
  504. return;
  505. }
  506. var $dom = $('<div class="easyui-toolbar"></div>');
  507. $.yvan.fillCommonProperties($dom, item);
  508. $target.append($dom);
  509. $dom.toolbar(item, context);
  510. afterRender.call($dom[0], $target, item, context);
  511. return $dom;
  512. case 'grid':
  513. if (!$.jgrid || !$.jgrid.yvanui) {
  514. return;
  515. }
  516. if (beforeRender.call(this, $target, item, context) === false) {
  517. return;
  518. }
  519. var $dom = $.jgrid.createDom($target, item, context);
  520. afterRender.call($dom[0], $target, item, context);
  521. return $dom;
  522. case 'egrid':
  523. if (beforeRender.call(this, $target, item, context) === false) {
  524. return;
  525. }
  526. var $dom = $('<table></table>');
  527. $.yvan.fillCommonProperties($dom, item);
  528. $target.append($dom);
  529. egridProcess(item);
  530. $dom.edatagrid(item);
  531. if (window.hasOwnProperty('shortcut')) {
  532. shortcut.processGrid($dom, item, context);
  533. }
  534. afterRender.call($dom[0], $target, item, context);
  535. return $dom;
  536. case 'datalist':
  537. if (beforeRender.call(this, $target, item, context) === false) {
  538. return;
  539. }
  540. var $dom = $('<table class="easyui-datalist"></table>');
  541. $.yvan.fillCommonProperties($dom, item);
  542. $target.append($dom);
  543. $dom.datalist(item);
  544. afterRender.call($dom[0], $target, item, context);
  545. return $dom;
  546. case 'datagrid':
  547. if (beforeRender.call(this, $target, item, context) === false) {
  548. return;
  549. }
  550. var $dom = $('<table class="easyui-datagrid"></table>');
  551. $.yvan.fillCommonProperties($dom, item);
  552. $target.append($dom);
  553. processToolbar($target, item, context);
  554. $dom.datagrid(item);
  555. if (window.hasOwnProperty('shortcut')) {
  556. shortcut.processGrid($dom, item, context);
  557. }
  558. afterRender.call($dom[0], $target, item, context);
  559. return $dom;
  560. case 'tabs':
  561. if (beforeRender.call(this, $target, item, context) === false) {
  562. return;
  563. }
  564. var $dom = $('<div class="easyui-tabs"></div>');
  565. $.yvan.fillCommonProperties($dom, item);
  566. $target.append($dom);
  567. tabRender($dom, item, context, item);
  568. afterRender.call($dom[0], $target, item, context);
  569. return $dom;
  570. case 'tree':
  571. if (beforeRender.call(this, $target, item, context) === false) {
  572. return;
  573. }
  574. var $dom = $('<div class="easyui-tree"></div>');
  575. $.yvan.fillCommonProperties($dom, item);
  576. $target.append($dom);
  577. $dom.tree(item);
  578. afterRender.call($dom[0], $target, item, context);
  579. return $dom;
  580. case 'treegrid':
  581. if (beforeRender.call(this, $target, item, context) === false) {
  582. return;
  583. }
  584. var $dom = $('<div class="easyui-treegrid"></div>');
  585. $.yvan.fillCommonProperties($dom, item);
  586. $target.append($dom);
  587. $dom.treegrid(item);
  588. afterRender.call($dom[0], $target, item, context);
  589. return $dom;
  590. case 'propertygrid':
  591. if (beforeRender.call(this, $target, item, context) === false) {
  592. return;
  593. }
  594. var $dom = $('<table></table>');
  595. $.yvan.fillCommonProperties($dom, item);
  596. $target.append($dom);
  597. $dom.propertygrid(item);
  598. afterRender.call($dom[0], $target, item, context);
  599. return $dom;
  600. case 'button':
  601. if (beforeRender.call(this, $target, item, context) === false) {
  602. return;
  603. }
  604. var $dom = $('<a class="easyui-linkbutton"></a>');
  605. $.yvan.fillCommonProperties($dom, item);
  606. $target.append($dom);
  607. $dom.linkbutton(item);
  608. afterRender.call($dom[0], $target, item, context);
  609. return $dom;
  610. default:
  611. if ($.fn.power.defaults.xtype.hasOwnProperty(item.xtype)) {
  612. //从扩展组件中找
  613. if (beforeRender.call(this, $target, item, context) === false) {
  614. return;
  615. }
  616. var id = $.yvan.createId(item.xtype);
  617. $target.attr('id','super_' + id);
  618. var $dom = $.fn.power.defaults.xtype[item.xtype]($target, item, context, id);
  619. if (item.xtype === 'yvtreegrid') {
  620. var $panel = $target;
  621. if ($panel.data().hasOwnProperty('panel')) {
  622. $panel.panel({onResize: resizeMe});
  623. resizeMe.call($panel);
  624. }
  625. }
  626. afterRender.call($dom[0], $target, item, context);
  627. return $dom;
  628. }
  629. console.log('无法识别的元素类型', item.xtype);
  630. }
  631. }
  632. function renderEach($target, items, context, parent) {
  633. for (var i = 0; i < items.length; i++) {
  634. renderDispatch($target, items[i], context, parent);
  635. }
  636. }
  637. function tabRender($target, item, context) {
  638. var tabsOption = $.yvan.getItems(item);
  639. var doms = [];
  640. for (var i = 0; i < tabsOption.length; i++) {
  641. var tabOption = tabsOption[i];
  642. if ($.type(tabOption) === 'function') {
  643. tabOption = tabOption(context);
  644. }
  645. if (!tabOption) {
  646. continue;
  647. }
  648. if (beforeRender.call(this, $target, tabOption, context) === false) {
  649. continue;
  650. }
  651. var $dom = $('<div title="' + (tabOption.title || '') + '" xtype="tab"></div>');
  652. $dom.attr('data-options', dataOptions(tabOption, ['title', 'lazy']));
  653. $.yvan.fillCommonProperties($dom, tabOption);
  654. doms.push($dom);
  655. $target.append($dom);
  656. afterRender.call($dom[0], $target, tabOption, context);
  657. if (tabOption.lazy) {
  658. $.data($dom[0], 'lazyOption', tabOption);
  659. } else {
  660. renderEach($dom, $.yvan.getItems(tabOption), context);
  661. }
  662. }
  663. $target.tabs($.extend({}, item, {
  664. onSelect: function (title, index) {
  665. var $tabDom = $(this).tabs('getTab', index);
  666. if ($tabDom.data().hasOwnProperty('lazyOption')) {
  667. renderEach($tabDom, $.yvan.getItems($tabDom.data().lazyOption), context);
  668. delete $tabDom.data().lazyOption;
  669. }
  670. if (item.onSelect) {
  671. item.onSelect.apply(this, arguments);
  672. }
  673. setTimeout(function(){
  674. shortcut.ffApply($tabDom)
  675. })
  676. }
  677. }));
  678. }
  679. function layoutRender($target, opts, context) {
  680. //var childProp = ['height', 'width', 'split', 'border', 'title'];
  681. var functions = [];
  682. for (var name in opts) {
  683. if (!opts.hasOwnProperty(name)) continue;
  684. var value = opts[name];
  685. if ($.inArray(name, ['xtype', 'attr', 'itemId', 'id', 'html', 'class', 'css', 'title', 'onRender', 'onBeforeRender']) >= 0) {
  686. //忽略属性
  687. continue;
  688. }
  689. switch (name) {
  690. case 'north': //上面
  691. case 'center': //中间
  692. case 'west': //左边
  693. case 'east': //右边
  694. case 'south': //下面
  695. if (beforeRender.call(this, $target, value, context) === false) {
  696. continue;
  697. }
  698. var $dom = $('<div></div>');
  699. $dom.attr('data-options', dataOptions(value, [], {
  700. region: name
  701. }));
  702. $.yvan.fillCommonProperties($dom, value);
  703. $target.append($dom);
  704. $dom.attr('tabIndex', -1);
  705. //继续递归
  706. (function ($dom, $target, items, context, value) {
  707. functions.push(function () {
  708. renderEach($dom, items, context);
  709. afterRender.call($dom[0], $target, value, context);
  710. });
  711. })($dom, $target, $.yvan.getItems(value), context, value);
  712. break;
  713. case 'assist':
  714. //辅助类操作
  715. renderEach(null, opts[name], context);
  716. break;
  717. default:
  718. //renderDispatch($target, name, value);
  719. console.log('layout 下面只允许出现 north,center,west,east,south 属性, 未知属性:', name);
  720. break;
  721. }
  722. }
  723. $target.layout({
  724. fit: true
  725. });
  726. functions.forEach(function (v) {
  727. v();
  728. });
  729. $target.attr('tabIndex', -1);
  730. //$.yvan.parse($target);
  731. }
  732. function dataOptions(opts, exclude, mergeObj) {
  733. exclude.push('attr', 'itemId', 'id', 'html', 'class', 'css', 'xtype', 'items', 'dialog', 'attr');
  734. var obj = mergeObj || {};
  735. for (var name in opts) {
  736. if (!opts.hasOwnProperty(name)) continue;
  737. if ($.inArray(name, exclude) >= 0) {
  738. continue;
  739. }
  740. obj[name] = opts[name];
  741. }
  742. var json = JSON.stringify(obj);
  743. return json.substr(1, json.length - 2);
  744. }
  745. function printLog($e) {
  746. var value = $e.prop("outerHTML");
  747. value = value.replace(new RegExp('&quot;', 'g'), "'");
  748. value = value.replace(/\'([^(\')"]+)\':/g, "$1:");
  749. console.log(value);
  750. }
  751. function egridProcess(item) {
  752. if (!item.hasOwnProperty('columns'))
  753. return;
  754. for (var i = 0; i < item.columns.length; i++) {
  755. var cg = item.columns[i];
  756. if ($.type(cg) !== 'array')
  757. continue;
  758. for (var j = 0; j < cg.length; j++) {
  759. //如果没有定义编辑框,就退出
  760. if (!cg[j].hasOwnProperty('editor')) continue;
  761. if (!cg[j].editor.options) {
  762. cg[j].editor.options = {};
  763. }
  764. //默认 tooltip 在底端
  765. if (cg[j].editor.options.hasOwnProperty('tipPosition')) continue;
  766. cg[j].editor.options.tipPosition = 'top';
  767. //绑定onChange属性
  768. if ($.type(cg[j].editor.onChange) === 'function') {
  769. (function (vv) {
  770. cg[j].editor.options.onChange = function (n, o) {
  771. var $dg = $(this).closest("div.datagrid-view").down('egrid');
  772. var row = $dg.edatagrid('getEditRow');
  773. if ($.type(row) === 'undefined') {
  774. return;
  775. }
  776. vv.apply(this, [$dg, row, n, o]);
  777. };
  778. })(cg[j].editor.onChange);
  779. }
  780. }
  781. }
  782. }
  783. function render(target, context) {
  784. var opts = $.data(target, 'power').options;
  785. var $target = $(target);
  786. // if ($.type(opts.title) === 'string') {
  787. // $(document).attr("title", opts.title);
  788. // }
  789. if (beforeRender.call(this, $target, opts, context) === false) {
  790. return;
  791. }
  792. //power 是快捷键容器
  793. if (window.hasOwnProperty('shortcut')) {
  794. shortcut.createContainer($target, context);
  795. }
  796. $target.addClass('easyui-layout');
  797. $.yvan.fillCommonProperties($target, opts);
  798. if (!$target.attr('xtype')) {
  799. $target.attr('xtype', 'power');
  800. }
  801. $target.html('');
  802. layoutRender($target, opts, context);
  803. afterRender.call($target[0], $target, opts, context);
  804. //$.yvan.parse($target);
  805. }
  806. $.fn.power = function (options, param) {
  807. if (typeof options === 'string') {
  808. var method = $.fn.power.methods[options];
  809. return method(this, param);
  810. }
  811. options = options || {};
  812. var context = $.extend({}, param);
  813. return this.each(function () {
  814. var state = $.data(this, 'power');
  815. if (state) {
  816. //扩展属性
  817. $.extend(state.options, options);
  818. context.options = state.options;
  819. } else {
  820. //新加属性
  821. context.options = $.extend({}, options);
  822. $.data(this, 'power', {
  823. options: context.options
  824. });
  825. }
  826. render(this, context);
  827. });
  828. };
  829. $.fn.power.methods = {
  830. find: function (jq, itemId) {
  831. return jq.find('.ctl_' + itemId);
  832. },
  833. renderDispatch: function (jq, param) {
  834. return renderDispatch(param.$target, param.item, param.context);
  835. },
  836. renderEach: function (jq, param) {
  837. return renderEach(param.$target, param.items, param.context);
  838. },
  839. processToolbar: function (jq, param) {
  840. return processToolbar(param.$target, param.item, param.context);
  841. },
  842. processFooter: function (jq, param) {
  843. return processFooter(param.$target, param.item, param.context);
  844. }
  845. };
  846. $.fn.power.defaults = {
  847. beforeRender: [],
  848. afterRender: [],
  849. xtype: {}
  850. };
  851. $.fn.power.dialogs = {
  852. defaults: {
  853. title: '未命名对话框',
  854. width: 300,
  855. height: 200,
  856. resizable: true,
  857. maximizable: true,
  858. collapsible: false,
  859. minimizable: false,
  860. closable: true,
  861. modal: true,
  862. inline: true
  863. }
  864. };
  865. })(jQuery);