share attachment implemented

feature/passo/PASSO-#1-Sync-data-from-device-to-postgre-and-vice-versa
PGAN-MIS 2023-08-27 16:38:05 +08:00
parent 690af305d6
commit e7d6cb8133
54 changed files with 1573 additions and 471 deletions

View File

@ -10,7 +10,7 @@
<application
android:label="uniT App"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/unit">
<provider
android:authorities = "${applicationId}.fileprovider"
android:exported = "false"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.6.10'
ext.kotlin_version = '1.8.0'
repositories {
google()
mavenCentral()

View File

@ -1,10 +1,18 @@
import 'dart:io';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:share_plus/share_plus.dart';
import 'package:unit2/model/profile/educational_background.dart';
import 'package:unit2/sevices/profile/education_services.dart';
import 'package:unit2/utils/request_permission.dart';
import '../../../model/profile/attachment.dart';
import '../../../utils/attachment_services.dart';
import '../../../utils/urls.dart';
part 'education_event.dart';
part 'education_state.dart';
@ -14,9 +22,13 @@ class EducationBloc extends Bloc<EducationEvent, EducationState> {
List<School> schools = [];
List<Course> programs = [];
List<Honor> honors = [];
int? profileId;
String? token;
List<AttachmentCategory> attachmentCategories = [];
EducationBloc() : super(EducationInitial()) {
on<GetEducationalBackground>((event, emit) async {
profileId = event.profileId;
token = event.token;
emit(EducationalBackgroundLoadingState());
try {
if (attachmentCategories.isEmpty) {
@ -206,5 +218,44 @@ class EducationBloc extends Bloc<EducationEvent, EducationState> {
emit(EducationalBackgroundErrorState(message: e.toString()));
}
});
on<EducationViewAttachment>((event, emit) {
String fileUrl =
'${Url.instance.prefixHost()}://${Url.instance.host()}${event.source}';
emit(EducationAttachmentViewState(
fileUrl: fileUrl, fileName: event.fileName));
});
on<ShareAttachment>((event, emit) async {
emit(EducationalBackgroundLoadingState());
Directory directory;
String? appDocumentPath;
if (await requestPermission(Permission.storage)) {
directory = await getApplicationDocumentsDirectory();
appDocumentPath = directory.path;
}
try{
final bool success = await AttachmentServices.instance.downloadAttachment(
filename: event.fileName,
source: event.source,
downLoadDir: appDocumentPath!);
if (success) {
final result = await Share.shareXFiles(
[XFile("$appDocumentPath/${event.fileName}")]);
if (result.status == ShareResultStatus.success) {
Fluttertoast.showToast(msg: "Attachment shared successfully");
emit(EducationAttachmentViewState(
fileUrl: event.source, fileName: event.fileName));
} else {
Fluttertoast.showToast(msg: "Attachment shared unsuccessfully");
emit(EducationAttachmentViewState(
fileUrl: event.source, fileName: event.fileName));
}
} else {
emit(EducationAttachmentViewState(
fileUrl: event.source, fileName: event.fileName));
}
}catch(e){
emit(EducationalBackgroundErrorState(message: e.toString()));
}
});
}
}

View File

@ -83,3 +83,15 @@ class DeleteEducationAttachment extends EducationEvent{
final int profileId;
const DeleteEducationAttachment({required this.attachment, required this.moduleId, required this.profileId, required this.token});
}
class EducationViewAttachment extends EducationEvent{
final String fileName;
final String source;
const EducationViewAttachment({required this.source,required this.fileName});
}
class ShareAttachment extends EducationEvent{
final String fileName;
final String source;
const ShareAttachment({required this.fileName, required this.source});
}

View File

@ -60,7 +60,6 @@ class EducationAddedState extends EducationState {
List<Object> get props => [response];
}
//// Edited State
class EditedEducationState extends EducationState {
final Map<dynamic, dynamic> response;
@ -89,4 +88,15 @@ class EducationAttachmentDeletedState extends EducationState {
const EducationAttachmentDeletedState({required this.success});
@override
List<Object> get props => [success];
}
}
class EducationAttachmentViewState extends EducationState {
final String fileUrl;
final String fileName;
const EducationAttachmentViewState({required this.fileUrl, required this.fileName});
}
class EducationAttachmentShareState extends EducationState{
final bool success;
const EducationAttachmentShareState({required this.success,});
}

View File

@ -11,6 +11,7 @@ import '../../../model/utils/eligibility.dart';
import '../../../sevices/profile/eligibility_services.dart';
import '../../../utils/location_utilities.dart';
import '../../../utils/profile_utilities.dart';
import '../../../utils/urls.dart';
part 'eligibility_event.dart';
part 'eligibility_state.dart';
@ -52,6 +53,7 @@ class EligibilityBloc extends Bloc<EligibilityEvent, EligibilityState> {
//// GET ELIGIBILITY
on<GetEligibilities>((event, emit) async {
emit(EligibilityLoadingState());
try {
if (attachmentCategories.isEmpty) {
attachmentCategories =
@ -257,7 +259,7 @@ class EligibilityBloc extends Bloc<EligibilityEvent, EligibilityState> {
on<DeleteEligibyAttachment>((event, emit) async {
emit(EligibilityLoadingState());
// try {
try {
final bool success = await AttachmentServices.instance.deleteAttachment(
attachment: event.attachment,
moduleId: int.parse(event.moduleId),
@ -275,9 +277,13 @@ class EligibilityBloc extends Bloc<EligibilityEvent, EligibilityState> {
} else {
emit(EligibilitytAttachmentDeletedState(success: success));
}
// } catch (e) {
// emit(EligibilityErrorState(message: e.toString()));
// }
} catch (e) {
emit(EligibilityErrorState(message: e.toString()));
}
});
on<EligibiltyViewAttachmentEvent>((event,emit){
String fileUrl = '${Url.instance.prefixHost()}://${Url.instance.host()}${event.source}';
emit(EligibilityAttachmentViewState(fileUrl: fileUrl));
});
}
}

View File

@ -7,38 +7,44 @@ abstract class EligibilityEvent extends Equatable {
List<Object> get props => [];
}
class ShowAddEligibilityForm extends EligibilityEvent {
class ShowAddEligibilityForm extends EligibilityEvent {}
}
class GetEligibilities extends EligibilityEvent{
class GetEligibilities extends EligibilityEvent {
final int profileId;
final String token;
const GetEligibilities({required this.profileId, required this.token});
@override
List<Object> get props => [profileId,token];
List<Object> get props => [profileId, token];
}
class AddEligibility extends EligibilityEvent{
final EligibityCert eligibityCert;
class AddEligibility extends EligibilityEvent {
final EligibityCert eligibityCert;
final String profileId;
final String token;
const AddEligibility({required this.eligibityCert, required this.profileId, required this.token});
const AddEligibility(
{required this.eligibityCert,
required this.profileId,
required this.token});
@override
List<Object> get props => [eligibityCert, profileId, token];
List<Object> get props => [eligibityCert, profileId, token];
}
class UpdateEligibility extends EligibilityEvent{
class UpdateEligibility extends EligibilityEvent {
final EligibityCert eligibityCert;
final String profileId;
final String token;
final int oldEligibility;
const UpdateEligibility({required this.eligibityCert, required this.oldEligibility,required this.profileId, required this.token});
const UpdateEligibility(
{required this.eligibityCert,
required this.oldEligibility,
required this.profileId,
required this.token});
@override
List<Object> get props =>[eligibityCert,profileId,token,oldEligibility];
List<Object> get props => [eligibityCert, profileId, token, oldEligibility];
}
class LoadEligibility extends EligibilityEvent {
class LoadEligibility extends EligibilityEvent {
const LoadEligibility();
@override
List<Object> get props => [];
@ -55,45 +61,55 @@ class DeleteEligibility extends EligibilityEvent {
final String profileId;
final int eligibilityId;
final String token;
const DeleteEligibility(
{
required this.eligibilityId,
{required this.eligibilityId,
required this.profileId,
required this.token});
@override
List<Object> get props => [ profileId, eligibilityId, token];
List<Object> get props => [profileId, eligibilityId, token];
}
class CallErrorState extends EligibilityEvent{
}
class CallErrorState extends EligibilityEvent {}
////Add Attachment
class AddEligibiltyAttachment extends EligibilityEvent{
class AddEligibiltyAttachment extends EligibilityEvent {
final String categoryId;
final String attachmentModule;
final List<String> filePaths;
final String token;
final String profileId;
const AddEligibiltyAttachment({required this.attachmentModule, required this.filePaths, required this.categoryId, required this.profileId, required this.token});
const AddEligibiltyAttachment(
{required this.attachmentModule,
required this.filePaths,
required this.categoryId,
required this.profileId,
required this.token});
@override
List<Object> get props => [categoryId,attachmentModule,filePaths, token,profileId];
List<Object> get props =>
[categoryId, attachmentModule, filePaths, token, profileId];
}
////Delete Attachment
class DeleteEligibyAttachment extends EligibilityEvent{
class DeleteEligibyAttachment extends EligibilityEvent {
final String profileId;
final String token;
final Attachment attachment;
final String moduleId;
const DeleteEligibyAttachment({required this.attachment,required this.moduleId, required this.profileId, required this.token});
const DeleteEligibyAttachment(
{required this.attachment,
required this.moduleId,
required this.profileId,
required this.token});
}
class EligibilityViewAttachments extends EligibilityEvent {
final String source;
const EligibilityViewAttachments({required this.source});
}
class EligibiltyViewAttachmentEvent extends EligibilityEvent{
final String source;
const EligibiltyViewAttachmentEvent({required this.source});
}

View File

@ -107,3 +107,8 @@ class EligibilitytAttachmentDeletedState extends EligibilityState {
@override
List<Object> get props => [success];
}
class EligibilityAttachmentViewState extends EligibilityState {
final String fileUrl;
const EligibilityAttachmentViewState({required this.fileUrl});
}

View File

@ -13,6 +13,7 @@ import '../../../model/utils/category.dart';
import '../../../utils/attachment_services.dart';
import '../../../utils/location_utilities.dart';
import '../../../utils/profile_utilities.dart';
import '../../../utils/urls.dart';
part 'learning_development_event.dart';
part 'learning_development_state.dart';
@ -325,5 +326,10 @@ class LearningDevelopmentBloc
emit(LearningDevelopmentErrorState(message: e.toString()));
}
});
on<LearningDevelopmentViewAttachmentEvent>((event,emit){
String fileUrl = '${Url.instance.prefixHost()}://${Url.instance.host()}${event.source}';
emit(LearningAndDevelopmentAttachmentViewState(fileUrl: fileUrl));
});
}
}

View File

@ -88,3 +88,9 @@ class DeleteLearningDevAttachment extends LearningDevelopmentEvent{
const DeleteLearningDevAttachment({required this.attachment, required this.moduleId, required this.profileId, required this.token});
}
class LearningDevelopmentViewAttachmentEvent extends LearningDevelopmentEvent{
final String source;
const LearningDevelopmentViewAttachmentEvent({required this.source});
}

View File

@ -133,3 +133,9 @@ class LearningDevAttachmentDeletedState extends LearningDevelopmentState {
@override
List<Object> get props => [success];
}
class LearningAndDevelopmentAttachmentViewState extends LearningDevelopmentState {
final String fileUrl;
const LearningAndDevelopmentAttachmentViewState({required this.fileUrl});
}

View File

@ -7,6 +7,7 @@ import 'package:unit2/model/utils/position.dart';
import 'package:unit2/sevices/profile/work_history_services.dart';
import 'package:unit2/utils/profile_utilities.dart';
import '../../../model/profile/attachment.dart';
import '../../../model/utils/category.dart';
import '../../../utils/attachment_services.dart';
part 'workHistory_event.dart';
@ -67,8 +68,10 @@ class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
});
//// ADD WORK HISTORIES
on<AddWorkHostory>((event, emit) async {
try {
// try {
Map<dynamic, dynamic> status = await WorkHistoryService.instance.add(
accomplishment: event.accomplishment,
actualDuties: event.actualDuties,
isPrivate: event.isPrivate,
workHistory: event.workHistory,
token: event.token,
@ -80,35 +83,35 @@ class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
} else {
emit(WorkHistoryAddedState(response: status));
}
} catch (e) {
emit(WorkHistoryErrorState(message: e.toString()));
}
// } catch (e) {
// emit(WorkHistoryErrorState(message: e.toString()));
// }
});
////UPDATE WORK HISTORY
on<UpdateWorkHistory>((event, emit) async {
try {
Map<dynamic, dynamic> status = await WorkHistoryService.instance.update(
oldWorkHistory: event.oldWorkHistory,
newWorkHistory: event.workHistory,
token: event.token,
profileId: event.profileId);
if (status['success']) {
WorkHistory workHistory = WorkHistory.fromJson(status['data']);
workExperiences.removeWhere((WorkHistory work) {
return work.id == event.oldWorkHistory.id;
});
workExperiences.add(workHistory);
emit(WorkHistoryEditedState(response: status));
} else {
emit(WorkHistoryEditedState(
response: status,
));
}
} catch (e) {
emit(WorkHistoryErrorState(message: e.toString()));
}
});
// on<UpdateWorkHistory>((event, emit) async {
// try {
// Map<dynamic, dynamic> status = await WorkHistoryService.instance.update(
// oldWorkHistory: event.oldWorkHistory,
// newWorkHistory: event.workHistory,
// token: event.token,
// profileId: event.profileId);
// if (status['success']) {
// WorkHistory workHistory = WorkHistory.fromJson(status['data']);
// workExperiences.removeWhere((WorkHistory work) {
// return work.id == event.oldWorkHistory.id;
// });
// workExperiences.add(workHistory);
// emit(WorkHistoryEditedState(response: status));
// } else {
// emit(WorkHistoryEditedState(
// response: status,
// ));
// }
// } catch (e) {
// emit(WorkHistoryErrorState(message: e.toString()));
// }
// });
////SHOW EDIT WORK HISTORIES
on<ShowEditWorkHistoryForm>((event, emit) async {
@ -209,12 +212,12 @@ class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
Attachment newAttachment = Attachment.fromJson(element);
attachments.add(newAttachment);
});
workHistory.attachments == null
? workHistory.attachments = attachments
: workHistory.attachments = [
...workHistory.attachments!,
...attachments
];
// workHistory.attachments == null
// ? workHistory.attachments = attachments
// : workHistory.attachments = [
// ...workHistory.attachments!,
// ...attachments
// ];
emit(WorkHistoryDevAttachmentAddedState(response: status));
} else {
emit(WorkHistoryDevAttachmentAddedState(response: status));
@ -223,31 +226,31 @@ class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
emit(WorkHistoryErrorState(message: e.toString()));
}
});
////Delete Attachment
on<DeleteWorkHistoryAttachment>((event, emit) async {
emit(WorkHistoryLoadingState());
try {
final bool success = await AttachmentServices.instance.deleteAttachment(
attachment: event.attachment,
moduleId: event.moduleId,
profileId: event.profileId.toString(),
token: event.token);
if (success) {
final WorkHistory workHistory =
workExperiences
.firstWhere((element) => element.id == event.moduleId);
workHistory.attachments
?.removeWhere((element) => element.id == event.attachment.id);
workExperiences
.removeWhere((element) => element.id == event.moduleId);
workExperiences.add(workHistory);
emit(WorkHistoryDevAttachmentDeletedState(success: success));
} else {
emit(WorkHistoryDevAttachmentDeletedState(success: success));
}
} catch (e) {
emit(WorkHistoryErrorState(message: e.toString()));
}
});
// ////Delete Attachment
// on<DeleteWorkHistoryAttachment>((event, emit) async {
// emit(WorkHistoryLoadingState());
// try {
// final bool success = await AttachmentServices.instance.deleteAttachment(
// attachment: event.attachment,
// moduleId: event.moduleId,
// profileId: event.profileId.toString(),
// token: event.token);
// if (success) {
// final WorkHistory workHistory =
// workExperiences
// .firstWhere((element) => element.id == event.moduleId);
// workHistory.attachments
// ?.removeWhere((element) => element.id == event.attachment.id);
// workExperiences
// .removeWhere((element) => element.id == event.moduleId);
// workExperiences.add(workHistory);
// emit(WorkHistoryDevAttachmentDeletedState(success: success));
// } else {
// emit(WorkHistoryDevAttachmentDeletedState(success: success));
// }
// } catch (e) {
// emit(WorkHistoryErrorState(message: e.toString()));
// }
// });
}
}

View File

@ -43,12 +43,14 @@ class DeleteWorkHistory extends WorkHistorytEvent{
class UpdateWorkHistory extends WorkHistorytEvent{
final WorkHistory workHistory;
final WorkHistory oldWorkHistory;
final String profileId;
final bool isPrivate;
final int profileId;
final String token;
const UpdateWorkHistory({required this.oldWorkHistory, required this.profileId, required this.token, required this.workHistory});
final String? actualDuties;
final String? accomplishment;
const UpdateWorkHistory({required this.profileId, required this.token, required this.workHistory, required this.accomplishment, required this.actualDuties, required this.isPrivate});
@override
List<Object> get props => [profileId,token,workHistory,oldWorkHistory];
List<Object> get props => [profileId,token,workHistory,];
}
class AddWorkHostory extends WorkHistorytEvent{
@ -56,7 +58,9 @@ class AddWorkHostory extends WorkHistorytEvent{
final bool isPrivate;
final int profileId;
final String token;
const AddWorkHostory({required this.workHistory, required this.isPrivate, required this.profileId, required this.token});
final String? actualDuties;
final String? accomplishment;
const AddWorkHostory({required this.workHistory, required this.isPrivate, required this.profileId, required this.token, required this.accomplishment, required this.actualDuties});
@override
List<Object> get props => [workHistory,profileId,token,isPrivate];
}

View File

@ -22,15 +22,15 @@ class PassCheckBloc extends Bloc<PassCheckEvent, PassCheckState> {
int? stationId;
String? cpId;
on<GetPassCheckAreas>((event, emit) async {
// try {
try {
emit(PassCheckLoadingState());
List<dynamic> response = await PassCheckServices.instance
.getPassCheckArea(roleId: event.roleId, userId: event.userId);
roleId = event.roleId;
emit(AssignAreaLoaded(assignedArea: response, roleId: roleId!));
// } catch (e) {
// emit(PassCheckErrorState(message: e.toString()));
// }
} catch (e) {
emit(PassCheckErrorState(message: e.toString()));
}
});
on<SetScannerSettings>((event, emit) {
otherInputs = event.includeOtherInputs;

View File

@ -1,75 +1,163 @@
// To parse this JSON data, do
//
// final workHistory = workHistoryFromJson(jsonString);
import 'dart:convert';
import 'package:unit2/model/utils/industry_class.dart';
import '../utils/agency.dart';
import '../utils/category.dart';
import '../utils/industry_class.dart';
import '../utils/position.dart';
import 'attachment.dart';
WorkHistory workHistoryFromJson(String str) => WorkHistory.fromJson(json.decode(str));
String workHistoryToJson(WorkHistory data) => json.encode(data.toJson());
class WorkHistory {
WorkHistory({
this.id,
this.agency,
this.sgStep,
this.toDate,
this.position,
this.fromDate,
this.attachments,
this.salaryGrade,
this.monthlySalary,
this.appointmentStatus,
});
final PositionTitle? position;
final Agency? agency;
final Supervisor? supervisor;
final int? id;
final DateTime? fromDate;
final DateTime? toDate;
final int? agencydepid;
final double? monthlysalary;
final String? statusAppointment;
final int? salarygrade;
final int? sgstep;
final List<Accomplishment>? accomplishment;
final List<ActualDuty>? actualDuties;
final int? id;
final Agency? agency;
final int? sgStep;
final DateTime? toDate;
final PositionTitle? position;
final DateTime? fromDate;
List<Attachment>? attachments;
final int? salaryGrade;
final double? monthlySalary;
final String? appointmentStatus;
WorkHistory({
required this.position,
required this.agency,
required this.supervisor,
required this.id,
required this.fromDate,
required this.toDate,
required this.agencydepid,
required this.monthlysalary,
required this.statusAppointment,
required this.salarygrade,
required this.sgstep,
required this.accomplishment,
required this.actualDuties,
});
factory WorkHistory.fromJson(Map<String, dynamic> json) => WorkHistory(
factory WorkHistory.fromJson(Map<String, dynamic> json) => WorkHistory(
position: PositionTitle.fromJson(json["position"]),
agency: json['agency'] == null?null: Agency.fromJson(json["agency"]),
supervisor: json['supervisor'] == null?null: Supervisor.fromJson(json["supervisor"]),
id: json["id"],
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
sgStep: json["sg_step"],
toDate: json["to_date"] == null ? null : DateTime.parse(json["to_date"]),
position: json["position"] == null ? null : PositionTitle.fromJson(json["position"]),
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
attachments: json['attachments'] ==null?null: List<Attachment>.from(json["attachments"].map((x) => Attachment.fromJson(x))),
salaryGrade: json["salary_grade"],
monthlySalary: json["monthly_salary"],
appointmentStatus: json["appointment_status"],
);
fromDate: json['from_date'] == null?null: DateTime.tryParse(json["from_date"]),
toDate: json['to_date'] == null?null: DateTime.tryParse(json["to_date"]),
agencydepid: json["agencydepid"],
monthlysalary: json["monthlysalary"],
statusAppointment: json["status_appointment"],
salarygrade: json["salarygrade"],
sgstep: json["sgstep"],
accomplishment:json['accomplishment'] == null?null: json['accomplishment'] == null?null: List<Accomplishment>.from(
json["accomplishment"].map((x) => Accomplishment.fromJson(x))),
actualDuties: json['actual_duties'] == null?null: List<ActualDuty>.from(
json["actual_duties"].map((x) => ActualDuty.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"id": id,
"agency": agency?.toJson(),
"sg_step": sgStep,
"to_date": "${toDate!.year.toString().padLeft(4, '0')}-${toDate!.month.toString().padLeft(2, '0')}-${toDate!.day.toString().padLeft(2, '0')}",
Map<String, dynamic> toJson() => {
"position": position?.toJson(),
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
// "attachments": attachments,
"salary_grade": salaryGrade,
"monthly_salary": monthlySalary,
"appointment_status": appointmentStatus,
};
"agency": agency?.toJson(),
"supervisor": supervisor?.toJson(),
"id": id,
"from_date":
"${fromDate?.year.toString().padLeft(4, '0')}-${fromDate?.month.toString().padLeft(2, '0')}-${fromDate?.day.toString().padLeft(2, '0')}",
"to_date": toDate,
"agencydepid": agencydepid,
"monthlysalary": monthlysalary,
"status_appointment": statusAppointment,
"salarygrade": salarygrade,
"sgstep": sgstep,
"accomplishment":
List<dynamic>.from(accomplishment!.map((x) => x.toJson())),
"actual_duties":
List<dynamic>.from(actualDuties!.map((x) => x.toJson())),
};
}
class Accomplishment {
final int? id;
final int? workExperienceId;
final String? accomplishment;
Accomplishment({
required this.id,
required this.workExperienceId,
required this.accomplishment,
});
factory Accomplishment.fromJson(Map<String, dynamic> json) => Accomplishment(
id: json["id"],
workExperienceId: json["work_experience_id"],
accomplishment: json["accomplishment"],
);
Map<String, dynamic> toJson() => {
"id": id,
"work_experience_id": workExperienceId,
"accomplishment": accomplishment,
};
}
class ActualDuty {
final int? id;
final int? workExperienceId;
final String description;
ActualDuty({
required this.id,
required this.workExperienceId,
required this.description,
});
factory ActualDuty.fromJson(Map<String, dynamic> json) => ActualDuty(
id: json["id"],
workExperienceId: json["work_experience_id"],
description: json["description"],
);
Map<String, dynamic> toJson() => {
"id": id,
"work_experience_id": workExperienceId,
"description": description,
};
}
class Supervisor {
final int? id;
final int? agencyId;
final String? lastname;
final String? firstname;
final String? middlename;
final String? stationName;
Supervisor({
required this.id,
required this.agencyId,
required this.lastname,
required this.firstname,
required this.middlename,
required this.stationName,
});
factory Supervisor.fromJson(Map<String, dynamic> json) => Supervisor(
id: json["id"],
agencyId: json["agency_id"],
lastname: json["lastname"],
firstname: json["firstname"],
middlename: json["middlename"],
stationName: json["station_name"],
);
Map<String, dynamic> toJson() => {
"id": id,
"agency_id": agencyId,
"lastname": lastname,
"firstname": firstname,
"middlename": middlename,
"station_name": stationName,
};
}

View File

@ -0,0 +1,121 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:share_plus/share_plus.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:unit2/bloc/profile/education/education_bloc.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
class EudcationViewAttachment extends StatefulWidget {
const EudcationViewAttachment({super.key});
@override
State<EudcationViewAttachment> createState() =>
_EudcationViewAttachmentState();
}
class _EudcationViewAttachmentState extends State<EudcationViewAttachment> {
@override
Widget build(BuildContext context) {
String? fileUrl;
String? filename;
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () async {
await _launchInBrowser(fileUrl!);
},
child: const Icon(Icons.file_download),
),
appBar: AppBar(
title: const Text("Attachment"),
centerTitle: true,
actions: [
IconButton(
onPressed: () {
context.read<EducationBloc>().add(
ShareAttachment(fileName: filename!, source: fileUrl!));
},
icon: const Icon(Icons.share)),
],
),
body: ProgressHUD(
padding: const EdgeInsets.all(24),
backgroundColor: Colors.black87,
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
child: BlocConsumer<EducationBloc, EducationState>(
builder: (context, state) {
if (state is EducationAttachmentViewState) {
fileUrl = state.fileUrl;
filename = state.fileName;
bool isPDF = state.fileUrl[state.fileUrl.length - 1] == 'f'
? true
: false;
return SizedBox(
child: isPDF
? SfPdfViewer.network(
state.fileUrl,
onDocumentLoadFailed: (details) {
Center(
child: Text(details.description),
);
},
)
: Center(
child: CachedNetworkImage(
progressIndicatorBuilder: (context, url, progress) {
return const SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(
color: primary,
));
},
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider, fit: BoxFit.fill)),
),
imageUrl: state.fileUrl,
width: double.infinity,
height: 220,
fit: BoxFit.cover,
),
),
);
}
return Container();
},
listener: (context, state) {
if (state is EducationalBackgroundLoadingState) {
final progress = ProgressHUD.of(context);
progress!.showWithText("Please wait...");
}
if (state is EducationAttachmentViewState) {
final progress = ProgressHUD.of(context);
progress!.dismiss();
}
},
),
));
}
Future<void> _launchInBrowser(String url) async {
final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
if (!await launcher.launch(
url,
useSafariVC: false,
useWebView: false,
enableJavaScript: false,
enableDomStorage: false,
universalLinksOnly: false,
headers: <String, String>{},
)) {
throw Exception('Could not launch $url');
}
}
}

View File

@ -11,6 +11,7 @@ import 'package:unit2/bloc/profile/profile_bloc.dart';
import 'package:unit2/bloc/user/user_bloc.dart';
import 'package:unit2/model/profile/educational_background.dart';
import 'package:unit2/screens/profile/components/education/add_modal.dart';
import 'package:unit2/screens/profile/shared/view_attachment.dart';
import 'package:unit2/theme-data.dart/box_shadow.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/widgets/Leadings/add_leading.dart';
@ -26,6 +27,7 @@ import '../../../widgets/Leadings/close_leading.dart';
import '../shared/multiple_attachment.dart';
import '../shared/single_attachment.dart';
import 'education/edit_modal.dart';
import 'education/education_view_attachment.dart';
class EducationScreen extends StatelessWidget {
const EducationScreen({super.key});
@ -321,12 +323,12 @@ class EducationScreen extends StatelessWidget {
Column(
children: honors
.map((Honor honor) => Padding(
padding: const EdgeInsets.all(3.0),
child: Text(
padding: const EdgeInsets.all(3.0),
child: Text(
"-${honor.name!.trim()}",
style: Theme.of(context).textTheme.labelSmall,
),
))
))
.toList(),
),
],
@ -696,6 +698,15 @@ class EducationScreen extends StatelessWidget {
children: [
const Divider(),
SingleAttachment(
view: () {
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) => BlocProvider.value(
value: EducationBloc()..add(EducationViewAttachment(source: state.educationalBackground[index].attachments!.first.source!,fileName: state.educationalBackground[index].attachments!.first.filename!)),
child: const EudcationViewAttachment(),
))));
},
onpressed:
() {
confirmAlert(
@ -728,6 +739,17 @@ class EducationScreen extends StatelessWidget {
)
////Multiple Attachments View
: MultipleAttachments(
viewAttachment:
(source,filname) {
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) =>
BlocProvider.value(
value: EducationBloc()..add(EducationViewAttachment(source: source,fileName: filname)),
child: const EudcationViewAttachment(),
))));
},
profileId:
profileId,
token: token!,

View File

@ -0,0 +1,73 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:unit2/bloc/profile/education/education_bloc.dart';
import 'package:unit2/bloc/profile/eligibility/eligibility_bloc.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../../utils/urls.dart';
class EligibilityViewAttachment extends StatefulWidget {
const EligibilityViewAttachment({super.key});
@override
State<EligibilityViewAttachment> createState() => _EligibilityViewAttachmentState();
}
class _EligibilityViewAttachmentState extends State<EligibilityViewAttachment> {
@override
Widget build(BuildContext context) {
String? fileUrl;
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: ()async {
await launchUrl(Uri.parse(fileUrl!));
},
child: const Icon(Icons.file_download),
),
appBar: AppBar(
title: const Text("Attachment"),
centerTitle: true,
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.share)),
],
),
body: BlocConsumer<EligibilityBloc, EligibilityState>(builder: (context,state){
if(state is EligibilityAttachmentViewState){
fileUrl = state.fileUrl;
bool isPDF = state.fileUrl[state.fileUrl.length - 1] == 'f' ? true : false;
return SizedBox(
child: isPDF?SfPdfViewer.network(
state.fileUrl,onDocumentLoadFailed: (details) {
Center(child: Text(details.description),);
},): Center(
child: CachedNetworkImage(
progressIndicatorBuilder: (context, url, progress) {
return const SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(color: primary,));
},
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider, fit: BoxFit.fill)),
),
imageUrl:
state.fileUrl,
width: double.infinity,
height: 220,
fit: BoxFit.cover,
),
),
);
}
return Container();
},listener: (context, state) {
},)
);
}
}

