Add some logic to messages
This commit is contained in:
parent
ce440ae08c
commit
e7ade80fe3
@ -108,10 +108,17 @@ nav#sidebar .linkItem > a > .linkText {
|
|||||||
min-width: 800px;
|
min-width: 800px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.styledTooltip.messages > .messagesList {}
|
.styledTooltip.messages > .messagesList {
|
||||||
|
}
|
||||||
|
|
||||||
.styledTooltip.messages > .messagesList > .message {
|
.styledTooltip.messages > .messagesList > .message {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
|
max-height: 90px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.styledTooltip.messages > .messagesList > .message:hover {
|
||||||
|
max-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.styledTooltip.messages > .messagesList > .message > .summary {
|
.styledTooltip.messages > .messagesList > .message > .summary {
|
||||||
@ -130,8 +137,13 @@ nav#sidebar .linkItem > a > .linkText {
|
|||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.styledTooltip.messages > .messagesList > .message > .hyperlink > a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
.styledTooltip.messages > .messagesList > .message > .hyperlink > a > .styledIcon {
|
.styledTooltip.messages > .messagesList > .message > .hyperlink > a > .styledIcon {
|
||||||
padding-right: 15px;
|
padding-right: 5px;
|
||||||
|
font-size: 14.5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.styledTooltip.messages > .messagesList > .message > .actions {
|
.styledTooltip.messages > .messagesList > .message > .actions {
|
||||||
|
@ -91,6 +91,11 @@ pub enum Msg {
|
|||||||
ModalDropped,
|
ModalDropped,
|
||||||
ModalChanged(FieldChange),
|
ModalChanged(FieldChange),
|
||||||
|
|
||||||
|
// popups
|
||||||
|
MessageSeen(MessageId),
|
||||||
|
MessageInvitationApproved(InvitationToken),
|
||||||
|
MessageInvitationDismiss(InvitationToken),
|
||||||
|
|
||||||
// WebSocket
|
// WebSocket
|
||||||
WebSocketChange(WebSocketChanged),
|
WebSocketChange(WebSocketChanged),
|
||||||
}
|
}
|
||||||
@ -178,6 +183,7 @@ fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders<Msg>) {
|
|||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
crate::shared::aside::update(&msg, model, orders);
|
crate::shared::aside::update(&msg, model, orders);
|
||||||
|
crate::shared::navbar_left::update(&msg, model, orders);
|
||||||
crate::modal::update(&msg, model, orders);
|
crate::modal::update(&msg, model, orders);
|
||||||
match model.page {
|
match model.page {
|
||||||
Page::Project | Page::AddIssue | Page::EditIssue(..) => project::update(msg, model, orders),
|
Page::Project | Page::AddIssue | Page::EditIssue(..) => project::update(msg, model, orders),
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
use seed::{prelude::*, *};
|
use seed::{prelude::*, *};
|
||||||
|
|
||||||
use jirs_data::{Message, MessageType};
|
use jirs_data::{InvitationToken, Message, MessageType, WsMsg};
|
||||||
|
|
||||||
use crate::model::Model;
|
use crate::model::Model;
|
||||||
use crate::shared::styled_avatar::StyledAvatar;
|
use crate::shared::styled_avatar::StyledAvatar;
|
||||||
use crate::shared::styled_button::StyledButton;
|
use crate::shared::styled_button::StyledButton;
|
||||||
use crate::shared::styled_icon::{Icon, StyledIcon};
|
use crate::shared::styled_icon::{Icon, StyledIcon};
|
||||||
use crate::shared::{divider, styled_tooltip, ToNode};
|
use crate::shared::{divider, styled_tooltip, ToNode};
|
||||||
|
use crate::ws::send_ws_msg;
|
||||||
use crate::Msg;
|
use crate::Msg;
|
||||||
|
|
||||||
trait IntoNavItemIcon {
|
trait IntoNavItemIcon {
|
||||||
@ -25,6 +26,26 @@ impl IntoNavItemIcon for Icon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
|
||||||
|
match msg {
|
||||||
|
Msg::MessageInvitationApproved(token) => {
|
||||||
|
send_ws_msg(
|
||||||
|
WsMsg::InvitationAcceptRequest(token.clone()),
|
||||||
|
model.ws.as_ref(),
|
||||||
|
orders,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Msg::MessageInvitationDismiss(token) => {
|
||||||
|
send_ws_msg(
|
||||||
|
WsMsg::InvitationRejectRequest(token.clone()),
|
||||||
|
model.ws.as_ref(),
|
||||||
|
orders,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn render(model: &Model) -> Vec<Node<Msg>> {
|
pub fn render(model: &Model) -> Vec<Node<Msg>> {
|
||||||
let logo_svg = Node::from_html(include_str!("../../static/logo.svg"));
|
let logo_svg = Node::from_html(include_str!("../../static/logo.svg"));
|
||||||
|
|
||||||
@ -111,12 +132,15 @@ fn messages_tooltip_popup(model: &Model) -> Node<Msg> {
|
|||||||
});
|
});
|
||||||
let mut messages: Vec<Node<Msg>> = vec![];
|
let mut messages: Vec<Node<Msg>> = vec![];
|
||||||
for (idx, message) in model.messages.iter().enumerate() {
|
for (idx, message) in model.messages.iter().enumerate() {
|
||||||
let message_ui = message_ui(model, message);
|
match message_ui(model, message) {
|
||||||
|
Some(message_ui) => {
|
||||||
messages.push(message_ui);
|
messages.push(message_ui);
|
||||||
if idx != model.messages.len() - 1 {
|
if idx != model.messages.len() - 1 {
|
||||||
messages.push(divider());
|
messages.push(divider());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
None => (),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
let body = div![on_click, class!["messagesList"], messages];
|
let body = div![on_click, class!["messagesList"], messages];
|
||||||
styled_tooltip::StyledTooltip::build()
|
styled_tooltip::StyledTooltip::build()
|
||||||
@ -128,7 +152,7 @@ fn messages_tooltip_popup(model: &Model) -> Node<Msg> {
|
|||||||
.into_node()
|
.into_node()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn message_ui(model: &Model, message: &Message) -> Node<Msg> {
|
fn message_ui(model: &Model, message: &Message) -> Option<Node<Msg>> {
|
||||||
let Message {
|
let Message {
|
||||||
id: _,
|
id: _,
|
||||||
receiver_id: _,
|
receiver_id: _,
|
||||||
@ -141,31 +165,50 @@ fn message_ui(model: &Model, message: &Message) -> Node<Msg> {
|
|||||||
updated_at: _,
|
updated_at: _,
|
||||||
} = message;
|
} = message;
|
||||||
|
|
||||||
let hyperlink = if hyper_link.is_empty() {
|
let hyperlink = if hyper_link.is_empty() && !hyper_link.starts_with("#") {
|
||||||
empty![]
|
empty![]
|
||||||
} else {
|
} else {
|
||||||
let link_icon = StyledIcon::build(Icon::Link).build().into_node();
|
let link_icon = StyledIcon::build(Icon::Link).build().into_node();
|
||||||
div![
|
div![
|
||||||
class!["hyperlink"],
|
class!["hyperlink"],
|
||||||
a![attrs![At::Href => hyper_link], link_icon, hyper_link]
|
a![
|
||||||
|
class!["styledLink"],
|
||||||
|
attrs![At::Href => hyper_link],
|
||||||
|
link_icon,
|
||||||
|
hyper_link
|
||||||
|
]
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
let message_description = parse_description(model, description.as_str());
|
let message_description = parse_description(model, description.as_str());
|
||||||
|
|
||||||
match message_type {
|
let node = match message_type {
|
||||||
MessageType::ReceivedInvitation => {
|
MessageType::ReceivedInvitation => {
|
||||||
|
let token: InvitationToken = match hyper_link.trim_start_matches("#").parse() {
|
||||||
|
Err(_) => return None,
|
||||||
|
Ok(n) => n,
|
||||||
|
};
|
||||||
let accept = StyledButton::build()
|
let accept = StyledButton::build()
|
||||||
.primary()
|
.primary()
|
||||||
.text("Accept")
|
.text("Accept")
|
||||||
.active(true)
|
.active(true)
|
||||||
.icon(Icon::Check)
|
.icon(Icon::Check)
|
||||||
|
.on_click(mouse_ev(Ev::Click, move |ev| {
|
||||||
|
ev.stop_propagation();
|
||||||
|
ev.prevent_default();
|
||||||
|
Some(Msg::MessageInvitationApproved(token.clone()))
|
||||||
|
}))
|
||||||
.build()
|
.build()
|
||||||
.into_node();
|
.into_node();
|
||||||
let reject = StyledButton::build()
|
let reject = StyledButton::build()
|
||||||
.danger()
|
.danger()
|
||||||
.text("Dismiss")
|
.text("Dismiss")
|
||||||
.icon(Icon::Close)
|
.icon(Icon::Close)
|
||||||
|
.on_click(mouse_ev(Ev::Click, move |ev| {
|
||||||
|
ev.stop_propagation();
|
||||||
|
ev.prevent_default();
|
||||||
|
Some(Msg::MessageInvitationDismiss(token))
|
||||||
|
}))
|
||||||
.active(true)
|
.active(true)
|
||||||
.build()
|
.build()
|
||||||
.into_node();
|
.into_node();
|
||||||
@ -189,7 +232,8 @@ fn message_ui(model: &Model, message: &Message) -> Node<Msg> {
|
|||||||
div![class!["description"], message_description],
|
div![class!["description"], message_description],
|
||||||
hyperlink,
|
hyperlink,
|
||||||
],
|
],
|
||||||
}
|
};
|
||||||
|
Some(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn about_tooltip_popup(model: &Model) -> Node<Msg> {
|
fn about_tooltip_popup(model: &Model) -> Node<Msg> {
|
||||||
|
@ -751,6 +751,11 @@ pub enum WsMsg {
|
|||||||
InvitationAcceptRequest(InvitationToken),
|
InvitationAcceptRequest(InvitationToken),
|
||||||
InvitationAcceptSuccess(BindToken),
|
InvitationAcceptSuccess(BindToken),
|
||||||
InvitationAcceptFailure(InvitationToken),
|
InvitationAcceptFailure(InvitationToken),
|
||||||
|
//
|
||||||
|
InvitationRejectRequest(InvitationToken),
|
||||||
|
InvitationRejectSuccess,
|
||||||
|
InvitationRejectFailure(InvitationToken),
|
||||||
|
//
|
||||||
InvitedUserRemoveRequest(UserId),
|
InvitedUserRemoveRequest(UserId),
|
||||||
InvitedUserRemoveSuccess(UserId),
|
InvitedUserRemoveSuccess(UserId),
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user