first commit
This commit is contained in:
191
lib/Screens/hrm/department/add_new_depertment.dart
Normal file
191
lib/Screens/hrm/department/add_new_depertment.dart
Normal file
@@ -0,0 +1,191 @@
|
||||
// File: add_edit_department.dart
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
// --- Local Imports ---
|
||||
import 'package:mobile_pos/Screens/hrm/department/model/department_list_model.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/repo/department_repo.dart';
|
||||
import 'package:mobile_pos/constant.dart';
|
||||
// Assuming DepartmentRepo is available via this path
|
||||
|
||||
class AddEditDepartment extends ConsumerStatefulWidget {
|
||||
final bool isEdit;
|
||||
final DepartmentData? department;
|
||||
|
||||
const AddEditDepartment({super.key, this.isEdit = false, this.department});
|
||||
|
||||
@override
|
||||
ConsumerState<AddEditDepartment> createState() => _AddEditDepartmentState();
|
||||
}
|
||||
|
||||
class _AddEditDepartmentState extends ConsumerState<AddEditDepartment> {
|
||||
final GlobalKey<FormState> _key = GlobalKey<FormState>();
|
||||
final TextEditingController nameController = TextEditingController();
|
||||
final TextEditingController descController = TextEditingController();
|
||||
|
||||
String? _selectedStatus; // UI state for dropdown
|
||||
|
||||
final List<String> _statusOptions = ['Active', 'Inactive'];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (widget.isEdit && widget.department != null) {
|
||||
final data = widget.department!;
|
||||
nameController.text = data.name ?? '';
|
||||
descController.text = data.description ?? '';
|
||||
// Convert num status (1/0) to string status ('Active'/'Inactive')
|
||||
_selectedStatus = data.status.toString() == '1' || data.status.toString() == 'Active' ? 'Active' : 'Inactive';
|
||||
} else {
|
||||
_selectedStatus = 'Active'; // Default status for new entry
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
nameController.dispose();
|
||||
descController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
// --- Submission Logic ---
|
||||
Future<void> _submit() async {
|
||||
if (!_key.currentState!.validate()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final repo = DepartmentRepo();
|
||||
// Convert selected string status to API required string "1" (Active) or "0" (Inactive)
|
||||
final String apiStatus = _selectedStatus == 'Active' ? '1' : '0';
|
||||
|
||||
EasyLoading.show(status: widget.isEdit ? 'Updating...' : 'Saving...');
|
||||
|
||||
if (widget.isEdit) {
|
||||
await repo.updateDepartment(
|
||||
ref: ref,
|
||||
context: context,
|
||||
|
||||
// Assuming ID is non-null when isEdit is true
|
||||
id: widget.department!.id!.round(),
|
||||
name: nameController.text,
|
||||
description: descController.text,
|
||||
status: apiStatus,
|
||||
);
|
||||
} else {
|
||||
await repo.createDepartment(
|
||||
ref: ref,
|
||||
context: context,
|
||||
name: nameController.text,
|
||||
description: descController.text,
|
||||
status: apiStatus,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Reset Logic ---
|
||||
void _resetForm() {
|
||||
setState(() {
|
||||
_key.currentState?.reset();
|
||||
nameController.clear();
|
||||
descController.clear();
|
||||
_selectedStatus = 'Active';
|
||||
|
||||
// If editing, pressing reset should revert to original values
|
||||
if (widget.isEdit && widget.department != null) {
|
||||
final data = widget.department!;
|
||||
nameController.text = data.name ?? '';
|
||||
descController.text = data.description ?? '';
|
||||
_selectedStatus = data.status == '1' || data.status == 'Active' ? 'Active' : 'Inactive';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
title: Text(widget.isEdit ? 'Edit Department' : 'Add Department'),
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Form(
|
||||
key: _key,
|
||||
child: Column(
|
||||
children: [
|
||||
// 1. Department Name
|
||||
TextFormField(
|
||||
controller: nameController,
|
||||
decoration: kInputDecoration.copyWith(
|
||||
labelText: 'Department Name',
|
||||
hintText: 'Enter Department Name',
|
||||
),
|
||||
validator: (value) => value!.isEmpty ? 'Please enter department name' : null,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 2. Status Dropdown
|
||||
DropdownButtonFormField<String>(
|
||||
value: _selectedStatus,
|
||||
icon: const Icon(Icons.keyboard_arrow_down, color: kNeutral800),
|
||||
decoration: kInputDecoration.copyWith(labelText: 'Status'),
|
||||
items: _statusOptions.map((String value) {
|
||||
return DropdownMenuItem(value: value, child: Text(value));
|
||||
}).toList(),
|
||||
onChanged: (String? newValue) {
|
||||
setState(() {
|
||||
_selectedStatus = newValue;
|
||||
});
|
||||
},
|
||||
validator: (value) => value == null ? 'Please select a status' : null,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 3. Description
|
||||
TextFormField(
|
||||
controller: descController,
|
||||
maxLines: 3,
|
||||
decoration: kInputDecoration.copyWith(
|
||||
labelText: 'Description',
|
||||
hintText: 'Enter Description',
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 10.0),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
|
||||
// 4. Action Buttons (Reset/Save)
|
||||
Row(
|
||||
children: [
|
||||
// Reset Button
|
||||
Expanded(
|
||||
child: OutlinedButton(
|
||||
onPressed: _resetForm,
|
||||
style: OutlinedButton.styleFrom(
|
||||
minimumSize: const Size(double.infinity, 50),
|
||||
),
|
||||
child: Text(widget.isEdit ? 'Cancel' : 'Reset'),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
// Save/Update Button
|
||||
Expanded(
|
||||
child: ElevatedButton.icon(
|
||||
onPressed: _submit,
|
||||
label: Text(widget.isEdit ? 'Update' : 'Save'),
|
||||
style: ElevatedButton.styleFrom(
|
||||
minimumSize: const Size(double.infinity, 50),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
236
lib/Screens/hrm/department/department_screen.dart
Normal file
236
lib/Screens/hrm/department/department_screen.dart
Normal file
@@ -0,0 +1,236 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:hugeicons/hugeicons.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/add_new_depertment.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/provider/department_list_provider.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/repo/department_repo.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/widgets/deleteing_alart_dialog.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/widgets/global_search_appbar.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/widgets/model_bottom_sheet.dart';
|
||||
import 'package:mobile_pos/constant.dart';
|
||||
import 'package:mobile_pos/generated/l10n.dart' as lang;
|
||||
|
||||
import '../../../generated/l10n.dart' as lang;
|
||||
import '../../../service/check_user_role_permission_provider.dart';
|
||||
import '../../../widgets/empty_widget/_empty_widget.dart';
|
||||
|
||||
class DepartmentScreen extends ConsumerStatefulWidget {
|
||||
const DepartmentScreen({super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<DepartmentScreen> createState() => _DepartmentScreenState();
|
||||
}
|
||||
|
||||
class _DepartmentScreenState extends ConsumerState<DepartmentScreen> {
|
||||
bool _isSearch = false;
|
||||
final _searchController = TextEditingController();
|
||||
String _searchQuery = '';
|
||||
|
||||
Future<void> _refreshList() async {
|
||||
await ref.refresh(departmentListProvider.future);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final _lang = lang.S.of(context);
|
||||
final theme = Theme.of(context);
|
||||
final departmentAsync = ref.watch(departmentListProvider);
|
||||
final permissionService = PermissionService(ref);
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: kWhite,
|
||||
appBar: GlobalSearchAppBar(
|
||||
isSearch: _isSearch,
|
||||
onSearchToggle: () => setState(() {
|
||||
_isSearch = !_isSearch;
|
||||
_searchController.clear();
|
||||
_searchQuery = '';
|
||||
}),
|
||||
title: _lang.department,
|
||||
controller: _searchController,
|
||||
onChanged: (query) {
|
||||
setState(() => _searchQuery = query.trim().toLowerCase());
|
||||
},
|
||||
),
|
||||
body: departmentAsync.when(
|
||||
data: (data) {
|
||||
if (!permissionService.hasPermission(Permit.departmentRead.value)) {
|
||||
return const Center(child: PermitDenyWidget());
|
||||
}
|
||||
final departmentList = data.data ?? [];
|
||||
|
||||
// Search filter
|
||||
final filteredList = departmentList.where((dept) {
|
||||
final name = dept.name?.toLowerCase() ?? '';
|
||||
final desc = dept.description?.toLowerCase() ?? '';
|
||||
return name.contains(_searchQuery) || desc.contains(_searchQuery);
|
||||
}).toList();
|
||||
|
||||
if (filteredList.isEmpty) {
|
||||
return Center(child: Text(_lang.noDepartmentFound));
|
||||
}
|
||||
|
||||
return RefreshIndicator(
|
||||
onRefresh: _refreshList,
|
||||
child: ListView.separated(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
padding: EdgeInsets.zero,
|
||||
itemBuilder: (_, index) {
|
||||
final dept = filteredList[index];
|
||||
return ListTile(
|
||||
onTap: () {
|
||||
viewModalSheet(
|
||||
context: context,
|
||||
item: {
|
||||
_lang.department: dept.name ?? 'n/a',
|
||||
_lang.status: (dept.status == 1) ? _lang.active : _lang.inactive,
|
||||
},
|
||||
description: dept.description ?? _lang.noDescriptionAvailableForThisDepartment,
|
||||
);
|
||||
},
|
||||
contentPadding: const EdgeInsetsDirectional.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 0,
|
||||
),
|
||||
visualDensity: const VisualDensity(horizontal: -4, vertical: -4),
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
dept.name ?? 'n/a',
|
||||
style: theme.textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
style: const ButtonStyle(
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.all(0)),
|
||||
),
|
||||
padding: EdgeInsets.zero,
|
||||
visualDensity: const VisualDensity(horizontal: -4, vertical: -4),
|
||||
onPressed: () {
|
||||
if (!permissionService.hasPermission(Permit.departmentUpdate.value)) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
backgroundColor: Colors.red,
|
||||
content: Text(_lang.youDoNotHavePermissionToUpdateDepartment),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => AddEditDepartment(
|
||||
isEdit: true,
|
||||
department: dept,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
icon: const HugeIcon(
|
||||
icon: HugeIcons.strokeRoundedPencilEdit02,
|
||||
color: kSuccessColor,
|
||||
size: 20,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
subtitle: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
dept.description ?? 'n/a',
|
||||
style: theme.textTheme.bodyMedium?.copyWith(
|
||||
color: kNeutral800,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
style: const ButtonStyle(
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.all(0)),
|
||||
),
|
||||
visualDensity: const VisualDensity(horizontal: -4, vertical: -4),
|
||||
onPressed: () async {
|
||||
if (!permissionService.hasPermission(Permit.departmentDelete.value)) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
backgroundColor: Colors.red,
|
||||
content: Text(lang.S.of(context).youDoNotHavePermissionToDeleteDepartment),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
final _lang = lang.S.of(context);
|
||||
final confirm = await showDeleteConfirmationDialog(
|
||||
itemName: lang.S.of(context).department,
|
||||
context: context,
|
||||
);
|
||||
|
||||
if (confirm) {
|
||||
EasyLoading.show(status: _lang.deleting);
|
||||
final DepartmentRepo repo = DepartmentRepo();
|
||||
try {
|
||||
final result =
|
||||
await repo.deleteDepartment(id: dept.id.toString(), ref: ref, context: context);
|
||||
if (result) {
|
||||
ref.refresh(departmentListProvider);
|
||||
EasyLoading.showSuccess(_lang.deletedSuccessFully);
|
||||
} else {
|
||||
EasyLoading.showError(_lang.failedToDeleteTheDeterment);
|
||||
}
|
||||
} catch (e) {
|
||||
EasyLoading.showError('${"Error deleting"}: $e');
|
||||
} finally {
|
||||
EasyLoading.dismiss();
|
||||
}
|
||||
}
|
||||
},
|
||||
icon: const HugeIcon(
|
||||
icon: HugeIcons.strokeRoundedDelete03,
|
||||
color: Colors.red,
|
||||
size: 20,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, __) => const Divider(
|
||||
color: kBackgroundColor,
|
||||
height: 2,
|
||||
),
|
||||
itemCount: filteredList.length,
|
||||
),
|
||||
);
|
||||
},
|
||||
loading: () => const Center(child: CircularProgressIndicator()),
|
||||
error: (err, _) => Center(
|
||||
child: Text('${lang.S.of(context).failedToLoadDepartment}.\n$err'),
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: permissionService.hasPermission(Permit.departmentCreate.value)
|
||||
? Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: ElevatedButton.icon(
|
||||
onPressed: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const AddEditDepartment(isEdit: false)),
|
||||
);
|
||||
},
|
||||
label: Text(lang.S.of(context).addDepartment),
|
||||
icon: const Icon(Icons.add, color: Colors.white),
|
||||
),
|
||||
)
|
||||
: null,
|
||||
);
|
||||
}
|
||||
}
|
||||
68
lib/Screens/hrm/department/model/department_list_model.dart
Normal file
68
lib/Screens/hrm/department/model/department_list_model.dart
Normal file
@@ -0,0 +1,68 @@
|
||||
class DepartmentListModel {
|
||||
DepartmentListModel({
|
||||
this.message,
|
||||
this.data,
|
||||
});
|
||||
|
||||
DepartmentListModel.fromJson(dynamic json) {
|
||||
message = json['message'];
|
||||
if (json['data'] != null) {
|
||||
data = [];
|
||||
json['data'].forEach((v) {
|
||||
data?.add(DepartmentData.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
String? message;
|
||||
List<DepartmentData>? data;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final map = <String, dynamic>{};
|
||||
map['message'] = message;
|
||||
if (data != null) {
|
||||
map['data'] = data?.map((v) => v.toJson()).toList();
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
class DepartmentData {
|
||||
DepartmentData({
|
||||
this.id,
|
||||
this.businessId,
|
||||
this.name,
|
||||
this.description,
|
||||
this.status,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
});
|
||||
|
||||
DepartmentData.fromJson(dynamic json) {
|
||||
id = json['id'];
|
||||
businessId = json['business_id'];
|
||||
name = json['name'];
|
||||
description = json['description'];
|
||||
status = json['status'];
|
||||
createdAt = json['created_at'];
|
||||
updatedAt = json['updated_at'];
|
||||
}
|
||||
num? id;
|
||||
num? businessId;
|
||||
String? name;
|
||||
String? description;
|
||||
num? status;
|
||||
String? createdAt;
|
||||
String? updatedAt;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final map = <String, dynamic>{};
|
||||
map['id'] = id;
|
||||
map['business_id'] = businessId;
|
||||
map['name'] = name;
|
||||
map['description'] = description;
|
||||
map['status'] = status;
|
||||
map['created_at'] = createdAt;
|
||||
map['updated_at'] = updatedAt;
|
||||
return map;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/model/department_list_model.dart';
|
||||
import 'package:mobile_pos/Screens/hrm/department/repo/department_repo.dart';
|
||||
|
||||
DepartmentRepo repo = DepartmentRepo();
|
||||
final departmentListProvider = FutureProvider<DepartmentListModel>((ref) => repo.fetchAllDepartments());
|
||||
149
lib/Screens/hrm/department/repo/department_repo.dart
Normal file
149
lib/Screens/hrm/department/repo/department_repo.dart
Normal file
@@ -0,0 +1,149 @@
|
||||
import 'dart:convert';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:mobile_pos/Screens/hrm/department/model/department_list_model.dart';
|
||||
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../../../Const/api_config.dart';
|
||||
import '../../../../http_client/custome_http_client.dart';
|
||||
import '../../../../http_client/customer_http_client_get.dart';
|
||||
import '../provider/department_list_provider.dart';
|
||||
|
||||
class DepartmentRepo {
|
||||
Future<DepartmentListModel> fetchAllDepartments() async {
|
||||
CustomHttpClientGet clientGet = CustomHttpClientGet(client: http.Client());
|
||||
final uri = Uri.parse('${APIConfig.url}/departments');
|
||||
|
||||
final response = await clientGet.get(url: uri);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final parsedData = jsonDecode(response.body);
|
||||
|
||||
return DepartmentListModel.fromJson(parsedData);
|
||||
} else {
|
||||
throw Exception('Failed to fetch Department list');
|
||||
}
|
||||
}
|
||||
|
||||
///---------------- CREATE DEPARTMENT ----------------///
|
||||
Future<void> createDepartment({
|
||||
required WidgetRef ref,
|
||||
required BuildContext context,
|
||||
required String name,
|
||||
required String description,
|
||||
required String status,
|
||||
}) async {
|
||||
final uri = Uri.parse('${APIConfig.url}/departments');
|
||||
|
||||
final requestBody = jsonEncode({
|
||||
'name': name,
|
||||
'description': description,
|
||||
'status': status,
|
||||
});
|
||||
|
||||
try {
|
||||
EasyLoading.show(status: 'Creating...');
|
||||
CustomHttpClient customHttpClient = CustomHttpClient(client: http.Client(), context: context, ref: ref);
|
||||
|
||||
var responseData = await customHttpClient.post(
|
||||
url: uri,
|
||||
addContentTypeInHeader: true,
|
||||
body: requestBody,
|
||||
);
|
||||
|
||||
final parsedData = jsonDecode(responseData.body);
|
||||
EasyLoading.dismiss();
|
||||
|
||||
if (responseData.statusCode == 200) {
|
||||
ref.refresh(departmentListProvider);
|
||||
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(parsedData['message'] ?? 'Department created')),
|
||||
);
|
||||
Navigator.pop(context);
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('Department creation failed: ${parsedData['message'] ?? 'Unknown error'}')),
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
EasyLoading.dismiss();
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('An error occurred: $error')),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
///---------------- UPDATE DEPARTMENT ----------------///
|
||||
Future<void> updateDepartment({
|
||||
required WidgetRef ref,
|
||||
required BuildContext context,
|
||||
required int id,
|
||||
required String name,
|
||||
required String description,
|
||||
required String status,
|
||||
}) async {
|
||||
final uri = Uri.parse('${APIConfig.url}/departments/$id');
|
||||
|
||||
final requestBody = jsonEncode({
|
||||
'_method': 'put',
|
||||
'name': name,
|
||||
'description': description,
|
||||
'status': status,
|
||||
});
|
||||
|
||||
try {
|
||||
EasyLoading.show(status: 'Updating...');
|
||||
CustomHttpClient customHttpClient = CustomHttpClient(client: http.Client(), context: context, ref: ref);
|
||||
|
||||
var responseData = await customHttpClient.post(
|
||||
url: uri,
|
||||
addContentTypeInHeader: true,
|
||||
body: requestBody,
|
||||
);
|
||||
|
||||
final parsedData = jsonDecode(responseData.body);
|
||||
EasyLoading.dismiss();
|
||||
|
||||
if (responseData.statusCode == 200) {
|
||||
ref.refresh(departmentListProvider);
|
||||
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(parsedData['message'] ?? 'Department updated')),
|
||||
);
|
||||
Navigator.pop(context);
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('Department update failed: ${parsedData['message'] ?? 'Unknown error'}')),
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
EasyLoading.dismiss();
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('An error occurred: $error')),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> deleteDepartment({required String id, required BuildContext context, required WidgetRef ref}) async {
|
||||
try {
|
||||
final url = Uri.parse('${APIConfig.url}/departments/$id');
|
||||
CustomHttpClient customHttpClient = CustomHttpClient(ref: ref, context: context, client: http.Client());
|
||||
final response = await customHttpClient.delete(url: url);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
return true;
|
||||
} else {
|
||||
print('Error deleting Department: ${response.statusCode} - ${response.body}');
|
||||
return false;
|
||||
}
|
||||
} catch (error) {
|
||||
print('Error during delete operation: $error');
|
||||
return false;
|
||||
} finally {
|
||||
EasyLoading.dismiss();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user