PDF Export

This commit is contained in:
reinjens 2024-12-16 11:15:11 +01:00
parent bb16516891
commit bb1e1ecc95
22 changed files with 1911 additions and 394 deletions

View file

@ -64,6 +64,8 @@ void main() async {
} }
}*/ }*/
MeasureRepository().buildMeasureComplete();
/*BaseApi().getContent('cart', false).then((carts) { /*BaseApi().getContent('cart', false).then((carts) {
logger.i(carts); logger.i(carts);
for (final cart in carts) { for (final cart in carts) {
@ -82,6 +84,8 @@ void main() async {
await MeasureRepository().getCategoriesGroupsAndTypes(); await MeasureRepository().getCategoriesGroupsAndTypes();
MeasureRepository().buildMeasureMonths();
runApp(const Ambito()); runApp(const Ambito());
} }

View file

@ -1,31 +1,35 @@
import 'package:ambito/src/entity/cart/cart_element.dart'; import 'package:ambito/src/entity/cart/cart_element.dart';
import 'package:ambito/src/entity/entities.dart'; import 'package:ambito/src/entity/entities.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_spinbox/flutter_spinbox.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import '../../packages/ambito_theme/ambito_theme.dart'; import '../../packages/ambito_theme/ambito_theme.dart';
class CartDataSource extends DataGridSource { class CartDataSource extends DataGridSource {
CartDataSource( CartDataSource(
{required List<CartElement> cartElements, required this.context}) { {required this.cartElements,
required this.context,
required this.controller}) {
dataGridRows = cartElements dataGridRows = cartElements
.map<DataGridRow>( .map<DataGridRow>(
(dataGridRow) => DataGridRow( (dataGridRow) => DataGridRow(
cells: [ cells: [
DataGridCell<String>( DataGridCell<String>(
columnName: 'name', columnName: 'Material',
value: dataGridRow.name, value: dataGridRow.name,
), ),
DataGridCell<String>( DataGridCell<String>(
columnName: 'amount', columnName: 'Menge',
value: dataGridRow.amount, value: dataGridRow.amount,
), ),
DataGridCell<List<IdValue>>( DataGridCell<List<IdValue>>(
columnName: 'provider', columnName: 'Anbieter',
value: dataGridRow.provider, value: dataGridRow.provider,
), ),
DataGridCell<String>( DataGridCell<String>(
columnName: 'price', columnName: 'Richtpreis',
value: dataGridRow.price.toString(), value: dataGridRow.price.toString(),
), ),
], ],
@ -35,8 +39,15 @@ class CartDataSource extends DataGridSource {
} }
final BuildContext context; final BuildContext context;
final List<CartElement> cartElements;
List<DataGridRow> dataGridRows = []; List<DataGridRow> dataGridRows = [];
final DataGridController controller;
dynamic newCellValue;
/// Helps to control the editable text in the [TextField] widget.
TextEditingController editingController = TextEditingController();
@override @override
List<DataGridRow> get rows => dataGridRows; List<DataGridRow> get rows => dataGridRows;
@ -47,7 +58,7 @@ class CartDataSource extends DataGridSource {
double completePrice = double.tryParse(row double completePrice = double.tryParse(row
.getCells() .getCells()
.where((cell) => cell.columnName == 'price') .where((cell) => cell.columnName == 'Richtpreis')
.first .first
.value .value
.toString() ?? .toString() ??
@ -56,7 +67,7 @@ class CartDataSource extends DataGridSource {
int amount = int.tryParse(row int amount = int.tryParse(row
.getCells() .getCells()
.where((cell) => cell.columnName == 'amount') .where((cell) => cell.columnName == 'Menge')
.first .first
.value .value
.toString() ?? .toString() ??
@ -70,7 +81,7 @@ class CartDataSource extends DataGridSource {
return DataGridRowAdapter( return DataGridRowAdapter(
cells: row.getCells().map<Widget>( cells: row.getCells().map<Widget>(
(dataGridCell) { (dataGridCell) {
if (dataGridCell.columnName == 'provider') { if (dataGridCell.columnName == 'Anbieter') {
final providerString = final providerString =
dataGridCell.value.map((ele) => ele.value).toList().join(', '); dataGridCell.value.map((ele) => ele.value).toList().join(', ');
return Container( return Container(
@ -86,7 +97,7 @@ class CartDataSource extends DataGridSource {
); );
} }
if (dataGridCell.columnName == 'price') { if (dataGridCell.columnName == 'Richtpreis') {
final priceString = amount == 1 final priceString = amount == 1
? '${dataGridCell.value ?? '0'}' ? '${dataGridCell.value ?? '0'}'
: '${completePrice.toStringAsFixed(2)}€ (${dataGridCell.value ?? '0'}€ pro Stk.)'; : '${completePrice.toStringAsFixed(2)}€ (${dataGridCell.value ?? '0'}€ pro Stk.)';
@ -102,41 +113,14 @@ class CartDataSource extends DataGridSource {
), ),
); );
} }
if (dataGridCell.columnName == 'amount') { if (dataGridCell.columnName == 'Menge') {
return Container( return Container(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Row( child: Text(
mainAxisAlignment: MainAxisAlignment.spaceAround, dataGridCell.value,
children: [ textAlign: TextAlign.center,
IconButton( style: theme.bodyMedium,
icon: Icon(
Icons.remove,
color: Theme.of(context).colorScheme.secondary,
),
padding:
EdgeInsets.symmetric(vertical: 4.0, horizontal: 18.0),
iconSize: 16.0,
color: Theme.of(context).primaryColor,
onPressed: () {},
),
Text(
dataGridCell.value,
textAlign: TextAlign.center,
style: theme.bodyMedium,
),
IconButton(
icon: Icon(
Icons.add,
color: Theme.of(context).colorScheme.secondary,
),
padding:
EdgeInsets.symmetric(vertical: 4.0, horizontal: 18.0),
iconSize: 16.0,
color: Theme.of(context).primaryColor,
onPressed: () {},
),
],
), ),
); );
} }
@ -154,4 +138,54 @@ class CartDataSource extends DataGridSource {
}, },
).toList()); ).toList());
} }
@override
Widget? buildEditWidget(DataGridRow dataGridRow,
RowColumnIndex rowColumnIndex, GridColumn column, CellSubmit submitCell) {
// Text going to display on editable widget
final String displayText = dataGridRow
.getCells()
.firstWhereOrNull((DataGridCell dataGridCell) =>
dataGridCell.columnName == column.columnName)
?.value
?.toString() ??
'';
// The new cell value must be reset.
// To avoid committing the [DataGridCell] value that was previously edited
// into the current non-modified [DataGridCell].
newCellValue = null;
final int dataRowIndex = dataGridRows.indexOf(dataGridRow);
final bool isNumericType = column.columnName == 'Menge';
return Container(
padding: const EdgeInsets.all(0),
alignment: isNumericType ? Alignment.centerRight : Alignment.centerLeft,
child: SpinBox(
min: 1,
max: 100,
value: double.parse(displayText),
onChanged: (value) {
//cartElements[dataRowIndex].amount = value.toString();
},
),
/*NumberInputWithIncrementDecrement(
controller: editingController,
buttonArrangement: ButtonArrangement.incRightDecLeft,
min: 1,
initialValue: int.parse(displayText),
enableMinMaxClamping: true,
incIcon: Icons.add,
decIcon: Icons.remove,
onChanged: (value) {
logger.d('changed to $value');
},
onSubmitted: (value) {
logger.i('submitted $value');
},
),*/
);
}
} }

View file

