Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:flutter/services.dart';
3 : import 'package:flutter/widgets.dart';
4 : import 'package:pal/src/ui/editor/pages/create_helper/create_helper_presenter.dart';
5 : import 'package:pal/src/ui/editor/pages/create_helper/create_helper_viewmodel.dart';
6 : import 'package:pal/src/ui/editor/widgets/labeled_form.dart';
7 : import 'package:pal/src/ui/editor/widgets/bordered_text_field.dart';
8 :
9 : class CreateHelperInfosStep extends StatelessWidget {
10 : final CreateHelperModel model;
11 : final CreateHelperPresenter presenter;
12 : final Function() onFormChanged;
13 :
14 2 : const CreateHelperInfosStep({
15 : Key key,
16 : @required this.model,
17 : @required this.presenter,
18 : this.onFormChanged,
19 2 : }) : super(key: key);
20 :
21 2 : @override
22 : Widget build(BuildContext context) {
23 2 : return GestureDetector(
24 0 : onTap: () => FocusScope.of(context).unfocus(),
25 2 : child: Scaffold(
26 2 : body: SingleChildScrollView(
27 2 : key: ValueKey('palCreateHelperScrollList'),
28 : padding: const EdgeInsets.only(bottom: 8.0),
29 2 : child: Padding(
30 : padding: const EdgeInsets.all(16.0),
31 2 : child: Column(
32 2 : children: [
33 2 : _buildForm(),
34 : ],
35 : ),
36 : ),
37 : ),
38 : ),
39 : );
40 : }
41 :
42 2 : void _checkFormValid() {
43 4 : if (!model.isAppVersionLoading) {
44 12 : model.isFormValid = model.infosForm.currentState.validate();
45 4 : presenter.refreshView();
46 : }
47 : }
48 :
49 2 : Widget _buildForm() {
50 2 : return Form(
51 4 : key: model.infosForm,
52 2 : onChanged: _checkFormValid,
53 : autovalidateMode: AutovalidateMode.disabled,
54 2 : child: Wrap(
55 : runSpacing: 17.0,
56 2 : children: [
57 2 : LabeledForm(
58 : label: 'Name',
59 2 : widget: BorderedTextField(
60 2 : key: ValueKey('pal_CreateHelper_TextField_Name'),
61 : hintText: 'My new helper',
62 4 : controller: model.helperNameController,
63 2 : validator: _checkHelperName,
64 : textCapitalization: TextCapitalization.sentences,
65 : ),
66 : ),
67 2 : LabeledForm(
68 : label: 'Trigger type',
69 2 : widget: DropdownButtonFormField(
70 2 : key: ValueKey('pal_CreateHelper_Dropdown_Type'),
71 2 : validator: _checkHelperTriggerType,
72 8 : value: model.triggerTypes.first.key,
73 2 : onChanged: _onTriggerTypeChanged,
74 2 : items: _buildDropdownArray(),
75 : ),
76 : ),
77 2 : LabeledForm(
78 : label: 'Minimum app version',
79 2 : widget: BorderedTextField(
80 2 : key: ValueKey('pal_CreateHelper_TextField_MinimumVersion'),
81 2 : textInputType: TextInputType.numberWithOptions(decimal: true),
82 4 : controller: model.minVersionController,
83 2 : validator: _checkValidVersion,
84 4 : isLoading: model.isAppVersionLoading,
85 : ),
86 : ),
87 : ],
88 : ),
89 : );
90 : }
91 :
92 1 : _onTriggerTypeChanged(String newValue) {
93 2 : model.selectedTriggerType = newValue;
94 2 : presenter.refreshView();
95 : }
96 :
97 2 : List<DropdownMenuItem<String>> _buildDropdownArray() {
98 2 : List<DropdownMenuItem<String>> dropdownArray = [];
99 8 : model.triggerTypes.forEach((element) {
100 4 : dropdownArray.add(DropdownMenuItem<String>(
101 2 : value: element.key,
102 4 : child: Text(element.description),
103 : ));
104 : });
105 : return dropdownArray;
106 : }
107 :
108 : // Check fields
109 2 : String _checkHelperName(String value) {
110 2 : if (value.isEmpty) {
111 : return 'Please enter a name';
112 4 : } else if (value.length >= 45) {
113 : return 'Maximum 45 character allowed';
114 : }
115 : return null;
116 : }
117 :
118 2 : String _checkHelperTriggerType(String value) {
119 2 : return (value.isEmpty) ? 'Please select a type' : null;
120 : }
121 :
122 2 : String _checkValidVersion(String value) {
123 : final String pattern = r'^\d+(\.\d+){0,2}$';
124 2 : final RegExp regExp = new RegExp(pattern);
125 2 : if (value.isEmpty) {
126 : return 'Please enter a version';
127 : } else {
128 2 : if (!regExp.hasMatch(value))
129 : return 'Please enter a valid version';
130 : else
131 : return null;
132 : }
133 : }
134 : }
|