portal-comp.js 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598
  1. if($ == undefined){
  2. $ = jQuery;
  3. }
  4. var fmtJson = [{
  5. "text":"整数",
  6. "value":"#,##0"
  7. },{
  8. "text":"小数(保留一位)",
  9. "value":"#,##0.0"
  10. },{
  11. "text":"小数(保留两位)",
  12. "value":"#,##0.00"
  13. },{
  14. "text":"小数(保留四位)",
  15. "value":"#,##0.0000"
  16. },{
  17. "text":"百分比",
  18. "value":"#,##0.00%"
  19. }];
  20. var kpirate = [{
  21. "text":"1",
  22. "value":"1"
  23. },{
  24. "text":"千",
  25. "value":"1000"
  26. },{
  27. "text":"万",
  28. "value":"10000"
  29. },{
  30. "text":"百万",
  31. "value":"1000000"
  32. },{
  33. "text":"亿",
  34. "value":"100000000"
  35. }];
  36. var colorJson = [{
  37. "text":"无",
  38. "value":""
  39. },{
  40. "text":"黑色",
  41. "value":"#000000"
  42. },{
  43. "text":"白色",
  44. "value":"#FFFFFF"
  45. },{
  46. "text":"红色",
  47. "value":"#FF0000"
  48. },{
  49. "text":"鲜绿色",
  50. "value":"#00FF00"
  51. },{
  52. "text":"蓝色",
  53. "value":"#0000FF"
  54. },{
  55. "text":"黄色",
  56. "value":"#FFFF00"
  57. },{
  58. "text":"粉红色",
  59. "value":"#FF00FF"
  60. },{
  61. "text":"青绿色",
  62. "value":"#00FFFF"
  63. },{
  64. "text":"深红色",
  65. "value":"#800000"
  66. },{
  67. "text":"绿色",
  68. "value":"#008000"
  69. },{
  70. "text":"深蓝色",
  71. "value":"#000080"
  72. },{
  73. "text":"深黄色",
  74. "value":"#808000"
  75. },{
  76. "text":"紫罗兰",
  77. "value":"#800080"
  78. },{
  79. "text":"青色",
  80. "value":"#008080"
  81. },{
  82. "text":"灰-25%",
  83. "value":"#C0C0C0"
  84. },{
  85. "text":"灰-50%",
  86. "value":"#808080"
  87. },{
  88. "text":"海螺色",
  89. "value":"#9999FF"
  90. },{
  91. "text":"梅红色",
  92. "value":"#993366"
  93. },{
  94. "text":"象牙色",
  95. "value":"#FFFFCC"
  96. },{
  97. "text":"浅青绿",
  98. "value":"#CCFFFF"
  99. },{
  100. "text":"深紫色",
  101. "value":"#660066"
  102. },{
  103. "text":"珊瑚红",
  104. "value":"#FF8080"
  105. },{
  106. "text":"海蓝色",
  107. "value":"#0066CC"
  108. },{
  109. "text":"冰蓝",
  110. "value":"#CCCCFF"
  111. },{
  112. "text":"深蓝色",
  113. "value":"#000080"
  114. },{
  115. "text":"粉红色",
  116. "value":"#FF00FF"
  117. },{
  118. "text":"黄色",
  119. "value":"#FFFF00"
  120. },{
  121. "text":"青绿色",
  122. "value":"#00FFFF"
  123. },{
  124. "text":"紫罗兰",
  125. "value":"#800080"
  126. },{
  127. "text":"深红色",
  128. "value":"#800000"
  129. },{
  130. "text":"青色",
  131. "value":"#008080"
  132. },{
  133. "text":"蓝色",
  134. "value":"#0000FF"
  135. },{
  136. "text":"天蓝色",
  137. "value":"#00CCFF"
  138. },{
  139. "text":"浅青绿",
  140. "value":"#CCFFFF"
  141. },{
  142. "text":"浅绿色",
  143. "value":"#CCFFCC"
  144. },{
  145. "text":"浅黄色",
  146. "value":"#FFFF99"
  147. },{
  148. "text":"淡蓝色",
  149. "value":"#99CCFF"
  150. },{
  151. "text":"玫瑰红",
  152. "value":"#FF99CC"
  153. },{
  154. "text":"淡紫色",
  155. "value":"#CC99FF"
  156. },{
  157. "text":"茶色",
  158. "value":"#FFCC99"
  159. },{
  160. "text":"浅蓝色",
  161. "value":"#3366FF"
  162. },{
  163. "text":"水绿色",
  164. "value":"#33CCCC"
  165. },{
  166. "text":"酸橙色",
  167. "value":"#99CC00"
  168. },{
  169. "text":"金色",
  170. "value":"#FFCC00"
  171. },{
  172. "text":"浅橙色",
  173. "value":"#FF9900"
  174. },{
  175. "text":"橙色",
  176. "value":"#FF6600"
  177. },{
  178. "text":"蓝-灰",
  179. "value":"#666699"
  180. },{
  181. "text":"灰-40%",
  182. "value":"#969696"
  183. },{
  184. "text":"深青",
  185. "value":"#003366"
  186. },{
  187. "text":"海绿",
  188. "value":"#339966"
  189. },{
  190. "text":"深绿",
  191. "value":"#003300"
  192. },{
  193. "text":"橄榄色",
  194. "value":"#333300"
  195. },{
  196. "text":"褐色",
  197. "value":"#993300"
  198. },{
  199. "text":"梅红色",
  200. "value":"#993366"
  201. },{
  202. "text":"靛蓝色",
  203. "value":"#333399"
  204. },{
  205. "text":"灰-80%",
  206. "value":"#333333"
  207. }];
  208. function flushPage(){
  209. for(var k=0; curTmpInfo.comps&&k<curTmpInfo.comps.length; k++){
  210. var tp = curTmpInfo.comps[k].type;
  211. if(tp == 'table'){
  212. tableView(curTmpInfo.comps[k], curTmpInfo.comps[k].id);
  213. }else if(tp == 'chart'){
  214. chartview(curTmpInfo.comps[k], curTmpInfo.comps[k].id);
  215. }else if(tp == "box"){
  216. boxView(curTmpInfo.comps[k]);
  217. }else if(tp == "grid"){
  218. gridView(curTmpInfo.comps[k]);
  219. }
  220. }
  221. }
  222. //state = 'insert/update' 表示文本组件当前是新添加还是修改内容
  223. //layoutId 所属编辑器的ID
  224. function insertText(state, layoutId, compId){
  225. $('#pdailog').dialog({
  226. title: '请输入文本内容 - 文本框',
  227. width: 490,
  228. height: 240,
  229. closed: false,
  230. cache: false,
  231. modal: true,
  232. toolbar:null,
  233. content: '<div class="textpanel" style="line-height: 20px;"><textarea name="txtctx" id="txtctx" style=\"width:450px;height:145px;\"></textarea></div>',
  234. buttons:[{
  235. text:'确定',
  236. iconCls:"icon-ok",
  237. handler:function(){
  238. if(state == 'insert'){
  239. var txt = $("#txtctx").val();
  240. var obj = {"id":newGuid(), type:'text', name:"文本", desc:txt};
  241. var str = addComp(obj, layoutId, true);
  242. $("#layout_"+layoutId).append(str.replace(/\n/g,"<br>"));
  243. //移动滚动条
  244. $("#optarea").scrollTop($("#c_"+obj.id).offset().top);
  245. //注册拖放事件
  246. bindCompEvent(obj);
  247. bindResizeEvent(obj.id, 'text');
  248. }
  249. if(state == 'update'){
  250. var txt = $("#txtctx").val();
  251. var comp = findCompById(compId);
  252. comp.desc = txt;
  253. $("#c_"+compId+" div.cctx").html(txt.replace(/\n/g,"<br>"));
  254. }
  255. //更新页面为已修改
  256. curTmpInfo.isupdate = true;
  257. $('#pdailog').dialog('close');
  258. }
  259. },{
  260. text:'取消',
  261. iconCls:"icon-cancel",
  262. handler:function(){
  263. $('#pdailog').dialog('close');
  264. }
  265. }]
  266. });
  267. if(state == 'update'){
  268. var comp = findCompById(compId);
  269. $("#txtctx").val(comp.desc);
  270. }
  271. $("#txtctx").focus();
  272. }
  273. //根据ispush来判断是否把组件放入JSON对象中
  274. function addComp(comp, layoutId, ispush){
  275. var json = comp;
  276. var layout = findLayoutById(layoutId);
  277. if(ispush){
  278. if(!layout.children){
  279. layout.children = [];
  280. }
  281. layout.children.push(json);
  282. if(!curTmpInfo.comps){
  283. curTmpInfo.comps = [];
  284. }
  285. curTmpInfo.comps.push(json);
  286. }
  287. //生成文本组件的样式
  288. var textcss = "";
  289. if(json.style){
  290. var sty = json.style;
  291. if(json.style.talign && json.style.talign != '' && json.type != 'input'){ //input类型的 talign 特殊处理
  292. textcss = textcss +"text-align:"+json.style.talign+";";
  293. }
  294. if(json.style.tfontsize && json.style.tfontsize != ''){
  295. textcss = textcss + "font-size:"+json.style.tfontsize+"px;";
  296. }
  297. if(json.style.tfontcolor && json.style.tfontcolor != ''){
  298. textcss = textcss + "color:"+json.style.tfontcolor+";";
  299. }
  300. if(sty.tfontweight && sty.tfontweight=="true"){
  301. textcss = textcss + "font-weight:bold;";
  302. }
  303. if(sty.titalic && sty.titalic == "true"){
  304. textcss = textcss + "font-style:italic;";
  305. }
  306. if(sty.tunderscore && sty.tunderscore == 'true'){
  307. textcss = textcss + "text-decoration: underline;";
  308. }
  309. if(sty.tbgcolor && sty.tbgcolor != '' ){
  310. textcss = textcss + "background-color:"+sty.tbgcolor+";";
  311. }
  312. //判断input类型的 theight
  313. if(sty.theight && sty.theight != '' && json.type == 'input'){
  314. textcss = textcss + "height:"+sty.theight+"px;";
  315. }
  316. }
  317. textcss = textcss + "padding:3px;"; //设置组件padding为 3
  318. if(json.type == "box" && json.bgcolor && json.bgcolor!=""){
  319. textcss = textcss + "background-color:"+json.bgcolor+";";
  320. }
  321. if((json.type == "box" || json.type == "text") && json.height ){
  322. textcss = textcss + "height:"+(json.height + 8)+"px;"; //加上padding
  323. }
  324. var str = "<div class=\"ibox\" id=\"c_"+json.id+"\"><div class=\"ibox-title\"><div class=\"ctit\"><h5>"+json.name+"</h5></div>"+"<div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"showcompmenu(this,'"+layoutId+"','"+comp.id+"')\" title=\"设置组件\" ><i class=\"fa fa-wrench\"></i></button> <button class=\"btn btn-outline btn-danger btn-xs\" onclick=\"deletecomp('"+layoutId+"', '"+comp.id+"');\" title=\"删除组件\" cid=\""+json.id+"\"><i class=\"fa fa-times\"></i></button></div></div><div class=\"cctx ibox-content\" style=\""+textcss+"\"><div class=\"ccctx\">";
  325. if(json.type == 'text'){
  326. str = str + comp.desc.replace(/\n/g,"<br>")
  327. }else if(json.type == "table"){
  328. var ret = "<div align=\"center\" class=\"tipinfo\">(点击<i class=\"fa fa-wrench\"></i>按钮配置交叉表)</div>";
  329. str = str + ret;
  330. }else if(json.type == "chart"){
  331. var ret = "<div align=\"center\" class=\"tipinfo\">(点击<i class=\"fa fa-wrench\"></i>按钮配置图形)</div>";
  332. str = str + ret;
  333. }else if(json.type == 'grid'){
  334. var ret = "<div align=\"center\" class=\"tipinfo\">(点击<i class=\"fa fa-wrench\"></i>按钮配置表格)</div>";
  335. str = str + ret;
  336. }else if(json.type == "box"){
  337. var ret = "<div align=\"center\" class=\"tipinfo\">(点击<i class=\"fa fa-wrench\"></i>按钮配置数据块)</div>";
  338. str = str + ret;
  339. }
  340. str = str + "</div><div class=\"win-size-grip\"></div></div></div>";
  341. return str;
  342. }
  343. function showcompmenu(ts, layoutId, compId){
  344. var offset = $(ts).offset();
  345. var divId = "";
  346. var comp = findCompById(compId);
  347. if(comp.type == "chart"){
  348. divId = "chart_menu";
  349. }else if(comp.type == "table"){
  350. divId = "table_menu";
  351. }else if(comp.type == "text"){
  352. divId = "text_menu";
  353. }else if(comp.type == "grid"){
  354. divId = "grid_menu";
  355. }else if(comp.type == "box"){
  356. divId = "box_menu";
  357. }
  358. curTmpInfo.layoutId = layoutId;
  359. curTmpInfo.compId = compId;
  360. $("#" + divId).menu("show", {left:offset.left, top:offset.top + 20});
  361. }
  362. function bindResizeEvent(compId, tp){
  363. var max, min;
  364. if(tp == "chart"){
  365. max = 900,min = 150;
  366. }else if(tp == "box"){
  367. max = 500, min = 30;
  368. }else if(tp == "table" || tp == "grid"){
  369. max = 900, min = 60;
  370. }else if(tp == "text"){
  371. max = 600, min = 30;
  372. }else if(tp == "pic"){
  373. max = 2000, min = 30;
  374. }else{
  375. max = 2000, min = 30;
  376. }
  377. $("#c_"+compId+" .cctx").myresizable({
  378. handleSelector: "> .win-size-grip",
  379. resizeWidth: false,
  380. resizeHeight: true,
  381. resizeHeightFrom: 'bottom',
  382. onDrag:function(e, $el, opt){
  383. if(tp == "box"){
  384. $el.find(".boxcls").css("line-height", $el.height() + "px");
  385. }
  386. },
  387. onDragEnd:function(e, $el, newWidth, newHeight, opt){
  388. var c = findCompById(compId);
  389. var h = Math.round($el.height());
  390. if(c.type == "chart"){
  391. c.chartJson.height = h;
  392. //设置图像高度
  393. var o = document.getElementById('C'+compId);
  394. if(o){
  395. var chart = echarts.getInstanceByDom(o);
  396. if(chart){
  397. $("#C"+compId).height((h)+"px");
  398. chart.resize("auto", "auto");
  399. }
  400. }
  401. }else if(c.type == 'mbox'){
  402. c.height = h;
  403. $("#c_"+compId+" .ccctx table.data-t").animate({"height": c.height+"px"});
  404. }else if(c.type == "box"){
  405. if(c.chart || c.thbDim || c.progressBar){
  406. c.height = h - 60;
  407. }else{
  408. c.height = h;
  409. }
  410. $el.find(".boxcls").css({"line-height": c.height + "px", "height":c.height+"px"});
  411. }else if(c.type == "table"){
  412. var headHeight = $("#c_"+compId+" div.lock-dg-header table.lockgrid").height(); //表头高度
  413. c.height = h - headHeight; //减去 表头距离
  414. $("#c_"+compId+" .lock-dg-body").animate({"height":c.height+"px"});
  415. }else if(c.type == "grid"){
  416. var headHeight = $("#c_"+compId+" div.lock-dg-header table.lockgrid").height(); //表头高度
  417. var fyHeight = $("#c_"+compId+" div.pagesizeinfo").height() + 6; //分页高度 (padding:6px)
  418. h = Math.round(h - Math.round(headHeight) - (c.isnotfy =="true" ? 0 : Math.round(fyHeight))); //减去表头距离, 分页距离
  419. $("#c_"+compId+" .lock-dg-body").animate({"height": h+"px"});
  420. c.height = h;
  421. }else if(c.type == "text"){
  422. c.height = h;
  423. }else if(c.type == "pic"){
  424. if(c.height && c.width){ //图片存在宽度和高度,需要在拖动后重新定义
  425. c.width = Math.round(c.width * h / c.height);
  426. }
  427. c.height = h;
  428. $("#c_"+compId+" .cctx img").animate({"height": (c.height)+"px","width":c.width});
  429. }
  430. curTmpInfo.isupdate = true;
  431. }
  432. });
  433. }
  434. function bindCompEvent(obj){
  435. //注册移动事件
  436. $("#c_" + obj.id).draggable({
  437. revert:true,
  438. handle:$("#c_" + obj.id + " .ibox-title"),
  439. delay:180,
  440. proxy:function(source){
  441. var width = $(source).width();
  442. var height = $(source).height();
  443. var p = $('<div style="border:1px solid #999999;background-color:#cccccc; opacity:0.8; filter:alpha(opacity=50); width:'+width+'px; height:'+height+'px;">'+obj.name+'</div>');
  444. p.appendTo('body');
  445. return p;
  446. },
  447. onStartDrag:function(e){
  448. resetWindows('min');
  449. $(this).hide();
  450. },
  451. onStopDrag:function(e){
  452. $(".indicator").hide();
  453. resetWindows('max');
  454. $(this).show();
  455. }
  456. });
  457. $("#c_" + obj.id).droppable({
  458. accept:"div.ibox, #comp_tree .tree-node",
  459. onDragEnter:function(e,source){
  460. curTmpInfo.id = $(this).attr("id");
  461. curTmpInfo.tp = "before";
  462. curTmpInfo.mouseOnDiv = true;
  463. $(".indicator").css({
  464. display:'block',
  465. left:$(this).offset().left,
  466. top:$(this).offset().top - 10
  467. });
  468. e.cancelBubble=true;
  469. e.stopPropagation(); //阻止事件冒泡
  470. },
  471. onDragLeave:function(e,source){
  472. curTmpInfo.mouseOnDiv = false;
  473. var obj = $(this).parent();
  474. var last = obj.children().last();
  475. if(last.attr("id") == $(source).attr("id")){
  476. last = last.prev();
  477. }
  478. if(last.size() == 0){
  479. $(".indicator").css({
  480. display:'block',
  481. left:obj.offset().left,
  482. top:obj.offset().top - 10
  483. });
  484. }else{
  485. curTmpInfo.id = last.attr("id");
  486. curTmpInfo.tp = "after";
  487. $(".indicator").css({
  488. display:'block',
  489. left:last.offset().left,
  490. top:last.offset().top + last.height()
  491. });
  492. }
  493. e.cancelBubble=true;
  494. e.stopPropagation(); //阻止事件冒泡
  495. },
  496. onDrop:function(e,source){
  497. e.cancelBubble=true;
  498. e.stopPropagation(); //阻止事件冒泡
  499. }
  500. });
  501. }
  502. function editComp(layoutId, compId){
  503. if(!layoutId){
  504. layoutId = curTmpInfo.layoutId;
  505. }
  506. if(!compId){
  507. compId = curTmpInfo.compId;
  508. }
  509. $('#Jlayout').layout("remove", "east");
  510. var comp = findCompById(compId);
  511. if(comp.type == "text"){
  512. insertText("update", layoutId, compId);
  513. }else if(comp.type == "table"){
  514. editTableData(compId);
  515. }else if(comp.type == "chart"){
  516. editChartData(compId, layoutId);
  517. }else if(comp.type == 'input'){
  518. editInputData(comp);
  519. }else if(comp.type == 'grid'){
  520. editGridData(compId);
  521. }else if(comp.type == "box"){
  522. editBoxData(compId);
  523. }
  524. }
  525. function setComp(layoutId, compId){
  526. if(!layoutId){
  527. layoutId = curTmpInfo.layoutId;
  528. }
  529. if(!compId){
  530. compId = curTmpInfo.compId;
  531. }
  532. $('#Jlayout').layout("remove", "south");
  533. var comp = findCompById(compId);
  534. if(comp.type == "text"){
  535. setTextProperty(comp);
  536. }else if(comp.type == "table"){
  537. setTableProperty(comp);
  538. }else if(comp.type == "chart"){
  539. setChartProperty(comp);
  540. }else if(comp.type == 'input'){
  541. setInputProperty(comp);
  542. }else if(comp.type == "grid"){
  543. setGridProperty(comp);
  544. }else if(comp.type == "box"){
  545. setBoxProperty(comp);
  546. }
  547. }
  548. function editTableData(compId){
  549. if($("#dataProperty").size() == 0){
  550. $('#Jlayout').layout('add', {region:"south", id:"dataProperty", split:false, collapsible:false,height : 120, title:'编辑交叉表数据', tools:[{
  551. iconCls:'icon-cancel',
  552. handler:function(){
  553. $('#Jlayout').layout("remove", "south");
  554. }
  555. }]});
  556. }else{
  557. $('#Jlayout').layout('panel', "south").panel("setTitle", "编辑交叉表数据");
  558. }
  559. //切换选项卡到立方体
  560. $("#comp_tab").tabs("select", 1);
  561. var comp = findCompById(compId);
  562. var str = "";
  563. for(var i=0; comp.rows&&i<comp.rows.length; i++){
  564. str = str + "<span id=\"d_"+comp.rows[i].id+"\" class=\"dimcol\"><span class=\"text\">"+comp.rows[i].dimdesc+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setRdimInfo(this, "+comp.rows[i].id+", '"+comp.rows[i].dimdesc+"','"+compId+"')\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  565. }
  566. for(var i=0; comp.kpiJson&&i<comp.kpiJson.length; i++){
  567. str = str + "<span id=\"k_"+comp.kpiJson[i].kpi_id+"\" class=\"col\"><span class=\"text\">"+comp.kpiJson[i].kpi_name+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setKpiInfo(this,"+comp.kpiJson[i].kpi_id+",'"+compId+"');\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  568. }
  569. if(str == ""){
  570. str = "<div class=\"tipinfo\">拖拽立方体维度或度量到此处作为交叉表的字段</div>";
  571. }else{
  572. str = "<span id=\"tabRows\"><b>交叉表字段:</b>" + str + "</span>";
  573. }
  574. var colstr = "";
  575. for(var i=0; comp.cols&&i<comp.cols.length; i++){
  576. var o = comp.cols[i];
  577. colstr = colstr + "<span id=\"d_"+o.id+"\" class=\"dimcol\"><span class=\"text\">"+o.dimdesc+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setCdimInfo(this, "+o.id+", '"+o.dimdesc+"','"+compId+"')\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  578. }
  579. if(colstr != ''){
  580. colstr = "<span id=\"tabCols\"> &nbsp; &nbsp; <b>列字段:</b>" + colstr + "</span>";
  581. }
  582. var ctx = "<div style=\"margin:10px;\"><div class=\"tableDatasty\" id=\"tableData\">"+str + colstr +"</div></div>";
  583. $("#dataProperty").html(ctx);
  584. //注册接收度量及维度拖放事件
  585. $("#tableData").droppable({
  586. accept:"#datasettree .tree-node",
  587. onDragEnter:function(e,source){
  588. var node = $("#datasettree").tree("getNode", source);
  589. var tp = node.attributes.col_type;
  590. //对维度拖拽设置图标
  591. $(source).draggable('proxy').find("span").removeClass("tree-dnd-no");
  592. $(source).draggable('proxy').find("span").addClass("tree-dnd-yes");
  593. $("#tableData").css("border", "1px solid #ff0000");
  594. e.cancelBubble=true;
  595. e.stopPropagation(); //阻止事件冒泡
  596. },
  597. onDragLeave:function(e,source){
  598. $(source).draggable('proxy').find("span").addClass("tree-dnd-no");
  599. $(source).draggable('proxy').find("span").removeClass("tree-dnd-yes");
  600. $("#tableData").css("border", "1px dotted #666");
  601. e.cancelBubble=true;
  602. e.stopPropagation(); //阻止事件冒泡
  603. },
  604. onDrop:function(e,source){
  605. var id = compId
  606. var json = findCompById(id);
  607. e.cancelBubble=true;
  608. e.stopPropagation(); //阻止事件冒泡
  609. //清除边框颜色
  610. $("#tableData").css("border", "1px dotted #666");
  611. //获取TREE
  612. var node = $("#datasettree").tree("getNode", source);
  613. //判断拖入的维度及度量是否和以前维度及度量在同一个表。
  614. if(json.cubeId != undefined){
  615. if(json.cubeId != node.attributes.cubeId){
  616. msginfo("您拖入的"+ (node.attributes.col_type == 2 ? "度量" : "维度") +"与组件已有的内容不在同一个数据表中,拖放失败。");
  617. return;
  618. }
  619. }else{
  620. json.cubeId = node.attributes.cubeId;
  621. json.dsetId = node.attributes.dsetId;
  622. json.dsid = node.attributes.dsid;
  623. }
  624. if(!json.kpiJson){
  625. json.kpiJson = [];
  626. };
  627. if(!json.cols){
  628. json.cols = [];
  629. }
  630. if(!json.rows){
  631. json.rows = [];
  632. }
  633. //写度量
  634. if(node.attributes.col_type == 2){
  635. //如果度量存在就忽略
  636. if(!kpiExist(node.attributes.col_id, json.kpiJson)){
  637. json.kpiJson.push({"kpi_id":node.attributes.col_id, "kpi_name" : node.text, "col_name":node.attributes.col_name, "aggre":node.attributes.aggre, "fmt":node.attributes.fmt, "alias":node.attributes.alias,"tname":node.attributes.tname,"unit":node.attributes.unit,"rate":node.attributes.rate});
  638. }else{
  639. msginfo("度量已经存在。");
  640. return;
  641. }
  642. //添加字段
  643. var str = "<span id=\"k_"+node.attributes.col_id+"\" class=\"col\"><span class=\"text\">"+node.text+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setKpiInfo(this,"+node.attributes.col_id+",'"+json.id+"');\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  644. var obj = $("#tableData");
  645. if(obj.find("#tabRows").size() == 0){
  646. obj.html("<span id=\"tabRows\"><b>交叉表字段:</b>"+str+"</span>");
  647. }else{
  648. if($("#tableData #tabRows").find("span.col").size() == 0){
  649. $("#tableData #tabRows").append(str);
  650. }else{
  651. $("#tableData #tabRows").find("span.col").last().after(str);
  652. }
  653. }
  654. curTmpInfo.isupdate = true;
  655. tableView(json, id);
  656. }
  657. //写维度
  658. if(node.attributes.col_type == 1){
  659. //写row维度
  660. //if($(this).attr("id") == "d_rowDims"){
  661. if(!dimExist(node.attributes.col_id, json.rows) && !dimExist(node.attributes.col_id, json.cols)){
  662. json.rows.push({"id":node.attributes.col_id, "dimdesc" : node.text, "type":node.attributes.dim_type, "colname":node.attributes.col_name,"tname":node.attributes.tname,"iscas":node.attributes.iscas, "tableName":node.attributes.tableName, "tableColKey":node.attributes.tableColKey,"tableColName":node.attributes.tableColName, "dimord":node.attributes.dimord, "dim_name":node.attributes.dim_name,"grouptype":node.attributes.grouptype,"valType":node.attributes.valType,"ordcol":node.attributes.ordcol,"alias":node.attributes.alias,"calc":node.attributes.calc});
  663. }else{
  664. msginfo("维度已经存在。");
  665. return;
  666. }
  667. //添加字段
  668. var str = "<span id=\"d_"+node.attributes.col_id+"\" class=\"dimcol\"><span class=\"text\">"+node.text+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setRdimInfo(this, "+node.attributes.col_id+", '"+node.text+"','"+json.id+"')\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  669. var obj = $("#tableData");
  670. if(obj.find("#tabRows").size() == 0){
  671. obj.html("<span id=\"tabRows\"><b>交叉表字段:</b>"+str+"</span>");
  672. }else{
  673. if($("#tableData #tabRows").find("span.dimcol").size() == 0){
  674. $("#tableData #tabRows").find("b").after(str);
  675. }else{
  676. $("#tableData #tabRows").find("span.dimcol").last().after(str);
  677. }
  678. }
  679. curTmpInfo.isupdate = true;
  680. tableView(json, id);
  681. //}
  682. }
  683. }
  684. });
  685. }
  686. //从交叉表JSON中删除KPI
  687. function delJsonKpiOrDim(tp){
  688. var id = curTmpInfo.ckid;
  689. var compId = curTmpInfo.compId;
  690. var comp = findCompById(compId);
  691. var pos = curTmpInfo.pos;
  692. if(tp == 'kpi'){
  693. var kpis = comp.kpiJson;
  694. var idx = -1;
  695. for(var i=0; i<kpis.length; i++){
  696. if(kpis[i].kpi_id == id){
  697. idx = i;
  698. break;
  699. }
  700. }
  701. kpis.splice(idx, 1);
  702. $("#tableData #k_"+id).remove();
  703. }
  704. if(tp == 'dim'){
  705. var dims = null;
  706. if(pos == 'col'){
  707. dims = comp.cols;
  708. }else{
  709. dims = comp.rows;
  710. }
  711. var idx = -1;
  712. for(var i=0; i<dims.length; i++){
  713. if(dims[i].id == id){
  714. idx = i
  715. break;
  716. }
  717. }
  718. dims.splice(idx, 1);
  719. $("#tableData #d_"+id).remove();
  720. if(pos == "col"){
  721. if(dims.length == 0){
  722. $("#tableData #tabCols").remove();
  723. }
  724. }else if(pos == "row"){
  725. if(dims.length == 0){
  726. //$("#tableData #tabRows").remove();
  727. //$("#tableData").html("<div class=\"tipinfo\">拖拽立方体维度或度量到此处作为交叉表的字段</div>");
  728. //$("#c_"+compId+" .cctx").html("");
  729. }
  730. }
  731. }
  732. curTmpInfo.isupdate = true;
  733. tableView(comp, compId);
  734. }
  735. function setTableProperty(comp){
  736. if($("#compSet").size() == 0){
  737. $('#Jlayout').layout('add', {region:"east", split:false, width:240, title:"交叉表属性配置", collapsible:false, id:"compSet", tools:[{
  738. iconCls:'icon-cancel',
  739. handler:function(){
  740. $('#Jlayout').layout("remove", "east");
  741. }
  742. }]});
  743. }else{
  744. $('#Jlayout').layout('panel', "east").panel("setTitle", "交叉表属性配置");
  745. }
  746. if(!comp.style){
  747. comp.style = {};
  748. }
  749. var s = comp.style;
  750. $('#compSet').propertygrid({
  751. showGroup:true,
  752. border:false,
  753. showHeader:false,
  754. scrollbarSize: 0,
  755. fitColumns:false,
  756. onAfterEdit: function(rowIndex,rowData,changes){
  757. var val = rowData.value;
  758. var col = rowData.col;
  759. curTmpInfo.isupdate = true;
  760. if(col == "name"){
  761. comp.name = val;
  762. $("#c_"+comp.id + " div.ctit h5").text(val);
  763. }else if(col == "showtitle"){
  764. comp.showtitle = val;
  765. }else if(col == "lockhead"){
  766. comp[col] = val;
  767. tableView(comp, comp.id);
  768. }
  769. },
  770. data:[
  771. {name:'交叉表标题',col:'name', value:(comp.name?comp.name:""), group:'交叉表属性', editor:'text'},
  772. {name:'是否显示标题',col:'showtitle', value:(comp.showtitle?comp.showtitle:"true"), group:'交叉表属性', editor:{
  773. type:"checkbox",
  774. options:{"on":true, "off":false}
  775. }},
  776. {name:"交叉表下钻",col:"xxx",value:"<div align=\"center\"><a href='javascript:;' onclick=\"crossdrill('"+comp.id+"')\">设置</a></div>",group:"交叉表属性"}
  777. ]
  778. });
  779. }
  780. function crossdrill(compId){
  781. var comp = findCompById(compId);
  782. if(comp.rows.length != 1){
  783. msginfo("交叉表行标签只有一个维度的时候才能配置交叉表钻取。");
  784. return;
  785. }
  786. var dd;
  787. if(!comp.drillDim){
  788. comp.drillDim = [];
  789. }else{
  790. dd = comp.drillDim[0];
  791. }
  792. var dims = null;
  793. var s = "<option value=\"\">--不启用--</option>";
  794. $.ajax({
  795. type:"post",
  796. url:"../bireport/queryDims.action",
  797. data: {cubeId: comp.cubeId},
  798. dataType:"json",
  799. async:false,
  800. success: function(resp){
  801. dims = resp;
  802. for(k=0; k<resp.length; k++){
  803. var name = resp[k].dim_desc;
  804. var id = resp[k].col_name;
  805. var alias = resp[k].alias;
  806. s=s+"<option value=\""+alias+"\" "+(dd&&dd.code == alias?"selected":"")+">"+name+"</option>";
  807. }
  808. }
  809. });
  810. var findDim = function(alias){
  811. var ret = null;
  812. for(k=0; k<dims.length; k++){
  813. var t = dims[k];
  814. if(t.alias == alias){
  815. ret = t;
  816. break;
  817. }
  818. }
  819. return ret;
  820. }
  821. var row = comp.rows[0];
  822. var ctx = "<div class=\"textpanel\">当前交叉表行维度:"+row.dimdesc+"<br/> <span class=\"inputtext\">钻取维度:</span><select id=\"drillDim\" name=\"drillDim\" class=\"inputform\">"+s+"</select></div>";
  823. $('#pdailog').dialog({
  824. title: "交叉表钻取配置",
  825. width: 310,
  826. height: 200,
  827. closed: false,
  828. cache: false,
  829. modal: true,
  830. content:ctx,
  831. buttons:[{
  832. text:'确定',
  833. iconCls:"icon-ok",
  834. handler:function(){
  835. var dimid = $("#pdailog #drillDim").val();
  836. if(dimid == ''){
  837. delete comp.drillDim;
  838. }else{
  839. var dim = findDim(dimid);
  840. comp.drillDim[0] = {name:dim.dim_desc,code:dim.alias,type:dim.dim_type,tableColKey:dim.tableColKey,tableColName:dim.tableColName,dimord:dim.dim_ord,colname:dim.col_name,tname:dim.tname,calc:dim.calc};
  841. }
  842. tableView(comp, comp.id);
  843. curTmpInfo.isupdate = true;
  844. $('#pdailog').dialog("close");
  845. }
  846. },{
  847. text:'取消',
  848. iconCls:"icon-cancel",
  849. handler:function(){
  850. $('#pdailog').dialog("close");
  851. }
  852. }]
  853. });
  854. }
  855. function setTextProperty(comp){
  856. if($("#compSet").size() == 0){
  857. $('#Jlayout').layout('add', {region:"east", split:false, width:240, title:"文本属性配置", collapsible:false, id:"compSet", tools:[{
  858. iconCls:'icon-cancel',
  859. handler:function(){
  860. $('#Jlayout').layout("remove", "east");
  861. }
  862. }]});
  863. }else{
  864. $('#Jlayout').layout('panel', "east").panel("setTitle", "文本属性配置");
  865. }
  866. if(!comp.style){
  867. comp.style = {};
  868. }
  869. s = comp.style;
  870. $('#compSet').propertygrid({
  871. showGroup:true,
  872. border:false,
  873. showHeader:false,
  874. scrollbarSize: 0,
  875. fitColumns:false,
  876. onAfterEdit: function(rowIndex,rowData,changes){
  877. var val = rowData.value;
  878. var col = rowData.col;
  879. curTmpInfo.isupdate = true;
  880. if(col == "name"){
  881. comp.name = val;
  882. $("#c_"+comp.id + " div.ctit h5").text(val);
  883. }else if(col == "showtitle"){
  884. comp.showtitle = val;
  885. }else{
  886. comp.style[col] = val;
  887. var o = $("#c_"+comp.id+" .cctx");
  888. if(col == "tfontsize"){
  889. if(val == ''){
  890. o.css("font-size", "inherit");
  891. }else{
  892. o.css("font-size", val+"px");
  893. }
  894. }else if(col == "talign"){
  895. o.css("text-align", val);
  896. }else if(col == "tfontcolor"){
  897. o.css("color", val);
  898. }else if(col == "tfontweight"){
  899. if(val == "true"){
  900. o.css("font-weight", "bold");
  901. }else{
  902. o.css("font-weight", "normal");
  903. }
  904. }else if(col == "titalic"){
  905. if(val == "true"){
  906. o.css("font-style","italic");
  907. }else{
  908. o.css("font-style","normal");
  909. }
  910. }else if(col == "tunderscore"){
  911. if(val == "true"){
  912. o.css("text-decoration","underline");
  913. }else{
  914. o.css("text-decoration","inherit");
  915. }
  916. }else if(col=="tbgcolor"){
  917. if(val == ""){
  918. o.css("background-color", "inherit");
  919. }else{
  920. o.css("background-color", val);
  921. }
  922. }
  923. }
  924. },
  925. data:[
  926. {name:'是否显示标题',col:'showtitle', value:(comp.showtitle?comp.showtitle:"true"), group:'文本属性', editor:{
  927. type:"checkbox",
  928. options:{"on":true, "off":false}
  929. }},
  930. {name:'标题',col:'name', value:(comp.name?comp.name:""), group:'文本属性', editor:'text'},
  931. {name:'位置', col:'talign', value:(s.talign?s.talign:""), group:'文本属性', editor:{
  932. type:'combobox',
  933. options:{data:[{value:'left',text:'left'},{value:'center',text:'center'},{value:'right',text:'right'}]}
  934. }},
  935. {name:'背景颜色', col:'tbgcolor', value:(s.tbgcolor?s.tbgcolor:""), group:'文本属性', editor:{
  936. type:'combobox',
  937. options:{data:colorJson, formatter:function(row){
  938. return "<div style=\"background-color:"+row.value+"\">"+row.text+"</div>";
  939. }}
  940. }},
  941. {name:'字体大小',col:'tfontsize', value:(s.tfontsize?s.tfontsize:""), group:'文本字体', editor:{type:'numberspinner',options:{min:9,max:100,increment:3}}},
  942. {name:'字体颜色',col:'tfontcolor', value:(s.tfontcolor?s.tfontcolor:""), group:'文本字体', editor:{
  943. type:'combobox',
  944. options:{data:colorJson, formatter:function(row){
  945. return "<div style=\"background-color:"+row.value+"\">"+row.text+"</div>";
  946. }}
  947. }},
  948. {name:'是否粗体',col:'tfontweight', value:(s.tfontweight?s.tfontweight:""), group:'文本字体', editor:{
  949. type:"checkbox",
  950. options:{"on":true, "off":false}
  951. }},
  952. {name:'是否斜体',col:'titalic', value:(s.titalic?s.titalic:""), group:'文本字体', editor:{
  953. type:"checkbox",
  954. options: {"on":true, "off":false}
  955. }},
  956. {name:'是否下划线',col:'tunderscore', value:(s.tunderscore?s.tunderscore:""), group:'文本字体', editor:{
  957. type:"checkbox",
  958. options: {"on":true, "off":false}
  959. }}
  960. ]
  961. });
  962. }
  963. function tableView(table, compId){
  964. if(table.kpiJson == undefined){
  965. return;
  966. } //如果没有度量,维度等内容,返回界面到初始状态
  967. if(table.kpiJson.length == 0 && table.cols.length == 0 && table.rows.length == 0){
  968. $("#T" + compId + " div.ctx").html("<div align=\"center\" class=\"tipinfo\">(点击编辑按钮配置交叉表的列)</div>");
  969. return;
  970. }
  971. var json = JSON.parse(JSON.stringify(table));
  972. json.portalParams = pageInfo.params;
  973. __showLoading();
  974. $.ajax({
  975. type: "POST",
  976. url: "TableView.action",
  977. contentType : "application/json",
  978. dataType:"html",
  979. data: JSON.stringify(json),
  980. success: function(resp){
  981. __hideLoading();
  982. $("#c_" + compId + " div.cctx div.ccctx").html(resp);
  983. },
  984. error:function(resp){
  985. __hideLoading();
  986. $.messager.alert('出错了','系统出错,请联系管理员。','error');
  987. }
  988. });
  989. }
  990. function dimsort(tp){
  991. var dimid = curTmpInfo.ckid;
  992. var compId = curTmpInfo.compId;
  993. var pos = curTmpInfo.pos;
  994. var name = curTmpInfo.dimname;
  995. //获取组件的JSON对象
  996. var comp = findCompById(compId);
  997. var dims = null;
  998. if(pos == 'col'){
  999. dims = comp.cols;
  1000. }else{
  1001. dims = comp.rows;
  1002. }
  1003. for(var i=0; i<dims.length; i++){
  1004. if(dims[i].id == dimid){
  1005. dims[i].dimord = tp;
  1006. break;
  1007. }
  1008. }
  1009. //进行维度排序时,清除度量的排序信息
  1010. for(i=0; i<comp.kpiJson.length; i++){
  1011. comp.kpiJson[i].sort = '';
  1012. }
  1013. curTmpInfo.isupdate = true;
  1014. tableView(comp, compId);
  1015. }
  1016. function kpisort(tp){
  1017. var kpiId = curTmpInfo.ckid;
  1018. var compId = curTmpInfo.compId;
  1019. var comp = findCompById(compId);
  1020. for(i=0; i<comp.kpiJson.length; i++){
  1021. if(comp.kpiJson[i].kpi_id == kpiId){
  1022. comp.kpiJson[i].sort = tp;
  1023. }else{
  1024. comp.kpiJson[i].sort = '';
  1025. }
  1026. }
  1027. curTmpInfo.isupdate = true;
  1028. tableView(comp, compId);
  1029. }
  1030. //添加维度聚合项
  1031. function aggreDim(){
  1032. var dimid = curTmpInfo.ckid;
  1033. var compId = curTmpInfo.compId;
  1034. var pos = curTmpInfo.pos;
  1035. var name = curTmpInfo.dimname;
  1036. //获取组件的JSON对象
  1037. var comp = findCompById(compId);
  1038. var dims = null;
  1039. if(pos == 'col'){
  1040. dims = comp.cols;
  1041. }else{
  1042. dims = comp.rows;
  1043. }
  1044. var dim = null;
  1045. for(var i=0; i<dims.length; i++){
  1046. if(dims[i].id == dimid){
  1047. dim = dims[i];
  1048. }
  1049. }
  1050. if(dim.issum == 'y'){
  1051. dim.issum = "n";
  1052. delete dim.aggre;
  1053. curTmpInfo.isupdate = true;
  1054. tableView(comp, compId);
  1055. return;
  1056. }
  1057. var ctx = "<div style='line-height:30px; margin:20px 5px 5px 10px;'><label><input value='auto' id='autoaggre' name='autoaggre' type='checkbox'>自动聚合</label> (设置后,聚合方式的选择功能既无效)<br/>聚合方式:<select id=\"dimaggre\" name=\"dimaggre\"><option value=\"sum\">求和</option><option value=\"count\">计数</option><option value=\"avg\">平均</option><option value=\"max\">最大</option><option value=\"min\">最小</option><option value=\"var\">方差</option><option value=\"sd\">标准差</option><option value=\"middle\">中位数</option></select></div>";
  1058. $('#pdailog').dialog({
  1059. title: '维度聚合',
  1060. width: 320,
  1061. height: 200,
  1062. closed: false,
  1063. cache: false,
  1064. modal: true,
  1065. toolbar:null,
  1066. content: ctx,
  1067. buttons:[{
  1068. text:'确定',
  1069. iconCls:'icon-ok',
  1070. handler:function(){
  1071. if(dim.issum == 'y'){
  1072. dim.issum = "n";
  1073. delete dim.aggre;
  1074. }else{
  1075. var autoaggre = $("#pdailog input[name='autoaggre']:checked").size();
  1076. if(autoaggre == 1){
  1077. dim.aggre = "auto";
  1078. }else{
  1079. dim.aggre = $("#pdailog #dimaggre").val();
  1080. }
  1081. dim.issum = 'y';
  1082. }
  1083. curTmpInfo.isupdate = true;
  1084. tableView(comp, compId);
  1085. $('#pdailog').dialog('close');
  1086. }
  1087. },{
  1088. text:'取消',
  1089. iconCls:"icon-cancel",
  1090. handler:function(){
  1091. $('#pdailog').dialog('close');
  1092. }
  1093. }]
  1094. });
  1095. $("#pdailog input[name='autoaggre']").click(function(){
  1096. var sel = $(this).attr("checked");
  1097. if(sel){
  1098. $("#pdailog #dimaggre").attr("disabled", "true");
  1099. }else{
  1100. $("#pdailog #dimaggre").removeAttr("disabled");
  1101. }
  1102. });
  1103. }
  1104. function dimkpimove(tp){
  1105. var dimid = curTmpInfo.ckid;
  1106. var compId = curTmpInfo.compId;
  1107. var pos = curTmpInfo.pos;
  1108. var name = curTmpInfo.dimname;
  1109. //获取组件的JSON对象
  1110. var comp = findCompById(compId);
  1111. var dims = null;
  1112. if(pos == 'col'){
  1113. dims = comp.cols;
  1114. }else if(pos =="row"){
  1115. dims = comp.rows;
  1116. }else if(pos == "kpi"){
  1117. dims = comp.kpiJson;
  1118. }
  1119. if(dims.length <= 1){
  1120. msginfo('无效移动。');
  1121. return;
  1122. }
  1123. for(var i=0; i<dims.length; i++){
  1124. if((pos=="kpi"?dims[i].kpi_id:dims[i].id) == dimid){
  1125. if(tp == 'left'){
  1126. if(i <= 0){
  1127. msginfo('无效移动。');
  1128. return;
  1129. }else{
  1130. var tp = dims[i - 1];
  1131. dims[i - 1] = dims[i];
  1132. dims[i] = tp;
  1133. //交换维度
  1134. $("#tableData #"+(pos=="kpi"?"k":"d")+"_"+dimid).prev().before($("#tableData #"+(pos=="kpi"?"k":"d")+"_"+dimid));
  1135. curTmpInfo.isupdate = true;
  1136. tableView(comp, compId);
  1137. return;
  1138. }
  1139. }else
  1140. if(tp == 'right'){
  1141. if( i >= dims.length - 1){
  1142. msginfo('无效移动。');
  1143. return;
  1144. }else{
  1145. var tp = dims[i + 1];
  1146. dims[i + 1] = dims[i];
  1147. dims[i] = tp;
  1148. //交换维度
  1149. $("#tableData #"+(pos=="kpi"?"k":"d")+"_"+dimid).next().after($("#tableData #"+(pos=="kpi"?"k":"d")+"_"+dimid));
  1150. curTmpInfo.isupdate = true;
  1151. tableView(comp, compId);
  1152. return;
  1153. }
  1154. }
  1155. break;
  1156. }
  1157. }
  1158. }
  1159. //维度交换行列
  1160. function dimexchange(){
  1161. var dimid = curTmpInfo.ckid;
  1162. var compId = curTmpInfo.compId;
  1163. var pos = curTmpInfo.pos;
  1164. var name = curTmpInfo.dimname;
  1165. //获取组件的JSON对象
  1166. var comp = findCompById(compId);
  1167. if(pos == 'col'){
  1168. //先移除维度
  1169. var idx = 0;
  1170. var tmp = null;
  1171. var dims = comp.cols;
  1172. for(var i=0; i<dims.length; i++){
  1173. if(dims[i].id == dimid){
  1174. idx = i;
  1175. tmp = dims[i];
  1176. break;
  1177. }
  1178. }
  1179. comp.cols.splice(idx, 1);
  1180. //再添加维度
  1181. comp.rows.push(tmp);
  1182. //移除维度dom
  1183. $("#tableData #d_"+dimid).remove();
  1184. //列字段添加维度
  1185. var o = "<span id=\"d_"+tmp.id+"\" class=\"dimcol\"><span class=\"text\">"+tmp.dimdesc+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setRdimInfo(this, "+tmp.id+", '"+tmp.dimdesc+"','"+compId+"')\"><i class=\"fa fa-wrench\"></i></button></div></span>";
  1186. if($("#tableData #tabRows span.dimcol").size() > 0){
  1187. $("#tableData #tabRows span.dimcol").last().after(o);
  1188. }else{
  1189. $("#tableData #tabRows b").after(o);
  1190. }
  1191. if(comp.cols.length == 0){
  1192. $("#tableData #tabCols").remove();
  1193. }
  1194. }
  1195. if(pos == 'row'){
  1196. //先移除维度
  1197. var idx = 0;
  1198. var tmp = null;
  1199. var dims = comp.rows;
  1200. for(var i=0; i<dims.length; i++){
  1201. if(dims[i].id == dimid){
  1202. idx = i;
  1203. tmp = dims[i];
  1204. break;
  1205. }
  1206. }
  1207. comp.rows.splice(idx, 1);
  1208. //再添加维度
  1209. comp.cols.push(tmp);
  1210. //移除维度dom
  1211. $("#tableData #d_"+dimid).remove();
  1212. //列字段添加维度
  1213. var cols = comp.cols;
  1214. if(cols.length == 1){
  1215. $("#tableData").append("<span id=\"tabCols\"> &nbsp; &nbsp; <b>列字段:</b></span>");
  1216. }
  1217. $("#tableData #tabCols").append("<span id=\"d_"+tmp.id+"\" class=\"dimcol\"><span class=\"text\">"+tmp.dimdesc+"</span><div class=\"ibox-tools\"><button class=\"btn btn-outline btn-success btn-xs\" onclick=\"setCdimInfo(this, "+tmp.id+", '"+tmp.dimdesc+"','"+compId+"')\"><i class=\"fa fa-wrench\"></i></button></div></span>");
  1218. }
  1219. curTmpInfo.isupdate = true;
  1220. tableView(comp, compId);
  1221. }
  1222. function kpiproperty(){
  1223. var kpiId = curTmpInfo.ckid;
  1224. var compId = curTmpInfo.compId;
  1225. var comp = findCompById(compId);
  1226. var kpi = findKpiById(kpiId, comp.kpiJson);
  1227. var ctx = "<div id=\"table_cell_tab\" style=\"height:auto; width:auto;\"><div title=\"基本信息\"><div style='line-height:25px; margin:10px;'><span class=\"inputtext\">度量名称:</span><input type=\"text\" id=\"name\" name=\"name\" class=\"inputform2\" value=\""+(kpi.kpi_name)+"\"><br><span class=\"inputtext\">所 属 表:</span> "+comp.tname+"<br><span class=\"inputtext\">对应字段:</span>"+kpi.col_name+"<br><span class=\"inputtext\">度量单位:</span><select id=\"kpiunit\" name=\"kpiunit\" class=\"inputform2\"><option value='1'></option><option value='1000'>千</option><option value='10000'>万</option><option value='1000000'>百万</option><option value='100000000'>亿</option></select>"+kpi.unit+"<br><span class=\"inputtext\">格 式 化:</span>"+
  1228. "<select id=\"fmt\" name=\"fmt\" class=\"inputform2\"><option value=\"###,##0\">整数</option><option value=\"###,##0.0\">小数(保留1位)</option><option value=\"###,##0.00\">小数(保留2位)</option><option value=\"0.00%\">百分比</option></select><br/><span class=\"inputtext\">表头排序:</span><div class=\"checkbox checkbox-info checkbox-inline\" style=\"line-height:20px;\"><input type=\"checkbox\" id=\"headsort\" name=\"headsort\" "+(kpi.order&&kpi.order=="y"?"checked":"")+"><label for=\"headsort\"> </label></div></div></div><div title=\"回调函数\"><div class=\"textpanel\">function <input type=\"text\" id=\"funcname\" name=\"funcname\" style=\"width:120px;\" class=\"inputform2\" value=\""+(kpi.funcname?kpi.funcname:"")+"\">(<b>value</b>, <b>col</b>, <b>row</b>, <b>data</b>){<br/><textarea id=\"code\" name=\"code\" cols=\"50\" rows=\"5\">"+(kpi.code?unescape(kpi.code):"")+"</textarea><br/>}<br/><a target=\"_blank\" href=\"../helper/callback.html\" id=\"helper\">帮助</a></div></div>";
  1229. $('#pdailog').dialog({
  1230. title: '度量属性',
  1231. width: 400,
  1232. height: 320,
  1233. closed: false,
  1234. cache: false,
  1235. modal: true,
  1236. toolbar:null,
  1237. content: ctx,
  1238. buttons:[{
  1239. text:'确定',
  1240. iconCls:'icon-ok',
  1241. handler:function(){
  1242. kpi.fmt = $("#pdailog #fmt").val();
  1243. kpi.rate = Number($("#pdailog #kpiunit").val());
  1244. kpi.kpi_name = $("#pdailog #name").val();
  1245. var headsort = $("#pdailog input[name='headsort']:checked").size();
  1246. if(headsort == 0){
  1247. kpi.order = "n";
  1248. }else{
  1249. kpi.order = "y";
  1250. }
  1251. var funcname = $("#table_cell_tab #funcname").val();
  1252. var code = $("#table_cell_tab #code").val();
  1253. if(funcname == "" && code == ""){
  1254. delete kpi.funcname;
  1255. delete kpi.code;
  1256. }else{
  1257. if(funcname == ""){
  1258. $("#pdailog #table_cell_tab").tabs("select", 1);
  1259. msginfo("函数名是必填项!");
  1260. $("#table_cell_tab #funcname").focus();
  1261. return;
  1262. }
  1263. if(code == ""){
  1264. $("#pdailog #table_cell_tab").tabs("select", 1);
  1265. msginfo("函数内容是必填项!");
  1266. $("#table_cell_tab #code").focus();
  1267. return;
  1268. }
  1269. kpi.funcname = funcname;
  1270. kpi.code = escape(code);
  1271. }
  1272. $('#pdailog').dialog('close');
  1273. curTmpInfo.isupdate = true;
  1274. tableView(comp, compId);
  1275. }
  1276. },{
  1277. text:'取消',
  1278. iconCls:"icon-cancel",
  1279. handler:function(){
  1280. $('#pdailog').dialog('close');
  1281. }
  1282. }]
  1283. });
  1284. $("#pdailog #table_cell_tab").tabs({border:false,fit:true});
  1285. $("#pdailog #table_cell_tab #helper").linkbutton({iconCls:'icon-tip'});
  1286. //让格式化、聚合方式选中
  1287. $("#pdailog #fmt").find("option[value='"+kpi.fmt+"']").attr("selected",true);
  1288. $("#pdailog #kpiunit").find("option[value='"+kpi.rate+"']").attr("selected",true);
  1289. $("#pdailog #aggreType").find("option[value='"+kpi.aggre+"']").attr("selected",true);
  1290. }
  1291. function setKpiInfo(ts, id, compId){
  1292. var offset = $(ts).offset();
  1293. //放入临时对象中,方便下次获取
  1294. curTmpInfo.ckid = id;
  1295. curTmpInfo.compId = compId;
  1296. curTmpInfo.pos = "kpi";
  1297. var comp = findCompById(compId);
  1298. //设置度量排序的标识
  1299. var kpi = findKpiById(id, comp.kpiJson);
  1300. if(kpi.sort == 'asc'){
  1301. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord1")).target, iconCls:"icon-ok"});
  1302. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord2")).target, iconCls:"icon-blank"});
  1303. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord3")).target, iconCls:"icon-blank"});
  1304. }else if(kpi.sort == 'desc'){
  1305. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord1")).target, iconCls:"icon-blank"});
  1306. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord2")).target, iconCls:"icon-ok"});
  1307. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord3")).target, iconCls:"icon-blank"});
  1308. }else{
  1309. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord1")).target, iconCls:"icon-blank"});
  1310. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord2")).target, iconCls:"icon-blank"});
  1311. $("#kpioptmenu").menu("setIcon", {target:$("#kpioptmenu").menu("getItem", $("#k_kpi_ord3")).target, iconCls:"icon-ok"});
  1312. }
  1313. $("#kpioptmenu").menu("show", {left:offset.left, top:offset.top - 100});
  1314. }
  1315. function setCdimInfo(ts, id, name, compId){
  1316. var offset = $(ts).offset();
  1317. //放入临时对象中,方便下次获
  1318. curTmpInfo.ckid = id;
  1319. curTmpInfo.compId = compId;
  1320. curTmpInfo.pos = "col";
  1321. curTmpInfo.dimname = name;
  1322. //设置聚合菜单
  1323. var issum = false;
  1324. var comp = findCompById(compId);
  1325. var dims = comp.cols;
  1326. for(var i=0; i<dims.length; i++){
  1327. if(dims[i].id == id){
  1328. if(dims[i].issum == 'y'){
  1329. issum = true;
  1330. break;
  1331. }
  1332. }
  1333. }
  1334. if(issum){
  1335. var aggr = $("#dimoptmenu").menu("getItem", $("#m_aggre"));
  1336. $("#dimoptmenu").menu("setText", {target:aggr.target, text:"取消聚合"});
  1337. }else{
  1338. var aggr = $("#dimoptmenu").menu("getItem", $("#m_aggre"));
  1339. $("#dimoptmenu").menu("setText", {target:aggr.target, text:"聚合..."});
  1340. }
  1341. //设置移至行、列的文本
  1342. var aggr = $("#dimoptmenu").menu("getItem", $("#m_moveto"));
  1343. $("#dimoptmenu").menu("setText", {target:aggr.target, text:"移至行字段"});
  1344. $("#dimoptmenu").menu("show", {left:offset.left, top:offset.top - 124});
  1345. }
  1346. function getDimTop(){
  1347. var dimid = curTmpInfo.ckid;
  1348. var compId = curTmpInfo.compId.replace("T", "");
  1349. var pos = curTmpInfo.pos;
  1350. var name = curTmpInfo.dimname;
  1351. var comp = findCompById(compId);
  1352. var dim = null;
  1353. var dims = null;
  1354. if(pos == 'col'){
  1355. dims = comp.cols;
  1356. }else{
  1357. dims = comp.rows;
  1358. }
  1359. for(var i=0; i<dims.length; i++){
  1360. if(dims[i].id == dimid){
  1361. dim = dims[i];
  1362. break;
  1363. }
  1364. }
  1365. var ctx = "<div style=\"margin:20px;\"><span class=\"inputtext\">维度取Top:</span><input type=\"text\" id=\"top\" name=\"top\" size=\"5\" value=\""+(dim.top?dim.top:"")+"\"><br/><span class=\"inputtext\"></span><select id=\"type\" name=\"type\" class=\"inputform2\"><option value=\"number\" "+(dim.topType=="number"?"selected":"")+">数字</option><option value=\"percent\" "+(dim.topType=="percent"?"selected":"")+">百分比</option></select></div>";
  1366. $('#pdailog').dialog({
  1367. title: '维度取Top',
  1368. width: 360,
  1369. height: 170,
  1370. closed: false,
  1371. cache: false,
  1372. modal: true,
  1373. toolbar:null,
  1374. content: ctx,
  1375. buttons:[{
  1376. text:'完成',
  1377. iconCls:"icon-ok",
  1378. handler:function(){
  1379. var top = $("#pdailog #top").numberbox("getValue");
  1380. var type = $("#pdailog #type").val();
  1381. dim.top = top;
  1382. dim.topType = type;
  1383. curTmpInfo.isupdate = true;
  1384. $('#pdailog').dialog('close');
  1385. tableView(comp, compId);
  1386. }
  1387. },{
  1388. text:'取消',
  1389. iconCls:"icon-cancel",
  1390. handler:function(){
  1391. $('#pdailog').dialog('close');
  1392. }
  1393. }]
  1394. });
  1395. $("#pdailog #top").numberbox({width:180, height:28});
  1396. }
  1397. function setRdimInfo(ts, id, name, compId){
  1398. var offset = $(ts).offset();
  1399. curTmpInfo.ckid = id;
  1400. curTmpInfo.compId =compId;
  1401. curTmpInfo.pos = "row";
  1402. curTmpInfo.dimname = name;
  1403. //设置聚合菜单
  1404. var issum = false;
  1405. var comp = findCompById(compId);
  1406. var dims = comp.rows;
  1407. for(var i=0; i<dims.length; i++){
  1408. if(dims[i].id == id){
  1409. if(dims[i].issum == 'y'){
  1410. issum = true;
  1411. break;
  1412. }
  1413. }
  1414. }
  1415. if(issum){
  1416. var aggr = $("#dimoptmenu").menu("getItem", $("#m_aggre"));
  1417. $("#dimoptmenu").menu("setText", {target:aggr.target, text:"取消聚合"});
  1418. }else{
  1419. var aggr = $("#dimoptmenu").menu("getItem", $("#m_aggre"));
  1420. $("#dimoptmenu").menu("setText", {target:aggr.target, text:"聚合"});
  1421. }
  1422. $("#dimoptmenu").menu("setText", {target:$("#m_moveto"), text:"移至列字段"});
  1423. $("#dimoptmenu").menu("show", {left:offset.left, top:offset.top - 120});
  1424. }
  1425. /**
  1426. 判断是否存在date类型的维度,比如day/month/quarter/year
  1427. **/
  1428. function isExistDateDim(comp, tp){
  1429. var ret = false;
  1430. if(tp == 'table'){
  1431. if(!comp.cols){
  1432. return ret;
  1433. }
  1434. for(var i=0; i<comp.cols.length; i++){
  1435. if(comp.cols[i].grouptype == 'date'){
  1436. ret = true;
  1437. break;
  1438. }
  1439. }
  1440. if( !comp.rows){
  1441. return ret;
  1442. }
  1443. for(var i=0; i<comp.rows.length; i++){
  1444. if(comp.rows[i].grouptype == 'date'){
  1445. ret = true;
  1446. break;
  1447. }
  1448. }
  1449. }
  1450. if(tp == 'chart'){
  1451. if(!comp.chartJson || !comp.chartJson.params){
  1452. return ret;
  1453. }
  1454. for(var i=0; i<comp.chartJson.params.length; i++){
  1455. if(comp.chartJson.params[i].grouptype == 'date'){
  1456. ret = true;
  1457. break;
  1458. }
  1459. }
  1460. if(!comp.chartJson || !comp.chartJson.xcol){
  1461. return ret;
  1462. }
  1463. if(comp.chartJson.xcol.grouptype == 'date'){
  1464. ret = true;
  1465. }
  1466. }
  1467. return ret;
  1468. }
  1469. function kpiExist(kpiId, kpis){
  1470. var ret = false;
  1471. if(!kpis || kpis == null){
  1472. return ret;
  1473. }
  1474. for(var i=0; i<kpis.length; i++){
  1475. if(kpis[i].kpi_id == kpiId){
  1476. ret = true;
  1477. break;
  1478. }
  1479. }
  1480. return ret;
  1481. }
  1482. function dimExist(dimId, dims){
  1483. var ret = false;
  1484. if(!dims || dims == null){
  1485. return ret;
  1486. }
  1487. for(var i=0; i<dims.length; i++){
  1488. if(dims[i].id == dimId){
  1489. ret = true;
  1490. break;
  1491. }
  1492. }
  1493. return ret;
  1494. }
  1495. function deletecomp(layoutId, compId){
  1496. if(!confirm("是否确认删除组件?")){
  1497. return;
  1498. }
  1499. //从布局器中删除,
  1500. var td = findLayoutById(layoutId);
  1501. var compIdx = -1;
  1502. for(var i=0; i<td.children.length; i++){
  1503. if(td.children[i].id == compId){
  1504. compIdx = i;
  1505. break;
  1506. }
  1507. }
  1508. td.children.splice(compIdx, 1);
  1509. //从临时组件列表中移除
  1510. var idx = findCompById(compId, true);
  1511. curTmpInfo.comps.splice(idx, 1);
  1512. //页面移除
  1513. $("#c_"+compId).remove();
  1514. //移除数据面板
  1515. $('#Jlayout').layout("remove", "south");
  1516. //移除属性面板
  1517. $('#Jlayout').layout("remove", "east");
  1518. curTmpInfo.isupdate = true;
  1519. }
  1520. function findCompById(compId, returnIndex){
  1521. var idx = -1;
  1522. var comp = null;
  1523. for(var i=0; curTmpInfo.comps&&i<curTmpInfo.comps.length; i++){
  1524. if(curTmpInfo.comps[i].id == compId){
  1525. comp = curTmpInfo.comps[i];
  1526. idx = i;
  1527. break;
  1528. }
  1529. }
  1530. //返回序列号
  1531. if(returnIndex && returnIndex == true){
  1532. return idx;
  1533. }else{
  1534. return comp; //返回对象
  1535. }
  1536. }
  1537. function findParamById(pid){
  1538. var ret = null;
  1539. for(i=0; pageInfo.params&&i<pageInfo.params.length; i++){
  1540. var p = pageInfo.params[i];
  1541. if(p.id == pid){
  1542. ret = p;
  1543. break;
  1544. }
  1545. }
  1546. return ret;
  1547. }
  1548. function findKpiById(kpiId, kpis){
  1549. var ret = null;
  1550. if(!kpis || kpis == null){
  1551. return ret;
  1552. }
  1553. for(var i=0; i<kpis.length; i++){
  1554. if(kpis[i].kpi_id == kpiId){
  1555. ret = kpis[i];
  1556. break;
  1557. }
  1558. }
  1559. return ret;
  1560. }
  1561. function newGuid()
  1562. {
  1563. var guid = "";
  1564. for (var i = 1; i <= 32; i++){
  1565. var n = Math.floor(Math.random()*16.0).toString(16);
  1566. guid += n;
  1567. //if((i==8)||(i==12)||(i==16)||(i==20))
  1568. // guid += "-";
  1569. }
  1570. return guid;
  1571. }