Saved filters (#1474)

* Refactor list filter
* Filter/criterion refactor
* Rename option value to type
* Remove None from options
* Add saved filter button
* Integrate default filters
This commit is contained in:
WithoutPants
2021-06-16 14:53:32 +10:00
committed by GitHub
parent 4fe4da6c01
commit dc7584d77e
74 changed files with 2583 additions and 1263 deletions

View File

@@ -0,0 +1,165 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT.
package mocks
import (
models "github.com/stashapp/stash/pkg/models"
mock "github.com/stretchr/testify/mock"
)
// SavedFilterReaderWriter is an autogenerated mock type for the SavedFilterReaderWriter type
type SavedFilterReaderWriter struct {
mock.Mock
}
// Create provides a mock function with given fields: obj
func (_m *SavedFilterReaderWriter) Create(obj models.SavedFilter) (*models.SavedFilter, error) {
ret := _m.Called(obj)
var r0 *models.SavedFilter
if rf, ok := ret.Get(0).(func(models.SavedFilter) *models.SavedFilter); ok {
r0 = rf(obj)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(models.SavedFilter) error); ok {
r1 = rf(obj)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// Destroy provides a mock function with given fields: id
func (_m *SavedFilterReaderWriter) Destroy(id int) error {
ret := _m.Called(id)
var r0 error
if rf, ok := ret.Get(0).(func(int) error); ok {
r0 = rf(id)
} else {
r0 = ret.Error(0)
}
return r0
}
// Find provides a mock function with given fields: id
func (_m *SavedFilterReaderWriter) Find(id int) (*models.SavedFilter, error) {
ret := _m.Called(id)
var r0 *models.SavedFilter
if rf, ok := ret.Get(0).(func(int) *models.SavedFilter); ok {
r0 = rf(id)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(int) error); ok {
r1 = rf(id)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// FindByMode provides a mock function with given fields: mode
func (_m *SavedFilterReaderWriter) FindByMode(mode models.FilterMode) ([]*models.SavedFilter, error) {
ret := _m.Called(mode)
var r0 []*models.SavedFilter
if rf, ok := ret.Get(0).(func(models.FilterMode) []*models.SavedFilter); ok {
r0 = rf(mode)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(models.FilterMode) error); ok {
r1 = rf(mode)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// FindDefault provides a mock function with given fields: mode
func (_m *SavedFilterReaderWriter) FindDefault(mode models.FilterMode) (*models.SavedFilter, error) {
ret := _m.Called(mode)
var r0 *models.SavedFilter
if rf, ok := ret.Get(0).(func(models.FilterMode) *models.SavedFilter); ok {
r0 = rf(mode)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(models.FilterMode) error); ok {
r1 = rf(mode)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// SetDefault provides a mock function with given fields: obj
func (_m *SavedFilterReaderWriter) SetDefault(obj models.SavedFilter) (*models.SavedFilter, error) {
ret := _m.Called(obj)
var r0 *models.SavedFilter
if rf, ok := ret.Get(0).(func(models.SavedFilter) *models.SavedFilter); ok {
r0 = rf(obj)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(models.SavedFilter) error); ok {
r1 = rf(obj)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// Update provides a mock function with given fields: obj
func (_m *SavedFilterReaderWriter) Update(obj models.SavedFilter) (*models.SavedFilter, error) {
ret := _m.Called(obj)
var r0 *models.SavedFilter
if rf, ok := ret.Get(0).(func(models.SavedFilter) *models.SavedFilter); ok {
r0 = rf(obj)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*models.SavedFilter)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(models.SavedFilter) error); ok {
r1 = rf(obj)
} else {
r1 = ret.Error(1)
}
return r0, r1
}

View File

@@ -16,6 +16,7 @@ type TransactionManager struct {
scrapedItem models.ScrapedItemReaderWriter
studio models.StudioReaderWriter
tag models.TagReaderWriter
savedFilter models.SavedFilterReaderWriter
}
func NewTransactionManager() *TransactionManager {
@@ -29,6 +30,7 @@ func NewTransactionManager() *TransactionManager {
scrapedItem: &ScrapedItemReaderWriter{},
studio: &StudioReaderWriter{},
tag: &TagReaderWriter{},
savedFilter: &SavedFilterReaderWriter{},
}
}
@@ -72,6 +74,10 @@ func (t *TransactionManager) Tag() models.TagReaderWriter {
return t.tag
}
func (t *TransactionManager) SavedFilter() models.SavedFilterReaderWriter {
return t.savedFilter
}
type ReadTransaction struct {
t *TransactionManager
}
@@ -115,3 +121,7 @@ func (r *ReadTransaction) Studio() models.StudioReader {
func (r *ReadTransaction) Tag() models.TagReader {
return r.t.tag
}
func (r *ReadTransaction) SavedFilter() models.SavedFilterReader {
return r.t.savedFilter
}

View File

@@ -0,0 +1,19 @@
package models
type SavedFilter struct {
ID int `db:"id" json:"id"`
Mode FilterMode `db:"mode" json:"mode"`
Name string `db:"name" json:"name"`
// JSON-encoded filter string
Filter string `db:"filter" json:"filter"`
}
type SavedFilters []*SavedFilter
func (m *SavedFilters) Append(o interface{}) {
*m = append(*m, o.(*SavedFilter))
}
func (m *SavedFilters) New() interface{} {
return &SavedFilter{}
}

View File

@@ -10,6 +10,7 @@ type Repository interface {
ScrapedItem() ScrapedItemReaderWriter
Studio() StudioReaderWriter
Tag() TagReaderWriter
SavedFilter() SavedFilterReaderWriter
}
type ReaderRepository interface {
@@ -22,4 +23,5 @@ type ReaderRepository interface {
ScrapedItem() ScrapedItemReader
Studio() StudioReader
Tag() TagReader
SavedFilter() SavedFilterReader
}

View File

@@ -0,0 +1,19 @@
package models
type SavedFilterReader interface {
Find(id int) (*SavedFilter, error)
FindByMode(mode FilterMode) ([]*SavedFilter, error)
FindDefault(mode FilterMode) (*SavedFilter, error)
}
type SavedFilterWriter interface {
Create(obj SavedFilter) (*SavedFilter, error)
Update(obj SavedFilter) (*SavedFilter, error)
SetDefault(obj SavedFilter) (*SavedFilter, error)
Destroy(id int) error
}
type SavedFilterReaderWriter interface {
SavedFilterReader
SavedFilterWriter
}