#537 (Cost Center)#539 (Hub Manager)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// ignore_for_file: always_specify_types, depend_on_referenced_packages, dead_code, dead_null_aware_expression, unused_local_variable, unused_import, sort_constructors_first, prefer_final_fields, prefer_const_constructors, deprecated_member_use, implicit_call_tearoffs
|
||||
// ignore_for_file: always_specify_types, depend_on_referenced_packages, dead_code, dead_null_aware_expression, unused_local_variable, unused_import, sort_constructors_first, prefer_final_fields, prefer_const_constructors, deprecated_member_use, implicit_call_tearoffs
|
||||
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
|
||||
import 'package:krow_domain/krow_domain.dart';
|
||||
import '../../domain/repositories/hub_repository_interface.dart';
|
||||
@@ -26,13 +26,20 @@ class HubRepositoryImpl implements HubRepositoryInterface {
|
||||
|
||||
@override
|
||||
Future<List<CostCenter>> getCostCenters() async {
|
||||
// Mocking cost centers for now since the backend is not yet ready.
|
||||
return <CostCenter>[
|
||||
const CostCenter(id: 'cc-001', name: 'Kitchen', code: '1001'),
|
||||
const CostCenter(id: 'cc-002', name: 'Front Desk', code: '1002'),
|
||||
const CostCenter(id: 'cc-003', name: 'Waitstaff', code: '1003'),
|
||||
const CostCenter(id: 'cc-004', name: 'Management', code: '1004'),
|
||||
];
|
||||
return _service.run(() async {
|
||||
final result = await _service.connector.listTeamHudDepartments().execute();
|
||||
final Set<String> seen = <String>{};
|
||||
final List<CostCenter> costCenters = <CostCenter>[];
|
||||
for (final dc.ListTeamHudDepartmentsTeamHudDepartments dep
|
||||
in result.data.teamHudDepartments) {
|
||||
final String? cc = dep.costCenter;
|
||||
if (cc != null && cc.isNotEmpty && !seen.contains(cc)) {
|
||||
seen.add(cc);
|
||||
costCenters.add(CostCenter(id: cc, name: dep.name, code: cc));
|
||||
}
|
||||
}
|
||||
return costCenters;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -62,6 +69,7 @@ class HubRepositoryImpl implements HubRepositoryInterface {
|
||||
street: street,
|
||||
country: country,
|
||||
zipCode: zipCode,
|
||||
costCenterId: costCenterId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -107,6 +115,7 @@ class HubRepositoryImpl implements HubRepositoryInterface {
|
||||
street: street,
|
||||
country: country,
|
||||
zipCode: zipCode,
|
||||
costCenterId: costCenterId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ class EditHubBloc extends Bloc<EditHubEvent, EditHubState>
|
||||
emit(
|
||||
state.copyWith(
|
||||
status: EditHubStatus.success,
|
||||
successMessage: 'Hub created successfully',
|
||||
successKey: 'created',
|
||||
),
|
||||
);
|
||||
},
|
||||
@@ -109,7 +109,7 @@ class EditHubBloc extends Bloc<EditHubEvent, EditHubState>
|
||||
emit(
|
||||
state.copyWith(
|
||||
status: EditHubStatus.success,
|
||||
successMessage: 'Hub updated successfully',
|
||||
successKey: 'updated',
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -22,6 +22,7 @@ class EditHubState extends Equatable {
|
||||
this.status = EditHubStatus.initial,
|
||||
this.errorMessage,
|
||||
this.successMessage,
|
||||
this.successKey,
|
||||
this.costCenters = const <CostCenter>[],
|
||||
});
|
||||
|
||||
@@ -34,6 +35,9 @@ class EditHubState extends Equatable {
|
||||
/// The success message if the operation succeeded.
|
||||
final String? successMessage;
|
||||
|
||||
/// Localization key for success message: 'created' | 'updated'.
|
||||
final String? successKey;
|
||||
|
||||
/// Available cost centers for selection.
|
||||
final List<CostCenter> costCenters;
|
||||
|
||||
@@ -42,12 +46,14 @@ class EditHubState extends Equatable {
|
||||
EditHubStatus? status,
|
||||
String? errorMessage,
|
||||
String? successMessage,
|
||||
String? successKey,
|
||||
List<CostCenter>? costCenters,
|
||||
}) {
|
||||
return EditHubState(
|
||||
status: status ?? this.status,
|
||||
errorMessage: errorMessage ?? this.errorMessage,
|
||||
successMessage: successMessage ?? this.successMessage,
|
||||
successKey: successKey ?? this.successKey,
|
||||
costCenters: costCenters ?? this.costCenters,
|
||||
);
|
||||
}
|
||||
@@ -57,6 +63,7 @@ class EditHubState extends Equatable {
|
||||
status,
|
||||
errorMessage,
|
||||
successMessage,
|
||||
successKey,
|
||||
costCenters,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class HubDetailsBloc extends Bloc<HubDetailsEvent, HubDetailsState>
|
||||
emit(
|
||||
state.copyWith(
|
||||
status: HubDetailsStatus.deleted,
|
||||
successMessage: 'Hub deleted successfully',
|
||||
successKey: 'deleted',
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -24,6 +24,7 @@ class HubDetailsState extends Equatable {
|
||||
this.status = HubDetailsStatus.initial,
|
||||
this.errorMessage,
|
||||
this.successMessage,
|
||||
this.successKey,
|
||||
});
|
||||
|
||||
/// The status of the operation.
|
||||
@@ -35,19 +36,24 @@ class HubDetailsState extends Equatable {
|
||||
/// The success message if the operation succeeded.
|
||||
final String? successMessage;
|
||||
|
||||
/// Localization key for success message: 'deleted'.
|
||||
final String? successKey;
|
||||
|
||||
/// Create a copy of this state with the given fields replaced.
|
||||
HubDetailsState copyWith({
|
||||
HubDetailsStatus? status,
|
||||
String? errorMessage,
|
||||
String? successMessage,
|
||||
String? successKey,
|
||||
}) {
|
||||
return HubDetailsState(
|
||||
status: status ?? this.status,
|
||||
errorMessage: errorMessage ?? this.errorMessage,
|
||||
successMessage: successMessage ?? this.successMessage,
|
||||
successKey: successKey ?? this.successKey,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => <Object?>[status, errorMessage, successMessage];
|
||||
List<Object?> get props => <Object?>[status, errorMessage, successMessage, successKey];
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:core_localization/core_localization.dart';
|
||||
import 'package:design_system/design_system.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
@@ -34,14 +35,16 @@ class _EditHubPageState extends State<EditHubPage> {
|
||||
value: widget.bloc,
|
||||
child: BlocListener<EditHubBloc, EditHubState>(
|
||||
listenWhen: (EditHubState prev, EditHubState curr) =>
|
||||
prev.status != curr.status ||
|
||||
prev.successMessage != curr.successMessage,
|
||||
prev.status != curr.status || prev.successKey != curr.successKey,
|
||||
listener: (BuildContext context, EditHubState state) {
|
||||
if (state.status == EditHubStatus.success &&
|
||||
state.successMessage != null) {
|
||||
state.successKey != null) {
|
||||
final String message = state.successKey == 'created'
|
||||
? t.client_hubs.edit_hub.created_success
|
||||
: t.client_hubs.edit_hub.updated_success;
|
||||
UiSnackbar.show(
|
||||
context,
|
||||
message: state.successMessage!,
|
||||
message: message,
|
||||
type: UiSnackbarType.success,
|
||||
);
|
||||
Modular.to.pop(true);
|
||||
|
||||
@@ -29,9 +29,12 @@ class HubDetailsPage extends StatelessWidget {
|
||||
child: BlocListener<HubDetailsBloc, HubDetailsState>(
|
||||
listener: (BuildContext context, HubDetailsState state) {
|
||||
if (state.status == HubDetailsStatus.deleted) {
|
||||
final String message = state.successKey == 'deleted'
|
||||
? t.client_hubs.hub_details.deleted_success
|
||||
: (state.successMessage ?? t.client_hubs.hub_details.deleted_success);
|
||||
UiSnackbar.show(
|
||||
context,
|
||||
message: state.successMessage ?? 'Hub deleted successfully',
|
||||
message: message,
|
||||
type: UiSnackbarType.success,
|
||||
);
|
||||
Modular.to.pop(true); // Return true to indicate change
|
||||
|
||||
@@ -51,7 +51,7 @@ class EditHubFormSection extends StatelessWidget {
|
||||
textInputAction: TextInputAction.next,
|
||||
validator: (String? value) {
|
||||
if (value == null || value.trim().isEmpty) {
|
||||
return 'Name is required';
|
||||
return t.client_hubs.edit_hub.name_required;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
@@ -181,11 +181,11 @@ class EditHubFormSection extends StatelessWidget {
|
||||
width: double.maxFinite,
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxHeight: 400),
|
||||
child: costCenters.isEmpty
|
||||
? const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 24),
|
||||
child: Text('No cost centers available'),
|
||||
)
|
||||
child : costCenters.isEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
child: Text(t.client_hubs.edit_hub.cost_centers_empty),
|
||||
)
|
||||
: ListView.builder(
|
||||
shrinkWrap: true,
|
||||
itemCount: costCenters.length,
|
||||
|
||||
@@ -318,9 +318,9 @@ class _HubFormDialogState extends State<HubFormDialog> {
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxHeight: 400),
|
||||
child: widget.costCenters.isEmpty
|
||||
? const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 24),
|
||||
child: Text('No cost centers available'),
|
||||
? Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
child: Text(t.client_hubs.add_hub_dialog.cost_centers_empty),
|
||||
)
|
||||
: ListView.builder(
|
||||
shrinkWrap: true,
|
||||
|
||||
Reference in New Issue
Block a user