|
@@ -0,0 +1,313 @@
|
|
|
+import 'dart:ui';
|
|
|
+
|
|
|
+import 'package:cs_resources/generated/assets.dart';
|
|
|
+import 'package:domain/entity/response/job_applied_remark_view_s_g_entity.dart';
|
|
|
+import 'package:flutter/cupertino.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter/widgets.dart';
|
|
|
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
|
|
|
+import 'package:shared/utils/util.dart';
|
|
|
+import 'package:widgets/ext/ex_widget.dart';
|
|
|
+import 'package:cs_resources/constants/color_constants.dart';
|
|
|
+import 'package:widgets/my_text_view.dart';
|
|
|
+import 'package:widgets/shatter/rating_widget.dart';
|
|
|
+import 'package:widgets/widget_export.dart';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 员工的评价弹窗
|
|
|
+ */
|
|
|
+class AppliedStaffReviews extends StatefulWidget {
|
|
|
+ JobAppliedRemarkViewSGEntity appliedReviews;
|
|
|
+ void Function(String attitudeRate, String performanceRate, String experienceRate, String groomingRate, String content)? confirmAction;
|
|
|
+
|
|
|
+ AppliedStaffReviews({required this.appliedReviews, this.confirmAction});
|
|
|
+
|
|
|
+ @override
|
|
|
+ State<AppliedStaffReviews> createState() => _AppliedStaffReviewsState();
|
|
|
+}
|
|
|
+
|
|
|
+class _AppliedStaffReviewsState extends State<AppliedStaffReviews> {
|
|
|
+ late JobAppliedRemarkViewSGEntity reviews;
|
|
|
+ late String attitudeRate;
|
|
|
+ late String groomingRate;
|
|
|
+ late String performanceRate;
|
|
|
+ late String experienceRate;
|
|
|
+ late String content;
|
|
|
+ late TextEditingController _controller;
|
|
|
+ late FocusNode _focusNode;
|
|
|
+
|
|
|
+ @override
|
|
|
+ void initState() {
|
|
|
+ super.initState();
|
|
|
+ _controller = TextEditingController();
|
|
|
+ _focusNode = FocusNode();
|
|
|
+
|
|
|
+ reviews = widget.appliedReviews;
|
|
|
+ attitudeRate = reviews.attitudeRate.toString();
|
|
|
+ groomingRate = reviews.groomingRate.toString();
|
|
|
+ performanceRate = reviews.performanceRate.toString();
|
|
|
+ experienceRate = reviews.experienceRate.toString();
|
|
|
+ _controller.text = reviews.feedback ?? "";
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ //Title (如果使用 Container 为最外层容器则默认为 match_parent 的效果,除非我们限制宽度和最大高度最小高度)
|
|
|
+ Container(
|
|
|
+ width: double.infinity,
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: Colors.white,
|
|
|
+ borderRadius: const BorderRadius.all(Radius.circular(15)),
|
|
|
+ ),
|
|
|
+ child: Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+ Center(
|
|
|
+ child: MyTextView(
|
|
|
+ "Remarks".tr,
|
|
|
+ fontSize: 19,
|
|
|
+ isFontMedium: true,
|
|
|
+ textColor: ColorConstants.black,
|
|
|
+ marginTop: 23,
|
|
|
+ marginBottom: 19,
|
|
|
+ marginLeft: 22,
|
|
|
+ marginRight: 22,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ MyTextView(
|
|
|
+ reviews.labourerName ?? "",
|
|
|
+ isFontRegular: true,
|
|
|
+ textColor: Colors.black,
|
|
|
+ marginLeft: 22,
|
|
|
+ marginRight: 22,
|
|
|
+ fontSize: 17,
|
|
|
+ ),
|
|
|
+
|
|
|
+ //态度评分
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "Attitude".tr,
|
|
|
+ isFontRegular: true,
|
|
|
+ textColor: ColorConstants.black66,
|
|
|
+ fontSize: 15,
|
|
|
+ ).expanded(),
|
|
|
+ RatingWidget(
|
|
|
+ nomalImage: Assets.baseServiceRatingUnselected,
|
|
|
+ selectImage: Assets.baseServiceRatingSelected,
|
|
|
+ size: 21,
|
|
|
+ padding: 5,
|
|
|
+ selectAble: Utils.isEmpty(reviews.feedback),
|
|
|
+ integerOnly: true,
|
|
|
+ value: reviews.attitudeRate,
|
|
|
+ onRatingUpdate: (value) {
|
|
|
+ attitudeRate = value;
|
|
|
+ },
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ).marginOnly(top: 15, left: 22, right: 22),
|
|
|
+
|
|
|
+ //表现评分
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "Performance".tr,
|
|
|
+ isFontRegular: true,
|
|
|
+ textColor: ColorConstants.black66,
|
|
|
+ fontSize: 15,
|
|
|
+ ).expanded(),
|
|
|
+ RatingWidget(
|
|
|
+ nomalImage: Assets.baseServiceRatingUnselected,
|
|
|
+ selectImage: Assets.baseServiceRatingSelected,
|
|
|
+ size: 21,
|
|
|
+ padding: 5,
|
|
|
+ selectAble: Utils.isEmpty(reviews.feedback),
|
|
|
+ integerOnly: true,
|
|
|
+ value: reviews.performanceRate,
|
|
|
+ onRatingUpdate: (value) {
|
|
|
+ performanceRate = value;
|
|
|
+ },
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ).marginOnly(top: 15, left: 22, right: 22),
|
|
|
+
|
|
|
+ //经验评分
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "Experience".tr,
|
|
|
+ isFontRegular: true,
|
|
|
+ textColor: ColorConstants.black66,
|
|
|
+ fontSize: 15,
|
|
|
+ ).expanded(),
|
|
|
+ RatingWidget(
|
|
|
+ nomalImage: Assets.baseServiceRatingUnselected,
|
|
|
+ selectImage: Assets.baseServiceRatingSelected,
|
|
|
+ size: 21,
|
|
|
+ padding: 5,
|
|
|
+ selectAble: Utils.isEmpty(reviews.feedback),
|
|
|
+ integerOnly: true,
|
|
|
+ value: reviews.experienceRate,
|
|
|
+ onRatingUpdate: (value) {
|
|
|
+ experienceRate = value;
|
|
|
+ },
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ).marginOnly(top: 15, left: 22, right: 22),
|
|
|
+
|
|
|
+ //着装评分
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ MyTextView(
|
|
|
+ "Grooming".tr,
|
|
|
+ isFontRegular: true,
|
|
|
+ textColor: ColorConstants.black66,
|
|
|
+ fontSize: 15,
|
|
|
+ ).expanded(),
|
|
|
+ RatingWidget(
|
|
|
+ nomalImage: Assets.baseServiceRatingUnselected,
|
|
|
+ selectImage: Assets.baseServiceRatingSelected,
|
|
|
+ size: 21,
|
|
|
+ padding: 5,
|
|
|
+ selectAble: Utils.isEmpty(reviews.feedback),
|
|
|
+ integerOnly: true,
|
|
|
+ value: reviews.groomingRate,
|
|
|
+ onRatingUpdate: (value) {
|
|
|
+ groomingRate = value;
|
|
|
+ },
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ).marginOnly(top: 15, left: 22, right: 22),
|
|
|
+
|
|
|
+ IgnoreKeyboardDismiss(
|
|
|
+ child: Container(
|
|
|
+ height: 130,
|
|
|
+ margin: EdgeInsets.symmetric(vertical: 19, horizontal: 22),
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: Color(0xFFF0F0F0),
|
|
|
+ border: Border.all(
|
|
|
+ color: Color(0xFFD8D8D8),
|
|
|
+ width: 0.5,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ child: TextField(
|
|
|
+ cursorColor: ColorConstants.black66,
|
|
|
+ cursorWidth: 1.5,
|
|
|
+ autofocus: false,
|
|
|
+ enabled: Utils.isEmpty(reviews.feedback),
|
|
|
+ focusNode: _focusNode,
|
|
|
+ controller: _controller,
|
|
|
+ // 装饰
|
|
|
+ decoration: InputDecoration(
|
|
|
+ isDense: true,
|
|
|
+ isCollapsed: true,
|
|
|
+ border: InputBorder.none,
|
|
|
+ hintText: "Enter...".tr,
|
|
|
+ hintStyle: TextStyle(
|
|
|
+ color: ColorConstants.black66,
|
|
|
+ fontSize: 15.0,
|
|
|
+ fontWeight: FontWeight.w400,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ style: TextStyle(
|
|
|
+ color: ColorConstants.black,
|
|
|
+ fontSize: 15.0,
|
|
|
+ fontWeight: FontWeight.w400,
|
|
|
+ ),
|
|
|
+ // 键盘动作右下角图标
|
|
|
+ textInputAction: TextInputAction.done,
|
|
|
+ onSubmitted: (value) {
|
|
|
+ doCallbackAction();
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+
|
|
|
+ // 分割线
|
|
|
+ Container(
|
|
|
+ color: Color(0XFFCECECE),
|
|
|
+ height: 0.5,
|
|
|
+ ),
|
|
|
+
|
|
|
+ //按钮组
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ Expanded(
|
|
|
+ flex: 1,
|
|
|
+ child: InkWell(
|
|
|
+ onTap: () {
|
|
|
+ onCancel();
|
|
|
+ },
|
|
|
+ child: MyTextView(
|
|
|
+ "Cancel".tr,
|
|
|
+ fontSize: 17.5,
|
|
|
+ isFontMedium: true,
|
|
|
+ textAlign: TextAlign.center,
|
|
|
+ textColor: Color(0XFF0085C4),
|
|
|
+ cornerRadius: 3,
|
|
|
+ borderWidth: 1,
|
|
|
+ ),
|
|
|
+ )),
|
|
|
+ Container(
|
|
|
+ color: Color(0xff09141F).withOpacity(0.13),
|
|
|
+ width: 0.5,
|
|
|
+ ),
|
|
|
+ Expanded(
|
|
|
+ flex: 1,
|
|
|
+ child: InkWell(
|
|
|
+ onTap: () {
|
|
|
+ doCallbackAction();
|
|
|
+ },
|
|
|
+ child: MyTextView(
|
|
|
+ "Submit".tr,
|
|
|
+ marginLeft: 10,
|
|
|
+ fontSize: 17.5,
|
|
|
+ isFontMedium: true,
|
|
|
+ textAlign: TextAlign.center,
|
|
|
+ textColor: Color(0XFF0085C4),
|
|
|
+ cornerRadius: 3,
|
|
|
+ ),
|
|
|
+ )),
|
|
|
+ ],
|
|
|
+ ).constrained(height: 46),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ).constrained(width: 285);
|
|
|
+ }
|
|
|
+
|
|
|
+ //取消弹框
|
|
|
+ void onCancel() async {
|
|
|
+ SmartDialog.dismiss();
|
|
|
+ }
|
|
|
+
|
|
|
+ //执行回调
|
|
|
+ void doCallbackAction() {
|
|
|
+ _focusNode.unfocus();
|
|
|
+
|
|
|
+ content = _controller.text.toString();
|
|
|
+
|
|
|
+ if (attitudeRate == "0" || experienceRate == "0" || performanceRate == "0" || groomingRate == "0") {
|
|
|
+ ToastEngine.show("Rate First");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Utils.isEmpty(content)) {
|
|
|
+ ToastEngine.show("Please Enter Remark".tr);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ onCancel();
|
|
|
+
|
|
|
+ widget.confirmAction?.call(attitudeRate, performanceRate, experienceRate, groomingRate, content);
|
|
|
+ }
|
|
|
+}
|