Document library CR completed ready for test
parent
1d4ed83a4b
commit
392136dbe4
@ -1,29 +1,155 @@
|
||||
import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
|
||||
import 'package:test_sa/extensions/int_extensions.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/generic_attachment_model.dart';
|
||||
import 'package:test_sa/views/widgets/images/files_list.dart';
|
||||
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
|
||||
|
||||
class AssetDocumentHistoryView extends StatelessWidget {
|
||||
const AssetDocumentHistoryView({Key? key}) : super(key: key);
|
||||
class AssetDocumentHistoryView extends StatefulWidget {
|
||||
final int assetId;
|
||||
|
||||
const AssetDocumentHistoryView({
|
||||
Key? key,
|
||||
required this.assetId,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<AssetDocumentHistoryView> createState() => _AssetDocumentHistoryViewState();
|
||||
}
|
||||
|
||||
class _AssetDocumentHistoryViewState extends State<AssetDocumentHistoryView> {
|
||||
late AssetProvider _assetProvider;
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
List<GenericAttachmentModel> _documents = [];
|
||||
bool _isLoading = false;
|
||||
int _currentPage = 1;
|
||||
int _totalRows = 0;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_assetProvider = context.read<AssetProvider>();
|
||||
_scrollController.addListener(_onScroll);
|
||||
_loadDocuments();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _onScroll() {
|
||||
final pixels = _scrollController.position.pixels;
|
||||
final maxScroll = _scrollController.position.maxScrollExtent;
|
||||
if (pixels >= maxScroll * 0.8) {
|
||||
if (!_isLoading && _hasMore) {
|
||||
_loadMore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool get _hasMore => _documents.length < _totalRows;
|
||||
|
||||
Future<void> _loadDocuments({bool refresh = false, bool loadMore = false}) async {
|
||||
if (_isLoading) return;
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
if (refresh) {
|
||||
_documents.clear();
|
||||
_currentPage = 1;
|
||||
}
|
||||
if (loadMore) {
|
||||
_currentPage++;
|
||||
}
|
||||
});
|
||||
try {
|
||||
final result = await _assetProvider.getAssetDocumentHistory(
|
||||
assetId: widget.assetId,
|
||||
pageNumber: _currentPage,
|
||||
);
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
if (refresh) {
|
||||
_documents = result.documents;
|
||||
} else {
|
||||
_documents.addAll(result.documents);
|
||||
}
|
||||
_totalRows = result.totalRows;
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
log('Error loading documents: $e');
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadMore() async {
|
||||
await _loadDocuments(loadMore: true);
|
||||
}
|
||||
|
||||
Future<void> _onRefresh() async {
|
||||
await _loadDocuments(refresh: true);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<String> dummyDocuments = [
|
||||
'https://picsum.photos/200/300?random=1',
|
||||
'https://picsum.photos/200/300?random=2',
|
||||
'https://picsum.photos/200/300?random=3',
|
||||
'https://picsum.photos/200/300?random=4',
|
||||
'https://picsum.photos/200/300?random=5',
|
||||
];
|
||||
|
||||
return SingleChildScrollView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
child: FilesList(
|
||||
showAsListView: true,
|
||||
showDownloadButton: true,
|
||||
images: dummyDocuments,
|
||||
separator: const Divider().defaultStyle(context),
|
||||
).toShadowContainer(context),
|
||||
if (_isLoading && _documents.isEmpty) {
|
||||
return const Center(child: ALoading());
|
||||
}
|
||||
if (_documents.isEmpty && !_isLoading) {
|
||||
return const Center(child: NoDataFound());
|
||||
}
|
||||
return RefreshIndicator(
|
||||
onRefresh: _onRefresh,
|
||||
child: ListView(
|
||||
controller: _scrollController,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.toScreenWidth,
|
||||
),
|
||||
children: [
|
||||
FilesList(
|
||||
showAsListView: true,
|
||||
showDownloadButton: true,
|
||||
itemGap: 12.toScreenHeight,
|
||||
images: _documents
|
||||
.map((doc) {
|
||||
return URLs.getFileUrl(doc.name) ?? '';
|
||||
}).where((url) => url.isNotEmpty).toList(),
|
||||
types: _documents.map((doc) {
|
||||
final attachmentType = doc.documentType?.name ?? '';
|
||||
return attachmentType.isNotEmpty ? attachmentType : 'Asset Guide';
|
||||
}).toList(),
|
||||
).toShadowContainer(context),
|
||||
if (_isLoading && _documents.isNotEmpty&&_hasMore) ...[
|
||||
16.height,
|
||||
Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
const ALoading(),
|
||||
8.height,
|
||||
const InfoTextLabelWidget(label: 'Loading more...'),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue