From 12855222d0e77a0fa11455d1b2375b081cbb13b4 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 10 Oct 2023 12:00:37 +0300 Subject: [PATCH] Flutter upgrade --- .metadata | 16 +- analysis_options.yaml | 8 +- lib/data/models/entities.dart | 12 +- lib/data/models/mixins/invoice_mixin.dart | 2 +- lib/data/models/task_model.dart | 4 +- lib/main.dart | 2 + lib/main_app.dart | 13 +- lib/redux/auth/auth_middleware.dart | 2 +- lib/redux/task/task_selectors.dart | 2 +- lib/redux/ui/entity_ui_state.dart | 2 +- lib/ui/app/app_webview.dart | 7 +- lib/ui/app/copy_to_clipboard.dart | 28 +- lib/ui/app/invoice/invoice_email_view.dart | 4 +- lib/ui/app/lists/app_list_tile.dart | 2 +- lib/ui/app/menu_drawer.dart | 2 +- lib/ui/app/tables/app_data_table.dart | 3 + lib/ui/app/tables/app_data_table_source.dart | 2 + .../app/tables/app_paginated_data_table.dart | 2 + lib/ui/app/tables/entity_datatable.dart | 10 +- lib/ui/app/tables/entity_list.dart | 20 +- .../company_gateway_screen.dart | 4 +- lib/ui/reports/reports_screen.dart | 27 +- lib/ui/settings/device_settings.dart | 8 +- lib/ui/task_status/task_status_screen.dart | 2 +- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 333 +++++++++++------- pubspec.yaml | 42 ++- test_driver/login_it_test.dart | 8 +- windows/CMakeLists.txt | 4 +- .../flutter/generated_plugin_registrant.cc | 6 + windows/flutter/generated_plugins.cmake | 2 + windows/runner/flutter_window.cpp | 5 + windows/runner/utils.cpp | 9 +- windows/runner/win32_window.cpp | 2 +- windows/runner/win32_window.h | 2 +- 37 files changed, 358 insertions(+), 246 deletions(-) diff --git a/.metadata b/.metadata index c93322885..3fd83c7e1 100644 --- a/.metadata +++ b/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: c07f7888888435fd9df505aa2efc38d3cf65681b - channel: stable + revision: "ead455963c12b453cdb2358cad34969c76daf180" + channel: "stable" project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b - base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b - - platform: linux - create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b - base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b + create_revision: ead455963c12b453cdb2358cad34969c76daf180 + base_revision: ead455963c12b453cdb2358cad34969c76daf180 + - platform: windows + create_revision: ead455963c12b453cdb2358cad34969c76daf180 + base_revision: ead455963c12b453cdb2358cad34969c76daf180 # User provided section diff --git a/analysis_options.yaml b/analysis_options.yaml index ae307311f..ebeb1d0a7 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -22,8 +22,6 @@ # in sync with this file. analyzer: - strong-mode: - implicit-dynamic: false errors: # https://github.com/flutter/flutter/issues/41563#issuecomment-686481533 undefined_prefixed_name: ignore @@ -51,7 +49,7 @@ linter: - always_declare_return_types - always_put_control_body_on_new_line # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219 - - always_require_non_null_named_parameters + # - always_require_non_null_named_parameters # deprecated # - always_specify_types # not support by built_value - annotate_overrides # - avoid_annotating_with_dynamic # conflicts with always_specify_types @@ -92,11 +90,11 @@ linter: # hash_and_equals # For built_value memoized hash - implementation_imports # - invariant_booleans # https://github.com/flutter/flutter/issues/5790 - - iterable_contains_unrelated_type + # - iterable_contains_unrelated_type # deprecated # - join_return_with_assignment # not yet tested - library_names - library_prefixes - - list_remove_unrelated_type + # - list_remove_unrelated_type # deprecated # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791 - no_adjacent_strings_in_list - no_duplicate_case_values diff --git a/lib/data/models/entities.dart b/lib/data/models/entities.dart index ad2a19202..c047c1349 100644 --- a/lib/data/models/entities.dart +++ b/lib/data/models/entities.dart @@ -315,7 +315,7 @@ class UserPermission extends EnumClass { static UserPermission valueOf(String name) => _$permissionValueOf(name); } -abstract class EntityStatus { +abstract mixin class EntityStatus { String get id; String get name; @@ -352,7 +352,7 @@ class EntityStats { } } -abstract class SelectableEntity { +abstract mixin class SelectableEntity { String get id; bool matchesFilter(String? filter) => true; @@ -376,7 +376,7 @@ class EntityFields { static const String isDeleted = 'is_deleted'; } -abstract class BaseEntity implements SelectableEntity { +abstract mixin class BaseEntity implements SelectableEntity { static int counter = 0; static String get nextId => '${--counter}'; @@ -534,7 +534,7 @@ abstract class BaseEntity implements SelectableEntity { } } -abstract class HasActivities { +abstract mixin class HasActivities { BuiltList get activities; Iterable getActivities({String? invoiceId, String? typeId}) { @@ -550,11 +550,11 @@ abstract class HasActivities { } } -abstract class BelongsToClient { +abstract mixin class BelongsToClient { String? get clientId; } -abstract class BelongsToVendor { +abstract mixin class BelongsToVendor { String get vendorId; } diff --git a/lib/data/models/mixins/invoice_mixin.dart b/lib/data/models/mixins/invoice_mixin.dart index 600ccdfa4..3311447e9 100644 --- a/lib/data/models/mixins/invoice_mixin.dart +++ b/lib/data/models/mixins/invoice_mixin.dart @@ -7,7 +7,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; -abstract class CalculateInvoiceTotal { +abstract mixin class CalculateInvoiceTotal { bool get isAmountDiscount; String get taxName1; diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index abb695f0e..dccdedca6 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -520,13 +520,13 @@ abstract class TaskEntity extends Object if (taskItem[0] == false || taskItem[0] == null) { startDate = 0; } else { - startDate = (taskItem[0]).round(); + startDate = taskItem[0].round(); } if (taskItem[1] == false || taskItem[1] == null) { endDate = 0; } else { - endDate = (taskItem[1]).round(); + endDate = taskItem[1].round(); } final taskTime = TaskTime( diff --git a/lib/main.dart b/lib/main.dart index 0585dcfd3..3d7eb3c44 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -193,10 +193,12 @@ void main({bool isTesting = false}) async { event = event.copyWith( environment: '${store.state.environment}'.split('.').last, + /* extra: { 'server_version': account.currentVersion, 'route': state.uiState.currentRoute, }, + */ ); return event; diff --git a/lib/main_app.dart b/lib/main_app.dart index e9516af3b..36844ca01 100644 --- a/lib/main_app.dart +++ b/lib/main_app.dart @@ -172,14 +172,6 @@ class InvoiceNinjaAppState extends State { void initState() { super.initState(); - final window = WidgetsBinding.instance.window; - window.onPlatformBrightnessChanged = () { - WidgetsBinding.instance.handlePlatformBrightnessChanged(); - widget.store!.dispatch(UpdateUserPreferences( - enableDarkModeSystem: window.platformBrightness == Brightness.dark)); - setState(() {}); - }; - if (kIsWeb) { WebUtils.warnChanges(widget.store); } @@ -235,6 +227,11 @@ class InvoiceNinjaAppState extends State { if (state.prefState.requireAuthentication && !_authenticated) { _authenticate(); } + + final brightness = MediaQuery.of(context).platformBrightness; + widget.store!.dispatch(UpdateUserPreferences( + enableDarkModeSystem: brightness == Brightness.dark)); + super.didChangeDependencies(); } diff --git a/lib/redux/auth/auth_middleware.dart b/lib/redux/auth/auth_middleware.dart index 7b1181892..72157b0d5 100644 --- a/lib/redux/auth/auth_middleware.dart +++ b/lib/redux/auth/auth_middleware.dart @@ -262,7 +262,7 @@ Middleware _createRefreshRequest(AuthRepository repository) { String token; bool hasToken = false; - if ((state.userCompany.token.token).isNotEmpty) { + if (state.userCompany.token.token.isNotEmpty) { token = state.userCompany.token.token; hasToken = true; } else { diff --git a/lib/redux/task/task_selectors.dart b/lib/redux/task/task_selectors.dart index 43aa1802b..7c662d7d2 100644 --- a/lib/redux/task/task_selectors.dart +++ b/lib/redux/task/task_selectors.dart @@ -199,7 +199,7 @@ List taskList( final list = taskMap.keys.where((taskId) { final task = taskMap[taskId]; if ((clientId ?? '').isNotEmpty && - (task!.clientId).isNotEmpty && + task!.clientId.isNotEmpty && task.clientId != clientId) { return false; } diff --git a/lib/redux/ui/entity_ui_state.dart b/lib/redux/ui/entity_ui_state.dart index d2f97e976..0a54803d8 100644 --- a/lib/redux/ui/entity_ui_state.dart +++ b/lib/redux/ui/entity_ui_state.dart @@ -8,7 +8,7 @@ import 'package:built_value/built_value.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -abstract class EntityUIState { +abstract mixin class EntityUIState { bool get isCreatingNew; String get editingId; diff --git a/lib/ui/app/app_webview.dart b/lib/ui/app/app_webview.dart index aac3c3f04..2974d6ffc 100644 --- a/lib/ui/app/app_webview.dart +++ b/lib/ui/app/app_webview.dart @@ -1,5 +1,4 @@ // Dart imports: -import 'dart:convert'; // Flutter imports: import 'package:flutter/foundation.dart'; @@ -59,12 +58,17 @@ class _MobileWebViewState extends State<_MobileWebView> super.didUpdateWidget(oldWidget); if (widget.html != oldWidget.html) { + _webViewController.loadHtmlString(widget.html!); + + /* _webViewController.loadUrl(Uri.dataFromString(widget.html!, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')) .toString()); + */ } } + /* @override Widget build(BuildContext context) { super.build(context); @@ -79,4 +83,5 @@ class _MobileWebViewState extends State<_MobileWebView> javascriptMode: JavascriptMode.disabled, ); } + */ } diff --git a/lib/ui/app/copy_to_clipboard.dart b/lib/ui/app/copy_to_clipboard.dart index d7f9ebaef..f4e34c3a6 100644 --- a/lib/ui/app/copy_to_clipboard.dart +++ b/lib/ui/app/copy_to_clipboard.dart @@ -33,21 +33,23 @@ class CopyToClipboard extends StatelessWidget { ) : child; final localization = AppLocalization.of(context); - final onTap = () { - Clipboard.setData(ClipboardData(text: value)); + final onTap = value == null + ? null + : () { + Clipboard.setData(ClipboardData(text: value!)); - var valueStr = value!.replaceAll('\n', ' '); - if (value!.length > 20) { - valueStr = value!.substring(0, 20) + '...'; - } + var valueStr = value!.replaceAll('\n', ' '); + if (value!.length > 20) { + valueStr = value!.substring(0, 20) + '...'; + } - showToast( - localization!.copiedToClipboard.replaceFirst( - ':value', - '"$valueStr"', - ), - ); - }; + showToast( + localization!.copiedToClipboard.replaceFirst( + ':value', + '"$valueStr"', + ), + ); + }; if (showBorder) { return ConstrainedBox( diff --git a/lib/ui/app/invoice/invoice_email_view.dart b/lib/ui/app/invoice/invoice_email_view.dart index 39390e88c..3b06ddf11 100644 --- a/lib/ui/app/invoice/invoice_email_view.dart +++ b/lib/ui/app/invoice/invoice_email_view.dart @@ -440,7 +440,7 @@ class _InvoiceEmailViewState extends State return EditScaffold( entity: invoice, title: localization!.sendEmail, - onCancelPressed: (context) => viewEntity(entity: invoice!), + onCancelPressed: (context) => viewEntity(entity: invoice), saveLabel: localization.send, onSavePressed: (context) { if (state!.account.accountSmsVerified || state.isSelfHosted) { @@ -522,7 +522,7 @@ class _InvoiceEmailViewState extends State child: EditScaffold( entity: invoice, title: localization!.sendEmail, - onCancelPressed: (context) => viewEntity(entity: invoice!), + onCancelPressed: (context) => viewEntity(entity: invoice), appBarBottom: TabBar( controller: _controller, isScrollable: true, diff --git a/lib/ui/app/lists/app_list_tile.dart b/lib/ui/app/lists/app_list_tile.dart index 1faa47838..812eed532 100644 --- a/lib/ui/app/lists/app_list_tile.dart +++ b/lib/ui/app/lists/app_list_tile.dart @@ -34,7 +34,7 @@ class AppListTile extends StatelessWidget { return; } - Clipboard.setData(ClipboardData(text: copyValue ?? title)); + Clipboard.setData(ClipboardData(text: copyValue ?? title ?? '')); showToast(AppLocalization.of(context)! .copiedToClipboard .replaceFirst(':value', copyValue ?? title!)); diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index 565b05753..c9b8fd118 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -280,7 +280,7 @@ class _MenuDrawerState extends State { items: [ ...state.companies .map((CompanyEntity company) => DropdownMenuItem( - value: (state.companies.indexOf(company)).toString(), + value: state.companies.indexOf(company).toString(), child: _companyListItem(company))) .toList(), if (state.canAddCompany) diff --git a/lib/ui/app/tables/app_data_table.dart b/lib/ui/app/tables/app_data_table.dart index e1522f0ae..a629e79f0 100644 --- a/lib/ui/app/tables/app_data_table.dart +++ b/lib/ui/app/tables/app_data_table.dart @@ -1,3 +1,4 @@ +/* // Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -1003,3 +1004,5 @@ class _NullWidget extends Widget { @override Element createElement() => throw UnimplementedError(); } + +*/ \ No newline at end of file diff --git a/lib/ui/app/tables/app_data_table_source.dart b/lib/ui/app/tables/app_data_table_source.dart index be35ef830..8c6713db1 100644 --- a/lib/ui/app/tables/app_data_table_source.dart +++ b/lib/ui/app/tables/app_data_table_source.dart @@ -1,3 +1,4 @@ +/* // Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -63,3 +64,4 @@ abstract class AppDataTableSource extends ChangeNotifier { /// If the selected row count changes, call [notifyListeners]. int get selectedRowCount; } +*/ \ No newline at end of file diff --git a/lib/ui/app/tables/app_paginated_data_table.dart b/lib/ui/app/tables/app_paginated_data_table.dart index aad1c9bf9..7fd00796e 100644 --- a/lib/ui/app/tables/app_paginated_data_table.dart +++ b/lib/ui/app/tables/app_paginated_data_table.dart @@ -1,3 +1,4 @@ +/* // Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -518,3 +519,4 @@ class AppPaginatedDataTableState extends State { ); } } +*/ \ No newline at end of file diff --git a/lib/ui/app/tables/entity_datatable.dart b/lib/ui/app/tables/entity_datatable.dart index 181cbdd76..96aa61f09 100644 --- a/lib/ui/app/tables/entity_datatable.dart +++ b/lib/ui/app/tables/entity_datatable.dart @@ -1,8 +1,8 @@ // Flutter imports: -import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn; // Package imports: import 'package:built_collection/built_collection.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; @@ -14,13 +14,11 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/ui/pref_state.dart'; import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_data_table_source.dart'; import 'package:invoiceninja_flutter/utils/colors.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; -class EntityDataTableSource extends AppDataTableSource { +class EntityDataTableSource extends DataTableSource { EntityDataTableSource( {required this.context, required this.editingId, @@ -129,7 +127,7 @@ class EntityDataTableSource extends AppDataTableSource { ], ), onTap: () => onTap(entity), - backgroundColor: backgroundColor, + //backgroundColor: backgroundColor, ), ...tableColumns!.map( (field) => DataCell( @@ -146,7 +144,7 @@ class EntityDataTableSource extends AppDataTableSource { ), onTap: () => onTap(entity), //onLongPress: () => selectEntity(entity: entity, context: context, longPress: true), - backgroundColor: backgroundColor, + //backgroundColor: backgroundColor, ), ) ], diff --git a/lib/ui/app/tables/entity_list.dart b/lib/ui/app/tables/entity_list.dart index 986f7fe2c..16fb09ac3 100644 --- a/lib/ui/app/tables/entity_list.dart +++ b/lib/ui/app/tables/entity_list.dart @@ -5,7 +5,7 @@ import 'dart:math'; // Flutter imports: import 'package:built_collection/built_collection.dart'; import 'package:collection/collection.dart' show IterableNullableExtension; -import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn; +import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; @@ -26,8 +26,6 @@ import 'package:invoiceninja_flutter/ui/app/lists/list_filter.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_paginated_data_table.dart'; import 'package:invoiceninja_flutter/ui/app/tables/entity_datatable.dart'; import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -247,8 +245,8 @@ class _EntityListState extends State { primary: true, child: Padding( padding: const EdgeInsets.symmetric(vertical: 16), - child: AppPaginatedDataTable( - hasActionsColumn: true, + child: PaginatedDataTable( + //hasActionsColumn: true, onSelectAll: (value) { final startIndex = min(_firstRowIndex, entityList.length - 1); @@ -294,12 +292,10 @@ class _EntityListState extends State { sortAscending: listUIState.sortAscending, rowsPerPage: state.prefState.rowsPerPage, onPageChanged: (row) { - if (row != null) { - _firstRowIndex = row; - store.dispatch(UpdateLastHistory( - (row / state.prefState.rowsPerPage).floor())); - } - }, + _firstRowIndex = row; + store.dispatch(UpdateLastHistory( + (row / state.prefState.rowsPerPage).floor())); + }, initialFirstRowIndex: _firstRowIndex, availableRowsPerPage: [ 10, @@ -469,7 +465,7 @@ class _EntityListState extends State { multiselect: true, completer: Completer() ..future.then( - ((_) => widget.onClearMultiselect())), + (_) => widget.onClearMultiselect()), ); }, onCancelPressed: (_) => widget.onClearMultiselect(), diff --git a/lib/ui/company_gateway/company_gateway_screen.dart b/lib/ui/company_gateway/company_gateway_screen.dart index aba1f8423..30a852768 100644 --- a/lib/ui/company_gateway/company_gateway_screen.dart +++ b/lib/ui/company_gateway/company_gateway_screen.dart @@ -73,8 +73,8 @@ class CompanyGatewayScreen extends StatelessWidget { entities: companyGateways, multiselect: true, completer: Completer() - ..future.then(((_) => - store.dispatch(ClearCompanyGatewayMultiselect()))), + ..future.then((_) => + store.dispatch(ClearCompanyGatewayMultiselect())), ); }, onCancelPressed: (context) => diff --git a/lib/ui/reports/reports_screen.dart b/lib/ui/reports/reports_screen.dart index 44d193960..00528bb9a 100644 --- a/lib/ui/reports/reports_screen.dart +++ b/lib/ui/reports/reports_screen.dart @@ -1,8 +1,8 @@ // Flutter imports: import 'package:collection/collection.dart' show IterableNullableExtension; -import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn; import 'package:flutter/material.dart' as mt; +import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; @@ -33,9 +33,6 @@ import 'package:invoiceninja_flutter/ui/app/history_drawer_vm.dart'; import 'package:invoiceninja_flutter/ui/app/menu_drawer_vm.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_data_table_source.dart'; -import 'package:invoiceninja_flutter/ui/app/tables/app_paginated_data_table.dart'; import 'package:invoiceninja_flutter/ui/app/upgrade_dialog.dart'; import 'package:invoiceninja_flutter/ui/reports/report_charts.dart'; import 'package:invoiceninja_flutter/ui/reports/reports_screen_vm.dart'; @@ -160,7 +157,8 @@ class ReportsScreen extends StatelessWidget { final columnTitle = state.company.getCustomFieldLabel(column); return DropdownMenuItem( child: Text(columnTitle.isEmpty - ? localization.lookup(column): columnTitle), + ? localization.lookup(column) + : columnTitle), value: column, ); }).toList(), @@ -395,7 +393,7 @@ class ReportsScreen extends StatelessWidget { : reportResult.entities!; confirmCallback( context: context, - message: localization.lookup(action.toString())+ + message: localization.lookup(action.toString()) + ' • ' + (entities.length == 1 ? '1 ${localization.lookup(firstEntity!.entityType.toString())}' @@ -590,7 +588,7 @@ class _ReportDataTableState extends State { */ // ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member - dataTableSource.notifyListeners(); + //dataTableSource.notifyListeners(); } @override @@ -685,9 +683,9 @@ class _ReportDataTableState extends State { ), SingleChildScrollView( padding: const EdgeInsets.all(12), - child: AppPaginatedDataTable( + child: PaginatedDataTable( //showFirstLastButtons: true, - subtractOneFromCount: true, + //subtractOneFromCount: true, header: SizedBox(), sortColumnIndex: sortedColumns.contains(reportSettings.sortColumn) ? sortedColumns.indexOf(reportSettings.sortColumn) @@ -794,7 +792,7 @@ ReportColumnType getReportColumnType(String? column, BuildContext context) { } } -class ReportDataTableSource extends AppDataTableSource { +class ReportDataTableSource extends DataTableSource { ReportDataTableSource({ required this.context, required this.textEditingControllers, @@ -1053,7 +1051,7 @@ class ReportResult { Text( (company.getCustomFieldLabel(column!).isNotEmpty ? company.getCustomFieldLabel(column) - : localization!.lookup(column))+ + : localization!.lookup(column)) + ' ', maxLines: 1, overflow: TextOverflow.ellipsis, @@ -1124,7 +1122,7 @@ class ReportResult { )) else if (getReportColumnType(column, context) == ReportColumnType.age) DataCell(AppDropdownButton( - value: (textEditingControllers[column]!.text).isNotEmpty && + value: textEditingControllers[column]!.text.isNotEmpty && textEditingControllers[column]!.text != 'null' ? textEditingControllers[column]!.text : null, @@ -1369,7 +1367,7 @@ class ReportResult { } else { value = group == 'null' ? localization!.blank : group; } - value = value+ ' (' + values!['count']!.floor().toString() + ')'; + value = value + ' (' + values!['count']!.floor().toString() + ')'; } else if (columnType == ReportColumnType.number) { final currencyId = values!['${column}_currency_id']; value = formatNumber(values[column], context, @@ -1464,7 +1462,8 @@ class ReportResult { mt.DataColumn( label: Text( company.getCustomFieldLabel(column!).isEmpty - ? localization.lookup(column): company.getCustomFieldLabel(column), + ? localization.lookup(column) + : company.getCustomFieldLabel(column), overflow: TextOverflow.ellipsis, ), numeric: true, diff --git a/lib/ui/settings/device_settings.dart b/lib/ui/settings/device_settings.dart index f47e4eece..a9f6ef45d 100644 --- a/lib/ui/settings/device_settings.dart +++ b/lib/ui/settings/device_settings.dart @@ -6,9 +6,7 @@ import 'package:flutter/services.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; -import 'package:invoiceninja_flutter/redux/company/company_selectors.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import 'package:timeago/timeago.dart' as timeago; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; @@ -22,11 +20,9 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart'; -import 'package:invoiceninja_flutter/ui/app/live_text.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/device_settings_vm.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; -import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; @@ -320,12 +316,13 @@ class _DeviceSettingsState extends State return ListTile( leading: Icon(Icons.refresh), title: Text(localization.refreshData), + /* subtitle: LiveText(() { if (state.userCompanyState.lastUpdated == 0) { return ''; } - return localization.lastUpdated+ + return localization.lastUpdated + ': ' + timeago.format( convertTimestampToDate( @@ -336,6 +333,7 @@ class _DeviceSettingsState extends State onTap: () { viewModel.onRefreshTap(context); }, + */ ); }), ListTile( diff --git a/lib/ui/task_status/task_status_screen.dart b/lib/ui/task_status/task_status_screen.dart index d89daccbe..976df0206 100644 --- a/lib/ui/task_status/task_status_screen.dart +++ b/lib/ui/task_status/task_status_screen.dart @@ -79,7 +79,7 @@ class TaskStatusScreen extends StatelessWidget { multiselect: true, completer: Completer() ..future.then( - ((_) => store.dispatch(ClearTaskStatusMultiselect()))), + (_) => store.dispatch(ClearTaskStatusMultiselect())), ); }, label: localization!.actions, diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 8d8727abb..0f9cb1d30 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -18,6 +19,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_drop_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) printing_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin"); printing_plugin_register_with_registrar(printing_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index c354d2e7a..3c55327f7 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST desktop_drop + file_selector_linux printing screen_retriever sentry_flutter diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 34a4b8cd7..c1a7d1b89 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import desktop_drop +import file_selector_macos import in_app_purchase_storekit import in_app_review import package_info @@ -25,6 +26,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin")) FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin")) diff --git a/pubspec.lock b/pubspec.lock index f033fdd44..bce239300 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" attributed_text: dependency: transitive description: @@ -68,11 +68,12 @@ packages: boardview: dependency: "direct main" description: - name: boardview - sha256: a3319f868baf036b6c217dc4f35c152c4432207552433d94841aa8d3059c6170 - url: "https://pub.dev" - source: hosted - version: "0.2.2" + path: "." + ref: HEAD + resolved-ref: "80cd60f55db250ea2c86ed5762e4c55337422efe" + url: "https://github.com/BenPoell/FlutterBoardView.git" + source: git + version: "0.2.3" boolean_selector: dependency: transitive description: @@ -165,10 +166,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" charcode: dependency: transitive description: @@ -229,10 +230,10 @@ packages: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.2" console: dependency: transitive description: @@ -349,10 +350,42 @@ packages: dependency: "direct main" description: name: file_picker - sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 + sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf" url: "https://pub.dev" source: hosted - version: "5.2.5" + version: "5.3.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" fixnum: dependency: transitive description: @@ -378,10 +411,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" flutter_colorpicker: dependency: "direct main" description: @@ -412,10 +445,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + sha256: f185ac890306b5779ecbd611f52502d8d4d63d27703ef73161ca0407e815f02c url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.16" flutter_redux: dependency: "direct main" description: @@ -428,18 +461,18 @@ packages: dependency: "direct main" description: name: flutter_slidable - sha256: "6c68e1fad129b4b807b2218ef4cf7f7f6f61c5ec8861c990dc2278d9d03cb09f" + sha256: cc4231579e3eae41ae166660df717f4bad1359c87f4a4322ad8ba1befeb3d2be url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" flutter_staggered_grid_view: dependency: "direct main" description: name: flutter_staggered_grid_view - sha256: "1312314293acceb65b92754298754801b0e1f26a1845833b740b30415bbbcf07" + sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" url: "https://pub.dev" source: hosted - version: "0.6.2" + version: "0.7.0" flutter_styled_toast: dependency: "direct main" description: @@ -503,14 +536,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "554748f2478619076128152c58905620d10f9c7fc270ff1d3a9675f9f53838ed" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" google_sign_in: dependency: "direct main" description: name: google_sign_in - sha256: "821f354c053d51a2d417b02d42532a19a6ea8057d2f9ebb8863c07d81c98aaf9" + sha256: f45038d27bcad37498f282295ae97eece23c9349fc16649154067b87b9f1fd03 url: "https://pub.dev" source: hosted - version: "5.4.4" + version: "6.1.5" google_sign_in_android: dependency: transitive description: @@ -531,18 +572,18 @@ packages: dependency: transitive description: name: google_sign_in_platform_interface - sha256: fece762f0d2dd762ebde43ad70662a209ff6ee034111976549c392f7763d9264 + sha256: "35ceee5f0eadc1c07b0b4af7553246e315c901facbb7d3dadf734ba2693ceec4" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.2" google_sign_in_web: dependency: transitive description: name: google_sign_in_web - sha256: "75cc41ebc53b1756320ee14d9c3018ad3e6cea298147dbcd86e9d0c8d6720b40" + sha256: "939e9172a378ec4eaeb7f71eeddac9b55ebd0e8546d336daec476a68e5279766" url: "https://pub.dev" source: hosted - version: "0.10.2+1" + version: "0.12.0+5" graphs: dependency: transitive description: @@ -603,66 +644,90 @@ packages: dependency: "direct main" description: name: image_cropper - sha256: "85324928ee8a8be35a529446435ca53067865b9353c8681983472eeec66d780f" + sha256: "542c3453109d16bcc388e43ae2276044d2cd6a6d20c68bdcff2c94ab9363ea15" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "4.0.1" image_cropper_for_web: dependency: transitive description: name: image_cropper_for_web - sha256: "09e93a8ec0435adcaa23622ac090442872f18145d70b9ff605ffedcf97d56255" + sha256: "89c936aa772a35b69ca67b78049ae9fa163a4fb8da2f6dee3893db8883fb49d2" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "2.0.0" image_cropper_platform_interface: dependency: transitive description: name: image_cropper_platform_interface - sha256: "62349e3aab63873ea9b9ab9f69d036ab8a0d74b3004beec4303981386cb9273f" + sha256: b232175c132b2f7ede3e1f101652bcd635cb4079a77c6dded8e6d32e6578d685 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "4.0.0" image_picker: dependency: "direct main" description: name: image_picker - sha256: "22207768556b82d55ec70166824350fee32298732d5efa4d6e756f848f51f66a" + sha256: "7d7f2768df2a8b0a3cefa5ef4f84636121987d403130e70b17ef7e2cf650ba84" url: "https://pub.dev" source: hosted - version: "0.8.6+3" + version: "1.0.4" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "68d067baf7f6e401b1124ee83dd6967e67847314250fd68012aab34a69beb344" + sha256: "0c7b83bbe2980c8a8e36e974f055e11e51675784e13a4762889feed0f3937ff2" url: "https://pub.dev" source: hosted - version: "0.8.5+7" + version: "0.8.8+1" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "66fc6e3877bbde82c33d122f3588777c3784ac5bd7d1cdd79213ef7aecb85b34" + sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7" url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "3.0.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "39aa70b5f1e5e7c94585b9738632d5fdb764a5655e40cd9e7b95fbd2fc50c519" + sha256: c5538cacefacac733c724be7484377923b476216ad1ead35a0d2eadcdc0fc497 url: "https://pub.dev" source: hosted - version: "0.8.6+9" + version: "0.8.8+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8" + sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514 url: "https://pub.dev" source: hosted - version: "2.6.3" + version: "2.9.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" import_sorter: dependency: "direct dev" description: @@ -827,26 +892,26 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" material_design_icons_flutter: dependency: "direct main" description: name: material_design_icons_flutter - sha256: "8ef8562d16e747b2d93e5da5c2508931588939c5c00ebc8e2768e803db7dfd3c" + sha256: "6f986b7a51f3ad4c00e33c5c84e8de1bdd140489bbcdc8b66fc1283dad4dea5a" url: "https://pub.dev" source: hosted - version: "6.0.7096" + version: "7.0.7296" memoize: dependency: "direct main" description: @@ -859,10 +924,10 @@ packages: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: @@ -888,13 +953,13 @@ packages: source: hosted version: "3.8.2" navigation_builder: - dependency: transitive + dependency: "direct overridden" description: name: navigation_builder - sha256: cbf966253e1f5b1798f3fbcae571fb6d452e5c7a606a5c451e2b9a3d343920f0 + sha256: "95e25150191d9cd4e4b86504f33cd9e786d1e6732edb2e3e635bbedc5ef0dea7" url: "https://pub.dev" source: hosted - version: "0.0.2+4" + version: "0.0.3" node_preamble: dependency: transitive description: @@ -963,10 +1028,10 @@ packages: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" path_parsing: dependency: transitive description: @@ -979,10 +1044,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.0.15" path_provider_android: dependency: transitive description: @@ -1019,58 +1084,58 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" + sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.7" pdf: dependency: transitive description: name: pdf - sha256: "6cd57e8e6d052bd1078f18e0dc7cd6701fad6288231c1ce99d66ef5034d14e61" + sha256: "586d3debf5432e5377044754032cfa53ab45e9abf371d4865e9ad5019570e246" url: "https://pub.dev" source: hosted - version: "3.9.0" - pedantic: - dependency: transitive - description: - name: pedantic - sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" - url: "https://pub.dev" - source: hosted - version: "1.11.1" + version: "3.10.1" permission_handler: dependency: "direct main" description: name: permission_handler - sha256: e474a8b0de5a3ce6f0960599c0b24ab3441a200a8705f4131e7bb926027100db + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "11.0.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: a512e0fa8abcb0659d938ec2df93a70eb1df1fdea5fdc6d79a866bfd858a28fc + sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790 url: "https://pub.dev" source: hosted - version: "9.0.2+1" + version: "11.0.5" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" url: "https://pub.dev" source: hosted - version: "9.0.7" + version: "9.1.4" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2 url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.11.5" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" petitparser: dependency: transitive description: @@ -1091,10 +1156,10 @@ packages: dependency: "direct main" description: name: pinput - sha256: "1773743c188cdd2f8d0398ea708ec72645bb41ac9311755c4f7bb03a4184bdcf" + sha256: a92b55ecf9c25d1b9e100af45905385d5bc34fc9b6b04177a9e82cb88fe4d805 url: "https://pub.dev" source: hosted - version: "2.2.31" + version: "3.0.1" platform: dependency: transitive description: @@ -1131,10 +1196,10 @@ packages: dependency: "direct main" description: name: printing - sha256: fe654363cd0114b50a0815b24e96957c7e9a60eb4e3b7ccfe71cf3f2b7114cb2 + sha256: e7c383dca95ee7b88c02dc1c66638628d3dcdc2fb2cc47e7a595facd47e46b56 url: "https://pub.dev" source: hosted - version: "5.10.1" + version: "5.11.0" process: dependency: transitive description: @@ -1228,34 +1293,34 @@ packages: dependency: transitive description: name: sentry - sha256: "81c1f32496ff04476d6ddfe5894215b1034d185301d2e3dffd272853392c5ea7" + sha256: "830667eadc0398fea3a3424ed1b74568e2db603a42758d0922e2f2974ce55a60" url: "https://pub.dev" source: hosted - version: "6.20.1" + version: "7.10.1" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "5ca2c8d86c220f7ad3109bedceb2c51b0e90bac5218e732be98ea2cba8006461" + sha256: "6730f41b304c6fb0fa590dacccaf73ba11082fc64b274cfe8a79776f2b95309c" url: "https://pub.dev" source: hosted - version: "6.20.1" + version: "7.10.1" share_plus: dependency: "direct main" description: name: share_plus - sha256: "8c6892037b1824e2d7e8f59d54b3105932899008642e6372e5079c6939b4b625" + sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "7.1.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.3.0" shared_preferences: dependency: "direct main" description: @@ -1348,10 +1413,10 @@ packages: dependency: "direct main" description: name: sign_in_with_apple - sha256: ac3b113767dfdd765078c507dad9d4d9fe96b669cc7bd88fc36fc15376fb3400 + sha256: "0975c23b9f8b30a80e27d5659a75993a093d4cb5f4eb7d23a9ccc586fea634e0" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "5.0.0" sign_in_with_apple_platform_interface: dependency: transitive description: @@ -1377,10 +1442,10 @@ packages: dependency: transitive description: name: smart_auth - sha256: "8cfaec55b77d5930ed1666bb7ae70db5bade099bb1422401386853b400962113" + sha256: a25229b38c02f733d0a4e98d941b42bed91a976cb589e934895e60ccfa674cf6 url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.1.1" source_gen: dependency: transitive description: @@ -1409,10 +1474,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" sqflite: dependency: transitive description: @@ -1441,10 +1506,10 @@ packages: dependency: "direct main" description: name: states_rebuilder - sha256: e8612993e97a5caeb9d983f6081304ef10868ba436ae49a723ee089ab51e2d12 + sha256: bf1a5ab5c543acdefce35e60f482eb7ab592339484fe3266d147ee597f18dc92 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.3.0" stream_channel: dependency: transitive description: @@ -1521,26 +1586,26 @@ packages: dependency: "direct dev" description: name: test - sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d + sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" url: "https://pub.dev" source: hosted - version: "1.22.0" + version: "1.24.3" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.6.0" test_core: dependency: transitive description: name: test_core - sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888" + sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" url: "https://pub.dev" source: hosted - version: "0.4.20" + version: "0.5.3" timeago: dependency: "direct main" description: @@ -1609,10 +1674,10 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: e29039160ab3730e42f3d811dc2a6d5f2864b90a70fb765ea60144b03307f682 + sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" url_launcher_macos: dependency: transitive description: @@ -1633,18 +1698,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "574cfbe2390666003c3a1d129bdc4574aaa6728f0c00a4829a81c316de69dd9b" + sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5" url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.0.20" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "97c9067950a0d09cbd93e2e3f0383d1403989362b97102fbf446473a48079a4b" + sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.8" uuid: dependency: transitive description: @@ -1681,10 +1746,18 @@ packages: dependency: transitive description: name: vm_service - sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 + sha256: c620a6f783fa22436da68e42db7ebbf18b8c44b9a46ab911f666ff09ffd9153f url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "11.7.1" + vs_scrollbar: + dependency: transitive + description: + name: vs_scrollbar + sha256: "6a2df5e2597064e8dbb8fc3679065d8e748d711fa979f045328c98b7100b1665" + url: "https://pub.dev" + source: hosted + version: "1.0.0" watcher: dependency: transitive description: @@ -1693,6 +1766,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -1705,10 +1786,10 @@ packages: dependency: transitive description: name: webdriver - sha256: ef67178f0cc7e32c1494645b11639dd1335f1d18814aa8435113a92e9ef9d841 + sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" webkit_inspection_protocol: dependency: transitive description: @@ -1721,34 +1802,34 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" + sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "4.4.1" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" + sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff url: "https://pub.dev" source: hosted - version: "2.10.4" + version: "3.12.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" + sha256: "6d9213c65f1060116757a7c473247c60f3f7f332cac33dc417c9e362a9a13e4f" url: "https://pub.dev" source: hosted - version: "1.9.5" + version: "2.6.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 + sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974" url: "https://pub.dev" source: hosted - version: "2.9.5" + version: "3.9.1" widget_kit_plugin: dependency: "direct main" description: @@ -1761,10 +1842,10 @@ packages: dependency: transitive description: name: win32 - sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "4.1.4" window_manager: dependency: "direct main" description: @@ -1798,5 +1879,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.19.0 <3.0.0" - flutter: ">=3.7.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index c899c0d84..bab5bfaa4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ documentation: https://invoiceninja.github.io publish_to: none environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=3.1.0 <4.0.0' flutter_icons: android: true @@ -21,10 +21,10 @@ dependencies: flutter_localizations: sdk: flutter #google_sign_in: ^6.0.1 - google_sign_in: 5.4.4 + google_sign_in: ^6.1.5 in_app_review: ^2.0.4 in_app_purchase: ^3.1.1 - pinput: ^2.2.11 + pinput: ^3.0.1 #pinput: ^2.2.23 #pinput: # git: @@ -35,26 +35,26 @@ dependencies: http: ^0.13.3 path_provider: ^2.0.2 shared_preferences: ^2.0.6 - material_design_icons_flutter: ^6.0.7096 + material_design_icons_flutter: ^7.0.7296 built_value: ^8.1.2 built_collection: ^5.1.0 memoize: ^3.0.0 cached_network_image: 3.0.0 # imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, url_launcher: ^6.0.20 - share_plus: ^6.3.1 - intl: ^0.17.0 - flutter_slidable: ^2.0.0 + share_plus: ^7.1.0 + intl: 0.17.0 + flutter_slidable: ^3.0.0 charts_flutter: ^0.12.0 #qr_flutter: ^4.0.0 qr_flutter: # https://github.com/theyakka/qr.flutter/issues/174#issuecomment-1084235757 git: url: https://github.com/theyakka/qr.flutter.git local_auth: ^2.1.5 - sentry_flutter: ^6.20.1 - image_picker: ^0.8.6+3 + sentry_flutter: ^7.10.1 + image_picker: ^1.0.4 flutter_colorpicker: ^1.0.3 flutter_json_viewer: ^1.0.1 - webview_flutter: ^3.0.4 + webview_flutter: ^4.4.1 timeago: ^3.1.0 package_info: ^2.0.2 rounded_loading_button: ^2.1.0 @@ -62,9 +62,12 @@ dependencies: # flutter_launcher_icons: ^0.9.1 overflow_view: ^0.3.1 flutter_styled_toast: ^2.0.0 - permission_handler: 9.1.0 # Disables Windows support to fix crash + permission_handler: ^11.0.1 # Disables Windows support to fix crash file_picker: ^5.2.5 - boardview: ^0.2.2 + #boardview: ^0.2.2 + boardview: + git: + url: https://github.com/BenPoell/FlutterBoardView.git pointer_interceptor: ^0.9.0 contacts_service: ^0.6.3 diacritic: ^0.1.3 @@ -77,14 +80,14 @@ dependencies: # url: https://github.com/superlistapp/super_editor.git # path: super_editor html2md: ^1.2.6 - printing: ^5.10.1 - image_cropper: ^3.0.1 + printing: ^5.11.0 + image_cropper: ^4.0.1 msal_js: ^2.14.0 - sign_in_with_apple: ^4.3.0 + sign_in_with_apple: ^5.0.0 window_manager: ^0.3.0 # bitsdojo_window: ^0.1.5 intl_phone_field: ^3.1.0 - flutter_staggered_grid_view: ^0.6.2 + flutter_staggered_grid_view: ^0.7.0 desktop_drop: ^0.4.1 widget_kit_plugin: ^0.1.1 pinch_zoom: ^1.0.0 @@ -92,6 +95,11 @@ dependencies: # idb_shim: ^1.11.1+1 collection: ^1.15.0-nullsafety.4 +dependency_overrides: + intl: any + navigation_builder: ^0.0.3 + states_rebuilder: ^6.3.0 + dev_dependencies: flutter_driver: sdk: flutter @@ -128,4 +136,4 @@ msix_config: architecture: x64 capabilities: 'internetClient' store: true - logo_path: assets/images/icon.png + logo_path: assets/images/icon.png \ No newline at end of file diff --git a/test_driver/login_it_test.dart b/test_driver/login_it_test.dart index 5a959ae68..918fdd988 100644 --- a/test_driver/login_it_test.dart +++ b/test_driver/login_it_test.dart @@ -1,8 +1,5 @@ // Import Flutter Driver API -// Dart imports: -import 'dart:async'; - // Package imports: import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; @@ -15,7 +12,7 @@ void main() { group('LOGIN TEST', () { late TestLocalization localization; FlutterDriver? driver; - StreamSubscription? streamSubscription; + //StreamSubscription? streamSubscription; setUpAll(() async { localization = TestLocalization('en'); @@ -35,9 +32,12 @@ void main() { if (driver != null) { driver!.close(); } + + /* if (streamSubscription != null) { streamSubscription.cancel(); } + */ }); group('SELF-HOSTED', () { diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index ae991e112..83b8e72a2 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -8,10 +8,9 @@ set(BINARY_NAME "invoiceninja") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. -cmake_policy(SET CMP0063 NEW) - set(PDFIUM_VERSION "latest" CACHE STRING "" FORCE) set(PDFIUM_ARCH "x64" CACHE STRING "" FORCE) +cmake_policy(VERSION 3.14...3.25) # Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) @@ -55,6 +54,7 @@ add_subdirectory(${FLUTTER_MANAGED_DIR}) # Application build; see runner/CMakeLists.txt. add_subdirectory("runner") + # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 6e48b30e8..5e6d30b7e 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,7 +7,9 @@ #include "generated_plugin_registrant.h" #include +#include #include +#include #include #include #include @@ -19,8 +21,12 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { DesktopDropPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DesktopDropPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); LocalAuthPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("LocalAuthPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); PrintingPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PrintingPlugin")); ScreenRetrieverPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b30bcf6b6..3df371e37 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,7 +4,9 @@ list(APPEND FLUTTER_PLUGIN_LIST desktop_drop + file_selector_windows local_auth_windows + permission_handler_windows printing screen_retriever sentry_flutter diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index b25e363ef..955ee3038 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() { this->Show(); }); + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + return true; } diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp index f5bf9fa0f..b2b08734d 100644 --- a/windows/runner/utils.cpp +++ b/windows/runner/utils.cpp @@ -47,16 +47,17 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { } int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr); + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); std::string utf8_string; - if (target_length == 0 || target_length > utf8_string.max_size()) { + if (target_length <= 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); int converted_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, utf8_string.data(), - target_length, nullptr, nullptr); + input_length, utf8_string.data(), target_length, nullptr, nullptr); if (converted_length == 0) { return std::string(); } diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index 041a38554..60608d0fe 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -60,7 +60,7 @@ class WindowClassRegistrar { public: ~WindowClassRegistrar() = default; - // Returns the singleton registar instance. + // Returns the singleton registrar instance. static WindowClassRegistrar* GetInstance() { if (!instance_) { instance_ = new WindowClassRegistrar(); diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h index c86632d8a..e901dde68 100644 --- a/windows/runner/win32_window.h +++ b/windows/runner/win32_window.h @@ -77,7 +77,7 @@ class Win32Window { // OS callback called by message pump. Handles the WM_NCCREATE message which // is passed when the non-client area is being created and enables automatic // non-client DPI scaling so that the non-client area automatically - // responsponds to changes in DPI. All other messages are handled by + // responds to changes in DPI. All other messages are handled by // MessageHandler. static LRESULT CALLBACK WndProc(HWND const window, UINT const message,