selectServices.js 12 KB

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