chore: bump version to 1.4.2

This commit is contained in:
Linus Rath
2026-03-19 01:38:23 +01:00
parent 2793d4b4af
commit fb8c9db716
8 changed files with 81 additions and 6 deletions
+23
View File
@@ -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
+1 -1
View File
@@ -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)
</div>
+1 -1
View File
@@ -1 +1 @@
1.4.1
1.4.2
+1 -1
View File
@@ -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" },
+26
View File
@@ -564,6 +564,32 @@ export interface CalendarRelation {
relation: Record<string, boolean> | null;
}
export interface CalendarTask {
id: string;
calendarIds: Record<string, boolean>;
'@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<string, boolean> | null;
categories: Record<string, boolean> | null;
color: string | null;
created: string | null;
updated: string;
recurrenceRules: CalendarRecurrenceRule[] | null;
alerts: Record<string, CalendarEventAlert> | null;
relatedTo: Record<string, CalendarRelation> | null;
}
export interface CalendarParticipantIdentity {
id: string;
name: string;
+2 -2
View File
@@ -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",
+1 -1
View File
@@ -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 <bulwark@rbm.systems>",
"license": "AGPL-3.0-only",
+26
View File
@@ -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<TaskStore>((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 }),
}));