Merge branch 'release-3.0'
Этот коммит содержится в:
@@ -33,7 +33,7 @@ func InitAdmin() {
|
|||||||
BaseRoutes.Admin.Handle("/analytics/{name:[A-Za-z0-9_]+}", ApiUserRequired(getAnalytics)).Methods("GET")
|
BaseRoutes.Admin.Handle("/analytics/{name:[A-Za-z0-9_]+}", ApiUserRequired(getAnalytics)).Methods("GET")
|
||||||
BaseRoutes.Admin.Handle("/save_compliance_report", ApiUserRequired(saveComplianceReport)).Methods("POST")
|
BaseRoutes.Admin.Handle("/save_compliance_report", ApiUserRequired(saveComplianceReport)).Methods("POST")
|
||||||
BaseRoutes.Admin.Handle("/compliance_reports", ApiUserRequired(getComplianceReports)).Methods("GET")
|
BaseRoutes.Admin.Handle("/compliance_reports", ApiUserRequired(getComplianceReports)).Methods("GET")
|
||||||
BaseRoutes.Admin.Handle("/download_compliance_report/{id:[A-Za-z0-9]+}", ApiUserRequired(downloadComplianceReport)).Methods("GET")
|
BaseRoutes.Admin.Handle("/download_compliance_report/{id:[A-Za-z0-9]+}", ApiUserRequiredTrustRequester(downloadComplianceReport)).Methods("GET")
|
||||||
BaseRoutes.Admin.Handle("/upload_brand_image", ApiAdminSystemRequired(uploadBrandImage)).Methods("POST")
|
BaseRoutes.Admin.Handle("/upload_brand_image", ApiAdminSystemRequired(uploadBrandImage)).Methods("POST")
|
||||||
BaseRoutes.Admin.Handle("/get_brand_image", ApiAppHandlerTrustRequester(getBrandImage)).Methods("GET")
|
BaseRoutes.Admin.Handle("/get_brand_image", ApiAppHandlerTrustRequester(getBrandImage)).Methods("GET")
|
||||||
BaseRoutes.Admin.Handle("/reset_mfa", ApiAdminSystemRequired(adminResetMfa)).Methods("POST")
|
BaseRoutes.Admin.Handle("/reset_mfa", ApiAdminSystemRequired(adminResetMfa)).Methods("POST")
|
||||||
|
|||||||
23
api/team.go
23
api/team.go
@@ -41,7 +41,6 @@ func InitTeam() {
|
|||||||
|
|
||||||
// These should be moved to the global admain console
|
// These should be moved to the global admain console
|
||||||
BaseRoutes.NeedTeam.Handle("/import_team", ApiUserRequired(importTeam)).Methods("POST")
|
BaseRoutes.NeedTeam.Handle("/import_team", ApiUserRequired(importTeam)).Methods("POST")
|
||||||
BaseRoutes.NeedTeam.Handle("/export_team", ApiUserRequired(exportTeam)).Methods("GET")
|
|
||||||
BaseRoutes.Teams.Handle("/add_user_to_team_from_invite", ApiUserRequired(addUserToTeamFromInvite)).Methods("POST")
|
BaseRoutes.Teams.Handle("/add_user_to_team_from_invite", ApiUserRequired(addUserToTeamFromInvite)).Methods("POST")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,6 +274,9 @@ func JoinUserToTeam(team *model.Team, user *model.User) *model.AppError {
|
|||||||
RemoveAllSessionsForUserId(user.Id)
|
RemoveAllSessionsForUserId(user.Id)
|
||||||
InvalidateCacheForUser(user.Id)
|
InvalidateCacheForUser(user.Id)
|
||||||
|
|
||||||
|
// This message goes to every channel, so the channelId is irrelevant
|
||||||
|
PublishAndForget(model.NewMessage("", "", user.Id, model.ACTION_NEW_USER))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,25 +752,6 @@ func importTeam(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
http.ServeContent(w, r, "MattermostImportLog.txt", time.Now(), bytes.NewReader(log.Bytes()))
|
http.ServeContent(w, r, "MattermostImportLog.txt", time.Now(), bytes.NewReader(log.Bytes()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func exportTeam(c *Context, w http.ResponseWriter, r *http.Request) {
|
|
||||||
if !c.HasPermissionsToTeam(c.TeamId, "export") || !c.IsTeamAdmin() {
|
|
||||||
c.Err = model.NewLocAppError("exportTeam", "api.team.export_team.admin.app_error", nil, "userId="+c.Session.UserId)
|
|
||||||
c.Err.StatusCode = http.StatusForbidden
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
options := ExportOptionsFromJson(r.Body)
|
|
||||||
|
|
||||||
if link, err := ExportToFile(options); err != nil {
|
|
||||||
c.Err = err
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
result := map[string]string{}
|
|
||||||
result["link"] = link
|
|
||||||
w.Write([]byte(model.MapToJson(result)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getInviteInfo(c *Context, w http.ResponseWriter, r *http.Request) {
|
func getInviteInfo(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||||
m := model.MapFromJson(r.Body)
|
m := model.MapFromJson(r.Body)
|
||||||
inviteId := m["invite_id"]
|
inviteId := m["invite_id"]
|
||||||
|
|||||||
@@ -148,8 +148,7 @@
|
|||||||
"IdAttribute": "",
|
"IdAttribute": "",
|
||||||
"SkipCertificateVerification": false,
|
"SkipCertificateVerification": false,
|
||||||
"QueryTimeout": 60,
|
"QueryTimeout": 60,
|
||||||
"LoginFieldName": "",
|
"LoginFieldName": ""
|
||||||
"PasswordFieldName": ""
|
|
||||||
},
|
},
|
||||||
"ComplianceSettings": {
|
"ComplianceSettings": {
|
||||||
"Enable": false,
|
"Enable": false,
|
||||||
|
|||||||
@@ -542,8 +542,14 @@ export default class Client {
|
|||||||
createUserWithInvite = (user, data, emailHash, inviteId, success, error) => {
|
createUserWithInvite = (user, data, emailHash, inviteId, success, error) => {
|
||||||
var url = `${this.getUsersRoute()}/create`;
|
var url = `${this.getUsersRoute()}/create`;
|
||||||
|
|
||||||
if (data || emailHash || inviteId) {
|
url += '?d=' + encodeURIComponent(data);
|
||||||
url += '?d=' + encodeURIComponent(data) + '&h=' + encodeURIComponent(emailHash) + '&iid=' + encodeURIComponent(inviteId);
|
|
||||||
|
if (emailHash) {
|
||||||
|
url += '&h=' + encodeURIComponent(emailHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inviteId) {
|
||||||
|
url += '&iid=' + encodeURIComponent(inviteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
request.
|
request.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import * as Utils from '../../utils/utils.jsx';
|
|||||||
import AdminStore from '../../stores/admin_store.jsx';
|
import AdminStore from '../../stores/admin_store.jsx';
|
||||||
import UserStore from '../../stores/user_store.jsx';
|
import UserStore from '../../stores/user_store.jsx';
|
||||||
|
|
||||||
import * as Client from '../../utils/web_client.jsx';
|
import Client from 'utils/web_client.jsx';
|
||||||
import * as AsyncClient from '../../utils/async_client.jsx';
|
import * as AsyncClient from '../../utils/async_client.jsx';
|
||||||
|
|
||||||
import {FormattedMessage, FormattedDate, FormattedTime} from 'react-intl';
|
import {FormattedMessage, FormattedDate, FormattedTime} from 'react-intl';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
import * as Client from '../../utils/web_client.jsx';
|
import Client from 'utils/web_client.jsx';
|
||||||
import * as AsyncClient from '../../utils/async_client.jsx';
|
import * as AsyncClient from '../../utils/async_client.jsx';
|
||||||
import * as Utils from '../../utils/utils.jsx';
|
import * as Utils from '../../utils/utils.jsx';
|
||||||
|
|
||||||
@@ -40,6 +40,7 @@ export default class ComplianceSettings extends React.Component {
|
|||||||
$('#save-button').button('loading');
|
$('#save-button').button('loading');
|
||||||
|
|
||||||
const config = this.props.config;
|
const config = this.props.config;
|
||||||
|
const oldEnable = config.ComplianceSettings.Enable;
|
||||||
config.ComplianceSettings.Enable = this.refs.Enable.checked;
|
config.ComplianceSettings.Enable = this.refs.Enable.checked;
|
||||||
config.ComplianceSettings.Directory = ReactDOM.findDOMNode(this.refs.Directory).value;
|
config.ComplianceSettings.Directory = ReactDOM.findDOMNode(this.refs.Directory).value;
|
||||||
config.ComplianceSettings.EnableDaily = this.refs.EnableDaily.checked;
|
config.ComplianceSettings.EnableDaily = this.refs.EnableDaily.checked;
|
||||||
@@ -47,12 +48,15 @@ export default class ComplianceSettings extends React.Component {
|
|||||||
Client.saveConfig(
|
Client.saveConfig(
|
||||||
config,
|
config,
|
||||||
() => {
|
() => {
|
||||||
|
$('#save-button').button('reset');
|
||||||
AsyncClient.getConfig();
|
AsyncClient.getConfig();
|
||||||
this.setState({
|
this.setState({
|
||||||
serverError: null,
|
serverError: null,
|
||||||
saveNeeded: false
|
saveNeeded: false
|
||||||
});
|
});
|
||||||
$('#save-button').button('reset');
|
if (oldEnable !== config.ComplianceSettings.Enable) {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import React from 'react';
|
|||||||
|
|
||||||
export default class Setting extends React.Component {
|
export default class Setting extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
let marginClass;
|
let marginClass = '';
|
||||||
if (this.props.margin === 'small') {
|
if (this.props.margin === 'small') {
|
||||||
marginClass = ' form-group--small';
|
marginClass = ' form-group--small';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const holders = defineMessages({
|
|||||||
},
|
},
|
||||||
usernameRestrictions: {
|
usernameRestrictions: {
|
||||||
id: 'user.settings.general.usernameRestrictions',
|
id: 'user.settings.general.usernameRestrictions',
|
||||||
defaultMessage: "Pick something easy for teammates to recognize and recall. Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'"
|
defaultMessage: "Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'."
|
||||||
},
|
},
|
||||||
validEmail: {
|
validEmail: {
|
||||||
id: 'user.settings.general.validEmail',
|
id: 'user.settings.general.validEmail',
|
||||||
@@ -108,7 +108,7 @@ class UserSettingsGeneralTab extends React.Component {
|
|||||||
this.setState({clientError: formatMessage(holders.usernameReserved)});
|
this.setState({clientError: formatMessage(holders.usernameReserved)});
|
||||||
return;
|
return;
|
||||||
} else if (usernameError) {
|
} else if (usernameError) {
|
||||||
this.setState({clientError: formatMessage(holders.usernameRestrictions, {min: Constants.MIN_USERNAME_LENGTH}, {max: Constants.MAX_USERNAME_LENGTH})});
|
this.setState({clientError: formatMessage(holders.usernameRestrictions, {min: Constants.MIN_USERNAME_LENGTH, max: Constants.MAX_USERNAME_LENGTH})});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,7 +773,7 @@ class UserSettingsGeneralTab extends React.Component {
|
|||||||
<span>
|
<span>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='user.settings.general.usernameInfo'
|
id='user.settings.general.usernameInfo'
|
||||||
defaultMessage="Pick something easy for teammates to recognize and recall. Username must begin with a letter, and contain between {Constants.MIN_USERNAME_LENGTH to {Constants.MAX_USERNAME_LENGTH} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'"
|
defaultMessage='Pick something easy for teammates to recognize and recall.'
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1341,9 +1341,9 @@
|
|||||||
"user.settings.general.title": "General Settings",
|
"user.settings.general.title": "General Settings",
|
||||||
"user.settings.general.uploadImage": "Click 'Edit' to upload an image.",
|
"user.settings.general.uploadImage": "Click 'Edit' to upload an image.",
|
||||||
"user.settings.general.username": "Username",
|
"user.settings.general.username": "Username",
|
||||||
"user.settings.general.usernameInfo": "Pick something easy for teammates to recognize and recall. Username must begin with a letter, and contain between {min) to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'.",
|
"user.settings.general.usernameInfo": "Pick something easy for teammates to recognize and recall.",
|
||||||
"user.settings.general.usernameReserved": "This username is reserved, please choose a new one.",
|
"user.settings.general.usernameReserved": "This username is reserved, please choose a new one.",
|
||||||
"user.settings.general.usernameRestrictions": "Pick something easy for teammates to recognize and recall. Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'.",
|
"user.settings.general.usernameRestrictions": "Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-', and '_'.",
|
||||||
"user.settings.general.validEmail": "Please enter a valid email address",
|
"user.settings.general.validEmail": "Please enter a valid email address",
|
||||||
"user.settings.general.validImage": "Only JPG or PNG images may be used for profile pictures",
|
"user.settings.general.validImage": "Only JPG or PNG images may be used for profile pictures",
|
||||||
"user.settings.import_theme.cancel": "Cancel",
|
"user.settings.import_theme.cancel": "Cancel",
|
||||||
|
|||||||
@@ -1341,9 +1341,7 @@
|
|||||||
"user.settings.general.title": "Configuración General",
|
"user.settings.general.title": "Configuración General",
|
||||||
"user.settings.general.uploadImage": "Pinchar 'Editar' para subir una imagen.",
|
"user.settings.general.uploadImage": "Pinchar 'Editar' para subir una imagen.",
|
||||||
"user.settings.general.username": "Nombre de usuario",
|
"user.settings.general.username": "Nombre de usuario",
|
||||||
"user.settings.general.usernameInfo": "Escoge algo que sea sencillo para que tus compañeros reconozcan y puedan asociar. El nombre de usuario debe comenzar con una letra, y tener entre {min) y {max} caracteres en minúscula y componerse en numeros, letras y los símboloes '.', '-', y '_'.",
|
|
||||||
"user.settings.general.usernameReserved": "Este nombre de usuario está reservado, por favor escoge otro",
|
"user.settings.general.usernameReserved": "Este nombre de usuario está reservado, por favor escoge otro",
|
||||||
"user.settings.general.usernameRestrictions": "Escoge algo que sea sencillo para que tus compañeros reconozcan y puedan asociar. El nombre de usuario debe comenzar con una letra, y tener entre {min) y {max} caracteres en minúscula y componerse en numeros, letras y los símboloes '.', '-', y '_'.",
|
|
||||||
"user.settings.general.validEmail": "Por favor ingresa una dirección de correo electrónico válida",
|
"user.settings.general.validEmail": "Por favor ingresa una dirección de correo electrónico válida",
|
||||||
"user.settings.general.validImage": "Sólo pueden ser utilizadas imágenes JPG o PNG en el perfil",
|
"user.settings.general.validImage": "Sólo pueden ser utilizadas imágenes JPG o PNG en el perfil",
|
||||||
"user.settings.import_theme.cancel": "Cancelar",
|
"user.settings.import_theme.cancel": "Cancelar",
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ function preNeedsTeam(nextState, replace, callback) {
|
|||||||
// for the current url.
|
// for the current url.
|
||||||
var teamName = Utils.getTeamNameFromUrl();
|
var teamName = Utils.getTeamNameFromUrl();
|
||||||
var team = TeamStore.getByName(teamName);
|
var team = TeamStore.getByName(teamName);
|
||||||
|
const oldTeamId = TeamStore.getCurrentId();
|
||||||
|
|
||||||
if (!team) {
|
if (!team) {
|
||||||
browserHistory.push('/');
|
browserHistory.push('/');
|
||||||
@@ -143,6 +144,12 @@ function preNeedsTeam(nextState, replace, callback) {
|
|||||||
TeamStore.saveMyTeam(team);
|
TeamStore.saveMyTeam(team);
|
||||||
TeamStore.emitChange();
|
TeamStore.emitChange();
|
||||||
|
|
||||||
|
// If the old team id is null then we will already have the direct
|
||||||
|
// profiles from initial load
|
||||||
|
if (oldTeamId != null) {
|
||||||
|
AsyncClient.getDirectProfiles();
|
||||||
|
}
|
||||||
|
|
||||||
var d1 = $.Deferred(); //eslint-disable-line new-cap
|
var d1 = $.Deferred(); //eslint-disable-line new-cap
|
||||||
var d2 = $.Deferred(); //eslint-disable-line new-cap
|
var d2 = $.Deferred(); //eslint-disable-line new-cap
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,10 @@
|
|||||||
color: $white;
|
color: $white;
|
||||||
font-size: .9em;
|
font-size: .9em;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
margin: 5px 0 6px;
|
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
margin: 5px 0 6px;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
background: $light-gray;
|
background: $light-gray;
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user