From c9c496f0e51a07b894f9a3ab06fd65a74d2b61a9 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Wed, 13 Jan 2016 13:15:13 +0000 Subject: [PATCH] WIP all new roomsettings --- src/SlashCommands.js | 2 +- src/component-index.js | 1 + src/components/structures/MatrixChat.js | 2 +- src/components/structures/RoomView.js | 6 +- src/components/views/elements/EditableText.js | 8 +- src/components/views/messages/TextualBody.js | 3 + src/components/views/rooms/RoomSettings.js | 206 +++++++++++++----- 7 files changed, 161 insertions(+), 67 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 35216aa403..1dd7ecb08f 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -57,7 +57,7 @@ var commands = { } return success( MatrixClientPeg.get().setRoomAccountData( - room_id, "m.room.color_scheme", colorScheme + room_id, "org.matrix.room.color_scheme", colorScheme ) ); } diff --git a/src/component-index.js b/src/component-index.js index 0c08d70b73..7975b9a360 100644 --- a/src/component-index.js +++ b/src/component-index.js @@ -40,6 +40,7 @@ module.exports.components['views.dialogs.ErrorDialog'] = require('./components/v module.exports.components['views.dialogs.LogoutPrompt'] = require('./components/views/dialogs/LogoutPrompt'); module.exports.components['views.dialogs.QuestionDialog'] = require('./components/views/dialogs/QuestionDialog'); module.exports.components['views.elements.EditableText'] = require('./components/views/elements/EditableText'); +module.exports.components['views.elements.PowerSelector'] = require('./components/views/elements/PowerSelector'); module.exports.components['views.elements.ProgressBar'] = require('./components/views/elements/ProgressBar'); module.exports.components['views.elements.TintableSvg'] = require('./components/views/elements/TintableSvg'); module.exports.components['views.elements.UserSelector'] = require('./components/views/elements/UserSelector'); diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 56885ce499..ef77787035 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -360,7 +360,7 @@ module.exports = React.createClass({ var theAlias = MatrixTools.getCanonicalAliasForRoom(room); if (theAlias) presentedId = theAlias; - var color_scheme_event = room.getAccountData("m.room.color_scheme"); + var color_scheme_event = room.getAccountData("org.matrix.room.color_scheme"); var color_scheme = {}; if (color_scheme_event) { color_scheme = color_scheme_event.getContent(); diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 3851682b6f..9249a26351 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -244,7 +244,7 @@ module.exports = React.createClass({ var room = MatrixClientPeg.get().getRoom(this.props.roomId); if (!room) return; - var color_scheme_event = room.getAccountData("m.room.color_scheme"); + var color_scheme_event = room.getAccountData("org.matrix.room.color_scheme"); var color_scheme = {}; if (color_scheme_event) { color_scheme = color_scheme_event.getContent(); @@ -255,7 +255,7 @@ module.exports = React.createClass({ onRoomAccountData: function(room, event) { if (room.roomId == this.props.roomId) { - if (event.getType === "m.room.color_scheme") { + if (event.getType === "org.matrix.room.color_scheme") { var color_scheme = event.getContent(); // XXX: we should validate the event Tinter.tint(color_scheme.primary_color, color_scheme.secondary_color); @@ -810,7 +810,7 @@ module.exports = React.createClass({ if (new_color_scheme) { deferreds.push( MatrixClientPeg.get().setRoomAccountData( - this.state.room.roomId, "m.room.color_scheme", new_color_scheme + this.state.room.roomId, "org.matrix.room.color_scheme", new_color_scheme ) ); } diff --git a/src/components/views/elements/EditableText.js b/src/components/views/elements/EditableText.js index 6c6be899f5..ff41f26f42 100644 --- a/src/components/views/elements/EditableText.js +++ b/src/components/views/elements/EditableText.js @@ -33,6 +33,7 @@ module.exports = React.createClass({ labelClassName: React.PropTypes.string, placeholderClassName: React.PropTypes.string, blurToCancel: React.PropTypes.bool, + editable: React.PropTypes.bool, }, Phases: { @@ -49,6 +50,7 @@ module.exports = React.createClass({ initialValue: '', label: '', placeholder: '', + editable: true, }; }, @@ -141,6 +143,8 @@ module.exports = React.createClass({ }, onClickDiv: function(ev) { + if (!this.props.editable) return; + this.setState({ phase: this.Phases.Edit, }) @@ -178,9 +182,9 @@ module.exports = React.createClass({ render: function() { var editable_el; - if (this.state.phase == this.Phases.Display && (this.props.label || this.props.labelClassName) && !this.value) { + if (!this.props.editable || (this.state.phase == this.Phases.Display && (this.props.label || this.props.labelClassName) && !this.value)) { // show the label - editable_el =
{this.props.label}
; + editable_el =
{ this.props.label || this.props.initialValue }
; } else { // show the content editable div, but manually manage its contents as react and contentEditable don't play nice together editable_el =
+

Directory

+
+ { alias_events.length ? "This room is accessible via:" : "This room has no aliases." } +
+
+ { alias_events.map(function(alias_event, i) { + return alias_event.getContent().aliases.map(function(alias, j) { + var deleteButton; + if (alias_event && alias_event.getStateKey() === domain) { + deleteButton = Delete; + } + return ( +
+ +
+ { deleteButton } +
+
+ ); + }); + })} + +
+ +
+ Add +
+
+
+
The canonical entry is  + +
+
; + var room_colors_section =

Room Colour

@@ -236,19 +316,19 @@ module.exports = React.createClass({
; } - var banned = this.props.room.getMembersWithMembership("ban"); - - var events_levels_section; - if (events_levels.length) { - events_levels_section = + var user_levels_section; + if (user_levels.length) { + user_levels_section =
-

Event levels

-
- {Object.keys(events_levels).map(function(event_type, i) { +
+ Users with specific roles are: +
+
+ {Object.keys(user_levels).map(function(user, i) { return ( -
- - +
+ { user } is a +
); })} @@ -256,6 +336,7 @@ module.exports = React.createClass({
; } + var banned = this.props.room.getMembersWithMembership("ban"); var banned_users_section; if (banned.length) { banned_users_section = @@ -273,69 +354,74 @@ module.exports = React.createClass({
; } + // TODO: support editing custom events_levels + // TODO: support editing custom user_levels + return (


+
{ room_colors_section } -

Power levels

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
+ { aliases_section } -

User levels

-
- {Object.keys(user_levels).map(function(user, i) { +

Permissions

+
+
+ The default level for new room members is + +
+
+ To send messages, you must be a + +
+
+ To invite users into the room, you must be a + +
+
+ To configure the room (set room state), you must be a + +
+
+ To kick users, you must be a + +
+
+ To ban users, you must be a + +
+
+ To redact messages, you must be a + +
+ + {Object.keys(events_levels).map(function(event_type, i) { return ( -
- - +
+ To send events of type { event_type }, you must be a +
); })}
- { events_levels_section } +

Users

+
+
+ You are a +
+ + { user_levels_section } +
+ { banned_users_section } + { change_avatar } +
); }