From 1f404fdb78b9254379848086fba222f6317ea339 Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Sun, 12 Jun 2022 17:47:33 +0530 Subject: added functionality to update status --- ui/actions.go | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui/input.go | 46 ++++++++++++++++++++++++++++++++++ ui/search.go | 4 +-- ui/status.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 ui/actions.go create mode 100644 ui/input.go create mode 100644 ui/status.go (limited to 'ui') diff --git a/ui/actions.go b/ui/actions.go new file mode 100644 index 0000000..77afae7 --- /dev/null +++ b/ui/actions.go @@ -0,0 +1,80 @@ +/* +macli - Unofficial CLI-Based MyAnimeList Client +Copyright © 2022 Vidhu Kant Sharma + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +package ui + +import ( + "strings" + "log" + p "github.com/manifoldco/promptui" + // mal "github.com/MikunoNaka/macli/mal" +) + +type Action struct { + Label string + Description string + Method func(int) +} + +// only search animes probably only now +func ActionMenu() func(animeId int) { + // TODO: load promptLength from config + promptLength := 5 + + options := []Action { + {"Set Status", "Set status for an anime (watching, dropped, etc)", StatusMenu}, + {"Set Episodes", "Set number of episodes watched", StatusMenu}, + {"Set Score", "Set score", StatusMenu}, + {"Set Rewatching", "Set if rewatching", StatusMenu}, + {"Set Times Rewatched", "Set number of times rewatched", StatusMenu}, + } + + template := &p.SelectTemplates { + Label: "{{ .Label }}", + Active: "{{ .Label | magenta }} {{ .Description | faint }}", + Inactive: "{{ .Label }}", + Selected: "{{ .Label }}", + Details: ` +------------------- +{{ .Description }} +`, + } + + // returns true if input == anime title + searcher := func(input string, index int) bool { + action := strings.Replace(strings.ToLower(options[index].Label), " ", "", -1) + input = strings.Replace(strings.ToLower(input), " ", "", -1) + return strings.Contains(action, input) + } + + prompt := p.Select { + Label: "Select Action: ", + Items: options, + Templates: template, + Searcher: searcher, + Size: promptLength, + } + + res, _, err := prompt.Run() + if err != nil { + log.Println(err) + return nil + } + + return options[res].Method +} diff --git a/ui/input.go b/ui/input.go new file mode 100644 index 0000000..bd7306b --- /dev/null +++ b/ui/input.go @@ -0,0 +1,46 @@ +/* +macli - Unofficial CLI-Based MyAnimeList Client +Copyright © 2022 Vidhu Kant Sharma + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +package ui + +import ( + "errors" + "log" + p "github.com/manifoldco/promptui" +) + +func TextInput(label, errMessage string) string { + validate := func(input string) error { + if input == "" { + return errors.New(errMessage) + } + return nil + } + + prompt := p.Prompt { + Label: label, + Validate: validate, + } + + res, err := prompt.Run() + if err != nil { + log.Fatal("Failed to run TextInput Prompt.") + } + + return res +} diff --git a/ui/search.go b/ui/search.go index b884faf..ee25604 100644 --- a/ui/search.go +++ b/ui/search.go @@ -33,7 +33,7 @@ func SearchAndGetID(label, searchString string) int { animes := mal.SearchAnime(searchString) template := &p.SelectTemplates { - Label: "{{ . }}?", + Label: "{{ . }}", Active: "{{ .Title | magenta }}", Inactive: "{{ .Title }}", Selected: "{{ .Title }}", @@ -47,7 +47,7 @@ More Details To Be Added Later searcher := func(input string, index int) bool { title := strings.Replace(strings.ToLower(animes[index].Title), " ", "", -1) input = strings.Replace(strings.ToLower(input), " ", "", -1) - return strings.Contains(title, title) + return strings.Contains(title, input) } prompt := p.Select { diff --git a/ui/status.go b/ui/status.go new file mode 100644 index 0000000..762bfd8 --- /dev/null +++ b/ui/status.go @@ -0,0 +1,72 @@ +/* +macli - Unofficial CLI-Based MyAnimeList Client +Copyright © 2022 Vidhu Kant Sharma + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +package ui + +import ( + "strings" + "log" + "github.com/MikunoNaka/macli/mal" + p "github.com/manifoldco/promptui" +) + +type StatusOption struct { + Label string + Status string +} + +// only search animes probably only now +func StatusMenu(animeId int) { + options := []StatusOption { + {"Watching", "watching"}, + {"Completed", "completed"}, + {"On Hold", "on_hold"}, + {"Dropped", "dropped"}, + {"Plan to Watch", "plan_to_watch"}, + } + + template := &p.SelectTemplates { + Label: "{{ .Label }}", + Active: "{{ .Label | magenta }}", + Inactive: "{{ .Label }}", + Selected: "{{ .Label }}", + } + + // returns true if input == anime title + searcher := func(input string, index int) bool { + status := strings.Replace(strings.ToLower(options[index].Label), " ", "", -1) + input = strings.Replace(strings.ToLower(input), " ", "", -1) + return strings.Contains(status, input) + } + + prompt := p.Select { + Label: "Set Status:", + Items: options, + Templates: template, + Searcher: searcher, + Size: 5, + } + + res, _, err := prompt.Run() + if err != nil { + log.Println(err) + return + } + + mal.SetStatus(animeId, options[res].Status) +} -- cgit v1.2.3