|
@@ -0,0 +1,240 @@
|
|
|
|
|
+import 'package:electronic_assistant/base/base_page.dart';
|
|
|
|
|
+import 'package:electronic_assistant/data/bean/template_bean.dart';
|
|
|
|
|
+import 'package:electronic_assistant/resource/colors.gen.dart';
|
|
|
|
|
+import 'package:electronic_assistant/resource/string.gen.dart';
|
|
|
|
|
+import 'package:electronic_assistant/utils/expand.dart';
|
|
|
|
|
+import 'package:flutter/material.dart';
|
|
|
|
|
+import 'package:flutter/services.dart';
|
|
|
|
|
+import 'package:flutter/src/widgets/framework.dart';
|
|
|
|
|
+import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
|
|
+import 'package:get/get.dart';
|
|
|
|
|
+import '../../../resource/assets.gen.dart';
|
|
|
|
|
+import '../../../router/app_pages.dart';
|
|
|
|
|
+import '../../../utils/common_style.dart';
|
|
|
|
|
+import 'controller.dart';
|
|
|
|
|
+
|
|
|
|
|
+class TemplateDetailPage extends BasePage<TemplateDetailController> {
|
|
|
|
|
+ const TemplateDetailPage({super.key});
|
|
|
|
|
+
|
|
|
|
|
+ static void addStart() {
|
|
|
|
|
+ Get.toNamed(RoutePath.templateDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ static void updateDetail(TemplateBean bean) {
|
|
|
|
|
+ Get.toNamed(RoutePath.templateDetail, arguments: bean);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ bool immersive() {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ Widget buildBody(BuildContext context) {
|
|
|
|
|
+ return Scaffold(
|
|
|
|
|
+ resizeToAvoidBottomInset: false,
|
|
|
|
|
+ backgroundColor: 'F6F6F6'.color,
|
|
|
|
|
+ appBar: _buildAppBar(),
|
|
|
|
|
+ body: Column(
|
|
|
|
|
+ children: [
|
|
|
|
|
+ Expanded(child: _buildTemplateContent()),
|
|
|
|
|
+ _buildTemplateBtn()
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildTemplateContent() {
|
|
|
|
|
+ return SingleChildScrollView(
|
|
|
|
|
+ padding: EdgeInsets.symmetric(horizontal: 12.w),
|
|
|
|
|
+ child: SizedBox(
|
|
|
|
|
+ width: double.infinity,
|
|
|
|
|
+ child:
|
|
|
|
|
+ Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
|
|
|
|
+ SizedBox(height: 12.h),
|
|
|
|
|
+ Text(StringName.templateDetailName.tr,
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ fontSize: 14.sp, color: ColorName.secondaryTextColor)),
|
|
|
|
|
+ SizedBox(height: 8.h),
|
|
|
|
|
+ _buildTemplateTitle(),
|
|
|
|
|
+ SizedBox(height: 20.h),
|
|
|
|
|
+ Text(StringName.templateDetailTitle.tr,
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ fontSize: 14.sp, color: ColorName.secondaryTextColor)),
|
|
|
|
|
+ Text(StringName.templateDetailTitleHint.tr,
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ fontSize: 12.sp, color: ColorName.tertiaryTextColor)),
|
|
|
|
|
+ SizedBox(height: 12.h),
|
|
|
|
|
+ _buildTemplateTitleList(),
|
|
|
|
|
+ _buildDefaultTemplate(),
|
|
|
|
|
+ _buildAddTemplate()
|
|
|
|
|
+ ]),
|
|
|
|
|
+ ));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildAddTemplate() {
|
|
|
|
|
+ return GestureDetector(
|
|
|
|
|
+ onTap: () {
|
|
|
|
|
+ controller.onAddTemplate();
|
|
|
|
|
+ },
|
|
|
|
|
+ child: Container(
|
|
|
|
|
+ margin: EdgeInsets.only(bottom: 8.w),
|
|
|
|
|
+ decoration: BoxDecoration(
|
|
|
|
|
+ color: '#F0F0F0'.color, borderRadius: BorderRadius.circular(8.w)),
|
|
|
|
|
+ child: Row(
|
|
|
|
|
+ children: [
|
|
|
|
|
+ SizedBox(width: 15.w),
|
|
|
|
|
+ Assets.images.iconTemplateAddTitle.image(width: 28.w, height: 28.w),
|
|
|
|
|
+ SizedBox(width: 10.w),
|
|
|
|
|
+ Padding(
|
|
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 17.w),
|
|
|
|
|
+ child: Text(StringName.templateDetailTitleTxt.tr,
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ fontSize: 15.sp, color: ColorName.tertiaryTextColor)),
|
|
|
|
|
+ )
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildDefaultTemplate() {
|
|
|
|
|
+ return Obx(() {
|
|
|
|
|
+ if (controller.defaultTemplate?.isNotEmpty == true) {
|
|
|
|
|
+ return _templateItem(controller.defaultTemplate!, hideDeleteIcon: true);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Container();
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildTemplateTitleList() {
|
|
|
|
|
+ return Obx(() {
|
|
|
|
|
+ return ListView.builder(
|
|
|
|
|
+ physics: const NeverScrollableScrollPhysics(),
|
|
|
|
|
+ itemBuilder: (context, index) {
|
|
|
|
|
+ var item = controller.templateCustomTitle[index];
|
|
|
|
|
+ return _templateItem(item, itemClick: () {
|
|
|
|
|
+ controller.onUpdateTemplate(index, item);
|
|
|
|
|
+ }, deleteClick: () {
|
|
|
|
|
+ controller.onDeleteTemplate(index);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ itemCount: controller.templateCustomTitle.length,
|
|
|
|
|
+ reverse: true,
|
|
|
|
|
+ shrinkWrap: true);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _templateItem(String title,
|
|
|
|
|
+ {bool? hideDeleteIcon,
|
|
|
|
|
+ VoidCallback? itemClick,
|
|
|
|
|
+ VoidCallback? deleteClick}) {
|
|
|
|
|
+ return GestureDetector(
|
|
|
|
|
+ onTap: itemClick,
|
|
|
|
|
+ child: Container(
|
|
|
|
|
+ margin: EdgeInsets.only(bottom: 8.w),
|
|
|
|
|
+ decoration: BoxDecoration(
|
|
|
|
|
+ color: ColorName.white, borderRadius: BorderRadius.circular(8.w)),
|
|
|
|
|
+ padding: EdgeInsets.symmetric(horizontal: 14.w),
|
|
|
|
|
+ child: Row(
|
|
|
|
|
+ children: [
|
|
|
|
|
+ Padding(
|
|
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 17.w),
|
|
|
|
|
+ child: Text(title,
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ fontSize: 15.sp, color: ColorName.primaryTextColor)),
|
|
|
|
|
+ ),
|
|
|
|
|
+ SizedBox(width: 14.w),
|
|
|
|
|
+ const Spacer(),
|
|
|
|
|
+ GestureDetector(
|
|
|
|
|
+ onTap: deleteClick,
|
|
|
|
|
+ child: Visibility(
|
|
|
|
|
+ visible: hideDeleteIcon != true,
|
|
|
|
|
+ child: Assets.images.iconRenameClearTxt
|
|
|
|
|
+ .image(width: 20.w, height: 20.w)),
|
|
|
|
|
+ )
|
|
|
|
|
+ ],
|
|
|
|
|
+ )),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildTemplateTitle() {
|
|
|
|
|
+ return Container(
|
|
|
|
|
+ width: double.infinity,
|
|
|
|
|
+ decoration: BoxDecoration(
|
|
|
|
|
+ color: ColorName.white, borderRadius: BorderRadius.circular(8.w)),
|
|
|
|
|
+ child: TextField(
|
|
|
|
|
+ focusNode: controller.focusNode,
|
|
|
|
|
+ controller: controller.titleController,
|
|
|
|
|
+ maxLength: 6,
|
|
|
|
|
+ decoration: InputDecoration(
|
|
|
|
|
+ counterText: '',
|
|
|
|
|
+ contentPadding:
|
|
|
|
|
+ EdgeInsets.symmetric(horizontal: 14.w, vertical: 20.w),
|
|
|
|
|
+ border: const OutlineInputBorder(borderSide: BorderSide.none),
|
|
|
|
|
+ hintStyle: TextStyle(
|
|
|
|
|
+ height: 1, fontSize: 20.sp, color: ColorName.tertiaryTextColor),
|
|
|
|
|
+ hintText: StringName.templateDetailNameHint.tr,
|
|
|
|
|
+ ),
|
|
|
|
|
+ style: TextStyle(
|
|
|
|
|
+ height: 1, fontSize: 20.sp, color: ColorName.primaryTextColor)),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Widget _buildTemplateBtn() {
|
|
|
|
|
+ return GestureDetector(
|
|
|
|
|
+ onTap: () {
|
|
|
|
|
+ controller.onSaveTemplate();
|
|
|
|
|
+ },
|
|
|
|
|
+ child: Center(
|
|
|
|
|
+ child: Container(
|
|
|
|
|
+ margin: EdgeInsets.only(bottom: 16.w),
|
|
|
|
|
+ decoration: getCommonDecoration(8.w),
|
|
|
|
|
+ width: 328.w,
|
|
|
|
|
+ height: 48.w,
|
|
|
|
|
+ child: Center(
|
|
|
|
|
+ child: Text(
|
|
|
|
|
+ StringName.templateDetailSave.tr,
|
|
|
|
|
+ style: TextStyle(fontSize: 16.sp, color: ColorName.white),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ AppBar _buildAppBar() {
|
|
|
|
|
+ return AppBar(
|
|
|
|
|
+ scrolledUnderElevation: 0,
|
|
|
|
|
+ systemOverlayStyle: SystemUiOverlayStyle.dark,
|
|
|
|
|
+ backgroundColor: Colors.transparent,
|
|
|
|
|
+ title: Text(
|
|
|
|
|
+ StringName.templateAddTitle.tr,
|
|
|
|
|
+ style: TextStyle(fontSize: 17.sp, color: ColorName.primaryTextColor),
|
|
|
|
|
+ ),
|
|
|
|
|
+ actions: [
|
|
|
|
|
+ GestureDetector(
|
|
|
|
|
+ onTap: () {
|
|
|
|
|
+ controller.onCancel();
|
|
|
|
|
+ },
|
|
|
|
|
+ child: Text(
|
|
|
|
|
+ StringName.cancel.tr,
|
|
|
|
|
+ style:
|
|
|
|
|
+ TextStyle(fontSize: 15.sp, color: ColorName.secondaryTextColor),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ SizedBox(width: 12.w)
|
|
|
|
|
+ ],
|
|
|
|
|
+ centerTitle: true,
|
|
|
|
|
+ leading: IconButton(
|
|
|
|
|
+ onPressed: () {
|
|
|
|
|
+ controller.onBack();
|
|
|
|
|
+ },
|
|
|
|
|
+ icon: SizedBox(
|
|
|
|
|
+ width: 24.w,
|
|
|
|
|
+ height: 24.w,
|
|
|
|
|
+ child: Assets.images.iconBack.image())),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+}
|