@ -1,5 +1,6 @@
import 'package:ambito/src/entity/_general/file/file_part.dart'; import 'package:ambito/src/entity/_general/file/file_part.dart';
import 'package:ambito/src/entity/_general/id_value_color/id_value_color.dart'; import 'package:ambito/src/entity/_general/id_value_color/id_value_color.dart';
import 'package:ambito/src/entity/base_entity.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
@ -13,11 +14,10 @@ part 'measure_complete.g.dart';
@JsonSerializable() @JsonSerializable()
@collection @collection
class MeasureComplete { class MeasureComplete extends BaseEntity with EntityWithId {
MeasureComplete({required this.id, required this.name}); MeasureComplete();
final int id; String? name;
final String name;
FilePart? image; FilePart? image;
String? description; String? description;
String? target; String? target;
@ -66,8 +66,9 @@ class MeasureComplete {
List<String> helper = []; List<String> helper = [];
List<FilePart> helperFiles = []; List<FilePart> helperFiles = [];
MeasureComplete mc = MeasureComplete mc = MeasureComplete()
MeasureComplete(id: json['id'], name: json['field_3021886']); ..id = json['id']
..name = json['field_3021886'];
if (json['field_2402548'] != null && json['field_2402548'].isNotEmpty) { if (json['field_2402548'] != null && json['field_2402548'].isNotEmpty) {
mc.image = FilePart.fromJson(json['field_2402548'][0]); mc.image = FilePart.fromJson(json['field_2402548'][0]);
} else { } else {

View file

@ -204,7 +204,14 @@ const MeasureCompleteSchema = IsarGeneratedSchema(
@isarProtected @isarProtected
int serializeMeasureComplete(IsarWriter writer, MeasureComplete object) { int serializeMeasureComplete(IsarWriter writer, MeasureComplete object) {
IsarCore.writeString(writer, 1, object.name); {
final value = object.name;
if (value == null) {
IsarCore.writeNull(writer, 1);
} else {
IsarCore.writeString(writer, 1, value);
}
}
{ {
final value = object.image; final value = object.image;
if (value == null) { if (value == null) {
@ -593,14 +600,8 @@ int serializeMeasureComplete(IsarWriter writer, MeasureComplete object) {
@isarProtected @isarProtected
MeasureComplete deserializeMeasureComplete(IsarReader reader) { MeasureComplete deserializeMeasureComplete(IsarReader reader) {
final int _id; final object = MeasureComplete();
_id = IsarCore.readId(reader); object.name = IsarCore.readString(reader, 1);
final String _name;
_name = IsarCore.readString(reader, 1) ?? '';
final object = MeasureComplete(
id: _id,
name: _name,
);
{ {
final objectReader = IsarCore.readObject(reader, 2); final objectReader = IsarCore.readObject(reader, 2);
if (objectReader.isNull) { if (objectReader.isNull) {
@ -840,16 +841,15 @@ MeasureComplete deserializeMeasureComplete(IsarReader reader) {
} }
} }
} }
object.id = IsarCore.readId(reader);
return object; return object;
} }
@isarProtected @isarProtected
dynamic deserializeMeasureCompleteProp(IsarReader reader, int property) { dynamic deserializeMeasureCompleteProp(IsarReader reader, int property) {
switch (property) { switch (property) {
case 0:
return IsarCore.readId(reader);
case 1: case 1:
return IsarCore.readString(reader, 1) ?? ''; return IsarCore.readString(reader, 1);
case 2: case 2:
{ {
final objectReader = IsarCore.readObject(reader, 2); final objectReader = IsarCore.readObject(reader, 2);
@ -1131,6 +1131,8 @@ dynamic deserializeMeasureCompleteProp(IsarReader reader, int property) {
} }
} }
} }
case 0:
return IsarCore.readId(reader);
default: default:
throw ArgumentError('Unknown property: $property'); throw ArgumentError('Unknown property: $property');
} }
@ -1578,94 +1580,22 @@ extension MeasureCompleteQueryBuilderUpdate
extension MeasureCompleteQueryFilter extension MeasureCompleteQueryFilter
on QueryBuilder<MeasureComplete, MeasureComplete, QFilterCondition> { on QueryBuilder<MeasureComplete, MeasureComplete, QFilterCondition> {
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idEqualTo( nameIsNull() {
int value,
) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(const IsNullCondition(property: 1));
EqualCondition(
property: 0,
value: value,
),
);
}); });
} }
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idGreaterThan( nameIsNotNull() {
int value, return QueryBuilder.apply(not(), (query) {
) { return query.addFilterCondition(const IsNullCondition(property: 1));
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idGreaterThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idLessThan(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idLessThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idBetween(
int lower,
int upper,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 0,
lower: lower,
upper: upper,
),
);
}); });
} }
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameEqualTo( nameEqualTo(
String value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1681,7 +1611,7 @@ extension MeasureCompleteQueryFilter
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameGreaterThan( nameGreaterThan(
String value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1697,7 +1627,7 @@ extension MeasureCompleteQueryFilter
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameGreaterThanOrEqualTo( nameGreaterThanOrEqualTo(
String value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1713,7 +1643,7 @@ extension MeasureCompleteQueryFilter
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameLessThan( nameLessThan(
String value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1729,7 +1659,7 @@ extension MeasureCompleteQueryFilter
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameLessThanOrEqualTo( nameLessThanOrEqualTo(
String value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1745,8 +1675,8 @@ extension MeasureCompleteQueryFilter
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition> QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
nameBetween( nameBetween(
String lower, String? lower,
String upper, { String? upper, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -9643,6 +9573,92 @@ extension MeasureCompleteQueryFilter
); );
}); });
} }
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idGreaterThan(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idGreaterThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idLessThan(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idLessThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterFilterCondition>
idBetween(
int lower,
int upper,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 0,
lower: lower,
upper: upper,
),
);
});
}
} }
extension MeasureCompleteQueryObject extension MeasureCompleteQueryObject
@ -9657,18 +9673,6 @@ extension MeasureCompleteQueryObject
extension MeasureCompleteQuerySortBy extension MeasureCompleteQuerySortBy
on QueryBuilder<MeasureComplete, MeasureComplete, QSortBy> { on QueryBuilder<MeasureComplete, MeasureComplete, QSortBy> {
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0, sort: Sort.desc);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortByName( QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortByName(
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -10277,22 +10281,22 @@ extension MeasureCompleteQuerySortBy
); );
}); });
} }
}
extension MeasureCompleteQuerySortThenBy QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortById() {
on QueryBuilder<MeasureComplete, MeasureComplete, QSortThenBy> {
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(0); return query.addSortBy(0);
}); });
} }
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenByIdDesc() { QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> sortByIdDesc() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addSortBy(0, sort: Sort.desc); return query.addSortBy(0, sort: Sort.desc);
}); });
} }
}
extension MeasureCompleteQuerySortThenBy
on QueryBuilder<MeasureComplete, MeasureComplete, QSortThenBy> {
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenByName( QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenByName(
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -10698,6 +10702,18 @@ extension MeasureCompleteQuerySortThenBy
return query.addSortBy(40, sort: Sort.desc, caseSensitive: caseSensitive); return query.addSortBy(40, sort: Sort.desc, caseSensitive: caseSensitive);
}); });
} }
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0);
});
}
QueryBuilder<MeasureComplete, MeasureComplete, QAfterSortBy> thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0, sort: Sort.desc);
});
}
} }
extension MeasureCompleteQueryWhereDistinct extension MeasureCompleteQueryWhereDistinct
@ -10985,13 +11001,7 @@ extension MeasureCompleteQueryWhereDistinct
extension MeasureCompleteQueryProperty1 extension MeasureCompleteQueryProperty1
on QueryBuilder<MeasureComplete, MeasureComplete, QProperty> { on QueryBuilder<MeasureComplete, MeasureComplete, QProperty> {
QueryBuilder<MeasureComplete, int, QAfterProperty> idProperty() { QueryBuilder<MeasureComplete, String?, QAfterProperty> nameProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(0);
});
}
QueryBuilder<MeasureComplete, String, QAfterProperty> nameProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addProperty(1); return query.addProperty(1);
}); });
@ -11266,17 +11276,17 @@ extension MeasureCompleteQueryProperty1
return query.addProperty(42); return query.addProperty(42);
}); });
} }
}
extension MeasureCompleteQueryProperty2<R> QueryBuilder<MeasureComplete, int, QAfterProperty> idProperty() {
on QueryBuilder<MeasureComplete, R, QAfterProperty> {
QueryBuilder<MeasureComplete, (R, int), QAfterProperty> idProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addProperty(0); return query.addProperty(0);
}); });
} }
}
QueryBuilder<MeasureComplete, (R, String), QAfterProperty> nameProperty() { extension MeasureCompleteQueryProperty2<R>
on QueryBuilder<MeasureComplete, R, QAfterProperty> {
QueryBuilder<MeasureComplete, (R, String?), QAfterProperty> nameProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addProperty(1); return query.addProperty(1);
}); });
@ -11565,17 +11575,17 @@ extension MeasureCompleteQueryProperty2<R>
return query.addProperty(42); return query.addProperty(42);
}); });
} }
}
extension MeasureCompleteQueryProperty3<R1, R2> QueryBuilder<MeasureComplete, (R, int), QAfterProperty> idProperty() {
on QueryBuilder<MeasureComplete, (R1, R2), QAfterProperty> {
QueryBuilder<MeasureComplete, (R1, R2, int), QOperations> idProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addProperty(0); return query.addProperty(0);
}); });
} }
}
QueryBuilder<MeasureComplete, (R1, R2, String), QOperations> nameProperty() { extension MeasureCompleteQueryProperty3<R1, R2>
on QueryBuilder<MeasureComplete, (R1, R2), QAfterProperty> {
QueryBuilder<MeasureComplete, (R1, R2, String?), QOperations> nameProperty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addProperty(1); return query.addProperty(1);
}); });
@ -11867,6 +11877,12 @@ extension MeasureCompleteQueryProperty3<R1, R2>
return query.addProperty(42); return query.addProperty(42);
}); });
} }
QueryBuilder<MeasureComplete, (R1, R2, int), QOperations> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(0);
});
}
} }
// ************************************************************************** // **************************************************************************
@ -11874,10 +11890,9 @@ extension MeasureCompleteQueryProperty3<R1, R2>
// ************************************************************************** // **************************************************************************
MeasureComplete _$MeasureCompleteFromJson(Map<String, dynamic> json) => MeasureComplete _$MeasureCompleteFromJson(Map<String, dynamic> json) =>
MeasureComplete( MeasureComplete()
id: (json['id'] as num).toInt(), ..id = (json['id'] as num).toInt()
name: json['name'] as String, ..name = json['name'] as String?
)
..image = json['image'] == null ..image = json['image'] == null
? null ? null
: FilePart.fromJson(json['image'] as Map<String, dynamic>) : FilePart.fromJson(json['image'] as Map<String, dynamic>)

