removed unwanted code
This commit is contained in:
parent
1993676470
commit
b1b5b52854
@ -4,7 +4,6 @@ import 'package:marco/controller/attendance/attendance_screen_controller.dart';
|
||||
import 'package:marco/helpers/widgets/my_text.dart';
|
||||
import 'package:marco/helpers/utils/permission_constants.dart';
|
||||
import 'package:marco/helpers/utils/base_bottom_sheet.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:marco/helpers/utils/date_time_utils.dart';
|
||||
|
||||
class AttendanceFilterBottomSheet extends StatefulWidget {
|
||||
@ -39,78 +38,13 @@ class _AttendanceFilterBottomSheetState
|
||||
final endDate = widget.controller.endDateAttendance;
|
||||
|
||||
if (startDate != null && endDate != null) {
|
||||
final start =
|
||||
DateTimeUtils.formatDate(startDate, 'dd MMM yyyy');
|
||||
final start = DateTimeUtils.formatDate(startDate, 'dd MMM yyyy');
|
||||
final end = DateTimeUtils.formatDate(endDate, 'dd MMM yyyy');
|
||||
return "$start - $end";
|
||||
}
|
||||
return "Date Range";
|
||||
}
|
||||
|
||||
Widget _popupSelector({
|
||||
required String currentValue,
|
||||
required List<String> items,
|
||||
required ValueChanged<String> onSelected,
|
||||
}) {
|
||||
return PopupMenuButton<String>(
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
||||
onSelected: onSelected,
|
||||
itemBuilder: (context) => items
|
||||
.map((e) => PopupMenuItem<String>(
|
||||
value: e,
|
||||
child: MyText(e),
|
||||
))
|
||||
.toList(),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey.shade100,
|
||||
border: Border.all(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: MyText(
|
||||
currentValue,
|
||||
style: const TextStyle(color: Colors.black87),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
const Icon(Icons.arrow_drop_down, color: Colors.grey),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildOrganizationSelector(BuildContext context) {
|
||||
final orgNames = [
|
||||
"All Organizations",
|
||||
...widget.controller.organizations.map((e) => e.name)
|
||||
];
|
||||
|
||||
return _popupSelector(
|
||||
currentValue:
|
||||
widget.controller.selectedOrganization?.name ?? "All Organizations",
|
||||
items: orgNames,
|
||||
onSelected: (name) {
|
||||
if (name == "All Organizations") {
|
||||
setState(() {
|
||||
widget.controller.selectedOrganization = null;
|
||||
});
|
||||
} else {
|
||||
final selectedOrg = widget.controller.organizations
|
||||
.firstWhere((org) => org.name == name);
|
||||
setState(() {
|
||||
widget.controller.selectedOrganization = selectedOrg;
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> buildMainFilters() {
|
||||
final hasRegularizationPermission = widget.permissionController
|
||||
.hasPermission(Permissions.regularizeAttendance);
|
||||
@ -149,35 +83,6 @@ class _AttendanceFilterBottomSheetState
|
||||
}),
|
||||
];
|
||||
|
||||
// 🔹 Organization filter
|
||||
widgets.addAll([
|
||||
const Divider(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 12, bottom: 12),
|
||||
child: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: MyText.titleSmall("Choose Organization", fontWeight: 600),
|
||||
),
|
||||
),
|
||||
Obx(() {
|
||||
if (widget.controller.isLoadingOrganizations.value) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
} else if (widget.controller.organizations.isEmpty) {
|
||||
return Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16.0),
|
||||
child: MyText.bodyMedium(
|
||||
"No organizations found",
|
||||
fontWeight: 500,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return _buildOrganizationSelector(context);
|
||||
}),
|
||||
]);
|
||||
|
||||
// 🔹 Date Range only for attendanceLogs
|
||||
if (tempSelectedTab == 'attendanceLogs') {
|
||||
widgets.addAll([
|
||||
@ -237,7 +142,6 @@ class _AttendanceFilterBottomSheetState
|
||||
onCancel: () => Navigator.pop(context),
|
||||
onSubmit: () => Navigator.pop(context, {
|
||||
'selectedTab': tempSelectedTab,
|
||||
'selectedOrganization': widget.controller.selectedOrganization?.id,
|
||||
}),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
@ -5,7 +5,6 @@ import 'package:intl/intl.dart';
|
||||
|
||||
import 'package:marco/controller/employee/add_employee_controller.dart';
|
||||
import 'package:marco/controller/employee/employees_screen_controller.dart';
|
||||
import 'package:marco/controller/tenant/organization_selection_controller.dart';
|
||||
import 'package:marco/helpers/utils/base_bottom_sheet.dart';
|
||||
import 'package:marco/helpers/utils/mixins/ui_mixin.dart';
|
||||
import 'package:marco/helpers/widgets/my_snackbar.dart';
|
||||
@ -24,8 +23,6 @@ class AddEmployeeBottomSheet extends StatefulWidget {
|
||||
class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
with UIMixin {
|
||||
late final AddEmployeeController _controller;
|
||||
final OrganizationController _organizationController =
|
||||
Get.put(OrganizationController());
|
||||
|
||||
// Local UI state
|
||||
bool _hasApplicationAccess = false;
|
||||
@ -55,19 +52,6 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
if (widget.employeeData != null) {
|
||||
_controller.editingEmployeeData = widget.employeeData;
|
||||
_controller.prefillFields();
|
||||
|
||||
final orgId = widget.employeeData!['organizationId'];
|
||||
if (orgId != null) {
|
||||
_controller.selectedOrganizationId = orgId;
|
||||
|
||||
final selectedOrg = _organizationController.organizations
|
||||
.firstWhereOrNull((o) => o.id == orgId);
|
||||
if (selectedOrg != null) {
|
||||
_organizationController.selectOrganization(selectedOrg);
|
||||
_orgFieldController.text = selectedOrg.name;
|
||||
}
|
||||
}
|
||||
|
||||
if (_controller.joiningDate != null) {
|
||||
_joiningDateController.text =
|
||||
DateFormat('dd MMM yyyy').format(_controller.joiningDate!);
|
||||
@ -82,9 +66,7 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
(r) => r['id'] == _controller.selectedRoleId)?['name'] ??
|
||||
'';
|
||||
_roleController.text = roleName;
|
||||
} else {
|
||||
_orgFieldController.text = _organizationController.currentSelection;
|
||||
}
|
||||
} else {}
|
||||
}
|
||||
|
||||
@override
|
||||
@ -102,7 +84,6 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
init: _controller,
|
||||
builder: (_) {
|
||||
// Keep org field in sync with controller selection
|
||||
_orgFieldController.text = _organizationController.currentSelection;
|
||||
|
||||
return BaseBottomSheet(
|
||||
title: widget.employeeData != null ? 'Edit Employee' : 'Add Employee',
|
||||
@ -135,30 +116,6 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
_controller.basicValidator.getValidation('last_name'),
|
||||
),
|
||||
MySpacing.height(16),
|
||||
_sectionLabel('Organization'),
|
||||
MySpacing.height(8),
|
||||
GestureDetector(
|
||||
onTap: () => _showOrganizationPopup(context),
|
||||
child: AbsorbPointer(
|
||||
child: TextFormField(
|
||||
readOnly: true,
|
||||
controller: _orgFieldController,
|
||||
validator: (val) {
|
||||
if (val == null ||
|
||||
val.trim().isEmpty ||
|
||||
val == 'All Organizations') {
|
||||
return 'Organization is required';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
decoration:
|
||||
_inputDecoration('Select Organization').copyWith(
|
||||
suffixIcon: const Icon(Icons.expand_more),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
MySpacing.height(24),
|
||||
_sectionLabel('Application Access'),
|
||||
Row(
|
||||
children: [
|
||||
@ -333,8 +290,7 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
return null;
|
||||
},
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
decoration: _inputDecoration('e.g., john.doe@example.com').copyWith(
|
||||
),
|
||||
decoration: _inputDecoration('e.g., john.doe@example.com').copyWith(),
|
||||
),
|
||||
],
|
||||
);
|
||||
@ -483,9 +439,7 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
if (!isValid ||
|
||||
_controller.joiningDate == null ||
|
||||
_controller.selectedGender == null ||
|
||||
_controller.selectedRoleId == null ||
|
||||
_organizationController.currentSelection.isEmpty ||
|
||||
_organizationController.currentSelection == 'All Organizations') {
|
||||
_controller.selectedRoleId == null) {
|
||||
showAppSnackbar(
|
||||
title: 'Missing Fields',
|
||||
message: 'Please complete all required fields.',
|
||||
@ -514,40 +468,6 @@ class _AddEmployeeBottomSheetState extends State<AddEmployeeBottomSheet>
|
||||
}
|
||||
}
|
||||
|
||||
void _showOrganizationPopup(BuildContext context) async {
|
||||
final orgs = _organizationController.organizations;
|
||||
|
||||
if (orgs.isEmpty) {
|
||||
showAppSnackbar(
|
||||
title: 'No Organizations',
|
||||
message: 'No organizations available to select.',
|
||||
type: SnackbarType.warning,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
final selected = await showMenu<String>(
|
||||
context: context,
|
||||
position: _popupMenuPosition(context),
|
||||
items: orgs
|
||||
.map(
|
||||
(org) => PopupMenuItem<String>(
|
||||
value: org.id,
|
||||
child: Text(org.name),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
|
||||
if (selected != null && selected.trim().isNotEmpty) {
|
||||
final chosen = orgs.firstWhere((e) => e.id == selected);
|
||||
_organizationController.selectOrganization(chosen);
|
||||
_controller.selectedOrganizationId = chosen.id;
|
||||
_orgFieldController.text = chosen.name;
|
||||
_controller.update();
|
||||
}
|
||||
}
|
||||
|
||||
void _showGenderPopup(BuildContext context) async {
|
||||
final selected = await showMenu<Gender>(
|
||||
context: context,
|
||||
|
@ -11,13 +11,10 @@ import 'package:marco/controller/project_controller.dart';
|
||||
import 'package:marco/helpers/widgets/my_custom_skeleton.dart';
|
||||
import 'package:marco/model/employees/employee_model.dart';
|
||||
import 'package:marco/helpers/utils/launcher_utils.dart';
|
||||
import 'package:marco/view/employees/assign_employee_bottom_sheet.dart';
|
||||
import 'package:marco/controller/permission_controller.dart';
|
||||
import 'package:marco/helpers/utils/permission_constants.dart';
|
||||
import 'package:marco/helpers/widgets/my_refresh_indicator.dart';
|
||||
import 'package:marco/view/employees/employee_profile_screen.dart';
|
||||
import 'package:marco/controller/tenant/organization_selection_controller.dart';
|
||||
import 'package:marco/helpers/widgets/tenant/organization_selector.dart';
|
||||
|
||||
class EmployeesScreen extends StatefulWidget {
|
||||
const EmployeesScreen({super.key});
|
||||
@ -33,8 +30,6 @@ class _EmployeesScreenState extends State<EmployeesScreen> with UIMixin {
|
||||
Get.find<PermissionController>();
|
||||
final TextEditingController _searchController = TextEditingController();
|
||||
final RxList<EmployeeModel> _filteredEmployees = <EmployeeModel>[].obs;
|
||||
final OrganizationController _organizationController =
|
||||
Get.put(OrganizationController());
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -47,44 +42,15 @@ class _EmployeesScreenState extends State<EmployeesScreen> with UIMixin {
|
||||
}
|
||||
|
||||
Future<void> _initEmployees() async {
|
||||
final projectId = Get.find<ProjectController>().selectedProject?.id;
|
||||
final orgId = _organizationController.selectedOrganization.value?.id;
|
||||
|
||||
if (projectId != null) {
|
||||
await _organizationController.fetchOrganizations(projectId);
|
||||
}
|
||||
|
||||
if (_employeeController.isAllEmployeeSelected.value) {
|
||||
_employeeController.selectedProjectId = null;
|
||||
await _employeeController.fetchAllEmployees(organizationId: orgId);
|
||||
} else if (projectId != null) {
|
||||
_employeeController.selectedProjectId = projectId;
|
||||
await _employeeController.fetchEmployeesByProject(projectId,
|
||||
organizationId: orgId);
|
||||
} else {
|
||||
_employeeController.clearEmployees();
|
||||
}
|
||||
|
||||
await _employeeController.fetchAllEmployees();
|
||||
_filterEmployees(_searchController.text);
|
||||
}
|
||||
|
||||
Future<void> _refreshEmployees() async {
|
||||
try {
|
||||
final projectId = Get.find<ProjectController>().selectedProject?.id;
|
||||
final orgId = _organizationController.selectedOrganization.value?.id;
|
||||
final allSelected = _employeeController.isAllEmployeeSelected.value;
|
||||
|
||||
_employeeController.selectedProjectId = allSelected ? null : projectId;
|
||||
|
||||
if (allSelected) {
|
||||
await _employeeController.fetchAllEmployees(organizationId: orgId);
|
||||
} else if (projectId != null) {
|
||||
await _employeeController.fetchEmployeesByProject(projectId,
|
||||
organizationId: orgId);
|
||||
} else {
|
||||
_employeeController.clearEmployees();
|
||||
}
|
||||
|
||||
_employeeController.selectedProjectId = null;
|
||||
await _employeeController.fetchAllEmployees();
|
||||
_filterEmployees(_searchController.text);
|
||||
_employeeController.update(['employee_screen_controller']);
|
||||
} catch (e, stackTrace) {
|
||||
@ -132,22 +98,7 @@ class _EmployeesScreenState extends State<EmployeesScreen> with UIMixin {
|
||||
|
||||
if (result == null || result['success'] != true) return;
|
||||
|
||||
final employeeData = result['data'];
|
||||
final employeeId = employeeData['id'] as String;
|
||||
final jobRoleId = employeeData['jobRoleId'] as String?;
|
||||
|
||||
await showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
|
||||
),
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => AssignProjectBottomSheet(
|
||||
employeeId: employeeId,
|
||||
jobRoleId: jobRoleId ?? '',
|
||||
),
|
||||
);
|
||||
|
||||
await _refreshEmployees();
|
||||
}
|
||||
@ -287,43 +238,8 @@ class _EmployeesScreenState extends State<EmployeesScreen> with UIMixin {
|
||||
Row(
|
||||
children: [
|
||||
Expanded(child: _buildSearchField()),
|
||||
const SizedBox(width: 8),
|
||||
_buildPopupMenu(),
|
||||
],
|
||||
),
|
||||
|
||||
// Organization Selector Row
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: OrganizationSelector(
|
||||
controller: _organizationController,
|
||||
height: 36,
|
||||
onSelectionChanged: (org) async {
|
||||
// Make sure the selectedOrganization is updated immediately
|
||||
_organizationController.selectOrganization(org);
|
||||
|
||||
final projectId =
|
||||
Get.find<ProjectController>().selectedProject?.id;
|
||||
|
||||
if (_employeeController.isAllEmployeeSelected.value) {
|
||||
await _employeeController.fetchAllEmployees(
|
||||
organizationId: _organizationController
|
||||
.selectedOrganization.value?.id);
|
||||
} else if (projectId != null) {
|
||||
await _employeeController.fetchEmployeesByProject(
|
||||
projectId,
|
||||
organizationId: _organizationController
|
||||
.selectedOrganization.value?.id);
|
||||
}
|
||||
|
||||
_employeeController.update(['employee_screen_controller']);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
MySpacing.height(8),
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -370,63 +286,6 @@ class _EmployeesScreenState extends State<EmployeesScreen> with UIMixin {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildPopupMenu() {
|
||||
if (!_permissionController.hasPermission(Permissions.viewAllEmployees)) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
return PopupMenuButton<String>(
|
||||
icon: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
const Icon(Icons.tune, color: Colors.black),
|
||||
Obx(() => _employeeController.isAllEmployeeSelected.value
|
||||
? Positioned(
|
||||
right: -1,
|
||||
top: -1,
|
||||
child: Container(
|
||||
width: 10,
|
||||
height: 10,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.red, shape: BoxShape.circle),
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink()),
|
||||
],
|
||||
),
|
||||
onSelected: (value) async {
|
||||
if (value == 'all_employees') {
|
||||
_employeeController.isAllEmployeeSelected.toggle();
|
||||
await _initEmployees();
|
||||
_employeeController.update(['employee_screen_controller']);
|
||||
}
|
||||
},
|
||||
itemBuilder: (_) => [
|
||||
PopupMenuItem<String>(
|
||||
value: 'all_employees',
|
||||
child: Obx(
|
||||
() => Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: _employeeController.isAllEmployeeSelected.value,
|
||||
onChanged: (_) => Navigator.pop(context, 'all_employees'),
|
||||
checkColor: Colors.white,
|
||||
activeColor: Colors.blueAccent,
|
||||
side: const BorderSide(color: Colors.black, width: 1.5),
|
||||
fillColor: MaterialStateProperty.resolveWith<Color>(
|
||||
(states) => states.contains(MaterialState.selected)
|
||||
? Colors.blueAccent
|
||||
: Colors.white),
|
||||
),
|
||||
const Text('All Employees'),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildEmployeeList() {
|
||||
return Obx(() {
|
||||
if (_employeeController.isLoading.value) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user