View File

@ -28,6 +28,8 @@ import '../../../bloc/profile/eligibility/eligibility_bloc.dart';
import '../../../utils/alerts.dart';
import '../shared/multiple_attachment.dart';
import '../shared/single_attachment.dart';
import '../shared/view_attachment.dart';
import 'eligibility/eligibility_view_attachment.dart';
class EligibiltyScreen extends StatelessWidget {
const EligibiltyScreen({super.key});
@ -629,6 +631,17 @@ class EligibiltyScreen extends StatelessWidget {
?
////Single Attachment view
SingleAttachment(
view: (){
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) => BlocProvider.value(
value: EligibilityBloc()..add(EligibiltyViewAttachmentEvent(source: state.eligibilities[index].attachments!.first.source!)),
child: const EligibilityViewAttachment(),
))));
},
onpressed:
() {
confirmAlert(
@ -660,6 +673,15 @@ class EligibiltyScreen extends StatelessWidget {
)
////Multiple Attachments View
: MultipleAttachments(
viewAttachment: (source,filename) {
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) => BlocProvider.value(
value: EligibilityBloc()..add(EligibiltyViewAttachmentEvent(source: source)),
child: const EligibilityViewAttachment(),
))));
},
profileId:
profileId!,
token: token!,

View File

@ -12,6 +12,7 @@ import 'package:intl/intl.dart';
import 'package:unit2/bloc/profile/profile_bloc.dart';
import 'package:unit2/bloc/user/user_bloc.dart';
import 'package:unit2/screens/profile/components/learning_development/edit_modal.dart';
import 'package:unit2/screens/profile/components/learning_development/learning_development_view_attachment.dart';
import 'package:unit2/theme-data.dart/box_shadow.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/utils/global.dart';
@ -27,6 +28,7 @@ import '../../../utils/alerts.dart';
import '../../../widgets/Leadings/close_leading.dart';
import '../shared/multiple_attachment.dart';
import '../shared/single_attachment.dart';
import '../shared/view_attachment.dart';
import 'learning_development/add_modal.dart';
class LearningAndDevelopmentScreen extends StatelessWidget {
@ -673,6 +675,15 @@ class LearningAndDevelopmentScreen extends StatelessWidget {
?
////Single Attachment view
SingleAttachment(
view: (){
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) => BlocProvider.value(
value: LearningDevelopmentBloc()..add(LearningDevelopmentViewAttachmentEvent(source: state.learningsAndDevelopment[index].attachments!.first.source!)),
child: const LearningDevelopmentViewAttachment(),
))));
},
onpressed: () {
confirmAlert(
context,
@ -703,6 +714,17 @@ class LearningAndDevelopmentScreen extends StatelessWidget {
)
////Multiple Attachments View
: MultipleAttachments(
viewAttachment:
(source,filename) {
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) =>
BlocProvider.value(
value: LearningDevelopmentBloc()..add(LearningDevelopmentViewAttachmentEvent(source: source)),
child: const LearningDevelopmentViewAttachment(),
))));
},
profileId:
profileId,
token: token,

