Skip to content

Commit

Permalink
Mail: Msg list: Folder header and footer, to show login button, msg c…
Browse files Browse the repository at this point in the history
…ount, and star/unread filters
  • Loading branch information
benbucksch committed Dec 19, 2024
1 parent c014ea2 commit b9ef294
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 0 deletions.
3 changes: 3 additions & 0 deletions app/frontend/Mail/3pane/3Pane.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
slot="left" />
<SplitterHorizontal slot="right" name="mail.3pane.msgs" initialBottomRatio={2}>
<vbox flex class="message-list-pane" slot="top">
<FolderHeader folder={selectedFolder} {searchMessages} />
<TableMessageList {messages} bind:selectedMessage bind:selectedMessages />
</vbox>
<vbox flex class="message-display-pane" slot="bottom">
Expand All @@ -23,6 +24,8 @@
import TableMessageList from "./TableMessageList.svelte";
import LeftPane from "../LeftPane/LeftPane.svelte";
import FolderFooter from "../LeftPane/FolderFooter.svelte";
import FolderHeader from "../LeftPane/FolderHeader.svelte";
import MessageDisplay from "../Message/MessageDisplay.svelte";
import StartPage from "../StartPage.svelte";
import Splitter from "../../Shared/Splitter.svelte";
Expand Down
130 changes: 130 additions & 0 deletions app/frontend/Mail/LeftPane/FolderFooter.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<!-- Appears below the msg list -->
{#if folder}
<hbox class="folder-header">
<hbox class="buttons">
{#if $account?.isLoggedIn}
<GetMailButton {folder} />
{/if}
<hbox class="star button" class:starred={isShowStarred}>
<Button
icon={StarIcon}
iconSize="16px"
iconOnly
label={$t`Show only starred messages`}
onClick={toggleStarred}
plain
/>
</hbox>
<hbox class="unread-dot button" class:unread={isShowUnread}>
<Button
icon={CircleIcon}
iconSize="7px"
iconOnly
label={$t`Show only unread messages`}
onClick={toggleUnread}
plain
/>
</hbox>
</hbox>
<hbox flex />
<hbox class="msg-count">
{#if searchMessages}
{#if $searchMessages.hasItems}
{$t`${$searchMessages.length} search results`}
{:else}
{$t`No search results`}
{/if}
{:else}
{#if $folder.countTotal > 0}
{$t`${$folder.countNewArrived} new,
${$folder.countUnread} unread,
${$folder.countTotal} total`}
{/if}
{#if $folder.countTotal > 0 && $folder.countTotal != $messages.length}
{#if $messages.length == 0}
{$t`Loading...`}
{:else}
{$t`${$messages.length} displayed.`}
{/if}
{/if}
{/if}
</hbox>
<hbox flex />
</hbox>
{/if}

<script lang="ts">
import type { Folder } from '../../../logic/Mail/Folder';
import type { EMail } from '../../../logic/Mail/EMail';
import { newSearchEMail } from '../../../logic/Mail/Store/setStorage';
import GetMailButton from './GetMailButton.svelte';
import Button from '../../Shared/Button.svelte';
import StarIcon from "lucide-svelte/icons/star";
import CircleIcon from "lucide-svelte/icons/circle";
import type { ArrayColl } from 'svelte-collections';
import { t } from '../../../l10n/l10n';
export let folder: Folder;
export let searchMessages: ArrayColl<EMail> | null; /** out */
$: account = folder?.account;
$: messages = folder?.messages;
let isShowStarred = false;
async function toggleStarred() {
isShowStarred = !isShowStarred;
await startSearch();
}
let isShowUnread = false;
async function toggleUnread() {
isShowUnread = !isShowUnread;
await startSearch();
}
async function startSearch() {
if (!isShowStarred && !isShowUnread) {
searchMessages = null;
return;
}
let search = newSearchEMail();
if (isShowStarred) { // undefined != false
search.isStarred = true;
}
if (isShowUnread) {
search.isRead = false;
}
search.folder = folder;
searchMessages = await search.startSearch();
}
</script>

<style>
.folder-header {
align-items: center;
justify-content: center;
height: 20px;
font-size: 12px;
padding-block-start: 2px;
padding-block-end: 2px;
padding-inline-start: 4px;
padding-inline-end: 4px;
color: var(--leftbar-fg);
background-color: var(--leftbar-bg);
}
.folder-header :global(.get-mail button) {
height: 20px;
width: 20px;
border: none;
}
.msg-count {
padding-inline-start: 4px;
padding-inline-end: 8px;
}
.star.starred :global(svg) {
fill: orange;
}
.unread-dot.unread :global(svg) {
fill: green;
}
</style>
53 changes: 53 additions & 0 deletions app/frontend/Mail/LeftPane/FolderHeader.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<!-- Appears above the msg list -->
{#if account && !$account?.isLoggedIn || searchMessages}
<hbox class="folder-header">
<hbox flex />
{#if account && !$account?.isLoggedIn}
<Button plain
label={$t`Login`}
icon={DisconnectedIcon}
onClick={login}
iconSize="16px" />
{/if}
{#if searchMessages}
{$t(`Search results`)}
{/if}
<hbox flex />
</hbox>
{/if}

<script lang="ts">
import type { Folder } from '../../../logic/Mail/Folder';
import type { EMail } from '../../../logic/Mail/EMail';
import Button from '../../Shared/Button.svelte';
import DisconnectedIcon from "lucide-svelte/icons/unplug";
import { t } from '../../../l10n/l10n';
import type { ArrayColl } from 'svelte-collections';
export let folder: Folder;
export let searchMessages: ArrayColl<EMail> | null; /** in */
$: account = folder?.account;
async function login() {
await account.login(true);
}
</script>

<style>
.folder-header {
align-items: center;
justify-content: center;
padding-block-start: 2px;
padding-block-end: 2px;
padding-inline-start: 4px;
padding-inline-end: 4px;
font-size: 12px;
color: var(--leftbar-fg);
background-color: var(--leftbar-bg);
box-shadow: 2px 0px 6px 0px rgba(0, 0, 0, 10%);
}
.folder-header :global(button) {
margin-inline-end: 12px;
}
</style>
4 changes: 4 additions & 0 deletions app/frontend/Mail/Vertical/VerticalLayout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
slot="left" />
<Splitter slot="right" name="mail.vertical.msgs" initialRightRatio={2}>
<vbox flex class="message-list-pane" slot="left">
<FolderHeader folder={selectedFolder} {searchMessages} />
<VerticalMessageList {messages} bind:selectedMessage bind:selectedMessages />
<FolderFooter folder={selectedFolder} bind:searchMessages />
</vbox>
<vbox flex class="message-display-pane" slot="right">
{#if selectedMessage}
Expand All @@ -25,6 +27,8 @@
import LeftPane from "../LeftPane/LeftPane.svelte";
import MessageDisplay from "../Message/MessageDisplay.svelte";
import StartPage from "../StartPage.svelte";
import FolderHeader from "../LeftPane/FolderHeader.svelte";
import FolderFooter from "../LeftPane/FolderFooter.svelte";
import Splitter from "../../Shared/Splitter.svelte";
import type { ArrayColl, Collection } from 'svelte-collections';
Expand Down

0 comments on commit b9ef294

Please sign in to comment.