mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-09 16:07:57 -06:00
Migrated to flutter master channel, some adaptations to new m3 specs
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_api/src/models/saved_view_model.dart';
|
||||
import 'package:paperless_mobile/core/repository/saved_view_repository.dart';
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
|
||||
@@ -8,20 +7,21 @@ class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
|
||||
SavedViewRepositoryImpl(this._api);
|
||||
|
||||
final BehaviorSubject<Map<int, SavedView>> _subject =
|
||||
BehaviorSubject.seeded({});
|
||||
final BehaviorSubject<Map<int, SavedView>?> _subject = BehaviorSubject();
|
||||
|
||||
@override
|
||||
Stream<Map<int, SavedView>> get savedViews =>
|
||||
Stream<Map<int, SavedView>?> get savedViews =>
|
||||
_subject.stream.asBroadcastStream();
|
||||
|
||||
@override
|
||||
void clear() {}
|
||||
void clear() {
|
||||
_subject.add(const {});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<SavedView> create(SavedView view) async {
|
||||
final created = await _api.save(view);
|
||||
final updatedState = {..._subject.value}
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}
|
||||
..putIfAbsent(created.id!, () => created);
|
||||
_subject.add(updatedState);
|
||||
return created;
|
||||
@@ -30,7 +30,7 @@ class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
@override
|
||||
Future<int> delete(SavedView view) async {
|
||||
await _api.delete(view);
|
||||
final updatedState = {..._subject.value}..remove(view.id);
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}..remove(view.id);
|
||||
_subject.add(updatedState);
|
||||
return view.id!;
|
||||
}
|
||||
@@ -38,7 +38,7 @@ class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
@override
|
||||
Future<SavedView?> find(int id) async {
|
||||
final found = await _api.find(id);
|
||||
final updatedState = {..._subject.value}
|
||||
final updatedState = {..._subject.valueOrNull ?? {}}
|
||||
..update(id, (_) => found, ifAbsent: () => found);
|
||||
_subject.add(updatedState);
|
||||
return found;
|
||||
@@ -48,7 +48,7 @@ class SavedViewRepositoryImpl implements SavedViewRepository {
|
||||
Future<Iterable<SavedView>> findAll([Iterable<int>? ids]) async {
|
||||
final found = await _api.findAll(ids);
|
||||
final updatedState = {
|
||||
..._subject.value,
|
||||
..._subject.valueOrNull ?? {},
|
||||
...{for (final view in found) view.id!: view},
|
||||
};
|
||||
_subject.add(updatedState);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:flutter/src/widgets/container.dart';
|
||||
import 'package:flutter/src/widgets/framework.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
abstract class SavedViewRepository {
|
||||
Stream<Map<int, SavedView>> get savedViews;
|
||||
Stream<Map<int, SavedView>?> get savedViews;
|
||||
|
||||
Future<SavedView> create(SavedView view);
|
||||
Future<SavedView?> find(int id);
|
||||
|
||||
@@ -45,7 +45,7 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
|
||||
).padded(),
|
||||
Text(
|
||||
'Description',
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
).padded(),
|
||||
FormBuilderTextField(
|
||||
name: shortDescriptionKey,
|
||||
@@ -70,7 +70,7 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
|
||||
children: [
|
||||
Text(
|
||||
'Stack Trace',
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
).paddedOnly(top: 8.0, left: 8.0, right: 8.0),
|
||||
TextButton.icon(
|
||||
label: const Text('Copy'),
|
||||
@@ -81,11 +81,11 @@ Note: If you have the GitHub Android app installed, the descriptions will not be
|
||||
),
|
||||
Text(
|
||||
'Since stack traces cannot be attached to the GitHub issue url, please copy the content of the stackTrace and paste it in the issue description. This will greatly increase the chance of quickly resolving the issue!',
|
||||
style: Theme.of(context).textTheme.caption,
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
).padded(),
|
||||
Text(
|
||||
widget.stackTrace.toString(),
|
||||
style: Theme.of(context).textTheme.overline,
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
).padded(),
|
||||
]
|
||||
],
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
import 'dart:developer';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_relative_date_range_field.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class ExtendedDateRangeDialog extends StatefulWidget {
|
||||
final DateRangeQuery initialValue;
|
||||
@@ -56,13 +51,13 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
|
||||
key: _formKey,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
_buildDateRangeQueryTypeSelection(),
|
||||
Text(
|
||||
"Hint: You can either specify absolute values by selecting concrete dates, or you can specify a time range relative to the current date.",
|
||||
style: Theme.of(context).textTheme.caption,
|
||||
),
|
||||
_buildDateRangeQueryTypeSelection(),
|
||||
const SizedBox(height: 16),
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
).paddedOnly(top: 8, bottom: 16),
|
||||
Builder(
|
||||
builder: (context) {
|
||||
switch (_selectedDateRangeType) {
|
||||
@@ -106,21 +101,23 @@ class _ExtendedDateRangeDialogState extends State<ExtendedDateRangeDialog> {
|
||||
}
|
||||
|
||||
Widget _buildDateRangeQueryTypeSelection() {
|
||||
return Row(
|
||||
children: [
|
||||
ChoiceChip(
|
||||
label: Text('Absolute'),
|
||||
selected: _selectedDateRangeType == DateRangeType.absolute,
|
||||
onSelected: (value) =>
|
||||
setState(() => _selectedDateRangeType = DateRangeType.absolute),
|
||||
).paddedOnly(right: 8.0),
|
||||
ChoiceChip(
|
||||
label: Text('Relative'),
|
||||
selected: _selectedDateRangeType == DateRangeType.relative,
|
||||
onSelected: (value) =>
|
||||
setState(() => _selectedDateRangeType = DateRangeType.relative),
|
||||
return SegmentedButton<DateRangeType>(
|
||||
multiSelectionEnabled: false,
|
||||
onSelectionChanged: (selection) =>
|
||||
setState(() => _selectedDateRangeType = selection.first),
|
||||
segments: [
|
||||
ButtonSegment(
|
||||
value: DateRangeType.absolute,
|
||||
enabled: true,
|
||||
label: Text("Absolute"),
|
||||
),
|
||||
ButtonSegment(
|
||||
value: DateRangeType.relative,
|
||||
enabled: true,
|
||||
label: Text("Relative"),
|
||||
),
|
||||
],
|
||||
selected: {_selectedDateRangeType},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -97,15 +97,15 @@ class _FormBuilderRelativeDateRangePickerState
|
||||
),
|
||||
],
|
||||
),
|
||||
RelativeDateRangePickerHelper(
|
||||
field: field,
|
||||
onChanged: (value) {
|
||||
if (value is RelativeDateRangeQuery) {
|
||||
setState(() => _offset = value.offset);
|
||||
_offsetTextEditingController.text = _offset.toString();
|
||||
}
|
||||
},
|
||||
),
|
||||
// RelativeDateRangePickerHelper(
|
||||
// field: field,
|
||||
// onChanged: (value) {
|
||||
// if (value is RelativeDateRangeQuery) {
|
||||
// setState(() => _offset = value.offset);
|
||||
// _offsetTextEditingController.text = _offset.toString();
|
||||
// }
|
||||
// },
|
||||
// ),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -121,7 +121,7 @@ class HighlightedText extends StatelessWidget {
|
||||
TextSpan _normalSpan(String value, BuildContext context) {
|
||||
return TextSpan(
|
||||
text: value,
|
||||
style: style ?? Theme.of(context).textTheme.bodyText2,
|
||||
style: style ?? Theme.of(context).textTheme.bodyMedium,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user