Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b88383a
feat(mail): add avatars in inbox list and view mode toggle
64johnlee May 3, 2026
a9ede6f
feat(mail): add mark all as read button to inbox
64johnlee May 3, 2026
4282247
feat(mail): add compose button + view toggle to inbox header
64johnlee May 3, 2026
e36e52f
feat(main): persist navbar collapsed state in localStorage
64johnlee May 3, 2026
91a31e5
chore: bump PR
64johnlee May 4, 2026
7eefa24
chore: bump PR
64johnlee May 4, 2026
c02130b
chore: bump PR
64johnlee May 4, 2026
4fe5236
chore: bump PR
64johnlee May 4, 2026
ecdd61c
chore: bump PR
64johnlee May 5, 2026
f03b768
chore: bump PR
64johnlee May 5, 2026
b7dae3d
chore: bump PR
64johnlee May 6, 2026
b899b16
chore: bump PR
64johnlee May 6, 2026
62efde5
chore: bump PR
64johnlee May 7, 2026
a7037b7
chore: bump PR
64johnlee May 7, 2026
d08730c
chore: bump PR
64johnlee May 8, 2026
7349020
chore: bump PR
64johnlee May 8, 2026
d4abacf
chore: bump PR
64johnlee May 9, 2026
b94a70d
chore: bump PR
64johnlee May 9, 2026
d287591
chore: bump PR
64johnlee May 10, 2026
9bde0ff
chore: bump PR
64johnlee May 10, 2026
a8611d0
chore: bump PR
64johnlee May 11, 2026
5f89ffe
chore: bump PR
64johnlee May 11, 2026
b28940b
chore: bump PR
64johnlee May 12, 2026
f8c87ca
chore: bump PR
64johnlee May 12, 2026
c69cec1
chore: bump PR
64johnlee May 13, 2026
fc56c76
chore: bump PR
64johnlee May 13, 2026
c61336b
chore: bump PR
64johnlee May 14, 2026
947045f
chore: bump PR
64johnlee May 14, 2026
575c062
chore: bump PR
64johnlee May 15, 2026
df78738
chore: bump PR
64johnlee May 15, 2026
dd1a119
chore: bump PR
64johnlee May 16, 2026
6d7ceb3
chore: bump PR
64johnlee May 16, 2026
9f832c8
chore: bump PR
64johnlee May 17, 2026
a0873bf
chore: bump PR
64johnlee May 17, 2026
aa1b771
chore: bump PR
64johnlee May 18, 2026
ab7049e
chore: bump PR
64johnlee May 18, 2026
ff0ad27
chore: bump PR
64johnlee May 19, 2026
80d26aa
chore: bump PR
64johnlee May 19, 2026
7d75c6a
chore: bump PR
64johnlee May 20, 2026
26fc548
chore: bump PR
64johnlee May 20, 2026
8b619aa
chore: bump PR
64johnlee May 21, 2026
2d67d5b
chore: bump PR
64johnlee May 21, 2026
b548d8e
chore: bump PR
64johnlee May 22, 2026
00c8699
chore: bump PR
64johnlee May 22, 2026
b9c6e73
chore: bump PR
64johnlee May 23, 2026
11ef014
chore: bump PR
64johnlee May 23, 2026
8f8d582
chore: bump PR
64johnlee May 24, 2026
824b9fa
chore: bump PR
64johnlee May 24, 2026
b89d9ec
chore: bump PR
64johnlee May 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# bump 1777865706
# bump 1777865794
# bump 1777867276
# bump 1777910594
# bump 1777953678
# bump 1777996876
# bump 1778040079
# bump 1778083286
# bump 1778126480
# bump 1778169677
# bump 1778212872
# bump 1778256066
# bump 1778299262
# bump 1778342463
# bump 1778385663
# bump 1778428863
# bump 1778472063
# bump 1778515270
# bump 1778558449
# bump 1778601655
# bump 1778644848
# bump 1778688053
# bump 1778731252
# bump 1778774452
# bump 1778817652
# bump 1778860853
# bump 1778904049
# bump 1778947251
# bump 1778990452
# bump 1779033647
# bump 1779076849
# bump 1779120055
# bump 1779163251
# bump 1779206453
# bump 1779249653
# bump 1779292854
# bump 1779336048
# bump 1779379256
# bump 1779422452
# bump 1779465652
# bump 1779508847
# bump 1779552049
# bump 1779595249
# bump 1779638449
# bump 1779681649
49 changes: 47 additions & 2 deletions webui-src/app/mail/mail_inbox.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,56 @@
const m = require('mithril');
const rs = require('rswebui');
const util = require('mail/mail_util');

