diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart index cec94eab..b3d8f67c 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart @@ -17,7 +17,7 @@ class FormDataWidget extends ConsumerStatefulWidget { class _FormDataBodyState extends ConsumerState { late int seed; final random = Random.secure(); - late List rows; + late List formRows; @override void initState() { @@ -28,7 +28,7 @@ class _FormDataBodyState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestFormDataList: rows, + requestFormDataList: formRows.sublist(0, formRows.length - 1), ); } @@ -37,12 +37,17 @@ class _FormDataBodyState extends ConsumerState { final selectedId = ref.watch(selectedIdStateProvider); ref.watch(selectedRequestModelProvider .select((value) => value?.requestFormDataList?.length)); - var formRows = ref.read(selectedRequestModelProvider)?.requestFormDataList; - rows = - formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows; + var rF = ref.read(selectedRequestModelProvider)?.requestFormDataList; + bool isFormDataEmpty = rF == null || rF.isEmpty; + List rows = (isFormDataEmpty) + ? [ + kFormDataEmptyModel, + ] + : rF; + formRows = isFormDataEmpty ? rows : rows + [kFormDataEmptyModel]; DaviModel daviModelRows = DaviModel( - rows: rows, + rows: formRows, columns: [ DaviColumn( cellPadding: kpsV5, @@ -50,27 +55,28 @@ class _FormDataBodyState extends ConsumerState { grow: 4, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == formRows.length; return Theme( data: Theme.of(context), child: FormDataField( keyId: "$selectedId-$idx-form-v-$seed", - initialValue: rows[idx].name, + initialValue: formRows[idx].name, hintText: " Add Key", onChanged: (value) { - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(name: value); + if (isLast) formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, - formDataType: rows[idx].type, + formDataType: formRows[idx].type, onFormDataTypeChanged: (value) { - bool hasChanged = rows[idx].type != value; - rows[idx] = rows[idx].copyWith( + bool hasChanged = formRows[idx].type != value; + formRows[idx] = formRows[idx].copyWith( type: value ?? FormDataType.text, ); - rows[idx] = rows[idx].copyWith(value: ""); - if (idx == rows.length - 1 && hasChanged) { - rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(value: ""); + if (idx == formRows.length - 1 && hasChanged) { + formRows.add(kFormDataEmptyModel); } setState(() {}); _onFieldChange(selectedId!); @@ -97,7 +103,8 @@ class _FormDataBodyState extends ConsumerState { cellPadding: kpsV5, cellBuilder: (_, row) { int idx = row.index; - return rows[idx].type == FormDataType.file + bool isLast = idx + 1 == formRows.length; + return formRows[idx].type == FormDataType.file ? Align( alignment: Alignment.centerLeft, child: Row( @@ -122,7 +129,7 @@ class _FormDataBodyState extends ConsumerState { if (pickedResult != null && pickedResult.files.isNotEmpty && pickedResult.files.first.path != null) { - rows[idx] = rows[idx].copyWith( + formRows[idx] = formRows[idx].copyWith( value: pickedResult.files.first.path!, ); setState(() {}); @@ -130,9 +137,9 @@ class _FormDataBodyState extends ConsumerState { } }, label: Text( - (rows[idx].type == FormDataType.file && - rows[idx].value.isNotEmpty) - ? rows[idx].value.toString() + (formRows[idx].type == FormDataType.file && + formRows[idx].value.isNotEmpty) + ? formRows[idx].value.toString() : "Select File", textAlign: TextAlign.center, overflow: TextOverflow.ellipsis, @@ -146,11 +153,11 @@ class _FormDataBodyState extends ConsumerState { ) : CellField( keyId: "$selectedId-$idx-form-v-$seed", - initialValue: rows[idx].value, + initialValue: formRows[idx].value, hintText: " Add Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(value: value); + if (isLast) formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -162,21 +169,24 @@ class _FormDataBodyState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == formRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (formRows.length == 2) { + setState(() { + formRows = [kFormDataEmptyModel]; + }); + } else { + formRows.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [kFormDataEmptyModel]; - }); - } else { - rows.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -207,7 +217,7 @@ class _FormDataBodyState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kFormDataEmptyModel); + formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, icon: const Icon(Icons.add), diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index f77fda32..e5b0df59 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -15,10 +15,10 @@ class EditRequestHeaders extends ConsumerStatefulWidget { } class EditRequestHeadersState extends ConsumerState { - final random = Random.secure(); - late List rows; - late List isRowEnabledList; late int seed; + final random = Random.secure(); + late List headerRows; + late List isRowEnabledList; @override void initState() { @@ -29,8 +29,9 @@ class EditRequestHeadersState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestHeaders: rows, - isHeaderEnabledList: isRowEnabledList, + requestHeaders: headerRows.sublist(0, headerRows.length - 1), + isHeaderEnabledList: + isRowEnabledList.sublist(0, headerRows.length - 1), ); } @@ -41,31 +42,30 @@ class EditRequestHeadersState extends ConsumerState { .select((value) => value?.requestHeaders?.length)); var rH = ref.read(selectedRequestModelProvider)?.requestHeaders; bool isHeadersEmpty = rH == null || rH.isEmpty; - rows = (isHeadersEmpty) + List rows = (isHeadersEmpty) ? [ kNameValueEmptyModel, ] : rH; - isRowEnabledList = ref - .read(selectedRequestModelProvider) - ?.isHeaderEnabledList ?? - List.filled(rows.length, isHeadersEmpty ? false : true, growable: true); + headerRows = isHeadersEmpty ? rows : rows + [kNameValueEmptyModel]; + isRowEnabledList = + ref.read(selectedRequestModelProvider)?.isHeaderEnabledList ?? + List.filled(rH?.length ?? 0, true, growable: true); + isRowEnabledList.add(false); DaviModel model = DaviModel( - rows: rows, + rows: headerRows, columns: [ DaviColumn( name: 'Checkbox', width: 30, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return CheckBox( keyId: "$selectedId-$idx-headers-c-$seed", value: isRowEnabledList[idx], - onChanged: rows.length == 1 && - idx == 0 && - rows[idx].name.isEmpty && - rows[idx].value.isEmpty + onChanged: isLast ? null : (value) { setState(() { @@ -83,15 +83,16 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return HeaderField( keyId: "$selectedId-$idx-headers-k-$seed", - initialValue: rows[idx].name, + initialValue: headerRows[idx].name, hintText: "Add Header Name", onChanged: (value) { - isRowEnabledList[idx] = true; - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) { - rows.add(kNameValueEmptyModel); + headerRows[idx] = headerRows[idx].copyWith(name: value); + if (isLast) { + isRowEnabledList[idx] = true; + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -115,14 +116,16 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return CellField( keyId: "$selectedId-$idx-headers-v-$seed", - initialValue: rows[idx].value, + initialValue: headerRows[idx].value, hintText: " Add Header Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) { - rows.add(kNameValueEmptyModel); + headerRows[idx] = headerRows[idx].copyWith(value: value); + if (isLast) { + isRowEnabledList[idx] = true; + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -136,25 +139,28 @@ class EditRequestHeadersState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == headerRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (headerRows.length == 2) { + setState(() { + headerRows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [false]; + }); + } else { + headerRows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [false]; - }); - } else { - rows.removeAt(row.index); - isRowEnabledList.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -185,7 +191,7 @@ class EditRequestHeadersState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); _onFieldChange(selectedId!); }, diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index dfc78c50..a306b46b 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -16,10 +16,10 @@ class EditRequestURLParams extends ConsumerStatefulWidget { } class EditRequestURLParamsState extends ConsumerState { - final random = Random.secure(); - late List rows; - late List isRowEnabledList; late int seed; + final random = Random.secure(); + late List paramRows; + late List isRowEnabledList; @override void initState() { @@ -30,9 +30,14 @@ class EditRequestURLParamsState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestParams: rows, - isParamEnabledList: isRowEnabledList, + requestParams: paramRows.sublist(0, paramRows.length - 1), + isParamEnabledList: isRowEnabledList.sublist(0, paramRows.length - 1), ); + debugPrint("URL Params Updated"); + for (var i = 0; i < paramRows.length - 1; i++) { + debugPrint( + "URL Param $i: (${paramRows[i].name}=${paramRows[i].value}) ==> ${isRowEnabledList[i]}"); + } } @override @@ -42,30 +47,30 @@ class EditRequestURLParamsState extends ConsumerState { .select((value) => value?.requestParams?.length)); var rP = ref.read(selectedRequestModelProvider)?.requestParams; bool isParamsEmpty = rP == null || rP.isEmpty; - rows = (isParamsEmpty) + List rows = (isParamsEmpty) ? [ kNameValueEmptyModel, ] : rP; - isRowEnabledList = ref - .read(selectedRequestModelProvider) - ?.isParamEnabledList ?? - List.filled(rows.length, isParamsEmpty ? false : true, growable: true); + paramRows = isParamsEmpty ? rows : rows + [kNameValueEmptyModel]; + isRowEnabledList = + ref.read(selectedRequestModelProvider)?.isParamEnabledList ?? + List.filled(rP?.length ?? 0, true, growable: true); + isRowEnabledList.add(false); DaviModel model = DaviModel( - rows: rows, + rows: paramRows, columns: [ DaviColumn( name: 'Checkbox', width: 30, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CheckBox( keyId: "$selectedId-$idx-params-c-$seed", value: isRowEnabledList[idx], - onChanged: idx + 1 == rows.length && - rows[idx].name.isEmpty && - rows[idx].value.isEmpty + onChanged: isLast ? null : (value) { setState(() { @@ -83,15 +88,16 @@ class EditRequestURLParamsState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CellField( keyId: "$selectedId-$idx-params-k-$seed", - initialValue: rows[idx].name, + initialValue: paramRows[idx].name, hintText: "Add URL Parameter", onChanged: (value) { - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) { + paramRows[idx] = paramRows[idx].copyWith(name: value); + if (isLast) { isRowEnabledList[idx] = true; - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -115,15 +121,16 @@ class EditRequestURLParamsState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CellField( keyId: "$selectedId-$idx-params-v-$seed", - initialValue: rows[idx].value, + initialValue: paramRows[idx].value, hintText: "Add Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) { + paramRows[idx] = paramRows[idx].copyWith(value: value); + if (isLast) { isRowEnabledList[idx] = true; - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -137,25 +144,28 @@ class EditRequestURLParamsState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == paramRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (paramRows.length == 2) { + setState(() { + paramRows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [false]; + }); + } else { + paramRows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [false]; - }); - } else { - rows.removeAt(row.index); - isRowEnabledList.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -186,7 +196,7 @@ class EditRequestURLParamsState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); _onFieldChange(selectedId!); },