From 9aa7b04b98d5bb0ce692675d5889ca790ede5409 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 31 May 2024 13:40:49 +0200 Subject: [PATCH] Fix UDA colors --- common/common.go | 2 ++ common/styles.go | 6 +++++ components/table/table.go | 14 +++++++++++- pages/taskEditor.go | 30 ++++++++++++------------- taskwarrior/models.go | 45 +++++++++++++++++++------------------ taskwarrior/taskwarrior.go | 41 ++++++++++++++++++++++++++++++++- test/taskchampion.sqlite3 | Bin 53248 -> 184320 bytes test/taskrc | 11 +++++++++ 8 files changed, 110 insertions(+), 39 deletions(-) diff --git a/common/common.go b/common/common.go index 30158cb..cde38ca 100644 --- a/common/common.go +++ b/common/common.go @@ -15,6 +15,7 @@ type Common struct { TW taskwarrior.TaskWarrior Keymap *Keymap Styles *Styles + Udas []string pageStack *Stack[Component] width int @@ -27,6 +28,7 @@ func NewCommon(ctx context.Context, tw taskwarrior.TaskWarrior) *Common { TW: tw, Keymap: NewKeymap(), Styles: NewStyles(tw.GetConfig()), + Udas: tw.GetUdas(), pageStack: NewStack[Component](), } diff --git a/common/styles.go b/common/styles.go index 29266ea..972e685 100644 --- a/common/styles.go +++ b/common/styles.go @@ -29,6 +29,8 @@ type Styles struct { ColumnBlurred lipgloss.Style ColumnInsert lipgloss.Style + Colors map[string]lipgloss.Style + // TODO: make color config completely dynamic to account for keyword., project., tag. and uda. colors Active lipgloss.Style Alternate lipgloss.Style @@ -114,10 +116,12 @@ func NewStyles(config *taskwarrior.TWConfig) *Styles { func parseColors(config map[string]string) *Styles { styles := Styles{} + colors := make(map[string]lipgloss.Style) for key, value := range config { if strings.HasPrefix(key, "color.") { _, colorValue, _ := strings.Cut(key, ".") + colors[colorValue] = parseColorString(value) switch colorValue { case "active": styles.Active = parseColorString(value) @@ -217,6 +221,8 @@ func parseColors(config map[string]string) *Styles { } } + styles.Colors = colors + return &styles } diff --git a/components/table/table.go b/components/table/table.go index 61a9dea..01a41d5 100644 --- a/components/table/table.go +++ b/components/table/table.go @@ -1,6 +1,7 @@ package table import ( + "fmt" "strings" "time" @@ -189,6 +190,18 @@ func (m *Model) parseRowStyles(rows taskwarrior.Tasks) []lipgloss.Style { styles[i] = m.common.Styles.Recurring.Inherit(m.styles.Cell).Margin(m.styles.Cell.GetMargin()).Padding(m.styles.Cell.GetPadding()) continue } + // TOOD: move udas to proper location + if len(m.common.Udas) > 0 { + for _, uda := range m.common.Udas { + if u, ok := task.Udas[uda]; ok { + if style, ok := m.common.Styles.Colors[fmt.Sprintf("uda.%s.%s", uda, u)]; ok { + styles[i] = style.Inherit(m.styles.Cell).Margin(m.styles.Cell.GetMargin()).Padding(m.styles.Cell.GetPadding()) + } + } + } + continue + } + // TODO: make styles optional and discard if empty if len(task.Tags) > 0 { styles[i] = m.common.Styles.Tagged.Inherit(m.styles.Cell).Margin(m.styles.Cell.GetMargin()).Padding(m.styles.Cell.GetPadding()) taskIteration: @@ -200,7 +213,6 @@ func (m *Model) parseRowStyles(rows taskwarrior.Tasks) []lipgloss.Style { } continue } - // TODO implement uda styles[i] = m.common.Styles.Base.Inherit(m.styles.Cell).Margin(m.styles.Cell.GetMargin()).Padding(m.styles.Cell.GetPadding()) } return styles diff --git a/pages/taskEditor.go b/pages/taskEditor.go index 3406327..71c1b88 100644 --- a/pages/taskEditor.go +++ b/pages/taskEditor.go @@ -3,7 +3,6 @@ package pages import ( "fmt" "log/slog" - "slices" "strings" "tasksquire/common" @@ -52,8 +51,6 @@ func NewTaskEditorPage(com *common.Common, task taskwarrior.Task) *TaskEditorPag priorityOptions := append([]string{"(none)"}, p.common.TW.GetPriorities()...) projectOptions := append([]string{"(none)"}, p.common.TW.GetProjects()...) tagOptions := p.common.TW.GetTags() - tagOptions = append(tagOptions, strings.Split(p.common.TW.GetConfig().Get("uda.tasksquire.tags.default"), ",")...) - slices.Sort(tagOptions) p.areas = map[area]tea.Model{ areaTask: NewTaskEdit(p.common, &p.task.Description, &p.task.Priority, &p.task.Project, priorityOptions, projectOptions), @@ -459,11 +456,11 @@ func NewTaskEdit(common *common.Common, description *string, priority *string, p return &t } -func (t taskEdit) Init() tea.Cmd { +func (t *taskEdit) Init() tea.Cmd { return nil } -func (t taskEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (t *taskEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case nextFieldMsg: if t.cursor == len(t.fields)-1 { @@ -490,7 +487,7 @@ func (t taskEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return t, nil } -func (t taskEdit) View() string { +func (t *taskEdit) View() string { views := make([]string, len(t.fields)) for i, field := range t.fields { views[i] = field.View() @@ -540,11 +537,11 @@ func NewTagEdit(common *common.Common, selected *[]string, options []string) *ta return &t } -func (t tagEdit) Init() tea.Cmd { +func (t *tagEdit) Init() tea.Cmd { return nil } -func (t tagEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (t *tagEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case nextFieldMsg: if t.cursor == len(t.fields)-1 { @@ -625,11 +622,11 @@ func NewTimeEdit(common *common.Common, due *string, scheduled *string, wait *st return &t } -func (t timeEdit) Init() tea.Cmd { +func (t *timeEdit) Init() tea.Cmd { return nil } -func (t timeEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (t *timeEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.(type) { case nextFieldMsg: if t.cursor == len(t.fields)-1 { @@ -655,7 +652,7 @@ func (t timeEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return t, nil } -func (t timeEdit) View() string { +func (t *timeEdit) View() string { views := make([]string, len(t.fields)) for i, field := range t.fields { views[i] = field.View() @@ -796,12 +793,15 @@ func (p *TaskEditorPage) updateTasksCmd() tea.Msg { p.task.Priority = "" } - if *p.areas[areaTask].(taskEdit).newProjectName != "" { - p.task.Project = *p.areas[areaTask].(taskEdit).newProjectName + if *(p.areas[areaTask].(*taskEdit).newProjectName) != "" { + p.task.Project = *p.areas[areaTask].(*taskEdit).newProjectName } - if *p.areas[areaTags].(tagEdit).newTagsValue != "" { - p.task.Tags = append(p.task.Tags, strings.Split(*p.areas[areaTags].(tagEdit).newTagsValue, " ")...) + if *(p.areas[areaTags].(*tagEdit).newTagsValue) != "" { + newTags := strings.Split(*p.areas[areaTags].(*tagEdit).newTagsValue, " ") + if len(newTags) > 0 { + p.task.Tags = append(p.task.Tags, newTags...) + } } // if p.additionalProject != "" { diff --git a/taskwarrior/models.go b/taskwarrior/models.go index 3636a9c..4cded98 100644 --- a/taskwarrior/models.go +++ b/taskwarrior/models.go @@ -23,28 +23,29 @@ func (a Annotation) String() string { } type Task struct { - Id int64 `json:"id,omitempty"` - Uuid string `json:"uuid,omitempty"` - Description string `json:"description,omitempty"` - Project string `json:"project"` - Priority string `json:"priority"` - Status string `json:"status,omitempty"` - Tags []string `json:"tags"` - VirtualTags []string `json:"-"` - Depends []string `json:"depends,omitempty"` - DependsIds string `json:"-"` - Urgency float32 `json:"urgency,omitempty"` - Parent string `json:"parent,omitempty"` - Due string `json:"due,omitempty"` - Wait string `json:"wait,omitempty"` - Scheduled string `json:"scheduled,omitempty"` - Until string `json:"until,omitempty"` - Start string `json:"start,omitempty"` - End string `json:"end,omitempty"` - Entry string `json:"entry,omitempty"` - Modified string `json:"modified,omitempty"` - Recur string `json:"recur,omitempty"` - Annotations []Annotation `json:"annotations,omitempty"` + Id int64 `json:"id,omitempty"` + Uuid string `json:"uuid,omitempty"` + Description string `json:"description,omitempty"` + Project string `json:"project"` + Priority string `json:"priority"` + Status string `json:"status,omitempty"` + Tags []string `json:"tags"` + VirtualTags []string `json:"-"` + Depends []string `json:"depends,omitempty"` + DependsIds string `json:"-"` + Urgency float32 `json:"urgency,omitempty"` + Parent string `json:"parent,omitempty"` + Due string `json:"due,omitempty"` + Wait string `json:"wait,omitempty"` + Scheduled string `json:"scheduled,omitempty"` + Until string `json:"until,omitempty"` + Start string `json:"start,omitempty"` + End string `json:"end,omitempty"` + Entry string `json:"entry,omitempty"` + Modified string `json:"modified,omitempty"` + Recur string `json:"recur,omitempty"` + Annotations []Annotation `json:"annotations,omitempty"` + Udas map[string]any `json:"-"` } func (t *Task) GetString(fieldWFormat string) string { diff --git a/taskwarrior/taskwarrior.go b/taskwarrior/taskwarrior.go index 4af37e9..196f0f7 100644 --- a/taskwarrior/taskwarrior.go +++ b/taskwarrior/taskwarrior.go @@ -89,6 +89,8 @@ type TaskWarrior interface { GetReport(report string) *Report GetReports() Reports + GetUdas() []string + GetTasks(report *Report, filter ...string) Tasks AddTask(task *Task) error ImportTask(task *Task) @@ -169,7 +171,15 @@ func (ts *TaskSquire) GetTasks(report *Report, filter ...string) Tasks { return nil } - for _, task := range tasks { + unstructuredTasks := make([]map[string]any, 0) + err = json.Unmarshal(output, &unstructuredTasks) + if err != nil { + slog.Error("Failed unmarshalling tasks:", err) + return nil + } + + for i, task := range tasks { + task.Udas = unstructuredTasks[i] if task.Depends != nil && len(task.Depends) > 0 { ids := make([]string, len(task.Depends)) for i, dependUuid := range task.Depends { @@ -281,10 +291,18 @@ func (ts *TaskSquire) GetTags() []string { } tags := make([]string, 0) + tagSet := make(map[string]struct{}) for _, tag := range strings.Split(string(output), "\n") { if _, ok := virtualTags[tag]; !ok && tag != "" { tags = append(tags, tag) + tagSet[tag] = struct{}{} + } + } + + for _, tag := range strings.Split(ts.config.Get("uda.tasksquire.tags.default"), ",") { + if _, ok := tagSet[tag]; !ok { + tags = append(tags, tag) } } @@ -307,6 +325,27 @@ func (ts *TaskSquire) GetReports() Reports { return ts.reports } +func (ts *TaskSquire) GetUdas() []string { + ts.mutex.Lock() + defer ts.mutex.Unlock() + + cmd := exec.Command(twBinary, append(ts.defaultArgs, "_udas")...) + output, err := cmd.CombinedOutput() + if err != nil { + slog.Error("Failed getting config:", err) + return nil + } + + udas := make([]string, 0) + for _, uda := range strings.Split(string(output), "\n") { + if uda != "" { + udas = append(udas, uda) + } + } + + return udas +} + func (ts *TaskSquire) SetContext(context *Context) error { ts.mutex.Lock() defer ts.mutex.Unlock() diff --git a/test/taskchampion.sqlite3 b/test/taskchampion.sqlite3 index df7e68ae1ead418c3557058980746e4d1bb76178..dee8e3b45ae51f9e44bc6d4f4da8244397c2943a 100644 GIT binary patch literal 184320 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

*ksIJT#PmeA}#*lfkB;!f(%Xn{G;6*%# z=fv|nVg@q_@)i$>ye13hdoa1PCTK3@Ub;Eg1YRsx z;_>GE&WS$q()ikaC2tDu)z)-$2s#+9%5_(9hlbT20QcIw03}3TPV*S@3cQM~GHJ{2 z^i8haiJDxSC?yn74tw^yc#_RjbVth-1_nqDglb)|=xVW>-_d|g$*EbPz_TbT_o49vmR%JG*J=R?D_#X3p5)lZ5pa>EY1r_M9qbNeL z6_F+#F3=$U5fzc3p-e|b&%fZ!?Vj;n_Aa-ForX)9DAL=x+1Z(SJ8$dT^^N6EwcoX$ zwL8_%)#IffOLrGPE*>p>Us#*}Fh8t(t+XmDR}S$0-}TFtxo>mTOa0VJeEf$|i+HY1 zRYBU_-diUy`y1V$gRZ_02}iHn>um&G$J;amjMF+SBRY|6=4w-Q9i;uKPql_QyyYPu zYFi-YP0^BciKpuh6&0C2$cb_*o=(KmwVmMIt{`5xQMEtVyV*Y;1PA*){F5^B#gIFW z9d3ke!r+~8MNt;daB*8f0s?H9O|n+GAuv3YHtt^qp8lQsV1;^ z;nNKtp`SdX;A6O>oBgFEUN7Qj)+lW}O&@QL`%4-SH?iGBDf=?v3#-J#V5%%dA9G5M zohu0pJ)q-m*|^P!myINmU=YuOU4#cX9xGtPJwUoe`d*FjVh$+Gsv7hnVcsUOVyWtQ z&@U2@rTlC2&)u@DHU^HP`HL1or&Jlb3&BhDsR}m#1jtR_bj3{$gPx~2fj-ELLW>{z z^^=-+;V-SsFaRfDqe9s#s$+K&PS7G2M^zn=`U^Ols)kmc@ZCJk4790%8ugZiMxdMu zC6-8?rKiSE$E;??UwF1HZ>1Z=@~Emvpl`zrCkU%;MF&`TMrI@k&1qRuf`XnUoM4rn zVgWM^w7JT`DA1Z-8*f=fdTa)D)eyjDlNYu%tH3G+4y znxIPe)nC9A0xe!U@Gu_gyIoOkx9Bn8sX{;@c+&~A5~SydTBbpd;zk9H0kzSY(HQF` zb5V%7kV%RNrx|-D{Jf^?$p#?mG}dCBsSoNOLlWfphD(zk%y=Jb9YYcxuJDO6(jeA` zy@)s|ILAanDuU*`(;DadD6+Vln}PXR^^qFhhNH4b}%ZSn1@m%B^ zpi}Yc`sh^5S{&awbCHn;FcIpQ=wOETYHksvaFx8eKE$c;>XR_>o}W}hZBm-jZ4sE~ p^XjQ1Br$lNFZ9nbkJbD;Kv4?WIsUgW0keNi-o3<(~a^dn2#eY&P$m;L9AZZA^S5`FLpuEjF+8hxD7YEA4FgD?dqFJ139$INR+H zBf+58@tn=WS8U>@D0!=%@0(WKKe)Xv#rcL*5kBQB8`TNku^eCIQ!A$-^nv1DlBXw2 z*X1+vi|}4H1ixSQs@CF+j)ocCEEu`MlpL0GdTGim%vc4ZhzF%yA%9H{!|diM`x$uw zeB(!9A{#w#>Qi$jo=4|({W^M0qj$cb=g1U~_V-4jiGe<}>qX04d}7qJKCLenR+~0i|r)<_2RQ9~o(34te zr3NTVay@s+nzZIh2*?i1Lh;IeYF~XQ>{(zxKYV++T{{f?KT56+kMgPIORzoK35^#{ zz@KSnM_8UQjcfXph1o5=WTC4yd4*W68q>9hja2`d0&BdlRgLbAuhJv zU`z7(h`R&9!$o7tc*`*5vUJ0Cw<@0JQ&rbA{tVOFH7xzJ(Ali!ELXcjjQr8IGQ9Nc z&PHR2XcV!ZeHJ6Sj<&kh)%NeQJ|hHmib_1SSK?F6`*+ZLC1P<+ZAkYfY#0iJFDa~+ z*OH=&L1QrjIGBv=Z~*;)^*;rwH4AF-}MjeQ|`mIm&3yMIHXj5RMZV0<9xj29XdCkygdLI4JrVn4o&>wiF{%n@ACv z>L!I`oa%xHH@kQzeG{4LV0VyAZ6rlxsz8d!RGt)(sdiFCrgEf+Ol=^AWSbTKti6@n S1;>}CH>zK7Tf1LL-oF9nUg-4z diff --git a/test/taskrc b/test/taskrc index 66474c5..1d62a28 100644 --- a/test/taskrc +++ b/test/taskrc @@ -4,3 +4,14 @@ context.test.read=+test context.test.write=+test context.home.read=+home context.home.write=+home + +uda.testuda.type=string +uda.testuda.label=testuda +uda.testuda.values=eins,zwei,drei + +report.next.columns=id,testuda,start.age,entry.age,depends,priority,project,tags,recur,scheduled.countdown,due.relative,until.remaining,description,urgency +report.next.context=1 +report.next.description=Most urgent tasks +report.next.filter=status:pending -WAITING +report.next.labels=ID,UDA,Active,Age,Deps,P,Project,Tag,Recur,S,Due,Until,Description,Urg +report.next.sort=urgency-