summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md25
-rw-r--r--api/channel.go27
-rw-r--r--doc/integrations/Single-Sign-On/Gitlab.md2
-rw-r--r--store/sql_store.go4
-rw-r--r--store/sql_webhook_store.go21
-rw-r--r--store/store.go1
-rw-r--r--web/react/components/file_upload_overlay.jsx28
-rw-r--r--web/react/components/search_bar.jsx6
-rw-r--r--web/react/components/user_settings/manage_incoming_hooks.jsx52
-rw-r--r--web/react/components/user_settings/manage_outgoing_hooks.jsx32
-rw-r--r--web/react/components/user_settings/user_settings_integrations.jsx4
-rw-r--r--web/react/stores/socket_store.jsx2
-rw-r--r--web/react/utils/constants.jsx12
-rw-r--r--web/react/utils/utils.jsx10
-rw-r--r--web/sass-files/sass/partials/_base.scss2
-rw-r--r--web/sass-files/sass/partials/_popover.scss38
-rw-r--r--web/sass-files/sass/partials/_post.scss15
-rw-r--r--web/sass-files/sass/partials/_responsive.scss21
-rw-r--r--web/sass-files/sass/partials/_settings.scss16
-rw-r--r--web/sass-files/sass/partials/_sidebar--left.scss15
-rw-r--r--web/static/config/manifest.json2
-rw-r--r--web/static/images/favicon.icobin1379 -> 15708 bytes
-rw-r--r--web/static/images/icon50x50.gifbin2135 -> 0 bytes
-rw-r--r--web/static/images/icon50x50.pngbin0 -> 15502 bytes
-rw-r--r--web/static/images/logo.pngbin15407 -> 23393 bytes
-rw-r--r--web/static/images/redfavicon.icobin1502 -> 15753 bytes
-rw-r--r--web/templates/authorize.html2
27 files changed, 265 insertions, 72 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54d9122c0..8082b2536 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,31 @@ The "UNDER DEVELOPMENT" section of the Mattermost changelog appears in the produ
- IE 10 no longer supported since global share of IE 10 fell below 5%
+## Release v1.1.1 (Bug Fix Release)
+
+Released 2015-10-20
+
+### About Bug Fix Releases
+
+This is a bug fix release (v1.1.1) and recommended only for users needing a fix to the specific issue listed below. All other users should use the most recent major stable build release (v1.1.0).
+
+[View more information on Mattermost release numbering](https://github.com/mattermost/platform/blob/master/doc/install/release-numbering.md).
+
+### Release Purpose
+
+#### Provide option for upgrading database from Mattermost v0.7 to v1.1
+
+Upgrading Mattermost v0.7 to Mattermost v1.1 originally required installing Mattermost v1.0 to upgrade from the Mattermost v0.7 database, followed by an install of Mattermost v1.1.
+
+This was problematic for installing Mattermost with GitLab omnibus since GitLab 8.0 contained Mattermost v0.7 and GitLab 8.1 was to include Mattermost v1.1
+
+Therefore Mattermost v1.1.1 was created that can upgrade the database in Mattermost v0.7 to Mattermost v1.1 directly.
+
+Users who configured Mattermost v0.7 within GitLab via the `config.json` file should consult [documentation on upgrading configurations from Mattermost v0.7 to Mattermost v1.1](https://github.com/mattermost/platform/blob/master/doc/install/Upgrade-Guide.md#upgrading-mattermost-v07-to-v11).
+
+#### Removes 32-char limit on salts
+
+Mattermost v1.1 introduced a 32-char limit on salts that broke the salt generating in GitLab and this restriction was removed for 1.1.1.
## Release v1.1.0
diff --git a/api/channel.go b/api/channel.go
index 9c7ac053b..a8c8505e9 100644
--- a/api/channel.go
+++ b/api/channel.go
@@ -508,6 +508,8 @@ func deleteChannel(c *Context, w http.ResponseWriter, r *http.Request) {
sc := Srv.Store.Channel().Get(id)
scm := Srv.Store.Channel().GetMember(id, c.Session.UserId)
uc := Srv.Store.User().Get(c.Session.UserId)
+ ihc := Srv.Store.Webhook().GetIncomingByChannel(id)
+ ohc := Srv.Store.Webhook().GetOutgoingByChannel(id)
if cresult := <-sc; cresult.Err != nil {
c.Err = cresult.Err
@@ -518,10 +520,18 @@ func deleteChannel(c *Context, w http.ResponseWriter, r *http.Request) {
} else if scmresult := <-scm; scmresult.Err != nil {
c.Err = scmresult.Err
return
+ } else if ihcresult := <-ihc; ihcresult.Err != nil {
+ c.Err = ihcresult.Err
+ return
+ } else if ohcresult := <-ohc; ohcresult.Err != nil {
+ c.Err = ohcresult.Err
+ return
} else {
channel := cresult.Data.(*model.Channel)
user := uresult.Data.(*model.User)
channelMember := scmresult.Data.(model.ChannelMember)
+ incomingHooks := ihcresult.Data.([]*model.IncomingWebhook)
+ outgoingHooks := ohcresult.Data.([]*model.OutgoingWebhook)
if !c.HasPermissionsToTeam(channel.TeamId, "deleteChannel") {
return
@@ -545,6 +555,23 @@ func deleteChannel(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
+ now := model.GetMillis()
+ for _, hook := range incomingHooks {
+ go func() {
+ if result := <-Srv.Store.Webhook().DeleteIncoming(hook.Id, now); result.Err != nil {
+ l4g.Error("Encountered error deleting incoming webhook, id=" + hook.Id)
+ }
+ }()
+ }
+
+ for _, hook := range outgoingHooks {
+ go func() {
+ if result := <-Srv.Store.Webhook().DeleteOutgoing(hook.Id, now); result.Err != nil {
+ l4g.Error("Encountered error deleting outgoing webhook, id=" + hook.Id)
+ }
+ }()
+ }
+
if dresult := <-Srv.Store.Channel().Delete(channel.Id, model.GetMillis()); dresult.Err != nil {
c.Err = dresult.Err
return
diff --git a/doc/integrations/Single-Sign-On/Gitlab.md b/doc/integrations/Single-Sign-On/Gitlab.md
index e503a158b..0a8a1bd18 100644
--- a/doc/integrations/Single-Sign-On/Gitlab.md
+++ b/doc/integrations/Single-Sign-On/Gitlab.md
@@ -16,7 +16,7 @@ The following steps can be used to configure Mattermost to use GitLab as a singl
* _TokenEndpoint_: `https://<your-gitlab-url>/oauth/token`
* _UserApiEndpoint_: `https://<your-gitlab-url>/api/v3/user`
- Note: Make sure your `HTTPS` or `HTTP` prefix for endpoint URLs matches how your server configuration.
+ Note: Make sure your `HTTPS` or `HTTP` prefix for endpoint URLs matches your server configuration.
5. (Optional) If you would like to force all users to sign-up with GitLab only, in the _ServiceSettings_ section of config/config.json please set _DisableEmailSignUp_ to `true`.
diff --git a/store/sql_store.go b/store/sql_store.go
index d4d8fdf73..0d1bfe41b 100644
--- a/store/sql_store.go
+++ b/store/sql_store.go
@@ -73,6 +73,7 @@ func NewSqlStore() Store {
}
schemaVersion := sqlStore.GetCurrentSchemaVersion()
+ isSchemaVersion07 := false
// If the version is already set then we are potentially in an 'upgrade needed' state
if schemaVersion != "" {
@@ -81,7 +82,6 @@ func NewSqlStore() Store {
// If we are upgrading from the previous version then print a warning and continue
// Special case
- isSchemaVersion07 := false
if schemaVersion == "0.7.1" || schemaVersion == "0.7.0" {
isSchemaVersion07 = true
}
@@ -140,7 +140,7 @@ func NewSqlStore() Store {
sqlStore.webhook.(*SqlWebhookStore).CreateIndexesIfNotExists()
sqlStore.preference.(*SqlPreferenceStore).CreateIndexesIfNotExists()
- if model.IsPreviousVersion(schemaVersion) {
+ if model.IsPreviousVersion(schemaVersion) || isSchemaVersion07 {
sqlStore.system.Update(&model.System{Name: "Version", Value: model.CurrentVersion})
l4g.Warn("The database schema has been upgraded to version " + model.CurrentVersion)
}
diff --git a/store/sql_webhook_store.go b/store/sql_webhook_store.go
index 1910984f0..c758e2339 100644
--- a/store/sql_webhook_store.go
+++ b/store/sql_webhook_store.go
@@ -137,6 +137,27 @@ func (s SqlWebhookStore) GetIncomingByUser(userId string) StoreChannel {
return storeChannel
}
+func (s SqlWebhookStore) GetIncomingByChannel(channelId string) StoreChannel {
+ storeChannel := make(StoreChannel)
+
+ go func() {
+ result := StoreResult{}
+
+ var webhooks []*model.IncomingWebhook
+
+ if _, err := s.GetReplica().Select(&webhooks, "SELECT * FROM IncomingWebhooks WHERE ChannelId = :ChannelId AND DeleteAt = 0", map[string]interface{}{"ChannelId": channelId}); err != nil {
+ result.Err = model.NewAppError("SqlWebhookStore.GetIncomingByChannel", "We couldn't get the webhooks", "channelId="+channelId+", err="+err.Error())
+ }
+
+ result.Data = webhooks
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
func (s SqlWebhookStore) SaveOutgoing(webhook *model.OutgoingWebhook) StoreChannel {
storeChannel := make(StoreChannel)
diff --git a/store/store.go b/store/store.go
index 1cf686a70..bd2c3681e 100644
--- a/store/store.go
+++ b/store/store.go
@@ -150,6 +150,7 @@ type WebhookStore interface {
SaveIncoming(webhook *model.IncomingWebhook) StoreChannel
GetIncoming(id string) StoreChannel
GetIncomingByUser(userId string) StoreChannel
+ GetIncomingByChannel(channelId string) StoreChannel
DeleteIncoming(webhookId string, time int64) StoreChannel
SaveOutgoing(webhook *model.OutgoingWebhook) StoreChannel
GetOutgoing(id string) StoreChannel
diff --git a/web/react/components/file_upload_overlay.jsx b/web/react/components/file_upload_overlay.jsx
index d991dd625..dbba00022 100644
--- a/web/react/components/file_upload_overlay.jsx
+++ b/web/react/components/file_upload_overlay.jsx
@@ -12,19 +12,21 @@ export default class FileUploadOverlay extends React.Component {
return (
<div className={overlayClass}>
- <div className='overlay__circle'>
- <img
- className='overlay__files'
- src='/static/images/filesOverlay.png'
- alt='Files'
- />
- <span><i className='fa fa-upload'></i>{'Drop a file to upload it.'}</span>
- <img
- className='overlay__logo'
- src='/static/images/logoWhite.png'
- width='100'
- alt='Logo'
- />
+ <div className='overlay__indent'>
+ <div className='overlay__circle'>
+ <img
+ className='overlay__files'
+ src='/static/images/filesOverlay.png'
+ alt='Files'
+ />
+ <span><i className='fa fa-upload'></i>{'Drop a file to upload it.'}</span>
+ <img
+ className='overlay__logo'
+ src='/static/images/logoWhite.png'
+ width='100'
+ alt='Logo'
+ />
+ </div>
</div>
</div>
);
diff --git a/web/react/components/search_bar.jsx b/web/react/components/search_bar.jsx
index bf12ca160..7540b41a4 100644
--- a/web/react/components/search_bar.jsx
+++ b/web/react/components/search_bar.jsx
@@ -8,7 +8,7 @@ var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
var utils = require('../utils/utils.jsx');
var Constants = require('../utils/constants.jsx');
var ActionTypes = Constants.ActionTypes;
-var Tooltip = ReactBootstrap.Tooltip;
+var Popover = ReactBootstrap.Popover;
export default class SearchBar extends React.Component {
constructor() {
@@ -163,7 +163,7 @@ export default class SearchBar extends React.Component {
onMouseUp={this.handleMouseInput}
/>
{isSearching}
- <Tooltip
+ <Popover
placement='bottom'
className={helpClass}
>
@@ -176,7 +176,7 @@ export default class SearchBar extends React.Component {
<span>{'Use '}</span><b>{'from:'}</b><span>{' to find posts from specific users and '}</span><b>{'in:'}</b><span>{' to find posts in specific channels'}</span>
</li>
</ul>
- </Tooltip>
+ </Popover>
</form>
</div>
);
diff --git a/web/react/components/user_settings/manage_incoming_hooks.jsx b/web/react/components/user_settings/manage_incoming_hooks.jsx
index f5a2774a0..812169be4 100644
--- a/web/react/components/user_settings/manage_incoming_hooks.jsx
+++ b/web/react/components/user_settings/manage_incoming_hooks.jsx
@@ -96,7 +96,14 @@ export default class ManageIncomingHooks extends React.Component {
const options = [];
channels.forEach((channel) => {
if (channel.type !== Constants.DM_CHANNEL) {
- options.push(<option value={channel.id}>{channel.name}</option>);
+ options.push(
+ <option
+ key={'incoming-hook' + channel.id}
+ value={channel.id}
+ >
+ {channel.display_name}
+ </option>
+ );
}
});
@@ -108,26 +115,31 @@ export default class ManageIncomingHooks extends React.Component {
const hooks = [];
this.state.hooks.forEach((hook) => {
const c = ChannelStore.get(hook.channel_id);
- hooks.push(
- <div className='font--small'>
- <div className='padding-top x2 divider-light'></div>
- <div className='padding-top x2'>
- <strong>{'URL: '}</strong><span className='word-break--all'>{Utils.getWindowLocationOrigin() + '/hooks/' + hook.id}</span>
- </div>
- <div className='padding-top'>
- <strong>{'Channel: '}</strong>{c.name}
- </div>
- <div className='padding-top'>
- <a
- className={'text-danger'}
- href='#'
- onClick={this.removeHook.bind(this, hook.id)}
- >
- {'Remove'}
- </a>
+ if (c) {
+ hooks.push(
+ <div
+ key={hook.id}
+ className='font--small'
+ >
+ <div className='padding-top x2 divider-light'></div>
+ <div className='padding-top x2'>
+ <strong>{'URL: '}</strong><span className='word-break--all'>{Utils.getWindowLocationOrigin() + '/hooks/' + hook.id}</span>
+ </div>
+ <div className='padding-top'>
+ <strong>{'Channel: '}</strong>{c.display_name}
+ </div>
+ <div className='padding-top'>
+ <a
+ className={'text-danger'}
+ href='#'
+ onClick={this.removeHook.bind(this, hook.id)}
+ >
+ {'Remove'}
+ </a>
+ </div>
</div>
- </div>
- );
+ );
+ }
});
let displayHooks;
diff --git a/web/react/components/user_settings/manage_outgoing_hooks.jsx b/web/react/components/user_settings/manage_outgoing_hooks.jsx
index e83ae3bd6..f6d6b515b 100644
--- a/web/react/components/user_settings/manage_outgoing_hooks.jsx
+++ b/web/react/components/user_settings/manage_outgoing_hooks.jsx
@@ -128,21 +128,42 @@ export default class ManageOutgoingHooks extends React.Component {
}
const channels = ChannelStore.getAll();
- const options = [<option value=''>{'--- Select a channel ---'}</option>];
+ const options = [];
+ options.push(
+ <option
+ key='select-channel'
+ value=''
+ >
+ {'--- Select a channel ---'}
+ </option>
+ );
+
channels.forEach((channel) => {
if (channel.type === Constants.OPEN_CHANNEL) {
- options.push(<option value={channel.id}>{channel.name}</option>);
+ options.push(
+ <option
+ key={'outgoing-hook' + channel.id}
+ value={channel.id}
+ >
+ {channel.display_name}
+ </option>
+ );
}
});
const hooks = [];
this.state.hooks.forEach((hook) => {
const c = ChannelStore.get(hook.channel_id);
+
+ if (!c && hook.channel_id && hook.channel_id.length !== 0) {
+ return;
+ }
+
let channelDiv;
if (c) {
channelDiv = (
<div className='padding-top'>
- <strong>{'Channel: '}</strong>{c.name}
+ <strong>{'Channel: '}</strong>{c.display_name}
</div>
);
}
@@ -157,7 +178,10 @@ export default class ManageOutgoingHooks extends React.Component {
}
hooks.push(
- <div className='font--small'>
+ <div
+ key={hook.id}
+ className='font--small'
+ >
<div className='padding-top x2 divider-light'></div>
<div className='padding-top x2'>
<strong>{'URLs: '}</strong><span className='word-break--all'>{hook.callback_urls.join(', ')}</span>
diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx
index 1d9ea0ad5..83a6bf53a 100644
--- a/web/react/components/user_settings/user_settings_integrations.jsx
+++ b/web/react/components/user_settings/user_settings_integrations.jsx
@@ -37,7 +37,7 @@ export default class UserSettingsIntegrationsTab extends React.Component {
if (global.window.mm_config.EnableIncomingWebhooks === 'true') {
if (this.props.activeSection === 'incoming-hooks') {
inputs.push(
- <ManageIncomingHooks />
+ <ManageIncomingHooks key='incoming-hook-ui' />
);
incomingHooksSection = (
@@ -68,7 +68,7 @@ export default class UserSettingsIntegrationsTab extends React.Component {
if (global.window.mm_config.EnableOutgoingWebhooks === 'true') {
if (this.props.activeSection === 'outgoing-hooks') {
inputs.push(
- <ManageOutgoingHooks />
+ <ManageOutgoingHooks key='outgoing-hook-ui' />
);
outgoingHooksSection = (
diff --git a/web/react/stores/socket_store.jsx b/web/react/stores/socket_store.jsx
index 33cdc79fb..8c3489001 100644
--- a/web/react/stores/socket_store.jsx
+++ b/web/react/stores/socket_store.jsx
@@ -38,7 +38,7 @@ class SocketStoreClass extends EventEmitter {
return;
}
- if (!global.window.mm_session_token_index) {
+ if (!global.window.hasOwnProperty('mm_session_token_index')) {
return;
}
diff --git a/web/react/utils/constants.jsx b/web/react/utils/constants.jsx
index d891cc48b..7d2626fc1 100644
--- a/web/react/utils/constants.jsx
+++ b/web/react/utils/constants.jsx
@@ -139,7 +139,7 @@ module.exports = {
sidebarText: '#333333',
sidebarUnreadText: '#333333',
sidebarTextHoverBg: '#e6f2fa',
- sidebarTextActiveBg: '#e1e1e1',
+ sidebarTextActiveBorder: '#378FD2',
sidebarTextActiveColor: '#111111',
sidebarHeaderBg: '#2389d7',
sidebarHeaderTextColor: '#ffffff',
@@ -161,7 +161,7 @@ module.exports = {
sidebarText: '#fff',
sidebarUnreadText: '#fff',
sidebarTextHoverBg: '#136197',
- sidebarTextActiveBg: '#136197',
+ sidebarTextActiveBorder: '#7AB0D6',
sidebarTextActiveColor: '#FFFFFF',
sidebarHeaderBg: '#2f81b7',
sidebarHeaderTextColor: '#FFFFFF',
@@ -183,7 +183,7 @@ module.exports = {
sidebarText: '#fff',
sidebarUnreadText: '#fff',
sidebarTextHoverBg: '#4A5664',
- sidebarTextActiveBg: '#39769C',
+ sidebarTextActiveBorder: '#39769C',
sidebarTextActiveColor: '#FFFFFF',
sidebarHeaderBg: '#1B2C3E',
sidebarHeaderTextColor: '#FFFFFF',
@@ -205,7 +205,7 @@ module.exports = {
sidebarText: '#fff',
sidebarUnreadText: '#fff',
sidebarTextHoverBg: '#302e30',
- sidebarTextActiveBg: '#484748',
+ sidebarTextActiveBorder: '#196CAF',
sidebarTextActiveColor: '#FFFFFF',
sidebarHeaderBg: '#1f1f1f',
sidebarHeaderTextColor: '#FFFFFF',
@@ -248,8 +248,8 @@ module.exports = {
uiName: 'Sidebar Text Hover BG'
},
{
- id: 'sidebarTextActiveBg',
- uiName: 'Sidebar Text Active BG'
+ id: 'sidebarTextActiveBorder',
+ uiName: 'Sidebar Text Active Border'
},
{
id: 'sidebarTextActiveColor',
diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx
index c72c3f32c..3d0cee562 100644
--- a/web/react/utils/utils.jsx
+++ b/web/react/utils/utils.jsx
@@ -118,7 +118,7 @@ export function notifyMe(title, body, channel) {
}
if (permission === 'granted') {
- var notification = new Notification(title, {body: body, tag: body, icon: '/static/images/icon50x50.gif'});
+ var notification = new Notification(title, {body: body, tag: body, icon: '/static/images/icon50x50.png'});
notification.onclick = function onClick() {
window.focus();
if (channel) {
@@ -425,18 +425,14 @@ export function applyTheme(theme) {
changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
}
- if (theme.sidebarTextActiveBg) {
- 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', 'background:' + theme.sidebarTextActiveBg, 1);
+ if (theme.sidebarTextActiveBorder) {
+ changeCss('.sidebar--left .nav li.active a:before, .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
}
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);
}
- if (theme.sidebarTextActiveBg === theme.onlineIndicator) {
- changeCss('.sidebar--left .nav-pills__container li.active a .status .online--icon', 'fill:' + theme.sidebarTextActiveColor, 1);
- }
-
if (theme.sidebarHeaderBg) {
changeCss('.sidebar--left .team__header, .sidebar--menu .team__header', 'background:' + theme.sidebarHeaderBg, 1);
changeCss('.modal .modal-header', 'background:' + theme.sidebarHeaderBg, 1);
diff --git a/web/sass-files/sass/partials/_base.scss b/web/sass-files/sass/partials/_base.scss
index cb5ff67b5..6b2e79933 100644
--- a/web/sass-files/sass/partials/_base.scss
+++ b/web/sass-files/sass/partials/_base.scss
@@ -40,6 +40,7 @@ img {
}
.popover {
+ @include border-radius(3px);
color: #333;
&.bottom, &.right, &.top, &.left {
>.arrow:after {
@@ -118,6 +119,7 @@ a:focus, a:hover {
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
cursor: auto;
+ background: rgba(#fff, 0.1);
}
.form-group {
diff --git a/web/sass-files/sass/partials/_popover.scss b/web/sass-files/sass/partials/_popover.scss
index c389ddf7d..484e63c7c 100644
--- a/web/sass-files/sass/partials/_popover.scss
+++ b/web/sass-files/sass/partials/_popover.scss
@@ -21,21 +21,43 @@
}
.search-help-popover {
- transition: opacity 0.3s;
+ visibility: hidden;
+ max-width: none;
+ width: 100%;
+ top: 36px;
+ @include single-transition(opacity, 0.3s, ease-in);
+ font-size: em(13px);
+
+ &.bottom > .arrow {
+ top: -18px;
+ border-width: 9px;
+ left: 30px;
+ }
+
+ .popover-content {
+ padding: 3px 13px;
+ }
h4 {
- text-align: left;
+ font-size: 1em;
}
+
ul {
- padding-left: 2em;
- text-align: left;
+ padding-left: 17px;
+ span {
+ @include opacity(0.8);
+ }
+ strong, b {
+ @include opacity(1);
+ }
}
+
.tooltip-inner {
max-width: 100%;
}
-}
-.search-help-popover.visible {
- opacity: 100;
- transition: opacity 0.3s;
+ &.visible {
+ visibility: visible;
+ @include opacity(1);
+ }
}
diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss
index 6ecc0d965..db58d0347 100644
--- a/web/sass-files/sass/partials/_post.scss
+++ b/web/sass-files/sass/partials/_post.scss
@@ -54,6 +54,7 @@ body.ios {
height: 2em;
margin: 0;
position: relative;
+ z-index: 0;
&:before, &:after {
content: "";
height: 1em;
@@ -116,13 +117,25 @@ body.ios {
left: 0;
width: 100%;
height: 100%;
- background-color: rgba(0, 0, 0, 0.6);
text-align: center;
color: #FFF;
font-size: em(20px);
font-weight: 600;
z-index: 6;
+ .overlay__indent {
+ background-color: rgba(0, 0, 0, 0.6);
+ position: relative;
+ height: 100%;
+ @include clearfix;
+ }
+
+ &.center-file-overlay {
+ .overlay__indent {
+ margin-left: 220px;
+ }
+ }
+
&.right-file-overlay {
font-size: em(18px);
.overlay__circle {
diff --git a/web/sass-files/sass/partials/_responsive.scss b/web/sass-files/sass/partials/_responsive.scss
index c8bb24f3a..f4e57eec5 100644
--- a/web/sass-files/sass/partials/_responsive.scss
+++ b/web/sass-files/sass/partials/_responsive.scss
@@ -179,6 +179,22 @@
}
@media screen and (max-width: 1140px) {
+ .inner__wrap {
+ &.move--left {
+ .file-overlay {
+ font-size: em(18px);
+ .overlay__circle {
+ width: 300px;
+ height: 300px;
+ margin: -150px 0 0 -150px;
+ }
+ .overlay__files {
+ margin: 60px auto 15px;
+ width: 150px;
+ }
+ }
+ }
+ }
.post {
.post__content {
width: 100%;
@@ -277,6 +293,11 @@
}
.file-overlay {
font-size: em(18px);
+ &.center-file-overlay {
+ .overlay__indent {
+ margin-left: 0;
+ }
+ }
.overlay__circle {
width: 300px;
height: 300px;
diff --git a/web/sass-files/sass/partials/_settings.scss b/web/sass-files/sass/partials/_settings.scss
index bc53dc0e4..9af045f98 100644
--- a/web/sass-files/sass/partials/_settings.scss
+++ b/web/sass-files/sass/partials/_settings.scss
@@ -211,6 +211,22 @@
a {
color: #111;
background-color: #E1E1E1;
+ &:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 5px;
+ height: 100%;
+ background: #000;
+ }
+ }
+ a, a:hover, a:focus {
+ padding-right: 10px;
+ background-color: rgba(black, 0.1);
+ border-radius: 0;
+ font-weight: 400;
+ position: relative;
}
}
}
diff --git a/web/sass-files/sass/partials/_sidebar--left.scss b/web/sass-files/sass/partials/_sidebar--left.scss
index 585a51f08..ab13d1b42 100644
--- a/web/sass-files/sass/partials/_sidebar--left.scss
+++ b/web/sass-files/sass/partials/_sidebar--left.scss
@@ -128,12 +128,23 @@
}
}
&.active {
+ a {
+ &:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 5px;
+ height: 100%;
+ background: #000;
+ }
+ }
a, a:hover, a:focus {
- color: #111;
padding-right: 10px;
- background-color: #e1e1e1;
+ background-color: rgba(black, 0.1);
border-radius: 0;
font-weight: 400;
+ position: relative;
}
}
}
diff --git a/web/static/config/manifest.json b/web/static/config/manifest.json
index 6110122c2..8f29460b3 100644
--- a/web/static/config/manifest.json
+++ b/web/static/config/manifest.json
@@ -2,7 +2,7 @@
"name": "Mattermost",
"icons": [
{
- "src": "../static/iamges/icon50x50.gif",
+ "src": "../static/iamges/icon50x50.png",
"sizes": "50x50",
"type": "image/png"
}
diff --git a/web/static/images/favicon.ico b/web/static/images/favicon.ico
index 0e7d36616..af5505331 100644
--- a/web/static/images/favicon.ico
+++ b/web/static/images/favicon.ico
Binary files differ
diff --git a/web/static/images/icon50x50.gif b/web/static/images/icon50x50.gif
deleted file mode 100644
index d79991a0f..000000000
--- a/web/static/images/icon50x50.gif
+++ /dev/null
Binary files differ
diff --git a/web/static/images/icon50x50.png b/web/static/images/icon50x50.png
new file mode 100644
index 000000000..7ac6ce1c9
--- /dev/null
+++ b/web/static/images/icon50x50.png
Binary files differ
diff --git a/web/static/images/logo.png b/web/static/images/logo.png
index 36c43b94b..423d4d270 100644
--- a/web/static/images/logo.png
+++ b/web/static/images/logo.png
Binary files differ
diff --git a/web/static/images/redfavicon.ico b/web/static/images/redfavicon.ico
index 7f404d1ef..eefefc620 100644
--- a/web/static/images/redfavicon.ico
+++ b/web/static/images/redfavicon.ico
Binary files differ
diff --git a/web/templates/authorize.html b/web/templates/authorize.html
index b0fa3e475..430291676 100644
--- a/web/templates/authorize.html
+++ b/web/templates/authorize.html
@@ -6,7 +6,7 @@
<div class="oauth-prompt">
<div class="prompt__heading">
<div class="prompt__app-icon">
- <img src="/static/images/icon50x50.gif" width="50" height="50" alt="">
+ <img src="/static/images/icon50x50.png" width="50" height="50" alt="">
</div>
<div class="text">An application would like to connect to your {{.Props.TeamName}} account.</div>
</div>