devonthesofa_obsidian-note-.../components/SettingsUI/CustomStatusSettings.tsx

128 lines
3.4 KiB
TypeScript
Raw Normal View History

2025-07-15 15:30:17 +00:00
import { PluginSettings } from "@/types/pluginSettings";
import React from "react";
import {
CustomStatusItem,
Props as CustomStatusItemProps,
} from "./CustomStatusItem";
import { SettingItem } from "./SettingItem";
export type Props = {
settings: PluginSettings;
onChange: (key: keyof PluginSettings, value: unknown) => void;
};
export const CustomStatusSettings: React.FC<Props> = ({
settings,
onChange,
}) => {
const addNewCustomStatus = () => {
const currentStatuses = [...(settings.customStatuses || [])];
2025-07-15 15:30:17 +00:00
currentStatuses.push({
name: "",
icon: "",
2025-11-21 07:04:30 +00:00
lucideIcon: "",
2025-07-15 15:30:17 +00:00
});
onChange("customStatuses", currentStatuses);
};
const removeCustomStatus: CustomStatusItemProps["onCustomStatusRemove"] = (
index,
) => {
const currentStatuses = [...(settings.customStatuses || [])];
2025-07-15 15:30:17 +00:00
currentStatuses.splice(index, 1);
onChange("customStatuses", currentStatuses);
};
const updateCustomStatus: CustomStatusItemProps["onCustomStatusChange"] = (
index,
column,
value,
) => {
const currentStatuses = [...(settings.customStatuses || [])];
2025-07-15 15:30:17 +00:00
const target = currentStatuses[index];
if (target) {
target[column] = value;
onChange("customStatuses", currentStatuses);
}
};
const moveCustomStatusUp = (index: number) => {
if (index <= 0) return;
const currentStatuses = [...(settings.customStatuses || [])];
[currentStatuses[index - 1], currentStatuses[index]] = [
currentStatuses[index],
currentStatuses[index - 1],
];
onChange("customStatuses", currentStatuses);
};
const moveCustomStatusDown = (index: number) => {
const currentStatuses = [...(settings.customStatuses || [])];
if (index >= currentStatuses.length - 1) return;
[currentStatuses[index], currentStatuses[index + 1]] = [
currentStatuses[index + 1],
currentStatuses[index],
];
onChange("customStatuses", currentStatuses);
};
2025-07-15 15:30:17 +00:00
return (
<div>
<h3>Custom Statuses</h3>
2025-07-15 15:30:17 +00:00
<SettingItem
name="Use only custom statuses"
description="Hide default template statuses and use only your custom statuses"
2025-07-15 15:30:17 +00:00
>
<input
type="checkbox"
checked={settings.useCustomStatusesOnly || false}
onChange={(e) =>
onChange("useCustomStatusesOnly", e.target.checked)
}
/>
</SettingItem>
<SettingItem
2025-07-20 18:52:10 +00:00
name="Custom statuses"
2025-11-21 07:04:30 +00:00
description="Create custom statuses with emoji icons and optional Lucide icon names plus colors. All statuses require a name."
2025-07-15 15:30:17 +00:00
vertical
>
<div className="custom-status-list">
{(settings.customStatuses || []).length === 0 ? (
2025-07-19 16:49:18 +00:00
<div className="custom-status-list__empty">
<p>
No custom statuses yet. Click "Add Status" below
to create your first one.
</p>
</div>
) : (
(settings.customStatuses || []).map((status, index) => (
<CustomStatusItem
key={index}
status={status}
index={index}
onCustomStatusChange={updateCustomStatus}
onCustomStatusRemove={removeCustomStatus}
onMoveUp={moveCustomStatusUp}
onMoveDown={moveCustomStatusDown}
canMoveUp={index > 0}
canMoveDown={
index <
(settings.customStatuses || []).length - 1
}
/>
))
)}
2025-07-15 15:30:17 +00:00
</div>
</SettingItem>
2025-07-20 18:52:10 +00:00
<SettingItem name="Add status" description="Create a new status">
2025-07-15 15:30:17 +00:00
<button className="mod-cta" onClick={addNewCustomStatus}>
+ Add Status
2025-07-15 15:30:17 +00:00
</button>
</SettingItem>
</div>
);
};