Skip to content

Commit a2c20ee

Browse files
committed
fix: empty row when rows exist
1 parent 711e3bd commit a2c20ee

File tree

3 files changed

+137
-111
lines changed

3 files changed

+137
-111
lines changed

lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class FormDataWidget extends ConsumerStatefulWidget {
1717
class _FormDataBodyState extends ConsumerState<FormDataWidget> {
1818
late int seed;
1919
final random = Random.secure();
20-
late List<FormDataModel> rows;
20+
late List<FormDataModel> formRows;
2121

2222
@override
2323
void initState() {
@@ -28,7 +28,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
2828
void _onFieldChange(String selectedId) {
2929
ref.read(collectionStateNotifierProvider.notifier).update(
3030
selectedId,
31-
requestFormDataList: rows,
31+
requestFormDataList: formRows.sublist(0, formRows.length - 1),
3232
);
3333
}
3434

@@ -37,40 +37,46 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
3737
final selectedId = ref.watch(selectedIdStateProvider);
3838
ref.watch(selectedRequestModelProvider
3939
.select((value) => value?.requestFormDataList?.length));
40-
var formRows = ref.read(selectedRequestModelProvider)?.requestFormDataList;
41-
rows =
42-
formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows;
40+
var rF = ref.read(selectedRequestModelProvider)?.requestFormDataList;
41+
bool isFormDataEmpty = rF == null || rF.isEmpty;
42+
List<FormDataModel> rows = (isFormDataEmpty)
43+
? [
44+
kFormDataEmptyModel,
45+
]
46+
: rF;
47+
formRows = isFormDataEmpty ? rows : rows + [kFormDataEmptyModel];
4348

4449
DaviModel<FormDataModel> daviModelRows = DaviModel<FormDataModel>(
45-
rows: rows,
50+
rows: formRows,
4651
columns: [
4752
DaviColumn(
4853
cellPadding: kpsV5,
4954
name: 'Key',
5055
grow: 4,
5156
cellBuilder: (_, row) {
5257
int idx = row.index;
58+
bool isLast = idx + 1 == formRows.length;
5359
return Theme(
5460
data: Theme.of(context),
5561
child: FormDataField(
5662
keyId: "$selectedId-$idx-form-v-$seed",
57-
initialValue: rows[idx].name,
63+
initialValue: formRows[idx].name,
5864
hintText: " Add Key",
5965
onChanged: (value) {
60-
rows[idx] = rows[idx].copyWith(name: value);
61-
if (idx == rows.length - 1) rows.add(kFormDataEmptyModel);
66+
formRows[idx] = formRows[idx].copyWith(name: value);
67+
if (isLast) formRows.add(kFormDataEmptyModel);
6268
_onFieldChange(selectedId!);
6369
},
6470
colorScheme: Theme.of(context).colorScheme,
65-
formDataType: rows[idx].type,
71+
formDataType: formRows[idx].type,
6672
onFormDataTypeChanged: (value) {
67-
bool hasChanged = rows[idx].type != value;
68-
rows[idx] = rows[idx].copyWith(
73+
bool hasChanged = formRows[idx].type != value;
74+
formRows[idx] = formRows[idx].copyWith(
6975
type: value ?? FormDataType.text,
7076
);
71-
rows[idx] = rows[idx].copyWith(value: "");
72-
if (idx == rows.length - 1 && hasChanged) {
73-
rows.add(kFormDataEmptyModel);
77+
formRows[idx] = formRows[idx].copyWith(value: "");
78+
if (idx == formRows.length - 1 && hasChanged) {
79+
formRows.add(kFormDataEmptyModel);
7480
}
7581
setState(() {});
7682
_onFieldChange(selectedId!);
@@ -97,7 +103,8 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
97103
cellPadding: kpsV5,
98104
cellBuilder: (_, row) {
99105
int idx = row.index;
100-
return rows[idx].type == FormDataType.file
106+
bool isLast = idx + 1 == formRows.length;
107+
return formRows[idx].type == FormDataType.file
101108
? Align(
102109
alignment: Alignment.centerLeft,
103110
child: Row(
@@ -122,17 +129,17 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
122129
if (pickedResult != null &&
123130
pickedResult.files.isNotEmpty &&
124131
pickedResult.files.first.path != null) {
125-
rows[idx] = rows[idx].copyWith(
132+
formRows[idx] = formRows[idx].copyWith(
126133
value: pickedResult.files.first.path!,
127134
);
128135
setState(() {});
129136
_onFieldChange(selectedId!);
130137
}
131138
},
132139
label: Text(
133-
(rows[idx].type == FormDataType.file &&
134-
rows[idx].value.isNotEmpty)
135-
? rows[idx].value.toString()
140+
(formRows[idx].type == FormDataType.file &&
141+
formRows[idx].value.isNotEmpty)
142+
? formRows[idx].value.toString()
136143
: "Select File",
137144
textAlign: TextAlign.center,
138145
overflow: TextOverflow.ellipsis,
@@ -146,11 +153,11 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
146153
)
147154
: CellField(
148155
keyId: "$selectedId-$idx-form-v-$seed",
149-
initialValue: rows[idx].value,
156+
initialValue: formRows[idx].value,
150157
hintText: " Add Value",
151158
onChanged: (value) {
152-
rows[idx] = rows[idx].copyWith(value: value);
153-
if (idx == rows.length - 1) rows.add(kFormDataEmptyModel);
159+
formRows[idx] = formRows[idx].copyWith(value: value);
160+
if (isLast) formRows.add(kFormDataEmptyModel);
154161
_onFieldChange(selectedId!);
155162
},
156163
colorScheme: Theme.of(context).colorScheme,
@@ -162,21 +169,24 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
162169
pinStatus: PinStatus.none,
163170
width: 30,
164171
cellBuilder: (_, row) {
172+
bool isLast = row.index + 1 == formRows.length;
165173
return InkWell(
174+
onTap: isLast
175+
? null
176+
: () {
177+
seed = random.nextInt(kRandMax);
178+
if (formRows.length == 2) {
179+
setState(() {
180+
formRows = [kFormDataEmptyModel];
181+
});
182+
} else {
183+
formRows.removeAt(row.index);
184+
}
185+
_onFieldChange(selectedId!);
186+
},
166187
child: Theme.of(context).brightness == Brightness.dark
167188
? kIconRemoveDark
168189
: kIconRemoveLight,
169-
onTap: () {
170-
seed = random.nextInt(kRandMax);
171-
if (rows.length == 1) {
172-
setState(() {
173-
rows = [kFormDataEmptyModel];
174-
});
175-
} else {
176-
rows.removeAt(row.index);
177-
}
178-
_onFieldChange(selectedId!);
179-
},
180190
);
181191
},
182192
),
@@ -207,7 +217,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
207217
padding: const EdgeInsets.only(bottom: 30),
208218
child: ElevatedButton.icon(
209219
onPressed: () {
210-
rows.add(kFormDataEmptyModel);
220+
formRows.add(kFormDataEmptyModel);
211221
_onFieldChange(selectedId!);
212222
},
213223
icon: const Icon(Icons.add),

lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ class EditRequestHeaders extends ConsumerStatefulWidget {
1515
}
1616

1717
class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
18+
late int seed;
1819
final random = Random.secure();
19-
late List<NameValueModel> rows;
20+
late List<NameValueModel> headerRows;
2021
late List<bool> isRowEnabledList;
21-
late int seed;
2222

2323
@override
2424
void initState() {
@@ -29,8 +29,9 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
2929
void _onFieldChange(String selectedId) {
3030
ref.read(collectionStateNotifierProvider.notifier).update(
3131
selectedId,
32-
requestHeaders: rows,
33-
isHeaderEnabledList: isRowEnabledList,
32+
requestHeaders: headerRows.sublist(0, headerRows.length - 1),
33+
isHeaderEnabledList:
34+
isRowEnabledList.sublist(0, headerRows.length - 1),
3435
);
3536
}
3637

@@ -41,31 +42,30 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
4142
.select((value) => value?.requestHeaders?.length));
4243
var rH = ref.read(selectedRequestModelProvider)?.requestHeaders;
4344
bool isHeadersEmpty = rH == null || rH.isEmpty;
44-
rows = (isHeadersEmpty)
45+
List<NameValueModel> rows = (isHeadersEmpty)
4546
? [
4647
kNameValueEmptyModel,
4748
]
4849
: rH;
49-
isRowEnabledList = ref
50-
.read(selectedRequestModelProvider)
51-
?.isHeaderEnabledList ??
52-
List.filled(rows.length, isHeadersEmpty ? false : true, growable: true);
50+
headerRows = isHeadersEmpty ? rows : rows + [kNameValueEmptyModel];
51+
isRowEnabledList =
52+
ref.read(selectedRequestModelProvider)?.isHeaderEnabledList ??
53+
List.filled(rH?.length ?? 0, true, growable: true);
54+
isRowEnabledList.add(false);
5355

5456
DaviModel<NameValueModel> model = DaviModel<NameValueModel>(
55-
rows: rows,
57+
rows: headerRows,
5658
columns: [
5759
DaviColumn(
5860
name: 'Checkbox',
5961
width: 30,
6062
cellBuilder: (_, row) {
6163
int idx = row.index;
64+
bool isLast = idx + 1 == headerRows.length;
6265
return CheckBox(
6366
keyId: "$selectedId-$idx-headers-c-$seed",
6467
value: isRowEnabledList[idx],
65-
onChanged: rows.length == 1 &&
66-
idx == 0 &&
67-
rows[idx].name.isEmpty &&
68-
rows[idx].value.isEmpty
68+
onChanged: isLast
6969
? null
7070
: (value) {
7171
setState(() {
@@ -83,15 +83,16 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
8383
grow: 1,
8484
cellBuilder: (_, row) {
8585
int idx = row.index;
86+
bool isLast = idx + 1 == headerRows.length;
8687
return HeaderField(
8788
keyId: "$selectedId-$idx-headers-k-$seed",
88-
initialValue: rows[idx].name,
89+
initialValue: headerRows[idx].name,
8990
hintText: "Add Header Name",
9091
onChanged: (value) {
91-
isRowEnabledList[idx] = true;
92-
rows[idx] = rows[idx].copyWith(name: value);
93-
if (idx == rows.length - 1) {
94-
rows.add(kNameValueEmptyModel);
92+
headerRows[idx] = headerRows[idx].copyWith(name: value);
93+
if (isLast) {
94+
isRowEnabledList[idx] = true;
95+
headerRows.add(kNameValueEmptyModel);
9596
isRowEnabledList.add(false);
9697
}
9798
_onFieldChange(selectedId!);
@@ -115,14 +116,16 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
115116
grow: 1,
116117
cellBuilder: (_, row) {
117118
int idx = row.index;
119+
bool isLast = idx + 1 == headerRows.length;
118120
return CellField(
119121
keyId: "$selectedId-$idx-headers-v-$seed",
120-
initialValue: rows[idx].value,
122+
initialValue: headerRows[idx].value,
121123
hintText: " Add Header Value",
122124
onChanged: (value) {
123-
rows[idx] = rows[idx].copyWith(value: value);
124-
if (idx == rows.length - 1) {
125-
rows.add(kNameValueEmptyModel);
125+
headerRows[idx] = headerRows[idx].copyWith(value: value);
126+
if (isLast) {
127+
isRowEnabledList[idx] = true;
128+
headerRows.add(kNameValueEmptyModel);
126129
isRowEnabledList.add(false);
127130
}
128131
_onFieldChange(selectedId!);
@@ -136,25 +139,28 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
136139
pinStatus: PinStatus.none,
137140
width: 30,
138141
cellBuilder: (_, row) {
142+
bool isLast = row.index + 1 == headerRows.length;
139143
return InkWell(
144+
onTap: isLast
145+
? null
146+
: () {
147+
seed = random.nextInt(kRandMax);
148+
if (headerRows.length == 2) {
149+
setState(() {
150+
headerRows = [
151+
kNameValueEmptyModel,
152+
];
153+
isRowEnabledList = [false];
154+
});
155+
} else {
156+
headerRows.removeAt(row.index);
157+
isRowEnabledList.removeAt(row.index);
158+
}
159+
_onFieldChange(selectedId!);
160+
},
140161
child: Theme.of(context).brightness == Brightness.dark
141162
? kIconRemoveDark
142163
: kIconRemoveLight,
143-
onTap: () {
144-
seed = random.nextInt(kRandMax);
145-
if (rows.length == 1) {
146-
setState(() {
147-
rows = [
148-
kNameValueEmptyModel,
149-
];
150-
isRowEnabledList = [false];
151-
});
152-
} else {
153-
rows.removeAt(row.index);
154-
isRowEnabledList.removeAt(row.index);
155-
}
156-
_onFieldChange(selectedId!);
157-
},
158164
);
159165
},
160166
),
@@ -185,7 +191,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
185191
padding: const EdgeInsets.only(bottom: 30),
186192
child: ElevatedButton.icon(
187193
onPressed: () {
188-
rows.add(kNameValueEmptyModel);
194+
headerRows.add(kNameValueEmptyModel);
189195
isRowEnabledList.add(false);
190196
_onFieldChange(selectedId!);
191197
},

0 commit comments

Comments
 (0)