View file

@ -8,11 +8,11 @@ class MeasureDetailsRepository extends BaseDB {
@override @override
IsarCollection collection = isar.measureDetails; IsarCollection collection = isar.measureDetails;
MeasureDetails getDetailsForMeasure(String measure) { MeasureDetails? getDetailsForMeasure(String measure) {
List<MeasureDetails> all = isar.measureDetails.where().findAll(); List<MeasureDetails> all = isar.measureDetails.where().findAll();
return all return all
.where( .where(
(el) => el.measure!.map((m) => m.value).toList().contains(measure)) (el) => el.measure!.map((m) => m.value).toList().contains(measure))
.first; .firstOrNull;
} }
} }

View file

@ -4,6 +4,8 @@ import 'package:ambito/src/entity/lists/list_repository.dart';
import 'package:ambito/src/entity/measure/category/measure_category.dart'; import 'package:ambito/src/entity/measure/category/measure_category.dart';
import 'package:ambito/src/entity/measure/complete/measure_complete.dart'; import 'package:ambito/src/entity/measure/complete/measure_complete.dart';
import 'package:ambito/src/entity/measure/measure_grouping.dart'; import 'package:ambito/src/entity/measure/measure_grouping.dart';
import 'package:ambito/src/entity/measure/months/measure_months.dart';
import 'package:ambito/src/entity/measure/types_details/measure_types_details_repository.dart';
import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/extensions/extensions.dart';
import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
@ -11,6 +13,7 @@ import 'package:isar/isar.dart';
import '../../consts/consts.dart'; import '../../consts/consts.dart';
import '../../packages/ambito_notifier/notifier/filter_notifier.dart'; import '../../packages/ambito_notifier/notifier/filter_notifier.dart';
import '../../widgets/form/fields/field_dropdown.dart'; import '../../widgets/form/fields/field_dropdown.dart';
import 'details/measure_details_repository.dart';
import 'group/measure_group.dart'; import 'group/measure_group.dart';
class MeasureRepository extends BaseDB { class MeasureRepository extends BaseDB {
@ -260,4 +263,68 @@ class MeasureRepository extends BaseDB {
MeasureComplete? getMeasureCompleteByName(String name) { MeasureComplete? getMeasureCompleteByName(String name) {
return isar.measureCompletes.where().nameEqualTo(name).findFirst(); return isar.measureCompletes.where().nameEqualTo(name).findFirst();
} }
void buildMeasureComplete() {
List<MeasureComplete> allMeasureCompletes = [];
List<MeasureGeneral> measuresGeneral =
isar.measureGenerals.where().findAll();
for (final measureGeneral in measuresGeneral) {
Map<String, dynamic> combined = {'id': measureGeneral.id};
// Fetch related details and types
final measureDetails =
MeasureDetailsRepository().getDetailsForMeasure(measureGeneral.name!);
final MeasureTypes? measureType = MeasureRepository().getTypeByName(
measureGeneral.measureType!.map((el) => el.value).first ?? '');
final measureTypesDetails = MeasureTypesDetailsRepository()
.getTypeDetailsForType(measureType?.measureType ?? '');
// Save preferences and populate combined map
prefs.setBool('extended_json', true).then((_) {
_mergeToCombinedMap(combined, measureGeneral?.toJson());
_mergeToCombinedMap(combined, measureDetails?.toJson());
_mergeToCombinedMap(combined, measureType?.toJson());
_mergeToCombinedMap(combined, measureTypesDetails?.toJson());
isar.write((isar) {
isar.measureCompletes.put(MeasureComplete.fromJson(combined));
});
});
}
}
void _mergeToCombinedMap(
Map<String, dynamic> combined, Map<String, dynamic>? data) {
data?.forEach((key, value) {
if (key != 'id') {
combined[key] = value;
}
});
}
void buildMeasureMonths() {
List<MeasureComplete> allCompletes =
isar.measureCompletes.where().findAll();
List<MeasureMonths> measureMonths = [];
for (final complete in allCompletes) {
List<bool> apply = months
.map((item) => complete.applyMonths?.contains(item) ?? false)
.toList();
List<bool> maint = months
.map((item) => complete.maintenanceMonths?.contains(item) ?? false)
.toList();
final measureMonth = MeasureMonths()
..id = complete.id
..name = complete.name
..maintenanceList = maint
..applyList = apply;
isar.write((isar) {
isar.measureMonths.put(measureMonth);
});
}
}
} }

View file

@ -0,0 +1,46 @@
import 'package:ambito/src/entity/base_entity.dart';
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
part 'measure_months.g.dart';
@collection
@JsonSerializable(explicitToJson: true)
class MeasureMonths extends BaseEntity with EntityWithId {
MeasureMonths();
String? name;
List<bool>? maintenanceList = [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
];
List<bool>? applyList = [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
];
factory MeasureMonths.fromJson(Map<String, dynamic> json) =>
_$MeasureMonthsFromJson(json);
Map<String, dynamic> toJson() => _$MeasureMonthsToJson(this);
}

View file

@ -0,0 +1,850 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'measure_months.dart';
// **************************************************************************
// _IsarCollectionGenerator
// **************************************************************************
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, invalid_use_of_protected_member, lines_longer_than_80_chars, constant_identifier_names, avoid_js_rounded_ints, no_leading_underscores_for_local_identifiers, require_trailing_commas, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_in_if_null_operators, library_private_types_in_public_api, prefer_const_constructors
// ignore_for_file: type=lint
extension GetMeasureMonthsCollection on Isar {
IsarCollection<int, MeasureMonths> get measureMonths => this.collection();
}
const MeasureMonthsSchema = IsarGeneratedSchema(
schema: IsarSchema(
name: 'MeasureMonths',
idName: 'id',
embedded: false,
properties: [
IsarPropertySchema(
name: 'name',
type: IsarType.string,
),
IsarPropertySchema(
name: 'maintenanceList',
type: IsarType.boolList,
),
IsarPropertySchema(
name: 'applyList',
type: IsarType.boolList,
),
],
indexes: [],
),
converter: IsarObjectConverter<int, MeasureMonths>(
serialize: serializeMeasureMonths,
deserialize: deserializeMeasureMonths,
deserializeProperty: deserializeMeasureMonthsProp,
),
embeddedSchemas: [],
);
@isarProtected
int serializeMeasureMonths(IsarWriter writer, MeasureMonths object) {
{
final value = object.name;
if (value == null) {
IsarCore.writeNull(writer, 1);
} else {
IsarCore.writeString(writer, 1, value);
}
}
{
final list = object.maintenanceList;
if (list == null) {
IsarCore.writeNull(writer, 2);
} else {
final listWriter = IsarCore.beginList(writer, 2, list.length);
for (var i = 0; i < list.length; i++) {
IsarCore.writeBool(listWriter, i, list[i]);
}
IsarCore.endList(writer, listWriter);
}
}
{
final list = object.applyList;
if (list == null) {
IsarCore.writeNull(writer, 3);
} else {
final listWriter = IsarCore.beginList(writer, 3, list.length);
for (var i = 0; i < list.length; i++) {
IsarCore.writeBool(listWriter, i, list[i]);
}
IsarCore.endList(writer, listWriter);
}
}
return object.id;
}
@isarProtected
MeasureMonths deserializeMeasureMonths(IsarReader reader) {
final object = MeasureMonths();
object.name = IsarCore.readString(reader, 1);
{
final length = IsarCore.readList(reader, 2, IsarCore.readerPtrPtr);
{
final reader = IsarCore.readerPtr;
if (reader.isNull) {
object.maintenanceList = null;
} else {
final list = List<bool>.filled(length, false, growable: true);
for (var i = 0; i < length; i++) {
list[i] = IsarCore.readBool(reader, i);
}
IsarCore.freeReader(reader);
object.maintenanceList = list;
}
}
}
{
final length = IsarCore.readList(reader, 3, IsarCore.readerPtrPtr);
{
final reader = IsarCore.readerPtr;
if (reader.isNull) {
object.applyList = null;
} else {
final list = List<bool>.filled(length, false, growable: true);
for (var i = 0; i < length; i++) {
list[i] = IsarCore.readBool(reader, i);
}
IsarCore.freeReader(reader);
object.applyList = list;
}
}
}
object.id = IsarCore.readId(reader);
return object;
}
@isarProtected
dynamic deserializeMeasureMonthsProp(IsarReader reader, int property) {
switch (property) {
case 1:
return IsarCore.readString(reader, 1);
case 2:
{
final length = IsarCore.readList(reader, 2, IsarCore.readerPtrPtr);
{
final reader = IsarCore.readerPtr;
if (reader.isNull) {
return null;
} else {
final list = List<bool>.filled(length, false, growable: true);
for (var i = 0; i < length; i++) {
list[i] = IsarCore.readBool(reader, i);
}
IsarCore.freeReader(reader);
return list;
}
}
}
case 3:
{
final length = IsarCore.readList(reader, 3, IsarCore.readerPtrPtr);
{
final reader = IsarCore.readerPtr;
if (reader.isNull) {
return null;
} else {
final list = List<bool>.filled(length, false, growable: true);
for (var i = 0; i < length; i++) {
list[i] = IsarCore.readBool(reader, i);
}
IsarCore.freeReader(reader);
return list;
}
}
}
case 0:
return IsarCore.readId(reader);
default:
throw ArgumentError('Unknown property: $property');
}
}
sealed class _MeasureMonthsUpdate {
bool call({
required int id,
String? name,
});
}
class _MeasureMonthsUpdateImpl implements _MeasureMonthsUpdate {
const _MeasureMonthsUpdateImpl(this.collection);
final IsarCollection<int, MeasureMonths> collection;
@override
bool call({
required int id,
Object? name = ignore,
}) {
return collection.updateProperties([
id
], {
if (name != ignore) 1: name as String?,
}) >
0;
}
}
sealed class _MeasureMonthsUpdateAll {
int call({
required List<int> id,
String? name,
});
}
class _MeasureMonthsUpdateAllImpl implements _MeasureMonthsUpdateAll {
const _MeasureMonthsUpdateAllImpl(this.collection);
final IsarCollection<int, MeasureMonths> collection;
@override
int call({
required List<int> id,
Object? name = ignore,
}) {
return collection.updateProperties(id, {
if (name != ignore) 1: name as String?,
});
}
}
extension MeasureMonthsUpdate on IsarCollection<int, MeasureMonths> {
_MeasureMonthsUpdate get update => _MeasureMonthsUpdateImpl(this);
_MeasureMonthsUpdateAll get updateAll => _MeasureMonthsUpdateAllImpl(this);
}
sealed class _MeasureMonthsQueryUpdate {
int call({
String? name,
});
}
class _MeasureMonthsQueryUpdateImpl implements _MeasureMonthsQueryUpdate {
const _MeasureMonthsQueryUpdateImpl(this.query, {this.limit});
final IsarQuery<MeasureMonths> query;
final int? limit;
@override
int call({
Object? name = ignore,
}) {
return query.updateProperties(limit: limit, {
if (name != ignore) 1: name as String?,
});
}
}
extension MeasureMonthsQueryUpdate on IsarQuery<MeasureMonths> {
_MeasureMonthsQueryUpdate get updateFirst =>
_MeasureMonthsQueryUpdateImpl(this, limit: 1);
_MeasureMonthsQueryUpdate get updateAll =>
_MeasureMonthsQueryUpdateImpl(this);
}
class _MeasureMonthsQueryBuilderUpdateImpl
implements _MeasureMonthsQueryUpdate {
const _MeasureMonthsQueryBuilderUpdateImpl(this.query, {this.limit});
final QueryBuilder<MeasureMonths, MeasureMonths, QOperations> query;
final int? limit;
@override
int call({
Object? name = ignore,
}) {
final q = query.build();
try {
return q.updateProperties(limit: limit, {
if (name != ignore) 1: name as String?,
});
} finally {
q.close();
}
}
}
extension MeasureMonthsQueryBuilderUpdate
on QueryBuilder<MeasureMonths, MeasureMonths, QOperations> {
_MeasureMonthsQueryUpdate get updateFirst =>
_MeasureMonthsQueryBuilderUpdateImpl(this, limit: 1);
_MeasureMonthsQueryUpdate get updateAll =>
_MeasureMonthsQueryBuilderUpdateImpl(this);
}
extension MeasureMonthsQueryFilter
on QueryBuilder<MeasureMonths, MeasureMonths, QFilterCondition> {
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 1));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 1));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> nameEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameGreaterThan(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameGreaterThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameLessThan(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameLessThanOrEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> nameBetween(
String? lower,
String? upper, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 1,
lower: lower,
upper: upper,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
StartsWithCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EndsWithCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameContains(String value, {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
ContainsCondition(
property: 1,
value: value,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> nameMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
MatchesCondition(
property: 1,
wildcard: pattern,
caseSensitive: caseSensitive,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const EqualCondition(
property: 1,
value: '',
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
nameIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterCondition(
property: 1,
value: '',
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
maintenanceListIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 2));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
maintenanceListIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 2));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
maintenanceListElementEqualTo(
bool value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 2,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
maintenanceListIsEmpty() {
return not().group(
(q) => q.maintenanceListIsNull().or().maintenanceListIsNotEmpty(),
);
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
maintenanceListIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterOrEqualCondition(property: 2, value: null),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
applyListIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
applyListIsNotNull() {
return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 3));
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
applyListElementEqualTo(
bool value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 3,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
applyListIsEmpty() {
return not().group(
(q) => q.applyListIsNull().or().applyListIsNotEmpty(),
);
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
applyListIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const GreaterOrEqualCondition(property: 3, value: null),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> idEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
EqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
idGreaterThan(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
idGreaterThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
GreaterOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> idLessThan(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition>
idLessThanOrEqualTo(
int value,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
LessOrEqualCondition(
property: 0,
value: value,
),
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterFilterCondition> idBetween(
int lower,
int upper,
) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
BetweenCondition(
property: 0,
lower: lower,
upper: upper,
),
);
});
}
}
extension MeasureMonthsQueryObject
on QueryBuilder<MeasureMonths, MeasureMonths, QFilterCondition> {}
extension MeasureMonthsQuerySortBy
on QueryBuilder<MeasureMonths, MeasureMonths, QSortBy> {
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> sortByName(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
caseSensitive: caseSensitive,
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> sortByNameDesc(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(
1,
sort: Sort.desc,
caseSensitive: caseSensitive,
);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> sortById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> sortByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0, sort: Sort.desc);
});
}
}
extension MeasureMonthsQuerySortThenBy
on QueryBuilder<MeasureMonths, MeasureMonths, QSortThenBy> {
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> thenByName(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> thenByNameDesc(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterSortBy> thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(0, sort: Sort.desc);
});
}
}
extension MeasureMonthsQueryWhereDistinct
on QueryBuilder<MeasureMonths, MeasureMonths, QDistinct> {
QueryBuilder<MeasureMonths, MeasureMonths, QAfterDistinct> distinctByName(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(1, caseSensitive: caseSensitive);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterDistinct>
distinctByMaintenanceList() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(2);
});
}
QueryBuilder<MeasureMonths, MeasureMonths, QAfterDistinct>
distinctByApplyList() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(3);
});
}
}
extension MeasureMonthsQueryProperty1
on QueryBuilder<MeasureMonths, MeasureMonths, QProperty> {
QueryBuilder<MeasureMonths, String?, QAfterProperty> nameProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(1);
});
}
QueryBuilder<MeasureMonths, List<bool>?, QAfterProperty>
maintenanceListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});
}
QueryBuilder<MeasureMonths, List<bool>?, QAfterProperty> applyListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(3);
});
}
QueryBuilder<MeasureMonths, int, QAfterProperty> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(0);
});
}
}
extension MeasureMonthsQueryProperty2<R>
on QueryBuilder<MeasureMonths, R, QAfterProperty> {
QueryBuilder<MeasureMonths, (R, String?), QAfterProperty> nameProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(1);
});
}
QueryBuilder<MeasureMonths, (R, List<bool>?), QAfterProperty>
maintenanceListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});
}
QueryBuilder<MeasureMonths, (R, List<bool>?), QAfterProperty>
applyListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(3);
});
}
QueryBuilder<MeasureMonths, (R, int), QAfterProperty> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(0);
});
}
}
extension MeasureMonthsQueryProperty3<R1, R2>
on QueryBuilder<MeasureMonths, (R1, R2), QAfterProperty> {
QueryBuilder<MeasureMonths, (R1, R2, String?), QOperations> nameProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(1);
});
}
QueryBuilder<MeasureMonths, (R1, R2, List<bool>?), QOperations>
maintenanceListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(2);
});
}
QueryBuilder<MeasureMonths, (R1, R2, List<bool>?), QOperations>
applyListProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(3);
});
}
QueryBuilder<MeasureMonths, (R1, R2, int), QOperations> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addProperty(0);
});
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
MeasureMonths _$MeasureMonthsFromJson(Map<String, dynamic> json) =>
MeasureMonths()
..id = (json['id'] as num).toInt()
..name = json['name'] as String?
..maintenanceList = (json['maintenanceList'] as List<dynamic>?)
?.map((e) => e as bool)
.toList()
..applyList =
(json['applyList'] as List<dynamic>?)?.map((e) => e as bool).toList();
Map<String, dynamic> _$MeasureMonthsToJson(MeasureMonths instance) =>
<String, dynamic>{
'id': instance.id,
'name': instance.name,
'maintenanceList': instance.maintenanceList,
'applyList': instance.applyList,
};

