This commit is contained in:
2025-10-29 22:46:44 +01:00
parent 4a116e013c
commit 22f4d42c19
8 changed files with 116 additions and 35 deletions
+74 -16
View File
@@ -9,6 +9,7 @@ import {
ChevronDownIcon,
SettingsIcon,
CheckIcon,
PlusIcon,
} from '../ui/icons';
import { getTagColorStyle } from '../utils/colors';
@@ -82,7 +83,7 @@ const FolderNode = ({
<div className="folder-row__actions">
<button
type="button"
className="icon-button ghost"
className="icon-button"
onClick={(event) => {
event.stopPropagation();
if (!onRename) return;
@@ -103,7 +104,7 @@ const FolderNode = ({
</button>
<button
type="button"
className="icon-button ghost"
className="icon-button"
onClick={(event) => {
event.stopPropagation();
onDelete(node.id);
@@ -146,6 +147,8 @@ const Sidebar = ({
onToggleCorrespondentFilter,
onManageTags,
onManageCorrespondents,
onCreateTag,
onCreateCorrespondent,
searchQuery = '',
onSearchChange,
onSearchSubmit,
@@ -175,6 +178,37 @@ const Sidebar = ({
const activeTagSet = new Set(activeTagIds);
const handleManageTags = onManageTags || (() => {});
const handleManageCorrespondents = onManageCorrespondents || (() => {});
const handleCreateTag = useCallback(async () => {
const input = window.prompt('New tag name');
if (!input) {
return;
}
const trimmed = input.trim();
if (!trimmed) {
return;
}
try {
await onCreateTag?.(trimmed);
} catch (error) {
console.error('[sidebar] failed to create tag', error);
}
}, [onCreateTag]);
const handleCreateCorrespondent = useCallback(async () => {
const input = window.prompt('New correspondent name');
if (!input) {
return;
}
const trimmed = input.trim();
if (!trimmed) {
return;
}
try {
await onCreateCorrespondent?.(trimmed);
} catch (error) {
console.error('[sidebar] failed to create correspondent', error);
}
}, [onCreateCorrespondent]);
const handleSearchInputChange = useCallback(
(event) => {
onSearchChange?.(event.target.value);
@@ -408,14 +442,26 @@ const Sidebar = ({
</div>
<div className="sidebar-section">
<div className="sidebar-section__header">
<button
type="button"
className="sidebar-section__title"
onClick={handleManageTags}
>
<h3>Tags</h3>
<h3>Tags</h3>
<div className="sidebar-section__actions">
<button
type="button"
className="icon-button"
onClick={handleCreateTag}
aria-label="Create tag"
>
<PlusIcon size={16} />
</button>
<button
type="button"
className="icon-button"
onClick={handleManageTags}
aria-label="Manage tags"
>
<SettingsIcon size={16} />
</button>
<span className="meta">{tags.length}</span>
</button>
</div>
</div>
<div
className={`sidebar-tag-cloud${
@@ -460,14 +506,26 @@ const Sidebar = ({
</div>
<div className="sidebar-section">
<div className="sidebar-section__header">
<button
type="button"
className="sidebar-section__title"
onClick={handleManageCorrespondents}
>
<h3>Correspondents</h3>
<h3>Correspondents</h3>
<div className="sidebar-section__actions">
<button
type="button"
className="icon-button"
onClick={handleCreateCorrespondent}
aria-label="Create correspondent"
>
<PlusIcon size={16} />
</button>
<button
type="button"
className="icon-button"
onClick={handleManageCorrespondents}
aria-label="Manage correspondents"
>
<SettingsIcon size={16} />
</button>
<span className="meta">{correspondents.length}</span>
</button>
</div>
</div>
<ul className="sidebar-correspondent-list">
{sortedCorrespondents.map((correspondent) => {