fix: tab creation now works, use FolderPlus icon for tab assign
New tabs created via FolderPlus button are stored in localStorage as custom tabs and merged with list-derived tabs. Dissolve and rename also update custom tabs. Changed tab assign icon in list headers from Tag to FolderPlus for consistency. v1.27.2 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
72eafbd63c
commit
79e4a5b287
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.27.1",
|
"version": "1.27.2",
|
||||||
"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": {
|
||||||
|
|||||||
@ -1471,19 +1471,30 @@ export default function WeeklyView() {
|
|||||||
const [creatingNewTab, setCreatingNewTab] = useState(false);
|
const [creatingNewTab, setCreatingNewTab] = useState(false);
|
||||||
const [creatingNewTabName, setCreatingNewTabName] = useState("");
|
const [creatingNewTabName, setCreatingNewTabName] = useState("");
|
||||||
const [dragOverTab, setDragOverTab] = useState<string | null>(null);
|
const [dragOverTab, setDragOverTab] = useState<string | null>(null);
|
||||||
|
const [customTabs, setCustomTabs] = useState<string[]>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
const saved = localStorage.getItem("weekly_active_someday_tab");
|
const saved = localStorage.getItem("weekly_active_someday_tab");
|
||||||
if (saved) setActiveSomedayTab(saved === "__all__" ? null : saved);
|
if (saved) setActiveSomedayTab(saved === "__all__" ? null : saved);
|
||||||
|
try {
|
||||||
|
const savedTabs = localStorage.getItem("weekly_custom_tabs");
|
||||||
|
if (savedTabs) setCustomTabs(JSON.parse(savedTabs));
|
||||||
|
} catch { /* ignore */ }
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const saveCustomTabs = (tabs: string[]) => {
|
||||||
|
setCustomTabs(tabs);
|
||||||
|
localStorage.setItem("weekly_custom_tabs", JSON.stringify(tabs));
|
||||||
|
};
|
||||||
|
|
||||||
const somedayTabs = useMemo(() => {
|
const somedayTabs = useMemo(() => {
|
||||||
const tabs = new Set<string>();
|
const tabs = new Set<string>();
|
||||||
somedayLists.forEach(l => { if (l.tab) tabs.add(l.tab); });
|
somedayLists.forEach(l => { if (l.tab) tabs.add(l.tab); });
|
||||||
|
customTabs.forEach(t => tabs.add(t));
|
||||||
return Array.from(tabs).sort();
|
return Array.from(tabs).sort();
|
||||||
}, [somedayLists]);
|
}, [somedayLists, customTabs]);
|
||||||
|
|
||||||
const setSomedayTab = (tab: string | null) => {
|
const setSomedayTab = (tab: string | null) => {
|
||||||
setActiveSomedayTab(tab);
|
setActiveSomedayTab(tab);
|
||||||
@ -1505,15 +1516,19 @@ export default function WeeklyView() {
|
|||||||
|
|
||||||
const renameTab = async (oldName: string, newName: string) => {
|
const renameTab = async (oldName: string, newName: string) => {
|
||||||
if (!newName.trim() || newName === oldName) return;
|
if (!newName.trim() || newName === oldName) return;
|
||||||
|
const trimmed = newName.trim();
|
||||||
const listsToUpdate = somedayLists.filter(l => l.tab === oldName);
|
const listsToUpdate = somedayLists.filter(l => l.tab === oldName);
|
||||||
setSomedayLists(prev => prev.map(l => l.tab === oldName ? { ...l, tab: newName.trim() } : l));
|
setSomedayLists(prev => prev.map(l => l.tab === oldName ? { ...l, tab: trimmed } : l));
|
||||||
if (activeSomedayTab === oldName) setSomedayTab(newName.trim());
|
if (customTabs.includes(oldName)) {
|
||||||
|
saveCustomTabs(customTabs.map(t => t === oldName ? trimmed : t));
|
||||||
|
}
|
||||||
|
if (activeSomedayTab === oldName) setSomedayTab(trimmed);
|
||||||
for (const list of listsToUpdate) {
|
for (const list of listsToUpdate) {
|
||||||
try {
|
try {
|
||||||
await fetch("/api/someday-lists", {
|
await fetch("/api/someday-lists", {
|
||||||
method: "PATCH",
|
method: "PATCH",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({ id: list.id, tab: newName.trim() }),
|
body: JSON.stringify({ id: list.id, tab: trimmed }),
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Failed to rename tab for list:", e);
|
console.error("Failed to rename tab for list:", e);
|
||||||
@ -1524,6 +1539,9 @@ export default function WeeklyView() {
|
|||||||
const dissolveTab = async (tabName: string) => {
|
const dissolveTab = async (tabName: string) => {
|
||||||
const listsToUpdate = somedayLists.filter(l => l.tab === tabName);
|
const listsToUpdate = somedayLists.filter(l => l.tab === tabName);
|
||||||
setSomedayLists(prev => prev.map(l => l.tab === tabName ? { ...l, tab: null } : l));
|
setSomedayLists(prev => prev.map(l => l.tab === tabName ? { ...l, tab: null } : l));
|
||||||
|
if (customTabs.includes(tabName)) {
|
||||||
|
saveCustomTabs(customTabs.filter(t => t !== tabName));
|
||||||
|
}
|
||||||
if (activeSomedayTab === tabName) setSomedayTab(null);
|
if (activeSomedayTab === tabName) setSomedayTab(null);
|
||||||
for (const list of listsToUpdate) {
|
for (const list of listsToUpdate) {
|
||||||
try {
|
try {
|
||||||
@ -6425,8 +6443,12 @@ export default function WeeklyView() {
|
|||||||
value={creatingNewTabName}
|
value={creatingNewTabName}
|
||||||
onChange={(e) => setCreatingNewTabName(e.target.value)}
|
onChange={(e) => setCreatingNewTabName(e.target.value)}
|
||||||
onBlur={() => {
|
onBlur={() => {
|
||||||
if (creatingNewTabName.trim()) {
|
const name = creatingNewTabName.trim();
|
||||||
setSomedayTab(creatingNewTabName.trim());
|
if (name && !somedayTabs.includes(name)) {
|
||||||
|
saveCustomTabs([...customTabs, name]);
|
||||||
|
setSomedayTab(name);
|
||||||
|
} else if (name) {
|
||||||
|
setSomedayTab(name);
|
||||||
}
|
}
|
||||||
setCreatingNewTab(false);
|
setCreatingNewTab(false);
|
||||||
}}
|
}}
|
||||||
@ -6806,7 +6828,7 @@ export default function WeeklyView() {
|
|||||||
) : iconContent;
|
) : iconContent;
|
||||||
})()}
|
})()}
|
||||||
<div className="someday-tab-assign" style={{ marginLeft: "auto", position: "relative", display: "flex", alignItems: "center" }}>
|
<div className="someday-tab-assign" style={{ marginLeft: "auto", position: "relative", display: "flex", alignItems: "center" }}>
|
||||||
<Tag size={13} style={{ color: list.tab ? "var(--weekly-accent, #6366f1)" : "#bbb", flexShrink: 0 }} />
|
<FolderPlus size={13} style={{ color: list.tab ? "var(--weekly-accent, #6366f1)" : "#bbb", flexShrink: 0 }} />
|
||||||
<select
|
<select
|
||||||
className="someday-tab-select"
|
className="someday-tab-select"
|
||||||
value={list.tab || ""}
|
value={list.tab || ""}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user