From bb1e1ecc95a99a4c3d8ed7f967daf4a61d06e5a2 Mon Sep 17 00:00:00 2001 From: reinjens Date: Mon, 16 Dec 2024 11:15:11 +0100 Subject: [PATCH] PDF Export --- lib/main.dart | 4 + lib/src/entity/cart/cart_datasource.dart | 116 ++- .../measure/complete/measure_complete.dart | 13 +- .../measure/complete/measure_complete.g.dart | 283 +++--- .../details/measure_details_repository.dart | 4 +- .../entity/measure/measure_repository.dart | 67 ++ .../entity/measure/months/measure_months.dart | 46 + .../measure/months/measure_months.g.dart | 850 ++++++++++++++++++ .../months/measure_months_datasource.dart | 147 +++ lib/src/packages/ambito_db/base_db.dart | 4 + lib/src/pages/calendar/calendar_page.dart | 431 ++++++--- lib/src/pages/cart/cart_page.dart | 181 ++-- .../dashboard/areas/dashboard_areas_page.dart | 1 - .../measure/detail/measure_detail_page.dart | 18 +- lib/src/pages/measure/measure_page.dart | 4 - linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 120 +++ pubspec.yaml | 5 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 22 files changed, 1911 insertions(+), 394 deletions(-) create mode 100644 lib/src/entity/measure/months/measure_months.dart create mode 100644 lib/src/entity/measure/months/measure_months.g.dart create mode 100644 lib/src/entity/measure/months/measure_months_datasource.dart diff --git a/lib/main.dart b/lib/main.dart index 4e77377..45c7505 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -64,6 +64,8 @@ void main() async { } }*/ + MeasureRepository().buildMeasureComplete(); + /*BaseApi().getContent('cart', false).then((carts) { logger.i(carts); for (final cart in carts) { @@ -82,6 +84,8 @@ void main() async { await MeasureRepository().getCategoriesGroupsAndTypes(); + MeasureRepository().buildMeasureMonths(); + runApp(const Ambito()); } diff --git a/lib/src/entity/cart/cart_datasource.dart b/lib/src/entity/cart/cart_datasource.dart index c3b02a6..39355ff 100644 --- a/lib/src/entity/cart/cart_datasource.dart +++ b/lib/src/entity/cart/cart_datasource.dart @@ -1,31 +1,35 @@ import 'package:ambito/src/entity/cart/cart_element.dart'; import 'package:ambito/src/entity/entities.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_spinbox/flutter_spinbox.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import '../../packages/ambito_theme/ambito_theme.dart'; class CartDataSource extends DataGridSource { CartDataSource( - {required List cartElements, required this.context}) { + {required this.cartElements, + required this.context, + required this.controller}) { dataGridRows = cartElements .map( (dataGridRow) => DataGridRow( cells: [ DataGridCell( - columnName: 'name', + columnName: 'Material', value: dataGridRow.name, ), DataGridCell( - columnName: 'amount', + columnName: 'Menge', value: dataGridRow.amount, ), DataGridCell>( - columnName: 'provider', + columnName: 'Anbieter', value: dataGridRow.provider, ), DataGridCell( - columnName: 'price', + columnName: 'Richtpreis', value: dataGridRow.price.toString(), ), ], @@ -35,8 +39,15 @@ class CartDataSource extends DataGridSource { } final BuildContext context; + final List cartElements; List dataGridRows = []; + final DataGridController controller; + + dynamic newCellValue; + + /// Helps to control the editable text in the [TextField] widget. + TextEditingController editingController = TextEditingController(); @override List get rows => dataGridRows; @@ -47,7 +58,7 @@ class CartDataSource extends DataGridSource { double completePrice = double.tryParse(row .getCells() - .where((cell) => cell.columnName == 'price') + .where((cell) => cell.columnName == 'Richtpreis') .first .value .toString() ?? @@ -56,7 +67,7 @@ class CartDataSource extends DataGridSource { int amount = int.tryParse(row .getCells() - .where((cell) => cell.columnName == 'amount') + .where((cell) => cell.columnName == 'Menge') .first .value .toString() ?? @@ -70,7 +81,7 @@ class CartDataSource extends DataGridSource { return DataGridRowAdapter( cells: row.getCells().map( (dataGridCell) { - if (dataGridCell.columnName == 'provider') { + if (dataGridCell.columnName == 'Anbieter') { final providerString = dataGridCell.value.map((ele) => ele.value).toList().join(', '); return Container( @@ -86,7 +97,7 @@ class CartDataSource extends DataGridSource { ); } - if (dataGridCell.columnName == 'price') { + if (dataGridCell.columnName == 'Richtpreis') { final priceString = amount == 1 ? '${dataGridCell.value ?? '0'}€' : '${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( alignment: Alignment.centerLeft, padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - IconButton( - 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: () {}, - ), - ], + child: Text( + dataGridCell.value, + textAlign: TextAlign.center, + style: theme.bodyMedium, ), ); } @@ -154,4 +138,54 @@ class CartDataSource extends DataGridSource { }, ).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'); + }, + ),*/ + ); + } } diff --git a/lib/src/entity/measure/complete/measure_complete.dart b/lib/src/entity/measure/complete/measure_complete.dart index 8c7ce58..c42d8cc 100644 --- a/lib/src/entity/measure/complete/measure_complete.dart +++ b/lib/src/entity/measure/complete/measure_complete.dart @@ -1,5 +1,6 @@ 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/base_entity.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; @@ -13,11 +14,10 @@ part 'measure_complete.g.dart'; @JsonSerializable() @collection -class MeasureComplete { - MeasureComplete({required this.id, required this.name}); +class MeasureComplete extends BaseEntity with EntityWithId { + MeasureComplete(); - final int id; - final String name; + String? name; FilePart? image; String? description; String? target; @@ -66,8 +66,9 @@ class MeasureComplete { List helper = []; List helperFiles = []; - MeasureComplete mc = - MeasureComplete(id: json['id'], name: json['field_3021886']); + MeasureComplete mc = MeasureComplete() + ..id = json['id'] + ..name = json['field_3021886']; if (json['field_2402548'] != null && json['field_2402548'].isNotEmpty) { mc.image = FilePart.fromJson(json['field_2402548'][0]); } else { diff --git a/lib/src/entity/measure/complete/measure_complete.g.dart b/lib/src/entity/measure/complete/measure_complete.g.dart index eb4b8c5..766c58f 100644 --- a/lib/src/entity/measure/complete/measure_complete.g.dart +++ b/lib/src/entity/measure/complete/measure_complete.g.dart @@ -204,7 +204,14 @@ const MeasureCompleteSchema = IsarGeneratedSchema( @isarProtected 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; if (value == null) { @@ -593,14 +600,8 @@ int serializeMeasureComplete(IsarWriter writer, MeasureComplete object) { @isarProtected MeasureComplete deserializeMeasureComplete(IsarReader reader) { - final int _id; - _id = IsarCore.readId(reader); - final String _name; - _name = IsarCore.readString(reader, 1) ?? ''; - final object = MeasureComplete( - id: _id, - name: _name, - ); + final object = MeasureComplete(); + object.name = IsarCore.readString(reader, 1); { final objectReader = IsarCore.readObject(reader, 2); if (objectReader.isNull) { @@ -840,16 +841,15 @@ MeasureComplete deserializeMeasureComplete(IsarReader reader) { } } } + object.id = IsarCore.readId(reader); return object; } @isarProtected dynamic deserializeMeasureCompleteProp(IsarReader reader, int property) { switch (property) { - case 0: - return IsarCore.readId(reader); case 1: - return IsarCore.readString(reader, 1) ?? ''; + return IsarCore.readString(reader, 1); case 2: { final objectReader = IsarCore.readObject(reader, 2); @@ -1131,6 +1131,8 @@ dynamic deserializeMeasureCompleteProp(IsarReader reader, int property) { } } } + case 0: + return IsarCore.readId(reader); default: throw ArgumentError('Unknown property: $property'); } @@ -1578,94 +1580,22 @@ extension MeasureCompleteQueryBuilderUpdate extension MeasureCompleteQueryFilter on QueryBuilder { QueryBuilder - idEqualTo( - int value, - ) { + nameIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - EqualCondition( - property: 0, - value: value, - ), - ); + return query.addFilterCondition(const IsNullCondition(property: 1)); }); } QueryBuilder - idGreaterThan( - int value, - ) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - GreaterCondition( - property: 0, - value: value, - ), - ); - }); - } - - QueryBuilder - idGreaterThanOrEqualTo( - int value, - ) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - GreaterOrEqualCondition( - property: 0, - value: value, - ), - ); - }); - } - - QueryBuilder - idLessThan( - int value, - ) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - LessCondition( - property: 0, - value: value, - ), - ); - }); - } - - QueryBuilder - idLessThanOrEqualTo( - int value, - ) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - LessOrEqualCondition( - property: 0, - value: value, - ), - ); - }); - } - - QueryBuilder - idBetween( - int lower, - int upper, - ) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition( - BetweenCondition( - property: 0, - lower: lower, - upper: upper, - ), - ); + nameIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); }); } QueryBuilder nameEqualTo( - String value, { + String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -1681,7 +1611,7 @@ extension MeasureCompleteQueryFilter QueryBuilder nameGreaterThan( - String value, { + String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -1697,7 +1627,7 @@ extension MeasureCompleteQueryFilter QueryBuilder nameGreaterThanOrEqualTo( - String value, { + String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -1713,7 +1643,7 @@ extension MeasureCompleteQueryFilter QueryBuilder nameLessThan( - String value, { + String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -1729,7 +1659,7 @@ extension MeasureCompleteQueryFilter QueryBuilder nameLessThanOrEqualTo( - String value, { + String? value, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -1745,8 +1675,8 @@ extension MeasureCompleteQueryFilter QueryBuilder nameBetween( - String lower, - String upper, { + String? lower, + String? upper, { bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { @@ -9643,6 +9573,92 @@ extension MeasureCompleteQueryFilter ); }); } + + QueryBuilder + idEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 0, + lower: lower, + upper: upper, + ), + ); + }); + } } extension MeasureCompleteQueryObject @@ -9657,18 +9673,6 @@ extension MeasureCompleteQueryObject extension MeasureCompleteQuerySortBy on QueryBuilder { - QueryBuilder sortById() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(0); - }); - } - - QueryBuilder sortByIdDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(0, sort: Sort.desc); - }); - } - QueryBuilder sortByName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -10277,22 +10281,22 @@ extension MeasureCompleteQuerySortBy ); }); } -} -extension MeasureCompleteQuerySortThenBy - on QueryBuilder { - QueryBuilder thenById() { + QueryBuilder sortById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(0); }); } - QueryBuilder thenByIdDesc() { + QueryBuilder sortByIdDesc() { return QueryBuilder.apply(this, (query) { return query.addSortBy(0, sort: Sort.desc); }); } +} +extension MeasureCompleteQuerySortThenBy + on QueryBuilder { QueryBuilder thenByName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -10698,6 +10702,18 @@ extension MeasureCompleteQuerySortThenBy return query.addSortBy(40, sort: Sort.desc, caseSensitive: caseSensitive); }); } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } } extension MeasureCompleteQueryWhereDistinct @@ -10985,13 +11001,7 @@ extension MeasureCompleteQueryWhereDistinct extension MeasureCompleteQueryProperty1 on QueryBuilder { - QueryBuilder idProperty() { - return QueryBuilder.apply(this, (query) { - return query.addProperty(0); - }); - } - - QueryBuilder nameProperty() { + QueryBuilder nameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(1); }); @@ -11266,17 +11276,17 @@ extension MeasureCompleteQueryProperty1 return query.addProperty(42); }); } -} -extension MeasureCompleteQueryProperty2 - on QueryBuilder { - QueryBuilder idProperty() { + QueryBuilder idProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(0); }); } +} - QueryBuilder nameProperty() { +extension MeasureCompleteQueryProperty2 + on QueryBuilder { + QueryBuilder nameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(1); }); @@ -11565,17 +11575,17 @@ extension MeasureCompleteQueryProperty2 return query.addProperty(42); }); } -} -extension MeasureCompleteQueryProperty3 - on QueryBuilder { - QueryBuilder idProperty() { + QueryBuilder idProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(0); }); } +} - QueryBuilder nameProperty() { +extension MeasureCompleteQueryProperty3 + on QueryBuilder { + QueryBuilder nameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(1); }); @@ -11867,6 +11877,12 @@ extension MeasureCompleteQueryProperty3 return query.addProperty(42); }); } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } } // ************************************************************************** @@ -11874,10 +11890,9 @@ extension MeasureCompleteQueryProperty3 // ************************************************************************** MeasureComplete _$MeasureCompleteFromJson(Map json) => - MeasureComplete( - id: (json['id'] as num).toInt(), - name: json['name'] as String, - ) + MeasureComplete() + ..id = (json['id'] as num).toInt() + ..name = json['name'] as String? ..image = json['image'] == null ? null : FilePart.fromJson(json['image'] as Map) diff --git a/lib/src/entity/measure/details/measure_details_repository.dart b/lib/src/entity/measure/details/measure_details_repository.dart index e486fe4..e33486c 100644 --- a/lib/src/entity/measure/details/measure_details_repository.dart +++ b/lib/src/entity/measure/details/measure_details_repository.dart @@ -8,11 +8,11 @@ class MeasureDetailsRepository extends BaseDB { @override IsarCollection collection = isar.measureDetails; - MeasureDetails getDetailsForMeasure(String measure) { + MeasureDetails? getDetailsForMeasure(String measure) { List all = isar.measureDetails.where().findAll(); return all .where( (el) => el.measure!.map((m) => m.value).toList().contains(measure)) - .first; + .firstOrNull; } } diff --git a/lib/src/entity/measure/measure_repository.dart b/lib/src/entity/measure/measure_repository.dart index 13fb9ae..fb4251d 100644 --- a/lib/src/entity/measure/measure_repository.dart +++ b/lib/src/entity/measure/measure_repository.dart @@ -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/complete/measure_complete.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/packages/ambito_db/base_db.dart'; import 'package:isar/isar.dart'; @@ -11,6 +13,7 @@ import 'package:isar/isar.dart'; import '../../consts/consts.dart'; import '../../packages/ambito_notifier/notifier/filter_notifier.dart'; import '../../widgets/form/fields/field_dropdown.dart'; +import 'details/measure_details_repository.dart'; import 'group/measure_group.dart'; class MeasureRepository extends BaseDB { @@ -260,4 +263,68 @@ class MeasureRepository extends BaseDB { MeasureComplete? getMeasureCompleteByName(String name) { return isar.measureCompletes.where().nameEqualTo(name).findFirst(); } + + void buildMeasureComplete() { + List allMeasureCompletes = []; + + List measuresGeneral = + isar.measureGenerals.where().findAll(); + + for (final measureGeneral in measuresGeneral) { + Map 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 combined, Map? data) { + data?.forEach((key, value) { + if (key != 'id') { + combined[key] = value; + } + }); + } + + void buildMeasureMonths() { + List allCompletes = + isar.measureCompletes.where().findAll(); + List measureMonths = []; + + for (final complete in allCompletes) { + List apply = months + .map((item) => complete.applyMonths?.contains(item) ?? false) + .toList(); + List 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); + }); + } + } } diff --git a/lib/src/entity/measure/months/measure_months.dart b/lib/src/entity/measure/months/measure_months.dart new file mode 100644 index 0000000..4b09a9e --- /dev/null +++ b/lib/src/entity/measure/months/measure_months.dart @@ -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? maintenanceList = [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ]; + List? applyList = [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ]; + + factory MeasureMonths.fromJson(Map json) => + _$MeasureMonthsFromJson(json); + + Map toJson() => _$MeasureMonthsToJson(this); +} diff --git a/lib/src/entity/measure/months/measure_months.g.dart b/lib/src/entity/measure/months/measure_months.g.dart new file mode 100644 index 0000000..cd99203 --- /dev/null +++ b/lib/src/entity/measure/months/measure_months.g.dart @@ -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 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( + 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.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.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.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.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 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 id, + String? name, + }); +} + +class _MeasureMonthsUpdateAllImpl implements _MeasureMonthsUpdateAll { + const _MeasureMonthsUpdateAllImpl(this.collection); + + final IsarCollection collection; + + @override + int call({ + required List id, + Object? name = ignore, + }) { + return collection.updateProperties(id, { + if (name != ignore) 1: name as String?, + }); + } +} + +extension MeasureMonthsUpdate on IsarCollection { + _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 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 { + _MeasureMonthsQueryUpdate get updateFirst => + _MeasureMonthsQueryUpdateImpl(this, limit: 1); + + _MeasureMonthsQueryUpdate get updateAll => + _MeasureMonthsQueryUpdateImpl(this); +} + +class _MeasureMonthsQueryBuilderUpdateImpl + implements _MeasureMonthsQueryUpdate { + const _MeasureMonthsQueryBuilderUpdateImpl(this.query, {this.limit}); + + final QueryBuilder 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 { + _MeasureMonthsQueryUpdate get updateFirst => + _MeasureMonthsQueryBuilderUpdateImpl(this, limit: 1); + + _MeasureMonthsQueryUpdate get updateAll => + _MeasureMonthsQueryBuilderUpdateImpl(this); +} + +extension MeasureMonthsQueryFilter + on QueryBuilder { + QueryBuilder + nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder + nameIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder 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 + nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 1, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + maintenanceListIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + maintenanceListIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + maintenanceListElementEqualTo( + bool value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 2, + value: value, + ), + ); + }); + } + + QueryBuilder + maintenanceListIsEmpty() { + return not().group( + (q) => q.maintenanceListIsNull().or().maintenanceListIsNotEmpty(), + ); + } + + QueryBuilder + maintenanceListIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterOrEqualCondition(property: 2, value: null), + ); + }); + } + + QueryBuilder + applyListIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 3)); + }); + } + + QueryBuilder + applyListIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 3)); + }); + } + + QueryBuilder + applyListElementEqualTo( + bool value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + applyListIsEmpty() { + return not().group( + (q) => q.applyListIsNull().or().applyListIsNotEmpty(), + ); + } + + QueryBuilder + applyListIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterOrEqualCondition(property: 3, value: null), + ); + }); + } + + QueryBuilder idEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder idLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder idBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 0, + lower: lower, + upper: upper, + ), + ); + }); + } +} + +extension MeasureMonthsQueryObject + on QueryBuilder {} + +extension MeasureMonthsQuerySortBy + on QueryBuilder { + QueryBuilder sortByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder sortByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } +} + +extension MeasureMonthsQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } +} + +extension MeasureMonthsQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByMaintenanceList() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(2); + }); + } + + QueryBuilder + distinctByApplyList() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(3); + }); + } +} + +extension MeasureMonthsQueryProperty1 + on QueryBuilder { + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder?, QAfterProperty> + maintenanceListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder?, QAfterProperty> applyListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } +} + +extension MeasureMonthsQueryProperty2 + on QueryBuilder { + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder?), QAfterProperty> + maintenanceListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder?), QAfterProperty> + applyListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } +} + +extension MeasureMonthsQueryProperty3 + on QueryBuilder { + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder?), QOperations> + maintenanceListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder?), QOperations> + applyListProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +MeasureMonths _$MeasureMonthsFromJson(Map json) => + MeasureMonths() + ..id = (json['id'] as num).toInt() + ..name = json['name'] as String? + ..maintenanceList = (json['maintenanceList'] as List?) + ?.map((e) => e as bool) + .toList() + ..applyList = + (json['applyList'] as List?)?.map((e) => e as bool).toList(); + +Map _$MeasureMonthsToJson(MeasureMonths instance) => + { + 'id': instance.id, + 'name': instance.name, + 'maintenanceList': instance.maintenanceList, + 'applyList': instance.applyList, + }; diff --git a/lib/src/entity/measure/months/measure_months_datasource.dart b/lib/src/entity/measure/months/measure_months_datasource.dart new file mode 100644 index 0000000..16b5c7b --- /dev/null +++ b/lib/src/entity/measure/months/measure_months_datasource.dart @@ -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 areas, + required this.context, + required this.type}) { + dataGridRows = areas + .map( + (dataGridRow) => DataGridRow( + cells: [ + DataGridCell( + columnName: 'measure', + value: dataGridRow.name, + ), + DataGridCell( + columnName: 'jan', + value: type == 'apply' + ? dataGridRow.applyList![0] + : dataGridRow.maintenanceList![0], + ), + DataGridCell( + columnName: 'feb', + value: type == 'apply' + ? dataGridRow.applyList![1] + : dataGridRow.maintenanceList![1], + ), + DataGridCell( + columnName: 'mar', + value: type == 'apply' + ? dataGridRow.applyList![2] + : dataGridRow.maintenanceList![2], + ), + DataGridCell( + columnName: 'apr', + value: type == 'apply' + ? dataGridRow.applyList![3] + : dataGridRow.maintenanceList![3], + ), + DataGridCell( + columnName: 'may', + value: type == 'apply' + ? dataGridRow.applyList![4] + : dataGridRow.maintenanceList![4], + ), + DataGridCell( + columnName: 'jun', + value: type == 'apply' + ? dataGridRow.applyList![5] + : dataGridRow.maintenanceList![5], + ), + DataGridCell( + columnName: 'jul', + value: type == 'apply' + ? dataGridRow.applyList![6] + : dataGridRow.maintenanceList![6], + ), + DataGridCell( + columnName: 'aug', + value: type == 'apply' + ? dataGridRow.applyList![7] + : dataGridRow.maintenanceList![7], + ), + DataGridCell( + columnName: 'sep', + value: type == 'apply' + ? dataGridRow.applyList![8] + : dataGridRow.maintenanceList![8], + ), + DataGridCell( + columnName: 'oct', + value: type == 'apply' + ? dataGridRow.applyList![9] + : dataGridRow.maintenanceList![9], + ), + DataGridCell( + columnName: 'nov', + value: type == 'apply' + ? dataGridRow.applyList![10] + : dataGridRow.maintenanceList![10], + ), + DataGridCell( + columnName: 'dec', + value: type == 'apply' + ? dataGridRow.applyList![11] + : dataGridRow.maintenanceList![11], + ), + ], + ), + ) + .toList(); + } + + final BuildContext context; + final String type; + + List dataGridRows = []; + + @override + List get rows => dataGridRows; + + @override + DataGridRowAdapter? buildRow(DataGridRow row) { + final AmbitoTheme theme = getTheme(context); + + return DataGridRowAdapter( + cells: row.getCells().map( + (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()); + } +} diff --git a/lib/src/packages/ambito_db/base_db.dart b/lib/src/packages/ambito_db/base_db.dart index f6fba4c..7686fd9 100644 --- a/lib/src/packages/ambito_db/base_db.dart +++ b/lib/src/packages/ambito_db/base_db.dart @@ -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_type_group_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/group/measure_group.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:flutter/foundation.dart'; import 'package:isar/isar.dart'; @@ -40,6 +42,8 @@ class AmbitoIsarDB { ListMeasureSingleSchema, ListMeasureTypeGroupCategorySchema, MaterialSchema, + MeasureMonthsSchema, + MeasureCompleteSchema, MeasureTypesSchema, MeasureTypesDetailsSchema, MeasureGeneralSchema, diff --git a/lib/src/pages/calendar/calendar_page.dart b/lib/src/pages/calendar/calendar_page.dart index 75026af..285d0b8 100644 --- a/lib/src/pages/calendar/calendar_page.dart +++ b/lib/src/pages/calendar/calendar_page.dart @@ -1,16 +1,15 @@ -import 'package:ambito/src/entity/_general/filter/item_filter.dart'; -import 'package:ambito/src/entity/_general/filter/item_filter_repository.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/entity/measure/months/measure_months.dart'; +import 'package:ambito/src/entity/measure/months/measure_months_datasource.dart'; import 'package:ambito/src/packages/ambito_theme/ambito_theme.dart'; -import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; +import 'package:isar/isar.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 '../../widgets/appbar/ambito_appbar.dart'; +import '../../widgets/page/base_page.dart'; class CalendarPage extends StatefulWidget { const CalendarPage({super.key}); @@ -20,148 +19,310 @@ class CalendarPage extends StatefulWidget { } class CalendarPageState extends State { - List appointments = []; + int display = 0; - Set? monthFilter = {}; + String type = 'maintenance'; @override void initState() { - initDataSource(); 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 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 Widget build(BuildContext context) { + List mm = isar.measureMonths.where().sortByName().findAll(); + final AmbitoTheme theme = getTheme(context); - return Scaffold( - appBar: AmbitoAppbar( - links: const ['dashboard', 'massnahmen'], - breakpoint: Breakpoint.fromContext(context), - theme: theme, - ), - body: Center( - child: Padding( - padding: const EdgeInsets.all(32), - child: SfCalendar( - firstDayOfWeek: 1, - showNavigationArrow: true, - view: CalendarView.month, - dataSource: _AppointmentDataSource(appointments), - monthViewSettings: const MonthViewSettings( - appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, - appointmentDisplayCount: 64, + return BasePage().getPage( + context, + SingleChildScrollView( + child: Expanded( + child: Align( + alignment: Alignment.topCenter, + child: Padding( + padding: context.breakpoint.padding, + child: SizedBox( + width: 1152, + height: MediaQuery.of(context).size.height - 80, + child: Padding( + padding: EdgeInsets.only(bottom: 40), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + 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 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 appointments = []; - 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 source) { - appointments = source; - } -} - -/*class ActionDataSource extends CalendarDataSource { - ActionDataSource(List 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; -}*/ diff --git a/lib/src/pages/cart/cart_page.dart b/lib/src/pages/cart/cart_page.dart index 828d9df..6b0dff9 100644 --- a/lib/src/pages/cart/cart_page.dart +++ b/lib/src/pages/cart/cart_page.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:typed_data'; 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:syncfusion_flutter_core/theme.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/measure/general/measure_general_repository.dart'; import '../../widgets/buttons/print_all_button.dart'; @@ -43,6 +49,8 @@ class CartPageState extends State { final ScreenshotController screenshotController = ScreenshotController(); Uint8List? _imageFile; + final DataGridController _dataGridController = DataGridController(); + @override void initState() { super.initState(); @@ -109,13 +117,12 @@ class CartPageState extends State { List children = []; if (carts != null) { - int counter = 0; for (final cart in carts) { final measure = MeasureGeneralRepository().getByName(cart.name!); - final elements = CartRepository().getElementsByCartId(cart.id); double sum = 0; + final GlobalKey key = GlobalKey(); for (final element in elements) { sum = sum + @@ -123,69 +130,103 @@ class CartPageState extends State { (double.tryParse(element.price ?? '0') ?? 0)); } - final card = ExportFrame( - exportDelegate: exportDelegate, - frameId: 'cart${cart.id}', - child: SizedBox( - width: 1152, - child: Card( - elevation: 0, - color: theme.currentColorScheme.tertiary, - child: Padding( - padding: const EdgeInsets.all(20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - cart.name!, - style: theme.labelLarge.copyWith( - color: theme.currentColorScheme.primary), - ), - const Spacer(), - SizedBox( - height: 40, - width: 200, - child: ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(10), - ), - child: measure?.getFullImage() ?? - Image.asset('assets/images/logo_trans.png'), + final card = SizedBox( + width: 1152, + child: Card( + elevation: 0, + color: theme.currentColorScheme.tertiary, + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + cart.name!, + style: theme.labelLarge + .copyWith(color: theme.currentColorScheme.primary), + ), + const Spacer(), + SizedBox( + height: 40, + width: 200, + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(10), ), + child: measure?.getFullImage() ?? + Image.asset('assets/images/logo_trans.png'), ), - ], - ), - theme.verticalSpacerSmall, - gridWidget(elements ?? []), - theme.verticalSpacer, - Row( - children: [ - Text( - 'Richtpreis ca. ${sum.toStringAsFixed(2)}€', - style: theme.labelMedium - .copyWith(fontWeight: FontWeight.bold), - ), - Spacer(), - PrintButton( - onPressed: () async { - final pdf = await exportDelegate - .exportToPdfDocument('cart${cart.id}'); - await saveFile(pdf, '${cart.id}.pdf'); - }, - ), - ], - ) - ], - ), + ), + ], + ), + theme.verticalSpacerSmall, + gridWidget(elements ?? [], key), + theme.verticalSpacer, + Row( + children: [ + Text( + 'Richtpreis ca. ${sum.toStringAsFixed(2)}€', + style: theme.labelMedium + .copyWith(fontWeight: FontWeight.bold), + ), + Spacer(), + PrintButton( + onPressed: () async { + PdfDocument document = + 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 values = []; + for (IdValue idValue + in (details.cellValue as List)) { + values.add(idValue.value ?? ''); + } + logger.d(values.join(', ')); + details.pdfCell.value = values.join(', '); + } + } + }, + fitAllColumnsInOnePage: true, + ); + final List bytes = document.saveSync(); + launchUrl(Uri.parse( + "data:application/octet-stream;base64,${base64Encode(bytes)}")); + }, + ), + ], + ) + ], ), ), ), ); children.add(card); children.add(theme.verticalSpacerMax); - counter++; } } @@ -198,7 +239,8 @@ class CartPageState extends State { ); } - Widget gridWidget(List cartElements) { + Widget gridWidget( + List cartElements, GlobalKey key) { final AmbitoTheme theme = getTheme(context); return SfDataGridTheme( @@ -210,12 +252,22 @@ class CartPageState extends State { ), ), child: SfDataGrid( + controller: _dataGridController, + key: key, 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, columns: [ GridColumn( - columnName: 'name', + columnName: 'Material', + allowEditing: true, label: Container( padding: const EdgeInsets.symmetric(horizontal: 10.0), alignment: Alignment.centerLeft, @@ -229,8 +281,9 @@ class CartPageState extends State { ), ), GridColumn( - columnName: 'amount', + columnName: 'Menge', maximumWidth: 150, + allowEditing: true, label: Container( padding: const EdgeInsets.symmetric(horizontal: 10.0), alignment: Alignment.centerLeft, @@ -244,9 +297,10 @@ class CartPageState extends State { ), ), GridColumn( - columnName: 'provider', + columnName: 'Anbieter', maximumWidth: 200, allowSorting: false, + allowEditing: false, label: Container( padding: const EdgeInsets.symmetric(horizontal: 10.0), alignment: Alignment.centerLeft, @@ -260,8 +314,9 @@ class CartPageState extends State { ), ), GridColumn( - columnName: 'price', + columnName: 'Richtpreis', allowSorting: true, + allowEditing: false, maximumWidth: 250, label: Container( padding: const EdgeInsets.symmetric(horizontal: 10.0), diff --git a/lib/src/pages/dashboard/areas/dashboard_areas_page.dart b/lib/src/pages/dashboard/areas/dashboard_areas_page.dart index f669aea..7fa7520 100644 --- a/lib/src/pages/dashboard/areas/dashboard_areas_page.dart +++ b/lib/src/pages/dashboard/areas/dashboard_areas_page.dart @@ -114,7 +114,6 @@ class DashboardAreasPageState extends State { padding: context.breakpoint.padding, child: SizedBox( width: 1152, - height: 1152, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/src/pages/measure/detail/measure_detail_page.dart b/lib/src/pages/measure/detail/measure_detail_page.dart index 7720431..7477bf0 100644 --- a/lib/src/pages/measure/detail/measure_detail_page.dart +++ b/lib/src/pages/measure/detail/measure_detail_page.dart @@ -1,9 +1,6 @@ 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_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_repository.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/gallery_card.dart'; @@ -63,13 +60,12 @@ class MeasureDetailPageState extends State { super.initState(); // Parse ID from parameters - id = int.tryParse(Get.parameters['id'] ?? '0') ?? 0; // Initialize combined map with ID - Map combined = {'id': id}; + //Map combined = {'id': id}; // Retrieve measureGeneral data - measureGeneral = isar.measureGenerals.where().idEqualTo(id!).findFirst(); + /* measureGeneral = isar.measureGenerals.where().idEqualTo(id!).findFirst(); if (measureGeneral != null) { // Fetch related details and types @@ -92,7 +88,7 @@ class MeasureDetailPageState extends State { }); logger.d(measure!.toJson()); - }); + });*/ // Add scroll listener for the back-to-top button scrollController.addListener(() { @@ -116,6 +112,12 @@ class MeasureDetailPageState extends State { @override Widget build(BuildContext context) { final AmbitoTheme theme = getTheme(context); + + id = int.tryParse(Get.parameters['id'] ?? '0') ?? 0; + + MeasureComplete? measure = + isar.measureCompletes.where().idEqualTo(id!).findFirst()!; + return Scaffold( appBar: AmbitoAppbar( links: const ['dashboard', 'massnahmen'], @@ -239,7 +241,7 @@ class MeasureDetailPageState extends State { Align( alignment: Alignment.centerLeft, child: Text( - measure.name, + measure.name!, style: theme.currentThemeData.textTheme.headlineMedium, ), ), diff --git a/lib/src/pages/measure/measure_page.dart b/lib/src/pages/measure/measure_page.dart index ad1b73d..e2c8c3a 100644 --- a/lib/src/pages/measure/measure_page.dart +++ b/lib/src/pages/measure/measure_page.dart @@ -322,8 +322,4 @@ class MeasuresPageState extends State { ), ); } - - bool _hasCommonItems(List listOne, List listTwo) { - return listOne.toSet().intersection(listTwo.toSet()).isNotEmpty; - } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index b898c8c..bfc0d08 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,9 +7,13 @@ #include "generated_plugin_registrant.h" #include +#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) isar_flutter_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "IsarFlutterLibsPlugin"); 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); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index cb083af..6237f02 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST isar_flutter_libs + url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 6885312..1dc4f6d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -10,6 +10,7 @@ import isar_flutter_libs import path_provider_foundation import shared_preferences_foundation import sqflite_darwin +import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) @@ -17,4 +18,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 4d71e99..ba519af 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -464,6 +464,14 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: "direct dev" description: flutter @@ -730,6 +738,14 @@ packages: url: "https://pub.isar-community.dev" source: hosted version: "4.0.3" + jiffy: + dependency: transitive + description: + name: jiffy + sha256: "1c1b86459969ff9f32dc5b0ffe392f1e08181e66396cf9dd8fa7c90552a691af" + url: "https://pub.dev" + source: hosted + version: "6.3.2" jovial_misc: dependency: transitive description: @@ -874,6 +890,14 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: @@ -1335,6 +1359,14 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: "direct main" description: @@ -1343,6 +1375,22 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: "direct main" description: @@ -1351,6 +1399,14 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: @@ -1431,6 +1487,70 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9b66f43..acaeb50 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,6 +67,11 @@ dependencies: cross_file: ^0.3.4+2 screenshot: ^3.0.0 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 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index d201e4a..0ffcc20 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -9,6 +9,7 @@ #include #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { GeolocatorWindowsRegisterWithRegistrar( @@ -17,4 +18,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("IsarFlutterLibsPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 65a875b..d279bca 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST geolocator_windows isar_flutter_libs permission_handler_windows + url_launcher_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST