mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2025-12-21 13:23:14 +01:00
* feat: Add item templates feature (#435) Add ability to create and manage item templates for quick item creation. Templates store default values and custom fields that can be applied when creating new items. Backend changes: - New ItemTemplate and TemplateField Ent schemas - Template CRUD API endpoints - Create item from template endpoint Frontend changes: - Templates management page with create/edit/delete - Template selector in item creation modal - 'Use as Template' action on item detail page - Templates link in navigation menu * refactor: Improve template item creation with a single query - Add `CreateFromTemplate` method to ItemsRepository that creates items with all template data (including custom fields) in a single atomic transaction, replacing the previous two-phase create-then-update pattern - Fix `GetOne` to require group ID parameter so templates can only be accessed by users in the owning group (security fix) - Simplify `HandleItemTemplatesCreateItem` handler using the new transactional method * Refactor item template types and formatting Updated type annotations in CreateModal.vue to use specific ItemTemplate types instead of 'any'. Improved code formatting for template fields and manufacturer display. Also refactored warranty field logic in item details page for better readability. This resolves the linter issues as well that the bot in github keeps nagging at. * Add 'id' property to template fields Introduces an 'id' property to each field object in CreateModal.vue and item details page to support unique identification of fields. This change prepares the codebase for future enhancements that may require field-level identification. * Removed redundant SQL migrations. Removed redundant SQL migrations per @tankerkiller125's findings. * Updates to PR #1099. Regarding pull #1099. Fixed an issue causing some conflict with GUIDs and old rows in the migration files. * Add new fields and location edge to ItemTemplate Addresses recommendations from @tonyaellie. * Relocated add template button * Added more default fields to the template * Added translation of all strings (think so?) * Make oval buttons round * Added duplicate button to the template (this required a rewrite of the migration files, I made sure only 1 exists per DB type) * Added a Save as template button to a item detail view (this creates a template with all the current data of that item) * Changed all occurrences of space to gap and flex where applicable. * Made template selection persistent after item created. * Collapsible template info on creation view. * Updates to translation and fix for labels/locations I also added a test in here because I keep missing small function tests. That should prevent that from happening again. * Linted * Bring up to date with main, fix some lint/type check issues * In theory fix playwright tests * Fix defaults being unable to be nullable/empty (and thus limiting flexibility) * Last few fixes I think * Forgot to fix the golang tests --------- Co-authored-by: Matthew Kilgore <matthew@kilgore.dev>
464 lines
15 KiB
Go
Generated
464 lines
15 KiB
Go
Generated
// Code generated by ent, DO NOT EDIT.
|
|
|
|
package group
|
|
|
|
import (
|
|
"time"
|
|
|
|
"entgo.io/ent/dialect/sql"
|
|
"entgo.io/ent/dialect/sql/sqlgraph"
|
|
"github.com/google/uuid"
|
|
"github.com/sysadminsmedia/homebox/backend/internal/data/ent/predicate"
|
|
)
|
|
|
|
// ID filters vertices based on their ID field.
|
|
func ID(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldID, id))
|
|
}
|
|
|
|
// IDEQ applies the EQ predicate on the ID field.
|
|
func IDEQ(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldID, id))
|
|
}
|
|
|
|
// IDNEQ applies the NEQ predicate on the ID field.
|
|
func IDNEQ(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldNEQ(FieldID, id))
|
|
}
|
|
|
|
// IDIn applies the In predicate on the ID field.
|
|
func IDIn(ids ...uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldIn(FieldID, ids...))
|
|
}
|
|
|
|
// IDNotIn applies the NotIn predicate on the ID field.
|
|
func IDNotIn(ids ...uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldNotIn(FieldID, ids...))
|
|
}
|
|
|
|
// IDGT applies the GT predicate on the ID field.
|
|
func IDGT(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldGT(FieldID, id))
|
|
}
|
|
|
|
// IDGTE applies the GTE predicate on the ID field.
|
|
func IDGTE(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldGTE(FieldID, id))
|
|
}
|
|
|
|
// IDLT applies the LT predicate on the ID field.
|
|
func IDLT(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldLT(FieldID, id))
|
|
}
|
|
|
|
// IDLTE applies the LTE predicate on the ID field.
|
|
func IDLTE(id uuid.UUID) predicate.Group {
|
|
return predicate.Group(sql.FieldLTE(FieldID, id))
|
|
}
|
|
|
|
// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ.
|
|
func CreatedAt(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldCreatedAt, v))
|
|
}
|
|
|
|
// UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ.
|
|
func UpdatedAt(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// Name applies equality check predicate on the "name" field. It's identical to NameEQ.
|
|
func Name(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldName, v))
|
|
}
|
|
|
|
// Currency applies equality check predicate on the "currency" field. It's identical to CurrencyEQ.
|
|
func Currency(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldCurrency, v))
|
|
}
|
|
|
|
// CreatedAtEQ applies the EQ predicate on the "created_at" field.
|
|
func CreatedAtEQ(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtNEQ applies the NEQ predicate on the "created_at" field.
|
|
func CreatedAtNEQ(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldNEQ(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtIn applies the In predicate on the "created_at" field.
|
|
func CreatedAtIn(vs ...time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldIn(FieldCreatedAt, vs...))
|
|
}
|
|
|
|
// CreatedAtNotIn applies the NotIn predicate on the "created_at" field.
|
|
func CreatedAtNotIn(vs ...time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldNotIn(FieldCreatedAt, vs...))
|
|
}
|
|
|
|
// CreatedAtGT applies the GT predicate on the "created_at" field.
|
|
func CreatedAtGT(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldGT(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtGTE applies the GTE predicate on the "created_at" field.
|
|
func CreatedAtGTE(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldGTE(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtLT applies the LT predicate on the "created_at" field.
|
|
func CreatedAtLT(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldLT(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtLTE applies the LTE predicate on the "created_at" field.
|
|
func CreatedAtLTE(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldLTE(FieldCreatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtEQ applies the EQ predicate on the "updated_at" field.
|
|
func UpdatedAtEQ(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field.
|
|
func UpdatedAtNEQ(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldNEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtIn applies the In predicate on the "updated_at" field.
|
|
func UpdatedAtIn(vs ...time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldIn(FieldUpdatedAt, vs...))
|
|
}
|
|
|
|
// UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field.
|
|
func UpdatedAtNotIn(vs ...time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldNotIn(FieldUpdatedAt, vs...))
|
|
}
|
|
|
|
// UpdatedAtGT applies the GT predicate on the "updated_at" field.
|
|
func UpdatedAtGT(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldGT(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtGTE applies the GTE predicate on the "updated_at" field.
|
|
func UpdatedAtGTE(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldGTE(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtLT applies the LT predicate on the "updated_at" field.
|
|
func UpdatedAtLT(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldLT(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtLTE applies the LTE predicate on the "updated_at" field.
|
|
func UpdatedAtLTE(v time.Time) predicate.Group {
|
|
return predicate.Group(sql.FieldLTE(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// NameEQ applies the EQ predicate on the "name" field.
|
|
func NameEQ(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldName, v))
|
|
}
|
|
|
|
// NameNEQ applies the NEQ predicate on the "name" field.
|
|
func NameNEQ(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldNEQ(FieldName, v))
|
|
}
|
|
|
|
// NameIn applies the In predicate on the "name" field.
|
|
func NameIn(vs ...string) predicate.Group {
|
|
return predicate.Group(sql.FieldIn(FieldName, vs...))
|
|
}
|
|
|
|
// NameNotIn applies the NotIn predicate on the "name" field.
|
|
func NameNotIn(vs ...string) predicate.Group {
|
|
return predicate.Group(sql.FieldNotIn(FieldName, vs...))
|
|
}
|
|
|
|
// NameGT applies the GT predicate on the "name" field.
|
|
func NameGT(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldGT(FieldName, v))
|
|
}
|
|
|
|
// NameGTE applies the GTE predicate on the "name" field.
|
|
func NameGTE(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldGTE(FieldName, v))
|
|
}
|
|
|
|
// NameLT applies the LT predicate on the "name" field.
|
|
func NameLT(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldLT(FieldName, v))
|
|
}
|
|
|
|
// NameLTE applies the LTE predicate on the "name" field.
|
|
func NameLTE(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldLTE(FieldName, v))
|
|
}
|
|
|
|
// NameContains applies the Contains predicate on the "name" field.
|
|
func NameContains(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldContains(FieldName, v))
|
|
}
|
|
|
|
// NameHasPrefix applies the HasPrefix predicate on the "name" field.
|
|
func NameHasPrefix(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldHasPrefix(FieldName, v))
|
|
}
|
|
|
|
// NameHasSuffix applies the HasSuffix predicate on the "name" field.
|
|
func NameHasSuffix(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldHasSuffix(FieldName, v))
|
|
}
|
|
|
|
// NameEqualFold applies the EqualFold predicate on the "name" field.
|
|
func NameEqualFold(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEqualFold(FieldName, v))
|
|
}
|
|
|
|
// NameContainsFold applies the ContainsFold predicate on the "name" field.
|
|
func NameContainsFold(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldContainsFold(FieldName, v))
|
|
}
|
|
|
|
// CurrencyEQ applies the EQ predicate on the "currency" field.
|
|
func CurrencyEQ(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEQ(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyNEQ applies the NEQ predicate on the "currency" field.
|
|
func CurrencyNEQ(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldNEQ(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyIn applies the In predicate on the "currency" field.
|
|
func CurrencyIn(vs ...string) predicate.Group {
|
|
return predicate.Group(sql.FieldIn(FieldCurrency, vs...))
|
|
}
|
|
|
|
// CurrencyNotIn applies the NotIn predicate on the "currency" field.
|
|
func CurrencyNotIn(vs ...string) predicate.Group {
|
|
return predicate.Group(sql.FieldNotIn(FieldCurrency, vs...))
|
|
}
|
|
|
|
// CurrencyGT applies the GT predicate on the "currency" field.
|
|
func CurrencyGT(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldGT(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyGTE applies the GTE predicate on the "currency" field.
|
|
func CurrencyGTE(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldGTE(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyLT applies the LT predicate on the "currency" field.
|
|
func CurrencyLT(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldLT(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyLTE applies the LTE predicate on the "currency" field.
|
|
func CurrencyLTE(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldLTE(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyContains applies the Contains predicate on the "currency" field.
|
|
func CurrencyContains(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldContains(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyHasPrefix applies the HasPrefix predicate on the "currency" field.
|
|
func CurrencyHasPrefix(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldHasPrefix(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyHasSuffix applies the HasSuffix predicate on the "currency" field.
|
|
func CurrencyHasSuffix(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldHasSuffix(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyEqualFold applies the EqualFold predicate on the "currency" field.
|
|
func CurrencyEqualFold(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldEqualFold(FieldCurrency, v))
|
|
}
|
|
|
|
// CurrencyContainsFold applies the ContainsFold predicate on the "currency" field.
|
|
func CurrencyContainsFold(v string) predicate.Group {
|
|
return predicate.Group(sql.FieldContainsFold(FieldCurrency, v))
|
|
}
|
|
|
|
// HasUsers applies the HasEdge predicate on the "users" edge.
|
|
func HasUsers() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, UsersTable, UsersColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasUsersWith applies the HasEdge predicate on the "users" edge with a given conditions (other predicates).
|
|
func HasUsersWith(preds ...predicate.User) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newUsersStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasLocations applies the HasEdge predicate on the "locations" edge.
|
|
func HasLocations() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, LocationsTable, LocationsColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasLocationsWith applies the HasEdge predicate on the "locations" edge with a given conditions (other predicates).
|
|
func HasLocationsWith(preds ...predicate.Location) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newLocationsStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasItems applies the HasEdge predicate on the "items" edge.
|
|
func HasItems() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, ItemsTable, ItemsColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasItemsWith applies the HasEdge predicate on the "items" edge with a given conditions (other predicates).
|
|
func HasItemsWith(preds ...predicate.Item) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newItemsStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasLabels applies the HasEdge predicate on the "labels" edge.
|
|
func HasLabels() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, LabelsTable, LabelsColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasLabelsWith applies the HasEdge predicate on the "labels" edge with a given conditions (other predicates).
|
|
func HasLabelsWith(preds ...predicate.Label) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newLabelsStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasInvitationTokens applies the HasEdge predicate on the "invitation_tokens" edge.
|
|
func HasInvitationTokens() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, InvitationTokensTable, InvitationTokensColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasInvitationTokensWith applies the HasEdge predicate on the "invitation_tokens" edge with a given conditions (other predicates).
|
|
func HasInvitationTokensWith(preds ...predicate.GroupInvitationToken) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newInvitationTokensStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasNotifiers applies the HasEdge predicate on the "notifiers" edge.
|
|
func HasNotifiers() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, NotifiersTable, NotifiersColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasNotifiersWith applies the HasEdge predicate on the "notifiers" edge with a given conditions (other predicates).
|
|
func HasNotifiersWith(preds ...predicate.Notifier) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newNotifiersStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// HasItemTemplates applies the HasEdge predicate on the "item_templates" edge.
|
|
func HasItemTemplates() predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.O2M, false, ItemTemplatesTable, ItemTemplatesColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasItemTemplatesWith applies the HasEdge predicate on the "item_templates" edge with a given conditions (other predicates).
|
|
func HasItemTemplatesWith(preds ...predicate.ItemTemplate) predicate.Group {
|
|
return predicate.Group(func(s *sql.Selector) {
|
|
step := newItemTemplatesStep()
|
|
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
|
|
for _, p := range preds {
|
|
p(s)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
// And groups predicates with the AND operator between them.
|
|
func And(predicates ...predicate.Group) predicate.Group {
|
|
return predicate.Group(sql.AndPredicates(predicates...))
|
|
}
|
|
|
|
// Or groups predicates with the OR operator between them.
|
|
func Or(predicates ...predicate.Group) predicate.Group {
|
|
return predicate.Group(sql.OrPredicates(predicates...))
|
|
}
|
|
|
|
// Not applies the not operator on the given predicate.
|
|
func Not(p predicate.Group) predicate.Group {
|
|
return predicate.Group(sql.NotPredicates(p))
|
|
}
|