import 'package:flutter/material.dart'; import '../api/oa_client.dart'; import '../labels.dart'; import '../pages/record_detail_page.dart'; import '../widgets/common.dart'; class ApprovalsPage extends StatefulWidget { const ApprovalsPage({super.key, required this.api}); final OaClient api; @override State createState() => _ApprovalsPageState(); } class _ApprovalsPageState extends State { List> _items = []; String _bucket = 'PENDING'; bool _loading = true; @override void initState() { super.initState(); _load(); } Future _load() async { try { final data = await widget.api.get('/office/approvals'); if (!mounted) return; setState(() { _items = asMaps(data); _loading = false; }); } catch (_) { if (mounted) setState(() => _loading = false); } } @override Widget build(BuildContext context) { final shown = _bucket.isEmpty ? _items : _items.where((e) => '${e['status']}' == _bucket).toList(); return Scaffold( appBar: AppBar(title: const Text('待我审批')), body: Column( children: [ SingleChildScrollView( scrollDirection: Axis.horizontal, padding: const EdgeInsets.fromLTRB(16, 8, 16, 4), child: Row( children: [ for (final it in [('PENDING', '待审批'), ('APPROVED', '已通过'), ('REJECTED', '已驳回'), ('', '全部')]) Padding( padding: const EdgeInsets.only(right: 8), child: ChoiceChip( label: Text(it.$2), selected: _bucket == it.$1, showCheckmark: false, visualDensity: VisualDensity.compact, onSelected: (_) => setState(() => _bucket = it.$1), ), ), ], ), ), if (_loading) const LinearProgressIndicator(minHeight: 2), Expanded( child: shown.isEmpty ? const EmptyHint('没有审批任务') : RefreshIndicator( onRefresh: _load, child: ListView.builder( itemCount: shown.length, itemBuilder: (_, i) { final r = shown[i]; return KvTile( title: '${r['title'] ?? ''}', subtitle: '${zh(r['bizType'])} ${fmtTime(r['createdAt'])}', status: r['status'], onTap: () async { await Navigator.of(context).push(MaterialPageRoute( builder: (_) => RecordDetailPage(api: widget.api, seed: r, title: '${r['title'] ?? '审批'}'), )); _load(); }, ); }, ), ), ), ], ), ); } }