skinConfigPageMarkup.htm 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. <!--
  2. IBM Confidential
  3. OCO Source Materials
  4. BI and PM: Mobile
  5. (C) Copyright IBM Corp. 2013. 2014
  6. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. -->
  8. <div id="_THIS_idFragmentContainer">
  9. <script type="text/javascript">
  10. dojo.require("dojo.NodeList-manipulate");
  11. var _THIS_skinAPI = {
  12. onFragmentVisibilityChange : function(){
  13. },
  14. chooseObject : function() {
  15. var url = '%GATEWAY%?b_action=xts.run&m=portal/select/select.xts&so.select=users.pw2&' +
  16. 'md.callBack=xml&md.displayOptions=h1&' +
  17. 'backURL=javascript:parent.ui_modal_dialog.close()';
  18. var iframeStaticHeight = parseInt(xClientHeight() * .75);
  19. var iframeStaticWidth = parseInt(xClientWidth() * .75);
  20. this.modalDialog = new ui_dialog('modalDialogViewer', '<string id=BROWSE_GROUP_BUTTON>', ui_dialog.style.BTN_NOBUTTONS | ui_dialog.style.CENTER | ui_dialog.style.IFRAME, -1, -1, iframeStaticWidth, iframeStaticHeight, _THIS_.div, url);
  21. this.modalDialog.show();
  22. this.skinModalDialog.disable();
  23. ccModalCallBack = dojo.hitch(this, this.selectGroupCallBack);
  24. },
  25. showAddSkin : function(skin){
  26. var modalSkinDialogTemplate = document.getElementById("_THIS_uploadSkin");
  27. var templateParent = modalSkinDialogTemplate.parentNode;
  28. templateParent.removeChild(modalSkinDialogTemplate);
  29. var skinDialog = modalSkinDialogTemplate.cloneNode("true");
  30. var dialogSection = document.getElementById("_THIS_dialogSection");
  31. dialogSection.appendChild(skinDialog);
  32. var title = "<string id=SKIN_ADD_TITLE>";
  33. if (skin){
  34. title = "<string id=SKIN_EDIT_TITLE>";
  35. }
  36. this.skinModalDialog = showModalDialog(ui_dialog.style.BTN_OKCANCEL, '_THIS_uploadSkin', title, document.body.clientHeight - 180, document.body.clientWidth - 80);
  37. if (skin){
  38. /* This has to happen after showModal as IE barks on the set of innerHTML of the label if we do not */
  39. var renderIDNode = document.getElementById("_THIS_RENDER_ID");
  40. renderIDNode.setAttribute("value", skin.render.id);
  41. var skinNameNode = document.getElementById("_THIS_SKINNAME");
  42. skinNameNode.setAttribute("value", skin.render.name);
  43. var groupIDNode = document.getElementById("_THIS_GROUP_ID");
  44. var groupIds = [];
  45. groupIds.push(skin.group.id);
  46. groupIDNode.setAttribute("value", dojo.toJson(groupIds));
  47. var groupNameField = document.getElementById("_THIS_GROUP");
  48. groupNameField.setAttribute("value", skin.group.name);
  49. document.getElementById("_THIS_BROWSE_LABEL").innerHTML="<string id=SKIN_EDIT_UPLOAD_TITLE>";
  50. }
  51. this.skinModalDialog.disable = dojo.hitch(this.skinModalDialog, function(){
  52. this.isDisabled=true;
  53. this.disabler = document.createElement("div");
  54. this.disabler.style.backgroundColor="#dddddd";
  55. this.disabler.style.width="100%";
  56. this.disabler.style.height="100%";
  57. this.disabler.style.position="absolute";
  58. this.disabler.style.top="0px";
  59. this.disabler.style.left="0px";
  60. this.disabler.style.opacity="0.5";
  61. this.disabler.style.filter="alpha(opacity=50))";
  62. this.dlg.appendChild(this.disabler);
  63. });
  64. this.skinModalDialog.enable = dojo.hitch(this.skinModalDialog, function(){
  65. this.isDisabled=false;
  66. this.dlg.removeChild(this.disabler);
  67. this.onactivate();
  68. });
  69. this.skinModalDialog.onactivate = dojo.hitch(this.skinModalDialog, function(){
  70. if (this.isDisabled){
  71. return;
  72. }
  73. else{
  74. ui_dialog.prototype.onactivate.apply(this, arguments);
  75. }
  76. });
  77. this.skinModalDialog.processCommand = dojo.hitch(this, function (btnType) {
  78. var close = true;
  79. try{
  80. if (btnType == ui_dialog.button.OK) {
  81. close = this._processSkinResult(skin != null);
  82. }
  83. }
  84. finally{
  85. if (close){
  86. this.skinModalDialog.destroy();
  87. templateParent.appendChild(modalSkinDialogTemplate);
  88. }
  89. }
  90. return close;
  91. });
  92. },
  93. _processSkinResult : function(isEdit){
  94. return this.submitForm(isEdit);
  95. },
  96. selectGroupCallBack : function(cmd, sResponse){
  97. this.skinModalDialog.enable();
  98. if(cmd == 'ok' && sResponse){
  99. var groupResponse = this._handleGroupResponse(sResponse);
  100. if (groupResponse.objectClass != "group" && groupResponse.objectClass != "role"){
  101. alert("<string id=SKINS_NOT_A_GROUP>");
  102. }
  103. else{
  104. document.getElementById("_THIS_GROUP").value=groupResponse.name;
  105. var groupPaths = document.getElementById("_THIS_GROUP_SEARCH_PATH");
  106. if (!groupPaths.groups){
  107. groupPaths.groups = [];
  108. }
  109. groupPaths.groups.length=0;
  110. groupPaths.groups.push(groupResponse.searchPath);
  111. }
  112. this.modalDialog.hide();
  113. this.modalDialog.destroy();
  114. this.modalDialog = null;
  115. }
  116. else{
  117. this.modalDialog.hide();
  118. this.modalDialog.destroy();
  119. this.modalDialog = null;
  120. }
  121. },
  122. _handleGroupResponse : function(sResponse){
  123. var response = this.decode(sResponse);
  124. var xml = new this.XMLBuilderLoadXMLFromString(response);
  125. if(xml)
  126. {
  127. var searchPathNode = _F_DOM.selectSingleNode(xml, "/return/object/item/name[text() = 'searchPath']/../value");
  128. var objectClassNode = _F_DOM.selectSingleNode(xml, "/return/object/item/name[text() = 'objectClass']/../value");
  129. var defaultNameNode = _F_DOM.selectSingleNode(xml, "/return/object/item/name[text() = 'defaultName']/../value");
  130. var nameNode = _F_DOM.selectSingleNode(xml, "/return/object/item/name[text() = 'name']/../value");
  131. var nameResponse = this.decode(_F_DOM.text(nameNode));
  132. nameResponse = "<root>"+nameResponse+"</root>";
  133. var nameXML = this.XMLBuilderLoadXMLFromString(nameResponse);
  134. var namePath = "/root/multilingualToken[@xml:lang = '" + _F_Config.productLocale + "']";
  135. var localizedNameNode = _F_DOM.selectSingleNode(nameXML, namePath);
  136. var group = {
  137. searchPath: _F_DOM.text(searchPathNode),
  138. objectClass: _F_DOM.text(objectClassNode),
  139. name: localizedNameNode != null ? _F_DOM.text(localizedNameNode) : _F_DOM.text(defaultNameNode)
  140. };
  141. return group;
  142. }
  143. },
  144. decode : function(text)
  145. {
  146. var amp_re = /&amp;/g;
  147. var lt_re = /&lt;/g;
  148. var gt_re = /&gt;/g;
  149. var apos_re = /&apos;/g;
  150. text = text.replace(lt_re, "<");
  151. text = text.replace(gt_re, ">");
  152. text = text.replace(apos_re, "'");
  153. text = text.replace(amp_re, "&");
  154. return text;
  155. },
  156. XMLBuilderLoadXMLFromString : function (markup)
  157. {
  158. var xmlDocument = null;
  159. if (typeof DOMParser != 'undefined')
  160. {
  161. xmlDocument = new DOMParser().parseFromString(markup, 'application/xml');
  162. }
  163. else if (typeof ActiveXObject != 'undefined')
  164. {
  165. try
  166. {
  167. xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
  168. xmlDocument.loadXML(markup);
  169. }
  170. catch (e)
  171. {
  172. }
  173. }
  174. return xmlDocument;
  175. },
  176. findErrorCode : function (messageSection, errorCodeStr){
  177. for (var x in messageSection){
  178. var val = messageSection[x];
  179. if (val.startsWith(errorCodeStr)){
  180. return val;
  181. }
  182. }
  183. },
  184. _handleJsonUploadResponse : function(jsonText){
  185. var response = dojo.fromJson(jsonText);
  186. if (response.result.code == "success"){
  187. this._updateSkinsList(response.result);
  188. }
  189. else{
  190. var message = this.findErrorCode(MOB.SVR, "MOB-SVR-"+code);
  191. alert(message);
  192. }
  193. },
  194. _handleXMLUploadResponse : function(xmlDoc){
  195. var xmlCode = _F_DOM.selectSingleNode(xmlDoc, ".//code");
  196. var code = _F_DOM.text(xmlCode);
  197. if (code === "success"){
  198. alert("<string id=SKIN_UPLOAD_SUCCESFULL>");
  199. }
  200. else{
  201. var message = this.findErrorCode(MOB.SVR, "MOB-SVR-"+code);
  202. alert(message);
  203. }
  204. },
  205. mobileSkinUploadResult : function(){
  206. var frame = document.getElementById("_THIS_formPoster");
  207. if (frame.contentWindow && frame.contentWindow.location.toString().indexOf("http")== 0){
  208. try
  209. {
  210. var doc = frame.contentWindow.document;
  211. var xmlDoc;
  212. if( typeof ActiveXObject != 'undefined') {
  213. xmlDoc = doc.XMLDocument;
  214. } else {
  215. xmlDoc = doc.documentElement;
  216. }
  217. if (xmlDoc && xmlDoc.nodeName !== "HTML"){
  218. this._handleXMLUploadResponse(xmlDoc);
  219. }
  220. else{
  221. var nodeList = dojo.query("*", frame.contentWindow.document.body);
  222. var jsonText = nodeList.text();
  223. this._handleJsonUploadResponse(jsonText);
  224. }
  225. }
  226. catch (err){
  227. alert("<string id=SKIN_FAILURE>");
  228. }
  229. finally{
  230. this.endBusy();
  231. }
  232. }
  233. },
  234. validateForm : function(isEdit){
  235. var valid=true;
  236. if (!isEdit){
  237. var groupPaths = document.getElementById("_THIS_GROUP_SEARCH_PATH");
  238. if (!groupPaths.groups){
  239. valid=false;
  240. }
  241. var upload = document.getElementById("_THIS_BROWSE");
  242. var value = upload.value;
  243. if (!value){
  244. valid=false;
  245. }
  246. if (!valid){
  247. alert("<string id=SKIN_GROUP_AND_ZIP_REQUIRED>");
  248. }
  249. }
  250. else{
  251. var groupPaths = document.getElementById("_THIS_GROUP_SEARCH_PATH");
  252. if (!groupPaths.groups || groupPaths.length == 0){
  253. var groupIDNode = document.getElementById("_THIS_GROUP_ID");
  254. var value = groupIDNode.getAttribute("value");
  255. if (!value){
  256. valid=false;
  257. }
  258. }
  259. var skinNameNode = document.getElementById("_THIS_SKINNAME");
  260. var value = skinNameNode.value;
  261. if (!value || value == ""){
  262. valid=false;
  263. }
  264. if (!valid){
  265. alert("<string id=SKIN_NAME_AND_GROUP_REQUIRED>");
  266. }
  267. }
  268. return valid;
  269. },
  270. submitForm : function(isEdit){
  271. if (this.validateForm(isEdit)){
  272. var groupPaths = document.getElementById("_THIS_GROUP_SEARCH_PATH");
  273. if (groupPaths.groups){
  274. groupPaths.value = dojo.toJson(groupPaths.groups);
  275. }
  276. this.startBusy();
  277. document.getElementById("_THIS_skin_form").submit();
  278. return true;
  279. }
  280. return false;
  281. },
  282. _updateSkinsList : function(response){
  283. var skinTable = document.getElementById("_THIS_SKIN_TABLE");
  284. var trs = skinTable.childNodes;
  285. var foundFirst = false;
  286. for (var i = trs.length -1; i >= 0; i--){
  287. var child = trs[i];
  288. if (child.tagName && child.tagName.toLowerCase() == "tr"){
  289. if (child.getAttribute("canDelete") != "false"){
  290. trs[i].parentNode.removeChild(trs[i]);
  291. }
  292. }
  293. }
  294. var skinObj = response.skins.skin;
  295. var skinList = [];
  296. if (skinObj && skinObj.length){
  297. skinList = skinObj;
  298. }
  299. else if (skinObj){
  300. skinList.push(skinObj);
  301. }
  302. for (var i=0; i < skinList.length; i++){
  303. this._addToSkinList(skinList[i], i);
  304. }
  305. },
  306. sendBrowseRequest : function(){
  307. var xhrArgs = {
  308. url: "%GATEWAY%/mobileService/skins/browse.json",
  309. handleAs: "json",
  310. load: dojo.hitch(this, function(data){
  311. this.endBusy();
  312. this._updateSkinsList(data);
  313. }),
  314. error: dojo.hitch(this, function(error){
  315. this.endBusy();
  316. alert("<string id=SKIN_FAILURE>");
  317. })
  318. };
  319. this.startBusy();
  320. var deferred = dojo.xhrGet(xhrArgs);
  321. },
  322. _addToSkinList: function(skin, index){
  323. var tr = document.createElement("tr");
  324. if (index % 2 == 0){
  325. tr.className="cogstyle-table-row-default";
  326. }
  327. else{
  328. tr.className="cogstyle-table-row-alternate";
  329. }
  330. tr.setAttribute("renderID", skin.render.id);
  331. dojo.place(
  332. "<td nowrap='' > "+
  333. "<input id='checkbox_select_render_" + skin.render.id + "' type='checkbox' > "+
  334. "<label for='checkbox_select_render_" + skin.render.id + "' style='display:none'>"+
  335. "<string id=SKIN_SELECT>" + skin.render.name + "</label>"+
  336. "</td>"+
  337. "<td nowrap='' style='text-align:left;'> "+
  338. "<table cellspacing='0' cellpadding='0' role='presentation'> "+
  339. "<tbody> "+
  340. "<tr> "+
  341. "<td style='padding:0px;white-space:nowrap;'>"+
  342. skin.render.name +
  343. "</td> "+
  344. "</tr> "+
  345. "</tbody> "+
  346. "</table> "+
  347. "</td> "+
  348. "<td nowrap='' style='text-align:left;'> "+
  349. "<table cellspacing='0' cellpadding='0' role='presentation'> "+
  350. "<tbody> "+
  351. "<tr> "+
  352. "<td style='padding:0px;white-space:nowrap;'>"+
  353. skin.group.name +
  354. "</td> "+
  355. "</tr> "+
  356. "</tbody> "+
  357. "</table> "+
  358. "</td> "+
  359. "<td nowrap='''><a href='javascript:noop()'><img role='button' border='0' title='<string id=SKIN_PROPERTIES>' alt='<string id=SKIN_PROPERTIES>' src='../ps/portal/images/action_properties.gif' style='vertical-align:middle;width:16px;' > </a>"+
  360. "</td> "+
  361. "</tr> ", tr);
  362. var skinTable = document.getElementById("_THIS_SKIN_TABLE");
  363. skinTable.appendChild(tr);
  364. var editImg = dojo.query("img", tr)[0];
  365. editImg.onclick=dojo.hitch(this, this.editRender, skin);
  366. },
  367. editRender : function(skinRender){
  368. this.showAddSkin(skinRender);
  369. },
  370. toggleSkinSelections : function(){
  371. var toggleNode = document.getElementById("_THIS_toggleAll");
  372. var skinTable = document.getElementById("_THIS_SKIN_TABLE");
  373. var trs = dojo.query("tr[renderID]", skinTable);
  374. for (var i = 0; i < trs.length; i++){
  375. var checkNodeList = dojo.query("input[type = 'checkbox']", trs[i]);
  376. if (checkNodeList.length > 0){
  377. checkNodeList[0].checked=toggleNode.checked;
  378. }
  379. }
  380. },
  381. removeSelectedSkins : function(){
  382. var skinTable = document.getElementById("_THIS_SKIN_TABLE");
  383. var trs = dojo.query("tr[renderID]", skinTable);
  384. var removed = [];
  385. for (var i = 0; i < trs.length; i++){
  386. var checkNodeList = dojo.query("input[type = 'checkbox']", trs[i]);
  387. if (checkNodeList.length > 0 && checkNodeList[0].checked){
  388. removed.push(trs[i].getAttribute("renderID"));
  389. }
  390. }
  391. if ( removed.length > 0 ){
  392. if ( window.confirm("<string id=SKIN_CONFIRM_DELETE>") ) {
  393. var parms = {};
  394. parms.renders = dojo.toJson(removed);
  395. var xhrArgs = {
  396. url: "%GATEWAY%/mobileService/skins/delete.json",
  397. handleAs: "json",
  398. load: dojo.hitch(this, function(data){
  399. this.endBusy();
  400. this._updateSkinsList(data.result);
  401. }),
  402. error: dojo.hitch(this, function(error){
  403. this.endBusy();
  404. alert("<string id=SKIN_UNEXPECTED_ERROR>");
  405. }),
  406. content: parms
  407. };
  408. this.startBusy();
  409. var deferred = dojo.xhrGet(xhrArgs);
  410. }
  411. }
  412. else{
  413. alert("<string id=SKIN_CHOOSE_TO_DELETE>");
  414. }
  415. },
  416. startBusy : function(){
  417. document.body.style.cursor ='wait';
  418. },
  419. endBusy : function(){
  420. document.body.style.cursor = 'default';
  421. }
  422. };
  423. _THIS_.addEventListener('fragment.visibility.change', dojo.hitch(_THIS_skinAPI, _THIS_skinAPI.onFragmentVisibilityChange), false);
  424. _THIS_skinAPI.sendBrowseRequest();
  425. </script>
  426. <div >
  427. <div>
  428. <!-- Fragment title bar -->
  429. <table class="cogstyle-portlet-caption-bar" width="100%" border="0" cellspacing="0" cellpadding="0" role="presentation">
  430. <tbody>
  431. <tr>
  432. <td class="cogstyle-portlet-caption" width="100%" valign="top">
  433. <span>
  434. <div role="heading" id="_THIS_CAPTION_BAR_TITLE"><string id=SKIN_FRAGMENT_TITLE></div>
  435. </span>
  436. </tr>
  437. </tbody>
  438. </table>
  439. <iframe style='visiblity:hidden;width:0px;height:0px;border:none' frameborder='0' name='formPoster' title='formPoster' id="_THIS_formPoster" onload='if (window._THIS_skinAPI.mobileSkinUploadResult){_THIS_skinAPI.mobileSkinUploadResult();}' ></iframe>
  440. <span style="display:none" id="_THIS_hiddenSection">
  441. <div id="_THIS_uploadSkin">
  442. <form id='_THIS_skin_form' target='formPoster' method='POST' enctype='multipart/form-data' action='%GATEWAY%/mobileService/skins/upload.json'>
  443. <table role='presentation'><tr><td>
  444. <label for="_THIS_SKINNAME" class="formLabel"><string id=SKIN_NAME></label><br>
  445. <input type='text' name='skinName' id="_THIS_SKINNAME"></td></tr>
  446. <tr><td>
  447. <br/><label for="_THIS_BROWSE" class="formLabel" id="_THIS_BROWSE_LABEL"><string id=SKIN_UPLOAD_TITLE></label><br>
  448. <input type='file' name='skinFile' id="_THIS_BROWSE" ></td></tr>
  449. <tr><td>
  450. <br/><label class="formLabel" for="_THIS_GROUP"><string id=GROUP_BROWSE_LABEL></label><br>
  451. <input type='button' onclick='_THIS_skinAPI.chooseObject()' value='<string id=BROWSE_GROUP_BUTTON>' name='chooseGroupButton'><input id="_THIS_GROUP" type='text' name='groupNames' value='' readonly></td></tr>
  452. </table>
  453. <input type='hidden' name='skinGroup' id="_THIS_GROUP_SEARCH_PATH">
  454. <input type='hidden' name='skinGroupID' id="_THIS_GROUP_ID">
  455. <input type='hidden' name='renderID' id="_THIS_RENDER_ID">
  456. </form>
  457. </div>
  458. </span>
  459. <span id="_THIS_dialogSection">
  460. </span>
  461. <div style="margin-right:20px">
  462. <table style="width:100%">
  463. <tr>
  464. <td style="text-align:right">
  465. <a href="javascript:_THIS_skinAPI.showAddSkin()"><img role="button" style="border:0" title="<string id=SKIN_ADD_TEXT>" alt="<string id=SKIN_ADD_TEXT>" src="../ps/portal/images/action_new_cognos_content.gif"></a>
  466. <a href="javascript:_THIS_skinAPI.removeSelectedSkins()"><img role="button" style="border:0" title="<string id=SKIN_REMOVE_TEXT>" alt="<string id=SKIN_REMOVE_TEXT>" src="../ps/portal/images/action_delete.gif"></a>
  467. </td>
  468. </tr>
  469. </table>
  470. </div>
  471. <div class="cogstyle-table-wrapper">
  472. <table cellspacing="0" cellpadding="0" border="0" style="border-collapse:collapse;width:100%;overflow:auto;" class="cogstyle-table" >
  473. <thead style="background-color:#99aacc;" class="cogstyle-table-header">
  474. <tr>
  475. <th width="15px" nowrap="">
  476. <input type="checkbox" id="_THIS_toggleAll" onclick="_THIS_skinAPI.toggleSkinSelections()" value="true" cogtype="checkbox_toggler">
  477. <label for="_THIS_toggleAll" style="display:none"><string id=ADMIN_SKIN_SELECT_ALL_CHECKBOX_LABEL></label>
  478. </th>
  479. <th nowrap="" style="text-align:left;" class="cogstyle-table-group-title">
  480. &nbsp;<string id=ADMIN_SKIN_NAME>
  481. </th>
  482. <th nowrap="" style="text-align:left;" class="cogstyle-table-group-title">
  483. <string id=ADMIN_SKIN_GROUP>
  484. </th>
  485. <th nowrap="" style="text-align:left;" class="cogstyle-table-group-title">
  486. <string id=ADMIN_SKIN_ACTION>
  487. </th>
  488. </tr>
  489. </thead>
  490. <tbody class="cogstyle-table-body" id="_THIS_SKIN_TABLE">
  491. <tr>
  492. <td style="height:1px;padding:0;margin:0;background-color:#ffffff;border:1px" colspan="15"></td>
  493. </tr>
  494. </tbody>
  495. </table>
  496. </div>
  497. </div>
  498. </div>
  499. </div>