portal.js 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752
  1. if($ == undefined){
  2. $ = jQuery;
  3. }
  4. /*布局器*/
  5. var layout = {};
  6. layout.l1_json = {tr1:[{colspan:1, rowspan:1, width:100, height:100, id:1}]};
  7. layout.l2_json = {tr1:[{colspan:1, rowspan:1, width:50, height:100, id:1},{colspan:1, rowspan:1, width:50, height:100, id:2}]};
  8. layout.l3_json = {tr1:[{colspan:2, rowspan:1, width:100, height:50, id:1}],tr2:[{colspan:1, rowspan:1, width:50, height:50, id:2},{colspan:1, rowspan:1, width:50, height:50, id:3}]};
  9. layout.l4_json = {tr1:[{colspan:2, rowspan:1, width:100, height:33, id:1}],tr2:[{colspan:1, rowspan:1, width:50, height:33, id:2},{colspan:1, rowspan:1, width:50, height:33, id:3}], tr3:[{colspan:2, rowspan:1, width:100, height:33, id:4}]};
  10. layout.l5_json = {tr1:[{colspan:2, rowspan:1, width:100, height:20, id:1}],tr2:[{colspan:1, rowspan:1, width:50, height:20, id:2},{colspan:1, rowspan:1, width:50, height:20, id:3}], tr3:[{colspan:2, rowspan:1, width:100, height:20, id:4}],tr4:[{colspan:1, rowspan:1, width:50, height:20, id:5},{colspan:1, rowspan:1, width:50, height:20, id:6}],tr5:[{colspan:2, rowspan:1, width:100, height:20, id:7}]};
  11. function backpage(){
  12. if(curTmpInfo.isupdate == true){
  13. if(confirm("您已对页面进行了修改,是否保存再退出?")){
  14. var bk = function(){
  15. if(pageInfo.id && pageInfo.id != ''){
  16. if(curTmpInfo.is3g=="y"){
  17. location.href = "../m/PushManager.action";
  18. }else{
  19. location.href = 'show.action?pageId='+pageInfo.id;
  20. }
  21. }else{
  22. if(curTmpInfo.is3g=="y"){
  23. location.href = "../m/PushManager.action";
  24. }else{
  25. location.href = "PortalIndex.action";
  26. }
  27. }
  28. }
  29. savepage(bk);
  30. }else{
  31. if(pageInfo.id && pageInfo.id != ''){
  32. if(curTmpInfo.is3g=="y"){
  33. location.href = "../m/PushManager.action";
  34. }else{
  35. location.href = 'show.action?pageId='+pageInfo.id;
  36. }
  37. }else{
  38. if(curTmpInfo.is3g=="y"){
  39. location.href = "../m/PushManager.action";
  40. }else{
  41. location.href = "PortalIndex.action";
  42. }
  43. }
  44. }
  45. }else{
  46. if(pageInfo.id && pageInfo.id != ''){
  47. if(curTmpInfo.is3g=="y"){
  48. location.href = "../m/PushManager.action";
  49. }else{
  50. location.href = 'show.action?pageId='+pageInfo.id;
  51. }
  52. }else{
  53. if(curTmpInfo.is3g=="y"){
  54. location.href = "../m/PushManager.action";
  55. }else{
  56. location.href = "PortalIndex.action";
  57. }
  58. }
  59. }
  60. }
  61. function resetComppos(){
  62. //重新规划组件顺序
  63. for(var i=1; true; i++){
  64. var tr = pageInfo.body["tr"+i];
  65. if(!tr || tr == null){
  66. break;
  67. }
  68. for(var j=0; j<tr.length; j++){
  69. var td = tr[j];
  70. td.children = []; //先清除子
  71. var cld = $("#layout_" + td.id).children();
  72. if(cld && cld.size() > 0){
  73. var ls = cld;
  74. for(var k=0; ls&&k<ls.size(); k++){
  75. td.children.push(findCompById(ls[k].id.replace("c_", "")));
  76. }
  77. }
  78. }
  79. }
  80. }
  81. function savepage(cb){
  82. resetComppos();
  83. var pageId = pageInfo.id;
  84. if(pageId == undefined || pageId == null){
  85. pageId = "";
  86. }
  87. //处理3g报表, 包括分类
  88. if(curTmpInfo.is3g == 'y'){
  89. if(pageId == ''){ //未保存过,提示用户输入名称
  90. var ctx = "<div style=\"margin:5px 20px 5px 20px;\"><span style=\"display:inline-block;width:60px;\"> 名 称: </span><input type=\"text\" style=\"width:187px;\" id=\"pageName\"><div style=\"margin-top:5px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tr><td valign=\"top\"><span style=\"display:inline-block;width:60px;\"> 目 录:</span></td><td><ul id=\"reportcatalist\"></ul></td></tr></table></div></div>";
  91. $('#pdailog').dialog({
  92. title: '保存报表',
  93. width: 330,
  94. height: 260,
  95. closed: false,
  96. cache: false,
  97. modal: true,
  98. toolbar:null,
  99. content: ctx,
  100. buttons:[{
  101. text:'确定',
  102. iconCls:'icon-ok',
  103. handler:function(){
  104. var name = $("#pdailog #pageName").val();
  105. if(name == ''){
  106. msginfo("您还未录报表名称。");
  107. $("#pdailog #pageName").focus();
  108. return;
  109. }
  110. var cata = $("#reportcatalist").tree("getSelected");
  111. if(cata == null || cata.id == '0'){
  112. msginfo("您还未选择报表目录。");
  113. return;
  114. }
  115. $.post("save.action", {pageInfo:JSON.stringify(pageInfo), pageName:name, "cataId":cata.id, "is3g":"y"}, function(resp){
  116. pageInfo.id = resp.rows;
  117. msginfo("保存成功!","suc");
  118. //更新页面为未修改
  119. curTmpInfo.isupdate = false;
  120. if(cb){
  121. cb();
  122. }
  123. //更新页面为未修改
  124. curTmpInfo.isupdate = false;
  125. $('#pdailog').dialog('close');
  126. });
  127. }
  128. },{
  129. text:'取消',
  130. iconCls:"icon-cancel",
  131. handler:function(){
  132. $('#pdailog').dialog('close');
  133. }
  134. }]
  135. });
  136. //加载路径树
  137. $("#pdailog #reportcatalist").tree({
  138. url:'../m/typeTree.action',
  139. dnd:false,
  140. data: [{id:'0', text:'报表目录', state:'closed'}],
  141. onBeforeLoad: function(node){
  142. if(!node || node == null){
  143. return false;
  144. }
  145. }
  146. });
  147. $('#reportcatalist').tree("expand", $('#reportcatalist').tree("getRoot").target);
  148. }else{ //已经保存过,直接update
  149. $.post("save.action", {"pageInfo": JSON.stringify(pageInfo), "pageId":pageId}, function(resp){
  150. msginfo("保存成功!", "suc");
  151. //更新页面为未修改
  152. curTmpInfo.isupdate = false;
  153. if(cb){
  154. cb();
  155. }
  156. });
  157. }
  158. }else{
  159. //处理PC端报表, 不包括分类
  160. if(pageId == ''){ //未保存过,提示用户输入名称
  161. $.messager.prompt('报表保存', '请输入新的报表名称?', function(r){
  162. if (r){
  163. $.ajax({
  164. type:"POST",
  165. url: 'save.action',
  166. async: false,
  167. data:{pageInfo:JSON.stringify(pageInfo), pageName:r},
  168. success: function(resp){
  169. pageInfo.id = resp.rows;
  170. msginfo("保存成功!","suc");
  171. //更新页面为未修改
  172. curTmpInfo.isupdate = false;
  173. if(cb){
  174. cb();
  175. }
  176. }
  177. });
  178. }
  179. });
  180. }else{ //已经保存过,直接update
  181. $.post("save.action", {"pageInfo": JSON.stringify(pageInfo), "pageId":pageId}, function(resp){
  182. msginfo("保存成功!", "suc");
  183. //更新页面为未修改
  184. curTmpInfo.isupdate = false;
  185. if(cb){
  186. cb();
  187. }
  188. });
  189. }
  190. }
  191. }
  192. function regCompTree(){
  193. $('#comp_tree').tree({
  194. dnd:true,
  195. onBeforeDrag:function(target){
  196. return true;
  197. },
  198. onDragEnter:function(target, source){
  199. return false;
  200. },
  201. onStartDrag:function(node){
  202. resetWindows('min');
  203. },
  204. onStopDrag:function(node){
  205. $(".indicator").hide();
  206. resetWindows('max');
  207. }
  208. });
  209. }
  210. function helper(){
  211. var ctx = "<div class=\"window_ctx\">您可以通过拖拽的方式,定义自己的数据报表,报表支持图形、表格、文本、日历、地图等多种展现方式。<br/>"+
  212. "1.选择数据。<br/><img src=\"../resource/img/ybp1.gif\"><br/>"+
  213. "2.选择组件。<br/><img src=\"../resource/img/ybp2.gif\"><br/>"+
  214. "3.配置组件数据。<br/><img src=\"../resource/img/ybp3.gif\"><br/>"+
  215. "</div>";
  216. $('#pdailog').dialog({
  217. title: '帮助',
  218. width: 730,
  219. height: 440,
  220. closed: false,
  221. cache: false,
  222. modal: true,
  223. toolbar:null,
  224. onLoad:function(){},
  225. content:ctx,
  226. buttons:[{
  227. text:'关闭',
  228. icon:"icon-ok",
  229. handler:function(){
  230. $('#pdailog').dialog('close');
  231. }
  232. }]
  233. });
  234. }
  235. function printpage(){
  236. resetComppos();
  237. var json = JSON.stringify(pageInfo);
  238. var url2 = "about:blank";
  239. var name = "printwindow";
  240. window.open(url2, name);
  241. var ctx = "<form name='prtff' method='post' target='printwindow' action=\"print.action\" id='expff'><input type='hidden' name='pageInfo' id='ppageInfo'></form>";
  242. var o = $(ctx).appendTo("body");
  243. $("#ppageInfo").val(json);
  244. o.submit().remove();
  245. }
  246. //导出页面
  247. function exportPage(){
  248. var ctx = "<form name='expff' method='post' action=\"export.action\" id='expff'><input type='hidden' name='type' id='type'><input type='hidden' name='json' id='json'><input type='hidden' name='picinfo' id='picinfo'><div class='exportpanel'><span class='exptp select' tp='html'><img src='../resource/img/export-html.gif'><br>HTML</span>"+
  249. "<span class='exptp' tp='csv'><img src='../resource/img/export-csv.gif'><br>CSV</span>" +
  250. "<span class='exptp' tp='excel'><img src='../resource/img/export-excel.gif'><br>EXCEL</span>" +
  251. "<span class='exptp' tp='word'><img src='../resource/img/export-word.gif'><br>WORD</span>" +
  252. "<span class='exptp' tp='pdf'><img src='../resource/img/export-pdf.gif'><br>PDF</span></div></form>";
  253. $('#pdailog').dialog({
  254. title: '导出数据',
  255. width: 376,
  256. height: 200,
  257. closed: false,
  258. cache: false,
  259. modal: true,
  260. toolbar:null,
  261. content: ctx,
  262. buttons:[{
  263. text:'确定',
  264. iconCls:'icon-ok',
  265. handler:function(){
  266. resetComppos();
  267. var tp = curTmpInfo.expType;
  268. $("#expff #type").val(tp);
  269. //把图形转换成图片
  270. var strs = "";
  271. if(tp == "pdf" || tp == "excel" || tp == "word"){
  272. $("div.chartUStyle").each(function(index, element) {
  273. var id = $(this).attr("id");
  274. id = id.substring(1, id.length);
  275. var chart = echarts.getInstanceByDom(document.getElementById(id));
  276. var str = chart.getDataURL({type:'png', pixelRatio:1, backgroundColor: '#fff'});
  277. str = str.split(",")[1]; //去除base64标记
  278. str = $(this).attr("label") + "," + str+","+$("#"+id).width(); //加上label标记,宽度
  279. strs = strs + str;
  280. if(index != $("div.chartUStyle").size() - 1){
  281. strs = strs + "@";
  282. }
  283. });
  284. }
  285. $("#expff #picinfo").val(strs);
  286. $("#expff #json").val(JSON.stringify(pageInfo));
  287. $("#expff").submit();
  288. $('#pdailog').dialog('close');
  289. }
  290. },{
  291. text:'取消',
  292. iconCls:"icon-cancel",
  293. handler:function(){
  294. $('#pdailog').dialog('close');
  295. }
  296. }]
  297. });
  298. curTmpInfo.expType = "html";
  299. //注册事件
  300. $(".exportpanel span.exptp").click(function(e) {
  301. $(".exportpanel span.exptp").removeClass("select");
  302. $(this).addClass("select");
  303. curTmpInfo.expType = $(this).attr("tp");
  304. });
  305. }
  306. function selectdataset(){
  307. $('#pdailog').dialog({
  308. title: '选择数据模型(立方体)',
  309. width: 520,
  310. height: 320,
  311. closed: false,
  312. cache: false,
  313. modal: true,
  314. toolbar:null,
  315. content:"<table id=\"subjectlist\" title=\"\" ><thead><tr><th data-options=\"field:'ck',checkbox:true\"><th data-options=\"field:'cubeName',width:160\">名称</th><th data-options=\"field:'desc',width:200\">说明</th><th data-options=\"field:'dsetName',width:100\">数据集</th></tr></thead></table>",
  316. buttons:[{
  317. text:'确定',
  318. iconCls:'icon-ok',
  319. handler:function(){
  320. var row = $("#subjectlist").datagrid("getChecked");
  321. if(row == null || row.length == 0){
  322. msginfo("请勾选数据。");
  323. return;
  324. }
  325. pageInfo.selectDs = row[0].cubeId;
  326. $('#pdailog').dialog('close');
  327. //更新页面为已修改
  328. curTmpInfo.isupdate = true;
  329. //更新数据集
  330. reloadDatasetTree();
  331. $("#comp_tab").tabs("select", 1);
  332. }
  333. },{
  334. text:'取消',
  335. iconCls:"icon-cancel",
  336. handler:function(){
  337. $('#pdailog').dialog('close');
  338. }
  339. }]
  340. });
  341. $("#subjectlist").datagrid({
  342. singleSelect:true,
  343. collapsible:false,
  344. pagination:true,
  345. fit:true,
  346. pageSize:20,
  347. border:true,
  348. url:'/rsbi-os-4.7/model/pageCube.action',
  349. method:'post',
  350. queryParams:{t: Math.random()}
  351. });
  352. }
  353. function reloadDatasetTree(){
  354. if(pageInfo.selectDs){
  355. $('#datasettree').tree({
  356. url:'/rsbi-os-4.7/model/treeCube.action?cubeId=' + (pageInfo.selectDs?pageInfo.selectDs:""),
  357. dnd:true,
  358. lines:true,
  359. onBeforeDrag:function(target){
  360. if(!target.attributes || target.attributes.tp == 'root'){
  361. return false;
  362. }
  363. return true;
  364. },
  365. onDragEnter:function(target, source){
  366. return false;
  367. },
  368. onContextMenu:function(e, node){
  369. e.preventDefault();
  370. }
  371. });
  372. }else{
  373. $('#datasettree').tree({
  374. data:[{"id":"err","text":"还未选择立方体!", "iconCls":"icon-no"}]
  375. });
  376. }
  377. }
  378. function resetWindows(tp){
  379. for(var i=0; curTmpInfo.comps&&i<curTmpInfo.comps.length; i++){
  380. var compId = curTmpInfo.comps[i].id;
  381. if(tp == "min"){
  382. $("#c_"+compId + " div.cctx").hide();
  383. }else{
  384. $("#c_"+compId + " div.cctx").show();
  385. }
  386. }
  387. }
  388. function setlayout(){
  389. var ctx = "<div class=\"textpanel\"><br/>";
  390. for(var i=1; i<=6; i++){
  391. ctx = ctx + "<span class=\"rlayout\"><div class=\"onelayout\" tp=\""+i+"\"><label for=\"lay"+i+"\"><img src=\"../resource/img/layout/l"+i+".png\"></lable><br/><input id=\"lay"+i+"\" type=\"radio\" name=\"sellayout\" value=\""+i+"\" "+(i == pageInfo.layout ? "checked" : "")+" ></div></span>";
  392. }
  393. ctx = ctx + "</div>";
  394. $('#pdailog').dialog({
  395. title: '设置报表布局',
  396. width: 430,
  397. height: 340,
  398. closed: false,
  399. cache: false,
  400. modal: true,
  401. toolbar:null,
  402. onLoad:function(){},
  403. content:ctx,
  404. buttons:[{
  405. text:'确定',
  406. iconCls:"icon-ok",
  407. handler:function(){
  408. var comps = curTmpInfo.comps;
  409. var s = $("input[name=\"sellayout\"]:checked").val();
  410. pageInfo.layout = Number(s);
  411. //更新布局区域
  412. var json = null;
  413. if(s == 1){
  414. json = layout.l1_json;
  415. }else if(s == 2){
  416. json = layout.l2_json;
  417. }else if(s == 3){
  418. json = layout.l3_json;
  419. }else if(s == 4){
  420. json = layout.l4_json;
  421. }else if(s == 5){
  422. json = layout.l5_json;
  423. }else if(s == 6){
  424. $('#pdailog').dialog('close');
  425. autoLayout();
  426. return;
  427. }
  428. pageInfo.body = json = eval("("+JSON.stringify(json)+")"); //复制一份
  429. //把组件都放入布局1
  430. var ids = [];
  431. for(i=0; comps&&i<comps.length; i++){
  432. ids.push(comps[i]);
  433. }
  434. json.tr1[0].children = ids;
  435. crtLayoutHTML(json, true);
  436. curTmpInfo.isupdate = true;
  437. $('#pdailog').dialog('close');
  438. }
  439. },{
  440. text:'取消',
  441. iconCls:"icon-cancel",
  442. handler:function(){
  443. $('#pdailog').dialog('close');
  444. }
  445. }]
  446. });
  447. $("span.rlayout div.onelayout").click(function(){
  448. var tp = $(this).attr("tp");
  449. var s = $("input[name=\"sellayout\"][value=\""+tp+"\"]");
  450. s.attr("checked","checked");
  451. });
  452. }
  453. /**
  454. 自定义布局
  455. **/
  456. /**
  457. 自定义布局
  458. **/
  459. function autoLayout(){
  460. var json2table = function(json){
  461. var ret = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"r_layout\" id=\"autoLayoutTable\">";
  462. for(var i=1; true; i++){
  463. var tr = json["tr"+i];
  464. if(!tr || tr == null){
  465. break;
  466. }
  467. ret = ret + "<tr>";
  468. for(var j=0; j<tr.length; j++){
  469. var td = tr[j];
  470. ret = ret + "<td class=\"laytd\" height=\""+td.height+"%\" width=\""+td.width+"%\" colspan=\""+td.colspan+"\" rowspan=\""+td.rowspan+"\" \">";
  471. ret = ret + "&nbsp; </td>";
  472. }
  473. ret = ret + "</tr>";
  474. }
  475. ret = ret + "</table>";
  476. return ret;
  477. }
  478. var layoutJson = pageInfo.body;
  479. var ctx = json2table(layoutJson);
  480. $('#pdailog').dialog({
  481. title: '自定义布局',
  482. width: 540,
  483. height: 350,
  484. closed: false,
  485. cache: false,
  486. modal: true,
  487. toolbar:[{
  488. text:"插入行",
  489. handler:function(e){
  490. var o = $("#autoLayoutTable td.tdselect");
  491. if(o.size() == 0){
  492. msginfo("请先选择单元格。");
  493. return;
  494. }
  495. curTmpInfo.curtabtd = o[0];
  496. lyt_insertRow();
  497. curTmpInfo.curtabtd = null;
  498. }
  499. },{
  500. text:"插入列",
  501. handler:function(e){
  502. var o = $("#autoLayoutTable td.tdselect");
  503. if(o.size() == 0){
  504. msginfo("请先选择单元格。");
  505. return;
  506. }
  507. curTmpInfo.curtabtd = o[0];
  508. lyt_insertCol();
  509. curTmpInfo.curtabtd = null;
  510. }
  511. },{
  512. text:"删除行",
  513. handler:function(e){
  514. var o = $("#autoLayoutTable td.tdselect");
  515. if(o.size() == 0){
  516. msginfo("请先选择单元格。");
  517. return;
  518. }
  519. curTmpInfo.curtabtd = o[0];
  520. lyt_deleteRow();
  521. curTmpInfo.curtabtd = null;
  522. }
  523. },{
  524. text:"删除列",
  525. handler:function(e){
  526. var o = $("#autoLayoutTable td.tdselect");
  527. if(o.size() == 0){
  528. msginfo("请先选择单元格。");
  529. return;
  530. }
  531. curTmpInfo.curtabtd = o[0];
  532. lyt_deleteCol();
  533. curTmpInfo.curtabtd = null;
  534. }
  535. },{
  536. text:"合并",
  537. handler:function(e){
  538. var o = $("#autoLayoutTable td.tdselect");
  539. if(o.size() == 0){
  540. msginfo("请先选择单元格。");
  541. return;
  542. }
  543. lyt_mergeCell();
  544. }
  545. },{
  546. text:"取消合并",
  547. handler:function(e){
  548. var o = $("#autoLayoutTable td.tdselect");
  549. if(o.size() == 0){
  550. msginfo("请先选择单元格。");
  551. return;
  552. }
  553. curTmpInfo.curtabtd = o[0];
  554. lyt_unmergeCell();
  555. curTmpInfo.curtabtd = null;
  556. }
  557. }],
  558. onLoad:function(){},
  559. content:ctx,
  560. buttons:[{
  561. text:'确定',
  562. iconCls:"icon-ok",
  563. handler:function(){
  564. var ljson = {};
  565. var rows = document.getElementById("autoLayoutTable").rows;
  566. var pidx = 0;
  567. for(var i=0;i<rows.length;i++){
  568. var cells = rows[i].cells;
  569. var tds = [];
  570. ljson["tr"+(i+1)] = tds;
  571. for(var j=0;j<cells.length;j++){
  572. var cell = $(cells[j]);
  573. var obj = {};
  574. obj.colspan = cell.attr("colspan")?cell.attr("colspan"):"1";
  575. obj.rowspan = (cell.attr("rowspan")?cell.attr("rowspan"):"1");
  576. obj.height = Number(cell.attr("height").replace("%", ''));
  577. obj.width = Number(cell.attr("width").replace("%", ''));
  578. obj.id = pidx;
  579. pidx=pidx+1;
  580. tds.push(obj);
  581. }
  582. }
  583. pageInfo.body = json = ljson;
  584. //把组件都放入第一个td中
  585. for(var i=0; curTmpInfo.comps && i<curTmpInfo.comps.length; i++){
  586. if(!json.tr1[0].children){
  587. json.tr1[0].children = [];
  588. }
  589. json.tr1[0].children.push(curTmpInfo.comps[i]);
  590. }
  591. initlayout(false);
  592. //initCompDropEvent();
  593. curTmpInfo.isupdate = true;
  594. $('#pdailog').dialog('close');
  595. }
  596. },{
  597. text:'取消',
  598. iconCls:"icon-cancel",
  599. handler:function(){
  600. $('#pdailog').dialog('close');
  601. }
  602. }]
  603. });
  604. updateHeightWidth();
  605. var selFunc = function(ts){
  606. $("#autoLayoutTable td").removeClass("tdselect");
  607. $(ts).addClass("tdselect");
  608. }
  609. var areaSelFunc = function(start, end){
  610. $("#autoLayoutTable td").removeClass("tdselect");
  611. var p1 = $(start).attr("pos").split(",");
  612. var p2 = $(end).attr("pos").split(",");
  613. //反向选择的时候,交换位置
  614. if(p1[0] > p2[0] || p1[1] > p2[1]){
  615. tmp = p1;
  616. p1 = p2;
  617. p2 = tmp;
  618. }
  619. for(i=p1[0]; i<=p2[0]; i++){
  620. for(j = p1[1]; j<=p2[1]; j++){
  621. $("#autoLayoutTable td[pos='"+(i+","+j)+"']").addClass("tdselect");
  622. }
  623. }
  624. }
  625. //注册布局器编辑事件
  626. var issel = false;
  627. var start = null;
  628. $("#autoLayoutTable").on("click", 'td.laytd', function(){
  629. selFunc(this);
  630. }).on("mousedown", "td.laytd", function(e){
  631. issel = true;
  632. start = this;
  633. }).on("mouseup","td.laytd", function(e){
  634. issel = false;
  635. }).on("mousemove","td.laytd", function(e){
  636. if(issel){
  637. areaSelFunc(start, this);
  638. }
  639. }).on("contextmenu","td.laytd", function(e){
  640. e.preventDefault();
  641. e.stopPropagation();
  642. curTmpInfo.curtabtd = this;
  643. //选中单元格
  644. if($("#autoLayoutTable td.tdselect").size() <= 1){
  645. selFunc(this);
  646. }
  647. //设置菜单disable
  648. if($(this).attr("colspan") > 1 || $(this).attr("rowspan") > 1){
  649. $("#autolayoutmenu").menu("enableItem", $("#lyt_unmergeCell"));
  650. }else{
  651. $("#autolayoutmenu").menu("disableItem", $("#lyt_unmergeCell"));
  652. }
  653. $('#autolayoutmenu').menu('show', {
  654. left: e.pageX,
  655. top: e.pageY
  656. });
  657. });
  658. }
  659. function lyt_mergeCell(){
  660. var p1 = null;
  661. var p2 = null;
  662. var size = $("#autoLayoutTable td.tdselect").size();
  663. if(size <= 1){
  664. return;
  665. }
  666. var endTd = null;
  667. $("#autoLayoutTable td.tdselect").each(function(index, element) {
  668. if(index == 0){
  669. p1 = $(this).attr("pos").split(",");
  670. }
  671. if(index == size - 1){
  672. p2 = $(this).attr("pos").split(",");
  673. endTd = $(this);
  674. }
  675. if(index > 0){
  676. $(this).remove();
  677. }
  678. });
  679. //结束单元格的colspan, rowspan 影响宽度,高度
  680. var colspan = endTd.attr("colspan")?Number(endTd.attr("colspan")):1;
  681. var rowspan = endTd.attr("rowspan")?Number(endTd.attr("rowspan")):1;
  682. $("#autoLayoutTable td.tdselect").attr("rowspan", Math.abs(p1[0] - p2[0] + (rowspan - 1)) + 1).attr("colspan", Math.abs(p1[1] - p2[1] +(colspan - 1) ) + 1);
  683. updateHeightWidth(true);
  684. }
  685. function lyt_unmergeCell(){
  686. var td = $(curTmpInfo.curtabtd);
  687. var colspan = td.attr("colspan") ? Number(td.attr("colspan")) : 1;
  688. var rowspan = td.attr("rowspan") ? Number(td.attr("rowspan")) : 1;
  689. td.attr("colspan", 1);
  690. td.attr("rowspan", 1);
  691. for(i=1; i<=rowspan; i++){
  692. var str = "";
  693. for(j=1; j<(i == 1 ? colspan : colspan + 1); j++){
  694. str = str + "<td class=\"laytd\"></td>";
  695. }
  696. if(i == 1){
  697. td.after(str); //第一行,直接追加
  698. }else{
  699. var zuobiao = td.attr("pos").split(",");
  700. var node = $("#autoLayoutTable td[pos='"+((Number(zuobiao[0])+i-1) +","+ (Number(zuobiao[1]) - 1))+"']") //求当前td的下一个的前一个
  701. if(node.size() == 0){ //如果查找的TD不存在
  702. //开始查询后一个
  703. node = $("#autoLayoutTable td[pos='"+((Number(zuobiao[0])+i-1) +","+ (Number(zuobiao[1]) + colspan))+"']") //求当前td的下一个的后一个
  704. if(node.size() > 0){
  705. node.before(str);
  706. }else{
  707. //还是未找到,直接追加
  708. var tr = td.parent(); //查找当前TR
  709. for(k=1; k<=i-1; k++){
  710. tr = tr.next();
  711. }
  712. tr.append(str);
  713. }
  714. }else{
  715. node.after(str);
  716. }
  717. }
  718. }
  719. updateHeightWidth();
  720. }
  721. function lyt_insertRow(){
  722. var td = curTmpInfo.curtabtd;
  723. //定义判断新增加的单元格是否属于一个合并单元格的内容。
  724. var tdInCells = function(rowIndex, colIndex){
  725. var returnTd = null;
  726. $("#autoLayoutTable td").each(function(index, element) {
  727. var pos = $(element).attr("pos").split(",");
  728. var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
  729. var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
  730. if(rowspan > 1){
  731. if(rowIndex > Number(pos[0]) && rowIndex <= Number(pos[0])+ rowspan &&
  732. colIndex >= Number(pos[1]) && colIndex < Number(pos[1]) + colspan ){ //当前需要新添加的td 属于表格的一个单元格
  733. returnTd = $(element);
  734. }
  735. }
  736. });
  737. return returnTd;
  738. };
  739. var colCount = 0;
  740. var cells = document.getElementById("autoLayoutTable").rows[0].cells;
  741. for(i=0; i<cells.length; i++){
  742. var colspan = $(cells[i]).attr("colspan") ? Number($(cells[i]).attr("colspan")) : 1;
  743. colCount = colCount + colspan;
  744. }
  745. var pos = $(td).attr("pos").split(",");
  746. var row = Number(pos[0]) + 1;
  747. var rowspan = $(td).attr("rowspan")?Number($(td).attr("rowspan")):1;
  748. row = row + rowspan - 1; //如果rowspan>1 计算新的行(row)
  749. var str = "<tr>";
  750. for(i=0; i<colCount; i++){
  751. var curTd = $("#autoLayoutTable td[pos='"+row+","+i+"']");
  752. if(curTd.size() == 0){ //如果需要添加的td不存在,并且属于一个合并单元格的内容,为当前合并单元格增加1个rowspan
  753. var retTd = tdInCells(row, i);
  754. if(retTd != null){
  755. var r = Number(retTd.attr("rowspan")) + 1;
  756. retTd.attr("rowspan", r);
  757. //如果retTd的colspan > 1, 为i 追加 rowspan - 1, 不然rowspan 会被加多次
  758. var c = Number(retTd.attr("colspan"));
  759. if(c > 1){
  760. i = i + c - 1;
  761. }
  762. continue;
  763. }
  764. }
  765. str = str + "<td class=\"laytd\">";
  766. str = str + "</td>";
  767. }
  768. str = str + "</tr>";
  769. var obj = $(td).parent(); //rowspan 影响插入的位置
  770. for(i=1; i<rowspan; i++){
  771. obj = obj.next();
  772. }
  773. obj.after(str);
  774. updateHeightWidth();
  775. }
  776. function lyt_insertCol(){
  777. var td = curTmpInfo.curtabtd;
  778. //定义判断新增加的单元格是否属于一个合并单元格的内容。
  779. var tdInCells = function(rowIndex, colIndex){
  780. var returnTd = null;
  781. $("#autoLayoutTable td").each(function(index, element) {
  782. var pos = $(element).attr("pos").split(",");
  783. var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
  784. var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
  785. if(colspan > 1){
  786. if(rowIndex >= Number(pos[0]) && rowIndex < Number(pos[0])+ rowspan &&
  787. colIndex > Number(pos[1]) && colIndex <= Number(pos[1]) + colspan ){ //当前需要新添加的td 属于表格的一个单元格
  788. returnTd = $(element);
  789. }
  790. }
  791. });
  792. return returnTd;
  793. };
  794. var rows = document.getElementById("autoLayoutTable").rows;
  795. //获取当前TD的index
  796. var pos = $(td).attr("pos").split(",");
  797. var idx = Number(pos[1]);
  798. var colspan = $(td).attr("colspan") ? Number($(td).attr("colspan")) : 1;
  799. if(colspan > 1){
  800. idx = idx + colspan - 1; //当前td的colspan影响插入列的位置
  801. }
  802. var insertArray = [];
  803. for(i=0; i<rows.length; i++){
  804. var ctd = null;
  805. var curTd = $("#autoLayoutTable td[pos='"+i+","+(idx)+"']");
  806. if(curTd.size() == 0){ //如果当前td不存在,并且属于一个合并单元格的内容,为当前合并单元格增加1个colspan
  807. var retTd = tdInCells(i, idx);
  808. if(retTd != null){
  809. var r = Number(retTd.attr("colspan")) + 1;
  810. retTd.attr("colspan", r);
  811. var c = Number(retTd.attr("rowspan"));
  812. if(c > 1){
  813. i = i + c - 1;
  814. }
  815. continue;
  816. }
  817. }else{
  818. //如果当前td存在,并且colspan > 1, 为当前td 添加一个colspan
  819. var r = curTd.attr("colspan") ? Number(curTd.attr("colspan")) : 1;
  820. var c = Number(curTd.attr("rowspan")); //rowspan 影响数据行
  821. if(c > 1){
  822. i = i + c - 1;
  823. }
  824. if(r > 1){
  825. curTd.attr("colspan", r + 1);
  826. continue;
  827. }
  828. ctd = curTd;
  829. }
  830. var rspan = ctd.attr("rowspan") ? Number(ctd.attr("rowspan")) : 1;
  831. var cspan = ctd.attr("colspan") ? Number(ctd.attr("colspan")) : 1;
  832. //当前插入的TD跨行和列,需要设置新的 colspan, rowspan
  833. var str = "<td class=\"laytd\" rowspan=\""+rspan+"\" colspan=\""+cspan+"\"></td>";
  834. //ctd.after(str);
  835. insertArray.push({"obj":ctd, "str" : str});
  836. }
  837. for(i=0; i<insertArray.length; i++){
  838. insertArray[i].obj.after(insertArray[i].str);
  839. }
  840. updateHeightWidth();
  841. }
  842. function lyt_deleteCol(){
  843. var td = $(curTmpInfo.curtabtd);
  844. var rows = document.getElementById("autoLayoutTable").rows;
  845. //定义判断需要删除的单元格是否属于一个合并单元格的内容。
  846. var tdInCells = function(rowIndex, colIndex){
  847. var returnTd = null;
  848. $("#autoLayoutTable td").each(function(index, element) {
  849. var pos = $(element).attr("pos").split(",");
  850. var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
  851. var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
  852. if(colspan > 1){
  853. if(rowIndex >= Number(pos[0]) && rowIndex < Number(pos[0])+ rowspan &&
  854. colIndex > Number(pos[1]) && colIndex <= Number(pos[1]) + colspan ){ //当前需要新添加的td 属于表格的一个单元格
  855. returnTd = $(element);
  856. }
  857. }
  858. });
  859. return returnTd;
  860. };
  861. //获取当前TD的index
  862. var pidx = Number(td.attr("pos").split(",")[1]);
  863. var removes = [];
  864. //对于colspan > 1 的单元格删除,需要删除多列
  865. var tdcspan = td.attr("colspan") ? Number(td.attr("colspan")) : 1;
  866. for(k=0; k<tdcspan; k++){
  867. var idx = pidx + k;
  868. for(i=0; i<rows.length; i++){
  869. var curTd = $("#autoLayoutTable td[pos='"+i+","+(idx)+"']");
  870. if(curTd.attr("pos") == td.attr("pos")){ //需要移除的td刚好是当前选择的TD,不用判断直接移除
  871. removes.push(curTd);
  872. var c = Number(curTd.attr("rowspan")); //rowspan影响列
  873. if(c > 1){
  874. i = i + c - 1;
  875. }
  876. continue;
  877. }
  878. if(curTd.size() == 0){ //如果当前td不存在,并且属于一个合并单元格的内容,为当前合并单元格减少1个colspan
  879. var retTd = tdInCells(i, idx);
  880. if(retTd != null){
  881. var r = Number(retTd.attr("colspan")) - 1;
  882. retTd.attr("colspan", r);
  883. var c = Number(retTd.attr("rowspan"));
  884. if(c > 1){
  885. i = i + c - 1;
  886. }
  887. continue;
  888. }
  889. }else{
  890. //如果当前td存在,并且colspan > 1, 为当前td 减少一个colspan
  891. var r = curTd.attr("colspan") ? Number(curTd.attr("colspan")) : 1;
  892. //有rowspan > 1, 影响多行
  893. var c = curTd.attr("rowspan") ? Number(curTd.attr("rowspan")) : 1;
  894. if(c > 1){
  895. i = i + c - 1;
  896. }
  897. if(r > 1){
  898. curTd.attr("colspan", r - 1);
  899. continue;
  900. }
  901. }
  902. removes.push(curTd);;
  903. }
  904. }
  905. for(i=0; i<removes.length; i++){
  906. $(removes[i]).remove();
  907. }
  908. updateHeightWidth();
  909. }
  910. function lyt_deleteRow(){
  911. var td = $(curTmpInfo.curtabtd);
  912. var colCount = 0;
  913. var cells = document.getElementById("autoLayoutTable").rows[0].cells;
  914. for(i=0; i<cells.length; i++){
  915. var colspan = $(cells[i]).attr("colspan") ? Number($(cells[i]).attr("colspan")) : 1;
  916. colCount = colCount + colspan;
  917. }
  918. //定义判断需要删除的单元格是否属于一个合并单元格的内容。
  919. var tdInCells = function(rowIndex, colIndex){
  920. var returnTd = null;
  921. $("#autoLayoutTable td").each(function(index, element) {
  922. var pos = $(element).attr("pos").split(",");
  923. var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
  924. var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
  925. if(rowspan > 1){
  926. if(rowIndex > Number(pos[0]) && rowIndex <= Number(pos[0] + rowspan) &&
  927. colIndex >= Number(pos[1]) && colIndex < Number(pos[1]) + colspan ){ //当前需要新添加的td 属于表格的一个单元格
  928. returnTd = $(element);
  929. }
  930. }
  931. });
  932. return returnTd;
  933. };
  934. var deltrs = [];
  935. var pos = $(td).attr("pos").split(",");
  936. var nrow = Number(pos[0]);
  937. var delrowspan = td.attr("rowspan") ? Number(td.attr("rowspan")) : 1; //rowspan 影响删除的行数
  938. for(n=0; n<delrowspan; n++){
  939. for(i=0; i<colCount; i++){
  940. var row = nrow + n;
  941. var curTd = $("#autoLayoutTable td[pos='"+row+","+i+"']");
  942. if(curTd.size() == 0){
  943. //需要删除的单元格不存在,并且属于一个合并单元格中,需要把合并单元格的rowspan - 1
  944. var retTd = tdInCells(row, i);
  945. if(retTd != null){
  946. var r = Number(retTd.attr("rowspan")) - 1;
  947. retTd.attr("rowspan", r);
  948. //如果retTd的colspan > 1, 为i 追加 rowspan - 1, 不然rowspan 会被加多次
  949. var c = Number(retTd.attr("colspan"));
  950. if(c > 1){
  951. i = i + c - 1;
  952. }
  953. }
  954. }else{
  955. //需要删除的单元格存在,并且占用多行(row), 减少rowspan, 并且把td放入下一行
  956. if(Number(curTd.attr("rowspan")) > 1){
  957. curTd.attr("rowspan", Number(curTd.attr("rowspan")) - 1);
  958. var isdeal = false;
  959. var l = i -1;
  960. while(l>=0){ //向前查找是否有对象
  961. var target = $("#T"+compId+" td[pos='"+(row+1)+","+(l)+"']");
  962. if(target.size() > 0){
  963. target.after(curTd);
  964. isdeal = true;
  965. break;
  966. }
  967. l = l - 1;
  968. }
  969. if(isdeal == false){
  970. l = i + 1;
  971. while(l < colCount){ //向后查找是否有对象
  972. var target = $("autoLayoutTable td[pos='"+(row+1)+","+(l)+"']");
  973. if(target.size() > 0){
  974. target.before(curTd);
  975. isdeal = true;
  976. break;
  977. }
  978. l = l + 1;
  979. }
  980. }
  981. }
  982. var c = Number(curTd.attr("colspan")); //如果colspan > 1, 夸多列处理
  983. if(c > 1){
  984. i = i + c - 1;
  985. }
  986. }
  987. }
  988. deltrs.push($("#autoLayoutTable tr").get(row));
  989. }
  990. for(i=0; i<deltrs.length; i++){
  991. $(deltrs[i]).remove();
  992. }
  993. updateHeightWidth();
  994. }
  995. function updateHeightWidth(noSetPos){
  996. //获取第一行
  997. var cells = document.getElementById("autoLayoutTable").rows[0].cells;
  998. var cols = 0; //获取宽度
  999. for(i=0; i<cells.length; i++){
  1000. cols = cols + Number(($(cells[i]).attr("colspan")?$(cells[i]).attr("colspan"):1));
  1001. }
  1002. var effectRow = {}; // 在rowspan 的单元格中需要影响后面行的宽度,定义 行数+逗号+列+after/before后的影响行数MAP对象. 比如 {"1,1after":2}, after/befroe表示插入的前还是后
  1003. var rows = document.getElementById("autoLayoutTable").rows;
  1004. var rowLength = rows.length; //行数
  1005. for(j=0; j<rowLength; j++){
  1006. cells = rows[j].cells;
  1007. var wposIndex = 0; // 行pos位置
  1008. for(i=0; i<cells.length; i++){
  1009. var colspan = $(cells[i]).attr("colspan")?Number($(cells[i]).attr("colspan")):1;
  1010. var rowspan = $(cells[i]).attr("rowspan")?Number($(cells[i]).attr("rowspan")):1;
  1011. var wd = ((100/cols) * colspan);
  1012. var hd = ((100/rowLength) * rowspan);
  1013. $(cells[i]).attr({"width" : Math.round(wd) + "%", "height":Math.round(hd)+"%"}); //定义单元格宽度,高度
  1014. if(noSetPos && noSetPos==true){
  1015. continue;
  1016. }
  1017. if(rowspan > 1){ //会影响后面行的pos
  1018. for(k=1; k<rowspan; k++){
  1019. //判断启用before 还是 after, before 表示影响的行前面没有单元格(td)
  1020. var st = "before";
  1021. //i == 0) //第0列肯定是before
  1022. for(m=0;m<i;m++){
  1023. var rs = ($(cells[m]).attr("rowspan")?Number($(cells[m]).attr("rowspan")):1) - 1;
  1024. if(rs < k){ //如果当前单元格的跨度 < 影响的行, 说明影响的行的单元格前面存在单元格,
  1025. st = "after";
  1026. break;
  1027. }
  1028. }
  1029. effectRow[(j+k)+","+(st=="before"?wposIndex:wposIndex-1)+st] = colspan; //占位影响的行, 需要考虑before/after
  1030. }
  1031. }
  1032. //如果是第一行,先判断是否需要追加 占位位置, 需考虑连续追加
  1033. for(l=wposIndex-1; i==0&&l<cols; l++){
  1034. if(effectRow[j+","+(wposIndex)+"before"]){
  1035. wposIndex = wposIndex + effectRow[j+","+(wposIndex)+"before"];
  1036. }else{
  1037. break;
  1038. }
  1039. }
  1040. $(cells[i]).attr({"pos":j+","+wposIndex});
  1041. wposIndex = wposIndex + 1;
  1042. if(colspan > 1){ //会影响本行后面的pos
  1043. wposIndex = wposIndex + (colspan - 1);
  1044. }
  1045. //wposIndex追加 占位 位置, 需考虑连续追加
  1046. for(l=wposIndex-1; l<cols; l++){ //考虑连续追加,两个竖向合并单元格
  1047. if(effectRow[j+","+(l) + "after"]){
  1048. wposIndex = wposIndex + effectRow[j+","+(l) + "after"];
  1049. }else{
  1050. break;
  1051. }
  1052. }
  1053. }
  1054. }
  1055. }
  1056. //portal首页的布局显示函数
  1057. function initPortalLayout(){
  1058. var json = pageInfo.body;
  1059. var cps = [];
  1060. var ret = "<table border=\"0\" style=\"width:1020px;\" cellspacing=\"0\" cellpadding=\"0\" class=\"r_layout\" id=\"layout_table\">";
  1061. for(var i=1; true; i++){
  1062. var tr = json["tr"+i];
  1063. if(!tr || tr == null){
  1064. break;
  1065. }
  1066. ret = ret + "<tr>";
  1067. for(var j=0; j<tr.length; j++){
  1068. var td = tr[j];
  1069. ret = ret + "<td class=\"laytd2\" height=\""+td.height+"%\" width=\""+td.width+"%\" colspan=\""+td.colspan+"\" rowspan=\""+td.rowspan+"\" >";
  1070. if(td.children){
  1071. for(var k=0; k<td.children.length; k++){
  1072. var comp = findTCompById(td.children[k]);
  1073. var str = compStr(comp, false);
  1074. ret = ret + str;
  1075. cps.push(comp);
  1076. }
  1077. }
  1078. ret = ret + "</td>";
  1079. }
  1080. ret = ret + "</tr>";
  1081. }
  1082. ret = ret + "</table>";
  1083. $("#optarea").html(ret);
  1084. for(var i=0; i<cps.length; i++){
  1085. var comp = cps[i];
  1086. var url = '../' + comp.url;
  1087. var param = comp.dayParam && comp.dayParam != '' ? "({" + comp.dayParam + ":'" + curDt + "'})" : "({})";
  1088. $("#c_"+comp.id + " div.cctx").html("<div style='padding:5px;'>加载中...</div>").load(url, eval(param), function(){
  1089. });
  1090. }
  1091. }
  1092. function initlayout(){
  1093. var id = pageInfo.layout;
  1094. var json = pageInfo.body;
  1095. crtLayoutHTML(json, true);
  1096. //注册window resize 事件, 改变图形大小
  1097. $(window).on("resizeend", function(e){
  1098. resetCharts();
  1099. });
  1100. //注册布局切换事件,改变图形大小
  1101. $("#Jlayout").layout({
  1102. onAdd:function(c){
  1103. if(c == "east"){
  1104. window.setTimeout(function(){resetCharts();}, 200);
  1105. resetCharts();
  1106. }
  1107. },
  1108. onRemove:function(c){
  1109. if(c == "east"){
  1110. window.setTimeout(function(){resetCharts();}, 200);
  1111. }
  1112. }
  1113. });
  1114. }
  1115. /*改变图像大小*/
  1116. function resetCharts(){
  1117. for(i=0; i<curTmpInfo.comps.length; i++){
  1118. var c = curTmpInfo.comps[i];
  1119. var id = c.id;
  1120. if(c.type == "chart"){
  1121. var chart = echarts.getInstanceByDom(document.getElementById('C'+id));
  1122. chart.resize($("#C"+id).width(), $("#C"+id).height());
  1123. }
  1124. }
  1125. }
  1126. /**
  1127. isbind 是否绑定事件
  1128. */
  1129. function crtLayoutHTML(json, isbind){
  1130. var cps = [];
  1131. var ret = "<table border=\"0\" style=\"width:"+(curTmpInfo.is3g=="y"?"460px":"100%")+";\" cellspacing=\"0\" cellpadding=\"0\" class=\"r_layout\" id=\"layout_table\">";
  1132. for(var i=1; true; i++){
  1133. var tr = json["tr"+i];
  1134. if(!tr || tr == null){
  1135. break;
  1136. }
  1137. ret = ret + "<tr>";
  1138. for(var j=0; j<tr.length; j++){
  1139. var td = tr[j];
  1140. ret = ret + "<td class=\"laytd\" height=\""+td.height+"%\" width=\""+td.width+"%\" colspan=\""+td.colspan+"\" rowspan=\""+td.rowspan+"\" id=\"layout_"+td.id+"\">";
  1141. if(td.children){
  1142. for(var k=0; k<td.children.length; k++){
  1143. var str = addComp(td.children[k], td.id, false);
  1144. ret = ret + str;
  1145. cps.push(td.children[k]);
  1146. }
  1147. }
  1148. ret = ret + "</td>";
  1149. }
  1150. ret = ret + "</tr>";
  1151. }
  1152. ret = ret + "</table>";
  1153. curTmpInfo.comps = cps;
  1154. $("#optarea").html(ret);
  1155. if(isbind){
  1156. for(i=0; i<cps.length; i++){
  1157. bindCompEvent(cps[i]);
  1158. //注册组件 resize 事件
  1159. bindResizeEvent(cps[i].id, cps[i].type);
  1160. if(cps[i].type == "table"){
  1161. tableView(cps[i], cps[i].id);
  1162. }else if(cps[i].type == "chart"){
  1163. chartview(cps[i], cps[i].id);
  1164. }else if(cps[i].type == 'grid'){
  1165. gridView(cps[i]);
  1166. }else if(cps[i].type == "box"){
  1167. boxView(cps[i]);
  1168. }
  1169. }
  1170. }
  1171. //注册每个TD的接收组件拖放事件
  1172. $("#layout_table td.laytd").droppable({
  1173. accept:"div.ibox, #comp_tree .tree-node",
  1174. onDragEnter:function(e,source){
  1175. var obj = $(this);
  1176. if(obj.children().size() == 0){
  1177. $(".indicator").css({
  1178. display:'block',
  1179. left:obj.offset().left,
  1180. top:obj.offset().top - 3
  1181. });
  1182. }else{
  1183. var last = obj.children().last();
  1184. if(last.attr("id") == $(source).attr("id")){
  1185. last = last.prev();
  1186. }
  1187. if(last.size() == 0){
  1188. $(".indicator").css({
  1189. display:'block',
  1190. left:obj.offset().left,
  1191. top:obj.offset().top - 10
  1192. });
  1193. }else{
  1194. curTmpInfo.id = last.attr("id");
  1195. curTmpInfo.tp = "after";
  1196. $(".indicator").css({
  1197. display:'block',
  1198. left:last.offset().left,
  1199. top:last.offset().top + last.height()
  1200. });
  1201. }
  1202. }
  1203. $(source).draggable('proxy').find("span").removeClass("tree-dnd-no");
  1204. $(source).draggable('proxy').find("span").addClass("tree-dnd-yes");
  1205. },
  1206. onDragLeave:function(e,source){
  1207. $(source).draggable('proxy').find("span").addClass("tree-dnd-no");
  1208. $(source).draggable('proxy').find("span").removeClass("tree-dnd-yes");
  1209. delete curTmpInfo.id;
  1210. },
  1211. onDrop:function(e,source){
  1212. $(".indicator").hide();
  1213. if($(source).hasClass("ibox")){ //组件间的拖拽
  1214. if(!curTmpInfo.mouseOnDiv){
  1215. $(this).append(source);
  1216. }else{
  1217. if(curTmpInfo.tp == "before"){
  1218. $("#"+curTmpInfo.id).before(source);
  1219. }else{
  1220. $("#"+curTmpInfo.id).after(source);
  1221. }
  1222. }
  1223. window.setTimeout(function(){
  1224. var id = $(source).attr("id").replace("c_", "");
  1225. var comp = findCompById(id);
  1226. if(comp.type == "chart"){ //拖拽后重新调整图形大小
  1227. var chart = echarts.getInstanceByDom(document.getElementById('C'+comp.id));
  1228. chart.resize($("#C"+comp.id).width(), $("#C"+comp.id).height());
  1229. }
  1230. }, 200);
  1231. }else{
  1232. var node = $("#comp_tree").tree("getNode", source);
  1233. //从组件树拖拽, 创建组件
  1234. var layoutId = $(this).attr("id").split("_")[1];
  1235. var tp = node.attributes.tp;
  1236. if(tp == "text"){
  1237. insertText("insert", layoutId, '', curTmpInfo.id, curTmpInfo.tp);
  1238. }else if(tp == "table"){
  1239. var comp = {"id":newGuid(), "name":"交叉表", "type":"table"};
  1240. var str = addComp(comp, layoutId, true);
  1241. if(!curTmpInfo.id){
  1242. $("#layout_"+layoutId).append(str);
  1243. }else{
  1244. if(curTmpInfo.tp == "before"){
  1245. $("#"+curTmpInfo.id).before(str);
  1246. }else{
  1247. $("#"+curTmpInfo.id).after(str);
  1248. }
  1249. }
  1250. //注册拖放事件
  1251. bindCompEvent(comp);
  1252. bindResizeEvent(comp.id, 'table');
  1253. //滚动位置
  1254. window.setTimeout(function(){
  1255. $("#optarea").scrollTop($("#c_"+comp.id).offset().top);
  1256. }, 500);
  1257. }else if(tp == "chart"){
  1258. setcharttype(true, layoutId, curTmpInfo.id, curTmpInfo.tp)
  1259. }else if(tp == "grid"){
  1260. var comp = {"id":newGuid(), "name":"表格", "type":"grid"};
  1261. var str = addComp(comp, layoutId, true);
  1262. if(!curTmpInfo.id){
  1263. $("#layout_"+layoutId).append(str);
  1264. }else{
  1265. if(curTmpInfo.tp == "before"){
  1266. $("#"+curTmpInfo.id).before(str);
  1267. }else{
  1268. $("#"+curTmpInfo.id).after(str);
  1269. }
  1270. }
  1271. //注册拖放事件
  1272. bindCompEvent(comp);
  1273. bindResizeEvent(comp.id, 'grid');
  1274. //滚动位置
  1275. window.setTimeout(function(){
  1276. $("#optarea").scrollTop($("#c_"+comp.id).offset().top);
  1277. }, 500);
  1278. }else if(tp == "box"){
  1279. var comp = {"id":newGuid(), "name":"数据块", "type":"box"};
  1280. var str = addComp(comp, layoutId, true);
  1281. if(!curTmpInfo.id){
  1282. $("#layout_"+layoutId).append(str);
  1283. }else{
  1284. if(curTmpInfo.tp == "before"){
  1285. $("#"+curTmpInfo.id).before(str);
  1286. }else{
  1287. $("#"+curTmpInfo.id).after(str);
  1288. }
  1289. }
  1290. //注册拖放事件
  1291. bindCompEvent(comp);
  1292. //resize事件
  1293. bindResizeEvent(comp.id, 'box');
  1294. }
  1295. }
  1296. delete curTmpInfo.tp;
  1297. delete curTmpInfo.id;
  1298. delete curTmpInfo.mouseOnDiv;
  1299. curTmpInfo.isupdate = true;
  1300. }
  1301. });
  1302. }
  1303. function compevent(compId){
  1304. if(!compId){
  1305. compId = curTmpInfo.compId;
  1306. }
  1307. var comp = findCompById(compId);
  1308. if(comp.type == 'chart' || comp.type == 'table'){
  1309. }else{
  1310. return;
  1311. }
  1312. var clink;
  1313. var linkaccept;
  1314. if(comp.type == "chart" && comp.chartJson){
  1315. clink = comp.chartJson.link;
  1316. linkaccept = comp.chartJson.linkAccept;
  1317. }else{
  1318. clink = comp.link;
  1319. linkaccept = comp.linkAccept;
  1320. }
  1321. var str = "";
  1322. for(i=0; i<curTmpInfo.comps.length; i++){
  1323. var o = curTmpInfo.comps[i];
  1324. if(o.type == 'chart' || o.type == 'table'){
  1325. if(o.id != compId){ //不添加它自己
  1326. str = str + "<div class=\"checkbox checkbox-info\"><input id=\"cc"+i+"\" type=\"checkbox\" name=\"linkcomp\" value=\""+o.id+"\" "+(clink&&clink.target.indexOf(o.id)>=0 ?"checked":"")+"><label for=\"cc"+i+"\">"+o.name+"</label></div>";
  1327. }
  1328. }
  1329. }
  1330. var cols;
  1331. var findCubeCols = function(cubeId){
  1332. var ret = "";
  1333. $.ajax({
  1334. type:"post",
  1335. url:"../bireport/queryDims.action",
  1336. data: {cubeId: cubeId},
  1337. dataType:"json",
  1338. async:false,
  1339. success: function(resp){
  1340. cols = resp;
  1341. for(k=0; k<resp.length; k++){
  1342. ret = ret + "<option value=\""+resp[k].alias+"\" "+(linkaccept&&linkaccept.alias==resp[k].alias?"selected":"")+">"+resp[k].dim_desc+"</option>";
  1343. }
  1344. }
  1345. });
  1346. return ret;
  1347. };
  1348. var str2 = "<select id=\"acceptCol\" name=\"acceptCol\" class=\"inputform2\"><option value=\"\"></option>";
  1349. str2 = str2 + findCubeCols(comp.cubeId);
  1350. str2 = str2 + "</select>";
  1351. var ctx = "<div id=\"compevent_tab\" style=\"height:auto; width:auto;\"><div title=\"事件发起\"><div style=\"padding:10px;\"><span class=\"inputtext\">联动组件:</span><br/>"+str+"<button class=\"btn btn-info btn-sm\" id=\"cleanPostEvent\">清除事件发起</button></div></div><div title=\"事件接收\"><div class=\"textpanel\"><span class=\"inputtext\">接收字段:</span>"+str2+"<br/><br/><button id=\"cleanAcceptEvent\" class=\"btn btn-info btn-sm\">清除事件接收</button></div></div></div>";
  1352. $('#pdailog').dialog({
  1353. title: '组件联动事件设置',
  1354. width: 330,
  1355. height: (comp.type=="table"?290:250),
  1356. closed: false,
  1357. cache: false,
  1358. modal: true,
  1359. toolbar:null,
  1360. content: ctx,
  1361. buttons:[{
  1362. text:'确定',
  1363. iconCls:"icon-ok",
  1364. handler:function(){
  1365. var tab = $("#pdailog #compevent_tab").tabs("getSelected");
  1366. var idx = $("#pdailog #compevent_tab").tabs("getTabIndex", tab);
  1367. if(idx == 0){
  1368. var seles = $("#pdailog input[name='linkcomp']:checkbox:checked");
  1369. if(seles.length > 0){
  1370. var link = {};
  1371. if(comp.type == "chart"){
  1372. comp.chartJson.link = link;
  1373. }else{
  1374. comp.link = link;
  1375. }
  1376. var targets = "";
  1377. var types = "";
  1378. seles.each(function(a, b){
  1379. var id = $(this).val();
  1380. var linkComp = findCompById(id);
  1381. targets = targets + id + ",";
  1382. types = types + (linkComp.type=="table"?"cross":linkComp.type)+","
  1383. });
  1384. targets = targets.substring(0, targets.length - 1);
  1385. types = types.substring(0, types.length - 1);
  1386. link.target = targets;
  1387. link.type = types;
  1388. link.paramName = "p"+Math.floor(Math.random()*100);
  1389. }else{
  1390. if(comp.type == "chart"){
  1391. delete comp.chartJson.link;
  1392. }else{
  1393. delete comp.link;
  1394. }
  1395. }
  1396. }else{
  1397. var col = $("#compevent_tab #acceptCol").val();
  1398. var val = "";
  1399. if(col == '' && val == ''){
  1400. curTmpInfo.isupdate = true;
  1401. $('#pdailog').dialog('close');
  1402. return;
  1403. }
  1404. var dim = null;
  1405. for(c=0; c<cols.length; c++){
  1406. if(cols[c].alias == col){
  1407. dim = cols[c];
  1408. }
  1409. }
  1410. var o = {col:dim.col_name, alias:dim.alias, type:dim.dim_type, dftval: val, valType: dim.valType, tname:dim.tname,dimTname:dim.dim_tname,calc:dim.calc};
  1411. if(comp.type == "chart"){
  1412. comp.chartJson.linkAccept = o;
  1413. }else{
  1414. if(comp){
  1415. comp.linkAccept = o;
  1416. }else{
  1417. msginfo("组件还未定义数据,不能定义事件。");
  1418. }
  1419. }
  1420. }
  1421. curTmpInfo.isupdate = true;
  1422. $('#pdailog').dialog('close');
  1423. }
  1424. },{
  1425. text:'取消',
  1426. iconCls:"icon-cancel",
  1427. handler:function(){
  1428. $('#pdailog').dialog('close');
  1429. }
  1430. }]
  1431. });
  1432. $("#pdailog #compevent_tab").tabs({
  1433. border:false,
  1434. fit:true
  1435. });
  1436. $("#compevent_tab #cleanPostEvent").bind("click", function(){
  1437. var comps = $("#pdailog input[name='linkcomp']:checkbox");
  1438. for(i=0; comps&&i<comps.length; i++){
  1439. $(comps[i]).prop("checked", false);
  1440. }
  1441. if(comp.type == "chart"){
  1442. delete comp.chartJson.link;
  1443. }else{
  1444. delete comp.link;
  1445. }
  1446. });
  1447. $("#compevent_tab #cleanAcceptEvent").bind("click", function(){
  1448. $("#compevent_tab #acceptCol").val("");
  1449. $("#compevent_tab #dftval").val("");
  1450. $("#compevent_tab #valtype").val("");
  1451. if(comp.type == "chart"){
  1452. delete comp.chartJson.linkAccept;
  1453. }else{
  1454. delete comp.linkAccept;
  1455. }
  1456. });
  1457. }
  1458. /**
  1459. 发布报表到菜单
  1460. **/
  1461. function pushpage(){
  1462. if(!pageInfo.id || pageInfo.id == ""){
  1463. msginfo("请先保存报表再发布报表。");
  1464. return;
  1465. }
  1466. var ctx = '<div style="padding:10px;"><span class=\"inputtext\">名称:</span><input type=\"text\" id=\"name\" class=\"inputform2\"><br/><span class=\"inputtext\">排序:</span><input type=\"text\" id=\"ord\" class=\"inputform2\" value=\"1\"><br/><span class=\"inputtext\">图标:</span><input type=\"text\" id=\"avatar\" class=\"inputform2\"><table><tr><td valign=\"top\"><span class=\"inputtext\">上级菜单:</span></td><td><ul id=\"ggcatatree\" style=\"width:100%\"></ul></td></tr></table></div>';
  1467. $('#pdailog').dialog({
  1468. title: '发布报表到菜单',
  1469. width: 380,
  1470. height: 300,
  1471. closed: false,
  1472. cache: false,
  1473. modal: true,
  1474. toolbar:null,
  1475. content: ctx,
  1476. buttons:[{
  1477. text:'确定',
  1478. iconCls:"icon-ok",
  1479. handler:function(){
  1480. var name = $("#pdailog #name").val();
  1481. var ord = $("#pdailog #ord").val();
  1482. if(name == ''){
  1483. msginfo("名称必须填写。");
  1484. return;
  1485. }
  1486. if(ord == ''){
  1487. msginfo("排序必须填写。");
  1488. return;
  1489. }
  1490. if(isNaN(ord)){
  1491. msginfo("排序必须是数字类型。");
  1492. return;
  1493. }
  1494. var node = $("#pdailog #ggcatatree").tree("getSelected");
  1495. if(node == null){
  1496. msginfo("请选择上级菜单。");
  1497. return;
  1498. }
  1499. var avatar = $("#pdailog #avatar").combobox("getValue");
  1500. //新增只能配置3级菜单
  1501. var p1 = $("#pdailog #ggcatatree").tree("getParent", node.target);
  1502. if(p1 != null){
  1503. var p2 = $("#pdailog #ggcatatree").tree("getParent", p1.target);
  1504. if(p2 != null){
  1505. var p3 = $("#pdailog #ggcatatree").tree("getParent", p2.target);
  1506. if(p3 != null && p3.id == "0"){
  1507. $.messager.alert("出错了。","菜单只能建3级", "error");
  1508. return;
  1509. }
  1510. }
  1511. }
  1512. var url = "../portal/show.action?income=menu&pageId=" + pageInfo.id;
  1513. $.ajax({
  1514. type:"POST",
  1515. url:"../control/extControl?serviceid=frame.Menu&methodId=saveMenu&t_from_id=frame.Menu",
  1516. data:{"name":name,"note":"","order":ord, "url":url,"avatar":avatar, "pid":node.id,urls:"portal/Export.action,portal/print.action,portal/show.action"},
  1517. dataType:"html",
  1518. success:function(){
  1519. msginfo("菜单推送成功。", "suc");
  1520. },
  1521. error:function(){
  1522. msginfo("系统出错。");
  1523. }
  1524. });
  1525. $('#pdailog').dialog('close');
  1526. }
  1527. },{
  1528. text:'取消',
  1529. iconCls:"icon-cancel",
  1530. handler:function(){
  1531. $('#pdailog').dialog('close');
  1532. }
  1533. }]
  1534. });
  1535. //初始化菜单
  1536. $('#ggcatatree').tree({
  1537. url:'../control/extControl?serviceid=frame.Menu&methodId=loadData&t_from_id=frame.Menu&t='+Math.random(),
  1538. dnd:false,
  1539. animate:true,
  1540. data: [{id:'0', text:'系统菜单', state:'closed', iconCls:"icon-earth"}],
  1541. onBeforeLoad: function(node){
  1542. if(!node || node == null){
  1543. return false;
  1544. }
  1545. }
  1546. });
  1547. var node = $('#ggcatatree').tree("getRoot");
  1548. $('#ggcatatree').tree("expand", node.target);
  1549. //初始化图标
  1550. $("#pdailog #avatar").combobox({
  1551. url:'../resource/fonts/menu-icons.json',
  1552. valueField:'cls',
  1553. textField:'text',
  1554. height:25,
  1555. formatter:function(row){
  1556. return "<i class=\""+row.cls+"\"></i> "+row.text;
  1557. }
  1558. });
  1559. }
  1560. //设置报表风格样式
  1561. /**
  1562. function setpagestyle(){
  1563. var s = pageInfo.stylename;
  1564. var ctx = "<div style='margin:10px;'><br/><span class='rlayout'><div class='pagestyle' tp=\"def\" style='background-color:#eeeeee;'> &nbsp; </div><input type=\"radio\" "+(s&&s=="def"?"checked":"")+" value=\"def\" name=\"selstyle\">默认</span><span class='rlayout'><div class='pagestyle' tp=\"black\" style='background-color:#000000;'> &nbsp; </div><input type=\"radio\" value=\"black\" "+(s&&s=="black"?"checked":"")+" name=\"selstyle\">黑色</span><span class='rlayout'><div class='pagestyle' style='background-color:#00F;' tp=\"blue\"> &nbsp; </div><input type=\"radio\" value=\"blue\" name=\"selstyle\" "+(s&&s=="blue"?"checked":"")+">蓝色</span><span class='rlayout'><div class='pagestyle' style='background-color:#F00;' tp=\"red\"> &nbsp; </div><input type=\"radio\" "+((s&&s=="red"?"checked":""))+" value=\"red\" name=\"selstyle\">红色</span><span class='rlayout'><div class='pagestyle' style='background-color:#FF3;' tp=\"yellow\"> &nbsp; </div><input type=\"radio\" value=\"yellow\" name=\"selstyle\" "+((s&&s=="yellow"?"checked":""))+">黄色</span></div>";
  1565. $('#pdailog').dialog({
  1566. title: '报表样式设置',
  1567. width: 430,
  1568. height: 320,
  1569. closed: false,
  1570. cache: false,
  1571. modal: true,
  1572. toolbar:null,
  1573. content:ctx,
  1574. onLoad:function(){},
  1575. buttons:[{
  1576. text:'确定',
  1577. handler:function(){
  1578. var s = $("input[name=\"selstyle\"]:checked").val();
  1579. pageInfo.stylename = s;
  1580. curTmpInfo.isupdate = true;
  1581. $('#pdailog').dialog('close');
  1582. }
  1583. },{
  1584. text:'取消',
  1585. handler:function(){
  1586. $('#pdailog').dialog('close');
  1587. }
  1588. }]
  1589. });
  1590. $("span.rlayout div.pagestyle").click(function(){
  1591. var tp = $(this).attr("tp");
  1592. var s = $("input[name=\"selstyle\"][value=\""+tp+"\"]");
  1593. s.attr("checked","checked");
  1594. });
  1595. }
  1596. **/
  1597. function msginfo(input, tp){
  1598. var str = null;
  1599. if(tp && tp == 'suc'){
  1600. str = "<div class='msginfo msgsuc'>" + input +"</div>";
  1601. }else{
  1602. str = "<div class='msginfo msgerr'>" + input+"</div>";
  1603. }
  1604. $.messager.show({
  1605. title: (tp && tp == 'suc')? '成功了' : '出错了',
  1606. msg:str,
  1607. showType:'fade',
  1608. timeout:2000,
  1609. style:{
  1610. right:'',
  1611. top:document.body.scrollTop+document.documentElement.scrollTop + 10,
  1612. bottom:''
  1613. }
  1614. });
  1615. }
  1616. /**
  1617. 图形格式化函数
  1618. shortname == true 表示显示缩写, 分为k,m
  1619. **/
  1620. function formatNumber(num,pattern, shortname){
  1621. var shortdw;
  1622. if(shortname && num > 1000000){
  1623. num = num / 1000000;
  1624. shortdw = "百万";
  1625. }else if(shortname && num > 10000){
  1626. num = num / 10000;
  1627. shortdw = "万";
  1628. }else if(shortname && num > 1000){
  1629. num = num / 1000;
  1630. shortdw = "千";
  1631. }
  1632. if(pattern.indexOf("%") > 0){
  1633. num = num * 100;
  1634. }
  1635. var fmtarr = pattern?pattern.split('.'):[''];
  1636. var retstr='';
  1637. //先对数据做四舍五入
  1638. var xsw = 0;
  1639. if(fmtarr.length > 1){
  1640. xsw = fmtarr[1].length;
  1641. }
  1642. var bl = 1;
  1643. for(i=0; i<xsw; i++){
  1644. bl = bl * 10;
  1645. }
  1646. num = num * bl;
  1647. num = Math.round(num);
  1648. num = num / bl;
  1649. var strarr = num?num.toString().split('.'):['0'];
  1650. // 整数部分
  1651. var str = strarr[0];
  1652. var fmt = fmtarr[0];
  1653. var i = str.length-1;
  1654. var comma = false;
  1655. for(var f=fmt.length-1;f>=0;f--){
  1656. switch(fmt.substr(f,1)){
  1657. case '#':
  1658. if(i>=0 ) retstr = str.substr(i--,1) + retstr;
  1659. break;
  1660. case '0':
  1661. if(i>=0) retstr = str.substr(i--,1) + retstr;
  1662. else retstr = '0' + retstr;
  1663. break;
  1664. case ',':
  1665. comma = true;
  1666. retstr=','+retstr;
  1667. break;
  1668. }
  1669. }
  1670. if(i>=0){
  1671. if(comma){
  1672. var l = str.length;
  1673. for(;i>=0;i--){
  1674. retstr = str.substr(i,1) + retstr;
  1675. if(i>0 && ((l-i)%3)==0) retstr = ',' + retstr;
  1676. }
  1677. }
  1678. else retstr = str.substr(0,i+1) + retstr;
  1679. }
  1680. retstr = retstr+'.';
  1681. // 处理小数部分
  1682. str=strarr.length>1?strarr[1]:'';
  1683. fmt=fmtarr.length>1?fmtarr[1]:'';
  1684. i=0;
  1685. for(var f=0;f<fmt.length;f++){
  1686. switch(fmt.substr(f,1)){
  1687. case '#':
  1688. if(i<str.length) retstr+=str.substr(i++,1);
  1689. break;
  1690. case '0':
  1691. if(i<str.length) retstr+= str.substr(i++,1);
  1692. else retstr+='0';
  1693. break;
  1694. }
  1695. }
  1696. var r = retstr.replace(/^,+/,'').replace(/\.$/,'');
  1697. if(pattern.indexOf("%") > 0){
  1698. r = r + "%";
  1699. }
  1700. if(shortdw){
  1701. r = r + shortdw;
  1702. }
  1703. return r;
  1704. }
  1705. //从写图形组件链接方法
  1706. function chartComp_Link(){
  1707. //alert("定制模式下点击无效。");
  1708. }
  1709. //从布局器中查询td(容器)
  1710. function findLayoutById(layoutId){
  1711. var ret = null;
  1712. for(var i=1; true; i++){
  1713. var tr = pageInfo.body["tr"+i];
  1714. if(!tr || tr == null){
  1715. break;
  1716. }
  1717. for(var j=0; j<tr.length; j++){
  1718. var td = tr[j];
  1719. if(td.id == layoutId){
  1720. ret = td;
  1721. break;
  1722. }
  1723. }
  1724. }
  1725. return ret;
  1726. }