mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2026-01-02 02:57:22 +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>
436 lines
16 KiB
Go
Generated
436 lines
16 KiB
Go
Generated
// Code generated by ent, DO NOT EDIT.
|
|
|
|
package templatefield
|
|
|
|
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.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldID, id))
|
|
}
|
|
|
|
// IDEQ applies the EQ predicate on the ID field.
|
|
func IDEQ(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldID, id))
|
|
}
|
|
|
|
// IDNEQ applies the NEQ predicate on the ID field.
|
|
func IDNEQ(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldID, id))
|
|
}
|
|
|
|
// IDIn applies the In predicate on the ID field.
|
|
func IDIn(ids ...uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldID, ids...))
|
|
}
|
|
|
|
// IDNotIn applies the NotIn predicate on the ID field.
|
|
func IDNotIn(ids ...uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldID, ids...))
|
|
}
|
|
|
|
// IDGT applies the GT predicate on the ID field.
|
|
func IDGT(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldID, id))
|
|
}
|
|
|
|
// IDGTE applies the GTE predicate on the ID field.
|
|
func IDGTE(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldID, id))
|
|
}
|
|
|
|
// IDLT applies the LT predicate on the ID field.
|
|
func IDLT(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldID, id))
|
|
}
|
|
|
|
// IDLTE applies the LTE predicate on the ID field.
|
|
func IDLTE(id uuid.UUID) predicate.TemplateField {
|
|
return predicate.TemplateField(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.TemplateField {
|
|
return predicate.TemplateField(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.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// Name applies equality check predicate on the "name" field. It's identical to NameEQ.
|
|
func Name(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldName, v))
|
|
}
|
|
|
|
// Description applies equality check predicate on the "description" field. It's identical to DescriptionEQ.
|
|
func Description(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldDescription, v))
|
|
}
|
|
|
|
// TextValue applies equality check predicate on the "text_value" field. It's identical to TextValueEQ.
|
|
func TextValue(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldTextValue, v))
|
|
}
|
|
|
|
// CreatedAtEQ applies the EQ predicate on the "created_at" field.
|
|
func CreatedAtEQ(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtNEQ applies the NEQ predicate on the "created_at" field.
|
|
func CreatedAtNEQ(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtIn applies the In predicate on the "created_at" field.
|
|
func CreatedAtIn(vs ...time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldCreatedAt, vs...))
|
|
}
|
|
|
|
// CreatedAtNotIn applies the NotIn predicate on the "created_at" field.
|
|
func CreatedAtNotIn(vs ...time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldCreatedAt, vs...))
|
|
}
|
|
|
|
// CreatedAtGT applies the GT predicate on the "created_at" field.
|
|
func CreatedAtGT(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtGTE applies the GTE predicate on the "created_at" field.
|
|
func CreatedAtGTE(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtLT applies the LT predicate on the "created_at" field.
|
|
func CreatedAtLT(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldCreatedAt, v))
|
|
}
|
|
|
|
// CreatedAtLTE applies the LTE predicate on the "created_at" field.
|
|
func CreatedAtLTE(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLTE(FieldCreatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtEQ applies the EQ predicate on the "updated_at" field.
|
|
func UpdatedAtEQ(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field.
|
|
func UpdatedAtNEQ(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtIn applies the In predicate on the "updated_at" field.
|
|
func UpdatedAtIn(vs ...time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldUpdatedAt, vs...))
|
|
}
|
|
|
|
// UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field.
|
|
func UpdatedAtNotIn(vs ...time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldUpdatedAt, vs...))
|
|
}
|
|
|
|
// UpdatedAtGT applies the GT predicate on the "updated_at" field.
|
|
func UpdatedAtGT(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtGTE applies the GTE predicate on the "updated_at" field.
|
|
func UpdatedAtGTE(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtLT applies the LT predicate on the "updated_at" field.
|
|
func UpdatedAtLT(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// UpdatedAtLTE applies the LTE predicate on the "updated_at" field.
|
|
func UpdatedAtLTE(v time.Time) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLTE(FieldUpdatedAt, v))
|
|
}
|
|
|
|
// NameEQ applies the EQ predicate on the "name" field.
|
|
func NameEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldName, v))
|
|
}
|
|
|
|
// NameNEQ applies the NEQ predicate on the "name" field.
|
|
func NameNEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldName, v))
|
|
}
|
|
|
|
// NameIn applies the In predicate on the "name" field.
|
|
func NameIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldName, vs...))
|
|
}
|
|
|
|
// NameNotIn applies the NotIn predicate on the "name" field.
|
|
func NameNotIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldName, vs...))
|
|
}
|
|
|
|
// NameGT applies the GT predicate on the "name" field.
|
|
func NameGT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldName, v))
|
|
}
|
|
|
|
// NameGTE applies the GTE predicate on the "name" field.
|
|
func NameGTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldName, v))
|
|
}
|
|
|
|
// NameLT applies the LT predicate on the "name" field.
|
|
func NameLT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldName, v))
|
|
}
|
|
|
|
// NameLTE applies the LTE predicate on the "name" field.
|
|
func NameLTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLTE(FieldName, v))
|
|
}
|
|
|
|
// NameContains applies the Contains predicate on the "name" field.
|
|
func NameContains(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContains(FieldName, v))
|
|
}
|
|
|
|
// NameHasPrefix applies the HasPrefix predicate on the "name" field.
|
|
func NameHasPrefix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasPrefix(FieldName, v))
|
|
}
|
|
|
|
// NameHasSuffix applies the HasSuffix predicate on the "name" field.
|
|
func NameHasSuffix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasSuffix(FieldName, v))
|
|
}
|
|
|
|
// NameEqualFold applies the EqualFold predicate on the "name" field.
|
|
func NameEqualFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEqualFold(FieldName, v))
|
|
}
|
|
|
|
// NameContainsFold applies the ContainsFold predicate on the "name" field.
|
|
func NameContainsFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContainsFold(FieldName, v))
|
|
}
|
|
|
|
// DescriptionEQ applies the EQ predicate on the "description" field.
|
|
func DescriptionEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionNEQ applies the NEQ predicate on the "description" field.
|
|
func DescriptionNEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionIn applies the In predicate on the "description" field.
|
|
func DescriptionIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldDescription, vs...))
|
|
}
|
|
|
|
// DescriptionNotIn applies the NotIn predicate on the "description" field.
|
|
func DescriptionNotIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldDescription, vs...))
|
|
}
|
|
|
|
// DescriptionGT applies the GT predicate on the "description" field.
|
|
func DescriptionGT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionGTE applies the GTE predicate on the "description" field.
|
|
func DescriptionGTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionLT applies the LT predicate on the "description" field.
|
|
func DescriptionLT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionLTE applies the LTE predicate on the "description" field.
|
|
func DescriptionLTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLTE(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionContains applies the Contains predicate on the "description" field.
|
|
func DescriptionContains(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContains(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionHasPrefix applies the HasPrefix predicate on the "description" field.
|
|
func DescriptionHasPrefix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasPrefix(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionHasSuffix applies the HasSuffix predicate on the "description" field.
|
|
func DescriptionHasSuffix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasSuffix(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionIsNil applies the IsNil predicate on the "description" field.
|
|
func DescriptionIsNil() predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIsNull(FieldDescription))
|
|
}
|
|
|
|
// DescriptionNotNil applies the NotNil predicate on the "description" field.
|
|
func DescriptionNotNil() predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotNull(FieldDescription))
|
|
}
|
|
|
|
// DescriptionEqualFold applies the EqualFold predicate on the "description" field.
|
|
func DescriptionEqualFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEqualFold(FieldDescription, v))
|
|
}
|
|
|
|
// DescriptionContainsFold applies the ContainsFold predicate on the "description" field.
|
|
func DescriptionContainsFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContainsFold(FieldDescription, v))
|
|
}
|
|
|
|
// TypeEQ applies the EQ predicate on the "type" field.
|
|
func TypeEQ(v Type) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldType, v))
|
|
}
|
|
|
|
// TypeNEQ applies the NEQ predicate on the "type" field.
|
|
func TypeNEQ(v Type) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldType, v))
|
|
}
|
|
|
|
// TypeIn applies the In predicate on the "type" field.
|
|
func TypeIn(vs ...Type) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldType, vs...))
|
|
}
|
|
|
|
// TypeNotIn applies the NotIn predicate on the "type" field.
|
|
func TypeNotIn(vs ...Type) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldType, vs...))
|
|
}
|
|
|
|
// TextValueEQ applies the EQ predicate on the "text_value" field.
|
|
func TextValueEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEQ(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueNEQ applies the NEQ predicate on the "text_value" field.
|
|
func TextValueNEQ(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNEQ(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueIn applies the In predicate on the "text_value" field.
|
|
func TextValueIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIn(FieldTextValue, vs...))
|
|
}
|
|
|
|
// TextValueNotIn applies the NotIn predicate on the "text_value" field.
|
|
func TextValueNotIn(vs ...string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotIn(FieldTextValue, vs...))
|
|
}
|
|
|
|
// TextValueGT applies the GT predicate on the "text_value" field.
|
|
func TextValueGT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGT(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueGTE applies the GTE predicate on the "text_value" field.
|
|
func TextValueGTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldGTE(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueLT applies the LT predicate on the "text_value" field.
|
|
func TextValueLT(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLT(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueLTE applies the LTE predicate on the "text_value" field.
|
|
func TextValueLTE(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldLTE(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueContains applies the Contains predicate on the "text_value" field.
|
|
func TextValueContains(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContains(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueHasPrefix applies the HasPrefix predicate on the "text_value" field.
|
|
func TextValueHasPrefix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasPrefix(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueHasSuffix applies the HasSuffix predicate on the "text_value" field.
|
|
func TextValueHasSuffix(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldHasSuffix(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueIsNil applies the IsNil predicate on the "text_value" field.
|
|
func TextValueIsNil() predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldIsNull(FieldTextValue))
|
|
}
|
|
|
|
// TextValueNotNil applies the NotNil predicate on the "text_value" field.
|
|
func TextValueNotNil() predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldNotNull(FieldTextValue))
|
|
}
|
|
|
|
// TextValueEqualFold applies the EqualFold predicate on the "text_value" field.
|
|
func TextValueEqualFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldEqualFold(FieldTextValue, v))
|
|
}
|
|
|
|
// TextValueContainsFold applies the ContainsFold predicate on the "text_value" field.
|
|
func TextValueContainsFold(v string) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.FieldContainsFold(FieldTextValue, v))
|
|
}
|
|
|
|
// HasItemTemplate applies the HasEdge predicate on the "item_template" edge.
|
|
func HasItemTemplate() predicate.TemplateField {
|
|
return predicate.TemplateField(func(s *sql.Selector) {
|
|
step := sqlgraph.NewStep(
|
|
sqlgraph.From(Table, FieldID),
|
|
sqlgraph.Edge(sqlgraph.M2O, true, ItemTemplateTable, ItemTemplateColumn),
|
|
)
|
|
sqlgraph.HasNeighbors(s, step)
|
|
})
|
|
}
|
|
|
|
// HasItemTemplateWith applies the HasEdge predicate on the "item_template" edge with a given conditions (other predicates).
|
|
func HasItemTemplateWith(preds ...predicate.ItemTemplate) predicate.TemplateField {
|
|
return predicate.TemplateField(func(s *sql.Selector) {
|
|
step := newItemTemplateStep()
|
|
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.TemplateField) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.AndPredicates(predicates...))
|
|
}
|
|
|
|
// Or groups predicates with the OR operator between them.
|
|
func Or(predicates ...predicate.TemplateField) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.OrPredicates(predicates...))
|
|
}
|
|
|
|
// Not applies the not operator on the given predicate.
|
|
func Not(p predicate.TemplateField) predicate.TemplateField {
|
|
return predicate.TemplateField(sql.NotPredicates(p))
|
|
}
|