View File

@ -0,0 +1,71 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:unit2/bloc/profile/learningDevelopment/learning_development_bloc.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:url_launcher/url_launcher.dart';
class LearningDevelopmentViewAttachment extends StatefulWidget {
const LearningDevelopmentViewAttachment({super.key});
@override
State<LearningDevelopmentViewAttachment> createState() => _LearningDevelopmentViewAttachmentState();
}
class _LearningDevelopmentViewAttachmentState extends State<LearningDevelopmentViewAttachment> {
@override
Widget build(BuildContext context) {
String? fileUrl;
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: ()async {
await launchUrl(Uri.parse(fileUrl!));
},
child: const Icon(Icons.file_download),
),
appBar: AppBar(
title: const Text("Attachment"),
centerTitle: true,
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.share)),
],
),
body: BlocConsumer<LearningDevelopmentBloc, LearningDevelopmentState>(builder: (context,state){
if(state is LearningAndDevelopmentAttachmentViewState){
fileUrl = state.fileUrl;
bool isPDF = state.fileUrl[state.fileUrl.length - 1] == 'f' ? true : false;
return SizedBox(
child: isPDF?SfPdfViewer.network(
state.fileUrl,onDocumentLoadFailed: (details) {
Center(child: Text(details.description),);
},): Center(
child: CachedNetworkImage(
progressIndicatorBuilder: (context, url, progress) {
return const SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(color: primary,));
},
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider, fit: BoxFit.fill)),
),
imageUrl:
state.fileUrl,
width: double.infinity,
height: 220,
fit: BoxFit.cover,
),
),
);
}
return Container();
},listener: (context, state) {
},)
);
}
}

