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 = () => {
|
2026-03-18 11:35:49 +00:00
|
|
|
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,
|
|
|
|
|
) => {
|
2026-03-18 11:35:49 +00:00
|
|
|
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,
|
|
|
|
|
) => {
|
2026-03-18 11:35:49 +00:00
|
|
|
const currentStatuses = [...(settings.customStatuses || [])];
|
2025-07-15 15:30:17 +00:00
|
|
|
|
|
|
|
|
const target = currentStatuses[index];
|
|
|
|
|
if (target) {
|
|
|
|
|
target[column] = value;
|
|
|
|
|
onChange("customStatuses", currentStatuses);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-20 19:05:51 +00:00
|
|
|
const moveCustomStatusUp = (index: number) => {
|
|
|
|
|
if (index <= 0) return;
|
2026-03-18 11:35:49 +00:00
|
|
|
const currentStatuses = [...(settings.customStatuses || [])];
|
2025-07-20 19:05:51 +00:00
|
|
|
[currentStatuses[index - 1], currentStatuses[index]] = [
|
|
|
|
|
currentStatuses[index],
|
|
|
|
|
currentStatuses[index - 1],
|
|
|
|
|
];
|
|
|
|
|
onChange("customStatuses", currentStatuses);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const moveCustomStatusDown = (index: number) => {
|
2026-03-18 11:35:49 +00:00
|
|
|
const currentStatuses = [...(settings.customStatuses || [])];
|
|
|
|
|
if (index >= currentStatuses.length - 1) return;
|
2025-07-20 19:05:51 +00:00
|
|
|
[currentStatuses[index], currentStatuses[index + 1]] = [
|
|
|
|
|
currentStatuses[index + 1],
|
|
|
|
|
currentStatuses[index],
|
|
|
|
|
];
|
|
|
|
|
onChange("customStatuses", currentStatuses);
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 15:30:17 +00:00
|
|
|
return (
|
|
|
|
|
<div>
|
2025-07-19 16:44:47 +00:00
|
|
|
<h3>Custom Statuses</h3>
|
2025-07-15 15:30:17 +00:00
|
|
|
|
|
|
|
|
<SettingItem
|
|
|
|
|
name="Use only custom statuses"
|
2025-07-19 16:44:47 +00:00
|
|
|
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
|
|
|
|
|
>
|
2025-07-19 16:44:47 +00:00
|
|
|
<div className="custom-status-list">
|
2026-03-18 11:35:49 +00:00
|
|
|
{(settings.customStatuses || []).length === 0 ? (
|
2025-07-19 16:49:18 +00:00
|
|
|
<div className="custom-status-list__empty">
|
2025-07-19 16:44:47 +00:00
|
|
|
<p>
|
|
|
|
|
No custom statuses yet. Click "Add Status" below
|
|
|
|
|
to create your first one.
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
) : (
|
2026-03-18 11:35:49 +00:00
|
|
|
(settings.customStatuses || []).map((status, index) => (
|
2025-07-19 16:44:47 +00:00
|
|
|
<CustomStatusItem
|
|
|
|
|
key={index}
|
|
|
|
|
status={status}
|
|
|
|
|
index={index}
|
|
|
|
|
onCustomStatusChange={updateCustomStatus}
|
|
|
|
|
onCustomStatusRemove={removeCustomStatus}
|
2025-07-20 19:05:51 +00:00
|
|
|
onMoveUp={moveCustomStatusUp}
|
|
|
|
|
onMoveDown={moveCustomStatusDown}
|
|
|
|
|
canMoveUp={index > 0}
|
|
|
|
|
canMoveDown={
|
2026-03-18 11:35:49 +00:00
|
|
|
index <
|
|
|
|
|
(settings.customStatuses || []).length - 1
|
2025-07-20 19:05:51 +00:00
|
|
|
}
|
2025-07-19 16:44:47 +00:00
|
|
|
/>
|
|
|
|
|
))
|
|
|
|
|
)}
|
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}>
|
2025-07-19 16:44:47 +00:00
|
|
|
+ Add Status
|
2025-07-15 15:30:17 +00:00
|
|
|
</button>
|
|
|
|
|
</SettingItem>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|