feat(ui): add content editor components for skills and thoughts
Some checks failed
CI / build-and-test (push) Failing after -31m24s
Some checks failed
CI / build-and-test (push) Failing after -31m24s
* Implement ContentEditorField for inline editing of content * Create ContentEditorModal for editing content in a modal * Introduce FormerShell for managing forms related to skills and thoughts * Enhance SkillsPage and ThoughtsPage with new components for better content management
This commit is contained in:
@@ -1,137 +1,137 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
// import (
|
||||
// "context"
|
||||
// "fmt"
|
||||
// "strings"
|
||||
// "time"
|
||||
|
||||
"git.warky.dev/wdevs/amcs/internal/generatedmodels"
|
||||
ext "git.warky.dev/wdevs/amcs/internal/types"
|
||||
)
|
||||
// "git.warky.dev/wdevs/amcs/internal/generatedmodels"
|
||||
// ext "git.warky.dev/wdevs/amcs/internal/types"
|
||||
// )
|
||||
|
||||
func (db *DB) AddMaintenanceTask(ctx context.Context, t ext.MaintenanceTask) (ext.MaintenanceTask, error) {
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
insert into maintenance_tasks (name, category, frequency_days, next_due, priority, notes)
|
||||
values ($1, $2, $3, $4, $5, $6)
|
||||
returning id, created_at, updated_at
|
||||
`, t.Name, nullStr(t.Category), t.FrequencyDays, t.NextDue, t.Priority, nullStr(t.Notes))
|
||||
// func (db *DB) AddMaintenanceTask(ctx context.Context, t ext.MaintenanceTask) (ext.MaintenanceTask, error) {
|
||||
// row := db.pool.QueryRow(ctx, `
|
||||
// insert into maintenance_tasks (name, category, frequency_days, next_due, priority, notes)
|
||||
// values ($1, $2, $3, $4, $5, $6)
|
||||
// returning id, created_at, updated_at
|
||||
// `, t.Name, nullStr(t.Category), t.FrequencyDays, t.NextDue, t.Priority, nullStr(t.Notes))
|
||||
|
||||
created := t
|
||||
var model generatedmodels.ModelPublicMaintenanceTasks
|
||||
if err := row.Scan(&model.ID, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return ext.MaintenanceTask{}, fmt.Errorf("insert maintenance task: %w", err)
|
||||
}
|
||||
created.ID = model.ID.UUID()
|
||||
created.CreatedAt = model.CreatedAt.Time()
|
||||
created.UpdatedAt = model.UpdatedAt.Time()
|
||||
return created, nil
|
||||
}
|
||||
// created := t
|
||||
// var model generatedmodels.ModelPublicMaintenanceTasks
|
||||
// if err := row.Scan(&model.ID, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
// return ext.MaintenanceTask{}, fmt.Errorf("insert maintenance task: %w", err)
|
||||
// }
|
||||
// created.ID = model.ID.UUID()
|
||||
// created.CreatedAt = model.CreatedAt.Time()
|
||||
// created.UpdatedAt = model.UpdatedAt.Time()
|
||||
// return created, nil
|
||||
// }
|
||||
|
||||
func (db *DB) LogMaintenance(ctx context.Context, log ext.MaintenanceLog) (ext.MaintenanceLog, error) {
|
||||
completedAt := log.CompletedAt
|
||||
if completedAt.IsZero() {
|
||||
completedAt = time.Now()
|
||||
}
|
||||
// func (db *DB) LogMaintenance(ctx context.Context, log ext.MaintenanceLog) (ext.MaintenanceLog, error) {
|
||||
// completedAt := log.CompletedAt
|
||||
// if completedAt.IsZero() {
|
||||
// completedAt = time.Now()
|
||||
// }
|
||||
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
insert into maintenance_logs (task_id, completed_at, performed_by, cost, notes, next_action)
|
||||
values ($1, $2, $3, $4, $5, $6)
|
||||
returning id
|
||||
`, log.TaskID, completedAt, nullStr(log.PerformedBy), log.Cost, nullStr(log.Notes), nullStr(log.NextAction))
|
||||
// row := db.pool.QueryRow(ctx, `
|
||||
// insert into maintenance_logs (task_id, completed_at, performed_by, cost, notes, next_action)
|
||||
// values ($1, $2, $3, $4, $5, $6)
|
||||
// returning id
|
||||
// `, log.TaskID, completedAt, nullStr(log.PerformedBy), log.Cost, nullStr(log.Notes), nullStr(log.NextAction))
|
||||
|
||||
created := log
|
||||
created.CompletedAt = completedAt
|
||||
var model generatedmodels.ModelPublicMaintenanceLogs
|
||||
if err := row.Scan(&model.ID); err != nil {
|
||||
return ext.MaintenanceLog{}, fmt.Errorf("insert maintenance log: %w", err)
|
||||
}
|
||||
created.ID = model.ID.UUID()
|
||||
return created, nil
|
||||
}
|
||||
// created := log
|
||||
// created.CompletedAt = completedAt
|
||||
// var model generatedmodels.ModelPublicMaintenanceLogs
|
||||
// if err := row.Scan(&model.ID); err != nil {
|
||||
// return ext.MaintenanceLog{}, fmt.Errorf("insert maintenance log: %w", err)
|
||||
// }
|
||||
// created.ID = model.ID.UUID()
|
||||
// return created, nil
|
||||
// }
|
||||
|
||||
func (db *DB) GetUpcomingMaintenance(ctx context.Context, daysAhead int) ([]ext.MaintenanceTask, error) {
|
||||
if daysAhead <= 0 {
|
||||
daysAhead = 30
|
||||
}
|
||||
cutoff := time.Now().Add(time.Duration(daysAhead) * 24 * time.Hour)
|
||||
// func (db *DB) GetUpcomingMaintenance(ctx context.Context, daysAhead int) ([]ext.MaintenanceTask, error) {
|
||||
// if daysAhead <= 0 {
|
||||
// daysAhead = 30
|
||||
// }
|
||||
// cutoff := time.Now().Add(time.Duration(daysAhead) * 24 * time.Hour)
|
||||
|
||||
rows, err := db.pool.Query(ctx, `
|
||||
select id, name, category, frequency_days, last_completed, next_due, priority, notes, created_at, updated_at
|
||||
from maintenance_tasks
|
||||
where next_due <= $1 or next_due is null
|
||||
order by next_due asc nulls last, priority desc
|
||||
`, cutoff)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get upcoming maintenance: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
// rows, err := db.pool.Query(ctx, `
|
||||
// select id, name, category, frequency_days, last_completed, next_due, priority, notes, created_at, updated_at
|
||||
// from maintenance_tasks
|
||||
// where next_due <= $1 or next_due is null
|
||||
// order by next_due asc nulls last, priority desc
|
||||
// `, cutoff)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("get upcoming maintenance: %w", err)
|
||||
// }
|
||||
// defer rows.Close()
|
||||
|
||||
tasks := make([]ext.MaintenanceTask, 0)
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicMaintenanceTasks
|
||||
if err := rows.Scan(&model.ID, &model.Name, &model.Category, &model.FrequencyDays, &model.LastCompleted, &model.NextDue, &model.Priority, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return nil, fmt.Errorf("scan maintenance task: %w", err)
|
||||
}
|
||||
tasks = append(tasks, maintenanceTaskFromModel(model))
|
||||
}
|
||||
return tasks, rows.Err()
|
||||
}
|
||||
// tasks := make([]ext.MaintenanceTask, 0)
|
||||
// for rows.Next() {
|
||||
// var model generatedmodels.ModelPublicMaintenanceTasks
|
||||
// if err := rows.Scan(&model.ID, &model.Name, &model.Category, &model.FrequencyDays, &model.LastCompleted, &model.NextDue, &model.Priority, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
// return nil, fmt.Errorf("scan maintenance task: %w", err)
|
||||
// }
|
||||
// tasks = append(tasks, maintenanceTaskFromModel(model))
|
||||
// }
|
||||
// return tasks, rows.Err()
|
||||
// }
|
||||
|
||||
func (db *DB) SearchMaintenanceHistory(ctx context.Context, query, category string, start, end *time.Time) ([]ext.MaintenanceLogWithTask, error) {
|
||||
args := []any{}
|
||||
conditions := []string{}
|
||||
// func (db *DB) SearchMaintenanceHistory(ctx context.Context, query, category string, start, end *time.Time) ([]ext.MaintenanceLogWithTask, error) {
|
||||
// args := []any{}
|
||||
// conditions := []string{}
|
||||
|
||||
if q := strings.TrimSpace(query); q != "" {
|
||||
args = append(args, "%"+q+"%")
|
||||
conditions = append(conditions, fmt.Sprintf("(mt.name ILIKE $%d OR ml.notes ILIKE $%d)", len(args), len(args)))
|
||||
}
|
||||
if c := strings.TrimSpace(category); c != "" {
|
||||
args = append(args, c)
|
||||
conditions = append(conditions, fmt.Sprintf("mt.category = $%d", len(args)))
|
||||
}
|
||||
if start != nil {
|
||||
args = append(args, *start)
|
||||
conditions = append(conditions, fmt.Sprintf("ml.completed_at >= $%d", len(args)))
|
||||
}
|
||||
if end != nil {
|
||||
args = append(args, *end)
|
||||
conditions = append(conditions, fmt.Sprintf("ml.completed_at <= $%d", len(args)))
|
||||
}
|
||||
// if q := strings.TrimSpace(query); q != "" {
|
||||
// args = append(args, "%"+q+"%")
|
||||
// conditions = append(conditions, fmt.Sprintf("(mt.name ILIKE $%d OR ml.notes ILIKE $%d)", len(args), len(args)))
|
||||
// }
|
||||
// if c := strings.TrimSpace(category); c != "" {
|
||||
// args = append(args, c)
|
||||
// conditions = append(conditions, fmt.Sprintf("mt.category = $%d", len(args)))
|
||||
// }
|
||||
// if start != nil {
|
||||
// args = append(args, *start)
|
||||
// conditions = append(conditions, fmt.Sprintf("ml.completed_at >= $%d", len(args)))
|
||||
// }
|
||||
// if end != nil {
|
||||
// args = append(args, *end)
|
||||
// conditions = append(conditions, fmt.Sprintf("ml.completed_at <= $%d", len(args)))
|
||||
// }
|
||||
|
||||
q := `
|
||||
select ml.id, ml.task_id, ml.completed_at, ml.performed_by, ml.cost, ml.notes, ml.next_action,
|
||||
mt.name, mt.category
|
||||
from maintenance_logs ml
|
||||
join maintenance_tasks mt on mt.id = ml.task_id
|
||||
`
|
||||
if len(conditions) > 0 {
|
||||
q += " where " + strings.Join(conditions, " and ")
|
||||
}
|
||||
q += " order by ml.completed_at desc"
|
||||
// q := `
|
||||
// select ml.id, ml.task_id, ml.completed_at, ml.performed_by, ml.cost, ml.notes, ml.next_action,
|
||||
// mt.name, mt.category
|
||||
// from maintenance_logs ml
|
||||
// join maintenance_tasks mt on mt.id = ml.task_id
|
||||
// `
|
||||
// if len(conditions) > 0 {
|
||||
// q += " where " + strings.Join(conditions, " and ")
|
||||
// }
|
||||
// q += " order by ml.completed_at desc"
|
||||
|
||||
rows, err := db.pool.Query(ctx, q, args...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("search maintenance history: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
// rows, err := db.pool.Query(ctx, q, args...)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("search maintenance history: %w", err)
|
||||
// }
|
||||
// defer rows.Close()
|
||||
|
||||
var logs []ext.MaintenanceLogWithTask
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicMaintenanceLogs
|
||||
var taskName, taskCategory string
|
||||
if err := rows.Scan(
|
||||
&model.ID, &model.TaskID, &model.CompletedAt, &model.PerformedBy, &model.Cost, &model.Notes, &model.NextAction,
|
||||
&taskName, &taskCategory,
|
||||
); err != nil {
|
||||
return nil, fmt.Errorf("scan maintenance log: %w", err)
|
||||
}
|
||||
l := ext.MaintenanceLogWithTask{
|
||||
MaintenanceLog: maintenanceLogFromModel(model),
|
||||
TaskName: taskName,
|
||||
TaskCategory: taskCategory,
|
||||
}
|
||||
logs = append(logs, l)
|
||||
}
|
||||
return logs, rows.Err()
|
||||
}
|
||||
// var logs []ext.MaintenanceLogWithTask
|
||||
// for rows.Next() {
|
||||
// var model generatedmodels.ModelPublicMaintenanceLogs
|
||||
// var taskName, taskCategory string
|
||||
// if err := rows.Scan(
|
||||
// &model.ID, &model.TaskID, &model.CompletedAt, &model.PerformedBy, &model.Cost, &model.Notes, &model.NextAction,
|
||||
// &taskName, &taskCategory,
|
||||
// ); err != nil {
|
||||
// return nil, fmt.Errorf("scan maintenance log: %w", err)
|
||||
// }
|
||||
// l := ext.MaintenanceLogWithTask{
|
||||
// MaintenanceLog: maintenanceLogFromModel(model),
|
||||
// TaskName: taskName,
|
||||
// TaskCategory: taskCategory,
|
||||
// }
|
||||
// logs = append(logs, l)
|
||||
// }
|
||||
// return logs, rows.Err()
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user