package main import ( "os" "os/exec" "path/filepath" "verstak/internal/core/plugins" "verstak/internal/i18n" wailsruntime "github.com/wailsapp/wails/v2/pkg/runtime" ) type TemplateDTO struct { Name string `json:"name"` Description string `json:"description"` Icon string `json:"icon"` } func (a *App) ListTemplates() []TemplateDTO { templates := a.plugins.Templates() out := make([]TemplateDTO, 0, len(templates)) for _, t := range templates { out = append(out, TemplateDTO{ Name: t.Name, Description: t.Description, Icon: t.Icon, }) } return out } func (a *App) FromTemplate(parentID, nodeType, title, section, template string) (*NodeDTO, error) { var tmpl *plugins.TemplateDefinition for _, t := range a.plugins.Templates() { if t.Name == template { tmpl = &t break } } if tmpl == nil { return nil, nil } root, err := a.nodes.Create(parentID, tmpl.RootType, title, section) if err != nil { return nil, err } var createTree func(parentID string, nodes []plugins.TreeNode) error createTree = func(parentID string, nodes []plugins.TreeNode) error { for _, tn := range nodes { child, err := a.nodes.Create(parentID, tn.Type, tn.Title, "") if err != nil { return err } if len(tn.Children) > 0 { if err := createTree(child.ID, tn.Children); err != nil { return err } } } return nil } if err := createTree(root.ID, tmpl.Tree); err != nil { return nil, err } dto := toNodeDTO(root) return &dto, nil } func (a *App) Search(query string) ([]SearchResultDTO, error) { if query == "" { return []SearchResultDTO{}, nil } results, err := a.search.Search(query) if err != nil { return nil, err } out := make([]SearchResultDTO, len(results)) for i, r := range results { out[i] = SearchResultDTO{ NodeID: r.NodeID, Title: r.Title, Snippet: r.Snippet, Type: r.Type, } } return out, nil } func (a *App) PickFile() (string, error) { return wailsruntime.OpenFileDialog(a.ctx, wailsruntime.OpenDialogOptions{ Title: i18n.TF("ru", "file.pickSingle"), }) } func (a *App) PickFiles() ([]string, error) { return wailsruntime.OpenMultipleFilesDialog(a.ctx, wailsruntime.OpenDialogOptions{ Title: i18n.TF("ru", "file.pickMultiple"), }) } func (a *App) PickDirectory() (string, error) { return wailsruntime.OpenDirectoryDialog(a.ctx, wailsruntime.OpenDialogOptions{ Title: i18n.TF("ru", "file.pickDirectory"), }) } func (a *App) OpenFile(fileID string) error { return a.files.Open(fileID) } func (a *App) ReadFileText(fileID string) (string, error) { return a.files.ReadText(fileID) } func (a *App) GetFileBase64(fileID string) (string, error) { return a.files.ReadBase64(fileID) } func (a *App) OpenFolder(nodeID string) error { n, err := a.nodes.GetActive(nodeID) if err != nil { return err } dir := filepath.Join(a.vault, "spaces", n.Slug) if _, err := os.Stat(dir); os.IsNotExist(err) { dir = a.vault } cmd := exec.Command("xdg-open", dir) return cmd.Run() } func (a *App) VerstakVersion() string { return "verstak-gui/v2" }