View file

@ -0,0 +1,147 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import '../../../packages/ambito_theme/ambito_theme.dart';
import 'measure_months.dart';
class MeasureMonthsDatasource extends DataGridSource {
MeasureMonthsDatasource(
{required List<MeasureMonths> areas,
required this.context,
required this.type}) {
dataGridRows = areas
.map<DataGridRow>(
(dataGridRow) => DataGridRow(
cells: [
DataGridCell<String>(
columnName: 'measure',
value: dataGridRow.name,
),
DataGridCell<bool>(
columnName: 'jan',
value: type == 'apply'
? dataGridRow.applyList![0]
: dataGridRow.maintenanceList![0],
),
DataGridCell<bool>(
columnName: 'feb',
value: type == 'apply'
? dataGridRow.applyList![1]
: dataGridRow.maintenanceList![1],
),
DataGridCell<bool>(
columnName: 'mar',
value: type == 'apply'
? dataGridRow.applyList![2]
: dataGridRow.maintenanceList![2],
),
DataGridCell<bool>(
columnName: 'apr',
value: type == 'apply'
? dataGridRow.applyList![3]
: dataGridRow.maintenanceList![3],
),
DataGridCell<bool>(
columnName: 'may',
value: type == 'apply'
? dataGridRow.applyList![4]
: dataGridRow.maintenanceList![4],
),
DataGridCell<bool>(
columnName: 'jun',
value: type == 'apply'
? dataGridRow.applyList![5]
: dataGridRow.maintenanceList![5],
),
DataGridCell<bool>(
columnName: 'jul',
value: type == 'apply'
? dataGridRow.applyList![6]
: dataGridRow.maintenanceList![6],
),
DataGridCell<bool>(
columnName: 'aug',
value: type == 'apply'
? dataGridRow.applyList![7]
: dataGridRow.maintenanceList![7],
),
DataGridCell<bool>(
columnName: 'sep',
value: type == 'apply'
? dataGridRow.applyList![8]
: dataGridRow.maintenanceList![8],
),
DataGridCell<bool>(
columnName: 'oct',
value: type == 'apply'
? dataGridRow.applyList![9]
: dataGridRow.maintenanceList![9],
),
DataGridCell<bool>(
columnName: 'nov',
value: type == 'apply'
? dataGridRow.applyList![10]
: dataGridRow.maintenanceList![10],
),
DataGridCell<bool>(
columnName: 'dec',
value: type == 'apply'
? dataGridRow.applyList![11]
: dataGridRow.maintenanceList![11],
),
],
),
)
.toList();
}
final BuildContext context;
final String type;
List<DataGridRow> dataGridRows = [];
@override
List<DataGridRow> get rows => dataGridRows;
@override
DataGridRowAdapter? buildRow(DataGridRow row) {
final AmbitoTheme theme = getTheme(context);
return DataGridRowAdapter(
cells: row.getCells().map<Widget>(
(dataGridCell) {
if (dataGridCell.columnName == 'measure') {
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Text(
dataGridCell.value,
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
);
}
Widget content = SizedBox();
if (type == 'apply' && dataGridCell.value == true) {
content = Icon(
Icons.carpenter_outlined,
color: theme.currentColorScheme.secondary,
);
}
if (type == 'maintenance' && dataGridCell.value == true) {
content = Icon(
Icons.eco_outlined,
color: theme.currentColorScheme.secondary,
);
}
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: content,
);
},
).toList());
}
}

