diff --git a/.gitignore b/.gitignore index dcfe1c355d..b99c9f1145 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,5 @@ npm-debug.log # test reports created by karma /karma-reports -# ignore auto-generated component index +/.idea /src/component-index.js diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 6c92dae53d..55499b0570 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -42,9 +42,17 @@ foreach my $tuple (@$src_strings) { print "\nChecking en_EN\n"; my $count = 0; +my $remaining_src = {}; +foreach (keys %$src) { $remaining_src->{$_}++ }; + foreach my $k (sort keys %$en) { # crappy heuristic to ignore country codes for now... next if ($k =~ /^(..|..-..)$/); + + if ($en->{$k} ne $k) { + printf ("%50s %24s\t%s\n", "en_EN", "en_EN is not symmetrical", $k); + } + if (!$src->{$k}) { if ($src->{$k. '.'}) { printf ("%50s %24s\t%s\n", $src->{$k. '.'}, "src has fullstop!", $k); @@ -61,9 +69,13 @@ foreach my $k (sort keys %$en) { } else { $count++; + delete $remaining_src->{$k}; } } printf ("$count/" . (scalar keys %$src) . " strings found in src are present in en_EN\n"); +foreach (keys %$remaining_src) { + print "missing: $_\n"; +} opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); @@ -74,12 +86,32 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) my $map = read_i18n($i18ndir."/".$lang); my $count = 0; + my $remaining_en = {}; + foreach (keys %$en) { $remaining_en->{$_}++ }; + foreach my $k (sort keys %$map) { + { + no warnings 'uninitialized'; + my $vars = {}; + while ($k =~ /%\((.*?)\)s/g) { + $vars->{$1}++; + } + while ($map->{$k} =~ /%\((.*?)\)s/g) { + $vars->{$1}--; + } + foreach my $var (keys %$vars) { + if ($vars->{$var} != 0) { + printf ("%10s %24s\t%s\n", $lang, "Broken var ($var)s", $k); + } + } + } + if ($en->{$k}) { if ($map->{$k} eq $k) { printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", $k); } $count++; + delete $remaining_en->{$k}; } else { if ($en->{$k . "."}) { @@ -97,6 +129,12 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) } } + if (scalar keys %$remaining_en < 100) { + foreach (keys %$remaining_en) { + printf ("%10s %24s\t%s\n", $lang, "Not yet translated", $_); + } + } + printf ("$count/" . (scalar keys %$en) . " strings translated\n"); } diff --git a/src/UnknownDeviceErrorHandler.js b/src/UnknownDeviceErrorHandler.js index 2aa0573e22..2b1cf23380 100644 --- a/src/UnknownDeviceErrorHandler.js +++ b/src/UnknownDeviceErrorHandler.js @@ -22,7 +22,7 @@ let isDialogOpen = false; const onAction = function(payload) { if (payload.action === 'unknown_device_error' && !isDialogOpen) { - var UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog"); + const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); isDialogOpen = true; Modal.createDialog(UnknownDeviceDialog, { devices: payload.err.devices, @@ -33,17 +33,17 @@ const onAction = function(payload) { // https://github.com/vector-im/riot-web/issues/3148 console.log('UnknownDeviceDialog closed with '+r); }, - }, "mx_Dialog_unknownDevice"); + }, 'mx_Dialog_unknownDevice'); } -} +}; let ref = null; -export function startListening () { +export function startListening() { ref = dis.register(onAction); } -export function stopListening () { +export function stopListening() { if (ref) { dis.unregister(ref); ref = null; diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 25ca025a23..5f1aa0d32a 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -183,7 +183,7 @@ export default React.createClass({ ConferenceHandler={this.props.ConferenceHandler} scrollStateMap={this._scrollStateMap} />; - if (!this.props.collapse_rhs) right_panel = ; + if (!this.props.collapse_rhs) right_panel = ; break; case PageTypes.UserSettings: @@ -195,7 +195,7 @@ export default React.createClass({ referralBaseUrl={this.props.config.referralBaseUrl} teamToken={this.props.teamToken} />; - if (!this.props.collapse_rhs) right_panel = ; + if (!this.props.collapse_rhs) right_panel = ; break; case PageTypes.CreateRoom: @@ -203,7 +203,7 @@ export default React.createClass({ onRoomCreated={this.props.onRoomCreated} collapsedRhs={this.props.collapse_rhs} />; - if (!this.props.collapse_rhs) right_panel = ; + if (!this.props.collapse_rhs) right_panel = ; break; case PageTypes.RoomDirectory: @@ -219,12 +219,12 @@ export default React.createClass({ teamServerUrl={this.props.config.teamServerConfig.teamServerURL} teamToken={this.props.teamToken} /> - if (!this.props.collapse_rhs) right_panel = + if (!this.props.collapse_rhs) right_panel = break; case PageTypes.UserView: page_element = null; // deliberately null for now - right_panel = ; + right_panel = ; break; } @@ -253,7 +253,7 @@ export default React.createClass({
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 2ba1506551..d8e1f881f1 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -117,8 +117,9 @@ module.exports = React.createClass({ collapse_rhs: false, ready: false, width: 10000, - sideOpacity: 1.0, + leftOpacity: 1.0, middleOpacity: 1.0, + rightOpacity: 1.0, version: null, newVersion: null, @@ -247,7 +248,6 @@ module.exports = React.createClass({ UDEHandler.startListening(); this.focusComposer = false; - window.addEventListener("focus", this.onFocus); // this can technically be done anywhere but doing this here keeps all // the routing url path logic together. @@ -491,12 +491,14 @@ module.exports = React.createClass({ collapse_rhs: false, }); break; - case 'ui_opacity': + case 'ui_opacity': { + const sideDefault = payload.sideOpacity >= 0.0 ? payload.sideOpacity : 1.0; this.setState({ - sideOpacity: payload.sideOpacity, - middleOpacity: payload.middleOpacity, + leftOpacity: payload.leftOpacity >= 0.0 ? payload.leftOpacity : sideDefault, + middleOpacity: payload.middleOpacity || 1.0, + rightOpacity: payload.rightOpacity >= 0.0 ? payload.rightOpacity : sideDefault, }); - break; + break; } case 'set_theme': this._onSetTheme(payload.value); break; @@ -910,10 +912,6 @@ module.exports = React.createClass({ }); }, - onFocus: function(ev) { - dis.dispatch({action: 'focus_composer'}); - }, - showScreen: function(screen, params) { if (screen == 'register') { dis.dispatch({ diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 4b3b09f1fa..e939510c72 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -125,6 +125,8 @@ module.exports = React.createClass({ room: null, roomId: null, roomLoading: true, + + forwardingEvent: null, editingRoomSettings: false, uploadingRoomSettings: false, numUnreadMessages: 0, @@ -452,6 +454,11 @@ module.exports = React.createClass({ callState: callState }); + break; + case 'forward_event': + this.setState({ + forwardingEvent: payload.content, + }); break; } }, @@ -1195,7 +1202,10 @@ module.exports = React.createClass({ onCancelClick: function() { console.log("updateTint from onCancelClick"); this.updateTint(); - this.setState({editingRoomSettings: false}); + this.setState({ + editingRoomSettings: false, + forwardingEvent: null, + }); dis.dispatch({action: 'focus_composer'}); }, @@ -1473,16 +1483,17 @@ module.exports = React.createClass({ }, render: function() { - var RoomHeader = sdk.getComponent('rooms.RoomHeader'); - var MessageComposer = sdk.getComponent('rooms.MessageComposer'); - var RoomSettings = sdk.getComponent("rooms.RoomSettings"); - var AuxPanel = sdk.getComponent("rooms.AuxPanel"); - var SearchBar = sdk.getComponent("rooms.SearchBar"); - var ScrollPanel = sdk.getComponent("structures.ScrollPanel"); - var TintableSvg = sdk.getComponent("elements.TintableSvg"); - var RoomPreviewBar = sdk.getComponent("rooms.RoomPreviewBar"); - var Loader = sdk.getComponent("elements.Spinner"); - var TimelinePanel = sdk.getComponent("structures.TimelinePanel"); + const RoomHeader = sdk.getComponent('rooms.RoomHeader'); + const MessageComposer = sdk.getComponent('rooms.MessageComposer'); + const ForwardMessage = sdk.getComponent("rooms.ForwardMessage"); + const RoomSettings = sdk.getComponent("rooms.RoomSettings"); + const AuxPanel = sdk.getComponent("rooms.AuxPanel"); + const SearchBar = sdk.getComponent("rooms.SearchBar"); + const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); + const TintableSvg = sdk.getComponent("elements.TintableSvg"); + const RoomPreviewBar = sdk.getComponent("rooms.RoomPreviewBar"); + const Loader = sdk.getComponent("elements.Spinner"); + const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); if (!this.state.room) { if (this.state.roomLoading) { @@ -1610,17 +1621,16 @@ module.exports = React.createClass({ />; } - var aux = null; - if (this.state.editingRoomSettings) { + let aux = null; + if (this.state.forwardingEvent !== null) { + aux = ; + } else if (this.state.editingRoomSettings) { aux = ; - } - else if (this.state.uploadingRoomSettings) { + } else if (this.state.uploadingRoomSettings) { aux = ; - } - else if (this.state.searching) { + } else if (this.state.searching) { aux = ; - } - else if (!myMember || myMember.membership !== "join") { + } else if (!myMember || myMember.membership !== "join") { // We do have a room object for this room, but we're not currently in it. // We may have a 3rd party invite to it. var inviterName = undefined; @@ -1733,14 +1743,13 @@ module.exports = React.createClass({ } // console.log("ShowUrlPreview for %s is %s", this.state.room.roomId, this.state.showUrlPreview); - var messagePanel = (