2024-06-29 01:00:39 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
// "fmt"
|
|
|
|
"github.com/charmbracelet/bubbles/list"
|
|
|
|
"github.com/charmbracelet/bubbles/textinput"
|
2024-07-10 01:35:14 +00:00
|
|
|
"github.com/emersion/go-webdav/caldav"
|
2024-06-29 01:00:39 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type model struct {
|
|
|
|
Tabs []string
|
|
|
|
// TabContent []string
|
|
|
|
LoggedIn bool
|
|
|
|
ActiveWindow string
|
|
|
|
|
|
|
|
TodayTab list.Model
|
|
|
|
TomorrowTab list.Model
|
2024-07-10 01:35:14 +00:00
|
|
|
|
|
|
|
calendarList list.Model
|
|
|
|
calendarChoice string
|
|
|
|
|
|
|
|
todoAddInputs []textinput.Model
|
|
|
|
todoAddInputsTime []textinput.Model
|
|
|
|
addTimeFocus bool
|
2024-06-29 01:00:39 +00:00
|
|
|
loginInputs []textinput.Model
|
|
|
|
focused int
|
2024-07-10 01:35:14 +00:00
|
|
|
btnFocus bool
|
2024-06-29 01:00:39 +00:00
|
|
|
err error
|
|
|
|
|
2024-07-10 01:35:14 +00:00
|
|
|
Creds Credentials
|
|
|
|
Calendars []caldav.Calendar
|
2024-06-29 01:00:39 +00:00
|
|
|
CalObjects []caldav.CalendarObject
|
|
|
|
|
2024-07-10 01:35:14 +00:00
|
|
|
errString string
|
2024-06-29 01:00:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Credentials struct {
|
2024-07-10 01:35:14 +00:00
|
|
|
URL string
|
|
|
|
Username string
|
|
|
|
Password string
|
2024-06-29 01:00:39 +00:00
|
|
|
CalendarName string
|
|
|
|
CalendarPath string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) CredentialsSave() (err error) {
|
|
|
|
|
2024-07-10 01:35:14 +00:00
|
|
|
//TODO some proper error handler in case if we cant save
|
|
|
|
err = storeCredentialsToKeyring(m.Creds.URL, m.Creds.Username, m.Creds.Password, m.Creds.CalendarPath)
|
2024-06-29 01:00:39 +00:00
|
|
|
//TODO add skip flag
|
2024-07-10 01:35:14 +00:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
2024-06-29 01:00:39 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func InitModel() model {
|
2024-07-10 01:35:14 +00:00
|
|
|
var loginInputs1 []textinput.Model = make([]textinput.Model, 3)
|
|
|
|
loginInputs1[url] = textinput.New()
|
|
|
|
loginInputs1[url].Placeholder = "https://nextcloud.example/remote.php/dav"
|
|
|
|
loginInputs1[url].Focus()
|
|
|
|
loginInputs1[url].Width = 30
|
|
|
|
loginInputs1[url].Prompt = ""
|
|
|
|
// loginInputs1[url].Validate = urlValidator //TODO
|
|
|
|
|
|
|
|
loginInputs1[login] = textinput.New()
|
|
|
|
loginInputs1[login].Placeholder = "username"
|
|
|
|
loginInputs1[login].Width = 30
|
|
|
|
loginInputs1[login].Prompt = ""
|
|
|
|
|
|
|
|
loginInputs1[pass] = textinput.New()
|
|
|
|
loginInputs1[pass].Placeholder = "MySecurePassword"
|
|
|
|
loginInputs1[pass].Width = 30
|
|
|
|
loginInputs1[pass].Prompt = ""
|
|
|
|
loginInputs1[pass].EchoMode = 1 //list.EchoPassword
|
|
|
|
|
|
|
|
var addTODOinputs []textinput.Model = make([]textinput.Model, 5)
|
|
|
|
//TODO NEW FEATURE - add config for default values in addTODO
|
|
|
|
//TODO NEW FEATURE - addTODO - add repeat field (and underlying support in caldav.go)
|
|
|
|
//TODO NEW FEATURE - addTODO - multiline input support
|
|
|
|
//TODO NEW FEATURE - addTODO - priority picker
|
|
|
|
// //TODO NEW FEATURE - addTODO - add support for subtasks
|
|
|
|
addTODOinputs[name] = textinput.New()
|
|
|
|
addTODOinputs[name].Placeholder = "Do task"
|
|
|
|
addTODOinputs[name].Focus()
|
|
|
|
addTODOinputs[name].Width = 30
|
|
|
|
addTODOinputs[name].Prompt = ""
|
|
|
|
|
|
|
|
addTODOinputs[dueDate] = textinput.New()
|
|
|
|
addTODOinputs[dueDate].Placeholder = "t/t1/12/12.08/12.08.2025" //TODO how
|
|
|
|
// ok, i want to choose from :
|
|
|
|
// no date
|
|
|
|
// today
|
|
|
|
// tomorrow
|
|
|
|
// custom - pick - https://github.com/EthanEFung/bubble-datepicker
|
|
|
|
// + time
|
|
|
|
addTODOinputs[dueDate].Width = 23
|
|
|
|
addTODOinputs[dueDate].CharLimit = 10
|
|
|
|
addTODOinputs[dueDate].Prompt = ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addTODOinputs[description] = textinput.New()
|
|
|
|
addTODOinputs[description].Placeholder = "I need to do stuff"
|
|
|
|
// addTODOinputs[pass].CharLimit = 3
|
|
|
|
addTODOinputs[description].Width = 30
|
|
|
|
addTODOinputs[description].Prompt = ""
|
|
|
|
|
|
|
|
addTODOinputs[priority] = textinput.New()
|
|
|
|
addTODOinputs[priority].Placeholder = "0-3 (unknown,low,medium,high)"
|
|
|
|
// addTODOinputs[pass].CharLimit = 3
|
|
|
|
addTODOinputs[priority].Width = 30
|
|
|
|
addTODOinputs[priority].Prompt = ""
|
|
|
|
// suggestions := []string{"0","1","2","a3"}
|
|
|
|
// addTODOinputs[priority].SetSuggestions(suggestions)
|
|
|
|
|
|
|
|
addTODOinputs[alarmOffset] = textinput.New()
|
|
|
|
addTODOinputs[alarmOffset].Placeholder = "1d/1h/1m"
|
|
|
|
// addTODOinputs[pass].CharLimit = 3
|
|
|
|
addTODOinputs[alarmOffset].Width = 30
|
|
|
|
addTODOinputs[alarmOffset].Prompt = ""
|
|
|
|
|
|
|
|
|
|
|
|
var addTODOinputsTime []textinput.Model = make([]textinput.Model, 2)
|
|
|
|
addTODOinputsTime[dueTimeHour] = textinput.New()
|
|
|
|
addTODOinputsTime[dueTimeHour].Placeholder = "14" //TODO how
|
|
|
|
addTODOinputsTime[dueTimeHour].Width = 2
|
|
|
|
addTODOinputsTime[dueTimeHour].CharLimit = 2
|
|
|
|
addTODOinputsTime[dueTimeHour].Prompt = ""
|
|
|
|
|
|
|
|
addTODOinputsTime[dueTimeMinute] = textinput.New()
|
|
|
|
addTODOinputsTime[dueTimeMinute].Placeholder = "00" //TODO how
|
|
|
|
addTODOinputsTime[dueTimeMinute].Width = 2
|
|
|
|
addTODOinputsTime[dueTimeMinute].CharLimit = 2
|
|
|
|
addTODOinputsTime[dueTimeMinute].Prompt = ""
|
2024-06-29 01:00:39 +00:00
|
|
|
|
|
|
|
output := model{
|
|
|
|
Tabs: []string{"Today", "Tomorrow", "Add"},
|
2024-07-10 01:35:14 +00:00
|
|
|
loginInputs: loginInputs1,
|
2024-06-29 01:00:39 +00:00
|
|
|
focused: 0,
|
|
|
|
err: nil,
|
2024-07-10 01:35:14 +00:00
|
|
|
todoAddInputs: addTODOinputs,
|
|
|
|
todoAddInputsTime: addTODOinputsTime,
|
2024-06-29 01:00:39 +00:00
|
|
|
// Creds: Credentials{"test","test","test","test","test"},
|
|
|
|
// TabContent: []string{"ERROR?", "Mascara Tab", "Foundation Tab"},
|
|
|
|
}
|
|
|
|
return output
|
|
|
|
}
|