summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md7
-rw-r--r--Makefile2
-rw-r--r--api/file.go4
-rw-r--r--doc/README.md33
-rw-r--r--doc/api/Overview.md2
-rw-r--r--doc/developer/Code-Contribution-Guidelines.md6
-rw-r--r--doc/developer/Setup.md4
-rw-r--r--doc/help/Manage-Team.md37
-rw-r--r--doc/help/README.md12
-rw-r--r--doc/help/Slack-Import.md (renamed from doc/usage/Slack-Import.md)6
-rw-r--r--doc/install/Release-Numbering.md2
-rw-r--r--doc/install/SMTP-Email-Setup.md14
-rw-r--r--doc/integrations/webhooks/Incoming-Webhooks.md80
-rw-r--r--doc/integrations/webhooks/Incoming.md62
-rw-r--r--web/react/components/channel_loader.jsx6
-rw-r--r--web/react/components/create_comment.jsx40
-rw-r--r--web/react/components/get_link_modal.jsx1
-rw-r--r--web/react/components/setting_item_max.jsx11
-rw-r--r--web/react/components/settings_sidebar.jsx2
-rw-r--r--web/react/components/signup_user_complete.jsx2
-rw-r--r--web/react/components/textbox.jsx2
-rw-r--r--web/react/components/user_settings/user_settings_general.jsx3
-rw-r--r--web/react/components/user_settings/user_settings_integrations.jsx2
-rw-r--r--web/react/components/view_image.jsx3
-rw-r--r--web/react/utils/constants.jsx2
-rw-r--r--web/react/utils/utils.jsx7
-rw-r--r--web/sass-files/sass/partials/_base.scss5
-rw-r--r--web/sass-files/sass/partials/_headers.scss5
-rw-r--r--web/sass-files/sass/partials/_markdown.scss9
-rw-r--r--web/sass-files/sass/partials/_modal.scss3
-rw-r--r--web/sass-files/sass/partials/_post.scss8
-rw-r--r--web/sass-files/sass/partials/_responsive.scss5
-rw-r--r--web/sass-files/sass/partials/_settings.scss1
-rw-r--r--web/sass-files/sass/partials/_sidebar--right.scss1
-rw-r--r--web/templates/channel.html2
35 files changed, 256 insertions, 135 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 66e430f7c..eac1e61e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,9 +2,9 @@
## UNDER DEVELOPMENT - Release v1.1.0
--The "UNDER DEVELOPMENT" section of the Mattermost changelog appears in the product's `master` branch to note key changes committed to master and are on their way to the next stable release. When a stable release is pushed the "UNDER DEVELOPMENT" heading is removed from the final changelog of the release.
--
--- **Final release anticipated:** 2015-10-16
+The "UNDER DEVELOPMENT" section of the Mattermost changelog appears in the product's `master` branch to note key changes committed to master and are on their way to the next stable release. When a stable release is pushed the "UNDER DEVELOPMENT" heading is removed from the final changelog of the release.
+
+- **Final release anticipated:** 2015-10-16
### Release Highlights
@@ -20,7 +20,6 @@ Integrations
Documentation
-- Contents of `/docs` now hosted at docs.mattermost.org
- Added documentation on config.json and System Console settings
- Docker Toolbox replaces deprecated Boot2Docker instructions in container install documentation
diff --git a/Makefile b/Makefile
index 12b209c84..103370288 100644
--- a/Makefile
+++ b/Makefile
@@ -116,7 +116,7 @@ travis:
rm $(DIST_PATH)/web/templates/*.bak
mv doc/README.md doc/index.md
- mkdocs build
+ mkdocs build --strict
cp -r documentation-html $(DIST_PATH)/documentation-html
tar -C dist -czf $(DIST_PATH).tar.gz mattermost
diff --git a/api/file.go b/api/file.go
index 9ebcd821b..429347596 100644
--- a/api/file.go
+++ b/api/file.go
@@ -408,11 +408,11 @@ func getFile(c *Context, w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Length", strconv.Itoa(len(f)))
w.Header().Del("Content-Type") // Content-Type will be set automatically by the http writer
- // attach extra headers to trigger a download on IE and Edge
+ // attach extra headers to trigger a download on IE, Edge, and Safari
ua := user_agent.New(r.UserAgent())
bname, _ := ua.Browser()
- if bname == "Edge" || bname == "Internet Explorer" {
+ if bname == "Edge" || bname == "Internet Explorer" || bname == "Safari" {
// trim off anything before the final / so we just get the file's name
parts := strings.Split(filename, "/")
diff --git a/doc/README.md b/doc/README.md
index 4c7c4cc0e..fcda4fd08 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -2,17 +2,23 @@
## Installation
+#### Preview Installation
+Get up and running quickly with Docker-based install
+
- [AWS Elastic Beanstalk Setup](install/Amazon-Elastic-Beanstalk.md)
- [Docker Single Container Preview Setup](install/Docker-Single-Container.md)
-- [Production Ubuntu Setup](install/Production-Ubuntu.md)
-- [Mattermost Release Numbering Scheme](install/Release-Numbering.md)
-- [Software and Hardware Requirements](install/Requirements.md)
- [SMTP Email Setup](install/SMTP-Email-Setup.md)
-## Integrations
+#### Production Installation
+Set up Mattermost in your data center
+- [Software and Hardware Requirements](install/Requirements.md)
+- [Production Ubuntu Setup](install/Production-Ubuntu.md)
+- [SMTP Email Setup](install/SMTP-Email-Setup.md)
-- [GitLab SSO Configuration](integrations/Single-Sign-On/Gitlab.md)
-- [Incoming Webhooks](integrations/webhooks/Incoming.md)
+#### Configuration and Management
+- Configuration Settings Overview
+ - [GitLab SSO Configuration](integrations/Single-Sign-On/Gitlab.md)
+- [Mattermost Release Numbering Scheme](install/Release-Numbering.md)
## Developer Documentation
@@ -20,8 +26,17 @@
- [Developer Machine Setup](developer/Setup.md)
- [Mattermost Style Guide](developer/Style-Guide.md)
- [API Overview](api/Overview.md)
+ - [Incoming Webhooks](integrations/webhooks/Incoming-Webhooks.md)
+
+## Help
+
+_Note: End user help documentation is a new feature being completed for the v1.2 release. The materials below are work in progress._
+
+- User Interface
+ - [Manage Team](help/Manage-Team.md)
+ - Team Settings
+ - [Slack Import](help/Slack-Import.md)
-## Usage Help
+- Messaging
+ - [Mattermost Markdown Formatting](usage/Markdown.md)
-- [Slack Import](usage/Slack-Import.md)
-- [Mattermost Markdown Formatting](usage/Markdown.md)
diff --git a/doc/api/Overview.md b/doc/api/Overview.md
index 02e11974e..0a407b1e9 100644
--- a/doc/api/Overview.md
+++ b/doc/api/Overview.md
@@ -77,7 +77,7 @@ X-Ratelimit-Reset: 1441983590
These headers are telling you your current rate limit status.
Header | Description
---------------------- | -----------
+:--------------------- |:-----------
X-Ratelimit-Limit | The maximum number of requests you can make per second.
X-Ratelimit-Remaining | The number of requests remaining in the current window.
X-Ratelimit-Reset | The remaining UTC epoch seconds before the rate limit resets.
diff --git a/doc/developer/Code-Contribution-Guidelines.md b/doc/developer/Code-Contribution-Guidelines.md
index 80676f107..453c154f9 100644
--- a/doc/developer/Code-Contribution-Guidelines.md
+++ b/doc/developer/Code-Contribution-Guidelines.md
@@ -5,7 +5,6 @@ Thank you for your interest in contributing to Mattermost. This guide provides a
## Choose a Ticket
1. Review the list of [Good First Contribution](https://mattermost.atlassian.net/issues/?filter=10206) tickets listed in Jira.
-
2. These projects are intended to be a straight forward first pull requests from new contributors.
If you don't find something appropriate for your interests, please see the full list of tickets [Accepting Pull Requests](https://mattermost.atlassian.net/issues/?filter=10101).
@@ -13,7 +12,7 @@ If you don't find something appropriate for your interests, please see the full
## Install Mattermost and set up a Fork
-1. Follow [developer setup instructions](https://github.com/mattermost/platform/blob/master/doc/install/dev-setup.md) to install Mattermost.
+1. Follow [developer setup instructions](https://github.com/mattermost/platform/blob/master/doc/developer/Setup.md) to install Mattermost.
2. Create a branch with <branch name> set to the ID of the ticket you're working on, for example ```PLT-394```, using command:
@@ -29,6 +28,9 @@ git checkout -b <branch name>
2. Please make sure to thoroughly test your change before submitting a pull request.
+ Please review the ["Fast, Obvious, Forgiving" experience design principles](http://www.mattermost.org/design-principles/) for Mattermost and check that your feature meets the criteria. Also, for any changes to user interface or help text, please read the changes out loud, as a quick and easy way to catch any inconsitencies.
+
+
## Submitting a Pull Request
1. Please add yourself to the Mattermost [approved contributor list](https://docs.google.com/spreadsheets/d/1NTCeG-iL_VS9bFqtmHSfwETo5f-8MQ7oMDE5IUYJi_Y/pubhtml?gid=0&single=true) prior to submitting by completing the [contributor license agreement](http://www.mattermost.org/mattermost-contributor-agreement/).
diff --git a/doc/developer/Setup.md b/doc/developer/Setup.md
index c63bde512..afaef4ee4 100644
--- a/doc/developer/Setup.md
+++ b/doc/developer/Setup.md
@@ -11,7 +11,7 @@ Developer Machine Setup
`docker-machine ip dev`
3. Add a line to your /etc/hosts that goes `<Docker IP> dockerhost`
4. Run `docker-machine env dev` and copy the export statements to your ~/.bash_profile
-2. Download Go (version 1.4.2) from http://golang.org/dl/
+2. Download Go (version 1.4.2 or 1.5.1. Final release bits are built with 1.4.2) from http://golang.org/dl/
3. Set up your Go workspace
1. `mkdir ~/go`
2. Add the following to your ~/.bash_profile
@@ -51,7 +51,7 @@ Any issues? Please let us know on our forums at: http://forum.mattermost.org
`127.0.0.1 dockerhost`
3. Install build essentials
1. `apt-get install build-essential`
-4. Download Go (version 1.4.2) from http://golang.org/dl/
+4. Download Go (version 1.4.2 or 1.5.1. Final release bits are built with 1.4.2) from http://golang.org/dl/
5. Set up your Go workspace and add Go to the PATH
1. `mkdir ~/go`
2. Add the following to your ~/.bashrc
diff --git a/doc/help/Manage-Team.md b/doc/help/Manage-Team.md
new file mode 100644
index 000000000..b45ea4283
--- /dev/null
+++ b/doc/help/Manage-Team.md
@@ -0,0 +1,37 @@
+# Manage Team
+
+The Manage Team menu is used to change the user roles assigned to members belonging to a team.
+
+## User Roles
+
+The following user roles are assigned from the **Manage Team** menu option in the team site main menu.
+
+### System Admin
+
+The System Administrator is typically a member of the IT staff and has the follow privileges:
+
+- Access to the System Console from the main menu in any team site.
+- Change any setting on the Mattermost server available in the System Console.
+- Promote and demote other users to and from the System Admin role.
+- This role also has all the privileges of the Team Administrator as described below
+
+The first user added to a newly installed Mattermost system is assigned the System Admin role.
+
+### Team Admin
+
+The Team Administrator is typically a non-technical end user and has the following privileges:
+
+- Access to the "Team Settings" menu from the team site main menu
+- Ability to change the team name and import data from Slack export files
+- Access to the "Manage Team" menu and change user roles to the levels of Team Administrator, Member and Inactive
+
+### Member
+
+This is the default role given to end users who join the system. Members have basic permissions to use the Mattermost team site.
+
+### Inactive
+
+This status is given to users whose accounts are marked inactive. These users can no longer log into the system.
+
+Because Mattermost is designed as a system-of-record, there is not an option to delete users from the Mattermost system, as such an operation could compromise the integrity of message archives.
+
diff --git a/doc/help/README.md b/doc/help/README.md
new file mode 100644
index 000000000..d07424c70
--- /dev/null
+++ b/doc/help/README.md
@@ -0,0 +1,12 @@
+# Help
+
+The help section of the Mattermost documentation is intended for use by end users learning about the Mattermost concepts, usage, terminology and user interface.
+
+_Note: Help documentation is a work-in-progress. Community contributions highly welcome. Please see [guidelines for contributing](https://forum.mattermost.org/t/help-improve-mattermost-documentation/194)._
+
+## Team Site Main Menu
+
+You can access the **Team Site Main Menu** by clicking on the three vertical dots at the top of the left sidebar in a team site. Here we describe the various options available from the menu:
+
+- [Manage Teams](Manage-Team.md)
+
diff --git a/doc/usage/Slack-Import.md b/doc/help/Slack-Import.md
index c30de0567..a3b672b04 100644
--- a/doc/usage/Slack-Import.md
+++ b/doc/help/Slack-Import.md
@@ -1,8 +1,8 @@
-#### Slack Import (Preview)
+#### Slack Import (Beta)
*Note: As a SaaS service, Slack is able to change its export format quickly. If you encounter issues not mentioned in the documentation below, please let us know by [filing an issue](https://github.com/mattermost/platform/issues).*
-The Slack Import feature in Mattermost is in "Preview" and focus is on supporting migration of teams of less than 100 registered users. The feature can be accessed from by Team Administrators and Team Owners via the `Team Settings -> Import` menu option.
+The Slack Import feature in Mattermost is in "Beta" and focus is on supporting migration of teams of less than 100 registered users. The feature can be accessed from by Team Administrators and Team Owners via the `Team Settings -> Import` menu option.
Mattermost currently supports the processing of an "Export" file from Slack containing account information and public channel archives from a Slack team.
@@ -14,5 +14,5 @@ Limitations:
- Newly added markdown suppport in Slack's Posts 2.0 feature announced on September 28, 2015 is not yet supported.
- Slack does not export files or images your team has stored in Slack's database. Mattermost will provide links to the location of your assets in Slack's web UI.
- Slack does not export any content from private groups or direct messages that your team has stored in Slack's database.
-- The Preview release of Slack Import does not offer pre-checks or roll-back and will not import Slack accounts with username or email address collisions with existing Mattermost accounts. Also, Slack channel names with underscores will not import. Also, mentions do not yet resolve as Mattermost usernames (still show Slack ID).
+- The Preview release of Slack Import does not offer pre-checks or roll-back and will not import Slack accounts with username or email address collisions with existing Mattermost accounts. Also, Slack channel names with underscores will not import. Also, mentions do not yet resolve as Mattermost usernames (still shows Slack ID).
diff --git a/doc/install/Release-Numbering.md b/doc/install/Release-Numbering.md
index 71374f7ef..3b0391cff 100644
--- a/doc/install/Release-Numbering.md
+++ b/doc/install/Release-Numbering.md
@@ -14,4 +14,4 @@ Major Build Number:
Minor Build Number:
-- Indicates bugfix/security releases (e.g. 1.2.5, 1.2.6)
+- Indicates a bug fix or security release (e.g. 1.2.5, 1.2.6)
diff --git a/doc/install/SMTP-Email-Setup.md b/doc/install/SMTP-Email-Setup.md
index 86e2bb20e..8700ac637 100644
--- a/doc/install/SMTP-Email-Setup.md
+++ b/doc/install/SMTP-Email-Setup.md
@@ -39,3 +39,17 @@ To enable email, turn this option off by setting `ByPassEmail=false` and configu
2. Kill the process `kill pid`
3. The service should restart automatically. Verify the Mattermost service is running with `ps -A`
4. Current logged in users will not be affected, but upon logging out or session expiration users will be required to verify their email address.
+
+### Troubleshooting SMTP
+
+If you receive an error message during SMTP setup, do a web search for the error code number to narrow down the issue. Sometimes ISPs require nuanced setups for SMTP and error codes can hint at how to make the proper adjustments.
+
+For example, if you have an error code reading:
+
+```
+Connection unsuccessful: Failed to add to email address - 554 5.7.1 <unknown[IP-ADDRESS]>: Client host rejected: Access denied
+```
+
+Search for `554 5.7.1 error` and `Client host rejected: Access denied`.
+
+
diff --git a/doc/integrations/webhooks/Incoming-Webhooks.md b/doc/integrations/webhooks/Incoming-Webhooks.md
new file mode 100644
index 000000000..645d4861e
--- /dev/null
+++ b/doc/integrations/webhooks/Incoming-Webhooks.md
@@ -0,0 +1,80 @@
+# Incoming Webhooks
+
+Incoming webhooks allow external applications, written in the programming language of your choice--to post messages into Mattermost channels and private groups by sending a specifically formatted JSON payload via HTTP POST request to a secret Mattermost URL generated specifically for each application.
+
+A couple key points:
+
+- **Mattermost incoming webhooks are Slack-compatible.** If you've used Slack's incoming webhooks to create integrations, you can copy and paste that code to create Mattermost integrations. Mattermost automatically translates Slack's propretiary JSON payload format into markdown to render in Mattermost messages.
+- **Mattermost incoming webhooks support full markdown.** A rich range of formatting unavailable in Slack is made possible through [markdown support](../../usage/Markdown.md) in Mattermost, incuding headings, formatted fonts, tables, inline images and other options supported by [Mattermost Markdown].
+
+_Example:_
+
+Suppose you wanted to create a notification of the status of a daily build, with a table of total tests run and total tests failed by component category, with links to failed tests by category. You could create the following JSON payload to post to a Mattermost channel using webhooks:
+
+```
+payload={"text": "
+***
+##### Build Break - Project X - December 12, 2015 - 15:32 GMT +0
+| Component | Tests Run | Tests Failed |
+|:-----------|:------------|:-----------------------------------------------|
+| Server | 948 | :white_check_mark: 0 |
+| Web Client | 123 | :warning: [2 (see details)](http://linktologs) |
+| iOS Client | 78 | :warning: [3 (see details)](http://linktologs) |
+***
+"}
+```
+Which would render in a Mattermost message as follows:
+
+***
+##### Build Break - Project X - December 12, 2015 - 15:32 GMT +0
+| Component | Tests Run | Tests Failed |
+|:------------ |:---------------|:-----|
+| Server | 948 | :white_check_mark: 0 |
+| Web Client | 123 | :warning: [2 (see details)](http://linktologs) |
+| iOS Client | 78 | :warning: [3 (see details)](http://linktologs) |
+***
+
+### Creating Integrations using Incoming Webhooks
+You can create a webhook integration to post into Mattermost channels and private groups using these steps:
+
+1. Enable incoming webhooks from **System Console -> Service Settings**
+
+ 1. Optionally configure the **Enable Overriding of Usernames from Webhooks** option to allow external applications to post messages under any name. If not enabled, the username of the creator of the webhook URL is used to post messages.
+ 2. Optionally configure the **Enable Overriding of Icon from Webhooks** option to allow external applciations to change the icon of the account posting messages. If not enabled, the icon of the creator of the webhook URL is used to post messages.
+
+2. Create a Mattermost Incoming Webhook URL
+ 1. Login to your Mattermost team site and go to **Account Settings -> Integrations**
+ 2. Next to **Incoming Webhooks** click **Edit**
+ 3. Select the channel or private group to receive webhook payloads, then click **Add** to create the webhook
+
+3. Write a function to call the URL with a properly formatted JSON payload
+ 1. To make sure everything works, try a curl command from your terminal or command line to send a JSON string as the `payload` parameter in a HTTP POST request.
+ - _Example:_
+ ```
+curl -i -X POST -d 'payload={"text": "Hello, this is some text."}' http://yourmattermost.com/hooks/xxx-generatedkey-xxx
+```
+ 2. In addition, with **Enable Overriding of Usernames from Webhooks** turned on, you can also override the username the message posts as by providing a `username` parameter in your JSON payload. For example, you might want your message looking like it came from a robot so you can use ```payload={"username": "robot", "text": "Hello, this is some text."}``` to change the username of the post to robot. Note, to combat any malicious users from trying to use this to perform [phishing attacks](https://en.wikipedia.org/wiki/Phishing) a `BOT` indicator appears next to posts coming from incoming webhooks.
+ 3. With **Enable Overriding of Icon from Webhooks** turned on, you can similarly change the icon the message posts with by providing a link to an image in the `icon_url` parameter of your payload. For example, ```payload={"icon_url": "http://somewebsite.com/somecoolimage.jpg", "text": "Hello, this is some text."}``` will post using whatever image is located at `http://somewebsite.com/somecoolimage.jpg` as the icon for the post.
+
+ 2. Set up your integration running on your own machine or a hosting service like AWS or Heroku, to start sending real time updates to Mattermost channels and private groups.
+
+Additional Notes:
+
+1. For the JSON payload, if `Content-Type` is specified as `application/json` in the headers of the HTTP request then the body of the request can be direct JSON. ```{"text": "Hello, this is some text."}```
+
+2. You can override the channel specified in the webhook definition by specifying a `channel` parameter in your payload. For example, you might have a single webhook created for _Town Square_, but you can use ```payload={"channel": "off-topic", "text": "Hello, this is some text."}``` to send a message to the _Off-Topic_ channel using the same webhook URL.
+
+3. Also, as mentioned previously, [markdown](../../usage/Markdown.md) can be used to create richly formatted payloads, for example: ```payload={"text": "# A Header\nThe _text_ below **the** header."}``` creates a messages with a header, a carriage return and bold text for "the".
+
+4. Just like regular posts, the text will be limited to 4000 characters at maximum.
+
+### Slack Compatibility
+
+As mentioned above, Mattermost makes it easy to take integrations written for Slack's proprietary JSON payload format and repurpose them to become Mattermost integrations. The following automatic translations are supported:
+
+1. Payloads designed for Slack using `<>` to note the need to hyperlink a URL, such as ```payload={"text": "<http://www.mattermost.com/>"}```, are translated to the equivalent markdown in Mattermost and rendered the same as you would see in Slack.
+2. Similiarly, payloads designed for Slack using `|` within a `<>` to define linked text, such as ```payload={"text": "Click <http://www.mattermost.com/|here> for a link."}```, are also translated to the equivalent markdown in Mattermost and rendered the same as you would see in Slack.
+3. Like Slack, by overriding the channel name with an @username, such as payload={"text": "Hi", channel: "@jim"}, you can send the message to a user through your direct message chat.
+4. Channel names can be prepended with a #, like they are in Slack incoming webhooks, and the message will still be sent to the correct channel.
+
+To learn more about Incoming Webhooks and to see samples and community contributions, please visit <http://mattermost.org/webhooks>
diff --git a/doc/integrations/webhooks/Incoming.md b/doc/integrations/webhooks/Incoming.md
deleted file mode 100644
index 0814eb420..000000000
--- a/doc/integrations/webhooks/Incoming.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Incoming Webhooks
-
-With incoming webhooks practically any external source - once given a URL by you - can post a message to any channel you have access to. This is done through a HTTP POST request with a simple JSON payload. The payload can contain some text, and some simple options to allow the external source to customize the post.
-
-## Creating the Webhook URL
-
-To get the incoming webhook URL - where all the HTTP requests will be sent - follow these steps:
-
-1. Login to your Mattermost account.
-2. Open the menu by clicking near your profile picture in the top-left and open Account Settings.
-3. Go to the Integrations tab and click the 'Edit' button next to 'Incoming Webhooks'.
-4. Use the selector to choose a channel and click the 'Add' button to create the webhook.
-5. Your webhook URL will be displayed below in the 'Existing incoming webhooks' section.
-
-
-## Posting a Message
-
-You can send the message by including a JSON string as the `payload` parameter in a HTTP POST request.
-```
-payload={"text": "Hello, this is some text."}
-```
-
-In addition, if `Content-Type` is specified as `application/json` in the headers of the HTTP request then the body of the request can be direct JSON.
-```
-{"text": "Hello, this is some text."}
-```
-
-It is also possible to post richly formatted messages using [Markdown](../../usage/Markdown.md).
-```
-payload={"text": "# A Header\nThe _text_ below **the** header."}
-```
-
-Just like regular posts, the text will be limited to 4000 characters at maximum.
-
-## Adding Links
-
-In addition to including links in the standard Markdown format, links can also be specified by enclosing the URL in `<>` brackets
-```
-payload={"text": "<http://www.mattermost.com/>"}
-```
-
-They can also include a `|` character to specify some clickable text.
-```
-payload={"text": "Click <http://www.mattermost.com/|here> for a link."}
-```
-
-## Channel Override
-
-You can use a single webhook URL to post messages to different channels by overriding the channel. You can do this by adding the channel name - as it is seen in the channel URL - to the request payload.
-```
-payload={"channel": "off-topic", "text": "Hello, this is some text."}
-```
-
-## Finishing up
-
-Combining everything above, here is an example message made using a curl command:
-
-```
-curl -i -X POST -d 'payload={"channel": "off-topic", "text": "Hello, this is some text."}' http://yourmattermost.com/hooks/xxxxxxxxxxxxxxxxxxxxxxxxxx
-```
-
-A post with that text will be made to the Off-Topic channel.
diff --git a/web/react/components/channel_loader.jsx b/web/react/components/channel_loader.jsx
index d16069725..d0d6ab5e2 100644
--- a/web/react/components/channel_loader.jsx
+++ b/web/react/components/channel_loader.jsx
@@ -104,12 +104,6 @@ export default class ChannelLoader extends React.Component {
}
});
- /* Setup modal events */
- $('.modal').on('show.bs.modal', function onShow() {
- $('.modal-body').css('overflow-y', 'auto');
- $('.modal-body').css('max-height', $(window).height() * 0.7);
- });
-
/* Prevent backspace from navigating back a page */
$(window).on('keydown.preventBackspace', (e) => {
if (e.which === 8 && !$(e.target).is('input, textarea')) {
diff --git a/web/react/components/create_comment.jsx b/web/react/components/create_comment.jsx
index add4125d7..680d693f1 100644
--- a/web/react/components/create_comment.jsx
+++ b/web/react/components/create_comment.jsx
@@ -262,25 +262,27 @@ export default class CreateComment extends React.Component {
id={this.props.rootId}
className='post-create-body comment-create-body'
>
- <Textbox
- onUserInput={this.handleUserInput}
- onKeyPress={this.commentMsgKeyPress}
- messageText={this.state.messageText}
- createMessage='Add a comment...'
- initialText=''
- id='reply_textbox'
- ref='textbox'
- />
- <FileUpload
- ref='fileUpload'
- getFileCount={this.getFileCount}
- onUploadStart={this.handleUploadStart}
- onFileUpload={this.handleFileUploadComplete}
- onUploadError={this.handleUploadError}
- onTextDrop={this.handleTextDrop}
- postType='comment'
- channelId={this.props.channelId}
- />
+ <div className='post-body__cell'>
+ <Textbox
+ onUserInput={this.handleUserInput}
+ onKeyPress={this.commentMsgKeyPress}
+ messageText={this.state.messageText}
+ createMessage='Add a comment...'
+ initialText=''
+ id='reply_textbox'
+ ref='textbox'
+ />
+ <FileUpload
+ ref='fileUpload'
+ getFileCount={this.getFileCount}
+ onUploadStart={this.handleUploadStart}
+ onFileUpload={this.handleFileUploadComplete}
+ onUploadError={this.handleUploadError}
+ onTextDrop={this.handleTextDrop}
+ postType='comment'
+ channelId={this.props.channelId}
+ />
+ </div>
</div>
<MsgTyping
channelId={this.props.channelId}
diff --git a/web/react/components/get_link_modal.jsx b/web/react/components/get_link_modal.jsx
index 234013b93..eb6bfa9b6 100644
--- a/web/react/components/get_link_modal.jsx
+++ b/web/react/components/get_link_modal.jsx
@@ -96,7 +96,6 @@ export default class GetLinkModal extends React.Component {
<p>
Send teammates the link below for them to sign-up to this team site.
<br /><br />
- Be careful not to share this link publicly, since anyone with the link can join your team.
</p>
<textarea
className='form-control no-resize'
diff --git a/web/react/components/setting_item_max.jsx b/web/react/components/setting_item_max.jsx
index d2cbc798e..4f0fe3ed0 100644
--- a/web/react/components/setting_item_max.jsx
+++ b/web/react/components/setting_item_max.jsx
@@ -32,11 +32,17 @@ export default class SettingItemMax extends React.Component {
}
var inputs = this.props.inputs;
+ var widthClass;
+ if (this.props.width === 'full') {
+ widthClass = 'col-sm-12';
+ } else {
+ widthClass = 'col-sm-9 col-sm-offset-3';
+ }
return (
<ul className='section-max form-horizontal'>
<li className='col-sm-12 section-title'>{this.props.title}</li>
- <li className='col-sm-9 col-sm-offset-3'>
+ <li className={widthClass}>
<ul className='setting-list'>
<li className='setting-list-item'>
{inputs}
@@ -69,5 +75,6 @@ SettingItemMax.propTypes = {
extraInfo: React.PropTypes.element,
updateSection: React.PropTypes.func,
submit: React.PropTypes.func,
- title: React.PropTypes.string
+ title: React.PropTypes.string,
+ width: React.PropTypes.string
};
diff --git a/web/react/components/settings_sidebar.jsx b/web/react/components/settings_sidebar.jsx
index b5d2132d7..66568e1c8 100644
--- a/web/react/components/settings_sidebar.jsx
+++ b/web/react/components/settings_sidebar.jsx
@@ -10,7 +10,7 @@ export default class SettingsSidebar extends React.Component {
handleClick(tab, e) {
e.preventDefault();
this.props.updateTab(tab.name);
- $('.settings-modal').addClass('display--content');
+ $(e.target).closest('.settings-modal').addClass('display--content');
}
render() {
let tabList = this.props.tabs.map(function makeTab(tab) {
diff --git a/web/react/components/signup_user_complete.jsx b/web/react/components/signup_user_complete.jsx
index 75661f812..8a3af707f 100644
--- a/web/react/components/signup_user_complete.jsx
+++ b/web/react/components/signup_user_complete.jsx
@@ -149,7 +149,7 @@ export default class SignupUserComplete extends React.Component {
// set up the email entry and hide it if an email was provided
var yourEmailIs = '';
if (this.state.user.email) {
- yourEmailIs = <span>Your email address is {this.state.user.email}. You'll use this address to sign in to {global.window.config.SiteName}.</span>;
+ yourEmailIs = <span>Your email address is <strong>{this.state.user.email}</strong>. You'll use this address to sign in to {global.window.config.SiteName}.</span>;
}
var emailContainerStyle = 'margin--extra';
diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx
index 0563c294a..741dbcd5d 100644
--- a/web/react/components/textbox.jsx
+++ b/web/react/components/textbox.jsx
@@ -246,9 +246,11 @@ export default class Textbox extends React.Component {
if (e.scrollHeight - mod < 167) {
$(e).css({height: 'auto', 'overflow-y': 'hidden'}).height(e.scrollHeight - mod);
$(w).css({height: 'auto'}).height(e.scrollHeight + 2);
+ $(w).closest('.post-body__cell').removeClass('scroll');
} else {
$(e).css({height: 'auto', 'overflow-y': 'scroll'}).height(167);
$(w).css({height: 'auto'}).height(167);
+ $(w).closest('.post-body__cell').addClass('scroll');
}
if (prevHeight !== $(e).height() && this.props.onHeightChange) {
diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx
index c23c61948..66d83725c 100644
--- a/web/react/components/user_settings/user_settings_general.jsx
+++ b/web/react/components/user_settings/user_settings_general.jsx
@@ -368,8 +368,7 @@ export default class UserSettingsGeneralTab extends React.Component {
const extraInfo = (
<span>
- {'Use Nickname for a name you might be called that is different from your first name and user name.'}
- {'This is most often used when two or more people have similar sounding names and usernames.'}
+ {'Use Nickname for a name you might be called that is different from your first name and username. This is most often used when two or more people have similar sounding names and usernames.'}
</span>
);
diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx
index 5e20d41f1..3be062ad3 100644
--- a/web/react/components/user_settings/user_settings_integrations.jsx
+++ b/web/react/components/user_settings/user_settings_integrations.jsx
@@ -38,6 +38,7 @@ export default class UserSettingsIntegrationsTab extends React.Component {
incomingHooksSection = (
<SettingItemMax
title='Incoming Webhooks'
+ width = 'full'
inputs={inputs}
updateSection={function clearSection(e) {
this.updateSection('');
@@ -49,6 +50,7 @@ export default class UserSettingsIntegrationsTab extends React.Component {
incomingHooksSection = (
<SettingItemMin
title='Incoming Webhooks'
+ width = 'full'
describe='Manage your incoming webhooks (Developer feature)'
updateSection={function updateNameSection() {
this.updateSection('incoming-hooks');
diff --git a/web/react/components/view_image.jsx b/web/react/components/view_image.jsx
index 8ef68dd0a..c5f0abc12 100644
--- a/web/react/components/view_image.jsx
+++ b/web/react/components/view_image.jsx
@@ -195,6 +195,7 @@ export default class ViewImageModal extends React.Component {
target='_blank'
>
<img
+ style={{maxHeight: this.state.imgHeight}}
ref='image'
src={this.getPreviewImagePath(filename)}
/>
@@ -210,6 +211,7 @@ export default class ViewImageModal extends React.Component {
content = (
<video
+ style={{maxHeight: this.state.imgHeight}}
ref='video'
data-setup='{}'
controls='controls'
@@ -334,7 +336,6 @@ export default class ViewImageModal extends React.Component {
>
<div
className={'image-wrapper ' + bgClass}
- style={{maxHeight: this.state.imgHeight}}
onMouseEnter={this.onMouseEnterImage}
onMouseLeave={this.onMouseLeaveImage}
onClick={(e) => e.stopPropagation()}
diff --git a/web/react/utils/constants.jsx b/web/react/utils/constants.jsx
index affc49196..e3cbfccde 100644
--- a/web/react/utils/constants.jsx
+++ b/web/react/utils/constants.jsx
@@ -201,7 +201,7 @@ module.exports = {
centerChannelBg: '#1F1F1F',
centerChannelColor: '#DDDDDD',
newMessageSeparator: '#CC992D',
- linkColor: '#0177e7',
+ linkColor: '#0D93FF',
buttonBg: '#0177e7',
buttonColor: '#FFFFFF',
mentionHighlightBg: '#784098',
diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx
index f9166063e..6a5188974 100644
--- a/web/react/utils/utils.jsx
+++ b/web/react/utils/utils.jsx
@@ -423,7 +423,10 @@ export function applyTheme(theme) {
if (theme.sidebarTextActiveColor) {
changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .settings-modal .nav-pills>li.active a, .settings-modal .nav-pills>li.active a:hover, .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
- changeCss('.sidebar--left .nav-pills__container li.active a .status .online--icon', 'fill:' + theme.sidebarTextActiveColor, 2);
+ }
+
+ if (theme.sidebarTextActiveBg === theme.onlineIndicator) {
+ changeCss('.sidebar--left .nav-pills__container li.active a .status .online--icon', 'fill:' + theme.sidebarTextActiveColor, 1);
}
if (theme.sidebarHeaderBg) {
@@ -497,7 +500,7 @@ export function applyTheme(theme) {
changeCss('.date-separator .separator__hr, .modal-footer, .modal .custom-textarea, .post-right__container .post.post--root hr, .search-item-container', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
changeCss('.channel-intro, .settings-modal .settings-table .settings-content .divider-dark, hr, .settings-modal .settings-table .settings-links', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
- changeCss('.post.current--user .post-body, .post.post--comment.other--root.current--user .post-comment', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
+ changeCss('.post.current--user .post-body, .post.post--comment.other--root.current--user .post-comment, pre', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.post.current--user .post-body, .post.post--comment.other--root.current--user .post-comment, .post.post--comment.other--root .post-comment, .post.same--root .post-body, .modal .more-channel-table tbody>tr td, .member-div:first-child, .member-div, .access-history__table .access__report, .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 2);
changeCss('@media(max-width: 1440px){.post.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
changeCss('@media(max-width: 1440px){.post.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
diff --git a/web/sass-files/sass/partials/_base.scss b/web/sass-files/sass/partials/_base.scss
index 18462d92a..470db16dc 100644
--- a/web/sass-files/sass/partials/_base.scss
+++ b/web/sass-files/sass/partials/_base.scss
@@ -34,6 +34,11 @@ body {
}
}
+img {
+ max-width: 100%;
+ height: auto;
+}
+
.input-group-addon {
background: transparent;
}
diff --git a/web/sass-files/sass/partials/_headers.scss b/web/sass-files/sass/partials/_headers.scss
index 8e353aff9..feaa5acfb 100644
--- a/web/sass-files/sass/partials/_headers.scss
+++ b/web/sass-files/sass/partials/_headers.scss
@@ -147,7 +147,8 @@
}
.header__info {
color: #fff;
- padding-left: 4px;
+ @include clearfix;
+ padding-left: 2px;
z-index: 1;
position: relative;
}
@@ -155,7 +156,7 @@
display: block;
font-weight: 600;
font-size: 16px;
- max-width: 80%;
+ max-width: 85%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
diff --git a/web/sass-files/sass/partials/_markdown.scss b/web/sass-files/sass/partials/_markdown.scss
index 122586354..1aa942ad0 100644
--- a/web/sass-files/sass/partials/_markdown.scss
+++ b/web/sass-files/sass/partials/_markdown.scss
@@ -53,15 +53,10 @@ blockquote {
}
pre {
border: none;
- background-color: #f7f7f7;
margin: 5px 0;
- .current--user & {
- background: #fff;
- }
- code {
- color: #c7254e;
- }
+ color: inherit;
}
code {
background: #fff;
+ color: inherit;
}
diff --git a/web/sass-files/sass/partials/_modal.scss b/web/sass-files/sass/partials/_modal.scss
index 2722333a4..90ea8ce2c 100644
--- a/web/sass-files/sass/partials/_modal.scss
+++ b/web/sass-files/sass/partials/_modal.scss
@@ -1,3 +1,6 @@
+#channel_members_modal .modal-body {
+ min-height: 110px;
+}
.modal-body {
padding: 20px 15px;
}
diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss
index ccd7fd425..85bb2eb28 100644
--- a/web/sass-files/sass/partials/_post.scss
+++ b/web/sass-files/sass/partials/_post.scss
@@ -195,6 +195,14 @@ body.ios {
.post-body__cell {
vertical-align: top;
position: relative;
+ &.scroll {
+ .btn-file {
+ right: 15px;
+ }
+ .custom-textarea {
+ padding-right: 43px;
+ }
+ }
}
.send-button {
display: none;
diff --git a/web/sass-files/sass/partials/_responsive.scss b/web/sass-files/sass/partials/_responsive.scss
index 82ec1811a..4e532c16e 100644
--- a/web/sass-files/sass/partials/_responsive.scss
+++ b/web/sass-files/sass/partials/_responsive.scss
@@ -421,6 +421,9 @@
.post-body__cell {
display: table-cell;
padding-left: 45px;
+ .sidebar--right & {
+ padding-left: 0;
+ }
}
.app__content & {
.btn-file {
@@ -667,7 +670,7 @@
.modal-image {
.image-wrapper {
font-size: 12px;
- max-width: 280px;
+ min-width: 280px;
.modal-close {
@include opacity(1);
}
diff --git a/web/sass-files/sass/partials/_settings.scss b/web/sass-files/sass/partials/_settings.scss
index 8debb0b4e..0c2f25eab 100644
--- a/web/sass-files/sass/partials/_settings.scss
+++ b/web/sass-files/sass/partials/_settings.scss
@@ -268,7 +268,6 @@
position:absolute;
right:15px;
top:13px;
- color:#414142;
}
}
diff --git a/web/sass-files/sass/partials/_sidebar--right.scss b/web/sass-files/sass/partials/_sidebar--right.scss
index b37dbf421..c954b03d8 100644
--- a/web/sass-files/sass/partials/_sidebar--right.scss
+++ b/web/sass-files/sass/partials/_sidebar--right.scss
@@ -26,6 +26,7 @@
.post-header {
.post-header-col {
&.post-header__reply {
+ min-width: 30px;
text-align: right;
float: right;
}
diff --git a/web/templates/channel.html b/web/templates/channel.html
index 2af94e415..13fd80d75 100644
--- a/web/templates/channel.html
+++ b/web/templates/channel.html
@@ -54,7 +54,7 @@
<script>
window.setup_channel_page({{ .Props }});
$('body').tooltip( {selector: '[data-toggle=tooltip]'} );
- $('.modal-body').css('max-height', $(window).height() * 0.7);
+ $('.modal-body').css('max-height', $(window).height() - 150);
$('.modal-body').perfectScrollbar();
</script>
</body>