comprehensive cases

This commit is contained in:
2026-03-17 15:21:06 +05:30
parent e3d8d30b1b
commit 68b0055cfe
30 changed files with 1285 additions and 227 deletions

View File

@@ -277,85 +277,89 @@ class _ShiftsPageState extends State<ShiftsPage> {
}) {
final isActive = _activeTab == type;
return Expanded(
child: GestureDetector(
onTap: !enabled
? null
: () {
setState(() => _activeTab = type);
if (type == ShiftTabType.history) {
_bloc.add(LoadHistoryShiftsEvent());
}
if (type == ShiftTabType.find) {
_bloc.add(LoadAvailableShiftsEvent());
}
},
child: Container(
padding: const EdgeInsets.symmetric(
vertical: UiConstants.space2,
horizontal: UiConstants.space2,
),
decoration: BoxDecoration(
color: isActive
? UiColors.white
: UiColors.white.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(UiConstants.radiusMdValue),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Icon(
icon,
size: 14,
color: !enabled
? UiColors.white.withValues(alpha: 0.5)
: isActive
? UiColors.primary
: UiColors.white,
),
const SizedBox(width: UiConstants.space1),
Flexible(
child: Text(
label,
style:
(isActive
? UiTypography.body3m.copyWith(
color: UiColors.primary,
)
: UiTypography.body3m.white)
.copyWith(
color: !enabled
? UiColors.white.withValues(alpha: 0.5)
: null,
),
overflow: TextOverflow.ellipsis,
child: Semantics(
identifier: 'shift_tab_${type.name}',
label: label,
child: GestureDetector(
onTap: !enabled
? null
: () {
setState(() => _activeTab = type);
if (type == ShiftTabType.history) {
_bloc.add(LoadHistoryShiftsEvent());
}
if (type == ShiftTabType.find) {
_bloc.add(LoadAvailableShiftsEvent());
}
},
child: Container(
padding: const EdgeInsets.symmetric(
vertical: UiConstants.space2,
horizontal: UiConstants.space2,
),
decoration: BoxDecoration(
color: isActive
? UiColors.white
: UiColors.white.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(UiConstants.radiusMdValue),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Icon(
icon,
size: 14,
color: !enabled
? UiColors.white.withValues(alpha: 0.5)
: isActive
? UiColors.primary
: UiColors.white,
),
),
if (showCount) ...[
const SizedBox(width: 4),
Container(
padding: const EdgeInsets.symmetric(
horizontal: UiConstants.space1,
vertical: 2,
const SizedBox(width: UiConstants.space1),
Flexible(
child: Text(
label,
style:
(isActive
? UiTypography.body3m.copyWith(
color: UiColors.primary,
)
: UiTypography.body3m.white)
.copyWith(
color: !enabled
? UiColors.white.withValues(alpha: 0.5)
: null,
),
overflow: TextOverflow.ellipsis,
),
constraints: const BoxConstraints(minWidth: 18),
decoration: BoxDecoration(
color: isActive
? UiColors.primary.withValues(alpha: 0.1)
: UiColors.white.withValues(alpha: 0.2),
borderRadius: UiConstants.radiusFull,
),
child: Center(
child: Text(
"$count",
style: UiTypography.footnote1b.copyWith(
color: isActive ? UiColors.primary : UiColors.white,
),
if (showCount) ...[
const SizedBox(width: 4),
Container(
padding: const EdgeInsets.symmetric(
horizontal: UiConstants.space1,
vertical: 2,
),
constraints: const BoxConstraints(minWidth: 18),
decoration: BoxDecoration(
color: isActive
? UiColors.primary.withValues(alpha: 0.1)
: UiColors.white.withValues(alpha: 0.2),
borderRadius: UiConstants.radiusFull,
),
child: Center(
child: Text(
"$count",
style: UiTypography.footnote1b.copyWith(
color: isActive ? UiColors.primary : UiColors.white,
),
),
),
),
),
],
],
],
),
),
),
),

View File

@@ -246,8 +246,10 @@ class _MyShiftCardState extends State<MyShiftCard> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Logo
Container(
width: 44,
Semantics(
identifier: 'shft_card_logo_placeholder',
child: Container(
width: 44,
height: 44,
decoration: BoxDecoration(
gradient: LinearGradient(
@@ -282,6 +284,7 @@ class _MyShiftCardState extends State<MyShiftCard> {
size: UiConstants.iconMd,
),
),
),
),
const SizedBox(width: UiConstants.space3),

View File

@@ -33,6 +33,7 @@ class _FindShiftsTabState extends State<FindShiftsTab> {
String _jobType = 'all';
double? _maxDistance; // miles
Position? _currentPosition;
final TextEditingController _searchController = TextEditingController();
@override
void initState() {
@@ -40,6 +41,12 @@ class _FindShiftsTabState extends State<FindShiftsTab> {
_initLocation();
}
@override
void dispose() {
_searchController.dispose();
super.dispose();
}
Future<void> _initLocation() async {
try {
final LocationPermission permission = await Geolocator.checkPermission();
@@ -289,6 +296,7 @@ class _FindShiftsTabState extends State<FindShiftsTab> {
final matchesSearch =
s.title.toLowerCase().contains(_searchQuery.toLowerCase()) ||
s.location.toLowerCase().contains(_searchQuery.toLowerCase()) ||
(s.description ?? '').toLowerCase().contains(_searchQuery.toLowerCase()) ||
s.clientName.toLowerCase().contains(_searchQuery.toLowerCase());
if (!matchesSearch) return false;
@@ -371,17 +379,21 @@ class _FindShiftsTabState extends State<FindShiftsTab> {
),
const SizedBox(width: UiConstants.space2),
Expanded(
child: TextField(
onChanged: (v) =>
setState(() => _searchQuery = v),
decoration: InputDecoration(
border: InputBorder.none,
hintText: context
.t
.staff_shifts
.find_shifts
.search_hint,
hintStyle: UiTypography.body2r.textPlaceholder,
child: Semantics(
identifier: 'find_shifts_search_input',
child: TextField(
controller: _searchController,
onChanged: (v) =>
setState(() => _searchQuery = v),
decoration: InputDecoration(
border: InputBorder.none,
hintText: context
.t
.staff_shifts
.find_shifts
.search_hint,
hintStyle: UiTypography.body2r.textPlaceholder,
),
),
),
),