const Layout = () => {
let viewMode = localStorage.getItem('mailViewMode') || 'side';
return {
view: (v) => [
m('.widget__heading', m('h3', 'Inbox')),
m('.widget__body', [
m('.widget__heading', [
m('h3', 'Inbox'),
m('.mail-actions', [
m('button', {
title: 'Compose new mail',
onclick: () => m.route.set('/mail/compose'),
}, m('i.fas.fa-edit')),
m('button', {
title: 'Mark all as read',
onclick: () => {
v.attrs.list.forEach((msg) => {
const flag = msg.msgflags & 0xf0;
if (flag === 0x10 || flag === 0x20) { // RS_MSG_NEW or RS_MSG_UNREAD_BY_USER
rs.rsJsonApiRequest('/rsMail/MessageToTrash', { msgId: msg.msgId, bTrash: false });
}
});
m.redraw();
},
}, m('i.fas.fa-envelope-open')),
]),
m('.mail-view-toggle', [
m('span', 'View:'),
m('button', {
class: viewMode === 'side' ? 'active' : '',
onclick: () => {
viewMode = 'side';
localStorage.setItem('mailViewMode', 'side');
m.redraw();
},
title: 'Side by side',
}, m('i.fas.fa-columns')),
m('button', {
class: viewMode === 'below' ? 'active' : '',
onclick: () => {
viewMode = 'below';
localStorage.setItem('mailViewMode', 'below');
m.redraw();
},
title: 'Below',
}, m('i.fas.fa-list')),
]),
]),
m('.widget__body', {
class: 'mail-layout-' + viewMode,
}, [
m(
util.Table,
m(
Expand Down
13 changes: 9 additions & 4 deletions webui-src/app/mail/mail_util.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,15 @@ const MessageSummary = () => {
),
files && m('td', files.length),
m('td', details.title),
m(
'td',
fromUserInfo && Number(fromUserInfo.mId) !== 0 ? fromUserInfo.mNickname : '[Unknown]'
),
m('td', {
style: 'display:flex;align-items:center;gap:.5rem',
}, [
m(peopleUtil.UserAvatar, {
avatar: fromUserInfo?.mAvatar,
firstLetter: fromUserInfo?.mNickname ? fromUserInfo.mNickname[0].toUpperCase() : '',
}),
m('span', fromUserInfo && Number(fromUserInfo.mId) !== 0 ? fromUserInfo.mNickname : '[Unknown]'),
]),
m('td', new Date(details.ts * 1000).toLocaleString()),
]
),
Expand Down
7 changes: 5 additions & 2 deletions webui-src/app/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const navIcon = {
};

const navbar = () => {
let isCollapsed = true;
let isCollapsed = localStorage.getItem('navCollapsed') === 'true';
return {
view: (vnode) =>
m(
Expand Down Expand Up @@ -99,7 +99,10 @@ const navbar = () => {
m(
'button.toggle-nav',
{
onclick: () => (isCollapsed = !isCollapsed),
onclick: () => {
isCollapsed = !isCollapsed;
localStorage.setItem('navCollapsed', isCollapsed);
},
},
m('i.fas.fa-angle-double-left')
),
Expand Down
4 changes: 4 additions & 0 deletions webui-src/styles.css

Large diffs are not rendered by default.