]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1976 ask confirmation before restart server
authorStas Vilchik <vilchiks@gmail.com>
Mon, 18 Jan 2016 08:49:10 +0000 (09:49 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 18 Jan 2016 08:49:10 +0000 (09:49 +0100)
server/sonar-web/src/main/js/apps/system/main.js
server/sonar-web/src/main/js/apps/update-center/header-view.js
server/sonar-web/src/main/js/apps/update-center/templates/update-center-header.hbs
server/sonar-web/src/main/js/components/RestartModal/index.js [new file with mode: 0644]
server/sonar-web/src/main/js/components/RestartModal/templates/restarting.hbs [new file with mode: 0644]
server/sonar-web/src/main/js/components/RestartModal/templates/template.hbs [new file with mode: 0644]

index 36569d172a1b57b87504e9c746841bb9c61d3e76..e12d12f29a837afbeae0a3b64202f844740bbb20 100644 (file)
  */
 import _ from 'underscore';
 import React from 'react';
-import { getSystemInfo, restartAndWait } from '../../api/system';
+import { getSystemInfo } from '../../api/system';
 import Section from './section';
 import { translate } from '../../helpers/l10n';
+import RestartModal from '../../components/RestartModal';
 
 const SECTIONS_ORDER = ['SonarQube', 'Database', 'Plugins', 'System', 'ElasticSearch', 'JvmProperties',
   'ComputeEngine'];
 
 export default React.createClass({
-  getInitialState() {
-    return { restarting: false };
-  },
-
   componentDidMount() {
     getSystemInfo().then(info => this.setState({ sections: this.parseSections(info) }));
   },
@@ -58,15 +55,12 @@ export default React.createClass({
   },
 
   handleServerRestart () {
-    this.setState({ restarting: true });
-    restartAndWait().then(() => {
-      document.location.reload();
-    });
+    new RestartModal().render();
   },
 
   render() {
     let sections = null;
-    if (this.state.sections) {
+    if (this.state && this.state.sections) {
       sections = this.state.sections.map(section => {
         return <Section key={section.name} section={section.name} items={section.items}/>;
       });
@@ -78,16 +72,12 @@ export default React.createClass({
         <div className="page-actions">
           <a className="spacer-right" href={window.baseUrl + '/api/system/logs'} id="logs-link">Logs</a>
           <a href={window.baseUrl + '/api/system/info'} id="download-link">Download</a>
-          {this.state.restarting ? (
-              <i className="spinner"/>
-          ) : (
-              <button
-                  id="restart-server-button"
-                  className="big-spacer-left"
-                  onClick={this.handleServerRestart}>
-                Restart Server
-              </button>
-          )}
+          <button
+              id="restart-server-button"
+              className="big-spacer-left"
+              onClick={this.handleServerRestart}>
+            Restart Server
+          </button>
         </div>
       </header>
       {sections}
index ab758cda9343834ee55f0439a3332236ef4cd77e..c7d8f6b1a3aeb140fb27379f38da1718652c5ade 100644 (file)
@@ -20,7 +20,7 @@
 import _ from 'underscore';
 import Marionette from 'backbone.marionette';
 import Template from './templates/update-center-header.hbs';
-import { restartAndWait } from '../../api/system';
+import RestartModal from '../../components/RestartModal';
 
 export default Marionette.ItemView.extend({
   template: Template,
@@ -34,16 +34,8 @@ export default Marionette.ItemView.extend({
     'click .js-cancel-all': 'cancelAll'
   },
 
-  initialize () {
-    this.restarting = false;
-  },
-
   restart () {
-    this.restarting = true;
-    this.render();
-    restartAndWait().then(() => {
-      document.location.reload(true);
-    });
+    new RestartModal().render();
   },
 
   cancelAll () {
@@ -53,8 +45,7 @@ export default Marionette.ItemView.extend({
   serializeData () {
     return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), {
       installing: this.collection._installedCount,
-      uninstalling: this.collection._uninstalledCount,
-      restarting: this.restarting
+      uninstalling: this.collection._uninstalledCount
     });
   }
 });
index 518c96ce81bcf024198fce220677647d4b975e4a..a89a1112d5c616a0d2d88ab3126e49411426f978 100644 (file)
       </p>
     </div>
     <div class="pull-right">
-      {{#if restarting}}
-        <i class="spinner"></i>
-      {{else}}
-        <button class="js-restart">Restart</button>
-        <button class="js-cancel-all button-red">Revert</button>
-      {{/if}}
+      <button class="js-restart">Restart</button>
+      <button class="js-cancel-all button-red">Revert</button>
     </div>
   </div>
 {{/any}}
diff --git a/server/sonar-web/src/main/js/components/RestartModal/index.js b/server/sonar-web/src/main/js/components/RestartModal/index.js
new file mode 100644 (file)
index 0000000..dd449be
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * SonarQube :: Web
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+import ModalForm from '../common/modal-form';
+import Template from './templates/template.hbs';
+import RestartingTemplate from './templates/restarting.hbs';
+import { restartAndWait } from '../../api/system';
+
+
+const RestartModal = ModalForm.extend({
+  template: Template,
+  restartingTemplate: RestartingTemplate,
+
+  initialize() {
+    this.restarting = false;
+  },
+
+  getTemplate() {
+    return this.restarting ? this.restartingTemplate : this.template;
+  },
+
+  onFormSubmit() {
+    ModalForm.prototype.onFormSubmit.apply(this, arguments);
+    this.restarting = true;
+    this.render();
+    restartAndWait().then(() => {
+      document.location.reload();
+    });
+  }
+});
+
+export default RestartModal;
diff --git a/server/sonar-web/src/main/js/components/RestartModal/templates/restarting.hbs b/server/sonar-web/src/main/js/components/RestartModal/templates/restarting.hbs
new file mode 100644 (file)
index 0000000..bab7b50
--- /dev/null
@@ -0,0 +1,14 @@
+<form id="restart-server-form">
+  <div class="modal-head">
+    <h2>Restart Server</h2>
+  </div>
+  <div class="modal-body">
+    <div class="js-modal-messages"></div>
+    <p class="spacer-top spacer-bottom text-center">
+      Server is restarting. This page will be automatically refreshed.
+    </p>
+    <p class="big-spacer-top spacer-bottom text-center">
+      <i class="spinner"></i>
+    </p>
+  </div>
+</form>
diff --git a/server/sonar-web/src/main/js/components/RestartModal/templates/template.hbs b/server/sonar-web/src/main/js/components/RestartModal/templates/template.hbs
new file mode 100644 (file)
index 0000000..6058532
--- /dev/null
@@ -0,0 +1,15 @@
+<form id="restart-server-form">
+  <div class="modal-head">
+    <h2>Restart Server</h2>
+  </div>
+  <div class="modal-body">
+    <div class="js-modal-messages"></div>
+    <p class="spacer-top spacer-bottom">
+      Are you sure you want to restart the server?
+    </p>
+  </div>
+  <div class="modal-foot">
+    <button id="restart-server-submit">Restart</button>
+    <a href="#" class="js-modal-close" id="restart-server-cancel">Cancel</a>
+  </div>
+</form>