From 88043fd0424be0ac139d5151f39f217384728a9f Mon Sep 17 00:00:00 2001 From: Trang Doan Date: Mon, 21 Jul 2025 15:02:25 -0400 Subject: [PATCH 1/2] add color setting --- .../src/components/DiscourseContextView.tsx | 8 +++- .../obsidian/src/components/NodeTypeModal.tsx | 9 ++++- .../src/components/NodeTypeSettings.tsx | 40 +++++++++++++++++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/apps/obsidian/src/components/DiscourseContextView.tsx b/apps/obsidian/src/components/DiscourseContextView.tsx index faa497dcd..9407f79ca 100644 --- a/apps/obsidian/src/components/DiscourseContextView.tsx +++ b/apps/obsidian/src/components/DiscourseContextView.tsx @@ -49,7 +49,13 @@ const DiscourseContext = ({ activeFile }: DiscourseContextProps) => { return ( <>
-
+
+ {nodeType.color && ( +
+ )} {nodeType.name || "Unnamed Node Type"}
diff --git a/apps/obsidian/src/components/NodeTypeModal.tsx b/apps/obsidian/src/components/NodeTypeModal.tsx index 217167bff..ccea86d53 100644 --- a/apps/obsidian/src/components/NodeTypeModal.tsx +++ b/apps/obsidian/src/components/NodeTypeModal.tsx @@ -24,7 +24,14 @@ export class NodeTypeModal extends SuggestModal { } renderSuggestion(nodeType: DiscourseNode, el: HTMLElement) { - el.createEl("div", { text: nodeType.name }); + const container = el.createDiv({ cls: "flex items-center gap-2" }); + if (nodeType.color) { + container.createDiv({ + cls: "h-4 w-4 rounded-full", + attr: { style: `background-color: ${nodeType.color};` }, + }); + } + container.createDiv({ text: nodeType.name }); } async onChooseSuggestion(nodeType: DiscourseNode) { diff --git a/apps/obsidian/src/components/NodeTypeSettings.tsx b/apps/obsidian/src/components/NodeTypeSettings.tsx index 65a3e5f75..75d147781 100644 --- a/apps/obsidian/src/components/NodeTypeSettings.tsx +++ b/apps/obsidian/src/components/NodeTypeSettings.tsx @@ -7,14 +7,14 @@ import { DiscourseNode } from "~/types"; import { ConfirmationModal } from "./ConfirmationModal"; import { getTemplateFiles, getTemplatePluginInfo } from "~/utils/templates"; -type EditableFieldKey = keyof Omit; +type EditableFieldKey = keyof Omit; type BaseFieldConfig = { key: EditableFieldKey; label: string; description: string; required?: boolean; - type: "text" | "select"; + type: "text" | "select" | "color"; placeholder?: string; validate?: ( value: string, @@ -68,6 +68,13 @@ const FIELD_CONFIGS: Record = { type: "select", required: false, }, + color: { + key: "color", + label: "Color", + description: "The color to use for this node type", + type: "color", + required: false, + }, }; const FIELD_CONFIG_ARRAY = Object.values(FIELD_CONFIGS); @@ -92,6 +99,23 @@ const TextField = ({ /> ); +const ColorField = ({ + value, + error, + onChange, +}: { + value: string; + error?: string; + onChange: (value: string) => void; +}) => ( + onChange(e.target.value)} + className={`h-8 w-20 ${error ? "input-error" : ""}`} + /> +); + const TemplateField = ({ value, error, @@ -367,6 +391,8 @@ const NodeTypeSettings = () => { templateConfig={templateConfig} templateFiles={templateFiles} /> + ) : fieldConfig.type === "color" ? ( + ) : ( { onClick={() => startEditing(index)} >
- {nodeType.name} +
+ {nodeType.color && ( +
+ )} + {nodeType.name} +