objEdit.jsp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" %>
  2. <%@ taglib uri="/ssTag" prefix="ss"%>
  3. <%pageContext.setAttribute("wdpageinformation","{'hastab':'1'}");%>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. <script>window.loginStatus="${empty sessionScope['ssUser']?'0':'1'}"</script>
  11. <ss:skin file='main.css'/>
  12. <script type="text/javascript" src="/ss/jquery/jquery.js"></script>
  13. <script type="text/javascript" src="/ss/artdialog/artDialogUtil.js"></script>
  14. <script type="text/javascript" src="/ss/js/base.js"></script>
  15. <script> if(!window.wd) var wd={}; if(!wd.display) wd.display={}; wd.display.wdDialogId="objEdit"; if(!wd.app) wd.app={}; wd.app.name='pms';</script>
  16. <script type="text/javascript" src="/ss/js/masklayer.js"></script>
  17. <script type="text/javascript" src="/ss/js/wdDialogInit.js"></script>
  18. <script type="text/javascript" src="/ss/js/common.js"></script>
  19. <script type="text/javascript" src="/ss/js/display.js"></script>
  20. <script type="text/javascript" src="/ss/js/edit.js"></script>
  21. <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.js"></script>
  22. <script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.iframehelper.min.js"></script>
  23. <%-- 新UI引入的JS --%>
  24. <script src="/js/load.js"></script> <%-- ="/newUI/ss/js/base.js"。Lin(新UI) --%>
  25. </head>
  26. <body>
  27. <%
  28. pageContext.setAttribute("dataType","update");
  29. %>
  30. <%-- 改为 <data@ss name="obj"/>。Lin
  31. <tab@ss name=""/> --%>
  32. <%-- <data@ss name="obj"/> 再去掉,好像不需要。Lin --%>
  33. <ss:tab name='editBaseInfo,child'/>
  34. <%-- 改为 <jsp@ss file=。Lin
  35. <tab@ss name="tagState"/> --%>
  36. <%@include file="/ss/clip/tabState.jsp"%>
  37. <script>
  38. function addWdFitHeight(selecter,param){
  39. console.log(selecter);
  40. console.log(param);
  41. var aa="";
  42. if(param.minHeight){
  43. aa+="min:"+param.minHeight+",";
  44. }
  45. if(param.maxHeight){
  46. aa+="max:"+param.maxHeight+",";
  47. }
  48. if(param&&aa){
  49. aa=aa.substr(0,aa.length-1)
  50. document.querySelector(selecter).setAttribute("ssFith",aa); // ("wdFitHeight",。Lin
  51. }
  52. }
  53. </script>
  54. <%--<div class="tab-div" >
  55. <ul ssNormClazz="tab-normal" ssHovClazz="tab-hover" ssSelClazz="tab-selected">
  56. <ss:rpt name='${tabList}' id='item'>
  57. <li name="${item.name}"--%><%-- wdTabSite="${item.wdTabSite}"。先去掉,用到再弄。好像是 个人选项卡 的东西。Lin --%>
  58. <%--_sizeinfo="width:${item.width},height:${item.height},minHeight:${item.minHeight},maxHeight:${item.maxHeight}"
  59. ssTabClick="<ss:serv name='${item.servName}' dest='${item.dest}' parm='${item.parm}'/>">
  60. ${item.desc}
  61. </li>
  62. </ss:rpt>
  63. </ul>
  64. </div>
  65. <div>
  66. <iframe frameborder="none" name="ssTabIframe" width="100%" id="" style="height:100%"></iframe>
  67. </div>--%>
  68. <div id="app">
  69. <div class="project-edit-container">
  70. <ss-sub-tab
  71. :menu-list="tabConfig"
  72. active-menu="相对方"
  73. @menu-change="handleMenuChange"
  74. :left-display="leftDisplay"
  75. :footer-buttons="footerButtons"
  76. />
  77. <!-- @menu-change="handleMenuChange"
  78. -->
  79. </div>
  80. </div>
  81. <script>
  82. var tabHeight=<ss:txt val='${tabHeight}'/>;
  83. addWdFitHeight("[name=ssTabIframe]",tabHeight); // ("[name=wdTabFrame]",。Lin
  84. $(document).ready(function(){
  85. /* 改,规范 wdTabFrame 命名。Lin
  86. $("iframe[name=wdTabFrame]").height($("iframe[name=wdTabFrame]").height() - 2)
  87. */ $("iframe[name=ssTabIframe]").height($("iframe[name=ssTabIframe]").height() -2)
  88. })
  89. </script>
  90. <script type="text/javascript">var wdRecordValue='${wdRecordValue}';</script>
  91. <script type="text/javascript" src="/ss/js/wdRecord.js"></script>
  92. <script type="text/javascript">(function(){wdRecord("objEdit");})();</script>
  93. <script type="text/javascript" src="/ss/js/wdFitHeight.js"></script>
  94. <script type="text/javascript">initWdFitHeight(31)</script>
  95. <script type="text/javascript">initWdFitHeightFunction=function(){initWdFitHeight(31);};</script>
  96. <script type='text/javascript'>wd.display.wdTabNo='${ssNextTabNo}';</script><script type="text/javascript" src="/ss/js/wdDrag.js"></script>
  97. <script type="text/javascript" src="/ss/js/configurableTab.js"></script>
  98. <script type="text/javascript">
  99. wd.configurableTab.init(1,"objEdit");</script>
  100. <ss:equal val="${empty resizeComponent}" val2="false">
  101. <script>{var iframe=wd.display.getFrameOfWindow();
  102. if(iframe&&iframe.contentWindow==window)
  103. wd.display.resizeComponent(${resizeComponent.width}, ${resizeComponent.height}, ${empty resizeComponent.minHeight?'null':resizeComponent.minHeight}, ${empty resizeComponent.maxHeight?'null':resizeComponent.maxHeight});}</script>
  104. </ss:equal>
  105. <ss:help/>
  106. </body>
  107. <script type="text/javascript">
  108. try{wd.display.showMsgPopup('${msg}');
  109. }catch(err){console.error(err);}
  110. </script>
  111. <ss:equal val="${empty wdclosewindowparam}" val2="false">
  112. <script type="text/javascript">
  113. try{wd.display.setCloseWindowParam('${wdclosewindowparam}');
  114. }catch(err){console.error(err);}
  115. </script>
  116. </ss:equal>
  117. </html>
  118. <script type="text/javascript">
  119. <%-- 增加初始化选项卡json start Ben --%>
  120. window.SS.dom.tabConfig = window.SS.dom.tabConfig || [];
  121. <ss:rpt name='${tabList}' id='item'>
  122. {
  123. let item = {
  124. url: "<ss:serv name='${item.servName}' dest='${item.dest}' parm='${item.parm}'/>",
  125. <%--url: "<ss:serv name='${item.servName}' dest='${item.dest}' parm='{${item.paramStr},bdlbm:"${bdlbm}",sqid:"${sqid}"}'/>",--%>
  126. title:"${item.desc}",
  127. name:"${item.name}",
  128. <%-- 下面的属性是为了计算选项卡高度fitHeight准备的 --%>
  129. width:"${item.width}",
  130. height:"${item.height}",
  131. minHeight:"${item.minHeight}",
  132. maxHeight:"${item.maxHeight}",
  133. iconName:"${item.iconName}",
  134. pobj:"${item.pobj}",
  135. cobj:"${item.cobj}"
  136. };
  137. window.SS.dom.tabConfig.push(item);
  138. }
  139. </ss:rpt>
  140. console.log('tabConfig:'+JSON.stringify(window.SS.dom.tabConfig));
  141. <%-- 增加初始化选项卡json end Ben --%>
  142. tokenCleanser("<ss:serv name='ss.clearPageToken'/>", {tokenList:"<%= pageContext.getAttribute(ss.page.PageC.PAGE_tokenList)%>"});
  143. </script>
  144. <script type="module">
  145. //在本窗口提交表单
  146. function doThisWindowSaveAndCommit(){
  147. let url = "<ss:serv name='${saveAndCommit}' dest='${saveAndCommitDest}' parm='${saveAndCommitParam}' />";
  148. <%--let saveAndCommit = '${saveAndCommit}';--%>
  149. <%--let saveAndCommitDest = '${saveAndCommitDest}';--%>
  150. <%--let saveAndCommitParam = '${saveAndCommitParam}';--%>
  151. <%--let dataType = '${dataType}';--%>
  152. // let url = '';
  153. <%-- doThisWindowSaveAndCommit这个JS方法已经没用了 先注释掉让它不报错。Ben(20251124)
  154. let width = ${saveAndCommitwidth};
  155. let height = ${saveAndCommitheight};
  156. let minHeight = ${saveAndCommitminheight};
  157. let maxHeight = ${saveAndCommitmaxheight};
  158. --%>
  159. const f = document.getElementById("commitForm");
  160. f.action = url;
  161. wd.display.resizeComponent(width, height, minHeight, maxHeight);
  162. f.submit();<%-- 提交表单 --%>
  163. }
  164. const data = {
  165. tabConfig: window.SS.dom.tabConfig.map(tab => ({
  166. ...tab,
  167. cgxList: false,
  168. })),
  169. leftDisplay: true,
  170. footerButtons: [
  171. {
  172. text: "保存并提交",
  173. //功能: SsSubTab 底部按钮改为 icon-base 图标+文字(收起仅显示图标)by xu 20251224
  174. iconName: "icon-subm",
  175. onclick: function(){
  176. // 左侧区域隐藏
  177. const app = window.SS.dom.currentApp;
  178. // 等待iframe加载完成后执行
  179. const $iframe = $('#sub-tab-iframe');
  180. if ($iframe.length) {
  181. const $saveAndCommitBtn = $iframe.contents().find('#saveAndCommit');
  182. if ($saveAndCommitBtn.length) {
  183. // 修复 objChg 校验未通过也隐藏左侧栏:先在子页面执行校验,失败则直接返回 by xu 20260115
  184. try {
  185. const iframeWin = $iframe.get(0) && $iframe.get(0).contentWindow;
  186. const needValidate = iframeWin && iframeWin.ssVm && iframeWin.ssVm.validations && iframeWin.ssVm.validations.size > 0;
  187. if (needValidate) {
  188. const validateResult = iframeWin.ssVm.validateAll && iframeWin.ssVm.validateAll();
  189. if (validateResult && validateResult.valid === false) {
  190. return;
  191. }
  192. }
  193. } catch (e) {
  194. console.error(e);
  195. }
  196. // 修复 objChg 点击保存并提交未触发子页按钮(id 在组件外层div,需点击内部button)by xu 20260115
  197. const $realClickBtn = $saveAndCommitBtn.is('button')
  198. ? $saveAndCommitBtn
  199. : $saveAndCommitBtn.find('button').first();
  200. ($realClickBtn.length ? $realClickBtn.get(0) : $saveAndCommitBtn.get(0)).click();
  201. if (app) {
  202. app.$data.leftDisplay = false;
  203. }
  204. // 修复 objChg 点击保存并提交后右侧内容区需去掉margin by xu 20260115
  205. $(".project-edit-container .content-area").css("margin", "0");
  206. $(".sub-tab-iframe").css('display', 'none');
  207. $("#sub-tab-iframe").css('display', '');
  208. } else {
  209. //在本窗口提交表单
  210. doThisWindowSaveAndCommit();
  211. // console.error('未找到保存并提交按钮');
  212. // alert('未找到保存并提交按钮');
  213. }
  214. } else {
  215. //在本窗口提交表单
  216. doThisWindowSaveAndCommit();
  217. // console.error('未找到iframe元素');
  218. }
  219. },
  220. }
  221. ]
  222. }
  223. SS.ready(function () {
  224. const app = window.SS.dom.initializeFormApp({
  225. el: "#app",
  226. data(){
  227. return data;
  228. },
  229. methods:{
  230. handleMenuChange(menu){
  231. console.log('handleMenuChange', menu);
  232. },
  233. async showTagState(url) {
  234. // 从每个tab的url中提取token
  235. const tokenList = this.tabConfig.map(tab => {
  236. const match = /ssToken=([^&]+)/.exec(tab.url);
  237. return match ? match[1] : null;
  238. });
  239. try {
  240. const response = await $.post(url, {
  241. tokenList: JSON.stringify(tokenList)
  242. });
  243. const result = eval("(" + response + ")");
  244. // 更新每个tab的状态
  245. this.tabConfig = this.tabConfig.map((tab, index) => {
  246. if (!result[index]) return tab;
  247. return {
  248. ...tab,
  249. cgxList: result[index].cgxList === true,
  250. };
  251. });
  252. console.log('更新标签状态成功:', this.tabConfig);
  253. } catch (error) {
  254. console.error('获取标签状态失败:', error);
  255. }
  256. }
  257. },
  258. mounted() {
  259. this.showTagState("<ss:serv name='ss.wrTabState' parm='{ssObjName:"${ssObjName}",ssObjId:"${ssObjId}","${ssObjIdName}":"${ssObjId}",wdConfirmationCaptchaService:"0",dataType:"${dataType}"}'/>");
  260. }
  261. })
  262. window.SS.dom.currentApp = app;
  263. //功能: 启用 SsSubTab 弹窗顶部菜单模式切换按钮(旧UI dhtmlx 按钮)by xu 20251224
  264. (function tryEnableSsSubTabMenuModeButton() {
  265. try {
  266. if (wd && wd.display && wd.display.enableSsSubTabMenuModeButton && wd.display.enableSsSubTabMenuModeButton()) {
  267. return;
  268. }
  269. } catch (e) {
  270. console.log(e);
  271. }
  272. setTimeout(tryEnableSsSubTabMenuModeButton, 200);
  273. })();
  274. })
  275. </script>