summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/command.go94
-rw-r--r--api/command_test.go5
-rw-r--r--api/post_test.go4
-rw-r--r--i18n/en.json112
-rw-r--r--i18n/es.json56
-rw-r--r--model/client.go7
-rw-r--r--model/command.go33
-rw-r--r--store/sql_command_store.go1
-rw-r--r--store/sql_post_store.go9
-rw-r--r--store/sql_post_store_test.go9
-rw-r--r--webapp/components/about_build_modal.jsx6
-rw-r--r--webapp/components/admin_console/legal_and_support_settings.jsx17
-rw-r--r--webapp/components/admin_console/license_settings.jsx64
-rw-r--r--webapp/components/signup_team_complete/components/team_signup_welcome_page.jsx6
-rw-r--r--webapp/components/suggestion/command_provider.jsx4
-rw-r--r--webapp/components/suggestion/suggestion_box.jsx3
-rw-r--r--webapp/components/textbox.jsx1
-rw-r--r--webapp/components/user_settings/manage_command_hooks.jsx313
-rw-r--r--webapp/components/user_settings/user_settings_advanced.jsx4
-rw-r--r--webapp/i18n/en.json89
-rw-r--r--webapp/i18n/es.json44
-rw-r--r--webapp/i18n/pt.json6
-rw-r--r--webapp/utils/async_client.jsx6
-rw-r--r--webapp/utils/client.jsx5
-rw-r--r--webapp/utils/constants.jsx34
25 files changed, 423 insertions, 509 deletions
diff --git a/api/command.go b/api/command.go
index 29cee070e..99fd05d7a 100644
--- a/api/command.go
+++ b/api/command.go
@@ -44,7 +44,7 @@ func InitCommand(r *mux.Router) {
sr := r.PathPrefix("/commands").Subrouter()
sr.Handle("/execute", ApiUserRequired(executeCommand)).Methods("POST")
- sr.Handle("/list", ApiUserRequired(listCommands)).Methods("POST")
+ sr.Handle("/list", ApiUserRequired(listCommands)).Methods("GET")
sr.Handle("/create", ApiUserRequired(createCommand)).Methods("POST")
sr.Handle("/list_team_commands", ApiUserRequired(listTeamCommands)).Methods("GET")
@@ -76,9 +76,7 @@ func listCommands(c *Context, w http.ResponseWriter, r *http.Request) {
} else {
teamCmds := result.Data.([]*model.Command)
for _, cmd := range teamCmds {
- if cmd.ExternalManagement {
- commands = append(commands, autocompleteCommands(c, cmd, r)...)
- } else if cmd.AutoComplete && !seen[cmd.Id] {
+ if cmd.AutoComplete && !seen[cmd.Id] {
cmd.Sanitize()
seen[cmd.Trigger] = true
commands = append(commands, cmd)
@@ -90,92 +88,6 @@ func listCommands(c *Context, w http.ResponseWriter, r *http.Request) {
w.Write([]byte(model.CommandListToJson(commands)))
}
-func autocompleteCommands(c *Context, cmd *model.Command, r *http.Request) []*model.Command {
- props := model.MapFromJson(r.Body)
- command := strings.TrimSpace(props["command"])
- channelId := strings.TrimSpace(props["channelId"])
- parts := strings.Split(command, " ")
- trigger := parts[0][1:]
- message := strings.Join(parts[1:], " ")
-
- chanChan := Srv.Store.Channel().Get(channelId)
- teamChan := Srv.Store.Team().Get(c.Session.TeamId)
- userChan := Srv.Store.User().Get(c.Session.UserId)
-
- var team *model.Team
- if tr := <-teamChan; tr.Err != nil {
- c.Err = tr.Err
- return make([]*model.Command, 0, 32)
- } else {
- team = tr.Data.(*model.Team)
- }
-
- var user *model.User
- if ur := <-userChan; ur.Err != nil {
- c.Err = ur.Err
- return make([]*model.Command, 0, 32)
- } else {
- user = ur.Data.(*model.User)
- }
-
- var channel *model.Channel
- if cr := <-chanChan; cr.Err != nil {
- c.Err = cr.Err
- return make([]*model.Command, 0, 32)
- } else {
- channel = cr.Data.(*model.Channel)
- }
-
- l4g.Debug(fmt.Sprintf(utils.T("api.command.execute_command.debug"), trigger, c.Session.UserId))
- p := url.Values{}
- p.Set("token", cmd.Token)
-
- p.Set("team_id", cmd.TeamId)
- p.Set("team_domain", team.Name)
-
- p.Set("channel_id", channelId)
- p.Set("channel_name", channel.Name)
-
- p.Set("user_id", c.Session.UserId)
- p.Set("user_name", user.Username)
-
- p.Set("command", "/"+trigger)
- p.Set("text", message)
- p.Set("response_url", "not supported yet")
- p.Set("suggest", "true")
-
- method := "POST"
- if cmd.Method == model.COMMAND_METHOD_GET {
- method = "GET"
- }
-
- tr := &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: *utils.Cfg.ServiceSettings.EnableInsecureOutgoingConnections},
- }
- client := &http.Client{Transport: tr}
-
- req, _ := http.NewRequest(method, cmd.URL, strings.NewReader(p.Encode()))
- req.Header.Set("Accept", "application/json")
- if cmd.Method == model.COMMAND_METHOD_POST {
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
- }
-
- if resp, err := client.Do(req); err != nil {
- c.Err = model.NewLocAppError("command", "api.command.execute_command.failed.app_error", map[string]interface{}{"Trigger": trigger}, err.Error())
- } else {
- if resp.StatusCode == http.StatusOK {
- response := model.CommandListFromJson(resp.Body)
-
- return response
-
- } else {
- body, _ := ioutil.ReadAll(resp.Body)
- c.Err = model.NewLocAppError("command", "api.command.execute_command.failed_resp.app_error", map[string]interface{}{"Trigger": trigger, "Status": resp.Status}, string(body))
- }
- }
- return make([]*model.Command, 0, 32)
-}
-
func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) {
props := model.MapFromJson(r.Body)
command := strings.TrimSpace(props["command"])
@@ -247,7 +159,7 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) {
teamCmds := result.Data.([]*model.Command)
for _, cmd := range teamCmds {
- if trigger == cmd.Trigger || cmd.ExternalManagement {
+ if trigger == cmd.Trigger {
l4g.Debug(fmt.Sprintf(utils.T("api.command.execute_command.debug"), trigger, c.Session.UserId))
p := url.Values{}
diff --git a/api/command_test.go b/api/command_test.go
index 8ca8b65b1..22e2bd666 100644
--- a/api/command_test.go
+++ b/api/command_test.go
@@ -24,10 +24,7 @@ func TestListCommands(t *testing.T) {
Client.LoginByEmail(team.Name, user1.Email, "pwd")
- channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
- channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
-
- if results, err := Client.ListCommands(channel1.Id, "/test"); err != nil {
+ if results, err := Client.ListCommands(); err != nil {
t.Fatal(err)
} else {
commands := results.Data.([]*model.Command)
diff --git a/api/post_test.go b/api/post_test.go
index 027043766..2d978d3e3 100644
--- a/api/post_test.go
+++ b/api/post_test.go
@@ -549,10 +549,6 @@ func TestSearchPostsInChannel(t *testing.T) {
t.Fatalf("wrong number of posts returned %v", len(result.Order))
}
- if result := Client.Must(Client.SearchPosts("sgtitlereview in:")).Data.(*model.PostList); len(result.Order) != 2 {
- t.Fatalf("wrong number of posts returned %v", len(result.Order))
- }
-
if result := Client.Must(Client.SearchPosts("sgtitlereview channel:" + channel1.Name)).Data.(*model.PostList); len(result.Order) != 1 {
t.Fatalf("wrong number of posts returned %v", len(result.Order))
}
diff --git a/i18n/en.json b/i18n/en.json
index 775e56cc4..6ba877f56 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -1708,6 +1708,26 @@
"translation": "Inappropriate permissions to regenerate outcoming webhook token"
},
{
+ "id": "ent.compliance.licence_disable.app_error",
+ "translation": "Compliance functionality disabled by current license. Please contact your system administrator about upgrading your enterprise license."
+ },
+ {
+ "id": "ent.compliance.run_failed.error",
+ "translation": "Compliance export failed for job '{{.JobName}}' at '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_finished.info",
+ "translation": "Compliance export finished for job '{{.JobName}}' exported {{.Count}} records to '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_limit.warning",
+ "translation": "Compliance export warning for job '{{.JobName}}' too many rows returned truncating to 30,000 at '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_started.info",
+ "translation": "Compliance export started for job '{{.JobName}}' at '{{.FilePath}}'"
+ },
+ {
"id": "ent.ldap.do_login.bind_admin_user.app_error",
"translation": "Unable to bind to LDAP server. Check BindUsername and BindPassword."
},
@@ -1800,26 +1820,6 @@
"translation": "Failed to read security bulletin details"
},
{
- "id": "ent.compliance.run_started.info",
- "translation": "Compliance export started for job '{{.JobName}}' at '{{.FilePath}}'"
- },
- {
- "id": "ent.compliance.run_failed.error",
- "translation": "Compliance export failed for job '{{.JobName}}' at '{{.FilePath}}'"
- },
- {
- "id": "ent.compliance.run_limit.warning",
- "translation": "Compliance export warning for job '{{.JobName}}' too many rows returned truncating to 30,000 at '{{.FilePath}}'"
- },
- {
- "id": "ent.compliance.run_finished.info",
- "translation": "Compliance export finished for job '{{.JobName}}' exported {{.Count}} records to '{{.FilePath}}'"
- },
- {
- "id": "ent.compliance.licence_disable.app_error",
- "translation": "Compliance functionality disabled by current license. Please contact your system administrator about upgrading your enterprise license."
- },
- {
"id": "mattermost.security_checks.debug",
"translation": "Checking for security update from Mattermost"
},
@@ -1996,6 +1996,30 @@
"translation": "Invalid user id"
},
{
+ "id": "model.compliance.is_valid.create_at.app_error",
+ "translation": "Create at must be a valid time"
+ },
+ {
+ "id": "model.compliance.is_valid.desc.app_error",
+ "translation": "Invalid description"
+ },
+ {
+ "id": "model.compliance.is_valid.end_at.app_error",
+ "translation": "To must be a valid time"
+ },
+ {
+ "id": "model.compliance.is_valid.id.app_error",
+ "translation": "Invalid Id"
+ },
+ {
+ "id": "model.compliance.is_valid.start_at.app_error",
+ "translation": "From must be a valid time"
+ },
+ {
+ "id": "model.compliance.is_valid.start_end_at.app_error",
+ "translation": "To must be greater than From"
+ },
+ {
"id": "model.config.is_valid.email_reset_salt.app_error",
"translation": "Invalid password reset salt for email settings. Must be 32 chars or more."
},
@@ -2240,30 +2264,6 @@
"translation": "Invalid user id"
},
{
- "id": "model.compliance.is_valid.id.app_error",
- "translation": "Invalid Id"
- },
- {
- "id": "model.compliance.is_valid.create_at.app_error",
- "translation": "Create at must be a valid time"
- },
- {
- "id": "model.compliance.is_valid.desc.app_error",
- "translation": "Invalid description"
- },
- {
- "id": "model.compliance.is_valid.start_at.app_error",
- "translation": "From must be a valid time"
- },
- {
- "id": "model.compliance.is_valid.end_at.app_error",
- "translation": "To must be a valid time"
- },
- {
- "id": "model.compliance.is_valid.start_end_at.app_error",
- "translation": "To must be greater than From"
- },
- {
"id": "model.preference.is_valid.category.app_error",
"translation": "Invalid category"
},
@@ -2540,14 +2540,6 @@
"translation": "We encountered an error saving the audit"
},
{
- "id": "store.sql_compliance.save.saving.app_error",
- "translation": "We encountered an error saving the compliance report"
- },
- {
- "id": "store.sql_compliance.get.finding.app_error",
- "translation": "We encountered an error retrieving the compliance reports"
- },
- {
"id": "store.sql_channel.analytics_type_count.app_error",
"translation": "We couldn't get channel type counts"
},
@@ -2760,6 +2752,14 @@
"translation": "We couldn't update the command"
},
{
+ "id": "store.sql_compliance.get.finding.app_error",
+ "translation": "We encountered an error retrieving the compliance reports"
+ },
+ {
+ "id": "store.sql_compliance.save.saving.app_error",
+ "translation": "We encountered an error saving the compliance report"
+ },
+ {
"id": "store.sql_license.get.app_error",
"translation": "We encountered an error getting the license"
},
@@ -2848,10 +2848,6 @@
"translation": "We couldn't get post counts"
},
{
- "id": "store.sql_post.compliance_export.app_error",
- "translation": "We couldn't get posts for compliance export"
- },
- {
"id": "store.sql_post.analytics_posts_count_by_day.app_error",
"translation": "We couldn't get post counts by day"
},
@@ -2860,6 +2856,10 @@
"translation": "We couldn't get user counts with posts"
},
{
+ "id": "store.sql_post.compliance_export.app_error",
+ "translation": "We couldn't get posts for compliance export"
+ },
+ {
"id": "store.sql_post.delete.app_error",
"translation": "We couldn't delete the post"
},
diff --git a/i18n/es.json b/i18n/es.json
index 231ebd9fb..97471ee98 100644
--- a/i18n/es.json
+++ b/i18n/es.json
@@ -1708,6 +1708,26 @@
"translation": "Permisos inapropiados para regenerar un token para el Webhook saliente"
},
{
+ "id": "ent.compliance.licence_disable.app_error",
+ "translation": "La característica de Cumplimiento está deshabilitada para tu licencia actual. Por favor contacta a un administrador del sistema sobre como actualizar a una licencia enterprise."
+ },
+ {
+ "id": "ent.compliance.run_failed.error",
+ "translation": "Fallo el trabajo '{{.JobName}}' para exportar el Cumplimiento en '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_finished.info",
+ "translation": "Se completo la exportación de Cumplimiento para el trabajo '{{.JobName}}' exportados {{.Count}} registros en '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_limit.warning",
+ "translation": "Advertencia en el trabajo '{{.JobName}}' para exportación de Cumplimiento. Se retornaron demasiados registros, truncando a 30,000 en '{{.FilePath}}'"
+ },
+ {
+ "id": "ent.compliance.run_started.info",
+ "translation": "Iniciado el trabajo '{{.JobName}}' para exportar el Cumplimiento en '{{.FilePath}}'"
+ },
+ {
"id": "ent.ldap.do_login.bind_admin_user.app_error",
"translation": "No se pudo enlazar con el servidor LDAP. Revisa las opciones de BindUsername y BindPassword."
},
@@ -1976,6 +1996,30 @@
"translation": "Id de usuario inválido"
},
{
+ "id": "model.compliance.is_valid.create_at.app_error",
+ "translation": "Create debe ser una fecha válida"
+ },
+ {
+ "id": "model.compliance.is_valid.desc.app_error",
+ "translation": "Descripción inválida"
+ },
+ {
+ "id": "model.compliance.is_valid.end_at.app_error",
+ "translation": "Hasta debe ser una fecha válida"
+ },
+ {
+ "id": "model.compliance.is_valid.id.app_error",
+ "translation": "Id inválido"
+ },
+ {
+ "id": "model.compliance.is_valid.start_at.app_error",
+ "translation": "Desde debe ser una fecha válida"
+ },
+ {
+ "id": "model.compliance.is_valid.start_end_at.app_error",
+ "translation": "Desde debe ser mayor que Hasta"
+ },
+ {
"id": "model.config.is_valid.email_reset_salt.app_error",
"translation": "Salt para restablecer contraseñas en la configuración de correos es inválido. Debe ser de 32 caracteres o más."
},
@@ -2708,6 +2752,14 @@
"translation": "No pudimos actualizar el comando"
},
{
+ "id": "store.sql_compliance.get.finding.app_error",
+ "translation": "Se ha detectado un error al recuperar los informes de cumplimiento"
+ },
+ {
+ "id": "store.sql_compliance.save.saving.app_error",
+ "translation": "Se ha detectado un error al guardar el informe de cumplimiento"
+ },
+ {
"id": "store.sql_license.get.app_error",
"translation": "Encontramos un error al obtener la licencia"
},
@@ -2804,6 +2856,10 @@
"translation": "No pudimos obtener la cantidad de usuarios con mensajes"
},
{
+ "id": "store.sql_post.compliance_export.app_error",
+ "translation": "No pudimos obtener los mensajes para exportar el informe de cumplimiento"
+ },
+ {
"id": "store.sql_post.delete.app_error",
"translation": "No pudimos eliminar el mensaje"
},
diff --git a/model/client.go b/model/client.go
index 68cf11414..f5c8ad641 100644
--- a/model/client.go
+++ b/model/client.go
@@ -363,11 +363,8 @@ func (c *Client) Command(channelId string, command string, suggest bool) (*Resul
}
}
-func (c *Client) ListCommands(channelId string, command string) (*Result, *AppError) {
- m := make(map[string]string)
- m["command"] = command
- m["channelId"] = channelId
- if r, err := c.DoApiPost("/commands/list", MapToJson(m)); err != nil {
+func (c *Client) ListCommands() (*Result, *AppError) {
+ if r, err := c.DoApiGet("/commands/list", "", ""); err != nil {
return nil, err
} else {
return &Result{r.Header.Get(HEADER_REQUEST_ID),
diff --git a/model/command.go b/model/command.go
index 8e0b31583..56d88f13c 100644
--- a/model/command.go
+++ b/model/command.go
@@ -14,23 +14,22 @@ const (
)
type Command struct {
- Id string `json:"id"`
- Token string `json:"token"`
- CreateAt int64 `json:"create_at"`
- UpdateAt int64 `json:"update_at"`
- DeleteAt int64 `json:"delete_at"`
- CreatorId string `json:"creator_id"`
- TeamId string `json:"team_id"`
- ExternalManagement bool `json:"external_management"`
- Trigger string `json:"trigger"`
- Method string `json:"method"`
- Username string `json:"username"`
- IconURL string `json:"icon_url"`
- AutoComplete bool `json:"auto_complete"`
- AutoCompleteDesc string `json:"auto_complete_desc"`
- AutoCompleteHint string `json:"auto_complete_hint"`
- DisplayName string `json:"display_name"`
- URL string `json:"url"`
+ Id string `json:"id"`
+ Token string `json:"token"`
+ CreateAt int64 `json:"create_at"`
+ UpdateAt int64 `json:"update_at"`
+ DeleteAt int64 `json:"delete_at"`
+ CreatorId string `json:"creator_id"`
+ TeamId string `json:"team_id"`
+ Trigger string `json:"trigger"`
+ Method string `json:"method"`
+ Username string `json:"username"`
+ IconURL string `json:"icon_url"`
+ AutoComplete bool `json:"auto_complete"`
+ AutoCompleteDesc string `json:"auto_complete_desc"`
+ AutoCompleteHint string `json:"auto_complete_hint"`
+ DisplayName string `json:"display_name"`
+ URL string `json:"url"`
}
func (o *Command) ToJson() string {
diff --git a/store/sql_command_store.go b/store/sql_command_store.go
index a35737bd7..074a6e588 100644
--- a/store/sql_command_store.go
+++ b/store/sql_command_store.go
@@ -34,7 +34,6 @@ func NewSqlCommandStore(sqlStore *SqlStore) CommandStore {
}
func (s SqlCommandStore) UpgradeSchemaIfNeeded() {
- s.CreateColumnIfNotExists("Commands", "ExternalManagement", "tinyint(1)", "boolean", "0")
}
func (s SqlCommandStore) CreateIndexesIfNotExists() {
diff --git a/store/sql_post_store.go b/store/sql_post_store.go
index 3346534ab..68c22f7f6 100644
--- a/store/sql_post_store.go
+++ b/store/sql_post_store.go
@@ -726,13 +726,20 @@ func (s SqlPostStore) Search(teamId string, userId string, params *model.SearchP
terms = wildcard.ReplaceAllLiteralString(terms, ":* ")
}
- terms = strings.Join(strings.Fields(terms), " | ")
+ terms = strings.Join(strings.Fields(terms), " & ")
searchClause := fmt.Sprintf("AND %s @@ to_tsquery(:Terms)", searchType)
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_MYSQL {
searchClause := fmt.Sprintf("AND MATCH (%s) AGAINST (:Terms IN BOOLEAN MODE)", searchType)
searchQuery = strings.Replace(searchQuery, "SEARCH_CLAUSE", searchClause, 1)
+
+ splitTerms := strings.Fields(terms)
+ for i, t := range strings.Fields(terms) {
+ splitTerms[i] = "+" + t
+ }
+
+ terms = strings.Join(splitTerms, " ")
}
queryParams["Terms"] = terms
diff --git a/store/sql_post_store_test.go b/store/sql_post_store_test.go
index d69f7906c..62db6efb5 100644
--- a/store/sql_post_store_test.go
+++ b/store/sql_post_store_test.go
@@ -744,12 +744,17 @@ func TestPostStoreSearch(t *testing.T) {
}
r9 := (<-store.Post().Search(teamId, userId, &model.SearchParams{Terms: "mattermost jersey", IsHashtag: false})).Data.(*model.PostList)
- if len(r9.Order) != 2 {
+ if len(r9.Order) != 0 {
+ t.Fatal("returned wrong search result")
+ }
+
+ r9a := (<-store.Post().Search(teamId, userId, &model.SearchParams{Terms: "corey new york", IsHashtag: false})).Data.(*model.PostList)
+ if len(r9a.Order) != 1 {
t.Fatal("returned wrong search result")
}
r10 := (<-store.Post().Search(teamId, userId, &model.SearchParams{Terms: "matter* jer*", IsHashtag: false})).Data.(*model.PostList)
- if len(r10.Order) != 2 {
+ if len(r10.Order) != 0 {
t.Fatal("returned wrong search result")
}
diff --git a/webapp/components/about_build_modal.jsx b/webapp/components/about_build_modal.jsx
index e2fefc44e..e73d842d0 100644
--- a/webapp/components/about_build_modal.jsx
+++ b/webapp/components/about_build_modal.jsx
@@ -24,7 +24,7 @@ export default class AboutBuildModal extends React.Component {
let title = (
<FormattedMessage
id='about.teamEditiont0'
- defaultMessage='Team Edition T0'
+ defaultMessage='Team Edition'
/>
);
@@ -33,14 +33,14 @@ export default class AboutBuildModal extends React.Component {
title = (
<FormattedMessage
id='about.teamEditiont1'
- defaultMessage='Team Edition T1'
+ defaultMessage='Enterprise Edition'
/>
);
if (license.IsLicensed === 'true') {
title = (
<FormattedMessage
id='about.enterpriseEditione1'
- defaultMessage='Enterprise Edition E1'
+ defaultMessage='Enterprise Edition'
/>
);
licensee = (
diff --git a/webapp/components/admin_console/legal_and_support_settings.jsx b/webapp/components/admin_console/legal_and_support_settings.jsx
index 4997a1385..bbbb3713c 100644
--- a/webapp/components/admin_console/legal_and_support_settings.jsx
+++ b/webapp/components/admin_console/legal_and_support_settings.jsx
@@ -81,7 +81,22 @@ class LegalAndSupportSettings extends React.Component {
return (
<div className='wrapper--fixed'>
-
+ <div className='banner'>
+ <div className='banner__content'>
+ <h4 className='banner__heading'>
+ <FormattedMessage
+ id='admin.support.noteTitle'
+ defaultMessage='Note:'
+ />
+ </h4>
+ <p>
+ <FormattedMessage
+ id='admin.support.noteDescription'
+ defaultMessage='If linking to an external site, URLs should begin with http:// or https://.'
+ />
+ </p>
+ </div>
+ </div>
<h3>
<FormattedMessage
id='admin.support.title'
diff --git a/webapp/components/admin_console/license_settings.jsx b/webapp/components/admin_console/license_settings.jsx
index 5aa0dba7e..ad310d8e0 100644
--- a/webapp/components/admin_console/license_settings.jsx
+++ b/webapp/components/admin_console/license_settings.jsx
@@ -105,36 +105,27 @@ class LicenseSettings extends React.Component {
let licenseType;
let licenseKey;
+ const issued = Utils.displayDate(parseInt(global.window.mm_license.IssuedAt, 10)) + ' ' + Utils.displayTime(parseInt(global.window.mm_license.IssuedAt, 10), true);
+ const startsAt = Utils.displayDate(parseInt(global.window.mm_license.StartsAt, 10));
+ const expiresAt = Utils.displayDate(parseInt(global.window.mm_license.ExpiresAt, 10));
+
if (global.window.mm_license.IsLicensed === 'true') {
- edition = (
- <FormattedMessage
- id='admin.license.enterpriseEdition'
- defaultMessage='Mattermost Enterprise Edition. Designed for enterprise-scale communication.'
- />
- );
+ // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.
+ edition = 'Mattermost Enterprise Edition. Enterprise features on this server have been unlocked with a license key and a valid subscription.';
licenseType = (
- <FormattedHTMLMessage
- id='admin.license.enterpriseType'
- values={{
- terms: global.window.mm_config.TermsOfServiceLink,
- name: global.window.mm_license.Name,
- company: global.window.mm_license.Company,
- users: global.window.mm_license.Users,
- issued: Utils.displayDate(parseInt(global.window.mm_license.IssuedAt, 10)) + ' ' + Utils.displayTime(parseInt(global.window.mm_license.IssuedAt, 10), true),
- start: Utils.displayDate(parseInt(global.window.mm_license.StartsAt, 10)),
- expires: Utils.displayDate(parseInt(global.window.mm_license.ExpiresAt, 10)),
- ldap: global.window.mm_license.LDAP
- }}
- defaultMessage='<div><p>This compiled release of Mattermost platform is provided under a <a href="http://mattermost.com" target="_blank">commercial license</a> from Mattermost, Inc. based on your subscription level and is subject to the <a href="{terms}" target="_blank">Terms of Service.</a></p>
- <p>Your subscription details are as follows:</p>
- Name: {name}<br />
- Company or organization name: {company}<br/>
- Number of users: {users}<br/>
- License issued: {issued}<br/>
- Start date of license: {start}<br/>
- Expiry date of license: {expires}<br/>
- LDAP: {ldap}<br/></div>'
- />
+ <div>
+ <p>
+ {'This software is offered under a commercial license.\n\nSee ENTERPRISE-EDITION-LICENSE.txt in your root install directory for details. See NOTICE.txt for information about open source software used in this system.\n\nYour subscription details are as follows:'}
+ </p>
+ {`Name: ${global.window.mm_license.Name}`}<br/>
+ {`Company or organization name: ${global.window.mm_license.Company}`}<br/>
+ {`Number of users: ${global.window.mm_license.Users}`}<br/>
+ {`License issued: ${issued}`}<br/>
+ {`Start date of license: ${startsAt}`}<br/>
+ {`Expiry date of license: ${expiresAt}`}<br/>
+ <br/>
+ {'See also '}<a href='https://about.mattermost.com/enterprise-edition-terms/'>{'Enterprise Edition Terms of Service'}</a>{' and '}<a href='https://about.mattermost.com/privacy/'>{'Privacy Policy.'}</a>
+ </div>
);
licenseKey = (
@@ -162,20 +153,15 @@ class LicenseSettings extends React.Component {
</div>
);
} else {
+ // Note: DO NOT LOCALISE THESE STRINGS. Legally we can not since the license is in English.
edition = (
- <FormattedMessage
- id='admin.license.teamEdition'
- defaultMessage='Mattermost Team Edition. Designed for teams from 5 to 50 users.'
- />
+ <p>
+ {'Mattermost Enterprise Edition. Unlock enterprise features in this software through the purchase of a subscription from '}
+ <a href='https://mattermost.com/'>{'https://mattermost.com/'}</a>
+ </p>
);
- licenseType = (
- <FormattedHTMLMessage
- id='admin.license.teamType'
- defaultMessage='<span><p>This compiled release of Mattermost platform is offered under an MIT license.</p>
- <p>See MIT-COMPILED-LICENSE.txt in your root install directory for details. See NOTICES.txt for information about open source software used in this system.</p></span>'
- />
- );
+ licenseType = 'This software is offered under a commercial license.\n\nSee ENTERPRISE-EDITION-LICENSE.txt in your root install directory for details. See NOTICE.txt for information about open source software used in this system.';
let fileName;
if (this.state.fileName) {
diff --git a/webapp/components/signup_team_complete/components/team_signup_welcome_page.jsx b/webapp/components/signup_team_complete/components/team_signup_welcome_page.jsx
index 99e633659..78d7cec47 100644
--- a/webapp/components/signup_team_complete/components/team_signup_welcome_page.jsx
+++ b/webapp/components/signup_team_complete/components/team_signup_welcome_page.jsx
@@ -96,7 +96,11 @@ class TeamSignupWelcomePage extends React.Component {
}
handleKeyPress(event) {
if (event.keyCode === 13) {
- this.submitNext(event);
+ if (this.state.useDiff) {
+ this.handleDiffSubmit(event);
+ } else {
+ this.submitNext(event);
+ }
}
}
componentWillUnmount() {
diff --git a/webapp/components/suggestion/command_provider.jsx b/webapp/components/suggestion/command_provider.jsx
index 204f52483..36860fa66 100644
--- a/webapp/components/suggestion/command_provider.jsx
+++ b/webapp/components/suggestion/command_provider.jsx
@@ -37,9 +37,9 @@ CommandSuggestion.propTypes = {
};
export default class CommandProvider {
- handlePretextChanged(suggestionId, pretext, channelId) {
+ handlePretextChanged(suggestionId, pretext) {
if (pretext.startsWith('/')) {
- AsyncClient.getSuggestedCommands(pretext, channelId, suggestionId, CommandSuggestion);
+ AsyncClient.getSuggestedCommands(pretext, suggestionId, CommandSuggestion);
}
}
}
diff --git a/webapp/components/suggestion/suggestion_box.jsx b/webapp/components/suggestion/suggestion_box.jsx
index 97c6c6cd9..e3ec63194 100644
--- a/webapp/components/suggestion/suggestion_box.jsx
+++ b/webapp/components/suggestion/suggestion_box.jsx
@@ -111,7 +111,7 @@ export default class SuggestionBox extends React.Component {
handlePretextChanged(pretext) {
for (const provider of this.props.providers) {
- provider.handlePretextChanged(this.suggestionId, pretext, this.props.channelId);
+ provider.handlePretextChanged(this.suggestionId, pretext);
}
}
@@ -160,7 +160,6 @@ SuggestionBox.propTypes = {
value: React.PropTypes.string.isRequired,
onUserInput: React.PropTypes.func,
providers: React.PropTypes.arrayOf(React.PropTypes.object),
- channelId: React.PropTypes.string,
// explicitly name any input event handlers we override and need to manually call
onChange: React.PropTypes.func,
diff --git a/webapp/components/textbox.jsx b/webapp/components/textbox.jsx
index 952026ed5..1a395072e 100644
--- a/webapp/components/textbox.jsx
+++ b/webapp/components/textbox.jsx
@@ -224,7 +224,6 @@ export default class Textbox extends React.Component {
style={{visibility: this.state.preview ? 'hidden' : 'visible'}}
listComponent={SuggestionList}
providers={this.suggestionProviders}
- channelId={this.props.channelId}
/>
<div
ref='preview'
diff --git a/webapp/components/user_settings/manage_command_hooks.jsx b/webapp/components/user_settings/manage_command_hooks.jsx
index 9703664cc..ce353ad64 100644
--- a/webapp/components/user_settings/manage_command_hooks.jsx
+++ b/webapp/components/user_settings/manage_command_hooks.jsx
@@ -4,13 +4,9 @@
import LoadingScreen from '../loading_screen.jsx';
import * as Client from 'utils/client.jsx';
-import * as Utils from 'utils/utils.jsx';
-import Constants from 'utils/constants.jsx';
import {intlShape, injectIntl, defineMessages, FormattedMessage, FormattedHTMLMessage} from 'react-intl';
-const PreReleaseFeatures = Constants.PRE_RELEASE_FEATURES;
-
const holders = defineMessages({
requestTypePost: {
id: 'user.settings.cmds.request_type_post',
@@ -63,7 +59,6 @@ export default class ManageCommandCmds extends React.Component {
this.getCmds = this.getCmds.bind(this);
this.addNewCmd = this.addNewCmd.bind(this);
this.emptyCmd = this.emptyCmd.bind(this);
- this.updateExternalManagement = this.updateExternalManagement.bind(this);
this.updateTrigger = this.updateTrigger.bind(this);
this.updateURL = this.updateURL.bind(this);
this.updateMethod = this.updateMethod.bind(this);
@@ -104,7 +99,7 @@ export default class ManageCommandCmds extends React.Component {
addNewCmd(e) {
e.preventDefault();
- if (this.state.cmd.url === '' || (this.state.cmd.trigger === '' && !this.state.external_management)) {
+ if (this.state.cmd.trigger === '' || this.state.cmd.url === '') {
return;
}
@@ -194,12 +189,6 @@ export default class ManageCommandCmds extends React.Component {
);
}
- updateExternalManagement(e) {
- var cmd = this.state.cmd;
- cmd.external_management = e.target.checked;
- this.setState(cmd);
- }
-
updateTrigger(e) {
var cmd = this.state.cmd;
cmd.trigger = e.target.value;
@@ -281,26 +270,11 @@ export default class ManageCommandCmds extends React.Component {
);
}
- let slashCommandAutocompleteDiv;
- if (Utils.isFeatureEnabled(PreReleaseFeatures.SLASHCMD_AUTOCMP)) {
- slashCommandAutocompleteDiv = (
- <div className='padding-top x2'>
- <strong>
- <FormattedMessage
- id='user.settings.cmds.external_management'
- defaultMessage='External management: '
- />
- </strong><span className='word-break--all'>{cmd.external_management ? this.props.intl.formatMessage(holders.autocompleteYes) : this.props.intl.formatMessage(holders.autocompleteNo)}</span>
- </div>
- );
- }
-
cmds.push(
<div
key={cmd.id}
className='webhook__item webcmd__item'
>
- {slashCommandAutocompleteDiv}
{triggerDiv}
<div className='padding-top x2 webcmd__url'>
<strong>
@@ -442,188 +416,46 @@ export default class ManageCommandCmds extends React.Component {
</div>
);
- const disableButton = this.state.cmd.url === '' || (this.state.cmd.trigger === '' && !this.state.external_management);
-
- let triggerInput;
- if (!this.state.cmd.external_management) {
- triggerInput = (
- <div className='padding-top x2'>
- <label className='control-label'>
- <FormattedMessage
- id='user.settings.cmds.trigger'
- defaultMessage='Command Trigger Word: '
- />
- </label>
- <div className='padding-top'>
- <input
- ref='trigger'
- className='form-control'
- value={this.state.cmd.trigger}
- onChange={this.updateTrigger}
- placeholder={this.props.intl.formatMessage(holders.addTriggerPlaceholder)}
- />
- </div>
- <div className='padding-top'>
- <FormattedMessage
- id='user.settings.cmds.trigger_desc'
- defaultMessage='Examples: /patient, /client, /employee Reserved: /echo, /join, /logout, /me, /shrug'
- />
- </div>
- </div>
- );
- }
-
- let slashCommandAutocompleteCheckbox;
- if (Utils.isFeatureEnabled(PreReleaseFeatures.SLASHCMD_AUTOCMP)) {
- slashCommandAutocompleteCheckbox = (
- <div className='padding-top x2'>
- <label className='control-label'>
- <FormattedMessage
- id='user.settings.cmds.external_management'
- defaultMessage='External management: '
- />
- </label>
- <div className='padding-top'>
- <div className='checkbox'>
- <label>
- <input
- type='checkbox'
- checked={this.state.cmd.external_management}
- onChange={this.updateExternalManagement}
- />
- <FormattedMessage
- id='user.settings.cmds.slashCmd_autocmp'
- defaultMessage='Enable external application to offer autocomplete'
- />
- </label>
- </div>
- </div>
- </div>
-
- );
- }
-
- let autoCompleteSettings;
- if (!this.state.cmd.external_management) {
- autoCompleteSettings = (
- <div>
- <div className='padding-top x2'>
- <label className='control-label'>
- <FormattedMessage
- id='user.settings.cmds.auto_complete'
- defaultMessage='Autocomplete: '
- />
- </label>
- <div className='padding-top'>
- <div className='checkbox'>
- <label>
- <input
- type='checkbox'
- checked={this.state.cmd.auto_complete}
- onChange={this.updateAutoComplete}
- />
- <FormattedMessage
- id='user.settings.cmds.auto_complete_help'
- defaultMessage=' Show this command in the autocomplete list.'
- />
- </label>
- </div>
- </div>
- </div>
-
- <div className='padding-top x2'>
- <label className='control-label'>
- <FormattedMessage
- id='user.settings.cmds.auto_complete_hint'
- defaultMessage='Autocomplete Hint: '
- />
- </label>
- <div className='padding-top'>
- <input
- ref='autoCompleteHint'
- className='form-control'
- value={this.state.cmd.auto_complete_hint}
- onChange={this.updateAutoCompleteHint}
- placeholder={this.props.intl.formatMessage(holders.addAutoCompleteHintPlaceholder)}
- />
- </div>
- <div className='padding-top'>
- <FormattedMessage
- id='user.settings.cmds.auto_complete_hint_desc'
- defaultMessage='Optional hint in the autocomplete list about parameters needed for command.'
- />
- </div>
- </div>
+ const disableButton = this.state.cmd.trigger === '' || this.state.cmd.url === '';
- <div className='padding-top x2'>
- <label className='control-label'>
- <FormattedMessage
- id='user.settings.cmds.auto_complete_desc'
- defaultMessage='Autocomplete Description: '
- />
- </label>
- <div className='padding-top'>
- <input
- ref='autoCompleteDesc'
- className='form-control'
- value={this.state.cmd.auto_complete_desc}
- onChange={this.updateAutoCompleteDesc}
- placeholder={this.props.intl.formatMessage(holders.addAutoCompleteDescPlaceholder)}
- />
- </div>
- <div className='padding-top'>
- <FormattedMessage
- id='user.settings.cmds.auto_complete_desc_desc'
- defaultMessage='Optional short description of slash command for the autocomplete list.'
- />
- </div>
- </div>
+ return (
+ <div key='addCommandCmd'>
+ <FormattedHTMLMessage
+ id='user.settings.cmds.add_desc'
+ defaultMessage='Create slash commands to send events to external integrations and receive a response. For example typing `/patient Joe Smith` could bring back search results from your internal health records management system for the name “Joe Smith”. Please see <a href="http://docs.mattermost.com/developer/slash-commands.html">Slash commands documentation</a> for detailed instructions. View all slash commands configured on this team below.'
+ />
+ <div><label className='control-label padding-top x2'>
+ <FormattedMessage
+ id='user.settings.cmds.add_new'
+ defaultMessage='Add a new command'
+ />
+ </label></div>
+ <div className='padding-top divider-light'></div>
+ <div className='padding-top'>
<div className='padding-top x2'>
<label className='control-label'>
<FormattedMessage
- id='user.settings.cmds.display_name'
- defaultMessage='Descriptive Label: '
+ id='user.settings.cmds.trigger'
+ defaultMessage='Command Trigger Word: '
/>
</label>
<div className='padding-top'>
<input
- ref='displayName'
+ ref='trigger'
className='form-control'
- value={this.state.cmd.display_name}
- onChange={this.updateDisplayName}
- placeholder={this.props.intl.formatMessage(holders.addDisplayNamePlaceholder)}
+ value={this.state.cmd.trigger}
+ onChange={this.updateTrigger}
+ placeholder={this.props.intl.formatMessage(holders.addTriggerPlaceholder)}
/>
</div>
<div className='padding-top'>
<FormattedMessage
- id='user.settings.cmds.cmd_display_name'
- defaultMessage='Brief description of slash command to show in listings.'
+ id='user.settings.cmds.trigger_desc'
+ defaultMessage='Examples: /patient, /client, /employee Reserved: /echo, /join, /logout, /me, /shrug'
/>
</div>
- {addError}
</div>
- </div>
- );
- }
-
- return (
- <div key='addCommandCmd'>
- <FormattedHTMLMessage
- id='user.settings.cmds.add_desc'
- defaultMessage='Create slash commands to send events to external integrations and receive a response. For example typing `/patient Joe Smith` could bring back search results from your internal health records management system for the name “Joe Smith”. Please see <a href="http://docs.mattermost.com/developer/slash-commands.html">Slash commands documentation</a> for detailed instructions. View all slash commands configured on this team below.'
- />
- <div><label className='control-label padding-top x2'>
- <FormattedMessage
- id='user.settings.cmds.add_new'
- defaultMessage='Add a new command'
- />
- </label></div>
- <div className='padding-top divider-light'></div>
- <div className='padding-top'>
-
- {slashCommandAutocompleteCheckbox}
- {triggerInput}
<div className='padding-top x2'>
<label className='control-label'>
@@ -728,7 +560,102 @@ export default class ManageCommandCmds extends React.Component {
</div>
</div>
- {autoCompleteSettings}
+ <div className='padding-top x2'>
+ <label className='control-label'>
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete'
+ defaultMessage='Autocomplete: '
+ />
+ </label>
+ <div className='padding-top'>
+ <div className='checkbox'>
+ <label>
+ <input
+ type='checkbox'
+ checked={this.state.cmd.auto_complete}
+ onChange={this.updateAutoComplete}
+ />
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete_help'
+ defaultMessage=' Show this command in the autocomplete list.'
+ />
+ </label>
+ </div>
+ </div>
+ </div>
+
+ <div className='padding-top x2'>
+ <label className='control-label'>
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete_hint'
+ defaultMessage='Autocomplete Hint: '
+ />
+ </label>
+ <div className='padding-top'>
+ <input
+ ref='autoCompleteHint'
+ className='form-control'
+ value={this.state.cmd.auto_complete_hint}
+ onChange={this.updateAutoCompleteHint}
+ placeholder={this.props.intl.formatMessage(holders.addAutoCompleteHintPlaceholder)}
+ />
+ </div>
+ <div className='padding-top'>
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete_hint_desc'
+ defaultMessage='Optional hint in the autocomplete list about parameters needed for command.'
+ />
+ </div>
+ </div>
+
+ <div className='padding-top x2'>
+ <label className='control-label'>
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete_desc'
+ defaultMessage='Autocomplete Description: '
+ />
+ </label>
+ <div className='padding-top'>
+ <input
+ ref='autoCompleteDesc'
+ className='form-control'
+ value={this.state.cmd.auto_complete_desc}
+ onChange={this.updateAutoCompleteDesc}
+ placeholder={this.props.intl.formatMessage(holders.addAutoCompleteDescPlaceholder)}
+ />
+ </div>
+ <div className='padding-top'>
+ <FormattedMessage
+ id='user.settings.cmds.auto_complete_desc_desc'
+ defaultMessage='Optional short description of slash command for the autocomplete list.'
+ />
+ </div>
+ </div>
+
+ <div className='padding-top x2'>
+ <label className='control-label'>
+ <FormattedMessage
+ id='user.settings.cmds.display_name'
+ defaultMessage='Descriptive Label: '
+ />
+ </label>
+ <div className='padding-top'>
+ <input
+ ref='displayName'
+ className='form-control'
+ value={this.state.cmd.display_name}
+ onChange={this.updateDisplayName}
+ placeholder={this.props.intl.formatMessage(holders.addDisplayNamePlaceholder)}
+ />
+ </div>
+ <div className='padding-top'>
+ <FormattedMessage
+ id='user.settings.cmds.cmd_display_name'
+ defaultMessage='Brief description of slash command to show in listings.'
+ />
+ </div>
+ {addError}
+ </div>
<div className='padding-top x2 padding-bottom'>
<a
diff --git a/webapp/components/user_settings/user_settings_advanced.jsx b/webapp/components/user_settings/user_settings_advanced.jsx
index 40897e8c9..7c496f57b 100644
--- a/webapp/components/user_settings/user_settings_advanced.jsx
+++ b/webapp/components/user_settings/user_settings_advanced.jsx
@@ -51,10 +51,6 @@ const holders = defineMessages({
EMBED_TOGGLE: {
id: 'user.settings.advance.embed_toggle',
defaultMessage: 'Show toggle for all embed previews'
- },
- SLASHCMD_AUTOCMP: {
- id: 'user.settings.advance.slashCmd_autocmp',
- defaultMessage: 'Enable external application to offer slash command autocomplete'
}
});
diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json
index 9a9477557..e4485dc29 100644
--- a/webapp/i18n/en.json
+++ b/webapp/i18n/en.json
@@ -1,12 +1,12 @@
{
"about.close": "Close",
"about.date": "Build Date:",
- "about.enterpriseEditione1": "Enterprise Edition E1",
+ "about.enterpriseEditione1": "Enterprise Edition",
"about.hash": "Build Hash:",
"about.licensed": "Licensed by:",
"about.number": "Build Number:",
- "about.teamEditiont0": "Team Edition T0",
- "about.teamEditiont1": "Team Edition T1",
+ "about.teamEditiont0": "Team Edition",
+ "about.teamEditiont1": "Enterprise Edition",
"about.title": "About Mattermost",
"about.version": "Version:",
"access_history.title": "Access History",
@@ -24,6 +24,39 @@
"activity_log_modal.iphoneNativeApp": "iPhone Native App",
"admin.audits.reload": "Reload",
"admin.audits.title": "User Activity",
+ "admin.compliance.directoryDescription": "Directory to which compliance reports are written. If blank, will be set to ./data/.",
+ "admin.compliance.directoryExample": "Ex \"./data/\"",
+ "admin.compliance.directoryTitle": "Compliance Directory Location:",
+ "admin.compliance.enableDailyTitle": "Enable Daily Report:",
+ "admin.compliance.enableDesc": "When true, Mattermost will generate a daily compliance report.",
+ "admin.compliance.enableTitle": "Enable Compliance:",
+ "admin.compliance.false": "false",
+ "admin.compliance.noLicense": "<h4 class=\"banner__heading\">Note:</h4><p>Compliance is an enterprise feature. Your current license does not support Compliance. Click <a href=\"http://mattermost.com\" target=\"_blank\">here</a> for information and pricing on enterprise licenses.</p>",
+ "admin.compliance.save": "Save",
+ "admin.compliance.saving": "Saving Config...",
+ "admin.compliance.title": "Compliance Settings",
+ "admin.compliance.true": "true",
+ "admin.compliance_reports.desc": "Job Name:",
+ "admin.compliance_reports.desc_placeholder": "Ex \"Audit 445 for HR\"",
+ "admin.compliance_reports.emails": "Emails:",
+ "admin.compliance_reports.emails_placeholder": "Ex \"bill@example.com, bob@example.com\"",
+ "admin.compliance_reports.from": "From:",
+ "admin.compliance_reports.from_placeholder": "Ex \"2016-03-11\"",
+ "admin.compliance_reports.keywords": "Keywords:",
+ "admin.compliance_reports.keywords_placeholder": "Ex \"shorting stock\"",
+ "admin.compliance_reports.reload": "Reload",
+ "admin.compliance_reports.run": "Run",
+ "admin.compliance_reports.title": "Compliance Reports",
+ "admin.compliance_reports.to": "To:",
+ "admin.compliance_reports.to_placeholder": "Ex \"2016-03-15\"",
+ "admin.compliance_table.desc": "Description",
+ "admin.compliance_table.download": "Download",
+ "admin.compliance_table.params": "Params",
+ "admin.compliance_table.records": "Records",
+ "admin.compliance_table.status": "Status",
+ "admin.compliance_table.timestamp": "Timestamp",
+ "admin.compliance_table.type": "Type",
+ "admin.compliance_table.userId": "Requested By",
"admin.email.allowEmailSignInDescription": "When true, Mattermost allows users to sign in using their email and password.",
"admin.email.allowEmailSignInTitle": "Allow Sign In With Email: ",
"admin.email.allowSignupDescription": "When true, Mattermost allows team creation and account signup using email and password. This value should be false only when you want to limit signup to a single-sign-on service like OAuth or LDAP.",
@@ -195,51 +228,11 @@
"admin.ldap.uernameAttrDesc": "The attribute in the LDAP server that will be used to populate the username field in Mattermost. This may be the same as the ID Attribute.",
"admin.ldap.usernameAttrEx": "Ex \"sAMAccountName\"",
"admin.ldap.usernameAttrTitle": "Username Attribute:",
- "admin.compliance.saving": "Saving Config...",
- "admin.compliance.directoryExample": "Ex \"./data/\"",
- "admin.compliance.noLicense": "<h4 class=\"banner__heading\">Note:</h4><p>Compliance is an enterprise feature. Your current license does not support Compliance. Click <a href=\"http://mattermost.com\" target=\"_blank\">here</a> for information and pricing on enterprise licenses.</p>",
- "admin.compliance.title": "Compliance Settings",
- "admin.compliance.enableTitle": "Enable Compliance:",
- "admin.compliance.true": "true",
- "admin.compliance.false": "false",
- "admin.compliance.enableDesc": "When true, Mattermost allows compliance reporting",
- "admin.compliance.directoryTitle": "Compliance Directory Location:",
- "admin.compliance.directoryDescription": "Directory to which compliance reports are written. If blank, will be set to ./data/.",
- "admin.compliance.enableDailyTitle": "Enable Daily Report:",
- "admin.compliance.enableDesc": "When true, Mattermost will generate a daily compliance report.",
- "admin.compliance.save": "Save",
- "admin.compliance_reports.from": "From:",
- "admin.compliance_reports.to": "To:",
- "admin.compliance_reports.emails": "Emails:",
- "admin.compliance_reports.keywords": "Keywords:",
- "admin.compliance_table.download": "Download",
- "admin.compliance_table.timestamp": "Timestamp",
- "admin.compliance_table.status": "Status",
- "admin.compliance_table.records": "Records",
- "admin.compliance_table.type": "Type",
- "admin.compliance_table.desc": "Description",
- "admin.compliance_table.userId": "Requested By",
- "admin.compliance_table.params": "Params",
- "admin.compliance_reports.title": "Compliance Reports",
- "admin.compliance_reports.desc": "Job Name:",
- "admin.compliance_reports.desc_placeholder": "Ex \"Audit 445 for HR\"",
- "admin.compliance_reports.from_placeholder": "Ex \"2016-03-11\"",
- "admin.compliance_reports.to_placeholder": "Ex \"2016-03-15\"",
- "admin.compliance_reports.emails_placeholder": "Ex \"bill@example.com, bob@example.com\"",
- "admin.compliance_reports.keywords_placeholder": "Ex \"shorting stock\"",
- "admin.compliance_reports.run": "Run",
- "admin.compliance_reports.reload": "Reload",
"admin.licence.keyMigration": "If you’re migrating servers you may need to remove your license key from this server in order to install it on a new server. To start, <a href=\"http://mattermost.com\" target=\"_blank\">disable all Enterprise Edition features on this server</a>. This will enable the ability to remove the license key and downgrade this server from Enterprise Edition to Team Edition.",
"admin.license.chooseFile": "Choose File",
- "admin.license.edition": "Edition: ",
- "admin.license.enterpriseEdition": "Mattermost Enterprise Edition. Designed for enterprise-scale communication.",
- "admin.license.enterpriseType": "<div><p>This compiled release of Mattermost platform is provided under a <a href=\"http://mattermost.com\" target=\"_blank\">commercial license</a> from Mattermost, Inc. based on your subscription level and is subject to the <a href=\"{terms}\" target=\"_blank\">Terms of Service.</a></p><p>Your subscription details are as follows:</p>Name: {name}<br />Company or organization name: {company}<br/>Number of users: {users}<br/>License issued: {issued}<br/>Start date of license: {start}<br/>Expiry date of license: {expires}<br/>LDAP: {ldap}<br/></div>",
- "admin.license.key": "License Key: ",
"admin.license.keyRemove": "Remove Enterprise License and Downgrade Server",
"admin.license.noFile": "No file uploaded",
"admin.license.removing": "Removing License...",
- "admin.license.teamEdition": "Mattermost Team Edition. Designed for teams from 5 to 50 users.",
- "admin.license.teamType": "<span><p>This compiled release of Mattermost platform is offered under an MIT license.</p><p>See MIT-COMPILED-LICENSE.txt in your root install directory for details. See NOTICES.txt for information about open source software used in this system.</p></span>",
"admin.license.title": "Edition and License",
"admin.license.type": "License: ",
"admin.license.upload": "Upload",
@@ -364,12 +357,12 @@
"admin.service.webhooksTitle": "Enable Incoming Webhooks: ",
"admin.sidebar.addTeamSidebar": "Add team from sidebar menu",
"admin.sidebar.audits": "Compliance and Auditing",
+ "admin.sidebar.compliance": "Compliance Settings",
"admin.sidebar.email": "Email Settings",
"admin.sidebar.file": "File Settings",
"admin.sidebar.gitlab": "GitLab Settings",
"admin.sidebar.ldap": "LDAP Settings",
"admin.sidebar.license": "Edition and License",
- "admin.sidebar.compliance": "Compliance Settings",
"admin.sidebar.loading": "Loading",
"admin.sidebar.log": "Log Settings",
"admin.sidebar.logs": "Logs",
@@ -426,6 +419,8 @@
"admin.support.termsDesc": "Link to Terms of Service available to users on desktop and on mobile. Leaving this blank will hide the option to display a notice.",
"admin.support.termsTitle": "Terms of Service link:",
"admin.support.title": "Legal and Support Settings",
+ "admin.support.noteTitle": "Note:",
+ "admin.support.noteDescription": "If linking to an external site, URLs should begin with http:// or https://.",
"admin.system_analytics.activeUsers": "Active Users With Posts",
"admin.system_analytics.title": "the System",
"admin.system_analytics.totalPosts": "Total Posts",
@@ -1130,7 +1125,6 @@
"tutorial_tip.seen": "Seen this before? ",
"upload_overlay.info": "Drop a file to upload it.",
"user.settings.advance.embed_preview": "Show preview snippet of links below message",
- "user.settings.advance.slashCmd_autocmp": "Enable external application to offer slash command autocomplete",
"user.settings.advance.embed_toggle": "Show toggle for all embed previews",
"user.settings.advance.enabled": "enabled",
"user.settings.advance.feature": " Feature ",
@@ -1142,6 +1136,7 @@
"user.settings.advance.preReleaseTitle": "Preview pre-release features",
"user.settings.advance.sendDesc": "If enabled 'Enter' inserts a new line and 'Ctrl + Enter' submits the message.",
"user.settings.advance.sendTitle": "Send messages on Ctrl + Enter",
+ "user.settings.advance.slashCmd_autocmp": "Enable external application to offer slash command autocomplete",
"user.settings.advance.title": "Advanced Settings",
"user.settings.cmds.add": "Add",
"user.settings.cmds.add_desc": "Create slash commands to send events to external integrations and receive a response. For example typing `/patient Joe Smith` could bring back search results from your internal health records management system for the name “Joe Smith”. Please see <a href=\"http://docs.mattermost.com/developer/slash-commands.html\">Slash commands documentation</a> for detailed instructions. View all slash commands configured on this team below.",
@@ -1170,6 +1165,7 @@
"user.settings.cmds.request_type_desc": "The type of command request issued to the Request URL.",
"user.settings.cmds.request_type_get": "GET",
"user.settings.cmds.request_type_post": "POST",
+ "user.settings.cmds.slashCmd_autocmp": "Enable external application to offer autocomplete",
"user.settings.cmds.token": "Token: ",
"user.settings.cmds.trigger": "Command Trigger Word: ",
"user.settings.cmds.trigger_desc": "Examples: /patient, /client, /employee Reserved: /echo, /join, /logout, /me, /shrug",
@@ -1178,7 +1174,6 @@
"user.settings.cmds.url_desc": "The callback URL to receive the HTTP POST or GET event request when the slash command is run.",
"user.settings.cmds.username": "Response Username: ",
"user.settings.cmds.username_desc": "Choose a username override for responses for this slash command. Usernames can consist of up to 22 characters consisting of lowercase letters, numbers and they symbols \"-\", \"_\", and \".\" .",
- "user.settings.cmds.slashCmd_autocmp": "Enable external application to offer autocomplete",
"user.settings.custom_theme.awayIndicator": "Away Indicator",
"user.settings.custom_theme.buttonBg": "Button BG",
"user.settings.custom_theme.buttonColor": "Button Text",
@@ -1354,4 +1349,4 @@
"web.footer.terms": "Terms",
"web.header.back": "Back",
"web.root.singup_info": "All team communication in one place, searchable and accessible anywhere"
-} \ No newline at end of file
+}
diff --git a/webapp/i18n/es.json b/webapp/i18n/es.json
index 457752b64..021b41051 100644
--- a/webapp/i18n/es.json
+++ b/webapp/i18n/es.json
@@ -24,6 +24,39 @@
"activity_log_modal.iphoneNativeApp": "iPhone App Nativa",
"admin.audits.reload": "Recargar",
"admin.audits.title": "Auditorías del Servidor",
+ "admin.compliance.directoryDescription": "Directorio en el que se escriben los informes de cumplimiento. Si se deja en blanco, se utilizará ./data/.",
+ "admin.compliance.directoryExample": "Ej \"./data/\"",
+ "admin.compliance.directoryTitle": "Ubicación del Directorio de Cumplimiento:",
+ "admin.compliance.enableDailyTitle": "Habilitar Informes Diarios:",
+ "admin.compliance.enableDesc": "Cuando es verdadero, Mattermost generará un informe diario de cumplimiento.",
+ "admin.compliance.enableTitle": "Habilitar el Cumplimiento:",
+ "admin.compliance.false": "falso",
+ "admin.compliance.noLicense": "<h4 class=\"banner__heading\">Nota:</h4><p>El Cumplimiento es una característica de la edición enterprise. Tu licencia actual no soporta Cumplimiento. Pincha <a href=\"http://mattermost.com\" target=\"_blank\">aquí</a> para información y precio de las licencias enterprise.</p>",
+ "admin.compliance.save": "Guardar",
+ "admin.compliance.saving": "Guardando...",
+ "admin.compliance.title": "Configuración de Cumplimiento",
+ "admin.compliance.true": "verdadero",
+ "admin.compliance_reports.desc": "Nombre del trabajo:",
+ "admin.compliance_reports.desc_placeholder": "Ej \"Auditoria 445 para RRHH\"",
+ "admin.compliance_reports.emails": "Correos electrónicos:",
+ "admin.compliance_reports.emails_placeholder": "Ej \"bill@ejemplo.com, bob@ejemplo.com\"",
+ "admin.compliance_reports.from": "Desde:",
+ "admin.compliance_reports.from_placeholder": "Ej \"2016-03-11\"",
+ "admin.compliance_reports.keywords": "Palabras clave:",
+ "admin.compliance_reports.keywords_placeholder": "Ej \"acortar inventario\"",
+ "admin.compliance_reports.reload": "Recargar",
+ "admin.compliance_reports.run": "Ejecutar",
+ "admin.compliance_reports.title": "Informes de Cumplimiento",
+ "admin.compliance_reports.to": "Hasta:",
+ "admin.compliance_reports.to_placeholder": "Ej \"2016-03-15\"",
+ "admin.compliance_table.desc": "Descripción",
+ "admin.compliance_table.download": "Descargar",
+ "admin.compliance_table.params": "Parámetros",
+ "admin.compliance_table.records": "Registros",
+ "admin.compliance_table.status": "Estado",
+ "admin.compliance_table.timestamp": "Marca de tiempo",
+ "admin.compliance_table.type": "Tipo",
+ "admin.compliance_table.userId": "Solicitado por",
"admin.email.allowEmailSignInDescription": "Cuando es verdadero, Mattermost permite a los usuarios iniciar sesión utilizando el correo electrónico y contraseña.",
"admin.email.allowEmailSignInTitle": "Permitir inicio de sesión con Correo electrónico: ",
"admin.email.allowSignupDescription": "Cuando está en verdadero, Mattermost permite la creación de equipos y cuentas utilizando el correo electrónico y contraseña. Este valor debe estar en falso sólo cuando quieres limitar el inicio de sesión a través de servicios tipo OAuth o LDAP.",
@@ -197,15 +230,9 @@
"admin.ldap.usernameAttrTitle": "Atributo Usuario:",
"admin.licence.keyMigration": "Si estás migrando servidores es posible que necesites remover tu licencia de este servidor para poder instalarlo en un servidor nuevo. Para empezar, <a href=\"http://mattermost.com\" target=\"_blank\">deshabilita todas las características de la Edición Enterprise de este servidor</a>. Esta operación habilitará la opción para remover la licencia y degradar este servidor de la Edición Enterprise a la Edición Team.",
"admin.license.chooseFile": "Escoger Archivo",
- "admin.license.edition": "Edición: ",
- "admin.license.enterpriseEdition": "Mattermost Edición Enterprise. Diseñada para comunicación de escala empresarial.",
- "admin.license.enterpriseType": "<div><p>Esta versión compilada de la plataforma de Mattermost es provista bajo una <a href=\"http://mattermost.com\" target=\"_blank\">licencia comercial</a> de Mattermost, Inc. en función en su nivel de subscripción y bajo los <a href=\"{terms}\" target=\"_blank\">Términos del Servicio.</a></p><p>Los detalles de tu subscripción son los siguientes:</p>Nombre: {name}<br />Nombre compañía u organización: {company}<br/>Cantidad de usuarios: {users}<br/>Licencia emitida: {issued}<br/>Fecha de inicio: {start}<br/>Fecha de expiración: {expires}<br/>LDAP: {ldap}<br/></div>",
- "admin.license.key": "Llave de la Licencia: ",
"admin.license.keyRemove": "Remover la Licencia Enterprise y Degradar el Servidor",
"admin.license.noFile": "No se subió ningún archivo",
"admin.license.removing": "Removiendo Licencia...",
- "admin.license.teamEdition": "Mattermost Edición Team. Diseñado para equipos desde 5 hasta 50 usuarios.",
- "admin.license.teamType": "<span><p>Esta versión compilada de la plataforma de Mattermost es proporcionada bajo la licencia MIT.</p><p>Lea MIT-COMPILED-LICENSE.txt en el directorio raíz de la instalación para más detalles. Lea NOTICES.txt para información sobre software libre utilizado en este sistema.</p></span>",
"admin.license.title": "Edición y Licencia",
"admin.license.type": "Licencia: ",
"admin.license.upload": "Subir",
@@ -330,6 +357,7 @@
"admin.service.webhooksTitle": "Habilitar Webhooks de Entrada: ",
"admin.sidebar.addTeamSidebar": "Agregar un equipo el menú lateral",
"admin.sidebar.audits": "Auditorías",
+ "admin.sidebar.compliance": "Configuración de Cumplimiento",
"admin.sidebar.email": "Configuración de correo",
"admin.sidebar.file": "Configuracion de archivos",
"admin.sidebar.gitlab": "Configuración de GitLab",
@@ -1106,6 +1134,7 @@
"user.settings.advance.preReleaseTitle": "Previsualizar características de pre-lanzamiento",
"user.settings.advance.sendDesc": "Si está habilitado 'Retorno' inserta una nueva linea y 'Ctrl + Retorno' envía el mensaje.",
"user.settings.advance.sendTitle": "Enviar mensajes con Ctrl + Retorno",
+ "user.settings.advance.slashCmd_autocmp": "Habilitar que una aplicación externa ofrezca el autocompletado de los comandos de barra",
"user.settings.advance.title": "Configuración Avanzada",
"user.settings.cmds.add": "Agregar",
"user.settings.cmds.add_desc": "Crea comandos de barra para enviar eventos a integraciones externas recibiendo una respuesta. Por ejemplo al escribir `/paciente Joe Smith` podría retornar los resultados de una búsqueda de los regístros de salud en tu sistema de administración para el nombre “Joe Smith”. Revisa la <a href=\"http://docs.mattermost.com/developer/slash-commands.html\">documentación de Comandos de Barra</a> para instrucciones detalladas. Ver todos los comandos de barra configurados para este equipo en la parte de abajo.",
@@ -1134,6 +1163,7 @@
"user.settings.cmds.request_type_desc": "El tipo de comando que se utiliza al hacer una solicitud al URL.",
"user.settings.cmds.request_type_get": "GET",
"user.settings.cmds.request_type_post": "POST",
+ "user.settings.cmds.slashCmd_autocmp": "Habilitar que una aplicación externa ofrezca autocompletado",
"user.settings.cmds.token": "Token: ",
"user.settings.cmds.trigger": "Palabra Gatilladora del Comando: ",
"user.settings.cmds.trigger_desc": "Ejemplos: /paciente, /cliente, /empleado Reservadas: /echo, /join, /logout, /me, /shrug",
@@ -1317,4 +1347,4 @@
"web.footer.terms": "Términos",
"web.header.back": "Atrás",
"web.root.singup_info": "Todas las comunicaciones del equipo en un sólo lugar, con búsquedas y accesible desde cualquier parte"
-} \ No newline at end of file
+}
diff --git a/webapp/i18n/pt.json b/webapp/i18n/pt.json
index 17ffe1b16..395994bab 100644
--- a/webapp/i18n/pt.json
+++ b/webapp/i18n/pt.json
@@ -1,12 +1,12 @@
{
"about.close": "Fechar",
"about.date": "Data De Criação:",
- "about.enterpriseEditione1": "Enterprise Edition E1",
+ "about.enterpriseEditione1": "Enterprise Edition",
"about.hash": "Hash de Compilação:",
"about.licensed": "Licenciado pela:",
"about.number": "O Número De Compilação:",
- "about.teamEditiont0": "Team Edition T0",
- "about.teamEditiont1": "Team Edition T1",
+ "about.teamEditiont0": "Team Edition",
+ "about.teamEditiont1": "Enterprise Edition",
"about.title": "Sobre o Mattermost",
"about.version": "Versão:",
"access_history.title": "Histórico de Acesso",
diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx
index 2392b50b9..d3f91bb0e 100644
--- a/webapp/utils/async_client.jsx
+++ b/webapp/utils/async_client.jsx
@@ -781,12 +781,12 @@ export function savePreferences(preferences, success, error) {
);
}
-export function getSuggestedCommands(command, channelId, suggestionId, component) {
- client.listCommands({command: command, channelId: channelId},
+export function getSuggestedCommands(command, suggestionId, component) {
+ client.listCommands(
(data) => {
var matches = [];
data.forEach((cmd) => {
- if (('/' + cmd.trigger).indexOf(command) === 0 || cmd.external_management) {
+ if (('/' + cmd.trigger).indexOf(command) === 0) {
let s = '/' + cmd.trigger;
let hint = '';
if (cmd.auto_complete_hint && cmd.auto_complete_hint.length !== 0) {
diff --git a/webapp/utils/client.jsx b/webapp/utils/client.jsx
index 69bda4303..e29cf71d3 100644
--- a/webapp/utils/client.jsx
+++ b/webapp/utils/client.jsx
@@ -1031,13 +1031,12 @@ export function regenCommandToken(data, success, error) {
});
}
-export function listCommands(data, success, error) {
+export function listCommands(success, error) {
$.ajax({
url: '/api/v1/commands/list',
dataType: 'json',
contentType: 'application/json',
- type: 'POST',
- data: JSON.stringify(data),
+ type: 'GET',
success,
error: function onError(xhr, status, err) {
var e = handleError('listCommands', xhr, status, err);
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
index 4ee934e11..872bdb8ab 100644
--- a/webapp/utils/constants.jsx
+++ b/webapp/utils/constants.jsx
@@ -429,6 +429,21 @@ export default {
uiName: 'Mention Highlight Link'
},
{
+ group: 'linkAndButtonElements',
+ id: 'linkColor',
+ uiName: 'Link Color'
+ },
+ {
+ group: 'linkAndButtonElements',
+ id: 'buttonBg',
+ uiName: 'Button BG'
+ },
+ {
+ group: 'linkAndButtonElements',
+ id: 'buttonColor',
+ uiName: 'Button Text'
+ },
+ {
group: 'centerChannelElements',
id: 'codeTheme',
uiName: 'Code Theme',
@@ -458,21 +473,6 @@ export default {
iconURL: monokaiIcon
}
]
- },
- {
- group: 'linkAndButtonElements',
- id: 'linkColor',
- uiName: 'Link Color'
- },
- {
- group: 'linkAndButtonElements',
- id: 'buttonBg',
- uiName: 'Button BG'
- },
- {
- group: 'linkAndButtonElements',
- id: 'buttonColor',
- uiName: 'Button Text'
}
],
DEFAULT_CODE_THEME: 'github',
@@ -595,10 +595,6 @@ export default {
EMBED_TOGGLE: {
label: 'embed_toggle',
description: 'Show toggle for all embed previews'
- },
- SLASHCMD_AUTOCMP: {
- label: 'slashCmd_autocmp',
- description: 'Enable external application to offer slash command autocomplete'
}
},
OVERLAY_TIME_DELAY: 400,