mirror of
https://github.com/mjl-/mox.git
synced 2024-12-27 08:53:48 +03:00
webmail: add arrow left/right to collapse/expanse threads
This commit is contained in:
parent
9bc860e207
commit
fc6e61e9a5
2 changed files with 72 additions and 0 deletions
|
@ -1860,6 +1860,8 @@ const cmdHelp = async () => {
|
||||||
['S', 'select thread messages'],
|
['S', 'select thread messages'],
|
||||||
['C', 'toggle thread collapse'],
|
['C', 'toggle thread collapse'],
|
||||||
['X', 'toggle thread mute, automatically marking new messages as read'],
|
['X', 'toggle thread mute, automatically marking new messages as read'],
|
||||||
|
['←', 'collapse thread'],
|
||||||
|
['→', 'expand thread'],
|
||||||
].map(t => dom.tr(dom.td(t[0]), dom.td(t[1]))))), dom.div(style({ width: '40em' }), dom.table(dom.tr(dom.td(attr.colspan('2'), dom.h2('Compose', style({ margin: '0' })))), [
|
].map(t => dom.tr(dom.td(t[0]), dom.td(t[1]))))), dom.div(style({ width: '40em' }), dom.table(dom.tr(dom.td(attr.colspan('2'), dom.h2('Compose', style({ margin: '0' })))), [
|
||||||
['ctrl Enter', 'send message'],
|
['ctrl Enter', 'send message'],
|
||||||
['ctrl w', 'cancel message'],
|
['ctrl w', 'cancel message'],
|
||||||
|
@ -3114,6 +3116,38 @@ const newMsglistView = (msgElem, listMailboxes, setLocationHash, otherMailbox, p
|
||||||
selected = msgitemViews.filter(miv => miv.messageitem.Message.ThreadID === focus.messageitem.Message.ThreadID);
|
selected = msgitemViews.filter(miv => miv.messageitem.Message.ThreadID === focus.messageitem.Message.ThreadID);
|
||||||
updateState(oldstate);
|
updateState(oldstate);
|
||||||
};
|
};
|
||||||
|
const cmdCollapseExpand = async (collapse) => {
|
||||||
|
if (settings.threading === api.ThreadMode.ThreadOff) {
|
||||||
|
alert('Toggling thread collapse/expand is only available when threading is enabled.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const oldstate = state();
|
||||||
|
const rootmivs = seletedRoots();
|
||||||
|
rootmivs.forEach(miv => {
|
||||||
|
if (miv.collapsed !== collapse) {
|
||||||
|
if (collapse) {
|
||||||
|
threadCollapse(miv, false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
threadExpand(miv, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (collapse) {
|
||||||
|
selected = rootmivs;
|
||||||
|
if (focus) {
|
||||||
|
focus = focus.threadRoot();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
viewportEnsureMessages();
|
||||||
|
updateState(oldstate);
|
||||||
|
if (settings.threading === api.ThreadMode.ThreadOn) {
|
||||||
|
const action = collapse ? 'Collapsing' : 'Expanding';
|
||||||
|
await withStatus(action, client.ThreadCollapse(rootmivs.map(miv => miv.messageitem.Message.ID), collapse));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const cmdCollapse = async () => cmdCollapseExpand(true);
|
||||||
|
const cmdExpand = async () => cmdCollapseExpand(false);
|
||||||
const shortcuts = {
|
const shortcuts = {
|
||||||
d: cmdTrash,
|
d: cmdTrash,
|
||||||
Delete: cmdTrash,
|
Delete: cmdTrash,
|
||||||
|
@ -3126,6 +3160,8 @@ const newMsglistView = (msgElem, listMailboxes, setLocationHash, otherMailbox, p
|
||||||
X: cmdToggleMute,
|
X: cmdToggleMute,
|
||||||
C: cmdToggleCollapse,
|
C: cmdToggleCollapse,
|
||||||
S: cmdSelectThread,
|
S: cmdSelectThread,
|
||||||
|
ArrowLeft: cmdCollapse,
|
||||||
|
ArrowRight: cmdExpand,
|
||||||
};
|
};
|
||||||
// After making changes, this function looks through the data structure for
|
// After making changes, this function looks through the data structure for
|
||||||
// inconsistencies. Useful during development.
|
// inconsistencies. Useful during development.
|
||||||
|
|
|
@ -989,6 +989,8 @@ const cmdHelp = async () => {
|
||||||
['S', 'select thread messages'],
|
['S', 'select thread messages'],
|
||||||
['C', 'toggle thread collapse'],
|
['C', 'toggle thread collapse'],
|
||||||
['X', 'toggle thread mute, automatically marking new messages as read'],
|
['X', 'toggle thread mute, automatically marking new messages as read'],
|
||||||
|
['←', 'collapse thread'],
|
||||||
|
['→', 'expand thread'],
|
||||||
].map(t => dom.tr(dom.td(t[0]), dom.td(t[1]))),
|
].map(t => dom.tr(dom.td(t[0]), dom.td(t[1]))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -2838,6 +2840,38 @@ const newMsglistView = (msgElem: HTMLElement, listMailboxes: listMailboxes, setL
|
||||||
updateState(oldstate)
|
updateState(oldstate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cmdCollapseExpand = async (collapse: boolean) => {
|
||||||
|
if (settings.threading === api.ThreadMode.ThreadOff) {
|
||||||
|
alert('Toggling thread collapse/expand is only available when threading is enabled.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const oldstate = state()
|
||||||
|
const rootmivs = seletedRoots()
|
||||||
|
rootmivs.forEach(miv => {
|
||||||
|
if (miv.collapsed !== collapse) {
|
||||||
|
if (collapse) {
|
||||||
|
threadCollapse(miv, false)
|
||||||
|
} else {
|
||||||
|
threadExpand(miv, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (collapse) {
|
||||||
|
selected = rootmivs
|
||||||
|
if (focus) {
|
||||||
|
focus = focus.threadRoot()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
viewportEnsureMessages()
|
||||||
|
updateState(oldstate)
|
||||||
|
if (settings.threading === api.ThreadMode.ThreadOn) {
|
||||||
|
const action = collapse ? 'Collapsing' : 'Expanding'
|
||||||
|
await withStatus(action, client.ThreadCollapse(rootmivs.map(miv => miv.messageitem.Message.ID), collapse))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const cmdCollapse = async () => cmdCollapseExpand(true)
|
||||||
|
const cmdExpand = async () => cmdCollapseExpand(false)
|
||||||
|
|
||||||
const shortcuts: {[key: string]: command} = {
|
const shortcuts: {[key: string]: command} = {
|
||||||
d: cmdTrash,
|
d: cmdTrash,
|
||||||
Delete: cmdTrash,
|
Delete: cmdTrash,
|
||||||
|
@ -2850,6 +2884,8 @@ const newMsglistView = (msgElem: HTMLElement, listMailboxes: listMailboxes, setL
|
||||||
X: cmdToggleMute,
|
X: cmdToggleMute,
|
||||||
C: cmdToggleCollapse,
|
C: cmdToggleCollapse,
|
||||||
S: cmdSelectThread,
|
S: cmdSelectThread,
|
||||||
|
ArrowLeft: cmdCollapse,
|
||||||
|
ArrowRight: cmdExpand,
|
||||||
}
|
}
|
||||||
|
|
||||||
// After making changes, this function looks through the data structure for
|
// After making changes, this function looks through the data structure for
|
||||||
|
|
Loading…
Reference in a new issue