mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-08 10:07:51 -06:00
105 lines
3.6 KiB
Dart
105 lines
3.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:paperless_api/paperless_api.dart';
|
|
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart';
|
|
import 'package:paperless_mobile/features/labels/correspondent/view/widgets/correspondent_widget.dart';
|
|
import 'package:paperless_mobile/features/labels/document_type/view/widgets/document_type_widget.dart';
|
|
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
class DocumentGridItem extends StatelessWidget {
|
|
final DocumentModel document;
|
|
final bool isSelected;
|
|
final void Function(DocumentModel) onTap;
|
|
final void Function(DocumentModel) onSelected;
|
|
final bool isAtLeastOneSelected;
|
|
final bool Function(int tagId) isTagSelectedPredicate;
|
|
final void Function(int tagId)? onTagSelected;
|
|
|
|
const DocumentGridItem({
|
|
Key? key,
|
|
required this.document,
|
|
required this.onTap,
|
|
required this.onSelected,
|
|
required this.isSelected,
|
|
required this.isAtLeastOneSelected,
|
|
required this.isTagSelectedPredicate,
|
|
required this.onTagSelected,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GestureDetector(
|
|
onTap: _onTap,
|
|
onLongPress: () => onSelected(document),
|
|
child: AbsorbPointer(
|
|
absorbing: isAtLeastOneSelected,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Card(
|
|
elevation: 1.0,
|
|
color: isSelected
|
|
? Theme.of(context).colorScheme.inversePrimary
|
|
: Theme.of(context).cardColor,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
AspectRatio(
|
|
aspectRatio: 1,
|
|
child: DocumentPreview(
|
|
id: document.id,
|
|
borderRadius: 12.0,
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
CorrespondentWidget(
|
|
correspondentId: document.correspondent,
|
|
),
|
|
DocumentTypeWidget(
|
|
documentTypeId: document.documentType,
|
|
),
|
|
Text(
|
|
document.title,
|
|
maxLines: document.tags.isEmpty ? 3 : 2,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
const Spacer(),
|
|
TagsWidget(
|
|
tagIds: document.tags,
|
|
isMultiLine: false,
|
|
isSelectedPredicate: isTagSelectedPredicate,
|
|
onTagSelected: onTagSelected,
|
|
),
|
|
const Spacer(),
|
|
Text(
|
|
DateFormat.yMMMd().format(
|
|
document.created,
|
|
),
|
|
style: Theme.of(context).textTheme.bodySmall,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
void _onTap() {
|
|
if (isAtLeastOneSelected || isSelected) {
|
|
onSelected(document);
|
|
} else {
|
|
onTap(document);
|
|
}
|
|
}
|
|
}
|