From 3459fa88cf122548fa0b50be0d438cfbac620d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20J=C3=A4gle?= Date: Thu, 5 Oct 2017 23:21:05 +0200 Subject: [PATCH] Tabbed user interface for custom room types creation Addresses RocketChat/Rocket.Chat#8264 --- .../rocketchat-lib/lib/roomTypesCommon.js | 2 + .../imports/components/modal/full-modal.css | 4 +- .../client/imports/components/tab.css | 77 +++++++++++++++++++ .../client/imports/general/variables.css | 5 ++ packages/rocketchat-theme/client/main.css | 4 + .../client/components/tabContainer.html | 19 +++++ .../client/components/tabContainer.js | 18 +++++ .../client/views/app/createChannel.html | 12 --- .../client/views/app/createChannel.js | 20 ----- .../client/views/app/createRooms.html | 10 +++ .../client/views/app/createRooms.js | 48 ++++++++++++ .../client/views/app/fullModal.js | 4 +- packages/rocketchat-ui/package.js | 5 +- 13 files changed, 191 insertions(+), 37 deletions(-) create mode 100644 packages/rocketchat-theme/client/imports/components/tab.css create mode 100644 packages/rocketchat-ui/client/components/tabContainer.html create mode 100644 packages/rocketchat-ui/client/components/tabContainer.js create mode 100644 packages/rocketchat-ui/client/views/app/createRooms.html create mode 100644 packages/rocketchat-ui/client/views/app/createRooms.js diff --git a/packages/rocketchat-lib/lib/roomTypesCommon.js b/packages/rocketchat-lib/lib/roomTypesCommon.js index b64434676653..92e370543444 100644 --- a/packages/rocketchat-lib/lib/roomTypesCommon.js +++ b/packages/rocketchat-lib/lib/roomTypesCommon.js @@ -16,6 +16,8 @@ this.roomTypesCommon = class { name: route name action: route action function identifier: room type identifier + creationTemplate: The blaze template which shall be used in the create-dialog + creationLabel: The hreadline of the creation dialog Optional methods which can be redefined getDisplayName(room): return room's name for the UI diff --git a/packages/rocketchat-theme/client/imports/components/modal/full-modal.css b/packages/rocketchat-theme/client/imports/components/modal/full-modal.css index 1eb2a86ac724..8489d1ca96dd 100644 --- a/packages/rocketchat-theme/client/imports/components/modal/full-modal.css +++ b/packages/rocketchat-theme/client/imports/components/modal/full-modal.css @@ -28,14 +28,14 @@ } &__back-text { + z-index: 100; margin-right: 2px; - line-height: 22px; } &__back-icon { + z-index: 100; transform: rotate(45deg); - font-size: 1rem; } } diff --git a/packages/rocketchat-theme/client/imports/components/tab.css b/packages/rocketchat-theme/client/imports/components/tab.css new file mode 100644 index 000000000000..5283da2893fa --- /dev/null +++ b/packages/rocketchat-theme/client/imports/components/tab.css @@ -0,0 +1,77 @@ +.rc-tabs { + position: relative; + + display: flex; + + margin: 0 calc(var(--tabs-padding) / -2); + padding: calc(var(--tabs-padding) / 2); + + list-style: none; + + color: var(--color-gray); + + font-size: 14px; + + &::before { + position: absolute; + bottom: 0; + + width: 100%; + height: 2px; + + content: ''; + + background: var(--color-gray-light); + } + + &__tab { + position: relative; + + margin: calc(var(--tabs-padding) / 2); + padding: 0 5px; + + cursor: pointer; + transition: all 0.3s; + + &-link { + color: inherit !important; + } + + &:hover { + opacity: 0.5; + } + + &.active, + &:active { + color: #1d74f5; + + &::before { + position: absolute; + bottom: calc(var(--tabs-padding) * -1); + left: 0; + + width: 100%; + height: 2px; + + content: ''; + + background: #1d74f5; + } + } + } + + &__content { + padding-top: 10px; + & header h1 { /* in tab-containers, the first heading of the header is the tab strip itself */ + display: none; + } + + &.inactive { + display: none; + } + + &.active { + display: block; + } + } +} diff --git a/packages/rocketchat-theme/client/imports/general/variables.css b/packages/rocketchat-theme/client/imports/general/variables.css index 994fb29d8cbd..777aab2a5222 100644 --- a/packages/rocketchat-theme/client/imports/general/variables.css +++ b/packages/rocketchat-theme/client/imports/general/variables.css @@ -264,4 +264,9 @@ --message-box-editing-color: #fff5df; --message-box-popover-title-text-color: var(--color-gray); --message-box-popover-title-text-size: 0.75rem; + + /* + * Tabs + */ + --tabs-padding: 1rem; } diff --git a/packages/rocketchat-theme/client/main.css b/packages/rocketchat-theme/client/main.css index dc41e7515e1d..e0524c41c152 100644 --- a/packages/rocketchat-theme/client/main.css +++ b/packages/rocketchat-theme/client/main.css @@ -40,3 +40,7 @@ /* RTL */ @import 'imports/general/rtl.css'; + +/* tabs */ +@import 'imports/components/tab.css'; + diff --git a/packages/rocketchat-ui/client/components/tabContainer.html b/packages/rocketchat-ui/client/components/tabContainer.html new file mode 100644 index 000000000000..aa3fa66c16ea --- /dev/null +++ b/packages/rocketchat-ui/client/components/tabContainer.html @@ -0,0 +1,19 @@ + diff --git a/packages/rocketchat-ui/client/components/tabContainer.js b/packages/rocketchat-ui/client/components/tabContainer.js new file mode 100644 index 000000000000..7c542dce1f8a --- /dev/null +++ b/packages/rocketchat-ui/client/components/tabContainer.js @@ -0,0 +1,18 @@ +Template.tabContainer.helpers({ + activeClass(templateName) { + const instance = Template.instance(); + return instance.activeTemplate.get() === templateName ? 'active' : 'inactive'; + }, +}); + +Template.tabContainer.events({ + 'click .rc-tabs__tab-link'(event, instance) { + event.preventDefault(); + const tmp = event.target.href.split('#'); + instance.activeTemplate.set(tmp[tmp.length - 1]); + } +}); + +Template.tabContainer.onCreated(function(){ + this.activeTemplate = new ReactiveVar(this.data.tabs[0].template); +}); diff --git a/packages/rocketchat-ui/client/views/app/createChannel.html b/packages/rocketchat-ui/client/views/app/createChannel.html index 6bd261588ccb..db54ba26d77a 100644 --- a/packages/rocketchat-ui/client/views/app/createChannel.html +++ b/packages/rocketchat-ui/client/views/app/createChannel.html @@ -1,10 +1,4 @@