From 99923b7b8f67b3d82df069db032611430443262d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 3 Apr 2017 20:30:05 +0100 Subject: [PATCH 01/27] Escape HTML tags in Notifications (Linux) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/platform/ElectronPlatform.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vector/platform/ElectronPlatform.js b/src/vector/platform/ElectronPlatform.js index c10f2f83..ce14a22e 100644 --- a/src/vector/platform/ElectronPlatform.js +++ b/src/vector/platform/ElectronPlatform.js @@ -81,6 +81,15 @@ export default class ElectronPlatform extends VectorBasePlatform { } displayNotification(title: string, msg: string, avatarUrl: string, room: Object): Notification { + + // GNOME notification spec parses HTML tags for styling... + // Electron Docs state all supported linux notification systems follow this markup spec + // https://github.com/electron/electron/blob/master/docs/tutorial/desktop-environment-integration.md#linux + // maybe we should pass basic styling (italics, bold, underline) through from MD + if (window.process.platform === 'linux') { + msg = msg.replace(//g, ">"); + } + // Notifications in Electron use the HTML5 notification API const notification = new global.Notification( title, From ab1b377a1db736f98960d17205c9a0f89c059f53 Mon Sep 17 00:00:00 2001 From: daniel tygel Date: Mon, 10 Apr 2017 14:11:26 -0300 Subject: [PATCH 02/27] add config.json to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c28df64c..0978bc56 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ npm-debug.log electron/dist electron/pub +config.json From cc7a58512639e78444f655039f7178ef02161614 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 17 Apr 2017 14:10:51 +0100 Subject: [PATCH 03/27] make ImageView Download work, based on props.name Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/ImageView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/ImageView.js b/src/components/views/elements/ImageView.js index 42730aca..ab3e9ee8 100644 --- a/src/components/views/elements/ImageView.js +++ b/src/components/views/elements/ImageView.js @@ -176,7 +176,7 @@ module.exports = React.createClass({ { this.getName() } { eventMeta } - +
Download this file
{ size_res } From 44479f24dd26950462ef401cbe955cb69d37c7b1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 17 Apr 2017 22:10:56 +0100 Subject: [PATCH 04/27] add command line arg (--hidden) for electron app Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- electron/src/electron-main.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/electron/src/electron-main.js b/electron/src/electron-main.js index 33b44ce9..e6ffffac 100644 --- a/electron/src/electron-main.js +++ b/electron/src/electron-main.js @@ -201,9 +201,12 @@ electron.app.on('ready', () => { brand: vectorConfig.brand || 'Riot' }); - mainWindow.once('ready-to-show', () => { - mainWindow.show(); - }); + if (!process.argv.includes('--hidden')) { + mainWindow.once('ready-to-show', () => { + mainWindow.show(); + }); + } + mainWindow.on('closed', () => { mainWindow = null; }); From 0480a880f34d2e32387e08688e8441e0b11e5899 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 18 Apr 2017 19:53:56 +0100 Subject: [PATCH 05/27] styling for spoilerized access token view in Settings Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/skins/vector/css/_components.scss | 1 + .../vector-web/views/settings/_Advanced.scss | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/skins/vector/css/vector-web/views/settings/_Advanced.scss diff --git a/src/skins/vector/css/_components.scss b/src/skins/vector/css/_components.scss index df3c4600..0c3b209a 100644 --- a/src/skins/vector/css/_components.scss +++ b/src/skins/vector/css/_components.scss @@ -78,4 +78,5 @@ @import "./vector-web/views/rooms/_RoomDropTarget.scss"; @import "./vector-web/views/rooms/_RoomTooltip.scss"; @import "./vector-web/views/rooms/_SearchBar.scss"; +@import "./vector-web/views/settings/_Advanced.scss"; @import "./vector-web/views/settings/_Notifications.scss"; diff --git a/src/skins/vector/css/vector-web/views/settings/_Advanced.scss b/src/skins/vector/css/vector-web/views/settings/_Advanced.scss new file mode 100644 index 00000000..2f274038 --- /dev/null +++ b/src/skins/vector/css/vector-web/views/settings/_Advanced.scss @@ -0,0 +1,21 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_UserSettings_advanced_spoiler { + cursor: pointer; + color: $accent-color; + word-break: break-all; +} From 9b38a97110f6dc6c5d98c859ecb155dbc15af961 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 21 Apr 2017 15:06:52 +0100 Subject: [PATCH 06/27] Fix Webpack conf + conform to a bit more eslint (IDE makes my eyes hurt) + specify windows-specific copies of noParse regexes to stop the olm error Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- webpack.config.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index e32f7177..b3c8532a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,7 @@ -var path = require('path'); -var webpack = require('webpack'); -var ExtractTextPlugin = require("extract-text-webpack-plugin"); -var HtmlWebpackPlugin = require('html-webpack-plugin'); +const path = require('path'); +const webpack = require('webpack'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { @@ -19,11 +19,11 @@ module.exports = { // CSS themes "theme-light": "./src/skins/vector/css/themes/light.scss", - "theme-dark": "./src/skins/vector/css/themes/dark.scss" + "theme-dark": "./src/skins/vector/css/themes/dark.scss", }, module: { preLoaders: [ - { test: /\.js$/, loader: "source-map-loader" } + { test: /\.js$/, loader: "source-map-loader" }, ], loaders: [ { test: /\.json$/, loader: "json" }, @@ -39,7 +39,7 @@ module.exports = { // as webpack inputs.) // 3. ExtractTextPlugin turns that string into a separate asset. loader: ExtractTextPlugin.extract( - "css-raw-loader!postcss-loader?config=postcss.config.js" + "css-raw-loader!postcss-loader?config=postcss.config.js", ), }, { @@ -54,10 +54,12 @@ module.exports = { // there is no need for webpack to parse them - they can just be // included as-is. /highlight\.js\/lib\/languages/, + /highlight\.js\\lib\\languages/, // olm takes ages for webpack to process, and it's already heavily // optimised, so there is little to gain by us uglifying it. /olm\/(javascript\/)?olm\.js$/, + /olm\\(javascript\\)?olm\.js$/, ], }, output: { @@ -83,7 +85,7 @@ module.exports = { // various levels of '.' and '..' // Also, sometimes the resource path is absolute. return path.relative(process.cwd(), info.resourcePath).replace(/^[\/\.]*/, ''); - } + }, }, resolve: { alias: { @@ -106,15 +108,15 @@ module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env': { - NODE_ENV: JSON.stringify(process.env.NODE_ENV) - } + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + }, }), new ExtractTextPlugin( "bundles/[hash]/[name].css", { - allChunks: true - } + allChunks: true, + }, ), new HtmlWebpackPlugin({ From 1e139ef183b02f3602667fe810c6c32b9dfe8ffd Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Fri, 21 Apr 2017 17:03:31 +0100 Subject: [PATCH 07/27] Cosmetics to go with matrix-org/matrix-react-sdk#811 --- .../views/login/VectorLoginHeader.js | 5 +- src/skins/vector/css/_common.scss | 2 +- .../structures/login/_Login.scss | 78 ++++++++++++++++++- .../views/elements/_Dropdown.scss | 6 +- 4 files changed, 84 insertions(+), 7 deletions(-) diff --git a/src/components/views/login/VectorLoginHeader.js b/src/components/views/login/VectorLoginHeader.js index daa2b09c..1b071c6a 100644 --- a/src/components/views/login/VectorLoginHeader.js +++ b/src/components/views/login/VectorLoginHeader.js @@ -18,6 +18,9 @@ limitations under the License. var React = require('react'); +const i = [1, 2, 3, 4, 5][Math.floor(Math.random() * 5)]; +const DEFAULT_LOGO_URI = "img/logos/riot-logo-" + i + ".svg"; + module.exports = React.createClass({ displayName: 'VectorLoginHeader', statics: { @@ -30,7 +33,7 @@ module.exports = React.createClass({ render: function() { return (
- Riot + Riot
); } diff --git a/src/skins/vector/css/_common.scss b/src/skins/vector/css/_common.scss index a44a503e..43cd702c 100644 --- a/src/skins/vector/css/_common.scss +++ b/src/skins/vector/css/_common.scss @@ -65,7 +65,7 @@ input[type=text].error, input[type=password].error { border: 1px solid $warning-color; } -input[type=text]:focus, textarea:focus { +input[type=text]:focus, input[type=password]:focus, textarea:focus { border: 1px solid $accent-color; outline: none; box-shadow: none; diff --git a/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss b/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss index f21bb169..1a27b29b 100644 --- a/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss +++ b/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss @@ -66,10 +66,6 @@ limitations under the License. margin-bottom: 14px; } -.mx_Login_username { - margin-bottom: 0px; -} - .mx_Login_fieldLabel { margin-top: -10px; margin-left: 8px; @@ -167,6 +163,66 @@ limitations under the License. margin-bottom: 12px; } +.mx_Login_type_container { + display: flex; + margin-bottom: 14px; +} + +.mx_Login_type_label { + flex-grow: 1; + line-height: 35px; +} + +.mx_Login_type_dropdown { + width: 125px; + align-self: flex-end; +} + +.mx_Login_username_group { + display: flex; +} + +.mx_Login_username_prefix { + height: 33px; + padding: 0px 5px; + line-height: 33px; + + background-color: #eee; + border: 1px solid #c7c7c7; + border-right: 0px; + border-radius: 3px 0px 0px 3px; + + text-align: center; +} + +.mx_Login_username_suffix { + height: 33px; + padding: 0px 5px; + line-height: 33px; + + background-color: #eee; + border: 1px solid #c7c7c7; + border-left: 0px; + border-radius: 0px 3px 3px 0px; + + text-align: center; + flex-grow: 1; +} + +.mx_Login_username { + flex-shrink: 1; + min-width: 0px; + border-radius: 3px; + /* The "@" is always prefixed, so no rounded corners */ + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; +} + +.mx_Login_field_has_suffix { + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; +} + .mx_Login_phoneSection { display: table; } @@ -176,6 +232,20 @@ limitations under the License. width: 70px; } +.mx_Login_phoneCountry .mx_Dropdown_option { + /* + To match height of mx_Login_field + 33px + 2px border from mx_Dropdown_option = 35px + */ + height: 33px; + line-height: 33px; +} + +.mx_Login_phoneCountry .mx_Dropdown_option img { + margin: 4px; + vertical-align: top; +} + .mx_Login_phoneNumberField { width: 210px; margin-left: 3px; diff --git a/src/skins/vector/css/matrix-react-sdk/views/elements/_Dropdown.scss b/src/skins/vector/css/matrix-react-sdk/views/elements/_Dropdown.scss index b96290bd..1f9cbb63 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/elements/_Dropdown.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/elements/_Dropdown.scss @@ -27,6 +27,10 @@ limitations under the License. user-select: none; } +.mx_Dropdown_input:focus { + border-color: $accent-color; +} + .mx_Dropdown_arrow { border-color: $primary-fg-color transparent transparent; border-style: solid; @@ -74,7 +78,7 @@ input.mx_Dropdown_option, input.mx_Dropdown_option:focus { border: 1px solid $accent-color; background-color: $primary-bg-color; max-height: 200px; - overflow-y: scroll; + overflow-y: auto; } .mx_Dropdown_menu .mx_Dropdown_option_highlight { From a2b465e352c351380a76a79ea7be619223f9938b Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Fri, 21 Apr 2017 17:14:59 +0100 Subject: [PATCH 08/27] Remove old logo --- src/skins/vector/img/logo.png | Bin 19338 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/skins/vector/img/logo.png diff --git a/src/skins/vector/img/logo.png b/src/skins/vector/img/logo.png deleted file mode 100644 index da6bb327f9e095d562ea627b24e337ac59d7a6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19338 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 y^%dRf7>DDxMX8baauK#Dc%O? Date: Fri, 21 Apr 2017 17:16:53 +0100 Subject: [PATCH 09/27] Add cross-env into the mix this way `npm run build` will work on Windows too :D Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 81b87f62..843b69dc 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "build:res": "node scripts/copy-res.js", "build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js", "build:compile": "babel --source-maps -d lib src", - "build:bundle": "NODE_ENV=production webpack -p --progress", + "build:bundle": "cross-env NODE_ENV=production webpack -p --progress", "build:bundle:dev": "webpack --optimize-occurence-order --progress", "build:electron": "npm run clean && npm run build && build -wml --ia32 --x64", "build": "node scripts/babelcheck.js && npm run build:res && npm run build:bundle", @@ -38,7 +38,7 @@ "dist": "scripts/package.sh", "start:res": "node scripts/copy-res.js -w", "start:js": "webpack-dev-server --output-filename=bundles/_dev_/[name].js --output-chunk-file=bundles/_dev_/[name].js -w --progress", - "start:js:prod": "NODE_ENV=production webpack-dev-server -w --progress", + "start:js:prod": "cross-env NODE_ENV=production webpack-dev-server -w --progress", "start": "node scripts/babelcheck.js && parallelshell \"npm run start:res\" \"npm run start:js\"", "start:prod": "parallelshell \"npm run start:res\" \"npm run start:js:prod\"", "lint": "eslint src/", @@ -93,6 +93,7 @@ "babel-preset-stage-2": "^6.17.0", "chokidar": "^1.6.1", "cpx": "^1.3.2", + "cross-env": "^4.0.0", "css-raw-loader": "^0.1.1", "electron-builder": "^11.2.4", "electron-builder-squirrel-windows": "^11.2.1", From f010afe63f981fcaa24a9c6fa05192b9f5144f5b Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Fri, 21 Apr 2017 17:36:48 +0100 Subject: [PATCH 10/27] Add emojione PNGs to the COPY_LIST --- scripts/copy-res.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/copy-res.js b/scripts/copy-res.js index 826d9a96..4702d5cf 100755 --- a/scripts/copy-res.js +++ b/scripts/copy-res.js @@ -10,6 +10,7 @@ const COPY_LIST = [ ["res/{media,vector-icons}/**", "webapp"], ["src/skins/vector/{fonts,img}/**", "webapp"], ["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"], + ["node_modules/emojione/assets/png/*", "webapp/emojione/png/"], ["./config.json", "webapp", {directwatch: 1}], ]; From dd7f9e2d5f1285fc114abd7639012731ddc1e4cb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 21 Apr 2017 19:00:24 +0100 Subject: [PATCH 11/27] argh, fix eslint false positives Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- webpack.config.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index b3c8532a..f3912d1e 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -38,9 +38,7 @@ module.exports = { // would also drag in the imgs and fonts that our CSS refers to // as webpack inputs.) // 3. ExtractTextPlugin turns that string into a separate asset. - loader: ExtractTextPlugin.extract( - "css-raw-loader!postcss-loader?config=postcss.config.js", - ), + loader: ExtractTextPlugin.extract("css-raw-loader!postcss-loader?config=postcss.config.js"), }, { // this works similarly to the scss case, without postcss. @@ -112,12 +110,9 @@ module.exports = { }, }), - new ExtractTextPlugin( - "bundles/[hash]/[name].css", - { - allChunks: true, - }, - ), + new ExtractTextPlugin("bundles/[hash]/[name].css", { + allChunks: true, + }), new HtmlWebpackPlugin({ template: './src/vector/index.html', From e877ad2e63630224d6f50c1f96e5bf757feaf12b Mon Sep 17 00:00:00 2001 From: turt2live Date: Fri, 21 Apr 2017 16:08:49 -0600 Subject: [PATCH 12/27] Remember acceptance for unsupported browsers. Addresses #3624. This stores the flag in localStorage, after checking if localStorage is available. If localStorage is not available, the user will be prompted just like before this commit. Signed-off-by: Travis Ralston --- src/vector/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vector/index.js b/src/vector/index.js index 42a60e45..043df5b4 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -263,6 +263,11 @@ async function loadApp() { configError = e; } + if (window.localStorage && window.localStorage.getItem('accepts_unsupported_browser')) { + console.log('User has previously accepted risks in using an unsupported browser'); + validBrowser = true; + } + console.log("Vector starting at "+window.location); if (configError) { window.matrixChat = ReactDOM.render(
@@ -294,6 +299,7 @@ async function loadApp() { var CompatibilityPage = sdk.getComponent("structures.CompatibilityPage"); window.matrixChat = ReactDOM.render( Date: Sat, 22 Apr 2017 01:19:11 +0100 Subject: [PATCH 13/27] improve logo cosmetics --- .../vector/css/matrix-react-sdk/structures/login/_Login.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss b/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss index 1a27b29b..12430480 100644 --- a/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss +++ b/src/skins/vector/css/matrix-react-sdk/structures/login/_Login.scss @@ -42,7 +42,8 @@ limitations under the License. .mx_Login_logo { text-align: center; - height: 195px; + height: 150px; + margin-bottom: 45px; } .mx_Login_logo img { From 8a9b750b31df77c8928ec6ed44757103d93d6080 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 22 Apr 2017 01:55:57 +0100 Subject: [PATCH 14/27] apply focus filter to normal buttons too --- src/skins/vector/css/_common.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/skins/vector/css/_common.scss b/src/skins/vector/css/_common.scss index 43cd702c..5b1d1de6 100644 --- a/src/skins/vector/css/_common.scss +++ b/src/skins/vector/css/_common.scss @@ -225,6 +225,10 @@ textarea { vertical-align: middle; } +.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus { + filter: brightness($focus-brightness); +} + .mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary { color: $accent-fg-color; background-color: $accent-color; From 38fa9f78f1e6053c145819d4223735297d79cc59 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 22 Apr 2017 02:17:22 +0100 Subject: [PATCH 15/27] prefix localstorage key as per the convention --- src/vector/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vector/index.js b/src/vector/index.js index 043df5b4..0d704d99 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -263,7 +263,7 @@ async function loadApp() { configError = e; } - if (window.localStorage && window.localStorage.getItem('accepts_unsupported_browser')) { + if (window.localStorage && window.localStorage.getItem('mx_accepts_unsupported_browser')) { console.log('User has previously accepted risks in using an unsupported browser'); validBrowser = true; } @@ -299,7 +299,7 @@ async function loadApp() { var CompatibilityPage = sdk.getComponent("structures.CompatibilityPage"); window.matrixChat = ReactDOM.render( Date: Sat, 22 Apr 2017 04:33:47 +0100 Subject: [PATCH 16/27] move styling to correct place NOTE TO SELF 1:1 mapping between react component to scss file. Makes sense... Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/skins/vector/css/_components.scss | 1 - .../structures/_UserSettings.scss | 6 ++++++ .../vector-web/views/settings/_Advanced.scss | 21 ------------------- 3 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 src/skins/vector/css/vector-web/views/settings/_Advanced.scss diff --git a/src/skins/vector/css/_components.scss b/src/skins/vector/css/_components.scss index 0c3b209a..df3c4600 100644 --- a/src/skins/vector/css/_components.scss +++ b/src/skins/vector/css/_components.scss @@ -78,5 +78,4 @@ @import "./vector-web/views/rooms/_RoomDropTarget.scss"; @import "./vector-web/views/rooms/_RoomTooltip.scss"; @import "./vector-web/views/rooms/_SearchBar.scss"; -@import "./vector-web/views/settings/_Advanced.scss"; @import "./vector-web/views/settings/_Notifications.scss"; diff --git a/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss b/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss index 099b5b51..9f33e1bc 100644 --- a/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss +++ b/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss @@ -213,3 +213,9 @@ input.mx_UserSettings_phoneNumberField { .mx_UserSettings_avatarPicker_edit > input { display: none; } + +.mx_UserSettings_advanced_spoiler { + cursor: pointer; + color: $accent-color; + word-break: break-all; +} diff --git a/src/skins/vector/css/vector-web/views/settings/_Advanced.scss b/src/skins/vector/css/vector-web/views/settings/_Advanced.scss deleted file mode 100644 index 2f274038..00000000 --- a/src/skins/vector/css/vector-web/views/settings/_Advanced.scss +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -.mx_UserSettings_advanced_spoiler { - cursor: pointer; - color: $accent-color; - word-break: break-all; -} From 08fb20a0dfa327d89cb9b1980312997f18eea242 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 22 Apr 2017 14:02:18 +0100 Subject: [PATCH 17/27] use a character class for brevity add a comment so this madness has meaning Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- webpack.config.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index f3912d1e..efeab7fe 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -47,17 +47,18 @@ module.exports = { }, ], noParse: [ + // for cross platform compatibility use [\\\/] as the path separator + // this ensures that the regex trips on both Windows and *nix + // don't parse the languages within highlight.js. They cause stack // overflows (https://github.com/webpack/webpack/issues/1721), and // there is no need for webpack to parse them - they can just be // included as-is. - /highlight\.js\/lib\/languages/, - /highlight\.js\\lib\\languages/, + /highlight\.js[\\\/]lib[\\\/]languages/, // olm takes ages for webpack to process, and it's already heavily // optimised, so there is little to gain by us uglifying it. - /olm\/(javascript\/)?olm\.js$/, - /olm\\(javascript\\)?olm\.js$/, + /olm[\\\/](javascript[\\\/])?olm\.js$/, ], }, output: { From 0da6ca8aead4b81289122118ca60e5d0a1759083 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 22 Apr 2017 16:05:08 +0100 Subject: [PATCH 18/27] add more comment to explain this weirdness Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/platform/ElectronPlatform.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vector/platform/ElectronPlatform.js b/src/vector/platform/ElectronPlatform.js index ce14a22e..1271c8a5 100644 --- a/src/vector/platform/ElectronPlatform.js +++ b/src/vector/platform/ElectronPlatform.js @@ -86,6 +86,8 @@ export default class ElectronPlatform extends VectorBasePlatform { // Electron Docs state all supported linux notification systems follow this markup spec // https://github.com/electron/electron/blob/master/docs/tutorial/desktop-environment-integration.md#linux // maybe we should pass basic styling (italics, bold, underline) through from MD + // we only have to strip out < and > as the spec doesn't include anything about things like & + // so we shouldn't assume that all implementations will treat those properly. Very basic tag parsing is done. if (window.process.platform === 'linux') { msg = msg.replace(//g, ">"); } From b3431bb75008b068a2a1805803b91d0ff2616571 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 22 Apr 2017 17:28:00 +0100 Subject: [PATCH 19/27] fix incoming call box --- src/components/structures/RoomSubList.js | 1 + src/components/structures/RoomSubListHeader.js | 1 + .../vector/css/matrix-react-sdk/structures/_RoomView.scss | 4 ++-- .../css/matrix-react-sdk/views/voip/_IncomingCallbox.scss | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 88630891..2898de2d 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -515,6 +515,7 @@ var RoomSubList = React.createClass({ roomCount={ roomCount } collapsed={ this.props.collapsed } hidden={ this.state.hidden } + incomingCall={ this.props.incomingCall } isIncomingCallRoom={ isIncomingCallRoom } roomNotificationCount={ this.roomNotificationCount() } onClick={ this.onClick } diff --git a/src/components/structures/RoomSubListHeader.js b/src/components/structures/RoomSubListHeader.js index 5618b39b..eb73f721 100644 --- a/src/components/structures/RoomSubListHeader.js +++ b/src/components/structures/RoomSubListHeader.js @@ -36,6 +36,7 @@ module.exports = React.createClass({ React.PropTypes.number ]), collapsed: React.PropTypes.bool.isRequired, // is LeftPanel collapsed? + incomingCall: React.PropTypes.object, isIncomingCallRoom: React.PropTypes.bool, roomNotificationCount: React.PropTypes.array, hidden: React.PropTypes.bool, diff --git a/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss b/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss index 9c883caa..12861939 100644 --- a/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss +++ b/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss @@ -171,7 +171,7 @@ hr.mx_RoomView_myReadMarker { max-height: 0px; background-color: $primary-bg-color; - z-index: 1000; + z-index: 5; overflow: hidden; -webkit-transition: all .2s ease-out; @@ -259,4 +259,4 @@ hr.mx_RoomView_myReadMarker { .mx_RoomView_ongoingConfCallNotification a { color: $accent-fg-color ! important; -} \ No newline at end of file +} diff --git a/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss b/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss index 64eac25d..e63814f5 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss @@ -25,6 +25,8 @@ limitations under the License. margin-top: -3px; margin-left: -20px; width: 200px; + font-weight: initial; + text-transform: initial; } .mx_IncomingCallBox_chevron { From be527874730d959fa980e81c897a658a03952aad Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 22 Apr 2017 17:37:16 +0100 Subject: [PATCH 20/27] better solution to incomingcallbox weirdness --- src/components/structures/RoomSubListHeader.js | 2 +- .../css/matrix-react-sdk/views/voip/_IncomingCallbox.scss | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/structures/RoomSubListHeader.js b/src/components/structures/RoomSubListHeader.js index eb73f721..ad9aff5f 100644 --- a/src/components/structures/RoomSubListHeader.js +++ b/src/components/structures/RoomSubListHeader.js @@ -112,8 +112,8 @@ module.exports = React.createClass({
{ roomCount }
{ badge } - { incomingCall } + { incomingCall }
); }, diff --git a/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss b/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss index e63814f5..64eac25d 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/voip/_IncomingCallbox.scss @@ -25,8 +25,6 @@ limitations under the License. margin-top: -3px; margin-left: -20px; width: 200px; - font-weight: initial; - text-transform: initial; } .mx_IncomingCallBox_chevron { From b1ff0b9e656ea4881912d0facb5813f9e8f2ab6e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 23 Apr 2017 01:00:25 +0100 Subject: [PATCH 21/27] hook up keyb shortcuts for roomdir --- src/components/structures/RoomDirectory.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index e723cf1a..937104c7 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -23,7 +23,6 @@ var ContentRepo = require("matrix-js-sdk").ContentRepo; var Modal = require('matrix-react-sdk/lib/Modal'); var sdk = require('matrix-react-sdk'); var dis = require('matrix-react-sdk/lib/dispatcher'); -var GeminiScrollbar = require('react-gemini-scrollbar'); var linkify = require('linkifyjs'); var linkifyString = require('linkifyjs/string'); @@ -460,6 +459,17 @@ module.exports = React.createClass({ return fields; }, + /** + * called by the parent component when PageUp/Down/etc is pressed. + * + * We pass it down to the scroll panel. + */ + handleScrollKey: function(ev) { + if (this.scrollPanel) { + scrollPanel.handleScrollKey(ev); + } + }, + render: function() { const SimpleRoomHeader = sdk.getComponent('rooms.SimpleRoomHeader'); const Loader = sdk.getComponent("elements.Spinner"); From ab5ec0450792a27f93c96a638c418793adde2ad9 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 23 Apr 2017 01:01:38 +0100 Subject: [PATCH 22/27] oops --- src/components/structures/RoomDirectory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 937104c7..2aee97db 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -466,7 +466,7 @@ module.exports = React.createClass({ */ handleScrollKey: function(ev) { if (this.scrollPanel) { - scrollPanel.handleScrollKey(ev); + this.scrollPanel.handleScrollKey(ev); } }, From 40eceaf9bc49488dc2885ac9c6ff6f21e82ac74b Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 23 Apr 2017 02:22:31 +0100 Subject: [PATCH 23/27] show err.message in errors if present --- src/components/structures/RoomDirectory.js | 6 +++--- src/components/structures/RoomSubList.js | 4 ++-- .../views/context_menus/RoomTileContextMenu.js | 10 +++++----- src/components/views/rooms/DNDRoomTile.js | 12 ++++++------ src/components/views/settings/Notifications.js | 12 ++++++------ 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 2aee97db..f8a3d9e9 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -161,7 +161,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: "Failed to get public room list", - description: "The server may be unavailable or overloaded", + description: ((err && err.message) ? err.message : "The server may be unavailable or overloaded"), }); }); }, @@ -209,8 +209,8 @@ module.exports = React.createClass({ this.refreshRoomList(); console.error("Failed to " + step + ": " + err); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to " + step, + title: "Failed to " + step, + description: ((err && err.message) ? err.message : "The server may be unavailable or overloaded"), }); }); } diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 2898de2d..577dac9c 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -456,8 +456,8 @@ var RoomSubList = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to add tag " + self.props.tagName + " to room" + err); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to add tag " + self.props.tagName + " to room", + title: "Failed to add tag " + self.props.tagName + " to room", + description: ((err && err.message) ? err.message : "Operation failed"), }); }); break; diff --git a/src/components/views/context_menus/RoomTileContextMenu.js b/src/components/views/context_menus/RoomTileContextMenu.js index d981a367..7efa6848 100644 --- a/src/components/views/context_menus/RoomTileContextMenu.js +++ b/src/components/views/context_menus/RoomTileContextMenu.js @@ -71,7 +71,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: "Failed to remove tag " + tagNameOff + " from room", - description: err.toString() + description: ((err && err.message) ? err.message : "Operation failed"), }); }); } @@ -88,7 +88,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: "Failed to add tag " + tagNameOn + " to room", - description: err.toString() + description: ((err && err.message) ? err.message : "Operation failed"), }); }); } @@ -149,7 +149,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: "Failed to set Direct Message status of room", - description: err.toString() + description: ((err && err.message) ? err.message : "Operation failed"), }); }); }, @@ -187,8 +187,8 @@ module.exports = React.createClass({ var errCode = err.errcode || "unknown error code"; var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { - title: "Error", - description: `Failed to forget room (${errCode})` + title: `Failed to forget room (${errCode})`, + description: ((err && err.message) ? err.message : "Operation failed"), }); }); diff --git a/src/components/views/rooms/DNDRoomTile.js b/src/components/views/rooms/DNDRoomTile.js index 2fcdb47d..4bcf29ed 100644 --- a/src/components/views/rooms/DNDRoomTile.js +++ b/src/components/views/rooms/DNDRoomTile.js @@ -90,8 +90,8 @@ var roomTileSource = { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to set direct chat tag " + err); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to set direct chat tag", + title: "Failed to set direct chat tag", + description: ((err && err.message) ? err.message : "Operation failed"), }); }); return; @@ -115,8 +115,8 @@ var roomTileSource = { var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to remove tag " + prevTag + " from room: " + err); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to remove tag " + prevTag + " from room", + title: "Failed to remove tag " + prevTag + " from room", + description: ((err && err.message) ? err.message : "Operation failed"), }); }); } @@ -137,8 +137,8 @@ var roomTileSource = { var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to add tag " + newTag + " to room: " + err); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to add tag " + newTag + " to room", + title: "Failed to add tag " + newTag + " to room", + description: ((err && err.message) ? err.message : "Operation failed"), }); }); } diff --git a/src/components/views/settings/Notifications.js b/src/components/views/settings/Notifications.js index b685c1f3..11dc79ac 100644 --- a/src/components/views/settings/Notifications.js +++ b/src/components/views/settings/Notifications.js @@ -240,8 +240,8 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to change settings: " + error); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to change settings", + title: "Failed to change settings", + description: ((error && error.message) ? error.message : "Operation failed"), onFinished: self._refreshFromServer }); }); @@ -310,8 +310,8 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Can't update user notification settings: " + error); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Can't update user notification settings", + title: "Can't update user notification settings", + description: ((error && error.message) ? error.message : "Operation failed"), onFinished: self._refreshFromServer }); }); @@ -352,8 +352,8 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Failed to update keywords: " + error); Modal.createDialog(ErrorDialog, { - title: "Error", - description: "Failed to update keywords", + title: "Failed to update keywords", + description: ((error && error.message) ? error.message : "Operation failed"), onFinished: self._refreshFromServer }); } From 8b4ab4bcdd8428913e351028e16135a860c19b74 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sun, 23 Apr 2017 03:14:41 +0100 Subject: [PATCH 24/27] update room directory icon to something that looks like a room list --- src/skins/vector/img/icons-directory.svg | 33 +++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/skins/vector/img/icons-directory.svg b/src/skins/vector/img/icons-directory.svg index 1f1cc29a..2688b847 100644 --- a/src/skins/vector/img/icons-directory.svg +++ b/src/skins/vector/img/icons-directory.svg @@ -1,21 +1,24 @@ - - E34C64ED-EBD7-49B6-BDD9-CB729162705A - Created with sketchtool. - - - - - - + + icons_directory + Created with Sketch. + - - - - - + + + + + + + + + + + + + - + \ No newline at end of file From 57f91086e6fbf4da51f5c177901b3f22582675f7 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Mon, 24 Apr 2017 01:08:09 +0100 Subject: [PATCH 25/27] add bullseye icon for 'Jump to first unread message' --- src/skins/vector/img/scrollto.svg | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/skins/vector/img/scrollto.svg diff --git a/src/skins/vector/img/scrollto.svg b/src/skins/vector/img/scrollto.svg new file mode 100644 index 00000000..75df053a --- /dev/null +++ b/src/skins/vector/img/scrollto.svg @@ -0,0 +1,21 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file From a4143526610f8f421cd8805593351c824b0b741d Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Mon, 24 Apr 2017 01:13:24 +0100 Subject: [PATCH 26/27] re-add img to _TopUnreadMessagesBar.scss --- .../views/rooms/_TopUnreadMessagesBar.scss | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss index 6b0c8863..ee9cf522 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss @@ -20,17 +20,12 @@ limitations under the License. padding-top: 5px; padding-bottom: 5px; border-bottom: 1px solid $primary-hairline-color; - - /* in absence of img */ - height: 24px; } .mx_TopUnreadMessagesBar_scrollUp { display: inline; cursor: pointer; - - /* in absence of img */ - padding-left: 65px; + text-decoration: underline; } .mx_TopUnreadMessagesBar_scrollUp img { From af105b192035b0c294a8546cefdb09fe7472995a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Mon, 24 Apr 2017 01:17:17 +0100 Subject: [PATCH 27/27] moar padding for _TopUnreadMessagesBar.scss --- .../matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss index ee9cf522..7b76eb7f 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_TopUnreadMessagesBar.scss @@ -17,8 +17,8 @@ limitations under the License. .mx_TopUnreadMessagesBar { margin: auto; /* centre horizontally */ max-width: 960px; - padding-top: 5px; - padding-bottom: 5px; + padding-top: 10px; + padding-bottom: 10px; border-bottom: 1px solid $primary-hairline-color; }