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,133 +1,133 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
// import (
|
||||
// "context"
|
||||
// "encoding/json"
|
||||
// "fmt"
|
||||
// "strings"
|
||||
|
||||
"github.com/google/uuid"
|
||||
// "github.com/google/uuid"
|
||||
|
||||
"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) AddHouseholdItem(ctx context.Context, item ext.HouseholdItem) (ext.HouseholdItem, error) {
|
||||
details, err := json.Marshal(item.Details)
|
||||
if err != nil {
|
||||
return ext.HouseholdItem{}, fmt.Errorf("marshal details: %w", err)
|
||||
}
|
||||
// func (db *DB) AddHouseholdItem(ctx context.Context, item ext.HouseholdItem) (ext.HouseholdItem, error) {
|
||||
// details, err := json.Marshal(item.Details)
|
||||
// if err != nil {
|
||||
// return ext.HouseholdItem{}, fmt.Errorf("marshal details: %w", err)
|
||||
// }
|
||||
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
insert into household_items (name, category, location, details, notes)
|
||||
values ($1, $2, $3, $4::jsonb, $5)
|
||||
returning id, created_at, updated_at
|
||||
`, item.Name, nullStr(item.Category), nullStr(item.Location), details, nullStr(item.Notes))
|
||||
// row := db.pool.QueryRow(ctx, `
|
||||
// insert into household_items (name, category, location, details, notes)
|
||||
// values ($1, $2, $3, $4::jsonb, $5)
|
||||
// returning id, created_at, updated_at
|
||||
// `, item.Name, nullStr(item.Category), nullStr(item.Location), details, nullStr(item.Notes))
|
||||
|
||||
created := item
|
||||
var model generatedmodels.ModelPublicHouseholdItems
|
||||
if err := row.Scan(&model.ID, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return ext.HouseholdItem{}, fmt.Errorf("insert household item: %w", err)
|
||||
}
|
||||
created.ID = model.ID.UUID()
|
||||
created.CreatedAt = model.CreatedAt.Time()
|
||||
created.UpdatedAt = model.UpdatedAt.Time()
|
||||
return created, nil
|
||||
}
|
||||
// created := item
|
||||
// var model generatedmodels.ModelPublicHouseholdItems
|
||||
// if err := row.Scan(&model.ID, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
// return ext.HouseholdItem{}, fmt.Errorf("insert household item: %w", err)
|
||||
// }
|
||||
// created.ID = model.ID.UUID()
|
||||
// created.CreatedAt = model.CreatedAt.Time()
|
||||
// created.UpdatedAt = model.UpdatedAt.Time()
|
||||
// return created, nil
|
||||
// }
|
||||
|
||||
func (db *DB) SearchHouseholdItems(ctx context.Context, query, category, location string) ([]ext.HouseholdItem, error) {
|
||||
args := []any{}
|
||||
conditions := []string{}
|
||||
// func (db *DB) SearchHouseholdItems(ctx context.Context, query, category, location string) ([]ext.HouseholdItem, error) {
|
||||
// args := []any{}
|
||||
// conditions := []string{}
|
||||
|
||||
if q := strings.TrimSpace(query); q != "" {
|
||||
args = append(args, "%"+q+"%")
|
||||
conditions = append(conditions, fmt.Sprintf("(name ILIKE $%d OR notes ILIKE $%d)", len(args), len(args)))
|
||||
}
|
||||
if c := strings.TrimSpace(category); c != "" {
|
||||
args = append(args, c)
|
||||
conditions = append(conditions, fmt.Sprintf("category = $%d", len(args)))
|
||||
}
|
||||
if l := strings.TrimSpace(location); l != "" {
|
||||
args = append(args, "%"+l+"%")
|
||||
conditions = append(conditions, fmt.Sprintf("location ILIKE $%d", len(args)))
|
||||
}
|
||||
// if q := strings.TrimSpace(query); q != "" {
|
||||
// args = append(args, "%"+q+"%")
|
||||
// conditions = append(conditions, fmt.Sprintf("(name ILIKE $%d OR notes ILIKE $%d)", len(args), len(args)))
|
||||
// }
|
||||
// if c := strings.TrimSpace(category); c != "" {
|
||||
// args = append(args, c)
|
||||
// conditions = append(conditions, fmt.Sprintf("category = $%d", len(args)))
|
||||
// }
|
||||
// if l := strings.TrimSpace(location); l != "" {
|
||||
// args = append(args, "%"+l+"%")
|
||||
// conditions = append(conditions, fmt.Sprintf("location ILIKE $%d", len(args)))
|
||||
// }
|
||||
|
||||
q := `select id, name, category, location, details, notes, created_at, updated_at from household_items`
|
||||
if len(conditions) > 0 {
|
||||
q += " where " + strings.Join(conditions, " and ")
|
||||
}
|
||||
q += " order by name"
|
||||
// q := `select id, name, category, location, details, notes, created_at, updated_at from household_items`
|
||||
// if len(conditions) > 0 {
|
||||
// q += " where " + strings.Join(conditions, " and ")
|
||||
// }
|
||||
// q += " order by name"
|
||||
|
||||
rows, err := db.pool.Query(ctx, q, args...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("search household items: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
// rows, err := db.pool.Query(ctx, q, args...)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("search household items: %w", err)
|
||||
// }
|
||||
// defer rows.Close()
|
||||
|
||||
var items []ext.HouseholdItem
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicHouseholdItems
|
||||
if err := rows.Scan(&model.ID, &model.Name, &model.Category, &model.Location, &model.Details, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return nil, fmt.Errorf("scan household item: %w", err)
|
||||
}
|
||||
items = append(items, householdItemFromModel(model))
|
||||
}
|
||||
return items, rows.Err()
|
||||
}
|
||||
// var items []ext.HouseholdItem
|
||||
// for rows.Next() {
|
||||
// var model generatedmodels.ModelPublicHouseholdItems
|
||||
// if err := rows.Scan(&model.ID, &model.Name, &model.Category, &model.Location, &model.Details, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
// return nil, fmt.Errorf("scan household item: %w", err)
|
||||
// }
|
||||
// items = append(items, householdItemFromModel(model))
|
||||
// }
|
||||
// return items, rows.Err()
|
||||
// }
|
||||
|
||||
func (db *DB) GetHouseholdItem(ctx context.Context, id uuid.UUID) (ext.HouseholdItem, error) {
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
select id, name, category, location, details, notes, created_at, updated_at
|
||||
from household_items where id = $1
|
||||
`, id)
|
||||
// func (db *DB) GetHouseholdItem(ctx context.Context, id uuid.UUID) (ext.HouseholdItem, error) {
|
||||
// row := db.pool.QueryRow(ctx, `
|
||||
// select id, name, category, location, details, notes, created_at, updated_at
|
||||
// from household_items where id = $1
|
||||
// `, id)
|
||||
|
||||
var model generatedmodels.ModelPublicHouseholdItems
|
||||
if err := row.Scan(&model.ID, &model.Name, &model.Category, &model.Location, &model.Details, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return ext.HouseholdItem{}, fmt.Errorf("get household item: %w", err)
|
||||
}
|
||||
return householdItemFromModel(model), nil
|
||||
}
|
||||
// var model generatedmodels.ModelPublicHouseholdItems
|
||||
// if err := row.Scan(&model.ID, &model.Name, &model.Category, &model.Location, &model.Details, &model.Notes, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
// return ext.HouseholdItem{}, fmt.Errorf("get household item: %w", err)
|
||||
// }
|
||||
// return householdItemFromModel(model), nil
|
||||
// }
|
||||
|
||||
func (db *DB) AddVendor(ctx context.Context, v ext.HouseholdVendor) (ext.HouseholdVendor, error) {
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
insert into household_vendors (name, service_type, phone, email, website, notes, rating, last_used)
|
||||
values ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
returning id, created_at
|
||||
`, v.Name, nullStr(v.ServiceType), nullStr(v.Phone), nullStr(v.Email),
|
||||
nullStr(v.Website), nullStr(v.Notes), v.Rating, v.LastUsed)
|
||||
// func (db *DB) AddVendor(ctx context.Context, v ext.HouseholdVendor) (ext.HouseholdVendor, error) {
|
||||
// row := db.pool.QueryRow(ctx, `
|
||||
// insert into household_vendors (name, service_type, phone, email, website, notes, rating, last_used)
|
||||
// values ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
// returning id, created_at
|
||||
// `, v.Name, nullStr(v.ServiceType), nullStr(v.Phone), nullStr(v.Email),
|
||||
// nullStr(v.Website), nullStr(v.Notes), v.Rating, v.LastUsed)
|
||||
|
||||
created := v
|
||||
var model generatedmodels.ModelPublicHouseholdVendors
|
||||
if err := row.Scan(&model.ID, &model.CreatedAt); err != nil {
|
||||
return ext.HouseholdVendor{}, fmt.Errorf("insert vendor: %w", err)
|
||||
}
|
||||
created.ID = model.ID.UUID()
|
||||
created.CreatedAt = model.CreatedAt.Time()
|
||||
return created, nil
|
||||
}
|
||||
// created := v
|
||||
// var model generatedmodels.ModelPublicHouseholdVendors
|
||||
// if err := row.Scan(&model.ID, &model.CreatedAt); err != nil {
|
||||
// return ext.HouseholdVendor{}, fmt.Errorf("insert vendor: %w", err)
|
||||
// }
|
||||
// created.ID = model.ID.UUID()
|
||||
// created.CreatedAt = model.CreatedAt.Time()
|
||||
// return created, nil
|
||||
// }
|
||||
|
||||
func (db *DB) ListVendors(ctx context.Context, serviceType string) ([]ext.HouseholdVendor, error) {
|
||||
args := []any{}
|
||||
q := `select id, name, service_type, phone, email, website, notes, rating, last_used, created_at from household_vendors`
|
||||
if st := strings.TrimSpace(serviceType); st != "" {
|
||||
args = append(args, st)
|
||||
q += " where service_type = $1"
|
||||
}
|
||||
q += " order by name"
|
||||
// func (db *DB) ListVendors(ctx context.Context, serviceType string) ([]ext.HouseholdVendor, error) {
|
||||
// args := []any{}
|
||||
// q := `select id, name, service_type, phone, email, website, notes, rating, last_used, created_at from household_vendors`
|
||||
// if st := strings.TrimSpace(serviceType); st != "" {
|
||||
// args = append(args, st)
|
||||
// q += " where service_type = $1"
|
||||
// }
|
||||
// q += " order by name"
|
||||
|
||||
rows, err := db.pool.Query(ctx, q, args...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("list vendors: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
// rows, err := db.pool.Query(ctx, q, args...)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("list vendors: %w", err)
|
||||
// }
|
||||
// defer rows.Close()
|
||||
|
||||
var vendors []ext.HouseholdVendor
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicHouseholdVendors
|
||||
if err := rows.Scan(&model.ID, &model.Name, &model.ServiceType, &model.Phone, &model.Email, &model.Website, &model.Notes, &model.Rating, &model.LastUsed, &model.CreatedAt); err != nil {
|
||||
return nil, fmt.Errorf("scan vendor: %w", err)
|
||||
}
|
||||
vendors = append(vendors, householdVendorFromModel(model))
|
||||
}
|
||||
return vendors, rows.Err()
|
||||
}
|
||||
// var vendors []ext.HouseholdVendor
|
||||
// for rows.Next() {
|
||||
// var model generatedmodels.ModelPublicHouseholdVendors
|
||||
// if err := rows.Scan(&model.ID, &model.Name, &model.ServiceType, &model.Phone, &model.Email, &model.Website, &model.Notes, &model.Rating, &model.LastUsed, &model.CreatedAt); err != nil {
|
||||
// return nil, fmt.Errorf("scan vendor: %w", err)
|
||||
// }
|
||||
// vendors = append(vendors, householdVendorFromModel(model))
|
||||
// }
|
||||
// return vendors, rows.Err()
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user