feat: provider icons in time grid, fix weekday names persistence, calendar z-index

- Add sync provider icons (Google, Microsoft, Apple, Synology) to
  GridTaskBlock so they show in weekday time slots
- Add weekdayFormat and customWeekdayNames fields to Prisma schema
  and profile API so custom weekday names persist across reloads
- Fix Jump to Date calendar z-index by elevating container when open
- Fix someday textarea font to inherit from CSS instead of hardcoded values

v1.18.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
mARTin 2026-03-08 13:09:37 +01:00
parent 7f04750e4a
commit 05dab0720b
5 changed files with 38 additions and 6 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "my-weekly-todo-list", "name": "my-weekly-todo-list",
"version": "1.17.2", "version": "1.18.0",
"description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {

View File

@ -92,6 +92,8 @@ model User {
accountNumber Int @unique @default(autoincrement()) accountNumber Int @unique @default(autoincrement())
showCompletedTasks Boolean @default(true) showCompletedTasks Boolean @default(true)
showLines Boolean @default(true) showLines Boolean @default(true)
weekdayFormat String? @default("long")
customWeekdayNames String? @default("")
startDayOffset Int @default(-1) startDayOffset Int @default(-1)
quoteSourceUrls String[] @default([]) quoteSourceUrls String[] @default([])
accounts Account[] accounts Account[]

View File

@ -83,6 +83,8 @@ export async function GET(request: NextRequest) {
showCompletedTasks: true, showCompletedTasks: true,
showLines: true, showLines: true,
startDayOffset: true, startDayOffset: true,
weekdayFormat: true,
customWeekdayNames: true,
quoteSourceUrls: true, quoteSourceUrls: true,
accountNumber: true, accountNumber: true,
createdAt: true createdAt: true
@ -126,7 +128,7 @@ export async function PATCH(request: NextRequest) {
cwFontFamily, cwFontSize, cwFontWeight, cwColor, cwFontFamily, cwFontSize, cwFontWeight, cwColor,
yearFontFamily, yearFontSize, yearFontWeight, yearColor, yearFontFamily, yearFontSize, yearFontWeight, yearColor,
showTaskCheckboxes, dayHeaderGap, showTaskCheckboxes, dayHeaderGap,
showCompletedTasks, showLines, startDayOffset, quoteSourceUrls showCompletedTasks, showLines, startDayOffset, weekdayFormat, customWeekdayNames, quoteSourceUrls
} = body; } = body;
const updateData: any = { const updateData: any = {
@ -199,6 +201,8 @@ export async function PATCH(request: NextRequest) {
...(showCompletedTasks !== undefined && { showCompletedTasks }), ...(showCompletedTasks !== undefined && { showCompletedTasks }),
...(showLines !== undefined && { showLines }), ...(showLines !== undefined && { showLines }),
...(startDayOffset !== undefined && { startDayOffset }), ...(startDayOffset !== undefined && { startDayOffset }),
...(weekdayFormat !== undefined && { weekdayFormat }),
...(customWeekdayNames !== undefined && { customWeekdayNames }),
...(quoteSourceUrls !== undefined && { quoteSourceUrls }), ...(quoteSourceUrls !== undefined && { quoteSourceUrls }),
}; };
if (password && password.trim() !== "") { if (password && password.trim() !== "") {
@ -280,6 +284,8 @@ export async function PATCH(request: NextRequest) {
showCompletedTasks: true, showCompletedTasks: true,
showLines: true, showLines: true,
startDayOffset: true, startDayOffset: true,
weekdayFormat: true,
customWeekdayNames: true,
quoteSourceUrls: true, quoteSourceUrls: true,
accountNumber: true, accountNumber: true,
} }

View File

@ -1,5 +1,8 @@
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
import { Repeat, Circle, X } from "lucide-react"; import { Repeat, Circle, X } from "lucide-react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faGoogle, faMicrosoft, faApple } from "@fortawesome/free-brands-svg-icons";
import { faServer } from "@fortawesome/free-solid-svg-icons";
import { Task } from "./WeeklyView"; import { Task } from "./WeeklyView";
interface GridTaskBlockProps { interface GridTaskBlockProps {
@ -271,7 +274,28 @@ export function GridTaskBlock({
)} )}
<span style={task.completed && showTaskCheckboxes ? { opacity: 0.5, flex: 1, display: "flex", alignItems: "center", flexWrap: "wrap", rowGap: "2px" } : { flex: 1, display: "flex", alignItems: "center", flexWrap: "wrap", rowGap: "2px" }}> <span style={task.completed && showTaskCheckboxes ? { opacity: 0.5, flex: 1, display: "flex", alignItems: "center", flexWrap: "wrap", rowGap: "2px" } : { flex: 1, display: "flex", alignItems: "center", flexWrap: "wrap", rowGap: "2px" }}>
<span style={{ marginRight: "4px" }}>{task.title}</span> <span style={{ marginRight: "4px" }}>{task.title}</span>
{(() => {
const provider = task.externalProvider
|| (task.externalId?.startsWith("synology::") ? "synology" : null);
if (!provider) return null;
const iconMap: Record<string, { icon: any; color: string; label: string }> = {
google: { icon: faGoogle, color: "#4285F4", label: "Google" },
outlook: { icon: faMicrosoft, color: "#0078D4", label: "Microsoft" },
apple: { icon: faApple, color: "#555", label: "Apple" },
synology: { icon: faServer, color: "#007AFF", label: "Synology" },
};
const info = iconMap[provider];
if (!info) return null;
return (
<span
className="flex-shrink-0"
title={`Synced with ${info.label}`}
style={{ display: "inline-flex", alignItems: "center", opacity: 0.55 }}
>
<FontAwesomeIcon icon={info.icon} style={{ width: 10, height: 10, color: info.color }} />
</span>
);
})()}
{/* Subtask indicator */} {/* Subtask indicator */}
{task.subTasks && task.subTasks.length > 0 && (() => { {task.subTasks && task.subTasks.length > 0 && (() => {
const completed = task.subTasks.filter(s => s.completed).length; const completed = task.subTasks.filter(s => s.completed).length;

View File

@ -4731,7 +4731,7 @@ export default function WeeklyView() {
</div> </div>
{/* Date Picker Toggle */} {/* Date Picker Toggle */}
<div className="relative"> <div className="relative" style={{ zIndex: showDatePicker ? 2001 : "auto" }}>
<button <button
className={`p-1.5 hover:bg-gray-100 rounded-md transition-colors ${showDatePicker ? "text-teal-600 bg-teal-50" : "text-gray-500 hover:text-black"}`} className={`p-1.5 hover:bg-gray-100 rounded-md transition-colors ${showDatePicker ? "text-teal-600 bg-teal-50" : "text-gray-500 hover:text-black"}`}
onClick={() => setShowDatePicker(!showDatePicker)} onClick={() => setShowDatePicker(!showDatePicker)}
@ -6998,11 +6998,11 @@ function TaskItem({
outline: "none", outline: "none",
width: "100%", width: "100%",
padding: "0", padding: "0",
fontSize: "0.9375rem",
fontWeight: 500,
resize: "none", resize: "none",
overflow: "hidden", overflow: "hidden",
fontFamily: "inherit", fontFamily: "inherit",
fontSize: "inherit",
fontWeight: "inherit",
lineHeight: "inherit", lineHeight: "inherit",
}} }}
/> />