selectServices.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. InstallationWizard.SelectServices = {
  2. renderData: {},
  3. render:
  4. function (selectServicesInfo) {
  5. InstallationWizard.SelectServices.renderData = selectServicesInfo;
  6. }
  7. };
  8. var data;
  9. var allBoxesSelected = true;
  10. function renderServiceList(responseJson) {
  11. data = responseJson;
  12. var divContent = '';
  13. var coreContent = '';
  14. var optionalContent = '';
  15. var nonSelectableContent = '';
  16. for (serviceName in data['services']) {
  17. data['services'][serviceName]['refCount'] = 0;
  18. if (data['services'][serviceName]['reverseDependencies'] == null) {
  19. data['services'][serviceName]['reverseDependencies'] = new Array();
  20. }
  21. for (var i = 0; i < data['services'][serviceName]['dependencies'].length; i++) {
  22. svcDep = data['services'][serviceName]['dependencies'][i];
  23. if (data['services'][svcDep]['reverseDependencies'] == null) {
  24. data['services'][svcDep]['reverseDependencies'] = new Array();
  25. }
  26. var found = false;
  27. for (var j = 0; j < data['services'][svcDep]['reverseDependencies'].length; j++) {
  28. if (data['services'][svcDep]['reverseDependencies'][j] == serviceName) {
  29. found = true;
  30. break;
  31. }
  32. }
  33. if (!found) {
  34. data['services'][svcDep]['reverseDependencies'].push(serviceName);
  35. }
  36. }
  37. // globalYui.log("Handling service : " + serviceName);
  38. var content = '';
  39. content = generateSelectServiceCheckbox(data['services'][serviceName]);
  40. if (data['services'][serviceName].attributes.mustInstall) {
  41. coreContent += content;
  42. } else {
  43. if (data['services'][serviceName].attributes.editable) {
  44. optionalContent += content;
  45. }
  46. else {
  47. nonSelectableContent += content;
  48. }
  49. }
  50. }
  51. // divContent += coreContent + optionalContent + nonSelectableContent;
  52. coreContent = '<div>' +
  53. '<label class="checkbox" for="selectAllCheckBoxId"><span id="labelForSelectAllId">Select all</span>' +
  54. '<input type="checkbox" name="selectAll" id="selectAllCheckBoxId"/></label>' +
  55. '</div>' +
  56. coreContent;
  57. globalYui.one("#selectCoreServicesDynamicRenderDivId").setContent(coreContent);
  58. globalYui.one("#selectOptionalServicesDynamicRenderDivId").setContent(optionalContent);
  59. globalYui.one("#selectNonSelectableServicesDynamicRenderDivId").setContent(nonSelectableContent);
  60. globalYui.one('#selectServicesCoreDivId').setStyle("display", "block");
  61. // For now, we want all services to be enabled by default
  62. selectDelectAll(true);
  63. displayStatusOnSelectDeselectAll(true, false);
  64. globalYui.one("#selectAllCheckBoxId").set('checked', true);
  65. }
  66. function generateSelectServiceCheckbox(serviceInfo) {
  67. var dContent = '<div class="formElement" name="' + serviceInfo.serviceName + '" id="'
  68. + 'selectServicesEntry' + serviceInfo.serviceName + 'DivId"';
  69. if (!serviceInfo.attributes.editable
  70. && !serviceInfo.attributes.mustInstall) {
  71. dContent += ' style="display:none" ';
  72. }
  73. dContent += '><label class="checkbox" for="install' + serviceInfo.serviceName + 'Id"'
  74. + '>' + serviceInfo.displayName
  75. + '<input type="checkbox" name="' + serviceInfo.serviceName + '"'
  76. + ' id="installService' + serviceInfo.serviceName + 'Id" value="install'
  77. + serviceInfo.serviceName + 'Value"';
  78. if (serviceInfo.attributes != null) {
  79. if (serviceInfo.attributes.noDisplay) {
  80. return '';
  81. }
  82. if (!serviceInfo.attributes.editable) {
  83. dContent += ' disabled="disabled"';
  84. }
  85. if (serviceInfo.attributes.mustInstall) {
  86. dContent += ' checked="yes"';
  87. }
  88. }
  89. dContent += '/> - <span class="description">' + serviceInfo['description'] + '</span></label>' +
  90. //'<div class="description">' + serviceInfo['description'] + '</div>' +
  91. '</div>';
  92. // globalYui.log("Handling service entry: " + dContent);
  93. return dContent;
  94. }
  95. function getButtonId(serviceName) {
  96. return 'installService' + serviceName + 'Id';
  97. }
  98. function setRefCounts(serviceName) {
  99. var buttonId = getButtonId(serviceName);
  100. // Set the refCount for 'this' service
  101. if (!globalYui.one('#' + buttonId).get('checked')) {
  102. data['services'][serviceName]['refCount'] = 0;
  103. } else if (data['services'][serviceName]['refCount'] == 0) {
  104. data['services'][serviceName]['refCount'] = 1;
  105. }
  106. // Set the refCounts for 'this' service's dependencies
  107. var selectYes = true;
  108. if (!globalYui.one('#' + buttonId).get('checked')) {
  109. selectYes = false;
  110. }
  111. for (var i = 0; i < data['services'][serviceName]['dependencies'].length; i++) {
  112. var serviceDep = data['services'][serviceName]['dependencies'][i];
  113. if (selectYes) {
  114. data['services'][serviceDep]['refCount']++;
  115. } else {
  116. data['services'][serviceDep]['refCount']--;
  117. if (data['services'][serviceDep]['refCount'] < 0) {
  118. data['services'][serviceDep]['refCount'] = 0;
  119. }
  120. }
  121. }
  122. }
  123. function displayStatusOnSuccess(serviceName) {
  124. var buttonId = getButtonId(serviceName);
  125. var selectYes = true;
  126. if (!globalYui.one('#' + buttonId).get('checked')) {
  127. selectYes = false;
  128. }
  129. var statusString = "Selected " + data['services'][serviceName].displayName + " for installation. ";
  130. if (!globalYui.one('#' + buttonId).get('checked')) {
  131. statusString = "Deselected " + data['services'][serviceName].displayName + " and all its dependencies.";
  132. }
  133. // Generate the status string for dependencies
  134. var dependencies = "";
  135. for (var i = 0; i < data['services'][serviceName]['dependencies'].length; i++) {
  136. var serviceDep = data['services'][serviceName]['dependencies'][i];
  137. if (selectYes) {
  138. if (!data['services'][serviceDep].attributes.mustInstall) {
  139. dependencies += data['services'][serviceDep].displayName + " ";
  140. }
  141. }
  142. }
  143. if(selectYes) {
  144. if(dependencies != "") {
  145. statusString += "Also added " + dependencies + " as dependencies.";
  146. }
  147. }
  148. setFormStatus(statusString, false);
  149. }
  150. function updateRendering() {
  151. var currentAllBoxesSelected = true;
  152. for (svcName in data['services']) {
  153. if (data['services'][svcName].attributes.noDisplay) {
  154. continue;
  155. }
  156. // globalYui.log('Svc ref count : ' + svcName + ' : ' + data['services'][svcName]['refCount']);
  157. var itemId = getButtonId(svcName);
  158. if (data['services'][svcName].attributes.mustInstall ||
  159. data['services'][svcName]['refCount'] > 0) {
  160. globalYui.one('#' + itemId).set('checked' ,'yes');
  161. if (!data['services'][svcName].attributes.editable) {
  162. var divId = 'selectServicesEntry' + svcName + 'DivId';
  163. globalYui.one('#' + divId).setStyle('display', '');
  164. }
  165. } else {
  166. currentAllBoxesSelected = false;
  167. globalYui.one('#' + itemId).set('checked' ,'');
  168. if (!data['services'][svcName].attributes.editable) {
  169. var divId = 'selectServicesEntry' + svcName + 'DivId';
  170. globalYui.one('#' + divId).setStyle('display', 'none');
  171. }
  172. }
  173. }
  174. if (allBoxesSelected != currentAllBoxesSelected) {
  175. allBoxesSelected = currentAllBoxesSelected;
  176. // Update the selectAll button
  177. globalYui.one("#selectAllCheckBoxId").set('checked', allBoxesSelected);
  178. displayStatusOnSelectDeselectAll(allBoxesSelected, false);
  179. }
  180. }
  181. function displayStatusOnSelectDeselectAll(selectAll, setFormStatusAlso) {
  182. var labelNode = globalYui.one("#labelForSelectAllId");
  183. if (selectAll) {
  184. labelNode.setContent("Deselect all");
  185. } else {
  186. labelNode.setContent("Select all");
  187. }
  188. if (setFormStatusAlso) {
  189. if (selectAll) {
  190. setFormStatus("Selected all services", false);
  191. } else {
  192. setFormStatus("Deselected all optional services", false);
  193. }
  194. }
  195. }
  196. function selectDelectAll(selectAll) {
  197. var node = globalYui.one("#selectAllCheckBoxId");
  198. var labelNode = globalYui.one("#labelForSelectAllId");
  199. for (svcName in data['services']) {
  200. if (!data['services'][svcName].attributes.noDisplay && !data['services'][svcName].attributes.mustInstall && data['services'][svcName].attributes.editable) {
  201. var itemId = getButtonId(svcName);
  202. if ( selectAll != globalYui.one('#' + itemId).get('checked')) {
  203. globalYui.one('#' + itemId).set('checked' , selectAll);
  204. setRefCounts(svcName);
  205. }
  206. }
  207. }
  208. // All done, update our rendering
  209. updateRendering();
  210. }
  211. globalYui.one('#selectServicesCoreDivId').delegate('click', function (e) {
  212. // Select-all checkbox
  213. if (this.get('id') == 'selectAllCheckBoxId') {
  214. var node = globalYui.one("#selectAllCheckBoxId");
  215. var selectAll = node.get('checked');
  216. selectDelectAll(selectAll);
  217. displayStatusOnSelectDeselectAll(selectAll, true);
  218. return;
  219. }
  220. //// End of select-all checkbox
  221. // globalYui.log(globalYui.Lang.dump(this));
  222. var serviceName = this.getAttribute('name');
  223. var buttonId = getButtonId(serviceName);
  224. // Deselecting an already selected service
  225. if (!globalYui.one('#' + buttonId).get('checked')) {
  226. var invalidDep = false;
  227. var invalidDepReason = "";
  228. for (var i = 0; i < data['services'][serviceName]['reverseDependencies'].length; i++) {
  229. var nm = data['services'][serviceName]['reverseDependencies'][i];
  230. if (data['services'][nm]['refCount'] > 0) {
  231. invalidDep = true;
  232. invalidDepReason = "Cannot deselect: " + data['services'][serviceName].displayName + " is needed by " + data['services'][nm].displayName;
  233. break;
  234. }
  235. }
  236. if (invalidDep) {
  237. setFormStatus(invalidDepReason, true);
  238. globalYui.one('#' + buttonId).set('checked', 'yes');
  239. return;
  240. }
  241. // Some things are deselected, so update the selectAll button
  242. globalYui.one("#selectAllCheckBoxId").set('checked', false);
  243. }
  244. setRefCounts(serviceName);
  245. // Display status as to what we have done now.
  246. displayStatusOnSuccess(serviceName);
  247. // All done, update our rendering
  248. updateRendering();
  249. //}, 'li.selectServicesEntry');
  250. }, 'input[type=checkbox]');
  251. globalYui.one('#selectServicesSubmitButtonId').on('click',function (e) {
  252. var selectServicesRequestData = {
  253. "services" : [ ] } ;
  254. for (svcName in data['services']) {
  255. /* if (data['services'][svcName].attributes.noDisplay) {
  256. continue;
  257. }*/
  258. var svcObj = { "serviceName" : svcName,
  259. "isEnabled": (data['services'][svcName].attributes.mustInstall || data['services'][svcName]['refCount'] > 0) };
  260. selectServicesRequestData.services.push(svcObj);
  261. }
  262. // alert(globalYui.Lang.dump(selectServicesRequestData));
  263. var url = "../php/frontend/selectServices.php?clusterName=" + InstallationWizard.SelectServices.renderData.clusterName;
  264. var requestData = selectServicesRequestData;
  265. var submitButton = globalYui.one('#selectServicesSubmitButtonId');
  266. var thisScreenId = "#selectServicesCoreDivId";
  267. var nextScreenId = "#assignHostsCoreDivId";
  268. var nextScreenRenderFunction = renderAssignHosts;
  269. submitDataAndProgressToNextScreen(url, requestData, submitButton, thisScreenId, nextScreenId, nextScreenRenderFunction);
  270. });
  271. function renderSelectServicesBlock(infoInitializeCluster) {
  272. InstallationWizard.SelectServices.renderData = infoInitializeCluster;
  273. //////// Get the list of services and relevant information for rendering them.
  274. var clusterName = InstallationWizard.SelectServices.renderData.clusterName;
  275. var inputUrl = "../php/frontend/fetchClusterServices.php?clusterName=" + clusterName ;
  276. executeStage(inputUrl, renderServiceList);
  277. }