From fb8c9db71609c2c5f419252e00c19ae24a739f6e Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Thu, 19 Mar 2026 01:38:23 +0100 Subject: [PATCH] chore: bump version to 1.4.2 --- CHANGELOG.md | 23 +++++++++++++++++++++++ README.md | 2 +- VERSION | 2 +- app/[locale]/login/page.tsx | 2 +- lib/jmap/types.ts | 26 ++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- stores/task-store.ts | 26 ++++++++++++++++++++++++++ 8 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 stores/task-store.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f2932b92..facf803b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## 1.4.2 (2026-03-19) + +### Features + +- **Calendar**: Add task list view for calendar tasks with task details and management +- **Calendar**: Add shared calendar grouping with visual separation in sidebar +- **Calendar**: Support double-click to create events and improve modal date handling +- **Contacts**: Add address book directories with drag-and-drop and editor picker +- **Email**: Add email attachment support in sendEmail functionality +- **Email**: Implement draft editing functionality across email components +- **Email**: Implement unwrapping of embedded message/rfc822 attachments with enhanced HTML body validation +- **Email**: Add email export/import localization keys for multiple languages +- **Contacts**: Update gender handling to use speakToAs structure + +### Fixes + +- **Email**: Resolve default sender to canonical identity on local-part login +- **Email**: Refactor overflow handling in EmailViewer to use hidden priorities and layout effects +- **Email**: Remove debugMode usage from EmailViewer component +- **Calendar**: Enhance IMIP invitation and cancellation handling for calendar events +- **Calendar**: Add time-based sorting for events in buildWeekSegments function +- **Dependencies**: Update dompurify to 3.3.3 and elliptic to 6.6.1, add undici override + ## 1.4.1 (2026-03-18) ### Features diff --git a/README.md b/README.md index 8f16d51a..a622c10a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ A modern, self-hosted webmail client for [Stalwart Mail Server](https://stalw.ar Built with Next.js and the JMAP protocol. [![License: AGPL v3](https://img.shields.io/badge/license-AGPL%20v3-blue.svg)](LICENSE) -[![Version](https://img.shields.io/badge/version-1.4.1-green.svg)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/version-1.4.2-green.svg)](CHANGELOG.md) [![Docker](https://img.shields.io/badge/docker-ghcr.io%2Fbulwarkmail%2Fwebmail-blue)](https://ghcr.io/bulwarkmail/webmail) diff --git a/VERSION b/VERSION index 347f5833..9df886c4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.1 +1.4.2 diff --git a/app/[locale]/login/page.tsx b/app/[locale]/login/page.tsx index 074e4ec4..2ccf540e 100644 --- a/app/[locale]/login/page.tsx +++ b/app/[locale]/login/page.tsx @@ -16,7 +16,7 @@ import { discoverOAuth, type OAuthMetadata } from "@/lib/oauth/discovery"; import { generateCodeVerifier, generateCodeChallenge, generateState } from "@/lib/oauth/pkce"; import { OAUTH_SCOPES } from "@/lib/oauth/tokens"; -const APP_VERSION = "1.4.1"; +const APP_VERSION = "1.4.2"; const THEME_OPTIONS = [ { value: "light" as const, icon: Sun, label: "Light" }, diff --git a/lib/jmap/types.ts b/lib/jmap/types.ts index 8d27c209..1136c57a 100644 --- a/lib/jmap/types.ts +++ b/lib/jmap/types.ts @@ -564,6 +564,32 @@ export interface CalendarRelation { relation: Record | null; } +export interface CalendarTask { + id: string; + calendarIds: Record; + '@type': 'Task'; + uid: string; + title: string; + description: string; + due: string | null; + start: string | null; + duration: string | null; + timeZone: string | null; + showWithoutTime: boolean; + progress: 'needs-action' | 'in-process' | 'completed' | 'cancelled'; + progressUpdated: string | null; + priority: number; + privacy: 'public' | 'private' | 'secret'; + keywords: Record | null; + categories: Record | null; + color: string | null; + created: string | null; + updated: string; + recurrenceRules: CalendarRecurrenceRule[] | null; + alerts: Record | null; + relatedTo: Record | null; +} + export interface CalendarParticipantIdentity { id: string; name: string; diff --git a/package-lock.json b/package-lock.json index e319266a..86bddba9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bulwark-webmail", - "version": "1.4.1", + "version": "1.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bulwark-webmail", - "version": "1.4.1", + "version": "1.4.2", "license": "AGPL-3.0-only", "dependencies": { "@tanstack/react-virtual": "^3.13.18", diff --git a/package.json b/package.json index 92e7aecd..193f1662 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bulwark-webmail", - "version": "1.4.1", + "version": "1.4.2", "description": "Bulwark Webmail — a modern webmail client built for Stalwart Mail Server", "author": "Bulwark Webmail ", "license": "AGPL-3.0-only", diff --git a/stores/task-store.ts b/stores/task-store.ts new file mode 100644 index 00000000..6eb89196 --- /dev/null +++ b/stores/task-store.ts @@ -0,0 +1,26 @@ +import { create } from 'zustand'; +import type { CalendarTask } from '@/lib/jmap/types'; + +export type TaskViewFilter = 'all' | 'pending' | 'completed' | 'overdue'; + +interface TaskStore { + tasks: CalendarTask[]; + selectedTaskId: string | null; + filter: TaskViewFilter; + showCompleted: boolean; + setTasks: (tasks: CalendarTask[]) => void; + setSelectedTaskId: (id: string | null) => void; + setFilter: (filter: TaskViewFilter) => void; + setShowCompleted: (show: boolean) => void; +} + +export const useTaskStore = create((set) => ({ + tasks: [], + selectedTaskId: null, + filter: 'all', + showCompleted: false, + setTasks: (tasks) => set({ tasks }), + setSelectedTaskId: (id) => set({ selectedTaskId: id }), + setFilter: (filter) => set({ filter }), + setShowCompleted: (show) => set({ showCompleted: show }), +}));