From 91fcb966195d647672f0d6417e9b738e12e069b2 Mon Sep 17 00:00:00 2001 From: Patrick Nisble Date: Mon, 12 Jan 2026 08:37:51 +0100 Subject: [PATCH] simplify visualization --- rplugin/python3/mrpy/main.py | 96 ++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 20 deletions(-) diff --git a/rplugin/python3/mrpy/main.py b/rplugin/python3/mrpy/main.py index 1f28d2e..9121a67 100644 --- a/rplugin/python3/mrpy/main.py +++ b/rplugin/python3/mrpy/main.py @@ -1,9 +1,11 @@ from collections.abc import Callable, Sequence +from pathlib import Path +from typing import Any from pynvim import Nvim, command, plugin from pynvim.api import Buffer -from .clickup import ClickupSession +from .clickup import ClickupSession, ClickupTask from .hints import JSONData from .yaml import load, dump @@ -28,18 +30,20 @@ class MrPyPlugin: "assignees": usernames_from_objs, } - def select_task_id(self) -> None: - tasks = self.clickup.get_tasks() + def select_task_id(self, tags: set[str] | None = None) -> None: + tasks = self.clickup.get_tasks(**({"tags[]": "&tags[]=".join(tags)} if tags else {})) task_names_by_id = [ { "idx": tix + 1, "id": t.id, + "text": t.short, "name": t.name, + "tags": t.tags, "status": t.status, "is_child": bool(t.parent), "preview": { - "text": f"---\n{dump(t.showables)}---\n{t.markdown_description}", - "ft": "markdown", + "text": dump(t.showables), + "ft": "yaml", }, "action": f":Mrpy {t.id}", } @@ -70,8 +74,12 @@ class MrPyPlugin: ret[#ret + 1] = { item.name, hl } + for _, v in ipairs(item.tags) do + ret[#ret + 1] = { " #" .. v, "SnacksPickerComment" } + end + ret[#ret + 1] = { - " (#" .. item.id .. ")", + " 󰻾" .. item.id, "SnacksPickerComment" } return ret @@ -91,34 +99,36 @@ class MrPyPlugin: task = self.clickup.get_task(task_id) temp_buf: Buffer = self.nvim.api.create_buf(True, False) self.nvim.api.buf_set_name(temp_buf, f"[ClickUp] {task.name}") - self.nvim.buffers[temp_buf.number].options["filetype"] = "markdown" + self.nvim.buffers[temp_buf.number].options["filetype"] = "yaml" self.nvim.api.create_autocmd( ["BufWriteCmd"], {"buffer": temp_buf.number, "command": "MrpyPush " + str(temp_buf.number)}, ) - content = ["---"] + content = [ + f"# yaml-language-server: $schema={Path(__file__).parent.parent.parent.parent}/schema.json ", + "---", + ] content.extend( dump( task.showables, ).splitlines() ) - content.append("---") - content.extend(task.markdown_description.splitlines()) self.nvim.api.buf_set_lines(temp_buf, 0, 0, False, content) self.nvim.buffers[temp_buf.number].options["modified"] = False self.nvim.api.win_set_buf(0, temp_buf) - @command("Mrpy", nargs="?") + @command("Mrpy", nargs="*") def entry(self, args: Sequence[str] = ()) -> None: match args: case (str() as task_id,): - self.open_task_buffer(task_id) - case (): - self.select_task_id() - case _: - pass + try: + self.open_task_buffer(task_id) + except: + self.select_task_id({task_id}) + case tags: + self.select_task_id(set(tags)) @command("MrpyPush", nargs="?") def on_vbuf_write(self, args: Sequence[str] = ()) -> None: @@ -132,14 +142,60 @@ class MrPyPlugin: try: a = self.nvim.buffers[buf_no][0:-1] - _, fm, *text = "\n".join(a).split("---\n") + fm = "\n".join(a) data = load(fm) assert isinstance(data, dict) - data["markdown_description"] = "\n\n".join(text) + data["markdown_content"] = data["markdown_content"].strip() + "\n" - self.nvim.err_write(str(data) + "\n") - # self.clickup.update(data) + self.clickup.update(ClickupTask(**data)) self.nvim.buffers[buf_no].options["modified"] = False except ValueError: pass + + @command("MrpyNew", nargs=0) + def on_new_task(self) -> None: + task = ClickupTask(name="", status="backlog", markdown_content="", parent_list="") + temp_buf: Buffer = self.nvim.api.create_buf(True, False) + self.nvim.api.buf_set_name(temp_buf, f"[ClickUp] New Task") + self.nvim.buffers[temp_buf.number].options["filetype"] = "yaml" + self.nvim.api.create_autocmd( + ["BufWriteCmd"], + {"buffer": temp_buf.number, "command": "MrpyPushNew " + str(temp_buf.number)}, + ) + + content = [ + f"# yaml-language-server: $schema={Path(__file__).parent.parent.parent.parent}/schema.json ", + "---", + ] + content.extend( + dump( + task.showables, + ).splitlines() + ) + + self.nvim.api.buf_set_lines(temp_buf, 0, 0, False, content) + self.nvim.buffers[temp_buf.number].options["modified"] = False + self.nvim.api.win_set_buf(0, temp_buf) + + @command("MrpyPushNew", nargs=1) + def on_new_vbuf_write(self, buf_no: Sequence[Any] = ()) -> None: + buf_no = int(buf_no[0]) + + try: + a = self.nvim.buffers[buf_no][0:-1] + fm = "\n".join(a) + data = load(fm) + assert isinstance(data, dict) + + data["markdown_content"] = data["markdown_content"].strip() + "\n" + + new_task = ClickupTask(**data) + new_task_id = self.clickup.create(new_task) + + self.nvim.buffers[buf_no].options["modified"] = False + self.nvim.command("bdelete " + str(buf_no)) + + self.entry([new_task_id]) + except ValueError: + pass