UU跑腿标准版

ligerPortal.js 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. /**
  2. * jQuery ligerUI 1.2.4
  3. *
  4. * http://ligerui.com
  5. *
  6. * Author daomi 2014 [ gd_star@163.com ]
  7. *
  8. */
  9. (function ($)
  10. {
  11. $.fn.ligerPortal = function (options)
  12. {
  13. return $.ligerui.run.call(this, "ligerPortal", arguments);
  14. };
  15. $.ligerDefaults.Portal = {
  16. width: null,
  17. /*行元素:组件允许以纵向方式分割为几块
  18. 每一块(行)允许自定义N个列(column)
  19. 每一列允许自定义N个Panel(最小元素)
  20. rows:[
  21. {columns:[
  22. {
  23. width : '50%',
  24. panels : [{width:'100%',content:'内容'},{width:'100%',url:@url1}]
  25. },{
  26. width : '50%',
  27. panels : [{width:'100%',url:@url2}]
  28. }
  29. ]}
  30. ]
  31. */
  32. rows: null,
  33. /* 列元素: 组件将认为只存在一个row(块),
  34. 这一块 允许自定义N个列(column),结构同上
  35. */
  36. columns:null,
  37. url: null, //portal结构定义URL
  38. method: 'get', //获取数据http方式
  39. parms: null, //提交到服务器的参数
  40. draggable: false, //是否允许拖拽
  41. onLoaded:null //url模式 加载完事件
  42. };
  43. $.ligerDefaults.Portal_rows = {
  44. width: null,
  45. height: null
  46. };
  47. $.ligerDefaults.Portal_columns = {
  48. width: null,
  49. height: null
  50. };
  51. $.ligerMethos.Portal = {};
  52. $.ligerui.controls.Portal = function (element, options)
  53. {
  54. $.ligerui.controls.Portal.base.constructor.call(this, element, options);
  55. };
  56. $.ligerui.controls.Portal.ligerExtend($.ligerui.core.UIComponent, {
  57. __getType: function ()
  58. {
  59. return 'Portal';
  60. },
  61. __idPrev: function ()
  62. {
  63. return 'Portal';
  64. },
  65. _extendMethods: function ()
  66. {
  67. return $.ligerMethos.Portal;
  68. },
  69. _init: function ()
  70. {
  71. var g = this, p = this.options;
  72. $.ligerui.controls.Portal.base._init.call(this);
  73. if ($(">div", g.element).length) //如果已经定义了DIV子元素,那么这些元素将会转换为columns,这里暂时保存到tempInitPanels
  74. {
  75. p.columns = [];
  76. $(">div", g.element).each(function (i, jpanel)
  77. {
  78. p.columns[i] = {
  79. panels :[]
  80. };
  81. });
  82. g.tempInitPanels = $("<div></div>");
  83. $(">div", g.element).appendTo(g.tempInitPanels);
  84. }
  85. if (!p.rows && p.columns)
  86. {
  87. p.rows = [{
  88. columns: p.columns
  89. }];
  90. }
  91. },
  92. _render: function ()
  93. {
  94. var g = this, p = this.options;
  95. g.portal = $(g.element).addClass("l-portal").html("");
  96. g.set(p);
  97. },
  98. _setRows: function (rows)
  99. {
  100. var g = this, p = this.options;
  101. g.rows = [];
  102. if (rows && rows.length)
  103. {
  104. for (var i = 0; i < rows.length; i++)
  105. {
  106. var row = rows[i];
  107. var jrow = $('<div class="l-row"></div>').appendTo(g.portal);
  108. g.rows[i] = g._renderRow({
  109. row: row,
  110. rowIndex: i,
  111. jrow: jrow
  112. });
  113. jrow.append('<div class="l-clear"></div>');
  114. }
  115. }
  116. },
  117. _renderRow : function(e)
  118. {
  119. var row = e.row, rowIndex = e.rowIndex, jrow = e.jrow;
  120. var g = this, p = this.options;
  121. var rowObj = {
  122. element : jrow[0]
  123. };
  124. if (row.width) jrow.width(row.width);
  125. if (row.height) jrow.height(row.height);
  126. if (row.columns) rowObj.columns = [];
  127. if (row.columns && row.columns.length)
  128. {
  129. for (var i = 0; i < row.columns.length; i++)
  130. {
  131. var column = row.columns[i];
  132. var jcolumn = $('<div class="l-column"></div>').appendTo(jrow);
  133. rowObj.columns[i] = g._renderColumn({
  134. column: column,
  135. columnIndex: i,
  136. jcolumn: jcolumn,
  137. rowIndex : rowIndex
  138. });
  139. }
  140. }
  141. return rowObj;
  142. },
  143. remove: function (e)
  144. {
  145. var g = this, p = this.options;
  146. var rowIndex = e.rowIndex, columnIndex = e.columnIndex, index = e.index;
  147. if (index == null) index = -1;
  148. if (index >= 0 && g.rows[rowIndex] && g.rows[rowIndex].columns && g.rows[rowIndex].columns[columnIndex] && g.rows[rowIndex].columns[columnIndex].panels)
  149. {
  150. var panel = g.rows[rowIndex].columns[columnIndex].panels[index];
  151. panel && panel.close();
  152. g._updatePortal();
  153. }
  154. },
  155. add: function (e)
  156. {
  157. var g = this, p = this.options;
  158. var rowIndex = e.rowIndex, columnIndex = e.columnIndex, index = e.index, panel = e.panel;
  159. if (index == null) index = -1;
  160. if (!(g.rows[rowIndex] && g.rows[rowIndex].columns && g.rows[rowIndex].columns[columnIndex])) return;
  161. var gColumn = g.rows[rowIndex].columns[columnIndex], pColumn = p.rows[rowIndex].columns[columnIndex], ligerPanel, jcolumn = $(gColumn.element);
  162. pColumn.panels = pColumn.panels || [];
  163. gColumn.panels = gColumn.panels || [];
  164. pColumn.panels.splice(index, 0, panel);
  165. if (index < 0)
  166. {
  167. var jpanel = $('<div></div>').insertBefore(gColumn.jplace);
  168. ligerPanel = jpanel.ligerPanel(panel);
  169. } else if(gColumn.panels[index])
  170. {
  171. var jpanel = $('<div></div>').insertBefore(gColumn.panels[index].panel);
  172. ligerPanel = jpanel.ligerPanel(panel);
  173. }
  174. if (ligerPanel)
  175. {
  176. ligerPanel.bind('closed', g._createPanelClosed());
  177. g.setPanelEvent({
  178. panel: ligerPanel
  179. });
  180. gColumn.panels.splice(index, 0, ligerPanel);
  181. }
  182. g._updatePortal();
  183. },
  184. _createPanelClosed : function ()
  185. {
  186. var g = this, p = this.options;
  187. return function ()
  188. {
  189. var panel = this;//ligerPanel对象
  190. var panels = g.getPanels();
  191. var rowIndex, columnIndex, index;
  192. $(panels).each(function ()
  193. {
  194. if (this.panel == panel)
  195. {
  196. rowIndex = this.rowIndex;
  197. columnIndex = this.columnIndex;
  198. index = this.index;
  199. }
  200. });
  201. p.rows[rowIndex].columns[columnIndex].panels.splice(index, 1);
  202. g.rows[rowIndex].columns[columnIndex].panels.splice(index, 1);
  203. };
  204. },
  205. _renderColumn: function (e)
  206. {
  207. var column = e.column, columnIndex = e.columnIndex, jcolumn = e.jcolumn;
  208. var rowIndex = e.rowIndex;
  209. var g = this, p = this.options;
  210. var columnObj = {
  211. element : jcolumn[0]
  212. };
  213. if (column.width) jcolumn.width(column.width);
  214. if (column.height) jcolumn.height(column.height);
  215. if (column.panels) columnObj.panels = [];
  216. if (column.panels && column.panels.length)
  217. {
  218. for (var i = 0; i < column.panels.length; i++)
  219. {
  220. var panel = column.panels[i];
  221. var jpanel = $('<div></div>').appendTo(jcolumn);
  222. columnObj.panels[i] = jpanel.ligerPanel(panel);
  223. columnObj.panels[i].bind('closed', g._createPanelClosed());
  224. g.setPanelEvent({
  225. panel: columnObj.panels[i]
  226. });
  227. }
  228. } else if(g.tempInitPanels)
  229. {
  230. var tempPanel = g.tempInitPanels.find(">div:eq(" + columnIndex + ")");
  231. if (tempPanel.length)
  232. {
  233. columnObj.panels = [];
  234. var panelOptions = {};
  235. var jelement = tempPanel.clone();
  236. if (liger.inject && liger.inject.getOptions)
  237. {
  238. panelOptions = liger.inject.getOptions({
  239. jelement: jelement,
  240. defaults: $.ligerDefaults.Panel,
  241. config: liger.inject.config.Panel
  242. });
  243. }
  244. columnObj.panels[0] = jelement.appendTo(jcolumn).ligerPanel(panelOptions);
  245. columnObj.panels[0].bind('closed', g._createPanelClosed());
  246. g.setPanelEvent({
  247. panel: columnObj.panels[0]
  248. });
  249. }
  250. }
  251. columnObj.jplace = $('<div class="l-column-place"></div>').appendTo(jcolumn);
  252. return columnObj;
  253. },
  254. setPanelEvent: function(e)
  255. {
  256. //panel:ligerui对象,jpanel:jQuery dom对象
  257. var panel = e.panel, jpanel = panel.panel;
  258. var g = this, p = this.options;
  259. //拖拽支持
  260. if ($.fn.ligerDrag && p.draggable)
  261. {
  262. jpanel.addClass("l-panel-draggable").ligerDrag({
  263. proxy: false, revert: true,
  264. handler: ".l-panel-header span:first",
  265. onRendered: function ()
  266. {
  267. },
  268. onStartDrag: function (current, e)
  269. {
  270. g.portal.find(">.l-row").addClass("l-row-dragging");
  271. this.jplace = $('<div class="l-panel-place"></div>');
  272. this.jplace.height(jpanel.height());
  273. jpanel.width(jpanel.width());
  274. jpanel.addClass("l-panel-dragging");
  275. jpanel.css("position", "absolute");
  276. jpanel.after(this.jplace);
  277. g._updatePortal();
  278. },
  279. onDrag: function (current, e)
  280. {
  281. var pageX = e.pageX || e.screenX, pageY = e.pageY || e.screenY;
  282. var height = jpanel.height(), width = jpanel.width(), offset = jpanel.offset();
  283. var centerX = offset.left + width / 2, centerY = offset.top + 10;
  284. var panels = g.getPanels(), emptyColumns = g.getEmptyColumns();
  285. var result = getPositionIn(panels, emptyColumns, centerX, centerY);
  286. if (result)
  287. {
  288. //判断是否跟上次匹配的位置一致
  289. if (this.placeStatus)
  290. {
  291. if (this.placeStatus.panel && result.panel)
  292. {
  293. if (this.placeStatus.panel.rowIndex == result.panel.rowIndex &&
  294. this.placeStatus.panel.columnIndex == result.panel.columnIndex &&
  295. this.placeStatus.panel.index == result.panel.index &&
  296. this.placeStatus.position == result.position)
  297. {
  298. return;
  299. }
  300. }
  301. if (this.placeStatus.column && result.column) //定位到空元素行
  302. {
  303. if (this.placeStatus.column.rowIndex == result.column.rowIndex && this.placeStatus.column.columnIndex == result.column.columnIndex && this.placeStatus.position == result.position)
  304. {
  305. return;
  306. }
  307. }
  308. }
  309. if (result.position == "top")
  310. {
  311. this.jplace.insertBefore(result.panel ? result.panel.jpanel : result.column.jplace);
  312. this.savedPosition = result.panel ? result.panel : result.column
  313. this.savedPosition.inTop = true;
  314. } else if (result.position == "bottom")
  315. {
  316. this.jplace.insertAfter(result.panel.jpanel);
  317. this.savedPosition = result.panel;
  318. this.savedPosition.inTop = false;
  319. }
  320. this.placeStatus = result;
  321. }
  322. else//没有匹配到
  323. {
  324. this.placeStatus = null;
  325. }
  326. //从指定的元素集合匹配位置
  327. function getPositionIn(panels, columns, x, y)
  328. {
  329. for (i = 0, l = panels.length; i < l; i++)
  330. {
  331. var o = panels[i];
  332. if (o.panel == panel) //如果是本身
  333. {
  334. continue;
  335. }
  336. var r = positionIn(o, null, x, y);
  337. if (r) return r;
  338. }
  339. for (i = 0, l = columns.length; i < l; i++)
  340. {
  341. var column = columns[i];
  342. var r = positionIn(null, column, x, y);
  343. if (r) return r;
  344. }
  345. return null;
  346. }
  347. //坐标在目标区域范围内 x,y为panel标题栏中间的位置
  348. function positionIn(panel, column, x, y)
  349. {
  350. var jelement = panel ? panel.jpanel : column.jplace;
  351. if (!jelement) return null;
  352. var height = jelement.height(), width = jelement.width();
  353. var left = jelement.offset().left, top = jelement.offset().top;
  354. var diff = 3;
  355. if (x > left - diff && x < left + width + diff)
  356. {
  357. if (y > top - diff && y < top + height / 2 + diff)
  358. {
  359. return {
  360. panel: panel,
  361. column: column,
  362. position: "top"
  363. };
  364. }
  365. if (y > top + height / 2 - diff && y < top + height + diff)
  366. {
  367. return {
  368. panel: panel,
  369. column: column,
  370. position: panel ? "bottom" : "top"
  371. };
  372. }
  373. }
  374. return null;
  375. }
  376. },
  377. onStopDrag: function (current, e)
  378. {
  379. g.portal.find(">.l-row").removeClass("l-row-dragging");
  380. panel.set('width', panel.get('width'));
  381. jpanel.removeClass("l-panel-dragging");
  382. //将jpanel替换到jplace的位置
  383. if (this.jplace)
  384. {
  385. jpanel.css({
  386. "position": "relative",
  387. "left": null,
  388. "top": null
  389. });
  390. jpanel.insertAfter(this.jplace);
  391. g.portal.find(">.l-row > .l-column >.l-panel-place").remove();
  392. if (this.savedPosition)
  393. {
  394. var panels = g.getPanels();
  395. var rowIndex, columnIndex, index;
  396. $(panels).each(function ()
  397. {
  398. if (this.panel == panel)
  399. {
  400. rowIndex = this.rowIndex;
  401. columnIndex = this.columnIndex;
  402. index = this.index;
  403. }
  404. });
  405. var oldPanelOptions = p.rows[rowIndex].columns[columnIndex].panels[index];
  406. var oldPanel = g.rows[rowIndex].columns[columnIndex].panels[index];
  407. p.rows[rowIndex].columns[columnIndex].panels.splice(index, 1);
  408. g.rows[rowIndex].columns[columnIndex].panels.splice(index, 1);
  409. if (this.savedPosition.panel)
  410. {
  411. p.rows[this.savedPosition.rowIndex].columns[this.savedPosition.columnIndex].panels.splice(this.savedPosition.index + this.savedPosition.inTop ? -1 : 0, 0, oldPanelOptions);
  412. g.rows[this.savedPosition.rowIndex].columns[this.savedPosition.columnIndex].panels.splice(this.savedPosition.index + this.savedPosition.inTop ? -1 : 0, 0, oldPanel);
  413. } else
  414. {
  415. p.rows[this.savedPosition.rowIndex].columns[this.savedPosition.columnIndex].panels = [oldPanelOptions];
  416. g.rows[this.savedPosition.rowIndex].columns[this.savedPosition.columnIndex].panels = [oldPanel];
  417. }
  418. }
  419. }
  420. g._updatePortal();
  421. return false;
  422. }
  423. });
  424. }
  425. },
  426. _updatePortal:function()
  427. {
  428. var g = this, p = this.options;
  429. $(g.rows).each(function (rowIndex)
  430. {
  431. $(this.columns).each(function (columnIndex)
  432. {
  433. if (this.panels && this.panels.length)
  434. {
  435. $(this.element).removeClass("l-column-empty");
  436. } else
  437. {
  438. $(this.element).addClass("l-column-empty");
  439. }
  440. });
  441. });
  442. },
  443. getPanels : function ()
  444. {
  445. var g = this, p = this.options;
  446. var panels = [];
  447. $(g.rows).each(function (rowIndex)
  448. {
  449. $(this.columns).each(function (columnIndex)
  450. {
  451. $(this.panels).each(function (index)
  452. {
  453. panels.push({
  454. rowIndex: rowIndex,
  455. columnIndex: columnIndex,
  456. index: index,
  457. panel : this,
  458. jpanel : this.panel
  459. });
  460. });
  461. });
  462. });
  463. return panels;
  464. },
  465. getPanel: function (e)
  466. {
  467. var g = this, p = this.options;
  468. e = $.extend({
  469. rowIndex: 0,
  470. columnIndex: 0,
  471. index : 0
  472. }, e);
  473. var panel = null;
  474. $(g.rows).each(function (rowIndex)
  475. {
  476. $(this.columns).each(function (columnIndex)
  477. {
  478. $(this.panels).each(function (index)
  479. {
  480. if (panel) return;
  481. if (rowIndex == e.rowIndex && columnIndex == e.columnIndex && index == e.index)
  482. {
  483. panel = this;
  484. }
  485. });
  486. });
  487. });
  488. return panel;
  489. },
  490. getEmptyColumns:function(){
  491. var g = this, p = this.options;
  492. var columns = [];
  493. $(g.rows).each(function (rowIndex)
  494. {
  495. $(this.columns).each(function (columnIndex)
  496. {
  497. if (!this.panels || !this.panels.length)
  498. {
  499. columns.push({
  500. rowIndex: rowIndex,
  501. columnIndex: columnIndex,
  502. jplace : this.jplace
  503. });
  504. }
  505. });
  506. });
  507. return columns;
  508. },
  509. _setUrl: function (url)
  510. {
  511. var g = this, p = this.options;
  512. if (!url) return;
  513. $.ajax({
  514. url: url, data: p.parms, type: p.method, dataType: 'json',
  515. success: function (rows)
  516. {
  517. g.set('rows', rows);
  518. }
  519. });
  520. },
  521. _setWidth: function (value)
  522. {
  523. value && this.portal.width(value);
  524. },
  525. collapseAll: function ()
  526. {
  527. var g = this, p = this.options;
  528. var panels = g.getPanels();
  529. $(panels).each(function (i,o)
  530. {
  531. var panel = o.panel;
  532. panel.collapse();
  533. });
  534. },
  535. expandAll: function ()
  536. {
  537. var g = this, p = this.options;
  538. var panels = g.getPanels();
  539. $(panels).each(function (i, o)
  540. {
  541. var panel = o.panel;
  542. panel.expand();
  543. });
  544. }
  545. });
  546. })(jQuery);