diff --git a/apps/obsidian/src/components/NodeTypeSettings.tsx b/apps/obsidian/src/components/NodeTypeSettings.tsx index b8f08ab79..bb7c933af 100644 --- a/apps/obsidian/src/components/NodeTypeSettings.tsx +++ b/apps/obsidian/src/components/NodeTypeSettings.tsx @@ -1,11 +1,16 @@ -import { useState, useEffect, useRef } from "react"; +import { useState, useEffect, useRef, useCallback } from "react"; import { validateNodeFormat, validateNodeName } from "~/utils/validateNodeType"; import { usePlugin } from "./PluginContext"; -import { Notice, setIcon } from "obsidian"; +import { App, Component, MarkdownRenderer, Notice, setIcon } from "obsidian"; import generateUid from "~/utils/generateUid"; import { DiscourseNode } from "~/types"; import { ConfirmationModal } from "./ConfirmationModal"; -import { getTemplateFiles, getTemplatePluginInfo } from "~/utils/templates"; +import { + createTemplateFileWithUniqueName, + getImportedTemplateFileName, + getTemplateFiles, + getTemplatePluginInfo, +} from "~/utils/templates"; import { getImportInfo, formatImportSource, @@ -14,6 +19,10 @@ import { } from "~/utils/typeUtils"; import { FolderSuggestInput } from "./GeneralSettings"; import { createBaseForNodeType } from "~/utils/baseForNodeType"; +import { + fetchTemplateImportCandidates, + type TemplateImportCandidate, +} from "~/utils/templateImport"; const generateTagPlaceholder = (format: string, nodeName?: string): string => { if (!format) return "Enter tag (e.g., clm-candidate)"; @@ -221,6 +230,8 @@ const TemplateField = ({ templateConfig, templateFiles, disabled, + onImportClick, + importDisabledReason, }: { value: string; error?: string; @@ -228,27 +239,117 @@ const TemplateField = ({ templateConfig: { isEnabled: boolean; folderPath: string }; templateFiles: string[]; disabled?: boolean; -}) => ( - onChange(e.target.value)} - className={`w-full ${error ? "input-error" : ""}`} - disabled={ - disabled || !templateConfig.isEnabled || !templateConfig.folderPath - } - > - - {!templateConfig.isEnabled || !templateConfig.folderPath - ? "Template folder not configured" - : "No template"} - - {templateFiles.map((templateFile) => ( - - {templateFile} - - ))} - -); + onImportClick: () => void; + importDisabledReason?: string; +}) => { + const [isOpen, setIsOpen] = useState(false); + const isTemplateConfigured = + templateConfig.isEnabled && !!templateConfig.folderPath; + const isDisabled = disabled || !isTemplateConfigured; + const displayValue = !isTemplateConfigured + ? "Template folder not configured" + : value + ? value + : "No template"; + + const handleSelect = (nextValue: string): void => { + onChange(nextValue); + setIsOpen(false); + }; + + const menuItemStyle = { + background: "transparent", + border: "none", + borderRadius: 0, + boxShadow: "none", + color: "var(--text-normal)", + fontSize: "var(--font-ui-small)", + height: "28px", + justifyContent: "flex-start", + padding: "4px 10px", + textAlign: "left" as const, + width: "100%", + }; + + return ( +
+ {nodeTypeName} templates shared by members of your Discourse + Graphs groups. +