Fix error 500 and add project-id configuration

- Add project-id configuration parameter to widget (defaults to 1)
- Use configured project ID instead of hardcoded value
- Fix sound file path to use proper static asset resolver
- Update documentation with project-id configuration instructions
- Add section explaining how to find project ID in Vikunja

Co-authored-by: JanDziaslo <184263826+JanDziaslo@users.noreply.github.com>
pull/878/head
copilot-swe-agent[bot] 2025-11-17 12:50:39 +07:00
parent da3dd629c3
commit 9200a72e1c
3 changed files with 25 additions and 4 deletions

@ -10,6 +10,7 @@ Aby skonfigurować widget Vikunja, dodaj następującą konfigurację do swojego
- type: vikunja
url: https://twoja-instancja-vikunja.pl # URL do Twojej instancji Vikunja
token: twoj-token-api # Token API z Vikunja
project-id: 1 # ID projektu do tworzenia nowych zadań (opcjonalnie, domyślnie 1)
limit: 10 # Maksymalna liczba wyświetlanych zadań (opcjonalnie)
```
@ -21,6 +22,15 @@ Aby skonfigurować widget Vikunja, dodaj następującą konfigurację do swojego
4. Wygeneruj nowy token z odpowiednimi uprawnieniami
5. Skopiuj token do konfiguracji widgetu
### Znajdowanie ID projektu
Aby znaleźć ID projektu w Vikunja:
1. Otwórz projekt w przeglądarce
2. Sprawdź URL - ID projektu znajduje się w adresie (np. `/projects/5` oznacza ID projektu = 5)
3. Użyj tego ID w konfiguracji `project-id`
**Uwaga**: Parametr `project-id` określa, w którym projekcie będą tworzone nowe zadania. Jeśli masz wiele projektów, ustaw ID projektu, w którym chcesz tworzyć zadania. Domyślnie używany jest projekt o ID 1.
## Funkcje widgetu
### 1. Wyświetlanie zadań

@ -125,7 +125,7 @@
<!-- Audio element for task completion sound -->
<audio id="vikunja-completion-sound" preload="auto">
<source src="/static/sound/pop.mp3" type="audio/mpeg">
<source src="{{ .GetSoundPath }}" type="audio/mpeg">
</audio>
{{ end }}

@ -20,6 +20,7 @@ type vikunjaWidget struct {
URL string `yaml:"url"`
Token string `yaml:"token"`
Limit int `yaml:"limit"`
ProjectID int `yaml:"project-id"` // Project ID for creating new tasks
Tasks []vikunjaTask
}
@ -70,6 +71,10 @@ func (widget *vikunjaWidget) initialize() error {
widget.Limit = 10
}
if widget.ProjectID <= 0 {
widget.ProjectID = 1 // Default to project 1 if not specified
}
return nil
}
@ -201,6 +206,13 @@ func (widget *vikunjaWidget) Render() template.HTML {
return widget.renderTemplate(widget, vikunjaWidgetTemplate)
}
func (widget *vikunjaWidget) GetSoundPath() string {
if widget.Providers != nil && widget.Providers.assetResolver != nil {
return widget.Providers.assetResolver("sound/pop.mp3")
}
return "/static/sound/pop.mp3"
}
func (widget *vikunjaWidget) completeTask(taskID int) error {
url := fmt.Sprintf("%s/api/v1/tasks/%d", widget.URL, taskID)
@ -379,9 +391,8 @@ func (widget *vikunjaWidget) fetchAllLabels() ([]vikunjaAPILabel, error) {
}
func (widget *vikunjaWidget) createTask(title string, dueDate string, labelIDs []int) (*vikunjaAPITask, error) {
// Use the same endpoint format as the Vikunja web UI
// Create task in the default project (project ID 1)
url := widget.URL + "/api/v1/projects/1/tasks"
// Use the configured project ID for creating tasks
url := fmt.Sprintf("%s/api/v1/projects/%d/tasks", widget.URL, widget.ProjectID)
payload := map[string]interface{}{
"title": title,