diff --git a/webapp/client/client.jsx b/webapp/client/client.jsx index c5743ae7b8..782b745714 100644 --- a/webapp/client/client.jsx +++ b/webapp/client/client.jsx @@ -265,6 +265,15 @@ export default class Client { end(this.handleResponse.bind(this, 'reloadConfig', success, error)); } + invalidateAllCaches(success, error) { + return request. + get(`${this.getAdminRoute()}/invalidate_all_caches`). + set(this.defaultHeaders). + type('application/json'). + accept('application/json'). + end(this.handleResponse.bind(this, 'invalidate_all_caches', success, error)); + } + recycleDatabaseConnection(success, error) { return request. get(`${this.getAdminRoute()}/recycle_db_conn`). diff --git a/webapp/components/admin_console/configuration_settings.jsx b/webapp/components/admin_console/configuration_settings.jsx index 4653a5df9b..a5e5abe872 100644 --- a/webapp/components/admin_console/configuration_settings.jsx +++ b/webapp/components/admin_console/configuration_settings.jsx @@ -10,6 +10,7 @@ import {FormattedMessage, FormattedHTMLMessage} from 'react-intl'; import SettingsGroup from './settings_group.jsx'; import TextSetting from './text_setting.jsx'; import ReloadConfigButton from './reload_config.jsx'; +import PurgeCachesButton from './purge_caches.jsx'; import WebserverModeDropdownSetting from './webserver_mode_dropdown_setting.jsx'; import {ConnectionSecurityDropdownSettingWebserver} from './connection_security_dropdown_setting.jsx'; import BooleanSetting from './boolean_setting.jsx'; @@ -252,6 +253,7 @@ export default class ConfigurationSettings extends AdminSettings { disabled={false} /> + ); } diff --git a/webapp/components/admin_console/purge_caches.jsx b/webapp/components/admin_console/purge_caches.jsx new file mode 100644 index 0000000000..a999f090e2 --- /dev/null +++ b/webapp/components/admin_console/purge_caches.jsx @@ -0,0 +1,112 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import Client from 'client/web_client.jsx'; + +import {FormattedMessage} from 'react-intl'; + +export default class PurgeCachesButton extends React.Component { + constructor(props) { + super(props); + + this.handlePurge = this.handlePurge.bind(this); + + this.state = { + loading: false, + fail: null + }; + } + + handlePurge(e) { + e.preventDefault(); + + this.setState({ + loading: true, + fail: null + }); + + Client.invalidateAllCaches( + () => { + this.setState({ + loading: false + }); + }, + (err) => { + this.setState({ + loading: false, + fail: err.message + ' - ' + err.detailed_error + }); + } + ); + } + + render() { + if (global.window.mm_license.IsLicensed !== 'true') { + return
; + } + + let testMessage = null; + if (this.state.fail) { + testMessage = ( +
+ + +
+ ); + } + + const helpText = ( + + ); + + let contents = null; + if (this.state.loading) { + contents = ( + + + + + ); + } else { + contents = ( + + ); + } + + return ( +
+
+
+ + {testMessage} +
+
+ {helpText} +
+
+
+ ); + } +} diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index 733c725607..5d1b710d75 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -573,6 +573,10 @@ "admin.reload.loading": " Loading...", "admin.reload.reloadDescription": "Deployments using multiple databases can switch from one master database to another without restarting the Mattermost server by updating \"config.json\" to the new desired configuration and using the Reload Configuration from Disk feature to load the new settings while the server is running. The administrator should then use the Database > Recycle Database Connections feature to recycle the database connections based on the new settings.", "admin.reload.reloadFail": "Reloading unsuccessful: {error}", + "admin.purge.button": "Purge All Caches", + "admin.purge.loading": " Loading...", + "admin.purge.purgeDescription": "This will purge all the in-memory caches for things like sessions, accounts, channels, etc. Deployments using High Availability will attempt to purge all the servers in the cluster. Purging the caches may adversly impact performance.", + "admin.purge.purgeFail": "Purging unsuccessful: {error}", "admin.reset_password.close": "Close", "admin.reset_password.newPassword": "New Password", "admin.reset_password.select": "Select",