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("/save_compliance_report", ApiUserRequired(saveComplianceReport)).Methods("POST")
|
||||
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("/get_brand_image", ApiAppHandlerTrustRequester(getBrandImage)).Methods("GET")
|
||||
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
|
||||
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")
|
||||
}
|
||||
|
||||
@@ -275,6 +274,9 @@ func JoinUserToTeam(team *model.Team, user *model.User) *model.AppError {
|
||||
RemoveAllSessionsForUserId(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
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
|
||||
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) {
|
||||
m := model.MapFromJson(r.Body)
|
||||
inviteId := m["invite_id"]
|
||||
|
||||
@@ -148,8 +148,7 @@
|
||||
"IdAttribute": "",
|
||||
"SkipCertificateVerification": false,
|
||||
"QueryTimeout": 60,
|
||||
"LoginFieldName": "",
|
||||
"PasswordFieldName": ""
|
||||
"LoginFieldName": ""
|
||||
},
|
||||
"ComplianceSettings": {
|
||||
"Enable": false,
|
||||
|
||||
@@ -542,8 +542,14 @@ export default class Client {
|
||||
createUserWithInvite = (user, data, emailHash, inviteId, success, error) => {
|
||||
var url = `${this.getUsersRoute()}/create`;
|
||||
|
||||
if (data || emailHash || inviteId) {
|
||||
url += '?d=' + encodeURIComponent(data) + '&h=' + encodeURIComponent(emailHash) + '&iid=' + encodeURIComponent(inviteId);
|
||||
url += '?d=' + encodeURIComponent(data);
|
||||
|
||||
if (emailHash) {
|
||||
url += '&h=' + encodeURIComponent(emailHash);
|
||||
}
|
||||
|
||||
if (inviteId) {
|
||||
url += '&iid=' + encodeURIComponent(inviteId);
|
||||
}
|
||||
|
||||
request.
|
||||
|
||||
@@ -7,7 +7,7 @@ import * as Utils from '../../utils/utils.jsx';
|
||||
import AdminStore from '../../stores/admin_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 {FormattedMessage, FormattedDate, FormattedTime} from 'react-intl';
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// See License.txt for license information.
|
||||
|
||||
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 Utils from '../../utils/utils.jsx';
|
||||
|
||||
@@ -40,6 +40,7 @@ export default class ComplianceSettings extends React.Component {
|
||||
$('#save-button').button('loading');
|
||||
|
||||
const config = this.props.config;
|
||||
const oldEnable = config.ComplianceSettings.Enable;
|
||||
config.ComplianceSettings.Enable = this.refs.Enable.checked;
|
||||
config.ComplianceSettings.Directory = ReactDOM.findDOMNode(this.refs.Directory).value;
|
||||
config.ComplianceSettings.EnableDaily = this.refs.EnableDaily.checked;
|
||||
@@ -47,12 +48,15 @@ export default class ComplianceSettings extends React.Component {
|
||||
Client.saveConfig(
|
||||
config,
|
||||
() => {
|
||||
$('#save-button').button('reset');
|
||||
AsyncClient.getConfig();
|
||||
this.setState({
|
||||
serverError: null,
|
||||
saveNeeded: false
|
||||
});
|
||||
$('#save-button').button('reset');
|
||||
if (oldEnable !== config.ComplianceSettings.Enable) {
|
||||
window.location.reload();
|
||||
}
|
||||
},
|
||||
(err) => {
|
||||
this.setState({
|
||||
|
||||
@@ -5,7 +5,7 @@ import React from 'react';
|
||||
|
||||
export default class Setting extends React.Component {
|
||||
render() {
|
||||
let marginClass;
|
||||
let marginClass = '';
|
||||
if (this.props.margin === 'small') {
|
||||
marginClass = ' form-group--small';
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ const holders = defineMessages({
|
||||
},
|
||||
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: {
|
||||
id: 'user.settings.general.validEmail',
|
||||
@@ -108,7 +108,7 @@ class UserSettingsGeneralTab extends React.Component {
|
||||
this.setState({clientError: formatMessage(holders.usernameReserved)});
|
||||
return;
|
||||
} 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;
|
||||
}
|
||||
|
||||
@@ -773,7 +773,7 @@ class UserSettingsGeneralTab extends React.Component {
|
||||
<span>
|
||||
<FormattedMessage
|
||||
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>
|
||||
);
|
||||
|
||||
@@ -1341,9 +1341,9 @@
|
||||
"user.settings.general.title": "General Settings",
|
||||
"user.settings.general.uploadImage": "Click 'Edit' to upload an image.",
|
||||
"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.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.validImage": "Only JPG or PNG images may be used for profile pictures",
|
||||
"user.settings.import_theme.cancel": "Cancel",
|
||||
|
||||
@@ -1341,9 +1341,7 @@
|
||||
"user.settings.general.title": "Configuración General",
|
||||
"user.settings.general.uploadImage": "Pinchar 'Editar' para subir una imagen.",
|
||||
"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.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.validImage": "Sólo pueden ser utilizadas imágenes JPG o PNG en el perfil",
|
||||
"user.settings.import_theme.cancel": "Cancelar",
|
||||
|
||||
@@ -132,6 +132,7 @@ function preNeedsTeam(nextState, replace, callback) {
|
||||
// for the current url.
|
||||
var teamName = Utils.getTeamNameFromUrl();
|
||||
var team = TeamStore.getByName(teamName);
|
||||
const oldTeamId = TeamStore.getCurrentId();
|
||||
|
||||
if (!team) {
|
||||
browserHistory.push('/');
|
||||
@@ -143,6 +144,12 @@ function preNeedsTeam(nextState, replace, callback) {
|
||||
TeamStore.saveMyTeam(team);
|
||||
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 d2 = $.Deferred(); //eslint-disable-line new-cap
|
||||
|
||||
|
||||
@@ -16,9 +16,10 @@
|
||||
color: $white;
|
||||
font-size: .9em;
|
||||
height: 20px;
|
||||
margin: 5px 0 6px;
|
||||
line-height: 20px;
|
||||
margin: 5px 0 6px;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
|
||||
&:before {
|
||||
background: $light-gray;
|
||||
|
||||
Ссылка в новой задаче
Block a user