mirror of
https://github.com/flarum/framework.git
synced 2025-02-21 08:39:25 +08:00
fix: messages UI/UX improvement (#4173)
This commit is contained in:
parent
962d95746d
commit
875fd241b7
@ -59,6 +59,13 @@ export default class DialogSection<CustomAttrs extends IDialogStreamAttrs = IDia
|
|||||||
actionItems() {
|
actionItems() {
|
||||||
const items = new ItemList<Mithril.Children>();
|
const items = new ItemList<Mithril.Children>();
|
||||||
|
|
||||||
|
items.add(
|
||||||
|
'back',
|
||||||
|
<Button className="Button Button--icon DialogSection-back" icon="fas fa-arrow-left" onclick={this.attrs.onback}>
|
||||||
|
{app.translator.trans('flarum-messages.forum.dialog_section.back_label')}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
items.add(
|
items.add(
|
||||||
'details',
|
'details',
|
||||||
<Dropdown
|
<Dropdown
|
||||||
|
@ -97,7 +97,7 @@ export default abstract class Message<CustomAttrs extends IMessageAttrs = IMessa
|
|||||||
}
|
}
|
||||||
|
|
||||||
avatar(): Mithril.Children {
|
avatar(): Mithril.Children {
|
||||||
return this.attrs.message.user() ? <Avatar user={this.attrs.message.user()} /> : '';
|
return this.attrs.message.user() ? <Avatar user={this.attrs.message.user()} className="Post-avatar" /> : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
headerItems() {
|
headerItems() {
|
||||||
|
@ -14,11 +14,13 @@ import listItems from 'flarum/common/helpers/listItems';
|
|||||||
import ItemList from 'flarum/common/utils/ItemList';
|
import ItemList from 'flarum/common/utils/ItemList';
|
||||||
import Dropdown from 'flarum/common/components/Dropdown';
|
import Dropdown from 'flarum/common/components/Dropdown';
|
||||||
import Button from 'flarum/common/components/Button';
|
import Button from 'flarum/common/components/Button';
|
||||||
|
import classList from 'flarum/common/utils/classList';
|
||||||
|
|
||||||
export interface IMessagesPageAttrs extends IPageAttrs {}
|
export interface IMessagesPageAttrs extends IPageAttrs {}
|
||||||
|
|
||||||
export default class MessagesPage<CustomAttrs extends IMessagesPageAttrs = IMessagesPageAttrs> extends Page<CustomAttrs> {
|
export default class MessagesPage<CustomAttrs extends IMessagesPageAttrs = IMessagesPageAttrs> extends Page<CustomAttrs> {
|
||||||
protected selectedDialog = Stream<Dialog | null>(null);
|
protected selectedDialog = Stream<Dialog | null>(null);
|
||||||
|
protected currentDialogId: string | null = null;
|
||||||
|
|
||||||
oninit(vnode: Mithril.Vnode<CustomAttrs, this>) {
|
oninit(vnode: Mithril.Vnode<CustomAttrs, this>) {
|
||||||
super.oninit(vnode);
|
super.oninit(vnode);
|
||||||
@ -49,6 +51,7 @@ export default class MessagesPage<CustomAttrs extends IMessagesPageAttrs = IMess
|
|||||||
|
|
||||||
protected async initDialog() {
|
protected async initDialog() {
|
||||||
const dialogId = m.route.param('id');
|
const dialogId = m.route.param('id');
|
||||||
|
this.currentDialogId = dialogId;
|
||||||
|
|
||||||
const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);
|
const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);
|
||||||
|
|
||||||
@ -94,7 +97,11 @@ export default class MessagesPage<CustomAttrs extends IMessagesPageAttrs = IMess
|
|||||||
) : !app.dialogs.hasItems() ? (
|
) : !app.dialogs.hasItems() ? (
|
||||||
<InfoTile icon="far fa-envelope-open">{app.translator.trans('flarum-messages.forum.messages_page.empty_text')}</InfoTile>
|
<InfoTile icon="far fa-envelope-open">{app.translator.trans('flarum-messages.forum.messages_page.empty_text')}</InfoTile>
|
||||||
) : (
|
) : (
|
||||||
<div className="MessagesPage-content">
|
<div
|
||||||
|
className={classList('MessagesPage-content', {
|
||||||
|
'MessagesPage-content--onDialog': this.currentDialogId,
|
||||||
|
})}
|
||||||
|
>
|
||||||
<div className="MessagesPage-sidebar" key="sidebar">
|
<div className="MessagesPage-sidebar" key="sidebar">
|
||||||
<div className="IndexPage-toolbar" key="toolbar">
|
<div className="IndexPage-toolbar" key="toolbar">
|
||||||
<ul className="IndexPage-toolbar-view">{listItems(this.viewItems().toArray())}</ul>
|
<ul className="IndexPage-toolbar-view">{listItems(this.viewItems().toArray())}</ul>
|
||||||
@ -103,7 +110,13 @@ export default class MessagesPage<CustomAttrs extends IMessagesPageAttrs = IMess
|
|||||||
<DialogList key="list" state={app.dialogs} activeDialog={this.selectedDialog()} />
|
<DialogList key="list" state={app.dialogs} activeDialog={this.selectedDialog()} />
|
||||||
</div>
|
</div>
|
||||||
{this.selectedDialog() ? (
|
{this.selectedDialog() ? (
|
||||||
<DialogSection key="dialog" dialog={this.selectedDialog()} />
|
<DialogSection
|
||||||
|
key="dialog"
|
||||||
|
dialog={this.selectedDialog()}
|
||||||
|
onback={() => {
|
||||||
|
this.currentDialogId = null;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
) : (
|
) : (
|
||||||
<LoadingIndicator key="loading" display="block" />
|
<LoadingIndicator key="loading" display="block" />
|
||||||
)}
|
)}
|
||||||
|
@ -1,17 +1,68 @@
|
|||||||
.MessagesPage-sidebar {
|
.MessagesPage {
|
||||||
flex-shrink: 0;
|
padding-bottom: 0;
|
||||||
width: 280px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.MessagesPage-content {
|
.MessagesPage-content {
|
||||||
|
--messages-page-gap: 32px;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 32px;
|
gap: var(--messages-page-gap);
|
||||||
|
|
||||||
.Avatar {
|
.Avatar {
|
||||||
--size: 40px;
|
--size: 40px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.MessagesPage-sidebar {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.MessagesPage-content--onDialog & {
|
||||||
|
// margin-inline-start: calc(~"0px - 100% - var(--messages-page-gap)");
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media @tablet-up {
|
||||||
|
width: 280px;
|
||||||
|
|
||||||
|
.MessagesPage-content--onDialog & {
|
||||||
|
// margin-inline-start: 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.DialogSection {
|
||||||
|
flex-grow: 1;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
@media @tablet-up {
|
||||||
|
padding-inline-start: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
border-bottom: 1px solid var(--control-bg);
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
&-actions {
|
||||||
|
margin-inline-start: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.MessageComposer-recipients {
|
.MessageComposer-recipients {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -145,34 +196,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.DialogSection {
|
|
||||||
flex-grow: 1;
|
|
||||||
padding-inline-start: 32px;
|
|
||||||
|
|
||||||
&-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 16px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
border-bottom: 1px solid var(--control-bg);
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--text-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
&-actions {
|
|
||||||
margin-inline-start: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-info {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.Message {
|
.Message {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
|
|
||||||
@ -191,8 +214,30 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.MessageStream, .DialogList {
|
.MessageStream, .DialogList {
|
||||||
max-height: calc(100vh - var(--header-height) - 140px - 235px);
|
--additional-gap: 52px;
|
||||||
|
max-height: calc(100vh - var(--header-height) - 140px - var(--additional-gap));
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
|
@media @tablet-up {
|
||||||
|
--additional-gap: 235px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.MessageStream .ReplyPlaceholder {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DialogSection-header-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DialogSection-back {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
@media @tablet-up {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.DialogList-loadMore {
|
.DialogList-loadMore {
|
||||||
|
@ -21,6 +21,7 @@ flarum-messages:
|
|||||||
view_all: View all messages
|
view_all: View all messages
|
||||||
|
|
||||||
dialog_section:
|
dialog_section:
|
||||||
|
back_label: Go back
|
||||||
controls:
|
controls:
|
||||||
details_button: Details
|
details_button: Details
|
||||||
controls_toggle_label: Dialog control actions
|
controls_toggle_label: Dialog control actions
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
@import "common/common";
|
@import "common/common";
|
||||||
|
|
||||||
|
@import "admin/AdminPage";
|
||||||
@import "admin/AdminHeader";
|
@import "admin/AdminHeader";
|
||||||
@import "admin/AdminNav";
|
@import "admin/AdminNav";
|
||||||
@import "admin/AdvancedPage";
|
@import "admin/AdvancedPage";
|
||||||
|
3
framework/core/less/admin/AdminPage.less
Normal file
3
framework/core/less/admin/AdminPage.less
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.AdminPage {
|
||||||
|
padding-bottom: var(--page-bottom-padding);
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
.App {
|
.App {
|
||||||
position: relative !important;
|
position: relative !important;
|
||||||
padding-top: var(--header-height);
|
padding-top: var(--header-height);
|
||||||
padding-bottom: 50px;
|
padding-bottom: var(--app-bottom-padding);
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
|
|
||||||
@media @phone {
|
@media @phone {
|
||||||
@ -325,7 +325,6 @@
|
|||||||
.App-content {
|
.App-content {
|
||||||
background: var(--body-bg);
|
background: var(--body-bg);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
min-height: calc(~"100vh - var(--header-height-phone)");
|
||||||
padding-bottom: 50px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,8 @@
|
|||||||
--zindex-alerts: @zindex-alerts;
|
--zindex-alerts: @zindex-alerts;
|
||||||
--zindex-tooltip: @zindex-tooltip;
|
--zindex-tooltip: @zindex-tooltip;
|
||||||
|
|
||||||
|
--page-bottom-padding: 100px;
|
||||||
|
|
||||||
// Store the current responsive screen mode in a CSS variable, to make it
|
// Store the current responsive screen mode in a CSS variable, to make it
|
||||||
// available to the JS code.
|
// available to the JS code.
|
||||||
--flarum-screen: none;
|
--flarum-screen: none;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
--content-width: 100%;
|
--content-width: 100%;
|
||||||
--sidebar-width: 190px;
|
--sidebar-width: 190px;
|
||||||
--gap: 50px;
|
--gap: 50px;
|
||||||
|
padding-bottom: var(--page-bottom-padding);
|
||||||
|
|
||||||
&-container {
|
&-container {
|
||||||
gap: var(--gap);
|
gap: var(--gap);
|
||||||
|
@ -429,7 +429,7 @@
|
|||||||
cursor: text;
|
cursor: text;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin-top: 50px;
|
margin-top: 50px;
|
||||||
margin-left: calc(0px - var(--post-padding));
|
margin-left: 0;
|
||||||
padding-left: var(--post-padding);
|
padding-left: var(--post-padding);
|
||||||
border: 2px dashed var(--control-bg);
|
border: 2px dashed var(--control-bg);
|
||||||
color: var(--muted-color);
|
color: var(--muted-color);
|
||||||
@ -439,7 +439,7 @@
|
|||||||
appearance: none;
|
appearance: none;
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
width: calc(100% + var(--post-padding));
|
width: 100%;
|
||||||
|
|
||||||
.Post-container {
|
.Post-container {
|
||||||
display: grid;
|
display: grid;
|
||||||
@ -469,6 +469,8 @@
|
|||||||
.ReplyPlaceholder {
|
.ReplyPlaceholder {
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
transition: border-color 0.2s;
|
transition: border-color 0.2s;
|
||||||
|
margin-left: calc(0px - var(--post-padding));
|
||||||
|
width: calc(100% + var(--post-padding));
|
||||||
|
|
||||||
.Post-header {
|
.Post-header {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -50,12 +50,12 @@
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--muted-color);
|
color: var(--muted-color);
|
||||||
padding: 20px 20px 20px calc(~"var(--avatar-column-width) + 20px");
|
padding: 20px 20px 20px var(--avatar-column-width);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
||||||
@media @phone {
|
@media @phone {
|
||||||
margin: 0 -15px;
|
margin: 0;
|
||||||
padding: 20px 15px;
|
padding: 20px 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user