wms-formdesigner.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. /*
  2. * 描 述:自定义表单设计
  3. */
  4. (function ($, learun) {
  5. "use strict";
  6. $.lrCustmerFormDesigner = {
  7. init: function ($self, op) {
  8. var dfop = {
  9. dbId: '', // 数据主键
  10. dbTable: [], // 对应的表数据
  11. data: [{// 选项卡数据
  12. id: '1',
  13. text: '主表信息',
  14. componts: []
  15. }]
  16. }
  17. $.extend(dfop, op || {});
  18. dfop.id = $self.attr('id');
  19. $self[0]._lrCustmerFormDesigner = { dfop: dfop };
  20. $self.addClass('lr-custmerform-designer-layout');
  21. var _html = '';
  22. _html += '<div class="lr-custmerform-designer-layout-left" id="lr_custmerform_compont_list_' + dfop.id + '"></div>';
  23. _html += '<div class="lr-custmerform-designer-layout-center">';
  24. _html += '<div class="lr-custmerform-designer-layout-header">';
  25. _html += '<div class="lr-custmerform-designer-tabs" id="lr_custmerform_designer_tabs_' + dfop.id + '">';
  26. _html += '</div>';
  27. _html += '</div>';
  28. _html += '<div class="lr-custmerform-designer-layout-area" id="lr_custmerform_designer_layout_area_' + dfop.id + '" ></div>';
  29. _html += '<div class="lr-custmerform-designer-layout-footer">';
  30. _html += '<div class="lr-custmerform-designer-layout-footer-item" id="lr_custmerform_tabsEdit_btn_' + dfop.id + '"><i class="fa fa-pencil-square-o"></i><span>选项卡编辑</span></div>';
  31. _html += '<div class="lr-custmerform-designer-layout-footer-item" id="lr_custmerform_preview_btn_' + dfop.id + '"><i class="fa fa-eye"></i><span>预览表单</span></div>';
  32. _html += '</div>';
  33. _html += '<div class="lr-custmerform-designer-layout-center-bg"><img src="' + top.$.rootUrl + '/Content/images/tableform.png" /></div>';
  34. _html += '<div class="lr-custmerform-designer-layout-tabedit" id="lr_custmerform_designer_layout_tabedit_' + dfop.id + '" ></div>';
  35. _html += '</div>';
  36. _html += '<div class="lr-custmerform-designer-layout-right" id="lr_custmerform_compont_property_' + dfop.id + '"></div>';
  37. $self.html(_html);
  38. $.lrCustmerFormDesigner.bind($self);
  39. $.lrCustmerFormDesigner.compontinit($self);
  40. $.lrCustmerFormDesigner.compontbind($self);
  41. $.lrCustmerFormDesigner.tabbind($self);
  42. $.lrCustmerFormDesigner.renderTabs($self);
  43. $.lrCustmerFormDesigner.renderComponts($self);
  44. },
  45. // 绑定表单设计器的全局事件
  46. bind: function ($self) {
  47. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  48. // 优化滚动条
  49. $('#lr_custmerform_compont_list_' + dfop.id).lrscroll();
  50. $('#lr_custmerform_designer_tabs_' + dfop.id).lrscroll();
  51. $('#lr_custmerform_designer_layout_area_' + dfop.id).lrscroll();
  52. $('#lr_custmerform_compont_property_' + dfop.id).lrscroll();
  53. $('#lr_custmerform_designer_layout_area_' + dfop.id + ' .lr-scroll-box')[0].dfop = dfop;
  54. // 编辑选项卡
  55. $('#lr_custmerform_designer_layout_tabedit_' + dfop.id ).jfGrid({
  56. headData: [
  57. {
  58. label: "", name: "btn1", width: 50, align: "center",
  59. formatter: function (value, row, op, $cell) {
  60. $cell.on('click', function () {
  61. var rowindex = parseInt($cell.attr('rowindex'));
  62. var res = $('#lr_custmerform_designer_layout_tabedit_' + dfop.id).jfGridSet('moveUp', rowindex);
  63. if (res) {
  64. $.lrCustmerFormDesigner.renderTabs($self);
  65. }
  66. return false;
  67. });
  68. return '<span class=\"label label-info\" style=\"cursor: pointer;\">上移</span>';
  69. }
  70. },
  71. {
  72. label: "", name: "btn2", width: 50, align: "center",
  73. formatter: function (value, row, op, $cell) {
  74. $cell.on('click', function () {
  75. var rowindex = parseInt($cell.attr('rowindex'));
  76. var res = $('#lr_custmerform_designer_layout_tabedit_' + dfop.id).jfGridSet('moveDown', rowindex);
  77. if (res) {
  78. $.lrCustmerFormDesigner.renderTabs($self);
  79. }
  80. return false;
  81. });
  82. return '<span class=\"label label-success\" style=\"cursor: pointer;\">下移</span>';
  83. }
  84. },
  85. {
  86. label: "选项卡名称", name: "text", width: 200, align: "left",
  87. edit: {
  88. type: 'input',
  89. change: function (row, rowIndex) {
  90. $('#lr_custmerform_designer_tabs_' + dfop.id + ' .lr-scroll-box').find('div').eq(rowIndex).html(row.text || '&nbsp;');
  91. }
  92. }
  93. }
  94. ],
  95. mainId: 'id',
  96. isEdit: true,
  97. isMultiselect: true,
  98. rowdatas: dfop.data,
  99. onAddRow: function (row, rows) {
  100. row.id = learun.newGuid();
  101. row.text = '新建选项卡';
  102. row.componts = [];
  103. console.log(dfop.data);
  104. $.lrCustmerFormDesigner.renderTabs($self);
  105. },
  106. onMinusRow: function (row, rows) {
  107. $.lrCustmerFormDesigner.renderTabs($self);
  108. },
  109. beforeMinusRow: function (row) {
  110. if (row.id == '1') {
  111. return false;
  112. }
  113. return true;
  114. },
  115. });
  116. $self.find('#lr_custmerform_tabsEdit_btn_' + dfop.id).on('click', function () {
  117. var $edit = $('#lr_custmerform_designer_layout_tabedit_' + dfop.id);
  118. if ($edit.hasClass('open')) {
  119. $edit.animate({ 'bottom': '-269px', speed: 2000 });
  120. $edit.removeClass('open');
  121. }
  122. else {
  123. $edit.animate({ 'bottom': '31px', speed: 2000 });
  124. $edit.addClass('open');
  125. }
  126. $edit = null;
  127. return false;
  128. });
  129. $('#lr_custmerform_designer_layout_tabedit_' + dfop.id).on('click', function () {
  130. return false;
  131. });
  132. $self.on('click', function () {
  133. var $edit = $('#lr_custmerform_designer_layout_tabedit_' + dfop.id);
  134. $edit.animate({ 'bottom': '-269px', speed: 2000 });
  135. $edit.removeClass('open');
  136. $edit = null;
  137. });
  138. // 预览表单
  139. $self.find('#lr_custmerform_preview_btn_' + dfop.id).on('click', function () {
  140. top.custmerFormData = dfop.data;
  141. $.lrCustmerFormDesigner.saveComponts($self);
  142. learun.layerForm({
  143. id: 'custmerForm_PreviewForm',
  144. title: '预览当前表单',
  145. url: top.$.rootUrl + '/Utility/PreviewForm?keyValue=custmerFormData',
  146. width: 800,
  147. height: 600,
  148. maxmin: true,
  149. btn: null
  150. });
  151. });
  152. },
  153. // 组件初始化
  154. compontinit: function ($self) {// 组件初始化
  155. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  156. var $compontList = $self.find('#lr_custmerform_compont_list_' + dfop.id + ' .lr-scroll-box');
  157. if (dfop.components && dfop.components.length > 0) {
  158. $.each(dfop.components, function (i, id) {
  159. var $component = $.lrFormComponents[id].init();
  160. $compontList.append($component);
  161. });
  162. }
  163. else {
  164. $.each($.lrFormComponents, function (i, component) {
  165. var $component = component.init();
  166. $compontList.append($component);
  167. });
  168. }
  169. $compontList.find('.lr-custmerform-component').draggable({
  170. connectToSortable: '#lr_custmerform_designer_layout_area_' + dfop.id + ' .lr-scroll-box',
  171. helper: "clone",
  172. revert: "invalid"
  173. });
  174. $('#lr_custmerform_designer_layout_area_' + dfop.id + ' .lr-scroll-box').sortable({
  175. opacity: 0.4,
  176. delay: 300,
  177. cursor: 'move',
  178. placeholder: "ui-state-highlight",
  179. stop: function (event, ui) {
  180. var $compont = $(ui.item[0]);
  181. var componttype = $compont.attr('data-type');
  182. if (!!componttype) {//如果是第一次移入,需要对单元项进行初始化处理
  183. var $designer = $compont.parents('.lr-custmerform-designer-layout');
  184. $compont.addClass('lr-compont-item').css({ 'width': '100%' });
  185. $compont.removeClass('lr-custmerform-component');
  186. $compont.removeAttr('data-type');
  187. $.lrFormComponents[componttype].render($compont);
  188. $compont[0].dfop.id = learun.newGuid();
  189. $compont.trigger("click");
  190. }
  191. else {
  192. $compont.trigger("click");
  193. }
  194. },
  195. start: function (event, ui) {
  196. $self.find(".lr-custmerform-designer-layout-center-bg").hide();
  197. var $highlight = $self.find(".ui-state-highlight");
  198. $highlight.html('拖放控件到这里');
  199. var $compont = $(ui.item[0]);
  200. var componttype = $compont.attr('data-type');
  201. if (!componttype) {
  202. $highlight.css({ width: ((100 / $compont[0].dfop.proportion) + "%") });
  203. }
  204. },
  205. out: function (event, ui) {
  206. if (ui.helper != null) {
  207. var $componts = $('.lr-custmerform-designer-layout-area .lr-scroll-box .lr-compont-item');
  208. if ($componts.length <= 1) {
  209. if ($componts.length == 1) {
  210. if ($componts.find('.lr-compont-value').length == 0) {
  211. $(".lr-custmerform-designer-layout-center-bg").show();
  212. }
  213. }
  214. else {
  215. $(".lr-custmerform-designer-layout-center-bg").show();
  216. }
  217. }
  218. }
  219. }
  220. });
  221. },
  222. // 组件事件注册
  223. compontbind: function ($self) {
  224. $self.delegate('.lr-compont-item', 'click', function () {
  225. var $this = $(this);
  226. if (!$this.hasClass('active')) {
  227. $('.lr-custmerform-designer-layout-area .lr-scroll-box .lr-compont-item').removeClass('active');
  228. $this.addClass('active');
  229. if ($('.lr-custmerform-designer-layout').css('padding-right') == '0px') {
  230. $('.lr-custmerform-designer-layout').animate({ 'padding-right': '240px', speed: 2000 });
  231. $('.lr-custmerform-designer-layout-right').animate({ right: 0, speed: 2000 });
  232. }
  233. setTimeout(function () {
  234. $.lrFormComponents[$this[0].dfop.type].property($this);
  235. }, 150);
  236. }
  237. return false;
  238. });
  239. $self.delegate('.lr-compont-remove i', 'click', function () {
  240. var $compont = $(this).parents('.lr-compont-item');
  241. $compont.remove();
  242. if ($('.lr-custmerform-designer-layout-area .lr-scroll-box .lr-compont-item').length == 0) {
  243. $('.lr-custmerform-designer-layout-right').animate({ right: '-240px', speed: 2000 });
  244. $('.lr-custmerform-designer-layout').animate({ 'padding-right': '0px', speed: 2000 });
  245. $(".lr-custmerform-designer-layout-center-bg").show();
  246. }
  247. else {
  248. $('.lr-custmerform-designer-layout-area .lr-scroll-box .lr-compont-item').eq(0).trigger('click');
  249. }
  250. });
  251. },
  252. // 选项卡事件绑定
  253. tabbind: function ($self) {
  254. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  255. $self.delegate('#lr_custmerform_designer_tabs_' + dfop.id + ' .lr-scroll-box>div', 'click', function () {
  256. var $this = $(this);
  257. if (!$this.hasClass('active')) {
  258. var $parent = $this.parent();
  259. var $self = $this.parents('.lr-custmerform-designer-layout');
  260. var _dfop = $self[0]._lrCustmerFormDesigner.dfop;
  261. $parent.find('.active').removeClass('active');
  262. $this.addClass('active');
  263. // 保存当前选项卡组件数据
  264. $.lrCustmerFormDesigner.saveComponts($self);
  265. // 切换到新的选项卡数据
  266. _dfop._currentTabId = $this.attr('data-value');
  267. for (var i = 0; i < _dfop.data.length; i++) {
  268. var tabItem = _dfop.data[i];
  269. if (_dfop._currentTabId == tabItem.id) {
  270. _dfop._currentComponts = _dfop.data[i].componts;
  271. }
  272. }
  273. _dfop._isRenderComponts = true;
  274. $.lrCustmerFormDesigner.renderComponts($self);
  275. }
  276. });
  277. },
  278. // 渲染选项卡
  279. renderTabs: function ($self) {// 渲染选项卡
  280. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  281. var $tabs = $('#lr_custmerform_designer_tabs_' + dfop.id + ' .lr-scroll-box');
  282. var tabsLength = dfop.data.length;
  283. var index = 0;
  284. $tabs.html("");
  285. for (var i = 0; i < tabsLength; i++) {
  286. var tabItem = dfop.data[i];
  287. $tabs.append('<div data-value="' + tabItem.id + '">' + tabItem.text || '&nbsp;' + '</div>');
  288. if (dfop._currentTabId == tabItem.id) {
  289. index = i;
  290. }
  291. }
  292. // 获取当前选项卡的组件数据并渲染
  293. if (dfop._currentTabId != dfop.data[index].id) {
  294. dfop._currentTabId = dfop.data[index].id;
  295. dfop._currentComponts = dfop.data[index].componts;
  296. dfop._isRenderComponts = true;
  297. $.lrCustmerFormDesigner.renderComponts($self);
  298. }
  299. if (tabsLength <= 1) {
  300. $self.find('.lr-custmerform-designer-layout-center').removeClass('hasTab');
  301. }
  302. else {
  303. $self.find('.lr-custmerform-designer-layout-center').addClass('hasTab');
  304. $tabs.find('div').eq(index).addClass('active');
  305. var w = 0;
  306. var width = $tabs.children().each(function () {
  307. w += $(this).outerWidth();
  308. });
  309. $tabs.css({ 'width': w });
  310. }
  311. },
  312. // 渲染数据
  313. renderData: function ($self) {
  314. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  315. var $tabs = $('#lr_custmerform_designer_tabs_' + dfop.id + ' .lr-scroll-box');
  316. var tabsLength = dfop.data.length;
  317. $tabs.html("");
  318. $('#lr_custmerform_designer_layout_tabedit_' + dfop.id).jfGridSet("refreshdata", dfop.data);
  319. for (var i = 0; i < tabsLength; i++) {
  320. var tabItem = dfop.data[i];
  321. $tabs.append('<div data-value="' + tabItem.id + '">' + tabItem.text || '&nbsp;' + '</div>');
  322. if (i == 0) {
  323. dfop._currentTabId = tabItem.id;
  324. dfop._currentComponts = dfop.data[0].componts;
  325. dfop._isRenderComponts = true;
  326. $.lrCustmerFormDesigner.renderComponts($self);
  327. }
  328. }
  329. if (tabsLength <= 1) {
  330. $self.find('.lr-custmerform-designer-layout-center').removeClass('hasTab');
  331. }
  332. else {
  333. $self.find('.lr-custmerform-designer-layout-center').addClass('hasTab');
  334. $tabs.find('div').eq(0).addClass('active');
  335. var w = 0;
  336. var width = $tabs.children().each(function () {
  337. w += $(this).outerWidth();
  338. });
  339. $tabs.css({ 'width': w });
  340. }
  341. },
  342. // 保存当前选项卡的组件数据
  343. saveComponts: function ($self) {
  344. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  345. var componts = [];
  346. var compontsLayout = $('#lr_custmerform_designer_layout_area_' + dfop.id + ' .lr-scroll-box');
  347. compontsLayout.find('.lr-compont-item').each(function () {
  348. var compont = $(this)[0].dfop;
  349. componts.push(compont);
  350. });
  351. for (var i = 0, l = dfop.data.length; i < l; i++) {
  352. if (dfop.data[i].id == dfop._currentTabId) {
  353. dfop.data[i].componts = componts;
  354. break;
  355. }
  356. }
  357. },
  358. // 渲染组件
  359. renderComponts: function ($self) {
  360. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  361. if (dfop._isRenderComponts) {
  362. var compontsLayout = $('#lr_custmerform_designer_layout_area_' + dfop.id + ' .lr-scroll-box');
  363. compontsLayout.html('');
  364. if (dfop._currentComponts.length > 0) {
  365. $self.find(".lr-custmerform-designer-layout-center-bg").hide();
  366. for (var i = 0, l = dfop._currentComponts.length; i < l; i++) {
  367. var compontItem = dfop._currentComponts[i];
  368. var $compont = $('<div class="lr-compont-item" ></div>');
  369. $compont[0].dfop = compontItem;
  370. $compont.css({ 'width': 100 / parseInt(compontItem.proportion) + '%' });
  371. $.lrFormComponents[compontItem.type].render($compont);
  372. compontsLayout.append($compont);
  373. if (i == 0) {
  374. $compont.trigger("click");
  375. }
  376. }
  377. }
  378. else {
  379. $('.lr-custmerform-designer-layout-right').animate({ right: '-240px', speed: 2000 });
  380. $('.lr-custmerform-designer-layout').animate({ 'padding-right': '0px', speed: 2000 });
  381. $(".lr-custmerform-designer-layout-center-bg").show();
  382. }
  383. dfop._isRenderComponts = false;
  384. }
  385. },
  386. // 更新绑定的数据表字段信息
  387. updatedb: function ($self, op) {
  388. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  389. if (dfop.dbId != op.dbId) {// 如果数据库改变,绑定字段数据重置
  390. dfop.dbId = op.dbId;
  391. for (var i = 0, l = dfop.data.length; i < l; i++) {
  392. for (var j = 0, jl = dfop.data[i].componts.length; j < jl; j++) {
  393. dfop.data[i].componts[j].table = '';
  394. dfop.data[i].componts[j].field = '';
  395. }
  396. }
  397. }
  398. else {
  399. for (var i = 0, l = dfop.dbTable.length; i < l; i++) {
  400. var tablename = dfop.dbTable[i].name;
  401. var flag = false;
  402. for (var j = 0, jl = op.dbTable.length; i < jl; i++) {
  403. if (op.dbTable[i].name == tablename) {
  404. flag = true;
  405. break;
  406. }
  407. }
  408. if (!flag) {
  409. for (var i = 0, l = dfop.data.length; i < l; i++) {
  410. for (var j = 0, jl = dfop.data[i].componts.length; j < jl; j++) {
  411. if (dfop.data[i].componts[j].table == tablename) {
  412. dfop.data[i].componts[j].table = '';
  413. dfop.data[i].componts[j].field = '';
  414. }
  415. }
  416. }
  417. }
  418. }
  419. }
  420. dfop.dbTable = op.dbTable;
  421. },
  422. // 判定所有组件数据是否输入完整(主要是数据库绑定信息)
  423. validData: function ($self) {
  424. var dfop = $self[0]._lrCustmerFormDesigner.dfop;
  425. var _data = {};
  426. var res = true;
  427. for (var i = 0, l = dfop.data.length; i < l; i++) {
  428. for (var j = 0, jl = dfop.data[i].componts.length; j < jl; j++) {
  429. if (dfop.data[i].componts[j].type != 'label') {
  430. var table = dfop.data[i].componts[j].table;
  431. var field = dfop.data[i].componts[j].field;
  432. var title = dfop.data[i].componts[j].title;
  433. if (table != '' && field != '') {
  434. if (!!_data[table + '_' + field]) {
  435. learun.alert.error('【' + title + '】绑定数据表字段与【' + _data[table + '_' + field] + '】重复!');
  436. res = false;
  437. }
  438. else {
  439. _data[table + '_' + field] = title;
  440. }
  441. }
  442. else {
  443. if (dfop.data[i].componts[j].type == 'gridtable') {
  444. if (table == '') {
  445. learun.alert.error('【表格项】请绑定数据表!');
  446. res = false;
  447. }
  448. }
  449. else {
  450. learun.alert.error('【' + title + '】请绑定数据表!');
  451. res = false;
  452. }
  453. }
  454. }
  455. }
  456. }
  457. return res;
  458. }
  459. };
  460. //对外暴露接口
  461. $.fn.lrCustmerFormDesigner = function (type, op) {
  462. var $this = $(this);
  463. if (!$this.attr('id')) {
  464. return false;
  465. }
  466. switch (type) {
  467. // 初始化设计器
  468. case "init":
  469. $.lrCustmerFormDesigner.init($this, op);
  470. break;
  471. // 更新数据库绑定信息
  472. case 'updatedb':
  473. $.lrCustmerFormDesigner.updatedb($this, op);
  474. break;
  475. // 判定所有组件数据是否输入完整(主要是数据库绑定信息)
  476. case 'valid':
  477. $.lrCustmerFormDesigner.saveComponts($this);
  478. return $.lrCustmerFormDesigner.validData($this);
  479. break;
  480. case "get":
  481. $.lrCustmerFormDesigner.saveComponts($this);
  482. var dfop = $this[0]._lrCustmerFormDesigner.dfop;
  483. var res = {
  484. dbId: dfop.dbId,
  485. dbTable: dfop.dbTable,
  486. data: dfop.data
  487. };
  488. return res;
  489. break;
  490. case "set":
  491. var dfop = $this[0]._lrCustmerFormDesigner.dfop;
  492. dfop.dbId = op.dbId;
  493. dfop.dbTable = op.dbTable;
  494. dfop.data = op.data;
  495. $.lrCustmerFormDesigner.renderData($this);
  496. break;
  497. }
  498. };
  499. })(jQuery, top.learun);