View File

@ -14,7 +14,7 @@ import 'package:unit2/model/utils/category.dart';
import 'package:unit2/theme-data.dart/box_shadow.dart';
import 'package:unit2/theme-data.dart/btn-style.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/theme-data.dart/form-style.dart';
import 'package:unit2/theme-data.dart/form-style.dart';
import 'package:unit2/utils/global.dart';
import 'package:unit2/utils/text_container.dart';
import 'package:unit2/utils/validators.dart';
@ -45,6 +45,12 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
String? salary;
String? salaryGrade;
String? salaryGradeStep;
String? accomplishment;
String? duties;
String? sFname;
String? sLname;
String? sMname;
String? sOffice;
bool showAgency = false;
bool showSalaryGradeAndSalaryStep = false;
bool? isPrivate = false;
@ -67,7 +73,9 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
@override
Widget build(BuildContext context) {
return BlocConsumer<WorkHistoryBloc, WorkHistoryState>(
listener: (context, state) {
if (state is AddWorkHistoryState) {
final progress = ProgressHUD.of(context);
@ -77,15 +85,14 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
if (state is AddWorkHistoryState) {
return FormBuilder(
key: _formKey,
child: SizedBox(
height: blockSizeVertical * 90,
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 32, horizontal: 28),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Flexible(
child: ListView(
children: [
////POSITIONS
StatefulBuilder(builder: (context, setState) {
return SearchField(
@ -93,18 +100,18 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
itemHeight: 70,
suggestionsDecoration: box1(),
suggestions: state.agencyPositions
.map((PositionTitle position) => SearchFieldListItem(
position.title!,
item: position,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10),
child: ListTile(
title: Text(
position.title!,
overflow: TextOverflow.visible,
),
))))
.map((PositionTitle position) =>
SearchFieldListItem(position.title!,
item: position,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10),
child: ListTile(
title: Text(
position.title!,
overflow: TextOverflow.visible,
),
))))
.toList(),
focusNode: positionFocusNode,
searchInputDecoration:
@ -127,11 +134,12 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
controller: addPositionController,
onpressed: () {
setState(() {
PositionTitle newAgencyPosition = PositionTitle(
id: null,
title: addPositionController.text
.toUpperCase());
PositionTitle newAgencyPosition =
PositionTitle(
id: null,
title: addPositionController.text
.toUpperCase());
state.agencyPositions
.insert(0, newAgencyPosition);
selectedPosition = newAgencyPosition;
@ -170,7 +178,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
},
onSuggestionTap: (status) {
selectedStatus = status.item;
appointmentStatusNode.unfocus();
},
searchInputDecoration:
@ -182,7 +190,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
appointmentStatusNode.unfocus();
},
))),
const SizedBox(
height: 12,
),
@ -226,7 +234,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
onSuggestionTap: (agency) {
setState(() {
selectedAgency = agency.item;
if (selectedAgency!.privateEntity ==
null) {
showIsPrivateRadio = true;
@ -260,19 +268,19 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
.toUpperCase(),
category: null,
privateEntity: null);
state.agencies.insert(0, newAgency);
selectedAgency = newAgency;
addAgencyController.text = "";
showAgency = true;
showIsPrivateRadio = true;
Navigator.pop(context);
});
},
title: "Add Agency")),
SizedBox(
height: showAgency ? 12 : 0,
),
@ -335,7 +343,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
)
: const SizedBox(),
),
////PRVIATE SECTOR
SizedBox(
child: showIsPrivateRadio
@ -356,7 +364,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
],
),
),
////onvhange private sector
onChanged: (value) {
setState(() {
@ -381,7 +389,7 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
agencyCategoryFocusNode.unfocus();
});
},
name: 'isPrivate',
validator:
FormBuilderValidators.required(),
@ -476,21 +484,80 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
const SizedBox(
height: 12,
),
////MONTHLY SALARY
//// NAME OF OFFICE UNIT
FormBuilderTextField(
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
salary = value;
});
onChanged: (value){
sOffice = value;
},
validator: numericRequired,
name: "salary",
decoration:
normalTextFieldStyle("Monthly Salary *", "")
.copyWith(prefix: const Text("")),
validator: FormBuilderValidators.required(
errorText: "This field is required"),
name: 'office',
decoration: normalTextFieldStyle(
"Name of Office/Unit", "Name of Office/Unit"),
),
const SizedBox(
height: 12,
),
////MONTHLY SALARY
StatefulBuilder(builder: (context, setState) {
return FormBuilderTextField(
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
salary = value;
});
},
validator: numericRequired,
name: "salary",
decoration:
normalTextFieldStyle("Monthly Salary *", "")
.copyWith(prefix: const Text("")),
);
}),
const SizedBox(
height: 12,
),
const Text("Immediate SuperVisor"),
const SizedBox(
height: 12,
),
////IMMEDIATE SUPERVISOR
FormBuilderTextField(
onChanged: (value){
sFname = value;
},
validator: FormBuilderValidators.required(
errorText: "This field is required"),
name: 'supervisor_firstname',
decoration:
normalTextFieldStyle("First name", "First Name"),
),
const SizedBox(
height: 12,
),
FormBuilderTextField(
onChanged: (value){
sMname = value;
},
name: 'supervisor_middlename',
decoration: normalTextFieldStyle(
"Middle name", "Middle Name"),
),
const SizedBox(
height: 12,
),
FormBuilderTextField(
onChanged: (value){
sLname = value;
},
validator: FormBuilderValidators.required(
errorText: "This field is required"),
name: 'supervisor_lastname',
decoration:
normalTextFieldStyle("Last name", "Last Name"),
),
const SizedBox(
height: 12,
),
@ -595,12 +662,11 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
}
return true;
},
onChanged: (value) {
setState(() {
to =
DateTime.parse(value);
});
},
onChanged: (value) {
setState(() {
to = DateTime.parse(value);
});
},
initialDate: from == null
? DateTime.now()
: from!.add(
@ -624,8 +690,40 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
],
);
}),
],
),
const Text("Work Experience"),
const SizedBox(
height: 8,
),
FormBuilderTextField(
onChanged: (value){
accomplishment = value;
},
name: "accomplishment",
decoration: normalTextFieldStyle(
"List of Accomplishment and Contribution",
"",
),
),
const SizedBox(
height: 12,
),
FormBuilderTextField(
onChanged: (value){
duties = value;
},
validator: FormBuilderValidators.required(
errorText: "This field is required"),
name: "summary",
decoration: normalTextFieldStyle(
"Summary of Actual Duties",
"",
),
),
const SizedBox(
height: 20,
),
////SUBMIT BUTTON
SizedBox(
@ -635,11 +733,24 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
style:
mainBtnStyle(primary, Colors.transparent, second),
onPressed: () {
print(selectedStatus?.value);
print(salaryGrade);
print(salaryGradeStep);
if (_formKey.currentState!.validate()) {
final progress = ProgressHUD.of(context);
progress!.showWithText("Loading...");
WorkHistory workHistory = WorkHistory(
accomplishment: null,
actualDuties: null,
agencydepid: null,
supervisor: Supervisor(
agencyId: selectedAgency?.id,
id: null,
lastname: sLname,
firstname: sFname,
middlename: sMname,
stationName: sOffice),
position: selectedPosition,
id: null,
agency: selectedAgency,
@ -651,15 +762,17 @@ class _AddWorkHistoryScreenState extends State<AddWorkHistoryScreen> {
"PRESENT"
? null
: DateTime.parse(toDateController.text),
salaryGrade: salaryGrade == null
salarygrade: salaryGrade == null
? null
: int.parse(salaryGrade!),
sgStep: salaryGradeStep == null
sgstep: salaryGradeStep == null
? null
: int.parse(salaryGradeStep!),
monthlySalary: double.parse(salary!),
appointmentStatus: selectedStatus!.value);
monthlysalary: double.parse(salary!),
statusAppointment: selectedStatus!.value);
context.read<WorkHistoryBloc>().add(AddWorkHostory(
accomplishment: accomplishment,
actualDuties: duties,
workHistory: workHistory,
profileId: widget.profileId,
token: widget.token,

View File

@ -81,7 +81,7 @@ class _EditWorkHistoryScreenState extends State<EditWorkHistoryScreen> {
if (state is EditWorkHistoryState) {
oldPositionController.text = state.workHistory.position!.title!;
oldAppointmentStatusController.text =
state.workHistory.appointmentStatus!;
state.workHistory.statusAppointment!;
oldAgencyController.text = state.workHistory.agency!.name!;
currentlyEmployed = state.workHistory.toDate == null ? true : false;
showSalaryGradeAndSalaryStep =
@ -428,7 +428,7 @@ class _EditWorkHistoryScreenState extends State<EditWorkHistoryScreen> {
child: FormBuilderTextField(
initialValue: state
.workHistory
.salaryGrade
.salarygrade
?.toString(),
name: 'salary_grade',
keyboardType:
@ -452,7 +452,7 @@ class _EditWorkHistoryScreenState extends State<EditWorkHistoryScreen> {
flex: 1,
child: FormBuilderTextField(
initialValue: state
.workHistory.sgStep
.workHistory.sgstep
?.toString(),
name: 'salary_step',
keyboardType:
@ -482,7 +482,7 @@ class _EditWorkHistoryScreenState extends State<EditWorkHistoryScreen> {
////MONTHLY SALARY
FormBuilderTextField(
initialValue:
state.workHistory.monthlySalary.toString(),
state.workHistory.monthlysalary.toString(),
onChanged: (value) {
setState(() {
salary = value;
@ -654,50 +654,50 @@ class _EditWorkHistoryScreenState extends State<EditWorkHistoryScreen> {
style:
mainBtnStyle(primary, Colors.transparent, second),
onPressed: () {
if (_formKey.currentState!.saveAndValidate()) {
final progress = ProgressHUD.of(context);
progress!.showWithText("Loading...");
salary = _formKey.currentState!.value['salary'];
selectedPosition ??= state.workHistory.position;
salaryGrade =
_formKey.currentState!.value['salary_grade'];
salaryGradeStep =
_formKey.currentState!.value['salary_step'];
selectedAgency ??= state.workHistory.agency;
// if (_formKey.currentState!.saveAndValidate()) {
// final progress = ProgressHUD.of(context);
// progress!.showWithText("Loading...");
// salary = _formKey.currentState!.value['salary'];
// selectedPosition ??= state.workHistory.position;
// salaryGrade =
// _formKey.currentState!.value['salary_grade'];
// salaryGradeStep =
// _formKey.currentState!.value['salary_step'];
// selectedAgency ??= state.workHistory.agency;
selectedStatus ??= AppoinemtStatus(
value: state.workHistory.appointmentStatus!,
label: state.workHistory.appointmentStatus!);
WorkHistory newWorkHistory = WorkHistory(
id: state.workHistory.id,
position: selectedPosition,
agency: selectedAgency,
fromDate: fromDateController.text.isEmpty
? null
: DateTime.parse(fromDateController.text),
toDate: toDateController.text.isEmpty ||
toDateController.text.toUpperCase() ==
"PRESENT" ||
toDateController.text.toLowerCase() ==
'null'
? null
: DateTime.parse(toDateController.text),
monthlySalary: double.parse(salary!),
appointmentStatus: selectedStatus!.value,
salaryGrade: salaryGrade == null
? null
: int.parse(salaryGrade!),
sgStep: salaryGradeStep == null
? null
: int.parse(salaryGradeStep!),
);
context.read<WorkHistoryBloc>().add(
UpdateWorkHistory(
oldWorkHistory: state.workHistory,
profileId: widget.profileId.toString(),
token: widget.token,
workHistory: newWorkHistory));
}
// selectedStatus ??= AppoinemtStatus(
// value: state.workHistory.statusAppointment!,
// label: state.workHistory.statusAppointment!);
// WorkHistory newWorkHistory = WorkHistory(
// id: state.workHistory.id,
// position: selectedPosition,
// agency: selectedAgency,
// fromDate: fromDateController.text.isEmpty
// ? null
// : DateTime.parse(fromDateController.text),
// toDate: toDateController.text.isEmpty ||
// toDateController.text.toUpperCase() ==
// "PRESENT" ||
// toDateController.text.toLowerCase() ==
// 'null'
// ? null
// : DateTime.parse(toDateController.text),
// monthlySalary: double.parse(salary!),
// appointmentStatus: selectedStatus!.value,
// salaryGrade: salaryGrade == null
// ? null
// : int.parse(salaryGrade!),
// sgStep: salaryGradeStep == null
// ? null
// : int.parse(salaryGradeStep!),
// );
// context.read<WorkHistoryBloc>().add(
// UpdateWorkHistory(
// oldWorkHistory: state.workHistory,
// profileId: widget.profileId.toString(),
// token: widget.token,
// workHistory: newWorkHistory));
// }
},
child: const Text(submit)),
),

View File

@ -44,7 +44,7 @@ class WorkHistoryScreen extends StatelessWidget {
AttachmentCategory? selectedAttachmentCategory;
List<AttachmentCategory> attachmentCategories = [];
return Scaffold(
resizeToAvoidBottomInset: false,
resizeToAvoidBottomInset: true,
appBar: AppBar(
title: context.watch<WorkHistoryBloc>().state is AddWorkHistoryState
? const FittedBox(child: Text("Add Work History"))
@ -623,87 +623,87 @@ class WorkHistoryScreen extends StatelessWidget {
]),
const Divider(),
////Show Attachments
SizedBox(
child: state
.workExperiences[
index]
.attachments ==
null ||
state
.workExperiences[
index]
.attachments!
.isEmpty
? const SizedBox()
: state
.workExperiences[
index]
.attachments !=
null &&
state
.workExperiences[
index]
.attachments!
.length ==
1
?
////Single Attachment view
SingleAttachment(
onpressed: () {
confirmAlert(
context,
() {
parent.read<WorkHistoryBloc>().add(DeleteWorkHistoryAttachment(
attachment: state
.workExperiences[
index]
.attachments!
.first,
moduleId: state
.workExperiences[
index]
.id!,
profileId:
profileId!,
token:
token!));
}, "Delete?",
"Confirm Delete?");
},
attachment: state
.workExperiences[
index]
.attachments!
.first,
)
////Multiple Attachments View
: MultipleAttachments(
profileId:
profileId!,
token: token!,
moduleId: state
.workExperiences[
index]
.id!,
educationBloc:
null,
workHistoryBloc:
BlocProvider.of<WorkHistoryBloc>(context),
eligibilityBloc:
null,
learningDevelopmentBloc:
null,
blocId: 3,
eligibilityName: state
.workExperiences[
index]
.position!
.title!,
attachments: state
.workExperiences[
index]
.attachments!,
))
// SizedBox(
// child: state
// .workExperiences[
// index]
// .attachments ==
// null ||
// state
// .workExperiences[
// index]
// .attachments!
// .isEmpty
// ? const SizedBox()
// : state
// .workExperiences[
// index]
// .attachments !=
// null &&
// state
// .workExperiences[
// index]
// .attachments!
// .length ==
// 1
// ?
// ////Single Attachment view
// SingleAttachment(
// onpressed: () {
// confirmAlert(
// context,
// () {
// parent.read<WorkHistoryBloc>().add(DeleteWorkHistoryAttachment(
// attachment: state
// .workExperiences[
// index]
// .attachments!
// .first,
// moduleId: state
// .workExperiences[
// index]
// .id!,
// profileId:
// profileId!,
// token:
// token!));
// }, "Delete?",
// "Confirm Delete?");
// },
// attachment: state
// .workExperiences[
// index]
// .attachments!
// .first,
// )
// ////Multiple Attachments View
// : MultipleAttachments(
// profileId:
// profileId!,
// token: token!,
// moduleId: state
// .workExperiences[
// index]
// .id!,
// educationBloc:
// null,
// workHistoryBloc:
// BlocProvider.of<WorkHistoryBloc>(context),
// eligibilityBloc:
// null,
// learningDevelopmentBloc:
// null,
// blocId: 3,
// eligibilityName: state
// .workExperiences[
// index]
// .position!
// .title!,
// attachments: state
// .workExperiences[
// index]
// .attachments!,
// ))
],
),
),

View File

@ -7,6 +7,7 @@ import 'package:unit2/bloc/profile/education/education_bloc.dart';
import 'package:unit2/bloc/profile/eligibility/eligibility_bloc.dart';
import 'package:unit2/bloc/profile/learningDevelopment/learning_development_bloc.dart';
import 'package:unit2/bloc/profile/workHistory/workHistory_bloc.dart';
import 'package:unit2/screens/profile/shared/view_attachment.dart';
import 'package:unit2/utils/global_context.dart';
import '../../../model/profile/attachment.dart';
@ -16,6 +17,7 @@ import '../../../utils/alerts.dart';
import '../../../utils/global.dart';
class MultipleAttachments extends StatelessWidget {
final Function(String source, String fileName) viewAttachment;
final List<Attachment> attachments;
final String eligibilityName;
final EducationBloc? educationBloc;
@ -28,6 +30,7 @@ class MultipleAttachments extends StatelessWidget {
final String token;
const MultipleAttachments(
{super.key,
required this.viewAttachment,
required this.blocId,
required this.educationBloc,
required this.eligibilityBloc,
@ -128,9 +131,14 @@ class MultipleAttachments extends StatelessWidget {
flex: 4,
child: Tooltip(
message: e.filename,
child: Text(
e.filename!,
overflow: TextOverflow.ellipsis,
child: GestureDetector(
onTap: (){
viewAttachment(e.source!,e.filename!);
},
child: Text(
e.filename!,
overflow: TextOverflow.ellipsis,
),
)),
),
const SizedBox(

View File

@ -10,9 +10,11 @@ import '../../../utils/alerts.dart';
class SingleAttachment extends StatelessWidget {
final Function()? onpressed;
final Attachment attachment;
final Function()? view;
const SingleAttachment({
required this.attachment,
required this.onpressed,
required this.view,
super.key,
});
@ -32,11 +34,14 @@ class SingleAttachment extends StatelessWidget {
children: [
Expanded(
child:
AutoSizeText(
attachment.filename!,
wrapWords: false,
maxLines: 1,
),
GestureDetector(
onTap: view,
child: AutoSizeText(
attachment.filename!,
wrapWords: false,
maxLines: 1,
),
),
),
const SizedBox(
width:

View File

@ -0,0 +1,62 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/widgets/error_state.dart';
import '../../../utils/urls.dart';
class ImageAttachment extends StatefulWidget {
final String imgUrl;
const ImageAttachment({super.key, required this.imgUrl});
@override
State<ImageAttachment> createState() => _ImageAttachmentState();
}
class _ImageAttachmentState extends State<ImageAttachment> {
@override
Widget build(BuildContext context) {
bool isPDF = widget.imgUrl[widget.imgUrl.length - 1] == 'f' ? true : false;
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.file_download),
),
appBar: AppBar(
title: const Text("Attachment"),
centerTitle: true,
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.share)),
],
),
body: isPDF
? SfPdfViewer.network(
'${Url.instance.prefixHost()}://${Url.instance.host()}${widget.imgUrl}',onDocumentLoadFailed: (details) {
Center(child: Text(details.description),);
},)
: Center(
child: CachedNetworkImage(
progressIndicatorBuilder: (context, url, progress) {
return const SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(color: primary,));
},
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider, fit: BoxFit.fill)),
),
imageUrl:
'${Url.instance.prefixHost()}://${Url.instance.host()}${widget.imgUrl}',
width: double.infinity,
height: 220,
fit: BoxFit.cover,
),
),
);
}
}

View File

@ -32,6 +32,7 @@ class RbacRoleAssignment extends StatelessWidget {
List<ValueItem> selectedValueItemRoles = [];
return Scaffold(
appBar: AppBar(
elevation: 0,
centerTitle: true,
backgroundColor: primary,
title: const Text("User Roles Screenss"),

View File

@ -8,13 +8,10 @@ import 'package:unit2/screens/unit2/homepage.dart/components/dashboard/superadmi
import 'package:unit2/screens/unit2/homepage.dart/module-screen.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/theme-data.dart/form-style.dart';
import '../../../../../bloc/rbac/rbac_operations/agency/agency_bloc.dart';
import '../../../../../bloc/role/pass_check/est_point_person/assign_area/assign_area_agency_bloc.dart';
import '../../../../../bloc/role/pass_check/est_point_person/est_point_person_assignable/est_point_person_assinable_role_bloc.dart';
import '../../../../../bloc/role/pass_check/est_point_person/est_point_person_role_assignment/est_role_assignment_bloc.dart';
import '../../../../../bloc/role/pass_check/est_point_person/est_point_person_station/est_point_person_station_bloc.dart';
import '../../../../../sevices/roles/est_point_person/est_point_person_role_assignment_services.dart';
import '../../../../superadmin/agency/agency_screen.dart';
import '../../../roles/establishment_point_person/est_point_person_agecies.dart';
import '../../../roles/establishment_point_person/est_point_person_role_member_screen.dart';
import '../../../roles/establishment_point_person/est_point_person_role_under_screen.dart';
@ -71,7 +68,9 @@ class _DashBoardState extends State<DashBoard> {
docSmsCards.add(e);
}
});
unit2Cards.forEach((element) {
print("${element.moduleName} - ${element.object.name!} - ${element.roleName} " );
});
if (superadminCards.length > 3) {
tempSuperAdminCards = superadminCards.sublist(0, 4);
}
@ -85,6 +84,7 @@ class _DashBoardState extends State<DashBoard> {
child: ListView(
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
////unit2 module operations
@ -107,7 +107,7 @@ class _DashBoardState extends State<DashBoard> {
),
Container(
child: unit2Cards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
@ -185,7 +185,7 @@ class _DashBoardState extends State<DashBoard> {
child:
FadeInAnimation(
child: Container(
child: (e.roleName == 'superadmin' || e.roleName == 'qr code scanner' || e.roleName == 'security guard' || e.roleName == 'establishment point-person' || e.roleName == 'registration in-charge') && e.moduleName == 'unit2'
child: (e.roleName == 'qr code scanner' || e.roleName == 'security guard' || e.roleName == 'establishment point-person' || e.roleName == 'registration in-charge') && e.moduleName == 'unit2'
? CardLabel(
icon: iconGenerator(name: e.object.name!),
title: e.object.name!.toLowerCase() == 'role based access control'
@ -195,7 +195,7 @@ class _DashBoardState extends State<DashBoard> {
: e.object.name!,
ontap: () {
if (e.object.name!.toLowerCase() == 'pass check') {
PassCheckArguments passCheckArguments = PassCheckArguments(roleId: 10, userId: widget.userId);
PassCheckArguments passCheckArguments = PassCheckArguments(roleId: e.roleId, userId: widget.userId);
Navigator.pushNamed(context, '/pass-check', arguments: passCheckArguments);
}
if (e.object.name!.toLowerCase() == 'role based access control') {
@ -210,19 +210,22 @@ class _DashBoardState extends State<DashBoard> {
}));
}
if (e.object.name!.toLowerCase() == "role member") {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
return BlocProvider<EstRoleAssignmentBloc>(
create: (context) => EstRoleAssignmentBloc()..add(GetEstPointPersonRolesUnder(userId: widget.userId)),
child: EstPointPersonRoleAssignmentScreen(id: widget.userId,),
child: EstPointPersonRoleAssignmentScreen(
id: widget.userId,
),
);
}));
}
if (e.object.name!.toLowerCase() == 'assignable role') {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
return BlocProvider<EstPointPersonAssinableRoleBloc>(
create: (context) => EstPointPersonAssinableRoleBloc()..add(const GetEstPointPersonAssignableRoles(roleId: 16)),
child: EstPointPersonRoleUnderScreen(id: widget.userId,),
child: EstPointPersonRoleUnderScreen(
id: widget.userId,
),
);
}));
}
@ -421,11 +424,11 @@ class _DashBoardState extends State<DashBoard> {
),
),
SizedBox(
height: unit2Cards.isEmpty ? 0 : 24,
height: superadminCards.isEmpty ? 0 : 24,
),
Container(
child: superadminCards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: Text(
"Superadmin module operations",
style: Theme.of(context)
@ -442,7 +445,7 @@ class _DashBoardState extends State<DashBoard> {
),
Container(
child: superadminCards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
@ -602,12 +605,12 @@ class _DashBoardState extends State<DashBoard> {
columnCount: 4,
));
}).toList())),
const SizedBox(
height: 24,
SizedBox(
height: rpassCards.isEmpty?0: 24,
),
Container(
child: rpassCards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: Text(
"RPAss module operations",
style: Theme.of(context)
@ -624,7 +627,7 @@ class _DashBoardState extends State<DashBoard> {
),
Container(
child: rpassCards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
@ -649,12 +652,12 @@ class _DashBoardState extends State<DashBoard> {
}).toList(),
),
),
const SizedBox(
height: 24,
SizedBox(
height: docSmsCards.isEmpty?0: 24,
),
Container(
child: docSmsCards.isEmpty
? const SizedBox()
? const SizedBox.shrink()
: Text(
"DocSMS module operations",
style: Theme.of(context)

View File

@ -77,7 +77,9 @@ class SuperAdminMenu extends StatelessWidget {
title:
object.object.name!,
ontap: () {
if (object.object.name == 'Role') {
Navigator.push(context, MaterialPageRoute(
builder: (BuildContext context) {
return BlocProvider(

View File

@ -43,6 +43,7 @@ class _MainScreenState extends State<MainScreen> {
for (var module in role.modules!) {
for (var object in module!.objects!) {
DisplayCard newCard = DisplayCard(
roleId: role.id!,
moduleName: module.name!.toLowerCase(),
object: object!,
roleName: role.name!.toLowerCase());
@ -91,8 +92,9 @@ class DisplayCard {
final String roleName;
final String moduleName;
final ModuleObject object;
final int roleId;
const DisplayCard(
{required this.moduleName, required this.object, required this.roleName});
{required this.moduleName, required this.object, required this.roleName,required this.roleId});
}
class Module {

View File

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:intl/intl.dart';
import 'package:unit2/model/profile/work_history.dart';
import 'package:http/http.dart' as http;
import 'package:unit2/model/utils/agency_position.dart';
@ -48,17 +49,17 @@ class WorkHistoryService {
bool? success;
Map<String, dynamic> params = {"force_mode": "true"};
String authToken = "Token $token";
String path = "${Url.instance.workhistory()}$profileId/";
String path = "${Url.instance.deleteWorkHistory()}$profileId/";
Map body = {
"id": work.id,
"position_id": work.position!.id,
"agency_id": work.agency!.id,
"from_date": work.fromDate?.toString(),
"to_date": work.toDate?.toString(),
"monthly_salary": work.monthlySalary,
"appointment_status": work.appointmentStatus,
"salary_step": work.sgStep,
"salary_grade": work.salaryGrade,
// "monthly_salary": work.monthlysalary,
// "appointment_status": work.statusAppointment,
// "salary_step": work.sgstep,
// "salary_grade": work.salarygrade,
};
Map<String, String> headers = {
'Content-Type': 'application/json; charset=UTF-8',
@ -82,85 +83,212 @@ class WorkHistoryService {
////edit work history
Future<Map<dynamic,dynamic>> update({required WorkHistory oldWorkHistory, required WorkHistory newWorkHistory, required String token, required String profileId})async{
Map<dynamic, dynamic>? statusResponse={};
String authtoken = "Token $token";
String path = '${Url.instance.workhistory()}$profileId/';
Map<String, String> headers = {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': authtoken
};
Map body = {
"id":newWorkHistory.id,
"position_id":newWorkHistory.position!.id,
"agency_id":newWorkHistory.agency!.id,
"from_date":newWorkHistory.fromDate?.toString(),
"to_date":newWorkHistory.toDate?.toString(),
"monthly_salary":newWorkHistory.monthlySalary,
"appointment_status":newWorkHistory.appointmentStatus,
"salary_grade":newWorkHistory.salaryGrade,
"sg_step":newWorkHistory.sgStep,
"_positionName":newWorkHistory.position!.title!,
"_agencyName":newWorkHistory.agency!.name!,
"_agencyCatId":newWorkHistory.agency!.category!.id!,
"_privateEntity":newWorkHistory.agency!.privateEntity,
"oldPosId":oldWorkHistory.position!.id,
"_oldAgencyId":oldWorkHistory.agency!.id,
"oldFromDate":oldWorkHistory.fromDate?.toString(),
};
try{
http.Response response = await Request.instance.putRequest(path: path, headers: headers, body: body, param: {});
if(response.statusCode == 200 ){
Map data = jsonDecode(response.body);
statusResponse = data;
}else{
statusResponse.addAll({'success':false});
}
return statusResponse;
}catch(e){
throw e.toString();
}
}
// Future<Map<dynamic,dynamic>> update({required WorkHistory oldWorkHistory, required WorkHistory newWorkHistory, required String token, required String profileId})async{
// Map<dynamic, dynamic>? statusResponse={};
// String authtoken = "Token $token";
// String path = '${Url.instance.workhistory()}$profileId/';
// Map<String, String> headers = {
// 'Content-Type': 'application/json; charset=UTF-8',
// 'Authorization': authtoken
// };
// Map body = {
// "id":newWorkHistory.id,
// "position_id":newWorkHistory.position!.id,
// "agency_id":newWorkHistory.agency!.id,
// "from_date":newWorkHistory.fromDate?.toString(),
// "to_date":newWorkHistory.toDate?.toString(),
// "monthly_salary":newWorkHistory.monthlysalary,
// "appointment_status":newWorkHistory.statusAppointment,
// "salary_grade":newWorkHistory.salarygrade,
// "sg_step":newWorkHistory.sgstep,
// "_positionName":newWorkHistory.position!.title!,
// "_agencyName":newWorkHistory.agency!.name!,
// "_agencyCatId":newWorkHistory.agency!.category!.id!,
// "_privateEntity":newWorkHistory.agency!.privateEntity,
// "oldPosId":oldWorkHistory.position!.id,
// "_oldAgencyId":oldWorkHistory.agency!.id,
// "oldFromDate":oldWorkHistory.fromDate?.toString(),
// };
// try{
// http.Response response = await Request.instance.putRequest(path: path, headers: headers, body: body, param: {});
// if(response.statusCode == 200 ){
// Map data = jsonDecode(response.body);
// statusResponse = data;
// }else{
// statusResponse.addAll({'success':false});
// }
// return statusResponse;
// }catch(e){
// throw e.toString();
// }
// }
////Add work history
Future<Map<dynamic, dynamic>>add({required WorkHistory workHistory, required String token, required int profileId , required bool isPrivate})async{
Future<Map<dynamic, dynamic>>add({required WorkHistory workHistory, required String token, required int profileId , required bool isPrivate,required String? accomplishment, required String? actualDuties})async{
String authtoken = "Token $token";
String path = '${Url.instance.workhistory()}$profileId/';
Map<String, String> headers = {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': authtoken
};
Map<String,String> body = {};
Map<dynamic,dynamic> statusResponse = {};
Map body = {
'position_id':workHistory.position?.id,
'agency_id': workHistory.agency?.id,
'from_date': workHistory.fromDate?.toString(),
'to_date': workHistory.toDate?.toString(),
'monthly_salary': workHistory.monthlySalary,
'appointment_status': workHistory.appointmentStatus,
'salary_grade': workHistory.salaryGrade,
'sg_step':workHistory.sgStep,
'_positionName':workHistory.position?.title,
'_agencyName':workHistory.agency?.name,
'_agencyCatId':workHistory.agency?.category?.id,
'_privateEntity':workHistory.agency?.privateEntity,
String fromDate = DateFormat('yyyy-MM-dd').format(workHistory.fromDate!);
String? toDate;
if(workHistory.toDate != null){
toDate = DateFormat('yyyy-MM-dd').format(workHistory.toDate!);
}
if(workHistory.toDate == null){
body = {
"a_category_id ": workHistory.agency?.category?.id == null? "":workHistory.agency!.category!.id.toString(),
"a_name" : workHistory.agency?.name == null? "":workHistory.agency!.name!,
" a_private_entity ": workHistory.agency?.privateEntity == null?"":workHistory.agency!.privateEntity.toString(),
"accomplishment" : accomplishment??"",
"actual_duties ": actualDuties!,
"agency_id" : workHistory.agency?.id == null?"": workHistory.agency!.id.toString() ,
"from_date" : fromDate,
"monthly_salary" : workHistory.monthlysalary == null? "": workHistory.monthlysalary.toString(),
"position_id" : workHistory.position?.id == null? "": workHistory.position!.id.toString(),
"position_name" : workHistory.position?.title == null? "":workHistory.position!.title!,
"s_fname" : workHistory.supervisor?.firstname == null?"":workHistory.supervisor!.firstname!,
"s_lname" : workHistory.supervisor?.lastname == null? "":workHistory.supervisor!.lastname!,
"s_mname" : workHistory.supervisor?.middlename == null?"":workHistory.supervisor!.middlename!,
"s_office" : workHistory.supervisor?.stationName == null?"":workHistory.supervisor!.stationName!,
"salary_grade" : workHistory.salarygrade == null? "":workHistory.salarygrade.toString(),
"sg_step" : workHistory.sgstep == null?"":workHistory.sgstep.toString() ,
'status_appointment' : workHistory.statusAppointment??"",
};
try{
http.Response response = await Request.instance.postRequest(path: path,param: {},body: body,headers: headers);
if(response.statusCode == 201){
Map data = jsonDecode(response.body);
}else{
body = {
"a_category_id ": workHistory.agency?.category?.id == null? "":workHistory.agency!.category!.id.toString(),
"a_name" : workHistory.agency?.name == null? "":workHistory.agency!.name!,
" a_private_entity ": workHistory.agency?.privateEntity == null?"":workHistory.agency!.privateEntity.toString(),
"accomplishment" : accomplishment??"",
"actual_duties ": actualDuties!,
"agency_id" : workHistory.agency?.id == null?"": workHistory.agency!.id.toString() ,
"from_date" : workHistory.fromDate == null? "2018-10-04":"2018-06-04",
"monthly_salary" : workHistory.monthlysalary == null? "": workHistory.monthlysalary.toString(),
"position_id" : workHistory.position?.id == null? "": workHistory.position!.id.toString(),
"position_name" : workHistory.position?.title == null? "":workHistory.position!.title!,
"s_fname" : workHistory.supervisor?.firstname == null?"":workHistory.supervisor!.firstname!,
"s_lname" : workHistory.supervisor?.lastname == null? "":workHistory.supervisor!.lastname!,
"s_mname" : workHistory.supervisor?.middlename == null?"":workHistory.supervisor!.middlename!,
"s_office" : workHistory.supervisor?.stationName == null?"":workHistory.supervisor!.stationName!,
"salary_grade" : workHistory.salarygrade == null? "":workHistory.salarygrade.toString(),
"sg_step" : workHistory.sgstep == null?"":workHistory.sgstep.toString() ,
'status_appointment' : workHistory.statusAppointment??"",
"to_date" : toDate!,
};
}
var request = http.MultipartRequest('POST',Uri.parse('${Url.instance.prefixHost()}://${Url.instance.host()}$path'));
request.fields.addAll(body);
request.headers.addAll(headers);
try {
http.StreamedResponse response = await request.send();
final steamResponse = await response.stream.bytesToString();
Map data = jsonDecode(steamResponse);
if (response.statusCode == 201) {
statusResponse = data;
}else{
statusResponse.addAll({'success':false});
} else {
String message = data['response']['details'];
statusResponse.addAll({'message': message});
statusResponse.addAll(
{'success': false},
);
}
return statusResponse;
}catch(e){
} catch (e) {
throw e.toString();
}
return statusResponse;
}
Future<Map<dynamic, dynamic>>update({required WorkHistory workHistory, required String token, required int profileId , required bool isPrivate,required String? accomplishment, required String? actualDuties})async{
String authtoken = "Token $token";
String path = '${Url.instance.workhistory()}$profileId/';
Map<String, String> headers = {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': authtoken
};
Map<String,String> body = {};
Map<dynamic,dynamic> statusResponse = {};
String fromDate = DateFormat('yyyy-MM-dd').format(workHistory.fromDate!);
String? toDate;
if(workHistory.toDate != null){
toDate = DateFormat('yyyy-MM-dd').format(workHistory.toDate!);
}
if(workHistory.toDate == null){
body = {
"a_category_id ": workHistory.agency?.category?.id == null? "":workHistory.agency!.category!.id.toString(),
"a_name" : workHistory.agency?.name == null? "":workHistory.agency!.name!,
" a_private_entity ": workHistory.agency?.privateEntity == null?"":workHistory.agency!.privateEntity.toString(),
"accomplishment" : accomplishment??"",
"actual_duties ": actualDuties!,
"agency_id" : workHistory.agency?.id == null?"": workHistory.agency!.id.toString() ,
"from_date" : fromDate,
"monthly_salary" : workHistory.monthlysalary == null? "": workHistory.monthlysalary.toString(),
"position_id" : workHistory.position?.id == null? "": workHistory.position!.id.toString(),
"position_name" : workHistory.position?.title == null? "":workHistory.position!.title!,
"s_fname" : workHistory.supervisor?.firstname == null?"":workHistory.supervisor!.firstname!,
"s_lname" : workHistory.supervisor?.lastname == null? "":workHistory.supervisor!.lastname!,
"s_mname" : workHistory.supervisor?.middlename == null?"":workHistory.supervisor!.middlename!,
"s_office" : workHistory.supervisor?.stationName == null?"":workHistory.supervisor!.stationName!,
"salary_grade" : workHistory.salarygrade == null? "":workHistory.salarygrade.toString(),
"sg_step" : workHistory.sgstep == null?"":workHistory.sgstep.toString() ,
'status_appointment' : workHistory.statusAppointment??"",
};
}else{
body = {
"a_category_id ": workHistory.agency?.category?.id == null? "":workHistory.agency!.category!.id.toString(),
"a_name" : workHistory.agency?.name == null? "":workHistory.agency!.name!,
" a_private_entity ": workHistory.agency?.privateEntity == null?"":workHistory.agency!.privateEntity.toString(),
"accomplishment" : accomplishment??"",
"actual_duties ": actualDuties!,
"agency_id" : workHistory.agency?.id == null?"": workHistory.agency!.id.toString() ,
"from_date" : workHistory.fromDate == null? "2018-10-04":"2018-06-04",
"monthly_salary" : workHistory.monthlysalary == null? "": workHistory.monthlysalary.toString(),
"position_id" : workHistory.position?.id == null? "": workHistory.position!.id.toString(),
"position_name" : workHistory.position?.title == null? "":workHistory.position!.title!,
"s_fname" : workHistory.supervisor?.firstname == null?"":workHistory.supervisor!.firstname!,
"s_lname" : workHistory.supervisor?.lastname == null? "":workHistory.supervisor!.lastname!,
"s_mname" : workHistory.supervisor?.middlename == null?"":workHistory.supervisor!.middlename!,
"s_office" : workHistory.supervisor?.stationName == null?"":workHistory.supervisor!.stationName!,
"salary_grade" : workHistory.salarygrade == null? "":workHistory.salarygrade.toString(),
"sg_step" : workHistory.sgstep == null?"":workHistory.sgstep.toString() ,
'status_appointment' : workHistory.statusAppointment??"",
"to_date" : toDate!,
};
}
var request = http.MultipartRequest('PUT',Uri.parse('${Url.instance.prefixHost()}://${Url.instance.host()}$path'));
request.fields.addAll(body);
request.headers.addAll(headers);
try {
http.StreamedResponse response = await request.send();
final steamResponse = await response.stream.bytesToString();
Map data = jsonDecode(steamResponse);
if (response.statusCode == 201) {
statusResponse = data;
} else {
String message = data['response']['details'];
statusResponse.addAll({'message': message});
statusResponse.addAll(
{'success': false},
);
}
} catch (e) {
throw e.toString();
}
return statusResponse;
}
////get agency position
Future<List<PositionTitle>> getAgencyPosition() async {
List<PositionTitle> agencyPositions = [];

View File

@ -32,7 +32,7 @@ class PassCheckServices {
'X-Client-Key': xClientKey,
'X-Client-Secret': xClientSecret
};
// try {
try {
http.Response response = await Request.instance
.getRequest(param: params, headers: headers, path: path);
if (response.statusCode == 200) {
@ -133,9 +133,9 @@ class PassCheckServices {
statusResponse = assignedArea;
}
}
// } catch (e) {
// throw e.toString();
// }
} catch (e) {
throw e.toString();
}
return statusResponse!;
}

View File

@ -1,6 +1,10 @@
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:share_plus/share_plus.dart';
import 'package:unit2/utils/request.dart';
import 'package:unit2/utils/request_permission.dart';
import 'package:unit2/utils/urls.dart';
import '../model/profile/attachment.dart';
@ -12,7 +16,7 @@ class AttachmentServices {
Future<List<AttachmentCategory>> getCategories() async {
List<AttachmentCategory> attachmentCategories = [];
String path = Url.instance.attachmentCategories()+"11232";
String path = Url.instance.attachmentCategories();
Map<String, String> headers = {
'Content-Type': 'application/json; charset=UTF-8',
};
@ -113,7 +117,7 @@ class AttachmentServices {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': authtoken
};
// try {
try {
http.Response response = await Request.instance.deleteRequest(
path: path, headers: headers, body: body, param: params);
if (response.statusCode == 200) {
@ -122,9 +126,29 @@ class AttachmentServices {
} else {
success = false;
}
// } catch (e) {
// throw (e.toString());
// }
} catch (e) {
throw (e.toString());
}
return success!;
}
Future<bool> downloadAttachment(
{required String filename,
required String source,
required String downLoadDir}) async {
bool success = false;
var dio = Dio();
Response response;
try {
if (await requestPermission(Permission.storage)) {
response = await dio.download(source, "$downLoadDir/$filename");
if (response.statusCode == 200) {
success = true;
}
}
return success;
} catch (e) {
throw e.toString();
}
}
}

View File

@ -19,7 +19,7 @@ class Request {
Map<String, String>? param}) async {
Response response;
try {
response = await get(Uri.http(host, path!, param), headers: headers)
response = await get(Uri.https(host, path!, param), headers: headers)
.timeout(Duration(seconds: requestTimeout));
} on TimeoutException catch (_) {
Fluttertoast.showToast(
@ -61,7 +61,7 @@ class Request {
Map<String, String>? param}) async {
Response response;
try {
response = await post(Uri.http(host, path!, param),
response = await post(Uri.https(host, path!, param),
headers: headers, body: jsonEncode(body))
.timeout(Duration(seconds: requestTimeout));
} on TimeoutException catch (_) {
@ -104,7 +104,7 @@ class Request {
required Map<String, dynamic>? param}) async {
Response response;
try {
response =await put(Uri.http(host,path,param),headers: headers,body: jsonEncode(body));
response =await put(Uri.https(host,path,param),headers: headers,body: jsonEncode(body));
} on TimeoutException catch (_) {
Fluttertoast.showToast(
msg: timeoutError,
@ -186,7 +186,7 @@ class Request {
required Map<String, dynamic>? param}) async {
Response response;
try {
response = await delete(Uri.http(host, path, param),
response = await delete(Uri.https(host, path, param),
headers: headers, body: jsonEncode(body))
.timeout(Duration(seconds: requestTimeout));
} on TimeoutException catch (_) {

View File

@ -0,0 +1,14 @@
import 'package:permission_handler/permission_handler.dart';
Future<bool> requestPermission(Permission permission) async {
if (await permission.isGranted) {
return true;
} else {
var result = await permission.request();
if (result == PermissionStatus.granted) {
return true;
}
}
return false;
}

View File

@ -5,13 +5,17 @@ class Url {
String host() {
// return '192.168.10.183:3000';
// return 'agusandelnorte.gov.ph';
return "192.168.10.219:3000";
return 'agusandelnorte.gov.ph';
// return "192.168.10.219:3000";
// return "192.168.10.241";
// return "192.168.10.221:3004";
// return "playweb.agusandelnorte.gov.ph";
// return 'devapi.agusandelnorte.gov.ph:3004';
}
String prefixHost(){
return "https";
// return "https";
}
String authentication() {
return '/api/account/auth/login/';
@ -58,7 +62,10 @@ class Url {
//// work history paths
String workhistory() {
return "/api/jobnet_app/profile/pds/work/";
return "/api/jobnet_app/profile/pds/work_experience/";
}
String deleteWorkHistory(){
return "/api/jobnet_app/profile/pds/work/";
}
String getPositions() {

View File

@ -9,6 +9,7 @@
#include <audioplayers_linux/audioplayers_linux_plugin.h>
#include <modal_progress_hud_nsn/modal_progress_hud_nsn_plugin.h>
#include <platform_device_id_linux/platform_device_id_linux_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar =
@ -20,4 +21,7 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) platform_device_id_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "PlatformDeviceIdLinuxPlugin");
platform_device_id_linux_plugin_register_with_registrar(platform_device_id_linux_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
}

View File

@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
audioplayers_linux
modal_progress_hud_nsn
platform_device_id_linux
url_launcher_linux
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@ -8,6 +8,7 @@ import Foundation
import assets_audio_player
import assets_audio_player_web
import audioplayers_darwin
import device_info_plus
import location
import modal_progress_hud_nsn
import package_info_plus
@ -15,13 +16,17 @@ import path_provider_foundation
import platform_device_id
import platform_device_id_macos
import rive_common
import share_plus
import shared_preferences_foundation
import sqflite
import syncfusion_pdfviewer_macos
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AssetsAudioPlayerPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerPlugin"))
AssetsAudioPlayerWebPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerWebPlugin"))
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
ModalProgressHudNsnPlugin.register(with: registry.registrar(forPlugin: "ModalProgressHudNsnPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
@ -29,6 +34,9 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
}

View File

@ -337,6 +337,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
url: "https://pub.dev"
source: hosted
version: "0.3.3+4"
crypto:
dependency: transitive
description:
@ -385,6 +393,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.1"
device_info_plus:
dependency: transitive
description:
name: device_info_plus
sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903
url: "https://pub.dev"
source: hosted
version: "8.2.2"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
url: "https://pub.dev"
source: hosted
version: "7.0.0"
device_preview:
dependency: "direct main"
description:
@ -1253,6 +1277,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.8"
share_plus:
dependency: "direct main"
description:
name: share_plus
sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11"
url: "https://pub.dev"
source: hosted
version: "7.1.0"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7"
url: "https://pub.dev"
source: hosted
version: "3.3.0"
shared_preferences:
dependency: transitive
description:
@ -1418,6 +1458,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
syncfusion_flutter_core:
dependency: transitive
description:
name: syncfusion_flutter_core
sha256: "8db8f55c77f56968681447d3837c10f27a9e861e238a898fda116c7531def979"
url: "https://pub.dev"
source: hosted
version: "21.2.10"
syncfusion_flutter_pdf:
dependency: transitive
description:
name: syncfusion_flutter_pdf
sha256: a42186922a416c2c9634a8f221aee261101babc2d30b1a1e908a7f034e743046
url: "https://pub.dev"
source: hosted
version: "21.2.4"
syncfusion_flutter_pdfviewer:
dependency: "direct main"
description:
name: syncfusion_flutter_pdfviewer
sha256: "2dc016f251c675f8e4923135c485356473b4d89c677670164292159cd1dd4f45"
url: "https://pub.dev"
source: hosted
version: "21.2.3"
syncfusion_pdfviewer_macos:
dependency: transitive
description:
name: syncfusion_pdfviewer_macos
sha256: "8cc925cae532c0fa17e849165796d962107f45b86e66ee334dcaabf6b7305c82"
url: "https://pub.dev"
source: hosted
version: "21.2.10"
syncfusion_pdfviewer_platform_interface:
dependency: transitive
description:
name: syncfusion_pdfviewer_platform_interface
sha256: "08039ecdb8f79454fb367c6bf5a833846a666039415d2b5d76a7e59a5b3ff710"
url: "https://pub.dev"
source: hosted
version: "21.2.10"
syncfusion_pdfviewer_web:
dependency: transitive
description:
name: syncfusion_pdfviewer_web
sha256: "8e5ed0d313a1aa3869e4f2e8d079bc9bfa37ce79d91be7bb328e456f37b7995f"
url: "https://pub.dev"
source: hosted
version: "21.2.10"
syncfusion_pdfviewer_windows:
dependency: transitive
description:
name: syncfusion_pdfviewer_windows
sha256: "3e93f281135fb0562f7e6c343d2db741cf3cbd78c5b04884eef9af414408bc77"
url: "https://pub.dev"
source: hosted
version: "21.2.10"
synchronized:
dependency: transitive
description:
@ -1474,6 +1570,70 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3
url: "https://pub.dev"
source: hosted
version: "6.1.11"
url_launcher_android:
dependency: "direct main"
description:
name: url_launcher_android
sha256: "3dd2388cc0c42912eee04434531a26a82512b9cb1827e0214430c9bcbddfe025"
url: "https://pub.dev"
source: hosted
version: "6.0.38"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea
url: "https://pub.dev"
source: hosted
version: "2.1.3"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: cc26720eefe98c1b71d85f9dc7ef0cada5132617046369d9dc296b3ecaa5cbb4
url: "https://pub.dev"
source: hosted
version: "2.0.18"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "7967065dd2b5fccc18c653b97958fdf839c5478c28e767c61ee879f4e7882422"
url: "https://pub.dev"
source: hosted
version: "3.0.7"
uuid:
dependency: transitive
description:

View File

@ -89,6 +89,10 @@ dependencies:
file_picker: ^5.3.1
expandable: ^5.0.1
flutter_simple_treeview: ^3.0.2
syncfusion_flutter_pdfviewer: ^21.2.3
url_launcher: ^6.1.11
url_launcher_android: ^6.0.38
share_plus: ^7.1.0

View File

@ -11,6 +11,9 @@
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <platform_device_id_windows/platform_device_id_windows_plugin.h>
#include <rive_common/rive_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
AudioplayersWindowsPluginRegisterWithRegistrar(
@ -23,4 +26,10 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("PlatformDeviceIdWindowsPlugin"));
RivePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("RivePlugin"));
SharePlusWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
}

View File

@ -8,6 +8,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
permission_handler_windows
platform_device_id_windows
rive_common
share_plus
syncfusion_pdfviewer_windows
url_launcher_windows
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST