feat: GUI to create smart views (#1997)

This commit is contained in:
Aman Harwara
2022-11-14 19:40:00 +05:30
committed by GitHub
parent 1c23bc1747
commit f656185c16
28 changed files with 1032 additions and 78 deletions

View File

@@ -0,0 +1,92 @@
import { PlainEditorType } from '@/Utils/DropdownItemsForEditors'
import { NoteType, PredicateCompoundOperator, PredicateJsonForm } from '@standardnotes/snjs'
import { makeObservable, observable, action } from 'mobx'
import { PredicateKeypath, PredicateKeypathTypes } from './PredicateKeypaths'
const getEmptyPredicate = (): PredicateJsonForm => {
return {
keypath: 'title',
operator: '!=',
value: '',
}
}
export class CompoundPredicateBuilderController {
operator: PredicateCompoundOperator = 'and'
predicates: PredicateJsonForm[] = [getEmptyPredicate()]
constructor() {
makeObservable(this, {
operator: observable,
setOperator: action,
predicates: observable,
setPredicate: action,
addPredicate: action,
removePredicate: action,
})
}
setOperator = (operator: PredicateCompoundOperator) => {
this.operator = operator
}
setPredicate = (index: number, predicate: Partial<PredicateJsonForm>) => {
const predicateAtIndex = this.predicates[index]
this.predicates[index] = {
...predicateAtIndex,
...predicate,
}
}
changePredicateKeypath = (index: number, keypath: string) => {
const currentKeyPath = this.predicates[index].keypath as PredicateKeypath
const currentKeyPathType = PredicateKeypathTypes[currentKeyPath]
const newKeyPathType = PredicateKeypathTypes[keypath as PredicateKeypath]
if (currentKeyPathType !== newKeyPathType) {
switch (newKeyPathType) {
case 'string':
this.setPredicate(index, { value: '' })
break
case 'boolean':
this.setPredicate(index, { value: true })
break
case 'number':
this.setPredicate(index, { value: 0 })
break
case 'noteType':
this.setPredicate(index, { value: Object.values(NoteType)[0] })
break
case 'editorIdentifier':
this.setPredicate(index, { value: PlainEditorType })
break
case 'date':
this.setPredicate(index, { value: '1.days.ago' })
break
}
}
this.setPredicate(index, { keypath })
}
addPredicate = () => {
this.predicates.push(getEmptyPredicate())
}
removePredicate = (index: number) => {
this.predicates.splice(index, 1)
}
toJson(): PredicateJsonForm {
return {
operator: this.operator,
value: this.predicates,
}
}
resetState() {
this.operator = 'and'
this.predicates = [getEmptyPredicate()]
}
}