diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4001596..9498ab3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true" - > + > + @@ -162,11 +163,22 @@ + + + + + + + + + + + get all => [ globalSettings, localUserCredentials, localUserAccount, localUserAppState, + hintStateBox, hosts, ]; } diff --git a/lib/core/database/hive/hive_extensions.dart b/lib/core/database/hive/hive_extensions.dart index 6288eac..e3b2193 100644 --- a/lib/core/database/hive/hive_extensions.dart +++ b/lib/core/database/hive/hive_extensions.dart @@ -54,4 +54,5 @@ extension HiveBoxAccessors on HiveInterface { box(HiveBoxes.localUserAppState); Box get globalSettingsBox => box(HiveBoxes.globalSettings); + Box get hintStateBox => box(HiveBoxes.hintStateBox); } diff --git a/lib/core/widgets/form_builder_fields/form_builder_localized_date_picker.dart b/lib/core/widgets/form_builder_fields/form_builder_localized_date_picker.dart index eb1ab5f..6fb020c 100644 --- a/lib/core/widgets/form_builder_fields/form_builder_localized_date_picker.dart +++ b/lib/core/widgets/form_builder_fields/form_builder_localized_date_picker.dart @@ -3,9 +3,11 @@ import 'dart:collection'; import 'package:collection/collection.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart'; import 'package:paperless_mobile/core/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/landing/view/widgets/mime_types_pie_chart.dart'; @@ -83,7 +85,6 @@ class _FormBuilderLocalizedDatePickerState final _textFieldControls = LinkedList<_NeighbourAwareDateInputSegmentControls>(); - String? _error; bool _temporarilyDisableListeners = false; @override void initState() { @@ -184,10 +185,7 @@ class _FormBuilderLocalizedDatePickerState // Imitate the functionality of the validator function in "normal" form fields. // The error is shown on the outer decorator as if this was a regular text input. // Errors are cleared after the next user interaction. - final error = _validateDate(value); - setState(() { - _error = error; - }); + // final error = _validateDate(value); }, autovalidateMode: AutovalidateMode.onUserInteraction, initialValue: widget.initialValue != null @@ -201,7 +199,7 @@ class _FormBuilderLocalizedDatePickerState child: InputDecorator( textAlignVertical: TextAlignVertical.bottom, decoration: InputDecoration( - errorText: _error, + errorText: field.errorText, labelText: widget.labelText, suffixIcon: Row( mainAxisSize: MainAxisSize.min, @@ -271,16 +269,10 @@ class _FormBuilderLocalizedDatePickerState if (d.day != date.day && d.month != date.month && d.year != date.year) { return "Invalid date."; } - if (d.isBefore(widget.firstDate)) { - final formattedDateHint = - DateFormat.yMd(widget.locale.toString()).format(widget.firstDate); - return "Date must be after $formattedDateHint."; - } - if (d.isAfter(widget.lastDate)) { - final formattedDateHint = - DateFormat.yMd(widget.locale.toString()).format(widget.lastDate); - return "Date must be before $formattedDateHint."; + if (d.isBefore(widget.firstDate) || d.isAfter(widget.lastDate)) { + return S.of(context)!.dateOutOfRange(widget.firstDate, widget.lastDate); } + return null; } @@ -332,6 +324,7 @@ class _FormBuilderLocalizedDatePickerState _DateInputSegment.year => fieldValue.copyWith(year: number), }; field.setValue(newValue); + field.validate(); } }, inputFormatters: [ diff --git a/lib/core/widgets/hint_card.dart b/lib/core/widgets/hint_card.dart index 195473f..7a94df3 100644 --- a/lib/core/widgets/hint_card.dart +++ b/lib/core/widgets/hint_card.dart @@ -61,7 +61,7 @@ class HintCard extends StatelessWidget { const Padding(padding: EdgeInsets.only(bottom: 24)), ], ).padded(), - ).padded(), + ), ); } } diff --git a/lib/core/widgets/hint_state_builder.dart b/lib/core/widgets/hint_state_builder.dart new file mode 100644 index 0000000..22a636e --- /dev/null +++ b/lib/core/widgets/hint_state_builder.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:hive_flutter/adapters.dart'; +import 'package:paperless_mobile/core/database/hive/hive_extensions.dart'; + +class HintStateBuilder extends StatelessWidget { + final String? listenKey; + final Widget Function(BuildContext context, Box box) builder; + const HintStateBuilder({ + super.key, + required this.builder, + this.listenKey, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder>( + valueListenable: Hive.hintStateBox + .listenable(keys: listenKey != null ? [listenKey] : null), + builder: (context, box, child) { + return builder(context, box); + }, + ); + } +} diff --git a/lib/features/document_details/view/pages/document_details_page.dart b/lib/features/document_details/view/pages/document_details_page.dart index 0052df8..d0f7301 100644 --- a/lib/features/document_details/view/pages/document_details_page.dart +++ b/lib/features/document_details/view/pages/document_details_page.dart @@ -161,6 +161,7 @@ class _DocumentDetailsPageState extends State { bottom: ColoredTabBar( tabBar: TabBar( isScrollable: true, + tabAlignment: TabAlignment.start, tabs: [ Tab( child: Text( @@ -203,19 +204,33 @@ class _DocumentDetailsPageState extends State { ), ), Tab( - child: Text( - "Notes", - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onPrimaryContainer, - ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + S.of(context)!.notes(0), + style: TextStyle( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer, + ), + ), + if ((state.document?.notes.length ?? 0) > + 0) + Card( + child: Text(state + .document!.notes.length + .toString()) + .paddedSymmetrically( + horizontal: 8, vertical: 2), + ), + ], ), ), if (hasMultiUserSupport) Tab( child: Text( - "Permissions", + S.of(context)!.permissions, style: TextStyle( color: Theme.of(context) .colorScheme diff --git a/lib/features/document_details/view/widgets/document_notes_widget.dart b/lib/features/document_details/view/widgets/document_notes_widget.dart index 189e373..89048e1 100644 --- a/lib/features/document_details/view/widgets/document_notes_widget.dart +++ b/lib/features/document_details/view/widgets/document_notes_widget.dart @@ -1,12 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_html/flutter_html.dart'; import 'package:intl/intl.dart'; import 'package:paperless_api/paperless_api.dart'; +import 'package:paperless_mobile/core/database/hive/hive_config.dart'; import 'package:paperless_mobile/core/extensions/flutter_extensions.dart'; +import 'package:paperless_mobile/core/widgets/hint_card.dart'; +import 'package:paperless_mobile/core/widgets/hint_state_builder.dart'; import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.dart'; +import 'package:paperless_mobile/features/settings/view/widgets/global_settings_builder.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; +import 'package:markdown/markdown.dart' show markdownToHtml; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class DocumentNotesWidget extends StatefulWidget { final DocumentModel document; @@ -19,11 +28,29 @@ class DocumentNotesWidget extends StatefulWidget { class _DocumentNotesWidgetState extends State { final _noteContentController = TextEditingController(); final _formKey = GlobalKey(); - + bool _isNoteSubmitting = false; @override Widget build(BuildContext context) { + const hintKey = "hideMarkdownSyntaxHint"; return SliverMainAxisGroup( slivers: [ + SliverPadding( + padding: const EdgeInsets.only(bottom: 16), + sliver: SliverToBoxAdapter( + child: HintStateBuilder( + listenKey: hintKey, + builder: (context, box) { + return HintCard( + hintText: S.of(context)!.notesMarkdownSyntaxSupportHint, + show: !box.get(hintKey, defaultValue: false)!, + onHintAcknowledged: () { + box.put(hintKey, true); + }, + ); + }, + ), + ), + ), SliverToBoxAdapter( child: Form( key: _formKey, @@ -33,79 +60,107 @@ class _DocumentNotesWidgetState extends State { controller: _noteContentController, maxLines: null, validator: (value) { - if (value?.isEmpty ?? true) { + if (value?.trim().isEmpty ?? true) { return S.of(context)!.thisFieldIsRequired; } return null; }, + textInputAction: TextInputAction.newline, decoration: InputDecoration( - hintText: 'Your note here...', - labelText: 'New note', - floatingLabelBehavior: FloatingLabelBehavior.always, + labelText: S.of(context)!.newNote, + suffixIcon: IconButton( + icon: const Icon(Icons.clear), + onPressed: () { + _noteContentController.clear(); + }, + ), ), - ).padded(), + ).paddedOnly(bottom: 8), Align( alignment: Alignment.centerRight, - child: FilledButton.icon( - icon: Icon(Icons.note_add_outlined), - label: Text("Add note"), - onPressed: () { + child: ElevatedButton.icon( + icon: _isNoteSubmitting + ? const SizedBox.square( + dimension: 20, + child: Center( + child: CircularProgressIndicator( + strokeWidth: 3, + ), + ), + ) + : const Icon(Icons.note_add_outlined), + label: Text(S.of(context)!.addNote), + onPressed: () async { _formKey.currentState?.save(); if (_formKey.currentState?.validate() ?? false) { - context - .read() - .addNote(_noteContentController.text); + setState(() { + _isNoteSubmitting = true; + }); + try { + await context + .read() + .addNote(_noteContentController.text.trim()); + _noteContentController.clear(); + } catch (error) { + showGenericError(context, error); + } finally { + setState(() { + _isNoteSubmitting = false; + }); + } } }, - ).padded(), + ), ), ], - ).padded(), + ), ), ), + const SliverToBoxAdapter( + child: SizedBox(height: 16), + ), SliverList.separated( separatorBuilder: (context, index) => const SizedBox(height: 16), itemBuilder: (context, index) { final note = widget.document.notes.elementAt(index); return Card( - // borderRadius: BorderRadius.circular(8), - // elevation: 1, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (note.created != null) - Text( - DateFormat.yMMMd( - Localizations.localeOf(context).toString()) - .addPattern('\u2014') - .add_jm() - .format(note.created!), - style: Theme.of(context).textTheme.labelMedium?.copyWith( - color: Theme.of(context) - .colorScheme - .onSurface - .withOpacity(.5), - ), - ), - const SizedBox(height: 8), - Text( - note.note!, - textAlign: TextAlign.justify, - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: Theme.of(context).colorScheme.onSurface, - ), + Html( + data: markdownToHtml(note.note!), + onLinkTap: (url, attributes, element) async { + if (url?.isEmpty ?? true) { + return; + } + if (await canLaunchUrlString(url!)) { + launchUrlString(url); + } + }, ), Row( - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + if (note.created != null) + Text( + DateFormat.yMMMd( + Localizations.localeOf(context).toString()) + .addPattern('\u2014') + .add_jm() + .format(note.created!), + style: + Theme.of(context).textTheme.labelMedium?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(.5), + ), + ), IconButton( - icon: Icon(Icons.delete), + tooltip: S.of(context)!.delete, + icon: const Icon(Icons.delete), onPressed: () { context.read().deleteNote(note); - showSnackBar( - context, - S.of(context)!.documentSuccessfullyUpdated, - ); }, ), ], diff --git a/lib/features/document_edit/view/document_edit_page.dart b/lib/features/document_edit/view/document_edit_page.dart index eaa16a9..8631d72 100644 --- a/lib/features/document_edit/view/document_edit_page.dart +++ b/lib/features/document_edit/view/document_edit_page.dart @@ -424,7 +424,7 @@ class _DocumentEditPageState extends State initialValue: initialCreatedAtDate, labelText: S.of(context)!.createdAt, firstDate: DateTime(1970, 1, 1), - lastDate: DateTime.now(), + lastDate: DateTime(2100, 1, 1), locale: Localizations.localeOf(context), prefixIcon: Icon(Icons.calendar_today), ), diff --git a/lib/features/document_search/view/document_search_bar.dart b/lib/features/document_search/view/document_search_bar.dart index 43b81ef..c546439 100644 --- a/lib/features/document_search/view/document_search_bar.dart +++ b/lib/features/document_search/view/document_search_bar.dart @@ -40,7 +40,7 @@ class _DocumentSearchBarState extends State { constraints: const BoxConstraints( maxWidth: 720, minWidth: 360, - maxHeight: 56, + maxHeight: 48, minHeight: 48, ), child: Row( diff --git a/lib/features/document_upload/view/document_upload_preparation_page.dart b/lib/features/document_upload/view/document_upload_preparation_page.dart index 4ab0df6..d605122 100644 --- a/lib/features/document_upload/view/document_upload_preparation_page.dart +++ b/lib/features/document_upload/view/document_upload_preparation_page.dart @@ -222,7 +222,7 @@ class _DocumentUploadPreparationPageState FormBuilderLocalizedDatePicker( name: DocumentModel.createdKey, firstDate: DateTime(1970, 1, 1), - lastDate: DateTime.now(), + lastDate: DateTime(2100, 1, 1), locale: Localizations.localeOf(context), labelText: S.of(context)!.createdAt + " *", allowUnset: true, diff --git a/lib/features/documents/view/pages/documents_page.dart b/lib/features/documents/view/pages/documents_page.dart index c1cc561..7b86f63 100644 --- a/lib/features/documents/view/pages/documents_page.dart +++ b/lib/features/documents/view/pages/documents_page.dart @@ -21,6 +21,7 @@ import 'package:paperless_mobile/features/documents/view/widgets/selection/docum import 'package:paperless_mobile/features/documents/view/widgets/selection/view_type_selection_widget.dart'; import 'package:paperless_mobile/features/documents/view/widgets/sort_documents_button.dart'; import 'package:paperless_mobile/features/labels/cubit/label_cubit.dart'; +import 'package:paperless_mobile/features/logging/data/logger.dart'; import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart'; import 'package:paperless_mobile/features/tasks/model/pending_tasks_notifier.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; @@ -308,8 +309,18 @@ class _DocumentsPageState extends State { // Listen for scroll notifications to load new data. // Scroll controller does not work here due to nestedscrollview limitations. final offset = notification.metrics.pixels; - if (offset > 128 && _savedViewsExpansionController.isExpanded) { - _savedViewsExpansionController.collapse(); + try { + if (offset > 128 && _savedViewsExpansionController.isExpanded) { + _savedViewsExpansionController.collapse(); + } + // Workaround for https://github.com/astubenbord/paperless-mobile/issues/341 probably caused by https://github.com/flutter/flutter/issues/138153 + } on TypeError catch (error) { + logger.fw( + "An exception was thrown, but this message can probably be ignored. See issue #341 for more details.", + error: error, + className: runtimeType.toString(), + methodName: "_buildDocumentsTab", + ); } final max = notification.metrics.maxScrollExtent; diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index 2ddcf99..878c73c 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index b41ea14..2a2634e 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 58f60aa..8453eb2 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Berechtigungen", + "newNote": "Neue Notiz", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile unterstützt Markdown-Syntax zur Darstellung und Formatierung von Notizen. Probiere es aus!" } \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index b00b127..4f8f10b 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1041,6 +1041,8 @@ "format": "yMd" } } - - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index eefdf87..b34def0 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index e18bd29..d73fa3c 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 11455a8..5e3605d 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index d647c74..4f8f10b 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index 10a797f..b55d093 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index d647c74..4f8f10b 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index f102355..cb7997b 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index 331ea52..3f3ef00 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -1041,5 +1041,8 @@ "format": "yMd" } } - } + }, + "permissions": "Permissions", + "newNote": "New note", + "notesMarkdownSyntaxSupportHint": "Paperless Mobile can render notes using basic markdown syntax. Try it out!" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index c1ed3d8..f88b028 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -111,6 +111,7 @@ Future _initHive() async { registerHiveAdapters(); await Hive.openBox(HiveBoxes.localUserAccount); await Hive.openBox(HiveBoxes.localUserAppState); + await Hive.openBox(HiveBoxes.hintStateBox); await Hive.openBox(HiveBoxes.hosts); final globalSettingsBox = await Hive.openBox(HiveBoxes.globalSettings); diff --git a/lib/theme.dart b/lib/theme.dart index 7331415..84771fc 100644 --- a/lib/theme.dart +++ b/lib/theme.dart @@ -82,14 +82,14 @@ SystemUiOverlayStyle buildOverlayStyle( Brightness.light => SystemUiOverlayStyle.dark.copyWith( systemNavigationBarColor: color, systemNavigationBarDividerColor: color, - statusBarColor: theme.colorScheme.background, + // statusBarColor: theme.colorScheme.background, // statusBarColor: theme.colorScheme.background, // systemNavigationBarDividerColor: theme.colorScheme.surface, ), Brightness.dark => SystemUiOverlayStyle.light.copyWith( systemNavigationBarColor: color, systemNavigationBarDividerColor: color, - statusBarColor: theme.colorScheme.background, + // statusBarColor: theme.colorScheme.background, // statusBarColor: theme.colorScheme.background, // systemNavigationBarDividerColor: theme.colorScheme.surface, ), diff --git a/pubspec.lock b/pubspec.lock index 9746de5..7182728 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -221,10 +221,10 @@ packages: dependency: "direct main" description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" color: dependency: transitive description: @@ -848,6 +848,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + http_mock_adapter: + dependency: transitive + description: + name: http_mock_adapter + sha256: "46399c78bd4a0af071978edd8c502d7aeeed73b5fb9860bca86b5ed647a63c1b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" http_multi_server: dependency: transitive description: @@ -1014,7 +1022,7 @@ packages: source: hosted version: "1.2.0" markdown: - dependency: transitive + dependency: "direct main" description: name: markdown sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd @@ -1041,10 +1049,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" mime: dependency: transitive description: @@ -1060,6 +1068,14 @@ packages: relative: true source: path version: "0.0.1" + mockito: + dependency: transitive + description: + name: mockito + sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + url: "https://pub.dev" + source: hosted + version: "5.4.4" mocktail: dependency: transitive description: @@ -1223,8 +1239,8 @@ packages: dependency: "direct main" description: path: "packages/pdfx" - ref: HEAD - resolved-ref: "11f7dee82b58ca4f483c753f06bbdc91b34a0793" + ref: "4be9de9ffed5398fd7d5f44bbb07dcd3d3f1711b" + resolved-ref: "4be9de9ffed5398fd7d5f44bbb07dcd3d3f1711b" url: "https://github.com/ScerIO/packages.flutter" source: git version: "2.5.0" @@ -1288,10 +1304,10 @@ packages: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" plugin_platform_interface: dependency: transitive description: @@ -1637,18 +1653,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1693,26 +1709,26 @@ packages: dependency: transitive description: name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.3" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.3" + version: "0.5.9" time: dependency: transitive description: @@ -1877,10 +1893,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c620a6f783fa22436da68e42db7ebbf18b8c44b9a46ab911f666ff09ffd9153f + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 url: "https://pub.dev" source: hosted - version: "11.7.1" + version: "11.10.0" watcher: dependency: transitive description: @@ -1893,10 +1909,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" web_socket_channel: dependency: "direct main" description: @@ -1994,5 +2010,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index 5cce3e5..081c8bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,8 +103,10 @@ dependencies: # camerawesome: ^2.0.0-dev.1 pdfx: git: - url: "https://github.com/ScerIO/packages.flutter" + url: 'https://github.com/ScerIO/packages.flutter' + ref: '4be9de9ffed5398fd7d5f44bbb07dcd3d3f1711b' path: packages/pdfx + markdown: ^7.1.1 dependency_overrides: intl: ^0.18.1