Add budgets
This commit is contained in:
		
							parent
							
								
									5cc0bba09a
								
							
						
					
					
						commit
						eced6e6a6d
					
				| @ -17,7 +17,11 @@ const AccountSchema = CollectionSchema( | ||||
|   name: r'Account', | ||||
|   id: -6646797162501847804, | ||||
|   properties: { | ||||
|     r'name': PropertySchema(id: 0, name: r'name', type: IsarType.string), | ||||
|     r'name': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'name', | ||||
|       type: IsarType.string, | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _accountEstimateSize, | ||||
|   serialize: _accountSerialize, | ||||
| @ -106,7 +110,10 @@ extension AccountQueryWhereSort on QueryBuilder<Account, Account, QWhere> { | ||||
| extension AccountQueryWhere on QueryBuilder<Account, Account, QWhereClause> { | ||||
|   QueryBuilder<Account, Account, QAfterWhereClause> idEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -132,10 +139,8 @@ extension AccountQueryWhere on QueryBuilder<Account, Account, QWhereClause> { | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterWhereClause> idGreaterThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Account, Account, QAfterWhereClause> idGreaterThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -143,10 +148,8 @@ extension AccountQueryWhere on QueryBuilder<Account, Account, QWhereClause> { | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterWhereClause> idLessThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Account, Account, QAfterWhereClause> idLessThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -161,14 +164,12 @@ extension AccountQueryWhere on QueryBuilder<Account, Account, QWhereClause> { | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -177,9 +178,10 @@ extension AccountQueryFilter | ||||
|     on QueryBuilder<Account, Account, QFilterCondition> { | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> idEqualTo(Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -188,13 +190,11 @@ extension AccountQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -203,13 +203,11 @@ extension AccountQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -220,31 +218,29 @@ extension AccountQueryFilter | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNull(property: r'name'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNull( | ||||
|         property: r'name', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameIsNotNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNotNull(property: r'name'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNotNull( | ||||
|         property: r'name', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -253,13 +249,11 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -269,14 +263,12 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -286,14 +278,12 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -305,16 +295,14 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'name', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'name', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -323,13 +311,11 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -338,59 +324,53 @@ extension AccountQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameContains( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|       String value, | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameMatches( | ||||
|     String pattern, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|       String pattern, | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'name', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'name', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Account, Account, QAfterFilterCondition> nameIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -444,9 +424,8 @@ extension AccountQuerySortThenBy | ||||
| 
 | ||||
| extension AccountQueryWhereDistinct | ||||
|     on QueryBuilder<Account, Account, QDistinct> { | ||||
|   QueryBuilder<Account, Account, QDistinct> distinctByName({ | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|   QueryBuilder<Account, Account, QDistinct> distinctByName( | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'name', caseSensitive: caseSensitive); | ||||
|     }); | ||||
|  | ||||
| @ -22,13 +22,17 @@ const BeneficiarySchema = CollectionSchema( | ||||
|       name: r'imagePath', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'name': PropertySchema(id: 1, name: r'name', type: IsarType.string), | ||||
|     r'name': PropertySchema( | ||||
|       id: 1, | ||||
|       name: r'name', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'type': PropertySchema( | ||||
|       id: 2, | ||||
|       name: r'type', | ||||
|       type: IsarType.byte, | ||||
|       enumMap: _BeneficiarytypeEnumValueMap, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _beneficiaryEstimateSize, | ||||
|   serialize: _beneficiarySerialize, | ||||
| @ -42,7 +46,7 @@ const BeneficiarySchema = CollectionSchema( | ||||
|       name: r'account', | ||||
|       target: r'Account', | ||||
|       single: true, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   embeddedSchemas: {}, | ||||
|   getId: _beneficiaryGetId, | ||||
| @ -90,7 +94,7 @@ Beneficiary _beneficiaryDeserialize( | ||||
|   object.name = reader.readString(offsets[1]); | ||||
|   object.type = | ||||
|       _BeneficiarytypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? | ||||
|       BeneficiaryType.account; | ||||
|           BeneficiaryType.account; | ||||
|   return object; | ||||
| } | ||||
| 
 | ||||
| @ -107,14 +111,16 @@ P _beneficiaryDeserializeProp<P>( | ||||
|       return (reader.readString(offset)) as P; | ||||
|     case 2: | ||||
|       return (_BeneficiarytypeValueEnumMap[reader.readByteOrNull(offset)] ?? | ||||
|               BeneficiaryType.account) | ||||
|           as P; | ||||
|           BeneficiaryType.account) as P; | ||||
|     default: | ||||
|       throw IsarError('Unknown property with id $propertyId'); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const _BeneficiarytypeEnumValueMap = {'account': 0, 'other': 1}; | ||||
| const _BeneficiarytypeEnumValueMap = { | ||||
|   'account': 0, | ||||
|   'other': 1, | ||||
| }; | ||||
| const _BeneficiarytypeValueEnumMap = { | ||||
|   0: BeneficiaryType.account, | ||||
|   1: BeneficiaryType.other, | ||||
| @ -129,10 +135,7 @@ List<IsarLinkBase<dynamic>> _beneficiaryGetLinks(Beneficiary object) { | ||||
| } | ||||
| 
 | ||||
| void _beneficiaryAttach( | ||||
|   IsarCollection<dynamic> col, | ||||
|   Id id, | ||||
|   Beneficiary object, | ||||
| ) { | ||||
|     IsarCollection<dynamic> col, Id id, Beneficiary object) { | ||||
|   object.id = id; | ||||
|   object.account.attach(col, col.isar.collection<Account>(), r'account', id); | ||||
| } | ||||
| @ -150,13 +153,15 @@ extension BeneficiaryQueryWhere | ||||
|     on QueryBuilder<Beneficiary, Beneficiary, QWhereClause> { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idNotEqualTo( | ||||
|     Id id, | ||||
|   ) { | ||||
|       Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       if (query.whereSort == Sort.asc) { | ||||
|         return query | ||||
| @ -178,10 +183,8 @@ extension BeneficiaryQueryWhere | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idGreaterThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idGreaterThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -189,10 +192,8 @@ extension BeneficiaryQueryWhere | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idLessThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterWhereClause> idLessThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -207,14 +208,12 @@ extension BeneficiaryQueryWhere | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -222,12 +221,12 @@ extension BeneficiaryQueryWhere | ||||
| extension BeneficiaryQueryFilter | ||||
|     on QueryBuilder<Beneficiary, Beneficiary, QFilterCondition> { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> idEqualTo( | ||||
|     Id value, | ||||
|   ) { | ||||
|       Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -236,13 +235,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -251,13 +248,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -268,87 +263,82 @@ extension BeneficiaryQueryFilter | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathIsNull() { | ||||
|       imagePathIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNull(property: r'imagePath'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNull( | ||||
|         property: r'imagePath', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathIsNotNull() { | ||||
|       imagePathIsNotNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNotNull(property: r'imagePath'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNotNull( | ||||
|         property: r'imagePath', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathEqualTo(String? value, {bool caseSensitive = true}) { | ||||
|       imagePathEqualTo( | ||||
|     String? value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathGreaterThan( | ||||
|       imagePathGreaterThan( | ||||
|     String? value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathLessThan( | ||||
|       imagePathLessThan( | ||||
|     String? value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathBetween( | ||||
|       imagePathBetween( | ||||
|     String? lower, | ||||
|     String? upper, { | ||||
|     bool includeLower = true, | ||||
| @ -356,86 +346,84 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'imagePath', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'imagePath', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathStartsWith(String value, {bool caseSensitive = true}) { | ||||
|       imagePathStartsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathEndsWith(String value, {bool caseSensitive = true}) { | ||||
|       imagePathEndsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathContains(String value, {bool caseSensitive = true}) { | ||||
|       imagePathContains(String value, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'imagePath', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'imagePath', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathMatches(String pattern, {bool caseSensitive = true}) { | ||||
|       imagePathMatches(String pattern, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'imagePath', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'imagePath', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathIsEmpty() { | ||||
|       imagePathIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'imagePath', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'imagePath', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   imagePathIsNotEmpty() { | ||||
|       imagePathIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'imagePath', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'imagePath', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -444,13 +432,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -460,14 +446,12 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -477,14 +461,12 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -496,16 +478,14 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'name', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'name', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -514,13 +494,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -529,70 +507,64 @@ extension BeneficiaryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> nameContains( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|       String value, | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> nameMatches( | ||||
|     String pattern, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|       String pattern, | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'name', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'name', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> nameIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   nameIsNotEmpty() { | ||||
|       nameIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> typeEqualTo( | ||||
|     BeneficiaryType value, | ||||
|   ) { | ||||
|       BeneficiaryType value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'type', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'type', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -601,13 +573,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'type', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'type', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -616,13 +586,11 @@ extension BeneficiaryQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'type', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'type', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -633,15 +601,13 @@ extension BeneficiaryQueryFilter | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'type', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'type', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -652,15 +618,14 @@ extension BeneficiaryQueryObject | ||||
| extension BeneficiaryQueryLinks | ||||
|     on QueryBuilder<Beneficiary, Beneficiary, QFilterCondition> { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> account( | ||||
|     FilterQuery<Account> q, | ||||
|   ) { | ||||
|       FilterQuery<Account> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'account'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QAfterFilterCondition> | ||||
|   accountIsNull() { | ||||
|       accountIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'account', 0, true, 0, true); | ||||
|     }); | ||||
| @ -759,17 +724,15 @@ extension BeneficiaryQuerySortThenBy | ||||
| 
 | ||||
| extension BeneficiaryQueryWhereDistinct | ||||
|     on QueryBuilder<Beneficiary, Beneficiary, QDistinct> { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QDistinct> distinctByImagePath({ | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QDistinct> distinctByImagePath( | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'imagePath', caseSensitive: caseSensitive); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QDistinct> distinctByName({ | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|   QueryBuilder<Beneficiary, Beneficiary, QDistinct> distinctByName( | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'name', caseSensitive: caseSensitive); | ||||
|     }); | ||||
|  | ||||
							
								
								
									
										35
									
								
								lib/database/collections/budget.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								lib/database/collections/budget.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| import 'package:isar/isar.dart'; | ||||
| import 'package:okane/database/collections/expense_category.dart'; | ||||
| 
 | ||||
| import 'account.dart'; | ||||
| 
 | ||||
| part 'budget.g.dart'; | ||||
| 
 | ||||
| enum BudgetPeriod { | ||||
|   month | ||||
| } | ||||
| 
 | ||||
| @collection | ||||
| class BudgetItem { | ||||
|   Id id = Isar.autoIncrement; | ||||
| 
 | ||||
|   late double amount; | ||||
| 
 | ||||
|   final expenseCategory = IsarLink<ExpenseCategory>(); | ||||
| } | ||||
| 
 | ||||
| @collection | ||||
| class Budget { | ||||
|   Id id = Isar.autoIncrement; | ||||
| 
 | ||||
|   @Enumerated(EnumType.ordinal) | ||||
|   late BudgetPeriod period; | ||||
| 
 | ||||
|   late String name; | ||||
| 
 | ||||
|   late double income; | ||||
| 
 | ||||
|   final account = IsarLink<Account>(); | ||||
| 
 | ||||
|   final items = IsarLinks<BudgetItem>(); | ||||
| } | ||||
							
								
								
									
										1097
									
								
								lib/database/collections/budget.g.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1097
									
								
								lib/database/collections/budget.g.dart
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -17,7 +17,11 @@ const ExpenseCategorySchema = CollectionSchema( | ||||
|   name: r'ExpenseCategory', | ||||
|   id: -6352499903118634, | ||||
|   properties: { | ||||
|     r'name': PropertySchema(id: 0, name: r'name', type: IsarType.string), | ||||
|     r'name': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'name', | ||||
|       type: IsarType.string, | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _expenseCategoryEstimateSize, | ||||
|   serialize: _expenseCategorySerialize, | ||||
| @ -87,10 +91,7 @@ List<IsarLinkBase<dynamic>> _expenseCategoryGetLinks(ExpenseCategory object) { | ||||
| } | ||||
| 
 | ||||
| void _expenseCategoryAttach( | ||||
|   IsarCollection<dynamic> col, | ||||
|   Id id, | ||||
|   ExpenseCategory object, | ||||
| ) { | ||||
|     IsarCollection<dynamic> col, Id id, ExpenseCategory object) { | ||||
|   object.id = id; | ||||
| } | ||||
| 
 | ||||
| @ -106,15 +107,17 @@ extension ExpenseCategoryQueryWhereSort | ||||
| extension ExpenseCategoryQueryWhere | ||||
|     on QueryBuilder<ExpenseCategory, ExpenseCategory, QWhereClause> { | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterWhereClause> idEqualTo( | ||||
|     Id id, | ||||
|   ) { | ||||
|       Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterWhereClause> | ||||
|   idNotEqualTo(Id id) { | ||||
|       idNotEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       if (query.whereSort == Sort.asc) { | ||||
|         return query | ||||
| @ -137,7 +140,7 @@ extension ExpenseCategoryQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterWhereClause> | ||||
|   idGreaterThan(Id id, {bool include = false}) { | ||||
|       idGreaterThan(Id id, {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -146,9 +149,8 @@ extension ExpenseCategoryQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterWhereClause> idLessThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|       Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -163,14 +165,12 @@ extension ExpenseCategoryQueryWhere | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -178,111 +178,109 @@ extension ExpenseCategoryQueryWhere | ||||
| extension ExpenseCategoryQueryFilter | ||||
|     on QueryBuilder<ExpenseCategory, ExpenseCategory, QFilterCondition> { | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   idEqualTo(Id value) { | ||||
|       idEqualTo(Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   idGreaterThan(Id value, {bool include = false}) { | ||||
|       idGreaterThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   idLessThan(Id value, {bool include = false}) { | ||||
|       idLessThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   idBetween( | ||||
|       idBetween( | ||||
|     Id lower, | ||||
|     Id upper, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameEqualTo(String value, {bool caseSensitive = true}) { | ||||
|       nameEqualTo( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameGreaterThan( | ||||
|       nameGreaterThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameLessThan( | ||||
|       nameLessThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameBetween( | ||||
|       nameBetween( | ||||
|     String lower, | ||||
|     String upper, { | ||||
|     bool includeLower = true, | ||||
| @ -290,86 +288,84 @@ extension ExpenseCategoryQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'name', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'name', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameStartsWith(String value, {bool caseSensitive = true}) { | ||||
|       nameStartsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameEndsWith(String value, {bool caseSensitive = true}) { | ||||
|       nameEndsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameContains(String value, {bool caseSensitive = true}) { | ||||
|       nameContains(String value, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameMatches(String pattern, {bool caseSensitive = true}) { | ||||
|       nameMatches(String pattern, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'name', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'name', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameIsEmpty() { | ||||
|       nameIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterFilterCondition> | ||||
|   nameIsNotEmpty() { | ||||
|       nameIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -389,7 +385,7 @@ extension ExpenseCategoryQuerySortBy | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterSortBy> | ||||
|   sortByNameDesc() { | ||||
|       sortByNameDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.desc); | ||||
|     }); | ||||
| @ -417,7 +413,7 @@ extension ExpenseCategoryQuerySortThenBy | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QAfterSortBy> | ||||
|   thenByNameDesc() { | ||||
|       thenByNameDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.desc); | ||||
|     }); | ||||
| @ -426,9 +422,8 @@ extension ExpenseCategoryQuerySortThenBy | ||||
| 
 | ||||
| extension ExpenseCategoryQueryWhereDistinct | ||||
|     on QueryBuilder<ExpenseCategory, ExpenseCategory, QDistinct> { | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QDistinct> distinctByName({ | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|   QueryBuilder<ExpenseCategory, ExpenseCategory, QDistinct> distinctByName( | ||||
|       {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'name', caseSensitive: caseSensitive); | ||||
|     }); | ||||
|  | ||||
| @ -18,12 +18,16 @@ const RecurringTransactionSchema = CollectionSchema( | ||||
|   name: r'RecurringTransaction', | ||||
|   id: 969840479390105118, | ||||
|   properties: { | ||||
|     r'days': PropertySchema(id: 0, name: r'days', type: IsarType.long), | ||||
|     r'days': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'days', | ||||
|       type: IsarType.long, | ||||
|     ), | ||||
|     r'lastExecution': PropertySchema( | ||||
|       id: 1, | ||||
|       name: r'lastExecution', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _recurringTransactionEstimateSize, | ||||
|   serialize: _recurringTransactionSerialize, | ||||
| @ -43,7 +47,7 @@ const RecurringTransactionSchema = CollectionSchema( | ||||
|       name: r'account', | ||||
|       target: r'Account', | ||||
|       single: true, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   embeddedSchemas: {}, | ||||
|   getId: _recurringTransactionGetId, | ||||
| @ -105,30 +109,22 @@ Id _recurringTransactionGetId(RecurringTransaction object) { | ||||
| } | ||||
| 
 | ||||
| List<IsarLinkBase<dynamic>> _recurringTransactionGetLinks( | ||||
|   RecurringTransaction object, | ||||
| ) { | ||||
|     RecurringTransaction object) { | ||||
|   return [object.template, object.account]; | ||||
| } | ||||
| 
 | ||||
| void _recurringTransactionAttach( | ||||
|   IsarCollection<dynamic> col, | ||||
|   Id id, | ||||
|   RecurringTransaction object, | ||||
| ) { | ||||
|     IsarCollection<dynamic> col, Id id, RecurringTransaction object) { | ||||
|   object.id = id; | ||||
|   object.template.attach( | ||||
|     col, | ||||
|     col.isar.collection<TransactionTemplate>(), | ||||
|     r'template', | ||||
|     id, | ||||
|   ); | ||||
|   object.template | ||||
|       .attach(col, col.isar.collection<TransactionTemplate>(), r'template', id); | ||||
|   object.account.attach(col, col.isar.collection<Account>(), r'account', id); | ||||
| } | ||||
| 
 | ||||
| extension RecurringTransactionQueryWhereSort | ||||
|     on QueryBuilder<RecurringTransaction, RecurringTransaction, QWhere> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhere> | ||||
|   anyId() { | ||||
|       anyId() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(const IdWhereClause.any()); | ||||
|     }); | ||||
| @ -138,14 +134,17 @@ extension RecurringTransactionQueryWhereSort | ||||
| extension RecurringTransactionQueryWhere | ||||
|     on QueryBuilder<RecurringTransaction, RecurringTransaction, QWhereClause> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhereClause> | ||||
|   idEqualTo(Id id) { | ||||
|       idEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhereClause> | ||||
|   idNotEqualTo(Id id) { | ||||
|       idNotEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       if (query.whereSort == Sort.asc) { | ||||
|         return query | ||||
| @ -168,7 +167,7 @@ extension RecurringTransactionQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhereClause> | ||||
|   idGreaterThan(Id id, {bool include = false}) { | ||||
|       idGreaterThan(Id id, {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -177,7 +176,7 @@ extension RecurringTransactionQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhereClause> | ||||
|   idLessThan(Id id, {bool include = false}) { | ||||
|       idLessThan(Id id, {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -186,326 +185,240 @@ extension RecurringTransactionQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterWhereClause> | ||||
|   idBetween( | ||||
|       idBetween( | ||||
|     Id lowerId, | ||||
|     Id upperId, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| extension RecurringTransactionQueryFilter | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           RecurringTransaction, | ||||
|           RecurringTransaction, | ||||
|           QFilterCondition | ||||
|         > { | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   daysEqualTo(int value) { | ||||
| extension RecurringTransactionQueryFilter on QueryBuilder<RecurringTransaction, | ||||
|     RecurringTransaction, QFilterCondition> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> daysEqualTo(int value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'days', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'days', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   daysGreaterThan(int value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> daysGreaterThan( | ||||
|     int value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'days', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'days', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   daysLessThan(int value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> daysLessThan( | ||||
|     int value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'days', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'days', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   daysBetween( | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> daysBetween( | ||||
|     int lower, | ||||
|     int upper, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'days', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'days', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   idEqualTo(Id value) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> idEqualTo(Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   idGreaterThan(Id value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> idGreaterThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   idLessThan(Id value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> idLessThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   idBetween( | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> idBetween( | ||||
|     Id lower, | ||||
|     Id upper, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionIsNull() { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNull(property: r'lastExecution'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNull( | ||||
|         property: r'lastExecution', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionIsNotNull() { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionIsNotNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         const FilterCondition.isNotNull(property: r'lastExecution'), | ||||
|       ); | ||||
|       return query.addFilterCondition(const FilterCondition.isNotNull( | ||||
|         property: r'lastExecution', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionEqualTo(DateTime? value) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionEqualTo(DateTime? value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'lastExecution', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'lastExecution', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionGreaterThan(DateTime? value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionGreaterThan( | ||||
|     DateTime? value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'lastExecution', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'lastExecution', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionLessThan(DateTime? value, {bool include = false}) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionLessThan( | ||||
|     DateTime? value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'lastExecution', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'lastExecution', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   lastExecutionBetween( | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> lastExecutionBetween( | ||||
|     DateTime? lower, | ||||
|     DateTime? upper, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'lastExecution', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'lastExecution', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| extension RecurringTransactionQueryObject | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           RecurringTransaction, | ||||
|           RecurringTransaction, | ||||
|           QFilterCondition | ||||
|         > {} | ||||
| extension RecurringTransactionQueryObject on QueryBuilder<RecurringTransaction, | ||||
|     RecurringTransaction, QFilterCondition> {} | ||||
| 
 | ||||
| extension RecurringTransactionQueryLinks | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           RecurringTransaction, | ||||
|           RecurringTransaction, | ||||
|           QFilterCondition | ||||
|         > { | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   template(FilterQuery<TransactionTemplate> q) { | ||||
| extension RecurringTransactionQueryLinks on QueryBuilder<RecurringTransaction, | ||||
|     RecurringTransaction, QFilterCondition> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> template(FilterQuery<TransactionTemplate> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'template'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   templateIsNull() { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> templateIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'template', 0, true, 0, true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   account(FilterQuery<Account> q) { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> account(FilterQuery<Account> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'account'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder< | ||||
|     RecurringTransaction, | ||||
|     RecurringTransaction, | ||||
|     QAfterFilterCondition | ||||
|   > | ||||
|   accountIsNull() { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, | ||||
|       QAfterFilterCondition> accountIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'account', 0, true, 0, true); | ||||
|     }); | ||||
| @ -515,28 +428,28 @@ extension RecurringTransactionQueryLinks | ||||
| extension RecurringTransactionQuerySortBy | ||||
|     on QueryBuilder<RecurringTransaction, RecurringTransaction, QSortBy> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   sortByDays() { | ||||
|       sortByDays() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'days', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   sortByDaysDesc() { | ||||
|       sortByDaysDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'days', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   sortByLastExecution() { | ||||
|       sortByLastExecution() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'lastExecution', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   sortByLastExecutionDesc() { | ||||
|       sortByLastExecutionDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'lastExecution', Sort.desc); | ||||
|     }); | ||||
| @ -546,42 +459,42 @@ extension RecurringTransactionQuerySortBy | ||||
| extension RecurringTransactionQuerySortThenBy | ||||
|     on QueryBuilder<RecurringTransaction, RecurringTransaction, QSortThenBy> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenByDays() { | ||||
|       thenByDays() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'days', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenByDaysDesc() { | ||||
|       thenByDaysDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'days', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenById() { | ||||
|       thenById() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'id', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenByIdDesc() { | ||||
|       thenByIdDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'id', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenByLastExecution() { | ||||
|       thenByLastExecution() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'lastExecution', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QAfterSortBy> | ||||
|   thenByLastExecutionDesc() { | ||||
|       thenByLastExecutionDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'lastExecution', Sort.desc); | ||||
|     }); | ||||
| @ -591,27 +504,22 @@ extension RecurringTransactionQuerySortThenBy | ||||
| extension RecurringTransactionQueryWhereDistinct | ||||
|     on QueryBuilder<RecurringTransaction, RecurringTransaction, QDistinct> { | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QDistinct> | ||||
|   distinctByDays() { | ||||
|       distinctByDays() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'days'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, RecurringTransaction, QDistinct> | ||||
|   distinctByLastExecution() { | ||||
|       distinctByLastExecution() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'lastExecution'); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| extension RecurringTransactionQueryProperty | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           RecurringTransaction, | ||||
|           RecurringTransaction, | ||||
|           QQueryProperty | ||||
|         > { | ||||
| extension RecurringTransactionQueryProperty on QueryBuilder< | ||||
|     RecurringTransaction, RecurringTransaction, QQueryProperty> { | ||||
|   QueryBuilder<RecurringTransaction, int, QQueryOperations> idProperty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addPropertyName(r'id'); | ||||
| @ -625,7 +533,7 @@ extension RecurringTransactionQueryProperty | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<RecurringTransaction, DateTime?, QQueryOperations> | ||||
|   lastExecutionProperty() { | ||||
|       lastExecutionProperty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addPropertyName(r'lastExecution'); | ||||
|     }); | ||||
|  | ||||
| @ -18,13 +18,21 @@ const TransactionTemplateSchema = CollectionSchema( | ||||
|   name: r'TransactionTemplate', | ||||
|   id: -2324989530163310644, | ||||
|   properties: { | ||||
|     r'amount': PropertySchema(id: 0, name: r'amount', type: IsarType.double), | ||||
|     r'name': PropertySchema(id: 1, name: r'name', type: IsarType.string), | ||||
|     r'amount': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'amount', | ||||
|       type: IsarType.double, | ||||
|     ), | ||||
|     r'name': PropertySchema( | ||||
|       id: 1, | ||||
|       name: r'name', | ||||
|       type: IsarType.string, | ||||
|     ), | ||||
|     r'recurring': PropertySchema( | ||||
|       id: 2, | ||||
|       name: r'recurring', | ||||
|       type: IsarType.bool, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _transactionTemplateEstimateSize, | ||||
|   serialize: _transactionTemplateSerialize, | ||||
| @ -50,7 +58,7 @@ const TransactionTemplateSchema = CollectionSchema( | ||||
|       name: r'account', | ||||
|       target: r'Account', | ||||
|       single: true, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   embeddedSchemas: {}, | ||||
|   getId: _transactionTemplateGetId, | ||||
| @ -117,29 +125,17 @@ Id _transactionTemplateGetId(TransactionTemplate object) { | ||||
| } | ||||
| 
 | ||||
| List<IsarLinkBase<dynamic>> _transactionTemplateGetLinks( | ||||
|   TransactionTemplate object, | ||||
| ) { | ||||
|     TransactionTemplate object) { | ||||
|   return [object.expenseCategory, object.beneficiary, object.account]; | ||||
| } | ||||
| 
 | ||||
| void _transactionTemplateAttach( | ||||
|   IsarCollection<dynamic> col, | ||||
|   Id id, | ||||
|   TransactionTemplate object, | ||||
| ) { | ||||
|     IsarCollection<dynamic> col, Id id, TransactionTemplate object) { | ||||
|   object.id = id; | ||||
|   object.expenseCategory.attach( | ||||
|     col, | ||||
|     col.isar.collection<ExpenseCategory>(), | ||||
|     r'expenseCategory', | ||||
|     id, | ||||
|   ); | ||||
|   object.beneficiary.attach( | ||||
|     col, | ||||
|     col.isar.collection<Beneficiary>(), | ||||
|     r'beneficiary', | ||||
|     id, | ||||
|   ); | ||||
|       col, col.isar.collection<ExpenseCategory>(), r'expenseCategory', id); | ||||
|   object.beneficiary | ||||
|       .attach(col, col.isar.collection<Beneficiary>(), r'beneficiary', id); | ||||
|   object.account.attach(col, col.isar.collection<Account>(), r'account', id); | ||||
| } | ||||
| 
 | ||||
| @ -155,14 +151,17 @@ extension TransactionTemplateQueryWhereSort | ||||
| extension TransactionTemplateQueryWhere | ||||
|     on QueryBuilder<TransactionTemplate, TransactionTemplate, QWhereClause> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterWhereClause> | ||||
|   idEqualTo(Id id) { | ||||
|       idEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterWhereClause> | ||||
|   idNotEqualTo(Id id) { | ||||
|       idNotEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       if (query.whereSort == Sort.asc) { | ||||
|         return query | ||||
| @ -185,7 +184,7 @@ extension TransactionTemplateQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterWhereClause> | ||||
|   idGreaterThan(Id id, {bool include = false}) { | ||||
|       idGreaterThan(Id id, {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -194,7 +193,7 @@ extension TransactionTemplateQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterWhereClause> | ||||
|   idLessThan(Id id, {bool include = false}) { | ||||
|       idLessThan(Id id, {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -203,83 +202,73 @@ extension TransactionTemplateQueryWhere | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterWhereClause> | ||||
|   idBetween( | ||||
|       idBetween( | ||||
|     Id lowerId, | ||||
|     Id upperId, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| extension TransactionTemplateQueryFilter | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           TransactionTemplate, | ||||
|           TransactionTemplate, | ||||
|           QFilterCondition | ||||
|         > { | ||||
| extension TransactionTemplateQueryFilter on QueryBuilder<TransactionTemplate, | ||||
|     TransactionTemplate, QFilterCondition> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   amountEqualTo(double value, {double epsilon = Query.epsilon}) { | ||||
|       amountEqualTo( | ||||
|     double value, { | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   amountGreaterThan( | ||||
|       amountGreaterThan( | ||||
|     double value, { | ||||
|     bool include = false, | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   amountLessThan( | ||||
|       amountLessThan( | ||||
|     double value, { | ||||
|     bool include = false, | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   amountBetween( | ||||
|       amountBetween( | ||||
|     double lower, | ||||
|     double upper, { | ||||
|     bool includeLower = true, | ||||
| @ -287,125 +276,121 @@ extension TransactionTemplateQueryFilter | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'amount', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'amount', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   idEqualTo(Id value) { | ||||
|       idEqualTo(Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   idGreaterThan(Id value, {bool include = false}) { | ||||
|       idGreaterThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   idLessThan(Id value, {bool include = false}) { | ||||
|       idLessThan( | ||||
|     Id value, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   idBetween( | ||||
|       idBetween( | ||||
|     Id lower, | ||||
|     Id upper, { | ||||
|     bool includeLower = true, | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameEqualTo(String value, {bool caseSensitive = true}) { | ||||
|       nameEqualTo( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameGreaterThan( | ||||
|       nameGreaterThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameLessThan( | ||||
|       nameLessThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameBetween( | ||||
|       nameBetween( | ||||
|     String lower, | ||||
|     String upper, { | ||||
|     bool includeLower = true, | ||||
| @ -413,151 +398,140 @@ extension TransactionTemplateQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'name', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'name', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameStartsWith(String value, {bool caseSensitive = true}) { | ||||
|       nameStartsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameEndsWith(String value, {bool caseSensitive = true}) { | ||||
|       nameEndsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameContains(String value, {bool caseSensitive = true}) { | ||||
|       nameContains(String value, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'name', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'name', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameMatches(String pattern, {bool caseSensitive = true}) { | ||||
|       nameMatches(String pattern, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'name', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'name', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameIsEmpty() { | ||||
|       nameIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   nameIsNotEmpty() { | ||||
|       nameIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'name', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'name', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   recurringEqualTo(bool value) { | ||||
|       recurringEqualTo(bool value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'recurring', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'recurring', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| extension TransactionTemplateQueryObject | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           TransactionTemplate, | ||||
|           TransactionTemplate, | ||||
|           QFilterCondition | ||||
|         > {} | ||||
| extension TransactionTemplateQueryObject on QueryBuilder<TransactionTemplate, | ||||
|     TransactionTemplate, QFilterCondition> {} | ||||
| 
 | ||||
| extension TransactionTemplateQueryLinks | ||||
|     on | ||||
|         QueryBuilder< | ||||
|           TransactionTemplate, | ||||
|           TransactionTemplate, | ||||
|           QFilterCondition | ||||
|         > { | ||||
| extension TransactionTemplateQueryLinks on QueryBuilder<TransactionTemplate, | ||||
|     TransactionTemplate, QFilterCondition> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   expenseCategory(FilterQuery<ExpenseCategory> q) { | ||||
|       expenseCategory(FilterQuery<ExpenseCategory> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'expenseCategory'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   expenseCategoryIsNull() { | ||||
|       expenseCategoryIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'expenseCategory', 0, true, 0, true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   beneficiary(FilterQuery<Beneficiary> q) { | ||||
|       beneficiary(FilterQuery<Beneficiary> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'beneficiary'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   beneficiaryIsNull() { | ||||
|       beneficiaryIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'beneficiary', 0, true, 0, true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   account(FilterQuery<Account> q) { | ||||
|       account(FilterQuery<Account> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'account'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterFilterCondition> | ||||
|   accountIsNull() { | ||||
|       accountIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'account', 0, true, 0, true); | ||||
|     }); | ||||
| @ -567,42 +541,42 @@ extension TransactionTemplateQueryLinks | ||||
| extension TransactionTemplateQuerySortBy | ||||
|     on QueryBuilder<TransactionTemplate, TransactionTemplate, QSortBy> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByAmount() { | ||||
|       sortByAmount() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'amount', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByAmountDesc() { | ||||
|       sortByAmountDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'amount', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByName() { | ||||
|       sortByName() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByNameDesc() { | ||||
|       sortByNameDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByRecurring() { | ||||
|       sortByRecurring() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'recurring', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   sortByRecurringDesc() { | ||||
|       sortByRecurringDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'recurring', Sort.desc); | ||||
|     }); | ||||
| @ -612,56 +586,56 @@ extension TransactionTemplateQuerySortBy | ||||
| extension TransactionTemplateQuerySortThenBy | ||||
|     on QueryBuilder<TransactionTemplate, TransactionTemplate, QSortThenBy> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByAmount() { | ||||
|       thenByAmount() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'amount', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByAmountDesc() { | ||||
|       thenByAmountDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'amount', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenById() { | ||||
|       thenById() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'id', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByIdDesc() { | ||||
|       thenByIdDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'id', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByName() { | ||||
|       thenByName() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByNameDesc() { | ||||
|       thenByNameDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'name', Sort.desc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByRecurring() { | ||||
|       thenByRecurring() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'recurring', Sort.asc); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QAfterSortBy> | ||||
|   thenByRecurringDesc() { | ||||
|       thenByRecurringDesc() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addSortBy(r'recurring', Sort.desc); | ||||
|     }); | ||||
| @ -671,21 +645,21 @@ extension TransactionTemplateQuerySortThenBy | ||||
| extension TransactionTemplateQueryWhereDistinct | ||||
|     on QueryBuilder<TransactionTemplate, TransactionTemplate, QDistinct> { | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QDistinct> | ||||
|   distinctByAmount() { | ||||
|       distinctByAmount() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'amount'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QDistinct> | ||||
|   distinctByName({bool caseSensitive = true}) { | ||||
|       distinctByName({bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'name', caseSensitive: caseSensitive); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, TransactionTemplate, QDistinct> | ||||
|   distinctByRecurring() { | ||||
|       distinctByRecurring() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addDistinctBy(r'recurring'); | ||||
|     }); | ||||
| @ -713,7 +687,7 @@ extension TransactionTemplateQueryProperty | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<TransactionTemplate, bool, QQueryOperations> | ||||
|   recurringProperty() { | ||||
|       recurringProperty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addPropertyName(r'recurring'); | ||||
|     }); | ||||
|  | ||||
| @ -17,9 +17,21 @@ const TransactionSchema = CollectionSchema( | ||||
|   name: r'Transaction', | ||||
|   id: 5320225499417954855, | ||||
|   properties: { | ||||
|     r'amount': PropertySchema(id: 0, name: r'amount', type: IsarType.double), | ||||
|     r'date': PropertySchema(id: 1, name: r'date', type: IsarType.dateTime), | ||||
|     r'tags': PropertySchema(id: 2, name: r'tags', type: IsarType.stringList), | ||||
|     r'amount': PropertySchema( | ||||
|       id: 0, | ||||
|       name: r'amount', | ||||
|       type: IsarType.double, | ||||
|     ), | ||||
|     r'date': PropertySchema( | ||||
|       id: 1, | ||||
|       name: r'date', | ||||
|       type: IsarType.dateTime, | ||||
|     ), | ||||
|     r'tags': PropertySchema( | ||||
|       id: 2, | ||||
|       name: r'tags', | ||||
|       type: IsarType.stringList, | ||||
|     ) | ||||
|   }, | ||||
|   estimateSize: _transactionEstimateSize, | ||||
|   serialize: _transactionSerialize, | ||||
| @ -45,7 +57,7 @@ const TransactionSchema = CollectionSchema( | ||||
|       name: r'beneficiary', | ||||
|       target: r'Beneficiary', | ||||
|       single: true, | ||||
|     ), | ||||
|     ) | ||||
|   }, | ||||
|   embeddedSchemas: {}, | ||||
|   getId: _transactionGetId, | ||||
| @ -122,24 +134,13 @@ List<IsarLinkBase<dynamic>> _transactionGetLinks(Transaction object) { | ||||
| } | ||||
| 
 | ||||
| void _transactionAttach( | ||||
|   IsarCollection<dynamic> col, | ||||
|   Id id, | ||||
|   Transaction object, | ||||
| ) { | ||||
|     IsarCollection<dynamic> col, Id id, Transaction object) { | ||||
|   object.id = id; | ||||
|   object.expenseCategory.attach( | ||||
|     col, | ||||
|     col.isar.collection<ExpenseCategory>(), | ||||
|     r'expenseCategory', | ||||
|     id, | ||||
|   ); | ||||
|       col, col.isar.collection<ExpenseCategory>(), r'expenseCategory', id); | ||||
|   object.account.attach(col, col.isar.collection<Account>(), r'account', id); | ||||
|   object.beneficiary.attach( | ||||
|     col, | ||||
|     col.isar.collection<Beneficiary>(), | ||||
|     r'beneficiary', | ||||
|     id, | ||||
|   ); | ||||
|   object.beneficiary | ||||
|       .attach(col, col.isar.collection<Beneficiary>(), r'beneficiary', id); | ||||
| } | ||||
| 
 | ||||
| extension TransactionQueryWhereSort | ||||
| @ -155,13 +156,15 @@ extension TransactionQueryWhere | ||||
|     on QueryBuilder<Transaction, Transaction, QWhereClause> { | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idEqualTo(Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause(IdWhereClause.between(lower: id, upper: id)); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: id, | ||||
|         upper: id, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idNotEqualTo( | ||||
|     Id id, | ||||
|   ) { | ||||
|       Id id) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       if (query.whereSort == Sort.asc) { | ||||
|         return query | ||||
| @ -183,10 +186,8 @@ extension TransactionQueryWhere | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idGreaterThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idGreaterThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.greaterThan(lower: id, includeLower: include), | ||||
| @ -194,10 +195,8 @@ extension TransactionQueryWhere | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idLessThan( | ||||
|     Id id, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|   QueryBuilder<Transaction, Transaction, QAfterWhereClause> idLessThan(Id id, | ||||
|       {bool include = false}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.lessThan(upper: id, includeUpper: include), | ||||
| @ -212,14 +211,12 @@ extension TransactionQueryWhere | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addWhereClause( | ||||
|         IdWhereClause.between( | ||||
|           lower: lowerId, | ||||
|           includeLower: includeLower, | ||||
|           upper: upperId, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addWhereClause(IdWhereClause.between( | ||||
|         lower: lowerId, | ||||
|         includeLower: includeLower, | ||||
|         upper: upperId, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| @ -231,31 +228,27 @@ extension TransactionQueryFilter | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   amountGreaterThan( | ||||
|       amountGreaterThan( | ||||
|     double value, { | ||||
|     bool include = false, | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -265,14 +258,12 @@ extension TransactionQueryFilter | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'amount', | ||||
|           value: value, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'amount', | ||||
|         value: value, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -284,26 +275,24 @@ extension TransactionQueryFilter | ||||
|     double epsilon = Query.epsilon, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'amount', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           epsilon: epsilon, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'amount', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         epsilon: epsilon, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> dateEqualTo( | ||||
|     DateTime value, | ||||
|   ) { | ||||
|       DateTime value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'date', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'date', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -312,13 +301,11 @@ extension TransactionQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'date', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'date', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -327,13 +314,11 @@ extension TransactionQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'date', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'date', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -344,25 +329,23 @@ extension TransactionQueryFilter | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'date', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'date', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> idEqualTo( | ||||
|     Id value, | ||||
|   ) { | ||||
|       Id value) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'id', value: value), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -371,13 +354,11 @@ extension TransactionQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -386,13 +367,11 @@ extension TransactionQueryFilter | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'id', | ||||
|           value: value, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'id', | ||||
|         value: value, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
| @ -403,69 +382,64 @@ extension TransactionQueryFilter | ||||
|     bool includeUpper = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'id', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'id', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementEqualTo(String value, {bool caseSensitive = true}) { | ||||
|       tagsElementEqualTo( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo( | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementGreaterThan( | ||||
|       tagsElementGreaterThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan( | ||||
|           include: include, | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         include: include, | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementLessThan( | ||||
|       tagsElementLessThan( | ||||
|     String value, { | ||||
|     bool include = false, | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.lessThan( | ||||
|           include: include, | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.lessThan( | ||||
|         include: include, | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementBetween( | ||||
|       tagsElementBetween( | ||||
|     String lower, | ||||
|     String upper, { | ||||
|     bool includeLower = true, | ||||
| @ -473,125 +447,159 @@ extension TransactionQueryFilter | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.between( | ||||
|           property: r'tags', | ||||
|           lower: lower, | ||||
|           includeLower: includeLower, | ||||
|           upper: upper, | ||||
|           includeUpper: includeUpper, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.between( | ||||
|         property: r'tags', | ||||
|         lower: lower, | ||||
|         includeLower: includeLower, | ||||
|         upper: upper, | ||||
|         includeUpper: includeUpper, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementStartsWith(String value, {bool caseSensitive = true}) { | ||||
|       tagsElementStartsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.startsWith( | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.startsWith( | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementEndsWith(String value, {bool caseSensitive = true}) { | ||||
|       tagsElementEndsWith( | ||||
|     String value, { | ||||
|     bool caseSensitive = true, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.endsWith( | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.endsWith( | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementContains(String value, {bool caseSensitive = true}) { | ||||
|       tagsElementContains(String value, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.contains( | ||||
|           property: r'tags', | ||||
|           value: value, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.contains( | ||||
|         property: r'tags', | ||||
|         value: value, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementMatches(String pattern, {bool caseSensitive = true}) { | ||||
|       tagsElementMatches(String pattern, {bool caseSensitive = true}) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.matches( | ||||
|           property: r'tags', | ||||
|           wildcard: pattern, | ||||
|           caseSensitive: caseSensitive, | ||||
|         ), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.matches( | ||||
|         property: r'tags', | ||||
|         wildcard: pattern, | ||||
|         caseSensitive: caseSensitive, | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementIsEmpty() { | ||||
|       tagsElementIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.equalTo(property: r'tags', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.equalTo( | ||||
|         property: r'tags', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsElementIsNotEmpty() { | ||||
|       tagsElementIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.addFilterCondition( | ||||
|         FilterCondition.greaterThan(property: r'tags', value: ''), | ||||
|       ); | ||||
|       return query.addFilterCondition(FilterCondition.greaterThan( | ||||
|         property: r'tags', | ||||
|         value: '', | ||||
|       )); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsLengthEqualTo(int length) { | ||||
|       tagsLengthEqualTo(int length) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.listLength(r'tags', length, true, length, true); | ||||
|       return query.listLength( | ||||
|         r'tags', | ||||
|         length, | ||||
|         true, | ||||
|         length, | ||||
|         true, | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> tagsIsEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.listLength(r'tags', 0, true, 0, true); | ||||
|       return query.listLength( | ||||
|         r'tags', | ||||
|         0, | ||||
|         true, | ||||
|         0, | ||||
|         true, | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsIsNotEmpty() { | ||||
|       tagsIsNotEmpty() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.listLength(r'tags', 0, false, 999999, true); | ||||
|       return query.listLength( | ||||
|         r'tags', | ||||
|         0, | ||||
|         false, | ||||
|         999999, | ||||
|         true, | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsLengthLessThan(int length, {bool include = false}) { | ||||
|       tagsLengthLessThan( | ||||
|     int length, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.listLength(r'tags', 0, true, length, include); | ||||
|       return query.listLength( | ||||
|         r'tags', | ||||
|         0, | ||||
|         true, | ||||
|         length, | ||||
|         include, | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsLengthGreaterThan(int length, {bool include = false}) { | ||||
|       tagsLengthGreaterThan( | ||||
|     int length, { | ||||
|     bool include = false, | ||||
|   }) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.listLength(r'tags', length, include, 999999, true); | ||||
|       return query.listLength( | ||||
|         r'tags', | ||||
|         length, | ||||
|         include, | ||||
|         999999, | ||||
|         true, | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   tagsLengthBetween( | ||||
|       tagsLengthBetween( | ||||
|     int lower, | ||||
|     int upper, { | ||||
|     bool includeLower = true, | ||||
| @ -615,45 +623,42 @@ extension TransactionQueryObject | ||||
| extension TransactionQueryLinks | ||||
|     on QueryBuilder<Transaction, Transaction, QFilterCondition> { | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> expenseCategory( | ||||
|     FilterQuery<ExpenseCategory> q, | ||||
|   ) { | ||||
|       FilterQuery<ExpenseCategory> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'expenseCategory'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   expenseCategoryIsNull() { | ||||
|       expenseCategoryIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'expenseCategory', 0, true, 0, true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> account( | ||||
|     FilterQuery<Account> q, | ||||
|   ) { | ||||
|       FilterQuery<Account> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'account'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   accountIsNull() { | ||||
|       accountIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'account', 0, true, 0, true); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> beneficiary( | ||||
|     FilterQuery<Beneficiary> q, | ||||
|   ) { | ||||
|       FilterQuery<Beneficiary> q) { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.link(q, r'beneficiary'); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   QueryBuilder<Transaction, Transaction, QAfterFilterCondition> | ||||
|   beneficiaryIsNull() { | ||||
|       beneficiaryIsNull() { | ||||
|     return QueryBuilder.apply(this, (query) { | ||||
|       return query.linkLength(r'beneficiary', 0, true, 0, true); | ||||
|     }); | ||||
|  | ||||
| @ -12,6 +12,8 @@ import 'package:okane/ui/state/core.dart'; | ||||
| import 'package:okane/ui/utils.dart'; | ||||
| import 'package:path_provider/path_provider.dart'; | ||||
| 
 | ||||
| import 'collections/budget.dart'; | ||||
| 
 | ||||
| Future<Isar> openDatabase() async { | ||||
|   final dir = await getApplicationDocumentsDirectory(); | ||||
|   return Isar.open([ | ||||
| @ -21,6 +23,8 @@ Future<Isar> openDatabase() async { | ||||
|     TransactionTemplateSchema, | ||||
|     RecurringTransactionSchema, | ||||
|     ExpenseCategorySchema, | ||||
|     BudgetSchema, | ||||
|     BudgetItemSchema, | ||||
|   ], directory: dir.path); | ||||
| } | ||||
| 
 | ||||
| @ -205,3 +209,56 @@ Future<List<ExpenseCategory>> getExpenseCategories() { | ||||
| Stream<void> watchExpenseCategory() { | ||||
|   return GetIt.I.get<Isar>().expenseCategorys.watchLazy(fireImmediately: true); | ||||
| } | ||||
| 
 | ||||
| Stream<void> watchBudgets(Account account) { | ||||
|   return GetIt.I.get<Isar>().budgets.filter().account((q) => q.idEqualTo(account.id)).watchLazy(fireImmediately: true); | ||||
| } | ||||
| 
 | ||||
| Future<List<Budget>> getBudgets(Account? account) { | ||||
|   if (account == null) { | ||||
|     return Future.value([]); | ||||
|   } | ||||
| 
 | ||||
|   return GetIt.I.get<Isar>().budgets.filter().account((q) => q.idEqualTo(account.id)).findAll(); | ||||
| } | ||||
| 
 | ||||
| Future<void> upsertBudget(Budget budget) { | ||||
|   final db = GetIt.I.get<Isar>(); | ||||
|   return db.writeTxn(() async { | ||||
|     await db.budgets.put(budget); | ||||
|     await budget.items.save(); | ||||
|     await budget.account.save(); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| Future<void> upsertBudgetItem(BudgetItem item) { | ||||
|   final db = GetIt.I.get<Isar>(); | ||||
|   return db.writeTxn(() async { | ||||
|     await db.budgetItems.put(item); | ||||
|     await item.expenseCategory.save(); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| enum TransactionQueryDateOption { | ||||
|   thisMonth, | ||||
| } | ||||
| 
 | ||||
| Future<List<Transaction>> getTransactionsInTimeframe(Account account, DateTime today, TransactionQueryDateOption option) async { | ||||
|   final lower = switch (option) { | ||||
|     TransactionQueryDateOption.thisMonth => DateTime( | ||||
|       today.year, | ||||
|       today.month, | ||||
|       0, | ||||
|     ), | ||||
|   }; | ||||
|   final upper = switch (option) { | ||||
|     TransactionQueryDateOption.thisMonth => monthEnding(today), | ||||
|   }; | ||||
| 
 | ||||
|   return GetIt.I.get<Isar>() | ||||
|       .transactions | ||||
|       .filter() | ||||
|       .account((q) => q.idEqualTo(account.id)) | ||||
|       .dateBetween(lower, upper) | ||||
|       .findAll(); | ||||
| } | ||||
| @ -8,6 +8,7 @@ import 'package:isar/isar.dart'; | ||||
| import 'package:okane/database/database.dart'; | ||||
| import 'package:okane/screen.dart'; | ||||
| import 'package:okane/ui/navigation.dart'; | ||||
| import 'package:okane/ui/pages/budgets/budget_details.dart'; | ||||
| import 'package:okane/ui/pages/transaction_details.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
| 
 | ||||
| @ -39,6 +40,7 @@ class MyApp extends StatelessWidget { | ||||
|         onGenerateRoute: | ||||
|             (settings) => switch (settings.name) { | ||||
|               "/transactions/details" => TransactionDetailsPage.mobileRoute, | ||||
|               "/budgets/details" => BudgetDetailsPage.mobileRoute, | ||||
|               _ => MaterialPageRoute<void>(builder: (_) => Text("Unknown!!")), | ||||
|             }, | ||||
|       ), | ||||
| @ -86,10 +88,7 @@ class _MyHomePageState extends State<MyHomePage> { | ||||
|         } | ||||
| 
 | ||||
|         return Scaffold( | ||||
|           bottomNavigationBar: switch (screenSize) { | ||||
|             ScreenSize.normal => null, | ||||
|             ScreenSize.small => OkaneNavigationBar(), | ||||
|           }, | ||||
|           drawer: OkaneNavigationDrawer(), | ||||
|           body: switch (screenSize) { | ||||
|             ScreenSize.normal => const Row( | ||||
|               children: [ | ||||
|  | ||||
| @ -2,6 +2,8 @@ import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:okane/screen.dart'; | ||||
| import 'package:okane/ui/pages/account/account.dart'; | ||||
| import 'package:okane/ui/pages/budgets/budget_details.dart'; | ||||
| import 'package:okane/ui/pages/budgets/budgets.dart'; | ||||
| import 'package:okane/ui/pages/template_list.dart'; | ||||
| import 'package:okane/ui/pages/transaction_details.dart'; | ||||
| import 'package:okane/ui/pages/transaction_list.dart'; | ||||
| @ -66,8 +68,8 @@ final _pages = <OkanePageItem>[ | ||||
|     OkanePage.budgets, | ||||
|     Icons.pie_chart, | ||||
|     "Budgets", | ||||
|     Placeholder(), | ||||
|     null, | ||||
|     BudgetListPage(), | ||||
|     (_) => BudgetDetailsPage(), | ||||
|   ), | ||||
| ]; | ||||
| 
 | ||||
| @ -105,6 +107,29 @@ class OkaneNavigationBar extends StatelessWidget { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class OkaneNavigationDrawer extends StatelessWidget { | ||||
|   const OkaneNavigationDrawer({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return BlocBuilder<CoreCubit, CoreState>( | ||||
|         builder: (context, state) => Drawer( | ||||
|           child: ListView( | ||||
|             children: _pages.map((p) => ListTile( | ||||
|               title: Text(p.label), | ||||
|               leading: Icon(p.icon), | ||||
|               selected: p.page == state.activePage, | ||||
|               onTap: () { | ||||
|                 context.read<CoreCubit>().setPage(p.page); | ||||
|                 Navigator.of(context).pop(); | ||||
|               }, | ||||
|             )).toList(), | ||||
|           ), | ||||
|         ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class OkaneNavigationLayout extends StatelessWidget { | ||||
|   const OkaneNavigationLayout({super.key}); | ||||
| 
 | ||||
| @ -119,7 +144,27 @@ class OkaneNavigationLayout extends StatelessWidget { | ||||
|                 _pages | ||||
|                     .map( | ||||
|                       (p) => switch (screenSize) { | ||||
|                         ScreenSize.small => p.child, | ||||
|                         ScreenSize.small => Column( | ||||
|                           children: [ | ||||
|                             SizedBox( | ||||
|                               height: 50, | ||||
|                               child: Padding( | ||||
|                                 padding: EdgeInsets.all(8), | ||||
|                                 child: Row( | ||||
|                                   children: [ | ||||
|                                     IconButton( | ||||
|                                       icon: Icon(Icons.menu), | ||||
|                                       onPressed: () { | ||||
|                                         Scaffold.of(context).openDrawer(); | ||||
|                                       }, | ||||
|                                     ), | ||||
|                                   ], | ||||
|                                 ), | ||||
|                               ), | ||||
|                             ), | ||||
|                             Expanded(child: p.child), | ||||
|                           ], | ||||
|                         ), | ||||
|                         ScreenSize.normal => | ||||
|                           p.details != null | ||||
|                               ? Row( | ||||
|  | ||||
| @ -111,20 +111,6 @@ class AccountListPageState extends State<AccountListPage> { | ||||
|               child: UpcomingTransactionsCard(), | ||||
|             ), | ||||
| 
 | ||||
|             /* | ||||
|             BlocBuilder<CoreCubit, CoreState>( | ||||
|               builder: | ||||
|                   (context, state) => Row( | ||||
|                     children: [ | ||||
|                       Expanded( | ||||
|                         child: Padding( | ||||
|                           padding: EdgeInsets.all(16), | ||||
|                           child: AccountBalanceGraphCard(), | ||||
|                         ), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|             ),*/ | ||||
|             Row( | ||||
|               children: [ | ||||
|                 Padding(padding: EdgeInsets.all(16), child: BreakdownCard()), | ||||
|  | ||||
| @ -28,15 +28,17 @@ class TotalBalanceCard extends StatelessWidget { | ||||
|             child: Column( | ||||
|               mainAxisSize: MainAxisSize.min, | ||||
|               children: [ | ||||
|                 Text("Total balance"), | ||||
|                 Text( | ||||
|                     "Total balance", | ||||
|                   style: Theme.of(context).textTheme.titleLarge, | ||||
|                 ), | ||||
|                 FutureBuilder( | ||||
|                   future: _getTotalBalance(state.accounts), | ||||
|                   builder: (context, snapshot) { | ||||
|                     if (!snapshot.hasData) { | ||||
|                       return Text("..."); | ||||
|                     } | ||||
| 
 | ||||
|                     return Text(formatCurrency(snapshot.data!)); | ||||
|                     return Text( | ||||
|                       snapshot.hasData ? formatCurrency(snapshot.data!) : "...", | ||||
|                       style: Theme.of(context).textTheme.bodyLarge, | ||||
|                     ); | ||||
|                   }, | ||||
|                 ), | ||||
|               ], | ||||
|  | ||||
| @ -1,6 +1,4 @@ | ||||
| import 'dart:math'; | ||||
| 
 | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:okane/database/collections/recurrent.dart'; | ||||
| @ -29,7 +27,12 @@ class UpcomingTransactionsCard extends StatelessWidget { | ||||
|                 : upcomingRaw.sublist(0, min(upcomingRaw.length, 3)); | ||||
|         final transactions = | ||||
|             upcoming.isEmpty | ||||
|                 ? [Text("No upcoming transactions")] | ||||
|                 ? [ | ||||
|                   Text( | ||||
|                     "No upcoming transactions", | ||||
|                     style: Theme.of(context).textTheme.bodyLarge, | ||||
|                   ), | ||||
|                 ] | ||||
|                 : upcoming | ||||
|                     .map( | ||||
|                       (t) => ListTile( | ||||
| @ -59,7 +62,14 @@ class UpcomingTransactionsCard extends StatelessWidget { | ||||
|           child: Padding( | ||||
|             padding: const EdgeInsets.all(16), | ||||
|             child: Column( | ||||
|               children: <Widget>[Text("Upcoming Transactions")] + transactions, | ||||
|               children: | ||||
|                   <Widget>[ | ||||
|                     Text( | ||||
|                       "Upcoming Transactions", | ||||
|                       style: Theme.of(context).textTheme.titleLarge, | ||||
|                     ), | ||||
|                   ] + | ||||
|                   transactions, | ||||
|             ), | ||||
|           ), | ||||
|         ); | ||||
|  | ||||
							
								
								
									
										65
									
								
								lib/ui/pages/budgets/add_budget.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								lib/ui/pages/budgets/add_budget.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:okane/database/collections/budget.dart'; | ||||
| import 'package:okane/database/database.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
| 
 | ||||
| class AddBudgetPopup extends StatefulWidget { | ||||
|   final VoidCallback onDone; | ||||
| 
 | ||||
|   const AddBudgetPopup({super.key, required this.onDone}); | ||||
| 
 | ||||
|   @override | ||||
|   AddBudgetState createState() => AddBudgetState(); | ||||
| } | ||||
| 
 | ||||
| class AddBudgetState extends State<AddBudgetPopup> { | ||||
|   final _budgetNameEditController = TextEditingController(); | ||||
|   final _budgetIncomeEditController = TextEditingController(); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Column( | ||||
|       mainAxisSize: MainAxisSize.min, | ||||
|       children: [ | ||||
|         TextField( | ||||
|           decoration: InputDecoration( | ||||
|             hintText: "Budget name", | ||||
|           ), | ||||
|           controller: _budgetNameEditController, | ||||
|         ), | ||||
| 
 | ||||
|         TextField( | ||||
|           decoration: InputDecoration( | ||||
|             hintText: "Income", | ||||
|           ), | ||||
|           controller: _budgetIncomeEditController, | ||||
|           keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),  | ||||
|         ), | ||||
| 
 | ||||
|         Row( | ||||
|           mainAxisAlignment: MainAxisAlignment.end, | ||||
|           children: [ | ||||
|             OutlinedButton( | ||||
|                 onPressed: () async { | ||||
|                   if (_budgetNameEditController.text.isEmpty || _budgetIncomeEditController.text.isEmpty) { | ||||
|                     return; | ||||
|                   } | ||||
| 
 | ||||
|                   final bloc = GetIt.I.get<CoreCubit>(); | ||||
|                   final budget = Budget() | ||||
|                     ..name = _budgetNameEditController.text | ||||
|                     ..period = BudgetPeriod.month | ||||
|                     ..income = double.parse(_budgetIncomeEditController.text) | ||||
|                     ..account.value = bloc.activeAccount!; | ||||
|                   await upsertBudget(budget); | ||||
|                   widget.onDone(); | ||||
|                 }, | ||||
|                 child: Text("Add"), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										85
									
								
								lib/ui/pages/budgets/add_budget_item.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								lib/ui/pages/budgets/add_budget_item.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:okane/database/collections/budget.dart'; | ||||
| import 'package:okane/database/collections/expense_category.dart'; | ||||
| import 'package:okane/database/database.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
| import 'package:okane/ui/utils.dart'; | ||||
| import 'package:okane/ui/widgets/add_expense_category.dart'; | ||||
| 
 | ||||
| class AddBudgetItemPopup extends StatefulWidget { | ||||
|   final VoidCallback onDone; | ||||
|   final Budget budget; | ||||
| 
 | ||||
|   const AddBudgetItemPopup({super.key, required this.onDone, required this.budget}); | ||||
| 
 | ||||
|   @override | ||||
|   AddBudgetItemState createState() => AddBudgetItemState(); | ||||
| } | ||||
| 
 | ||||
| class AddBudgetItemState extends State<AddBudgetItemPopup> { | ||||
|   final _budgetItemAmountEditController = TextEditingController(); | ||||
|   ExpenseCategory? _expenseCategory; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Column( | ||||
|       mainAxisSize: MainAxisSize.min, | ||||
|       children: [ | ||||
|         Row( | ||||
|           children: [ | ||||
|             Text("Expense category"), | ||||
| 
 | ||||
|             OutlinedButton( | ||||
|                 onPressed: () async { | ||||
|                   final category = await showDialogOrModal( | ||||
|                     context: context, | ||||
|                     builder: (_) => AddExpenseCategory(), | ||||
|                   ); | ||||
|                   if (category == null) { | ||||
|                     return; | ||||
|                   } | ||||
| 
 | ||||
|                   setState(() => _expenseCategory = category); | ||||
|                 }, | ||||
|                 child: Text(_expenseCategory?.name ?? "None"), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
| 
 | ||||
|         TextField( | ||||
|           decoration: InputDecoration( | ||||
|             hintText: "Amount", | ||||
|           ), | ||||
|           controller: _budgetItemAmountEditController, | ||||
|           keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),  | ||||
|         ), | ||||
| 
 | ||||
|         Row( | ||||
|           mainAxisAlignment: MainAxisAlignment.end, | ||||
|           children: [ | ||||
|             OutlinedButton( | ||||
|                 onPressed: () async { | ||||
|                   if (_budgetItemAmountEditController.text.isEmpty || _expenseCategory == null) { | ||||
|                     return; | ||||
|                   } | ||||
|                   if (widget.budget.items.where((i) => i.expenseCategory.value!.name == _expenseCategory!.name).firstOrNull != null) { | ||||
|                     return; | ||||
|                   } | ||||
| 
 | ||||
|                   final item = BudgetItem() | ||||
|                     ..expenseCategory.value = _expenseCategory | ||||
|                     ..amount = double.parse(_budgetItemAmountEditController.text); | ||||
|                   await upsertBudgetItem(item); | ||||
|                   widget.budget.items.add(item); | ||||
|                   await upsertBudget(widget.budget); | ||||
|                   widget.onDone(); | ||||
|                 }, | ||||
|                 child: Text("Add"), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										374
									
								
								lib/ui/pages/budgets/budget_details.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										374
									
								
								lib/ui/pages/budgets/budget_details.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,374 @@ | ||||
| import 'package:fl_chart/fl_chart.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/rendering.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:okane/database/collections/budget.dart'; | ||||
| import 'package:okane/database/database.dart'; | ||||
| import 'package:okane/ui/pages/account/breakdown_card.dart'; | ||||
| import 'package:okane/ui/pages/budgets/add_budget_item.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
| import 'package:okane/ui/utils.dart'; | ||||
| 
 | ||||
| class BudgetDetailsPage extends StatelessWidget { | ||||
|   final bool isPage; | ||||
| 
 | ||||
|   const BudgetDetailsPage({this.isPage = false, super.key}); | ||||
| 
 | ||||
|   static MaterialPageRoute<void> get mobileRoute => | ||||
|       MaterialPageRoute(builder: (_) => BudgetDetailsPage(isPage: true)); | ||||
| 
 | ||||
|   void _addBudgetItem(BuildContext context, CoreState state) { | ||||
|     showDialogOrModal( | ||||
|       context: context, | ||||
|       builder: | ||||
|           (_) => AddBudgetItemPopup( | ||||
|             budget: state.activeBudget!, | ||||
|             onDone: () { | ||||
|               Navigator.of(context).pop(); | ||||
|             }, | ||||
|           ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       body: Column( | ||||
|         children: [ | ||||
|           if (isPage) | ||||
|             SizedBox( | ||||
|               height: 50, | ||||
|               child: Row( | ||||
|                 children: [ | ||||
|                   IconButton( | ||||
|                     icon: Icon(Icons.arrow_back), | ||||
|                     onPressed: () { | ||||
|                       Navigator.of(context).pop(); | ||||
|                     }, | ||||
|                   ), | ||||
|                 ], | ||||
|               ), | ||||
|             ), | ||||
| 
 | ||||
|           BlocBuilder<CoreCubit, CoreState>( | ||||
|             builder: (context, state) { | ||||
|               if (state.activeBudget == null) { | ||||
|                 return Text("No budget selected"); | ||||
|               } | ||||
| 
 | ||||
|               if (state.activeBudget!.items.isEmpty) { | ||||
|                 return Row( | ||||
|                   children: [ | ||||
|                     Text("No budget items added"), | ||||
|                     Padding( | ||||
|                       padding: EdgeInsets.only(left: 16), | ||||
|                       child: IconButton( | ||||
|                         onPressed: () => _addBudgetItem(context, state), | ||||
|                         icon: Icon(Icons.add), | ||||
|                       ), | ||||
|                     ), | ||||
|                   ], | ||||
|                 ); | ||||
|               } | ||||
| 
 | ||||
|               final bloc = GetIt.I.get<CoreCubit>(); | ||||
|               final today = DateTime.now(); | ||||
|               return FutureBuilder( | ||||
|                 future: getTransactionsInTimeframe( | ||||
|                   bloc.activeAccount!, | ||||
|                   today, | ||||
|                   TransactionQueryDateOption.thisMonth, | ||||
|                 ), | ||||
|                 builder: (context, snapshot) { | ||||
|                   final daysLeft = switch (state.activeBudget!.period) { | ||||
|                     BudgetPeriod.month => | ||||
|                       monthEnding(today).difference(today).inDays, | ||||
|                   }; | ||||
| 
 | ||||
|                   if (!snapshot.hasData) { | ||||
|                     return Column( | ||||
|                       mainAxisSize: MainAxisSize.min, | ||||
|                       children: [ | ||||
|                         Text( | ||||
|                           "Budget items", | ||||
|                           style: Theme.of(context).textTheme.titleMedium, | ||||
|                         ), | ||||
|                         ListView.builder( | ||||
|                           shrinkWrap: true, | ||||
|                           itemCount: state.activeBudget!.items.length, | ||||
|                           itemBuilder: (context, index) { | ||||
|                             final item = state.activeBudget!.items.elementAt( | ||||
|                               index, | ||||
|                             ); | ||||
|                             final amount = formatCurrency(item.amount); | ||||
|                             return ListTile( | ||||
|                               title: Text( | ||||
|                                 "${item.expenseCategory.value!.name} ($amount)", | ||||
|                               ), | ||||
|                               subtitle: Text("..."), | ||||
|                             ); | ||||
|                           }, | ||||
|                         ), | ||||
|                       ], | ||||
|                     ); | ||||
|                   } | ||||
| 
 | ||||
|                   final spending = <String, double>{}; | ||||
|                   for (final t in snapshot.data!) { | ||||
|                     if (t.expenseCategory.value == null) { | ||||
|                       continue; | ||||
|                     } | ||||
| 
 | ||||
|                     spending.update( | ||||
|                       t.expenseCategory.value!.name, | ||||
|                       (value) => value + t.amount, | ||||
|                       ifAbsent: () => t.amount, | ||||
|                     ); | ||||
|                   } | ||||
| 
 | ||||
|                   final budgetTotal = state.activeBudget!.items | ||||
|                       .map((i) => i.amount) | ||||
|                       .reduce((acc, val) => acc + val); | ||||
|                   return Column( | ||||
|                     mainAxisSize: MainAxisSize.min, | ||||
|                     crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                     children: [ | ||||
|                       SizedBox( | ||||
|                         height: 100, | ||||
|                         child: ListView( | ||||
|                           scrollDirection: Axis.horizontal, | ||||
|                           children: [ | ||||
|                             Padding( | ||||
|                               padding: EdgeInsets.all(8), | ||||
|                               child: SizedBox( | ||||
|                                 height: 100, | ||||
|                                 width: 150, | ||||
|                                 child: Card( | ||||
|                                   child: Column( | ||||
|                                     crossAxisAlignment: | ||||
|                                         CrossAxisAlignment.center, | ||||
|                                     mainAxisAlignment: MainAxisAlignment.center, | ||||
|                                     children: [ | ||||
|                                       Text( | ||||
|                                         "Days left", | ||||
|                                         textAlign: TextAlign.center, | ||||
|                                         style: | ||||
|                                             Theme.of( | ||||
|                                               context, | ||||
|                                             ).textTheme.titleLarge, | ||||
|                                       ), | ||||
|                                       Text( | ||||
|                                         daysLeft.toString(), | ||||
|                                         textAlign: TextAlign.center, | ||||
|                                         style: | ||||
|                                             Theme.of( | ||||
|                                               context, | ||||
|                                             ).textTheme.bodyLarge, | ||||
|                                       ), | ||||
|                                     ], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                               ), | ||||
|                             ), | ||||
|                             Padding( | ||||
|                               padding: EdgeInsets.all(8), | ||||
|                               child: SizedBox( | ||||
|                                 height: 100, | ||||
|                                 width: 150, | ||||
|                                 child: Card( | ||||
|                                   child: Column( | ||||
|                                     crossAxisAlignment: | ||||
|                                         CrossAxisAlignment.center, | ||||
|                                     mainAxisAlignment: MainAxisAlignment.center, | ||||
|                                     children: [ | ||||
|                                       Text( | ||||
|                                         "Budget total", | ||||
|                                         textAlign: TextAlign.center, | ||||
|                                         style: | ||||
|                                             Theme.of( | ||||
|                                               context, | ||||
|                                             ).textTheme.titleLarge, | ||||
|                                       ), | ||||
|                                       Text( | ||||
|                                         formatCurrency(budgetTotal), | ||||
|                                         textAlign: TextAlign.center, | ||||
|                                         style: | ||||
|                                             Theme.of( | ||||
|                                               context, | ||||
|                                             ).textTheme.bodyLarge, | ||||
|                                       ), | ||||
|                                     ], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|                       ), | ||||
| 
 | ||||
|                       Padding( | ||||
|                         padding: EdgeInsets.all(8), | ||||
|                         child: SizedBox( | ||||
|                           child: Card( | ||||
|                             child: Column( | ||||
|                               crossAxisAlignment: CrossAxisAlignment.center, | ||||
|                               children: [ | ||||
|                                 Padding( | ||||
|                                   padding: EdgeInsets.only(top: 8), | ||||
|                                   child: Text( | ||||
|                                     "Budget breakdown", | ||||
|                                     style: | ||||
|                                         Theme.of(context).textTheme.titleLarge, | ||||
|                                     textAlign: TextAlign.center, | ||||
|                                   ), | ||||
|                                 ), | ||||
|                                 Row( | ||||
|                                   mainAxisSize: MainAxisSize.min, | ||||
|                                   children: [ | ||||
|                                     Padding( | ||||
|                                       padding: EdgeInsets.all(16), | ||||
|                                       child: SizedBox( | ||||
|                                         width: 150, | ||||
|                                         height: 150, | ||||
|                                         child: AspectRatio( | ||||
|                                           aspectRatio: 1, | ||||
|                                           child: PieChart( | ||||
|                                             PieChartData( | ||||
|                                               borderData: FlBorderData( | ||||
|                                                 show: false, | ||||
|                                               ), | ||||
|                                               sectionsSpace: 0, | ||||
|                                               centerSpaceRadius: 35, | ||||
|                                               sections: | ||||
|                                                   state.activeBudget!.items | ||||
|                                                       .map( | ||||
|                                                         ( | ||||
|                                                           i, | ||||
|                                                         ) => PieChartSectionData( | ||||
|                                                           value: i.amount.abs(), | ||||
|                                                           title: formatCurrency( | ||||
|                                                             i.amount.abs(), | ||||
|                                                           ), | ||||
|                                                           titleStyle: TextStyle( | ||||
|                                                             fontWeight: | ||||
|                                                                 FontWeight.bold, | ||||
|                                                           ), | ||||
|                                                           radius: 40, | ||||
|                                                           color: colorHash( | ||||
|                                                             i | ||||
|                                                                 .expenseCategory | ||||
|                                                                 .value! | ||||
|                                                                 .name, | ||||
|                                                           ), | ||||
|                                                         ), | ||||
|                                                       ) | ||||
|                                                       .toList(), | ||||
|                                             ), | ||||
|                                           ), | ||||
|                                         ), | ||||
|                                       ), | ||||
|                                     ), | ||||
| 
 | ||||
|                                     Padding( | ||||
|                                       padding: EdgeInsets.symmetric( | ||||
|                                         horizontal: 8, | ||||
|                                       ), | ||||
|                                       child: Column( | ||||
|                                         crossAxisAlignment: | ||||
|                                             CrossAxisAlignment.start, | ||||
|                                         children: | ||||
|                                             state.activeBudget!.items | ||||
|                                                 .map( | ||||
|                                                   (i) => LegendItem( | ||||
|                                                     text: | ||||
|                                                         i | ||||
|                                                             .expenseCategory | ||||
|                                                             .value! | ||||
|                                                             .name, | ||||
|                                                     color: colorHash( | ||||
|                                                       i | ||||
|                                                           .expenseCategory | ||||
|                                                           .value! | ||||
|                                                           .name, | ||||
|                                                     ), | ||||
|                                                   ), | ||||
|                                                 ) | ||||
|                                                 .toList(), | ||||
|                                       ), | ||||
|                                     ), | ||||
|                                   ], | ||||
|                                 ), | ||||
|                               ], | ||||
|                             ), | ||||
|                           ), | ||||
|                         ), | ||||
|                       ), | ||||
| 
 | ||||
|                       Padding( | ||||
|                         padding: EdgeInsets.all(8), | ||||
|                         child: Row( | ||||
|                           children: [ | ||||
|                             Text( | ||||
|                               "Budget items", | ||||
|                               style: Theme.of(context).textTheme.titleMedium, | ||||
|                             ), | ||||
|                             Padding( | ||||
|                               padding: EdgeInsets.only(left: 16), | ||||
|                               child: IconButton( | ||||
|                                 icon: Icon(Icons.add), | ||||
|                                 onPressed: () => _addBudgetItem(context, state), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ], | ||||
|                         ), | ||||
|                       ), | ||||
|                       Padding( | ||||
|                         padding: EdgeInsets.all(8), | ||||
|                         child: ListView.builder( | ||||
|                           shrinkWrap: true, | ||||
|                           itemCount: state.activeBudget!.items.length, | ||||
|                           itemBuilder: (context, index) { | ||||
|                             final item = state.activeBudget!.items.elementAt( | ||||
|                               index, | ||||
|                             ); | ||||
|                             final amount = formatCurrency(item.amount); | ||||
|                             final spent = | ||||
|                                 spending[item.expenseCategory.value!.name]; | ||||
|                             final left = | ||||
|                                 spent == null | ||||
|                                     ? item.amount | ||||
|                                     : item.amount + spent; | ||||
|                             final subtitleText = | ||||
|                                 left < 0 | ||||
|                                     ? "${formatCurrency(left)} over" | ||||
|                                     : "${formatCurrency(left)} left"; | ||||
|                             return ListTile( | ||||
|                               title: Text( | ||||
|                                 "${item.expenseCategory.value!.name} ($amount)", | ||||
|                               ), | ||||
|                               subtitle: Text( | ||||
|                                 subtitleText, | ||||
|                                 style: TextStyle( | ||||
|                                   color: left < 0 ? Colors.red : Colors.green, | ||||
|                                 ), | ||||
|                               ), | ||||
|                               trailing: IconButton( | ||||
|                                 icon: Icon(Icons.delete), | ||||
|                                 onPressed: () {}, | ||||
|                               ), | ||||
|                             ); | ||||
|                           }, | ||||
|                         ), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ); | ||||
|                 }, | ||||
|               ); | ||||
|             }, | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										67
									
								
								lib/ui/pages/budgets/budgets.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								lib/ui/pages/budgets/budgets.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:okane/screen.dart'; | ||||
| import 'package:okane/ui/pages/budgets/add_budget.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
| import 'package:okane/ui/utils.dart'; | ||||
| 
 | ||||
| class BudgetListPage extends StatelessWidget { | ||||
|   const BudgetListPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return BlocBuilder<CoreCubit, CoreState>( | ||||
|       builder: (context, state) { | ||||
|         if (state.budgets.isEmpty) { | ||||
|           return Column( | ||||
|             crossAxisAlignment: CrossAxisAlignment.center, | ||||
|             children: [ | ||||
|               Text("No budgets"), | ||||
|               OutlinedButton( | ||||
|                 onPressed: () { | ||||
|                   showDialogOrModal( | ||||
|                     context: context, | ||||
|                     builder: | ||||
|                         (_) => AddBudgetPopup( | ||||
|                           onDone: () { | ||||
|                             Navigator.of(context).pop(); | ||||
|                           }, | ||||
|                         ), | ||||
|                   ); | ||||
|                 }, | ||||
|                 child: Text("Add"), | ||||
|               ), | ||||
|             ], | ||||
|           ); | ||||
|         } | ||||
| 
 | ||||
|         return ListView.builder( | ||||
|           itemCount: state.budgets.length, | ||||
|           itemBuilder: | ||||
|               (context, index) => ListTile( | ||||
|                 title: Text(state.budgets[index].name), | ||||
|                 selected: state.budgets[index] == state.activeBudget, | ||||
|                 trailing: IconButton( | ||||
|                   icon: Icon( | ||||
|                       Icons.delete, | ||||
|                     color: Colors.redAccent, | ||||
|                   ), | ||||
|                   onPressed: () { | ||||
|                     // TODO | ||||
|                   }, | ||||
|                 ), | ||||
|                 onTap: () { | ||||
|                   GetIt.I.get<CoreCubit>().setActiveBudget( | ||||
|                     state.budgets[index], | ||||
|                   ); | ||||
|                   if (getScreenSize(context) == ScreenSize.small) { | ||||
|                     Navigator.of(context).pushNamed("/budgets/details"); | ||||
|                   } | ||||
|                 }, | ||||
|               ), | ||||
|         ); | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -47,72 +47,89 @@ class TransactionDetailsPage extends StatelessWidget { | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     final widget = BlocBuilder<CoreCubit, CoreState>( | ||||
|       builder: (context, state) { | ||||
|         if (state.activeTransaction == null) { | ||||
|           return Text("No transaction selected"); | ||||
|         } | ||||
| 
 | ||||
|         return Padding( | ||||
|           padding: const EdgeInsets.all(8.0), | ||||
|           child: ListView( | ||||
|             children: [ | ||||
|               Row( | ||||
|     return Scaffold( | ||||
|       body: Column( | ||||
|         children: [ | ||||
|           if (isPage) | ||||
|             SizedBox( | ||||
|               height: 50, | ||||
|               child: Row( | ||||
|                 children: [ | ||||
|                   StreamBuilder( | ||||
|                     stream: watchBeneficiaryObject( | ||||
|                       state.activeTransaction!.beneficiary.value!.id, | ||||
|                     ), | ||||
|                     builder: (context, snapshot) { | ||||
|                       final obj = | ||||
|                           snapshot.data ?? | ||||
|                           state.activeTransaction!.beneficiary.value!; | ||||
|                       return ImageWrapper( | ||||
|                         title: obj.name, | ||||
|                         path: obj.imagePath, | ||||
|                         onTap: () => _updateBeneficiaryIcon(obj), | ||||
|                       ); | ||||
|                     }, | ||||
|                   ), | ||||
|                   Padding( | ||||
|                     padding: EdgeInsets.only(left: 8), | ||||
|                     child: Text( | ||||
|                       state.activeTransaction!.beneficiary.value!.name, | ||||
|                     ), | ||||
|                   ), | ||||
|                   Spacer(), | ||||
|                   IconButton( | ||||
|                     icon: Icon(Icons.edit), | ||||
|                     icon: Icon(Icons.arrow_back), | ||||
|                     onPressed: () { | ||||
|                       // TODO: Implement | ||||
|                       Navigator.of(context).pop(); | ||||
|                     }, | ||||
|                   ), | ||||
|                 ], | ||||
|               ), | ||||
|               Wrap( | ||||
|                 spacing: 8, | ||||
|                 children: | ||||
|                     state.activeTransaction!.tags | ||||
|                         .map((tag) => Chip(label: Text(tag))) | ||||
|                         .toList(), | ||||
|               ), | ||||
|               Row( | ||||
|                 children: [ | ||||
|                   state.activeTransaction!.amount > 0 | ||||
|                       ? Icon(Icons.add) | ||||
|                       : Icon(Icons.remove), | ||||
|                   Text(formatCurrency(state.activeTransaction!.amount)), | ||||
|                 ], | ||||
|               ), | ||||
|             ], | ||||
|           ), | ||||
|         ); | ||||
|       }, | ||||
|     ); | ||||
|             ), | ||||
|           Expanded( | ||||
|             child: BlocBuilder<CoreCubit, CoreState>( | ||||
|               builder: (context, state) { | ||||
|                 if (state.activeTransaction == null) { | ||||
|                   return Text("No transaction selected"); | ||||
|                 } | ||||
| 
 | ||||
|     if (isPage) { | ||||
|       return Scaffold(body: widget); | ||||
|     } | ||||
|     return widget; | ||||
|                 return Padding( | ||||
|                   padding: const EdgeInsets.all(8.0), | ||||
|                   child: ListView( | ||||
|                     children: [ | ||||
|                       Row( | ||||
|                         children: [ | ||||
|                           StreamBuilder( | ||||
|                             stream: watchBeneficiaryObject( | ||||
|                               state.activeTransaction!.beneficiary.value!.id, | ||||
|                             ), | ||||
|                             builder: (context, snapshot) { | ||||
|                               final obj = | ||||
|                                   snapshot.data ?? | ||||
|                                   state.activeTransaction!.beneficiary.value!; | ||||
|                               return ImageWrapper( | ||||
|                                 title: obj.name, | ||||
|                                 path: obj.imagePath, | ||||
|                                 onTap: () => _updateBeneficiaryIcon(obj), | ||||
|                               ); | ||||
|                             }, | ||||
|                           ), | ||||
|                           Padding( | ||||
|                             padding: EdgeInsets.only(left: 8), | ||||
|                             child: Text( | ||||
|                               state.activeTransaction!.beneficiary.value!.name, | ||||
|                             ), | ||||
|                           ), | ||||
|                           Spacer(), | ||||
|                           IconButton( | ||||
|                             icon: Icon(Icons.edit), | ||||
|                             onPressed: () { | ||||
|                               // TODO: Implement | ||||
|                             }, | ||||
|                           ), | ||||
|                         ], | ||||
|                       ), | ||||
|                       Wrap( | ||||
|                         spacing: 8, | ||||
|                         children: | ||||
|                             state.activeTransaction!.tags | ||||
|                                 .map((tag) => Chip(label: Text(tag))) | ||||
|                                 .toList(), | ||||
|                       ), | ||||
|                       Row( | ||||
|                         children: [ | ||||
|                           state.activeTransaction!.amount > 0 | ||||
|                               ? Icon(Icons.add) | ||||
|                               : Icon(Icons.remove), | ||||
|                           Text(formatCurrency(state.activeTransaction!.amount)), | ||||
|                         ], | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ); | ||||
|               }, | ||||
|             ), | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:grouped_list/grouped_list.dart'; | ||||
| import 'package:okane/database/collections/transaction.dart'; | ||||
| import 'package:okane/database/database.dart'; | ||||
| import 'package:okane/screen.dart'; | ||||
| import 'package:okane/ui/pages/account/balance_graph_card.dart'; | ||||
| import 'package:okane/ui/state/core.dart'; | ||||
|  | ||||
| @ -4,6 +4,7 @@ import 'package:bloc/bloc.dart'; | ||||
| import 'package:freezed_annotation/freezed_annotation.dart'; | ||||
| import 'package:okane/database/collections/account.dart'; | ||||
| import 'package:okane/database/collections/beneficiary.dart'; | ||||
| import 'package:okane/database/collections/budget.dart'; | ||||
| import 'package:okane/database/collections/expense_category.dart'; | ||||
| import 'package:okane/database/collections/recurrent.dart'; | ||||
| import 'package:okane/database/collections/template.dart'; | ||||
| @ -25,6 +26,8 @@ abstract class CoreState with _$CoreState { | ||||
|     @Default([]) List<TransactionTemplate> transactionTemplates, | ||||
|     @Default([]) List<Beneficiary> beneficiaries, | ||||
|     @Default([]) List<ExpenseCategory> expenseCategories, | ||||
|     @Default([]) List<Budget> budgets, | ||||
|     @Default(null) Budget? activeBudget, | ||||
|   }) = _CoreState; | ||||
| } | ||||
| 
 | ||||
| @ -37,6 +40,7 @@ class CoreCubit extends Cubit<CoreState> { | ||||
|   StreamSubscription<void>? _transactionsStreamSubscription; | ||||
|   StreamSubscription<void>? _beneficiariesStreamSubscription; | ||||
|   StreamSubscription<void>? _expenseCategoryStreamSubscription; | ||||
|   StreamSubscription<void>? _budgetsStreamSubscription; | ||||
| 
 | ||||
|   void setupAccountStream() { | ||||
|     _accountsStreamSubscription?.cancel(); | ||||
| @ -94,6 +98,12 @@ class CoreCubit extends Cubit<CoreState> { | ||||
|     ) async { | ||||
|       emit(state.copyWith(expenseCategories: await getExpenseCategories())); | ||||
|     }); | ||||
|     _budgetsStreamSubscription?.cancel(); | ||||
|     _budgetsStreamSubscription = watchBudgets(activeAccount!).listen(( | ||||
|         _, | ||||
|         ) async { | ||||
|       emit(state.copyWith(budgets: await getBudgets(activeAccount!))); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   Future<void> init() async { | ||||
| @ -108,6 +118,7 @@ class CoreCubit extends Cubit<CoreState> { | ||||
|         transactionTemplates: await getTransactionTemplates(account), | ||||
|         recurringTransactions: await getRecurringTransactions(account), | ||||
|         expenseCategories: await getExpenseCategories(), | ||||
|         budgets: await getBudgets(account), | ||||
|       ), | ||||
|     ); | ||||
| 
 | ||||
| @ -132,6 +143,9 @@ class CoreCubit extends Cubit<CoreState> { | ||||
|         beneficiaries: await getBeneficiaries(), | ||||
|         transactionTemplates: await getTransactionTemplates(account), | ||||
|         recurringTransactions: await getRecurringTransactions(account), | ||||
|         budgets: await getBudgets(account), | ||||
|         activeBudget: null, | ||||
|         activeTransaction: null, | ||||
|       ), | ||||
|     ); | ||||
|     setupStreams(account); | ||||
| @ -145,6 +159,10 @@ class CoreCubit extends Cubit<CoreState> { | ||||
|     emit(state.copyWith(accounts: accounts)); | ||||
|   } | ||||
| 
 | ||||
|   void setActiveBudget(Budget? budget) { | ||||
|     emit(state.copyWith(activeBudget: budget)); | ||||
|   } | ||||
| 
 | ||||
|   Account? get activeAccount => | ||||
|       state.activeAccountIndex == null | ||||
|           ? null | ||||
|  | ||||
| @ -12,8 +12,7 @@ part of 'core.dart'; | ||||
| T _$identity<T>(T value) => value; | ||||
| 
 | ||||
| final _privateConstructorUsedError = UnsupportedError( | ||||
|   'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', | ||||
| ); | ||||
|     'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); | ||||
| 
 | ||||
| /// @nodoc | ||||
| mixin _$CoreState { | ||||
| @ -29,6 +28,8 @@ mixin _$CoreState { | ||||
|   List<Beneficiary> get beneficiaries => throw _privateConstructorUsedError; | ||||
|   List<ExpenseCategory> get expenseCategories => | ||||
|       throw _privateConstructorUsedError; | ||||
|   List<Budget> get budgets => throw _privateConstructorUsedError; | ||||
|   Budget? get activeBudget => throw _privateConstructorUsedError; | ||||
| 
 | ||||
|   @JsonKey(ignore: true) | ||||
|   $CoreStateCopyWith<CoreState> get copyWith => | ||||
| @ -40,17 +41,18 @@ abstract class $CoreStateCopyWith<$Res> { | ||||
|   factory $CoreStateCopyWith(CoreState value, $Res Function(CoreState) then) = | ||||
|       _$CoreStateCopyWithImpl<$Res, CoreState>; | ||||
|   @useResult | ||||
|   $Res call({ | ||||
|     OkanePage activePage, | ||||
|     int? activeAccountIndex, | ||||
|     Transaction? activeTransaction, | ||||
|     List<Account> accounts, | ||||
|     List<RecurringTransaction> recurringTransactions, | ||||
|     List<Transaction> transactions, | ||||
|     List<TransactionTemplate> transactionTemplates, | ||||
|     List<Beneficiary> beneficiaries, | ||||
|     List<ExpenseCategory> expenseCategories, | ||||
|   }); | ||||
|   $Res call( | ||||
|       {OkanePage activePage, | ||||
|       int? activeAccountIndex, | ||||
|       Transaction? activeTransaction, | ||||
|       List<Account> accounts, | ||||
|       List<RecurringTransaction> recurringTransactions, | ||||
|       List<Transaction> transactions, | ||||
|       List<TransactionTemplate> transactionTemplates, | ||||
|       List<Beneficiary> beneficiaries, | ||||
|       List<ExpenseCategory> expenseCategories, | ||||
|       List<Budget> budgets, | ||||
|       Budget? activeBudget}); | ||||
| } | ||||
| 
 | ||||
| /// @nodoc | ||||
| @ -75,57 +77,55 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState> | ||||
|     Object? transactionTemplates = null, | ||||
|     Object? beneficiaries = null, | ||||
|     Object? expenseCategories = null, | ||||
|     Object? budgets = null, | ||||
|     Object? activeBudget = freezed, | ||||
|   }) { | ||||
|     return _then( | ||||
|       _value.copyWith( | ||||
|             activePage: | ||||
|                 null == activePage | ||||
|                     ? _value.activePage | ||||
|                     : activePage // ignore: cast_nullable_to_non_nullable | ||||
|                         as OkanePage, | ||||
|             activeAccountIndex: | ||||
|                 freezed == activeAccountIndex | ||||
|                     ? _value.activeAccountIndex | ||||
|                     : activeAccountIndex // ignore: cast_nullable_to_non_nullable | ||||
|                         as int?, | ||||
|             activeTransaction: | ||||
|                 freezed == activeTransaction | ||||
|                     ? _value.activeTransaction | ||||
|                     : activeTransaction // ignore: cast_nullable_to_non_nullable | ||||
|                         as Transaction?, | ||||
|             accounts: | ||||
|                 null == accounts | ||||
|                     ? _value.accounts | ||||
|                     : accounts // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<Account>, | ||||
|             recurringTransactions: | ||||
|                 null == recurringTransactions | ||||
|                     ? _value.recurringTransactions | ||||
|                     : recurringTransactions // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<RecurringTransaction>, | ||||
|             transactions: | ||||
|                 null == transactions | ||||
|                     ? _value.transactions | ||||
|                     : transactions // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<Transaction>, | ||||
|             transactionTemplates: | ||||
|                 null == transactionTemplates | ||||
|                     ? _value.transactionTemplates | ||||
|                     : transactionTemplates // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<TransactionTemplate>, | ||||
|             beneficiaries: | ||||
|                 null == beneficiaries | ||||
|                     ? _value.beneficiaries | ||||
|                     : beneficiaries // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<Beneficiary>, | ||||
|             expenseCategories: | ||||
|                 null == expenseCategories | ||||
|                     ? _value.expenseCategories | ||||
|                     : expenseCategories // ignore: cast_nullable_to_non_nullable | ||||
|                         as List<ExpenseCategory>, | ||||
|           ) | ||||
|           as $Val, | ||||
|     ); | ||||
|     return _then(_value.copyWith( | ||||
|       activePage: null == activePage | ||||
|           ? _value.activePage | ||||
|           : activePage // ignore: cast_nullable_to_non_nullable | ||||
|               as OkanePage, | ||||
|       activeAccountIndex: freezed == activeAccountIndex | ||||
|           ? _value.activeAccountIndex | ||||
|           : activeAccountIndex // ignore: cast_nullable_to_non_nullable | ||||
|               as int?, | ||||
|       activeTransaction: freezed == activeTransaction | ||||
|           ? _value.activeTransaction | ||||
|           : activeTransaction // ignore: cast_nullable_to_non_nullable | ||||
|               as Transaction?, | ||||
|       accounts: null == accounts | ||||
|           ? _value.accounts | ||||
|           : accounts // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Account>, | ||||
|       recurringTransactions: null == recurringTransactions | ||||
|           ? _value.recurringTransactions | ||||
|           : recurringTransactions // ignore: cast_nullable_to_non_nullable | ||||
|               as List<RecurringTransaction>, | ||||
|       transactions: null == transactions | ||||
|           ? _value.transactions | ||||
|           : transactions // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Transaction>, | ||||
|       transactionTemplates: null == transactionTemplates | ||||
|           ? _value.transactionTemplates | ||||
|           : transactionTemplates // ignore: cast_nullable_to_non_nullable | ||||
|               as List<TransactionTemplate>, | ||||
|       beneficiaries: null == beneficiaries | ||||
|           ? _value.beneficiaries | ||||
|           : beneficiaries // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Beneficiary>, | ||||
|       expenseCategories: null == expenseCategories | ||||
|           ? _value.expenseCategories | ||||
|           : expenseCategories // ignore: cast_nullable_to_non_nullable | ||||
|               as List<ExpenseCategory>, | ||||
|       budgets: null == budgets | ||||
|           ? _value.budgets | ||||
|           : budgets // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Budget>, | ||||
|       activeBudget: freezed == activeBudget | ||||
|           ? _value.activeBudget | ||||
|           : activeBudget // ignore: cast_nullable_to_non_nullable | ||||
|               as Budget?, | ||||
|     ) as $Val); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @ -133,22 +133,22 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState> | ||||
| abstract class _$$CoreStateImplCopyWith<$Res> | ||||
|     implements $CoreStateCopyWith<$Res> { | ||||
|   factory _$$CoreStateImplCopyWith( | ||||
|     _$CoreStateImpl value, | ||||
|     $Res Function(_$CoreStateImpl) then, | ||||
|   ) = __$$CoreStateImplCopyWithImpl<$Res>; | ||||
|           _$CoreStateImpl value, $Res Function(_$CoreStateImpl) then) = | ||||
|       __$$CoreStateImplCopyWithImpl<$Res>; | ||||
|   @override | ||||
|   @useResult | ||||
|   $Res call({ | ||||
|     OkanePage activePage, | ||||
|     int? activeAccountIndex, | ||||
|     Transaction? activeTransaction, | ||||
|     List<Account> accounts, | ||||
|     List<RecurringTransaction> recurringTransactions, | ||||
|     List<Transaction> transactions, | ||||
|     List<TransactionTemplate> transactionTemplates, | ||||
|     List<Beneficiary> beneficiaries, | ||||
|     List<ExpenseCategory> expenseCategories, | ||||
|   }); | ||||
|   $Res call( | ||||
|       {OkanePage activePage, | ||||
|       int? activeAccountIndex, | ||||
|       Transaction? activeTransaction, | ||||
|       List<Account> accounts, | ||||
|       List<RecurringTransaction> recurringTransactions, | ||||
|       List<Transaction> transactions, | ||||
|       List<TransactionTemplate> transactionTemplates, | ||||
|       List<Beneficiary> beneficiaries, | ||||
|       List<ExpenseCategory> expenseCategories, | ||||
|       List<Budget> budgets, | ||||
|       Budget? activeBudget}); | ||||
| } | ||||
| 
 | ||||
| /// @nodoc | ||||
| @ -156,9 +156,8 @@ class __$$CoreStateImplCopyWithImpl<$Res> | ||||
|     extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl> | ||||
|     implements _$$CoreStateImplCopyWith<$Res> { | ||||
|   __$$CoreStateImplCopyWithImpl( | ||||
|     _$CoreStateImpl _value, | ||||
|     $Res Function(_$CoreStateImpl) _then, | ||||
|   ) : super(_value, _then); | ||||
|       _$CoreStateImpl _value, $Res Function(_$CoreStateImpl) _then) | ||||
|       : super(_value, _then); | ||||
| 
 | ||||
|   @pragma('vm:prefer-inline') | ||||
|   @override | ||||
| @ -172,78 +171,80 @@ class __$$CoreStateImplCopyWithImpl<$Res> | ||||
|     Object? transactionTemplates = null, | ||||
|     Object? beneficiaries = null, | ||||
|     Object? expenseCategories = null, | ||||
|     Object? budgets = null, | ||||
|     Object? activeBudget = freezed, | ||||
|   }) { | ||||
|     return _then( | ||||
|       _$CoreStateImpl( | ||||
|         activePage: | ||||
|             null == activePage | ||||
|                 ? _value.activePage | ||||
|                 : activePage // ignore: cast_nullable_to_non_nullable | ||||
|                     as OkanePage, | ||||
|         activeAccountIndex: | ||||
|             freezed == activeAccountIndex | ||||
|                 ? _value.activeAccountIndex | ||||
|                 : activeAccountIndex // ignore: cast_nullable_to_non_nullable | ||||
|                     as int?, | ||||
|         activeTransaction: | ||||
|             freezed == activeTransaction | ||||
|                 ? _value.activeTransaction | ||||
|                 : activeTransaction // ignore: cast_nullable_to_non_nullable | ||||
|                     as Transaction?, | ||||
|         accounts: | ||||
|             null == accounts | ||||
|                 ? _value._accounts | ||||
|                 : accounts // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<Account>, | ||||
|         recurringTransactions: | ||||
|             null == recurringTransactions | ||||
|                 ? _value._recurringTransactions | ||||
|                 : recurringTransactions // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<RecurringTransaction>, | ||||
|         transactions: | ||||
|             null == transactions | ||||
|                 ? _value._transactions | ||||
|                 : transactions // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<Transaction>, | ||||
|         transactionTemplates: | ||||
|             null == transactionTemplates | ||||
|                 ? _value._transactionTemplates | ||||
|                 : transactionTemplates // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<TransactionTemplate>, | ||||
|         beneficiaries: | ||||
|             null == beneficiaries | ||||
|                 ? _value._beneficiaries | ||||
|                 : beneficiaries // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<Beneficiary>, | ||||
|         expenseCategories: | ||||
|             null == expenseCategories | ||||
|                 ? _value._expenseCategories | ||||
|                 : expenseCategories // ignore: cast_nullable_to_non_nullable | ||||
|                     as List<ExpenseCategory>, | ||||
|       ), | ||||
|     ); | ||||
|     return _then(_$CoreStateImpl( | ||||
|       activePage: null == activePage | ||||
|           ? _value.activePage | ||||
|           : activePage // ignore: cast_nullable_to_non_nullable | ||||
|               as OkanePage, | ||||
|       activeAccountIndex: freezed == activeAccountIndex | ||||
|           ? _value.activeAccountIndex | ||||
|           : activeAccountIndex // ignore: cast_nullable_to_non_nullable | ||||
|               as int?, | ||||
|       activeTransaction: freezed == activeTransaction | ||||
|           ? _value.activeTransaction | ||||
|           : activeTransaction // ignore: cast_nullable_to_non_nullable | ||||
|               as Transaction?, | ||||
|       accounts: null == accounts | ||||
|           ? _value._accounts | ||||
|           : accounts // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Account>, | ||||
|       recurringTransactions: null == recurringTransactions | ||||
|           ? _value._recurringTransactions | ||||
|           : recurringTransactions // ignore: cast_nullable_to_non_nullable | ||||
|               as List<RecurringTransaction>, | ||||
|       transactions: null == transactions | ||||
|           ? _value._transactions | ||||
|           : transactions // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Transaction>, | ||||
|       transactionTemplates: null == transactionTemplates | ||||
|           ? _value._transactionTemplates | ||||
|           : transactionTemplates // ignore: cast_nullable_to_non_nullable | ||||
|               as List<TransactionTemplate>, | ||||
|       beneficiaries: null == beneficiaries | ||||
|           ? _value._beneficiaries | ||||
|           : beneficiaries // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Beneficiary>, | ||||
|       expenseCategories: null == expenseCategories | ||||
|           ? _value._expenseCategories | ||||
|           : expenseCategories // ignore: cast_nullable_to_non_nullable | ||||
|               as List<ExpenseCategory>, | ||||
|       budgets: null == budgets | ||||
|           ? _value._budgets | ||||
|           : budgets // ignore: cast_nullable_to_non_nullable | ||||
|               as List<Budget>, | ||||
|       activeBudget: freezed == activeBudget | ||||
|           ? _value.activeBudget | ||||
|           : activeBudget // ignore: cast_nullable_to_non_nullable | ||||
|               as Budget?, | ||||
|     )); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// @nodoc | ||||
| 
 | ||||
| class _$CoreStateImpl implements _CoreState { | ||||
|   const _$CoreStateImpl({ | ||||
|     this.activePage = OkanePage.accounts, | ||||
|     this.activeAccountIndex, | ||||
|     this.activeTransaction = null, | ||||
|     final List<Account> accounts = const [], | ||||
|     final List<RecurringTransaction> recurringTransactions = const [], | ||||
|     final List<Transaction> transactions = const [], | ||||
|     final List<TransactionTemplate> transactionTemplates = const [], | ||||
|     final List<Beneficiary> beneficiaries = const [], | ||||
|     final List<ExpenseCategory> expenseCategories = const [], | ||||
|   }) : _accounts = accounts, | ||||
|        _recurringTransactions = recurringTransactions, | ||||
|        _transactions = transactions, | ||||
|        _transactionTemplates = transactionTemplates, | ||||
|        _beneficiaries = beneficiaries, | ||||
|        _expenseCategories = expenseCategories; | ||||
|   const _$CoreStateImpl( | ||||
|       {this.activePage = OkanePage.accounts, | ||||
|       this.activeAccountIndex, | ||||
|       this.activeTransaction = null, | ||||
|       final List<Account> accounts = const [], | ||||
|       final List<RecurringTransaction> recurringTransactions = const [], | ||||
|       final List<Transaction> transactions = const [], | ||||
|       final List<TransactionTemplate> transactionTemplates = const [], | ||||
|       final List<Beneficiary> beneficiaries = const [], | ||||
|       final List<ExpenseCategory> expenseCategories = const [], | ||||
|       final List<Budget> budgets = const [], | ||||
|       this.activeBudget = null}) | ||||
|       : _accounts = accounts, | ||||
|         _recurringTransactions = recurringTransactions, | ||||
|         _transactions = transactions, | ||||
|         _transactionTemplates = transactionTemplates, | ||||
|         _beneficiaries = beneficiaries, | ||||
|         _expenseCategories = expenseCategories, | ||||
|         _budgets = budgets; | ||||
| 
 | ||||
|   @override | ||||
|   @JsonKey() | ||||
| @ -310,9 +311,22 @@ class _$CoreStateImpl implements _CoreState { | ||||
|     return EqualUnmodifiableListView(_expenseCategories); | ||||
|   } | ||||
| 
 | ||||
|   final List<Budget> _budgets; | ||||
|   @override | ||||
|   @JsonKey() | ||||
|   List<Budget> get budgets { | ||||
|     if (_budgets is EqualUnmodifiableListView) return _budgets; | ||||
|     // ignore: implicit_dynamic_type | ||||
|     return EqualUnmodifiableListView(_budgets); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   @JsonKey() | ||||
|   final Budget? activeBudget; | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return 'CoreState(activePage: $activePage, activeAccountIndex: $activeAccountIndex, activeTransaction: $activeTransaction, accounts: $accounts, recurringTransactions: $recurringTransactions, transactions: $transactions, transactionTemplates: $transactionTemplates, beneficiaries: $beneficiaries, expenseCategories: $expenseCategories)'; | ||||
|     return 'CoreState(activePage: $activePage, activeAccountIndex: $activeAccountIndex, activeTransaction: $activeTransaction, accounts: $accounts, recurringTransactions: $recurringTransactions, transactions: $transactions, transactionTemplates: $transactionTemplates, beneficiaries: $beneficiaries, expenseCategories: $expenseCategories, budgets: $budgets, activeBudget: $activeBudget)'; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
| @ -327,41 +341,35 @@ class _$CoreStateImpl implements _CoreState { | ||||
|             (identical(other.activeTransaction, activeTransaction) || | ||||
|                 other.activeTransaction == activeTransaction) && | ||||
|             const DeepCollectionEquality().equals(other._accounts, _accounts) && | ||||
|             const DeepCollectionEquality().equals( | ||||
|               other._recurringTransactions, | ||||
|               _recurringTransactions, | ||||
|             ) && | ||||
|             const DeepCollectionEquality().equals( | ||||
|               other._transactions, | ||||
|               _transactions, | ||||
|             ) && | ||||
|             const DeepCollectionEquality().equals( | ||||
|               other._transactionTemplates, | ||||
|               _transactionTemplates, | ||||
|             ) && | ||||
|             const DeepCollectionEquality().equals( | ||||
|               other._beneficiaries, | ||||
|               _beneficiaries, | ||||
|             ) && | ||||
|             const DeepCollectionEquality().equals( | ||||
|               other._expenseCategories, | ||||
|               _expenseCategories, | ||||
|             )); | ||||
|             const DeepCollectionEquality() | ||||
|                 .equals(other._recurringTransactions, _recurringTransactions) && | ||||
|             const DeepCollectionEquality() | ||||
|                 .equals(other._transactions, _transactions) && | ||||
|             const DeepCollectionEquality() | ||||
|                 .equals(other._transactionTemplates, _transactionTemplates) && | ||||
|             const DeepCollectionEquality() | ||||
|                 .equals(other._beneficiaries, _beneficiaries) && | ||||
|             const DeepCollectionEquality() | ||||
|                 .equals(other._expenseCategories, _expenseCategories) && | ||||
|             const DeepCollectionEquality().equals(other._budgets, _budgets) && | ||||
|             (identical(other.activeBudget, activeBudget) || | ||||
|                 other.activeBudget == activeBudget)); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   int get hashCode => Object.hash( | ||||
|     runtimeType, | ||||
|     activePage, | ||||
|     activeAccountIndex, | ||||
|     activeTransaction, | ||||
|     const DeepCollectionEquality().hash(_accounts), | ||||
|     const DeepCollectionEquality().hash(_recurringTransactions), | ||||
|     const DeepCollectionEquality().hash(_transactions), | ||||
|     const DeepCollectionEquality().hash(_transactionTemplates), | ||||
|     const DeepCollectionEquality().hash(_beneficiaries), | ||||
|     const DeepCollectionEquality().hash(_expenseCategories), | ||||
|   ); | ||||
|       runtimeType, | ||||
|       activePage, | ||||
|       activeAccountIndex, | ||||
|       activeTransaction, | ||||
|       const DeepCollectionEquality().hash(_accounts), | ||||
|       const DeepCollectionEquality().hash(_recurringTransactions), | ||||
|       const DeepCollectionEquality().hash(_transactions), | ||||
|       const DeepCollectionEquality().hash(_transactionTemplates), | ||||
|       const DeepCollectionEquality().hash(_beneficiaries), | ||||
|       const DeepCollectionEquality().hash(_expenseCategories), | ||||
|       const DeepCollectionEquality().hash(_budgets), | ||||
|       activeBudget); | ||||
| 
 | ||||
|   @JsonKey(ignore: true) | ||||
|   @override | ||||
| @ -371,17 +379,18 @@ class _$CoreStateImpl implements _CoreState { | ||||
| } | ||||
| 
 | ||||
| abstract class _CoreState implements CoreState { | ||||
|   const factory _CoreState({ | ||||
|     final OkanePage activePage, | ||||
|     final int? activeAccountIndex, | ||||
|     final Transaction? activeTransaction, | ||||
|     final List<Account> accounts, | ||||
|     final List<RecurringTransaction> recurringTransactions, | ||||
|     final List<Transaction> transactions, | ||||
|     final List<TransactionTemplate> transactionTemplates, | ||||
|     final List<Beneficiary> beneficiaries, | ||||
|     final List<ExpenseCategory> expenseCategories, | ||||
|   }) = _$CoreStateImpl; | ||||
|   const factory _CoreState( | ||||
|       {final OkanePage activePage, | ||||
|       final int? activeAccountIndex, | ||||
|       final Transaction? activeTransaction, | ||||
|       final List<Account> accounts, | ||||
|       final List<RecurringTransaction> recurringTransactions, | ||||
|       final List<Transaction> transactions, | ||||
|       final List<TransactionTemplate> transactionTemplates, | ||||
|       final List<Beneficiary> beneficiaries, | ||||
|       final List<ExpenseCategory> expenseCategories, | ||||
|       final List<Budget> budgets, | ||||
|       final Budget? activeBudget}) = _$CoreStateImpl; | ||||
| 
 | ||||
|   @override | ||||
|   OkanePage get activePage; | ||||
| @ -402,6 +411,10 @@ abstract class _CoreState implements CoreState { | ||||
|   @override | ||||
|   List<ExpenseCategory> get expenseCategories; | ||||
|   @override | ||||
|   List<Budget> get budgets; | ||||
|   @override | ||||
|   Budget? get activeBudget; | ||||
|   @override | ||||
|   @JsonKey(ignore: true) | ||||
|   _$$CoreStateImplCopyWith<_$CoreStateImpl> get copyWith => | ||||
|       throw _privateConstructorUsedError; | ||||
|  | ||||
| @ -69,3 +69,14 @@ String formatCurrency(double amount, {bool precise = true}) { | ||||
|   } | ||||
|   return "${amount.toStringAsFixed(2)}€"; | ||||
| } | ||||
| 
 | ||||
| DateTime monthEnding(DateTime now) { | ||||
|   return DateTime( | ||||
|     now.year, | ||||
|     now.month, | ||||
|     32, | ||||
|     23, | ||||
|     59, | ||||
|     59, | ||||
|   ); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user