View file

@ -5,9 +5,11 @@ import 'package:ambito/src/entity/lists/list_measure.dart';
import 'package:ambito/src/entity/lists/list_measure_single.dart'; import 'package:ambito/src/entity/lists/list_measure_single.dart';
import 'package:ambito/src/entity/lists/list_measure_type_group_category.dart'; import 'package:ambito/src/entity/lists/list_measure_type_group_category.dart';
import 'package:ambito/src/entity/measure/category/measure_category.dart'; import 'package:ambito/src/entity/measure/category/measure_category.dart';
import 'package:ambito/src/entity/measure/complete/measure_complete.dart';
import 'package:ambito/src/entity/measure/details/measure_details.dart'; import 'package:ambito/src/entity/measure/details/measure_details.dart';
import 'package:ambito/src/entity/measure/group/measure_group.dart'; import 'package:ambito/src/entity/measure/group/measure_group.dart';
import 'package:ambito/src/entity/measure/measure_grouping.dart'; import 'package:ambito/src/entity/measure/measure_grouping.dart';
import 'package:ambito/src/entity/measure/months/measure_months.dart';
import 'package:ambito/src/entity/measure/types_details/measure_types_details.dart'; import 'package:ambito/src/entity/measure/types_details/measure_types_details.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
@ -40,6 +42,8 @@ class AmbitoIsarDB {
ListMeasureSingleSchema, ListMeasureSingleSchema,
ListMeasureTypeGroupCategorySchema, ListMeasureTypeGroupCategorySchema,
MaterialSchema, MaterialSchema,
MeasureMonthsSchema,
MeasureCompleteSchema,
MeasureTypesSchema, MeasureTypesSchema,
MeasureTypesDetailsSchema, MeasureTypesDetailsSchema,
MeasureGeneralSchema, MeasureGeneralSchema,

View file

@ -1,16 +1,15 @@
import 'package:ambito/src/entity/_general/filter/item_filter.dart'; import 'package:ambito/src/entity/measure/months/measure_months.dart';
import 'package:ambito/src/entity/_general/filter/item_filter_repository.dart'; import 'package:ambito/src/entity/measure/months/measure_months_datasource.dart';
import 'package:ambito/src/entity/measure/measure_repository.dart';
import 'package:ambito/src/entity/measure/types/measure_types.dart';
import 'package:ambito/src/extensions/extensions.dart';
import 'package:ambito/src/packages/ambito_theme/ambito_theme.dart'; import 'package:ambito/src/packages/ambito_theme/ambito_theme.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:screen_breakpoints/screen_breakpoints.dart'; import 'package:screen_breakpoints/screen_breakpoints.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart'; import 'package:syncfusion_flutter_core/theme.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:toggle_switch/toggle_switch.dart';
import '../../consts/consts.dart'; import '../../consts/consts.dart';
import '../../widgets/appbar/ambito_appbar.dart'; import '../../widgets/page/base_page.dart';
class CalendarPage extends StatefulWidget { class CalendarPage extends StatefulWidget {
const CalendarPage({super.key}); const CalendarPage({super.key});
@ -20,148 +19,310 @@ class CalendarPage extends StatefulWidget {
} }
class CalendarPageState extends State<CalendarPage> { class CalendarPageState extends State<CalendarPage> {
List<Appointment> appointments = <Appointment>[]; int display = 0;
Set<ItemFilter>? monthFilter = {}; String type = 'maintenance';
@override @override
void initState() { void initState() {
initDataSource();
super.initState(); super.initState();
} }
initDataSource() {
monthFilter = ItemFilterRepository().getByType('month');
for (String month in months) {
DateTime now = DateTime.now();
int monthInt = months.indexOf(month) + 1;
DateTime startDate = DateTime(now.year, monthInt, 1, 0, 0, 0);
DateTime endDate = DateTime(
now.year, monthInt, startDate.lastDayOfMonth.day, 23, 59, 59);
ItemFilter? itemFilter =
monthFilter?.firstWhereOrNull((item) => item.name == month);
if (itemFilter != null) {
List<MeasureTypes?> currentMeasures =
MeasureRepository().getByIds(itemFilter.ids!);
for (var measure in currentMeasures) {
appointments.add(
Appointment(
startTime: startDate,
endTime: endDate,
isAllDay: true,
subject: measure!.measureType ?? '',
color: actionGroupColors[measure.measureGroup!.value!]!,
),
);
}
}
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<MeasureMonths> mm = isar.measureMonths.where().sortByName().findAll();
final AmbitoTheme theme = getTheme(context); final AmbitoTheme theme = getTheme(context);
return Scaffold( return BasePage().getPage(
appBar: AmbitoAppbar( context,
links: const ['dashboard', 'massnahmen'], SingleChildScrollView(
breakpoint: Breakpoint.fromContext(context), child: Expanded(
theme: theme, child: Align(
), alignment: Alignment.topCenter,
body: Center( child: Padding(
child: Padding( padding: context.breakpoint.padding,
padding: const EdgeInsets.all(32), child: SizedBox(
child: SfCalendar( width: 1152,
firstDayOfWeek: 1, height: MediaQuery.of(context).size.height - 80,
showNavigationArrow: true, child: Padding(
view: CalendarView.month, padding: EdgeInsets.only(bottom: 40),
dataSource: _AppointmentDataSource(appointments), child: Column(
monthViewSettings: const MonthViewSettings( mainAxisSize: MainAxisSize.max,
appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, mainAxisAlignment: MainAxisAlignment.start,
appointmentDisplayCount: 64, crossAxisAlignment: CrossAxisAlignment.start,
children: [
theme.verticalSpacerMax,
Text(
'Kalender',
textAlign: TextAlign.start,
style: theme.headlineLarge.copyWith(
color: theme.currentColorScheme.onSurface,
),
),
theme.verticalSpacer,
Row(
children: [
ToggleSwitch(
initialLabelIndex: display,
totalSwitches: 2,
minWidth: 200,
borderWidth: 1,
labels: const ['Pflege', 'Maßnahme'],
activeBgColor: [
theme.currentColorScheme.secondary
],
borderColor: [theme.currentColorScheme.secondary],
inactiveBgColor: Colors.white,
activeFgColor:
theme.currentColorScheme.onSecondary,
customTextStyles: [theme.bodyMedium],
onToggle: (index) {
setState(() {
display = index ?? 0;
if (display == 0) {
type = 'maintenance';
} else {
type = 'apply';
}
});
},
),
],
),
theme.verticalSpacer,
Expanded(
child: gridWidget(
mm,
),
),
theme.verticalSpacerMax,
],
),
),
),
),
), ),
), ),
));
}
Widget gridWidget(List<MeasureMonths> mm) {
final AmbitoTheme theme = getTheme(context);
return SizedBox(
width: 1152,
child: SfDataGridTheme(
data: SfDataGridThemeData(
headerColor: theme.currentColorScheme.primaryContainer,
sortIcon: Icon(
Icons.keyboard_arrow_down,
color: theme.currentColorScheme.primary,
),
),
child: SfDataGrid(
allowSorting: true,
source:
MeasureMonthsDatasource(areas: mm, context: context, type: type),
columnWidthMode: ColumnWidthMode.fill,
columns: [
GridColumn(
columnName: 'name',
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Bezeichnung',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'jan',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Jan',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'feb',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Feb',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'mar',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Mär',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'apr',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Apr',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'may',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Mai',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'jun',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Jun',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'jul',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Jul',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'aug',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Aug',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'sep',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Sep',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'oct',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Okt',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'nov',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Nov',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
GridColumn(
columnName: 'dec',
maximumWidth: 70,
label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft,
child: Text(
'Dez',
overflow: TextOverflow.ellipsis,
style: theme.bodyMedium.copyWith(
color: theme.currentColorScheme.primary,
),
),
),
),
],
), ),
), ),
); );
} }
_AppointmentDataSource _getCalendarDataSource() {
List<Appointment> appointments = <Appointment>[];
appointments.add(Appointment(
startTime: DateTime.now(),
endTime: DateTime.now().add(const Duration(minutes: 10)),
subject: 'Meeting',
isAllDay: true,
color: Colors.blue,
startTimeZone: '',
endTimeZone: '',
));
return _AppointmentDataSource(appointments);
}
} }
class _AppointmentDataSource extends CalendarDataSource {
_AppointmentDataSource(List<Appointment> source) {
appointments = source;
}
}
/*class ActionDataSource extends CalendarDataSource {
ActionDataSource(List<Action> source) {
appointments = source;
}
@override
DateTime getStartTime(int index) {
return appointments![index].from;
}
@override
DateTime getEndTime(int index) {
return appointments![index].to;
}
@override
bool isAllDay(int index) {
return appointments![index].isAllDay;
}
@override
String getSubject(int index) {
return appointments![index].eventName;
}
@override
String getStartTimeZone(int index) {
return appointments![index].startTimeZone;
}
@override
String getEndTimeZone(int index) {
return appointments![index].endTimeZone;
}
@override
Color getColor(int index) {
return appointments![index].background;
}
}
class Action {
Action(
{this.eventName = '',
required this.from,
required this.to,
required this.background,
this.isAllDay = false});
String eventName;
DateTime from;
DateTime to;
Color background;
bool isAllDay;
}*/

View file

@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:ambito/src/entity/cart/cart_datasource.dart'; import 'package:ambito/src/entity/cart/cart_datasource.dart';
@ -13,7 +14,12 @@ import 'package:screen_breakpoints/screen_breakpoints.dart';
import 'package:screenshot/screenshot.dart'; import 'package:screenshot/screenshot.dart';
import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_core/theme.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:syncfusion_flutter_datagrid_export/export.dart';
import 'package:syncfusion_flutter_pdf/pdf.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../consts/consts.dart';
import '../../entity/_general/id_value/id_value.dart';
import '../../entity/cart/cart.dart'; import '../../entity/cart/cart.dart';
import '../../entity/measure/general/measure_general_repository.dart'; import '../../entity/measure/general/measure_general_repository.dart';
import '../../widgets/buttons/print_all_button.dart'; import '../../widgets/buttons/print_all_button.dart';
@ -43,6 +49,8 @@ class CartPageState extends State<CartPage> {
final ScreenshotController screenshotController = ScreenshotController(); final ScreenshotController screenshotController = ScreenshotController();
Uint8List? _imageFile; Uint8List? _imageFile;
final DataGridController _dataGridController = DataGridController();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -109,13 +117,12 @@ class CartPageState extends State<CartPage> {
List<Widget> children = []; List<Widget> children = [];
if (carts != null) { if (carts != null) {
int counter = 0;
for (final cart in carts) { for (final cart in carts) {
final measure = MeasureGeneralRepository().getByName(cart.name!); final measure = MeasureGeneralRepository().getByName(cart.name!);
final elements = CartRepository().getElementsByCartId(cart.id); final elements = CartRepository().getElementsByCartId(cart.id);
double sum = 0; double sum = 0;
final GlobalKey<SfDataGridState> key = GlobalKey<SfDataGridState>();
for (final element in elements) { for (final element in elements) {
sum = sum + sum = sum +
@ -123,69 +130,103 @@ class CartPageState extends State<CartPage> {
(double.tryParse(element.price ?? '0') ?? 0)); (double.tryParse(element.price ?? '0') ?? 0));
} }
final card = ExportFrame( final card = SizedBox(
exportDelegate: exportDelegate, width: 1152,
frameId: 'cart${cart.id}', child: Card(
child: SizedBox( elevation: 0,
width: 1152, color: theme.currentColorScheme.tertiary,
child: Card( child: Padding(
elevation: 0, padding: const EdgeInsets.all(20),
color: theme.currentColorScheme.tertiary, child: Column(
child: Padding( crossAxisAlignment: CrossAxisAlignment.start,
padding: const EdgeInsets.all(20), children: [
child: Column( Row(
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Text(
Row( cart.name!,
children: [ style: theme.labelLarge
Text( .copyWith(color: theme.currentColorScheme.primary),
cart.name!, ),
style: theme.labelLarge.copyWith( const Spacer(),
color: theme.currentColorScheme.primary), SizedBox(
), height: 40,
const Spacer(), width: 200,
SizedBox( child: ClipRRect(
height: 40, borderRadius: const BorderRadius.all(
width: 200, Radius.circular(10),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(10),
),
child: measure?.getFullImage() ??
Image.asset('assets/images/logo_trans.png'),
), ),
child: measure?.getFullImage() ??
Image.asset('assets/images/logo_trans.png'),
), ),
], ),
), ],
theme.verticalSpacerSmall, ),
gridWidget(elements ?? []), theme.verticalSpacerSmall,
theme.verticalSpacer, gridWidget(elements ?? [], key),
Row( theme.verticalSpacer,
children: [ Row(
Text( children: [
'Richtpreis ca. ${sum.toStringAsFixed(2)}', Text(
style: theme.labelMedium 'Richtpreis ca. ${sum.toStringAsFixed(2)}',
.copyWith(fontWeight: FontWeight.bold), style: theme.labelMedium
), .copyWith(fontWeight: FontWeight.bold),
Spacer(), ),
PrintButton( Spacer(),
onPressed: () async { PrintButton(
final pdf = await exportDelegate onPressed: () async {
.exportToPdfDocument('cart${cart.id}'); PdfDocument document =
await saveFile(pdf, '${cart.id}.pdf'); key.currentState!.exportToPdfDocument(
}, headerFooterExport:
), (DataGridPdfHeaderFooterExportDetails
], headerFooterExport) {
) final double width = headerFooterExport.pdfPage
], .getClientSize()
), .width;
final PdfPageTemplateElement header =
PdfPageTemplateElement(
Rect.fromLTWH(0, 0, width, 65));
header.graphics.drawString(
'Warenkorb für "${cart.name!}"',
PdfStandardFont(PdfFontFamily.helvetica, 13,
style: PdfFontStyle.bold),
bounds: const Rect.fromLTWH(0, 25, 400, 60),
);
headerFooterExport.pdfDocumentTemplate.top =
header;
},
cellExport: (details) {
if (details.cellType ==
DataGridExportCellType.row &&
details.columnName == 'Anbieter') {
if (details.cellValue.toString() == '[]') {
details.pdfCell.value = '-';
} else {
List<String> values = [];
for (IdValue idValue
in (details.cellValue as List<IdValue>)) {
values.add(idValue.value ?? '');
}
logger.d(values.join(', '));
details.pdfCell.value = values.join(', ');
}
}
},
fitAllColumnsInOnePage: true,
);
final List<int> bytes = document.saveSync();
launchUrl(Uri.parse(
"data:application/octet-stream;base64,${base64Encode(bytes)}"));
},
),
],
)
],
), ),
), ),
), ),
); );
children.add(card); children.add(card);
children.add(theme.verticalSpacerMax); children.add(theme.verticalSpacerMax);
counter++;
} }
} }
@ -198,7 +239,8 @@ class CartPageState extends State<CartPage> {
); );
} }
Widget gridWidget(List<CartElement> cartElements) { Widget gridWidget(
List<CartElement> cartElements, GlobalKey<SfDataGridState> key) {
final AmbitoTheme theme = getTheme(context); final AmbitoTheme theme = getTheme(context);
return SfDataGridTheme( return SfDataGridTheme(
@ -210,12 +252,22 @@ class CartPageState extends State<CartPage> {
), ),
), ),
child: SfDataGrid( child: SfDataGrid(
controller: _dataGridController,
key: key,
allowSorting: true, allowSorting: true,
source: CartDataSource(cartElements: cartElements, context: context), allowEditing: true,
selectionMode: SelectionMode.single,
editingGestureType: EditingGestureType.doubleTap,
navigationMode: GridNavigationMode.cell,
source: CartDataSource(
cartElements: cartElements,
context: context,
controller: _dataGridController),
columnWidthMode: ColumnWidthMode.fill, columnWidthMode: ColumnWidthMode.fill,
columns: [ columns: [
GridColumn( GridColumn(
columnName: 'name', columnName: 'Material',
allowEditing: true,
label: Container( label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
@ -229,8 +281,9 @@ class CartPageState extends State<CartPage> {
), ),
), ),
GridColumn( GridColumn(
columnName: 'amount', columnName: 'Menge',
maximumWidth: 150, maximumWidth: 150,
allowEditing: true,
label: Container( label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
@ -244,9 +297,10 @@ class CartPageState extends State<CartPage> {
), ),
), ),
GridColumn( GridColumn(
columnName: 'provider', columnName: 'Anbieter',
maximumWidth: 200, maximumWidth: 200,
allowSorting: false, allowSorting: false,
allowEditing: false,
label: Container( label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
@ -260,8 +314,9 @@ class CartPageState extends State<CartPage> {
), ),
), ),
GridColumn( GridColumn(
columnName: 'price', columnName: 'Richtpreis',
allowSorting: true, allowSorting: true,
allowEditing: false,
maximumWidth: 250, maximumWidth: 250,
label: Container( label: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0),

View file

@ -114,7 +114,6 @@ class DashboardAreasPageState extends State<DashboardAreasPage> {
padding: context.breakpoint.padding, padding: context.breakpoint.padding,
child: SizedBox( child: SizedBox(
width: 1152, width: 1152,
height: 1152,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [

View file

@ -1,9 +1,6 @@
import 'package:ambito/src/entity/entities.dart'; import 'package:ambito/src/entity/entities.dart';
import 'package:ambito/src/entity/measure/details/measure_details.dart'; import 'package:ambito/src/entity/measure/details/measure_details.dart';
import 'package:ambito/src/entity/measure/details/measure_details_repository.dart';
import 'package:ambito/src/entity/measure/measure_repository.dart';
import 'package:ambito/src/entity/measure/types_details/measure_types_details.dart'; import 'package:ambito/src/entity/measure/types_details/measure_types_details.dart';
import 'package:ambito/src/entity/measure/types_details/measure_types_details_repository.dart';
import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/extensions/extensions.dart';
import 'package:ambito/src/pages/measure/detail/cards/main/combined_card.dart'; import 'package:ambito/src/pages/measure/detail/cards/main/combined_card.dart';
import 'package:ambito/src/pages/measure/detail/cards/main/gallery_card.dart'; import 'package:ambito/src/pages/measure/detail/cards/main/gallery_card.dart';
@ -63,13 +60,12 @@ class MeasureDetailPageState extends State<MeasureDetailPage> {
super.initState(); super.initState();
// Parse ID from parameters // Parse ID from parameters
id = int.tryParse(Get.parameters['id'] ?? '0') ?? 0;
// Initialize combined map with ID // Initialize combined map with ID
Map<String, dynamic> combined = {'id': id}; //Map<String, dynamic> combined = {'id': id};
// Retrieve measureGeneral data // Retrieve measureGeneral data
measureGeneral = isar.measureGenerals.where().idEqualTo(id!).findFirst(); /* measureGeneral = isar.measureGenerals.where().idEqualTo(id!).findFirst();
if (measureGeneral != null) { if (measureGeneral != null) {
// Fetch related details and types // Fetch related details and types
@ -92,7 +88,7 @@ class MeasureDetailPageState extends State<MeasureDetailPage> {
}); });
logger.d(measure!.toJson()); logger.d(measure!.toJson());
}); });*/
// Add scroll listener for the back-to-top button // Add scroll listener for the back-to-top button
scrollController.addListener(() { scrollController.addListener(() {
@ -116,6 +112,12 @@ class MeasureDetailPageState extends State<MeasureDetailPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final AmbitoTheme theme = getTheme(context); final AmbitoTheme theme = getTheme(context);
id = int.tryParse(Get.parameters['id'] ?? '0') ?? 0;
MeasureComplete? measure =
isar.measureCompletes.where().idEqualTo(id!).findFirst()!;
return Scaffold( return Scaffold(
appBar: AmbitoAppbar( appBar: AmbitoAppbar(
links: const ['dashboard', 'massnahmen'], links: const ['dashboard', 'massnahmen'],
@ -239,7 +241,7 @@ class MeasureDetailPageState extends State<MeasureDetailPage> {
Align( Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text( child: Text(
measure.name, measure.name!,
style: theme.currentThemeData.textTheme.headlineMedium, style: theme.currentThemeData.textTheme.headlineMedium,
), ),
), ),

View file

@ -322,8 +322,4 @@ class MeasuresPageState extends State<MeasuresPage> {
), ),
); );
} }
bool _hasCommonItems(List listOne, List listTwo) {
return listOne.toSet().intersection(listTwo.toSet()).isNotEmpty;
}
} }

View file

@ -7,9 +7,13 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <isar_flutter_libs/isar_flutter_libs_plugin.h> #include <isar_flutter_libs/isar_flutter_libs_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) isar_flutter_libs_registrar = g_autoptr(FlPluginRegistrar) isar_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "IsarFlutterLibsPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "IsarFlutterLibsPlugin");
isar_flutter_libs_plugin_register_with_registrar(isar_flutter_libs_registrar); isar_flutter_libs_plugin_register_with_registrar(isar_flutter_libs_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
} }

View file

@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
isar_flutter_libs isar_flutter_libs
url_launcher_linux
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST

View file

@ -10,6 +10,7 @@ import isar_flutter_libs
import path_provider_foundation import path_provider_foundation
import shared_preferences_foundation import shared_preferences_foundation
import sqflite_darwin import sqflite_darwin
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
@ -17,4 +18,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
} }

View file

@ -464,6 +464,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
flutter_spinbox:
dependency: "direct main"
description:
name: flutter_spinbox
sha256: "38d8c1a3a39f0fa72823d4470785f5e165f2deb53531ca7803b54ba45e4dbd46"
url: "https://pub.dev"
source: hosted
version: "0.13.1"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -730,6 +738,14 @@ packages:
url: "https://pub.isar-community.dev" url: "https://pub.isar-community.dev"
source: hosted source: hosted
version: "4.0.3" version: "4.0.3"
jiffy:
dependency: transitive
description:
name: jiffy
sha256: "1c1b86459969ff9f32dc5b0ffe392f1e08181e66396cf9dd8fa7c90552a691af"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
jovial_misc: jovial_misc:
dependency: transitive dependency: transitive
description: description:
@ -874,6 +890,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
number_inc_dec:
dependency: "direct main"
description:
name: number_inc_dec
sha256: af0a35f923a2e67532bc6579e8fbf0093be8ea185e48bb543db4e3e355017ec5
url: "https://pub.dev"
source: hosted
version: "0.8.0"
octo_image: octo_image:
dependency: transitive dependency: transitive
description: description:
@ -1335,6 +1359,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "28.1.33" version: "28.1.33"
syncfusion_flutter_datagrid_export:
dependency: "direct main"
description:
name: syncfusion_flutter_datagrid_export
sha256: "8f948663820f1c987430df9243b48e83d1e4ba3823ed3fb8c054f5d6b6ade2f8"
url: "https://pub.dev"
source: hosted
version: "28.1.33"
syncfusion_flutter_datepicker: syncfusion_flutter_datepicker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1343,6 +1375,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "28.1.33" version: "28.1.33"
syncfusion_flutter_pdf:
dependency: transitive
description:
name: syncfusion_flutter_pdf
sha256: bdd6b6c085fc39fbcfbf641efbf7f97d9c39b58e57accc47fca4f9db592b2294
url: "https://pub.dev"
source: hosted
version: "28.1.33"
syncfusion_flutter_xlsio:
dependency: transitive
description:
name: syncfusion_flutter_xlsio
sha256: dfe4ab39ae2c3fad1b2e9696e69d30099a54913bcc78c17df39c44c517de72b0
url: "https://pub.dev"
source: hosted
version: "28.1.33"
syncfusion_localizations: syncfusion_localizations:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1351,6 +1399,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "28.1.33" version: "28.1.33"
syncfusion_officecore:
dependency: transitive
description:
name: syncfusion_officecore
sha256: c771b542eeb8ed90344e32dadc5ae8a54292ce159c1f98db1a8b16c71a7c2f37
url: "https://pub.dev"
source: hosted
version: "28.1.33"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@ -1431,6 +1487,70 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.2" version: "2.2.2"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
url: "https://pub.dev"
source: hosted
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: "direct main"
description:
name: url_launcher_web
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
url: "https://pub.dev"
source: hosted
version: "3.1.3"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:

View file

@ -67,6 +67,11 @@ dependencies:
cross_file: ^0.3.4+2 cross_file: ^0.3.4+2
screenshot: ^3.0.0 screenshot: ^3.0.0
webview_flutter_web: ^0.2.3+4 webview_flutter_web: ^0.2.3+4
number_inc_dec: ^0.8.0
flutter_spinbox: ^0.13.1
syncfusion_flutter_datagrid_export: ^28.1.33
url_launcher_web: ^2.3.3
url_launcher: ^6.3.1

View file

@ -9,6 +9,7 @@
#include <geolocator_windows/geolocator_windows.h> #include <geolocator_windows/geolocator_windows.h>
#include <isar_flutter_libs/isar_flutter_libs_plugin.h> #include <isar_flutter_libs/isar_flutter_libs_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h> #include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
GeolocatorWindowsRegisterWithRegistrar( GeolocatorWindowsRegisterWithRegistrar(
@ -17,4 +18,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("IsarFlutterLibsPlugin")); registry->GetRegistrarForPlugin("IsarFlutterLibsPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar( PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
} }

View file

@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
geolocator_windows geolocator_windows
isar_flutter_libs isar_flutter_libs
permission_handler_windows permission_handler_windows
url_launcher_windows
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST