From 38cfcc2042cbe913504159b4c6b2e8e086e423a8 Mon Sep 17 00:00:00 2001
From: Karl Prieb <karl@prieb.me>
Date: Fri, 9 Dec 2016 19:48:09 -0200
Subject: [PATCH] Room info redesign

---
 .../client/stylesheets/channel-settings.less  |  6 ++
 .../client/views/channelSettings.coffee       | 70 ++++++++++++-------
 .../client/views/channelSettings.html         | 59 ++++++++++------
 packages/rocketchat-i18n/i18n/en.i18n.json    |  4 ++
 .../stylesheets/utils/_colors.import.less     |  8 +++
 .../side-nav/createCombinedFlex.html          | 12 +++-
 6 files changed, 108 insertions(+), 51 deletions(-)

diff --git a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
index fdf1328624e..25e4087e088 100644
--- a/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
+++ b/packages/rocketchat-channel-settings/client/stylesheets/channel-settings.less
@@ -71,11 +71,17 @@
 			}
 		}
 		.setting-block {
+			.loading {
+				top: 30px;
+			}
 			&:hover {
 				.button.edit {
 					visibility: visible;
 				}
 			}
 		}
+		nav {
+			text-align: right;
+		}
 	}
 }
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
index 929aea7f630..51bb8412a7d 100644
--- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee
@@ -11,9 +11,6 @@ Template.channelSettings.helpers
 	valueOf: (obj, key) ->
 		return obj?[key]
 
-	isTextInput: (value) ->
-		return value == 'text' or value == 'markdown'
-
 	showSetting: (setting, room) ->
 		if setting.showInDirect is false
 			return room.t isnt 'd'
@@ -37,8 +34,10 @@ Template.channelSettings.helpers
 	canDeleteRoom: ->
 		roomType = ChatRoom.findOne(@rid, { fields: { t: 1 }})?.t
 		return roomType? and RocketChat.authz.hasAtLeastOnePermission("delete-#{roomType}", @rid)
+
 	readOnly: ->
 		return  ChatRoom.findOne(@rid, { fields: { ro: 1 }})?.ro
+
 	readOnlyDescription: ->
 		readOnly = ChatRoom.findOne(@rid, { fields: { ro: 1 }})?.ro
 		if readOnly is true
@@ -148,11 +147,10 @@ Template.channelSettings.onCreated ->
 					toastr.success TAPi18n.__ 'Room_description_changed_successfully'
 
 		t:
-			type: 'select'
-			label: 'Type'
-			options:
-				c: 'Channel'
-				p: 'Private_Group'
+			type: 'boolean'
+			label: 'Private'
+			isToggle: true
+			processing: new ReactiveVar(false)
 			canView: (room) ->
 				if not room.t in ['c', 'p']
 					return false
@@ -163,40 +161,61 @@ Template.channelSettings.onCreated ->
 				return true
 			canEdit: (room) => RocketChat.authz.hasAllPermission('edit-room', room._id)
 			save: (value, room) ->
-				if value not in ['c', 'p']
-					return toastr.error t('error-invalid-room-type', value)
-
+				@processing.set(true)
+				value = if value then 'p' else 'c'
 				RocketChat.callbacks.run 'roomTypeChanged', room
-				Meteor.call 'saveRoomSettings', room._id, 'roomType', value, (err, result) ->
+				Meteor.call 'saveRoomSettings', room._id, 'roomType', value, (err, result) =>
 					return handleError err if err
+					@processing.set(false)
 					toastr.success TAPi18n.__ 'Room_type_changed_successfully'
 
 		ro:
 			type: 'boolean'
 			label: 'Read_only'
+			isToggle: true
+			processing: new ReactiveVar(false)
 			canView: (room) => room.t isnt 'd'
 			canEdit: (room) => RocketChat.authz.hasAllPermission('set-readonly', room._id)
 			save: (value, room) ->
-				Meteor.call 'saveRoomSettings', room._id, 'readOnly', value, (err, result) ->
+				@processing.set(true)
+				Meteor.call 'saveRoomSettings', room._id, 'readOnly', value, (err, result) =>
 					return handleError err if err
+					@processing.set(false)
 					toastr.success TAPi18n.__ 'Read_only_changed_successfully'
 
 		archived:
 			type: 'boolean'
 			label: 'Room_archivation_state_true'
+			isToggle: true,
 			canView: (room) => room.t isnt 'd'
 			canEdit: (room) => RocketChat.authz.hasAtLeastOnePermission(['archive-room', 'unarchive-room'], room._id)
-			save: (value, room) ->
-				if value is true
-					Meteor.call 'archiveRoom', room._id, (err, results) ->
-						return handleError err if err
-						toastr.success TAPi18n.__ 'Room_archived'
-						RocketChat.callbacks.run 'archiveRoom', room
-				else
-					Meteor.call 'unarchiveRoom', room._id, (err, results) ->
-						return handleError err if err
-						toastr.success TAPi18n.__ 'Room_unarchived'
-						RocketChat.callbacks.run 'unarchiveRoom', room
+			save: (value, room) =>
+				swal {
+					title: t('Are_you_sure')
+					type: 'warning'
+					showCancelButton: true
+					confirmButtonColor: '#DD6B55'
+					confirmButtonText: if value then t('Yes_archive_it') else t('Yes_unarchive_it')
+					cancelButtonText: t('Cancel')
+					closeOnConfirm: false
+					html: false
+				}, (confirmed) =>
+					swal.disableButtons()
+					if (confirmed)
+						action = if value then 'archiveRoom' else 'unarchiveRoom'
+						Meteor.call action, room._id, (err, results) =>
+							if err
+								swal.enableButtons()
+								handleError err
+							swal
+								title: if value then t('Room_archived') else t('Room_has_been_archived')
+								text: if value then t('Room_has_been_archived') else t('Room_has_been_unarchived')
+								type: 'success'
+								timer: 2000
+								showConfirmButton: false
+							RocketChat.callbacks.run action, room
+					else
+						$(".channel-settings form [name='archived']").prop('checked', room.archived)
 
 		joinCode:
 			type: 'text'
@@ -213,12 +232,11 @@ Template.channelSettings.onCreated ->
 	@saveSetting = =>
 		room = ChatRoom.findOne @data?.rid
 		field = @editing.get()
-		console.log('FIELD', field)
 
 		if @settings[field].type is 'select'
 			value = @$(".channel-settings form [name=#{field}]:checked").val()
 		else if @settings[field].type is 'boolean'
-			value = @$(".channel-settings form [name=#{field}]:checked").val() is 'on'
+			value = @$(".channel-settings form [name=#{field}]").is(":checked")
 		else
 			value = @$(".channel-settings form [name=#{field}]").val()
 
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html
index 566fcc8d637..90ad773e411 100644
--- a/packages/rocketchat-channel-settings/client/views/channelSettings.html
+++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html
@@ -15,18 +15,26 @@
 										<label>{{_ $value.label}}</label>
 										<div class="setting-block">
 											{{#if $eq $value.type 'text'}}
-												{{#if editing $key}}
-													<input type="text" name="{{$key}}" value="{{value}}" class="editing" />
+												{{#if $value.canEdit room}}
+													{{#if editing $key}}
+														<input type="text" name="{{$key}}" value="{{value}}" class="editing" />
+													{{else}}
+														<span class='current-setting' data-edit="{{$key}}">{{value}}</span>
+													{{/if}}
 												{{else}}
-													<span class='current-setting' data-edit="{{$key}}">{{value}}</span>
+													<span class='current-setting'>{{value}}</span>
 												{{/if}}
 											{{/if}}
 
 											{{#if $eq $value.type 'markdown'}}
-												{{#if editing $key}}
-													<input type="text" name="{{$key}}" value="{{unscape value}}" class="editing" />
+												{{#if $value.canEdit room}}
+													{{#if editing $key}}
+														<input type="text" name="{{$key}}" value="{{unscape value}}" class="editing" />
+													{{else}}
+														<span class='current-setting' data-edit="{{$key}}">{{{RocketChatMarkdown value}}}</span>
+													{{/if}}
 												{{else}}
-													<span class='current-setting' data-edit="{{$key}}">{{{RocketChatMarkdown value}}}</span>
+													<span class='current-setting'>{{{RocketChatMarkdown value}}}</span>
 												{{/if}}
 											{{/if}}
 
@@ -41,31 +49,38 @@
 
 											{{#if $eq $value.type 'boolean'}}
 												<div class="input checkbox toggle">
-													<input type="checkbox" id="{{$key}}" name="{{$key}}" value="{{value}}" checked="{{$eq value true}}" />
+													{{#if $value.canEdit room}}
+														<input type="checkbox" id="{{$key}}" name="{{$key}}" value="{{value}}" checked="{{$eq value true}}" disabled="{{$value.processing.get}}" />
+													{{else}}
+														<input type="checkbox" id="{{$key}}" name="{{$key}}" value="{{value}}" checked="{{$eq value true}}" disabled />
+													{{/if}}
 													<label for="{{$key}}"></label>
 												</div>
+												{{#if $value.canEdit room}}
+													{{#if $value.processing.get}}
+														{{> loading dark=true}}
+													{{/if}}
+												{{/if}}
 											{{/if}}
 
-											{{#if $value.canEdit room}}
-												{{#if editing $key}}
-													<div class="buttons">
-														{{#if isTextInput $value.type}}
+											{{#unless $value.isToggle}}
+												{{#if $value.canEdit room}}
+													{{#if editing $key}}
+														<div class="buttons">
 															<button type="button" class="button cancel">
 																<i class="icon-cancel"></i>
 															</button>
-														{{/if}}
-														<button type="button" class="button primary save">
-															<i class="icon-ok"></i>
-														</button>
-													</div>
-												{{else}}
-													{{#if isTextInput $value.type}}
+															<button type="button" class="button primary save">
+																<i class="icon-ok"></i>
+															</button>
+														</div>
+													{{else}}
 														<button type="button" class="button edit">
 															<i class="icon-pencil" data-edit="{{$key}}"></i>
 														</button>
 													{{/if}}
 												{{/if}}
-											{{/if}}
+											{{/unless}}
 										</div>
 									</li>
 								{{/let}}
@@ -79,9 +94,9 @@
 				</ul>
 			</form>
 			{{#if canDeleteRoom}}
-			<nav>
-				<button class='button danger delete'><span><i class='icon-trash'></i> {{_ "Delete"}}</span></button>
-			</nav>
+				<nav>
+					<button class="button danger delete" title="{{_ 'Delete'}}"><i class="icon-trash"></i></button>
+				</nav>
 			{{/if}}
 		</div>
 	</div>
diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json
index f7b4e1dde1b..e4fbf30f05b 100644
--- a/packages/rocketchat-i18n/i18n/en.i18n.json
+++ b/packages/rocketchat-i18n/i18n/en.i18n.json
@@ -1096,6 +1096,8 @@
   "room_changed_topic": "Room topic changed to: <em>__room_topic__</em> by <em>__user_by__</em>",
   "Room_description_changed_successfully": "Room description changed successfully",
   "Room_has_been_deleted": "Room has been deleted",
+  "Room_has_been_archived": "Room has been archived",
+  "Room_has_been_unarchived": "Room has been unarchived",
   "Room_Info": "Room Info",
   "room_is_read_only": "This room is read only",
   "room_name": "room name",
@@ -1458,6 +1460,8 @@
   "will_be_able_to": "will be able to",
   "Would_you_like_to_return_the_inquiry": "Would you like to return the inquiry?",
   "Yes": "Yes",
+  "Yes_archive_it": "Yes, archive it!",
+  "Yes_unarchive_it": "Yes, unarchive it!",
   "Yes_clear_all": "Yes, clear all!",
   "Yes_delete_it": "Yes, delete it!",
   "Yes_hide_it": "Yes, hide it!",
diff --git a/packages/rocketchat-theme/assets/stylesheets/utils/_colors.import.less b/packages/rocketchat-theme/assets/stylesheets/utils/_colors.import.less
index f6a4a09aff2..e4cf83b73f8 100755
--- a/packages/rocketchat-theme/assets/stylesheets/utils/_colors.import.less
+++ b/packages/rocketchat-theme/assets/stylesheets/utils/_colors.import.less
@@ -157,6 +157,9 @@ input:-webkit-autofill {
 		input:checked + label:before {
 			background-color: @secondary-background-contrast;
 		}
+		input:disabled + label:before {
+			background-color: lighten(@secondary-background-contrast, 50%) !important;
+		}
 		label {
 			&:before {
 				background-color: lighten(@secondary-background-contrast, 30%);
@@ -642,6 +645,11 @@ a:hover {
 		.icon-ok {
 			color: inherit;
 		}
+		.input.checkbox.toggle {
+			input:checked + label:before {
+				background-color: @primary-background-color;
+			}
+		}
 	}
 }
 
diff --git a/packages/rocketchat-ui-sidenav/side-nav/createCombinedFlex.html b/packages/rocketchat-ui-sidenav/side-nav/createCombinedFlex.html
index acb8bdb1349..3a82adc6f82 100644
--- a/packages/rocketchat-ui-sidenav/side-nav/createCombinedFlex.html
+++ b/packages/rocketchat-ui-sidenav/side-nav/createCombinedFlex.html
@@ -12,12 +12,18 @@
 				<input type="text" id="channel-name" class="required" dir="auto" placeholder="{{_ 'Enter_name_here'}}">
 			</div>
 			<div class="input-line">
-				<label for="channel-type">{{_ "Private_Group"}}</label>
-				<input type="checkbox" id="channel-type" {{privateSwitchDisabled}} {{privateSwitchChecked}}>
+				<label for="channel-type">{{_ "Private"}}</label>
+				<div class="input checkbox toggle">
+					<input type="checkbox" id="channel-type" {{privateSwitchDisabled}} {{privateSwitchChecked}}>
+					<label for="channel-type"></label>
+				</div>
 			</div>
 			<div class="input-line">
 				<label for="channel-ro">{{_ "Read_only_channel"}}</label>
-				<input type="checkbox" id="channel-ro">
+				<div class="input checkbox toggle">
+					<input type="checkbox" id="channel-ro">
+					<label for="channel-ro"></label>
+				</div>
 			</div>
 			<div class="input-line">
 				<label for="channel-members">{{_ "Select_users"}}</label>
-- 
GitLab