CheckBox and Filtering

This commit is contained in:
DenserMeerkat
2023-12-15 04:08:12 +05:30
parent 5d5d7928db
commit ce8a7dc944
15 changed files with 201 additions and 45 deletions

View File

@ -77,7 +77,11 @@ import okhttp3.MediaType.Companion.toMediaType""";
url = "$defaultUriScheme://$url";
}
var rec = getValidRequestUri(url, requestModel.requestParams);
var rec = getValidRequestUri(
url,
requestModel.requestParams,
requestModel.enabledParams,
);
Uri? uri = rec.$1;
if (uri != null) {

View File

@ -71,7 +71,11 @@ print(data.decode("utf-8"))
}
result += kTemplateStart;
var rec = getValidRequestUri(url, requestModel.requestParams);
var rec = getValidRequestUri(
url,
requestModel.requestParams,
requestModel.enabledParams,
);
Uri? uri = rec.$1;
if (uri != null) {

View File

@ -75,7 +75,11 @@ print('Response Body:', response.text)
url = "$defaultUriScheme://$url";
}
var rec = getValidRequestUri(url, requestModel.requestParams);
var rec = getValidRequestUri(
url,
requestModel.requestParams,
requestModel.enabledParams,
);
Uri? uri = rec.$1;
if (uri != null) {
var templateStartUrl = jj.Template(kTemplateStart);

View File

@ -1,3 +1,4 @@
import 'package:apidash/utils/convert_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show mapToRows, rowsToMap;
@ -15,6 +16,8 @@ class RequestModel {
this.requestTabIndex = 0,
this.requestHeaders,
this.requestParams,
this.enabledHeaders,
this.enabledParams,
this.requestBodyContentType = ContentType.json,
this.requestBody,
this.responseStatus,
@ -30,14 +33,18 @@ class RequestModel {
final int requestTabIndex;
final List<NameValueModel>? requestHeaders;
final List<NameValueModel>? requestParams;
final List<bool>? enabledHeaders;
final List<bool>? enabledParams;
final ContentType requestBodyContentType;
final String? requestBody;
final int? responseStatus;
final String? message;
final ResponseModel? responseModel;
Map<String, String> get headersMap => rowsToMap(requestHeaders) ?? {};
Map<String, String> get paramsMap => rowsToMap(requestParams) ?? {};
Map<String, String> get headersMap =>
rowsToMap(getEnabledRows(requestHeaders, enabledHeaders)) ?? {};
Map<String, String> get paramsMap =>
rowsToMap(getEnabledRows(requestParams, enabledParams)) ?? {};
RequestModel duplicate({
required String id,
@ -50,6 +57,8 @@ class RequestModel {
description: description,
requestHeaders: requestHeaders != null ? [...requestHeaders!] : null,
requestParams: requestParams != null ? [...requestParams!] : null,
enabledHeaders: enabledHeaders != null ? [...enabledHeaders!] : null,
enabledParams: enabledParams != null ? [...enabledParams!] : null,
requestBodyContentType: requestBodyContentType,
requestBody: requestBody,
);
@ -64,6 +73,8 @@ class RequestModel {
int? requestTabIndex,
List<NameValueModel>? requestHeaders,
List<NameValueModel>? requestParams,
List<bool>? enabledHeaders,
List<bool>? enabledParams,
ContentType? requestBodyContentType,
String? requestBody,
int? responseStatus,
@ -72,6 +83,8 @@ class RequestModel {
}) {
var headers = requestHeaders ?? this.requestHeaders;
var params = requestParams ?? this.requestParams;
var eHeaders = enabledHeaders ?? this.enabledHeaders;
var eParams = enabledParams ?? this.enabledParams;
return RequestModel(
id: id ?? this.id,
method: method ?? this.method,
@ -81,6 +94,8 @@ class RequestModel {
requestTabIndex: requestTabIndex ?? this.requestTabIndex,
requestHeaders: headers != null ? [...headers] : null,
requestParams: params != null ? [...params] : null,
enabledHeaders: eHeaders != null ? [...eHeaders] : null,
enabledParams: eParams != null ? [...eParams] : null,
requestBodyContentType:
requestBodyContentType ?? this.requestBodyContentType,
requestBody: requestBody ?? this.requestBody,
@ -106,6 +121,8 @@ class RequestModel {
final description = data["description"] as String?;
final requestHeaders = data["requestHeaders"];
final requestParams = data["requestParams"];
final enabledHeaders = data["enabledHeaders"] as List<bool>?;
final enabledParams = data["enabledParams"] as List<bool>?;
try {
requestBodyContentType =
ContentType.values.byName(data["requestBodyContentType"] as String);
@ -136,6 +153,8 @@ class RequestModel {
requestParams: requestParams != null
? mapToRows(Map<String, String>.from(requestParams))
: null,
enabledHeaders: enabledHeaders,
enabledParams: enabledParams,
requestBodyContentType: requestBodyContentType,
requestBody: requestBody,
responseStatus: responseStatus,
@ -153,6 +172,8 @@ class RequestModel {
"description": description,
"requestHeaders": rowsToMap(requestHeaders),
"requestParams": rowsToMap(requestParams),
"enabledHeaders": enabledHeaders,
"enabledParams": enabledParams,
"requestBodyContentType": requestBodyContentType.name,
"requestBody": requestBody,
"responseStatus": includeResponse ? responseStatus : null,
@ -171,7 +192,9 @@ class RequestModel {
"Request Description: $description",
"Request Tab Index: ${requestTabIndex.toString()}",
"Request Headers: ${requestHeaders.toString()}",
"Enabled Headers: ${enabledHeaders.toString()}",
"Request Params: ${requestParams.toString()}",
"Enabled Params: ${enabledParams.toString()}",
"Request Body Content Type: ${requestBodyContentType.toString()}",
"Request Body: ${requestBody.toString()}",
"Response Status: $responseStatus",
@ -192,6 +215,8 @@ class RequestModel {
other.requestTabIndex == requestTabIndex &&
listEquals(other.requestHeaders, requestHeaders) &&
listEquals(other.requestParams, requestParams) &&
listEquals(other.enabledHeaders, enabledHeaders) &&
listEquals(other.enabledParams, enabledParams) &&
other.requestBodyContentType == requestBodyContentType &&
other.requestBody == requestBody &&
other.responseStatus == responseStatus &&
@ -211,6 +236,8 @@ class RequestModel {
requestTabIndex,
requestHeaders,
requestParams,
enabledHeaders,
enabledParams,
requestBodyContentType,
requestBody,
responseStatus,

View File

@ -123,6 +123,8 @@ class CollectionStateNotifier
int? requestTabIndex,
List<NameValueModel>? requestHeaders,
List<NameValueModel>? requestParams,
List<bool>? enabledHeaders,
List<bool>? enabledParams,
ContentType? requestBodyContentType,
String? requestBody,
int? responseStatus,
@ -137,12 +139,13 @@ class CollectionStateNotifier
requestTabIndex: requestTabIndex,
requestHeaders: requestHeaders,
requestParams: requestParams,
enabledHeaders: enabledHeaders,
enabledParams: enabledParams,
requestBodyContentType: requestBodyContentType,
requestBody: requestBody,
responseStatus: responseStatus,
message: message,
responseModel: responseModel);
//print(newModel);
var map = {...state!};
map[id] = newModel;
state = map;
@ -175,7 +178,6 @@ class CollectionStateNotifier
responseModel: responseModel,
);
}
//print(newRequestModel);
ref.read(sentRequestIdStateProvider.notifier).state = null;
var map = {...state!};
map[id] = newRequestModel;

View File

@ -16,6 +16,7 @@ class EditRequestHeaders extends ConsumerStatefulWidget {
class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
late List<NameValueModel> rows;
late List<bool> enabledRows;
final random = Random.secure();
late int seed;
@ -26,9 +27,11 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
}
void _onFieldChange(String activeId) {
ref
.read(collectionStateNotifierProvider.notifier)
.update(activeId, requestHeaders: rows);
ref.read(collectionStateNotifierProvider.notifier).update(
activeId,
requestHeaders: rows,
enabledHeaders: enabledRows,
);
}
@override
@ -42,10 +45,30 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
kNameValueEmptyModel,
]
: rH;
enabledRows = ref.read(activeRequestModelProvider)?.enabledHeaders ??
List.filled(rows.length, true, growable: true);
DaviModel<NameValueModel> model = DaviModel<NameValueModel>(
rows: rows,
columns: [
DaviColumn(
name: 'Checkbox',
width: 36,
cellBuilder: (_, row) {
int idx = row.index;
return CheckBox(
keyId: "$activeId-$idx-headers-c-$seed",
value: enabledRows[idx],
onChanged: (value) {
setState(() {
enabledRows[idx] = value!;
});
_onFieldChange(activeId!);
},
colorScheme: Theme.of(context).colorScheme,
);
},
),
DaviColumn(
name: 'Header Name',
grow: 1,
@ -106,9 +129,13 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
rows = [
kNameValueEmptyModel,
];
enabledRows = [true];
});
} else {
setState(() {
enabledRows.removeAt(row.index);
rows.removeAt(row.index);
});
}
_onFieldChange(activeId!);
},
@ -142,7 +169,10 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
padding: const EdgeInsets.only(bottom: 30),
child: ElevatedButton.icon(
onPressed: () {
setState(() {
rows.add(kNameValueEmptyModel);
enabledRows.add(true);
});
_onFieldChange(activeId!);
},
icon: const Icon(Icons.add),

View File

@ -17,6 +17,7 @@ class EditRequestURLParams extends ConsumerStatefulWidget {
class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
late List<NameValueModel> rows;
late List<bool> enabledRows;
final random = Random.secure();
late int seed;
@ -27,9 +28,11 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
}
void _onFieldChange(String activeId) {
ref
.read(collectionStateNotifierProvider.notifier)
.update(activeId, requestParams: rows);
ref.read(collectionStateNotifierProvider.notifier).update(
activeId,
requestParams: rows,
enabledParams: enabledRows,
);
}
@override
@ -43,10 +46,31 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
kNameValueEmptyModel,
]
: rP;
enabledRows = ref.read(activeRequestModelProvider)?.enabledParams ??
List.filled(rows.length, true, growable: true);
DaviModel<NameValueModel> model = DaviModel<NameValueModel>(
rows: rows,
columns: [
DaviColumn(
name: 'Checkbox',
width: 36,
cellBuilder: (_, row) {
int idx = row.index;
return CheckBox(
keyId: "$activeId-$idx-params-c-$seed",
value: enabledRows[idx],
onChanged: (value) {
setState(() {
enabledRows[idx] = value!;
});
_onFieldChange(activeId!);
},
colorScheme: Theme.of(context).colorScheme,
);
},
),
DaviColumn(
name: 'URL Parameter',
grow: 1,
@ -107,9 +131,13 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
rows = [
kNameValueEmptyModel,
];
enabledRows = [true];
});
} else {
setState(() {
enabledRows.removeAt(row.index);
rows.removeAt(row.index);
});
}
_onFieldChange(activeId!);
},
@ -143,7 +171,10 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
padding: const EdgeInsets.only(bottom: 30),
child: ElevatedButton.icon(
onPressed: () {
setState(() {
rows.add(kNameValueEmptyModel);
enabledRows.add(true);
});
_onFieldChange(activeId!);
},
icon: const Icon(Icons.add),

View File

@ -13,6 +13,7 @@ Future<(http.Response?, Duration?, String?)> request(
(Uri?, String?) uriRec = getValidRequestUri(
requestModel.url,
requestModel.requestParams,
requestModel.enabledParams,
defaultUriScheme: defaultUriScheme,
);
if (uriRec.$1 != null) {

View File

@ -109,3 +109,11 @@ Uint8List jsonMapToBytes(Map<String, dynamic>? map) {
return bytes;
}
}
List<NameValueModel> getEnabledRows(
List<NameValueModel>? rows, List<bool>? enabledList) {
if (rows == null || enabledList == null) {
return rows ?? [];
}
return rows.where((element) => enabledList[rows.indexOf(element)]).toList();
}

View File

@ -81,6 +81,7 @@ Map<String, dynamic> requestModelToHARJsonRequest(
var rec = getValidRequestUri(
requestModel.url,
requestModel.requestParams,
requestModel.enabledParams,
defaultUriScheme: defaultUriScheme,
);

View File

@ -4,7 +4,7 @@ import 'package:collection/collection.dart' show mergeMaps;
import 'package:http_parser/http_parser.dart';
import 'package:xml/xml.dart';
import '../models/models.dart';
import 'convert_utils.dart' show rowsToMap;
import 'convert_utils.dart' show getEnabledRows, rowsToMap;
import '../consts.dart';
String getRequestTitleFromUrl(String? url) {
@ -63,7 +63,7 @@ String stripUrlParams(String url) {
}
(Uri?, String?) getValidRequestUri(
String? url, List<NameValueModel>? requestParams,
String? url, List<NameValueModel>? requestParams, List<bool>? enabledParams,
{String defaultUriScheme = kDefaultUriScheme}) {
url = url?.trim();
if (url == null || url == "") {
@ -88,7 +88,8 @@ String stripUrlParams(String url) {
uri = uri.removeFragment();
}
Map<String, String>? queryParams = rowsToMap(requestParams);
Map<String, String>? queryParams =
rowsToMap(getEnabledRows(requestParams, enabledParams));
if (queryParams != null) {
if (uri.hasQuery) {
Map<String, String> urlQueryParams = uri.queryParameters;

41
lib/widgets/checkbox.dart Normal file
View File

@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
class CheckBox extends StatelessWidget {
final String keyId;
final bool value;
final ValueChanged<bool?> onChanged;
final ColorScheme? colorScheme;
const CheckBox({
super.key,
required this.keyId,
required this.value,
required this.onChanged,
this.colorScheme,
});
@override
Widget build(BuildContext context) {
var colorScheme = this.colorScheme ?? Theme.of(context).colorScheme;
return Checkbox(
key: Key(keyId),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(3),
),
side: BorderSide(
color: colorScheme.surfaceVariant,
width: 1.5,
),
splashRadius: 0,
value: value,
onChanged: onChanged,
checkColor: colorScheme.onPrimary,
fillColor: MaterialStateProperty.resolveWith<Color?>(
(Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return colorScheme.primary;
}
return null;
},
));
}
}

View File

@ -8,6 +8,7 @@ export 'error_message.dart';
export 'dropdowns.dart';
export 'splitviews.dart';
export 'texts.dart';
export 'checkbox.dart';
export 'textfields.dart';
export 'headerfield.dart';
export 'menus.dart';

View File

@ -189,10 +189,10 @@ packages:
dependency: "direct main"
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.17.2"
convert:
dependency: transitive
description:
@ -629,10 +629,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.9.1"
mime:
dependency: transitive
description:
@ -986,10 +986,10 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.11.0"
state_notifier:
dependency: transitive
description:
@ -1002,10 +1002,10 @@ packages:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.1"
stream_transform:
dependency: transitive
description:
@ -1034,26 +1034,26 @@ packages:
dependency: "direct dev"
description:
name: test
sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f
sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46"
url: "https://pub.dev"
source: hosted
version: "1.24.9"
version: "1.24.3"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev"
source: hosted
version: "0.6.1"
version: "0.6.0"
test_core:
dependency: transitive
description:
name: test_core
sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a
sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e"
url: "https://pub.dev"
source: hosted
version: "0.5.9"
version: "0.5.3"
textwrap:
dependency: transitive
description:
@ -1178,10 +1178,10 @@ packages:
dependency: transitive
description:
name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.3.0"
version: "0.1.4-beta"
web_socket_channel:
dependency: transitive
description:
@ -1248,5 +1248,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=3.2.0-194.0.dev <4.0.0"
dart: ">=3.1.0 <4.0.0"
flutter: ">=3.13.0"

View File

@ -182,15 +182,16 @@ void main() {
host: 'api.foss42.com',
path: 'country/data',
queryParameters: {'code': 'US'});
expect(getValidRequestUri(url1, [kvRow1]), (uri1Expected, null));
expect(getValidRequestUri(url1, [kvRow1], null), (uri1Expected, null));
});
test('Testing getValidRequestUri for null url value', () {
const kvRow2 = NameValueModel(name: "code", value: "US");
expect(getValidRequestUri(null, [kvRow2]), (null, "URL is missing!"));
expect(
getValidRequestUri(null, [kvRow2], null), (null, "URL is missing!"));
});
test('Testing getValidRequestUri for empty url value', () {
const kvRow3 = NameValueModel(name: "", value: "");
expect(getValidRequestUri("", [kvRow3]), (null, "URL is missing!"));
expect(getValidRequestUri("", [kvRow3], null), (null, "URL is missing!"));
});
test('Testing getValidRequestUri when https is not provided in url', () {
String url4 = "api.foss42.com/country/data";
@ -200,7 +201,7 @@ void main() {
host: 'api.foss42.com',
path: 'country/data',
queryParameters: {'code': 'US'});
expect(getValidRequestUri(url4, [kvRow4]), (uri4Expected, null));
expect(getValidRequestUri(url4, [kvRow4], null), (uri4Expected, null));
});
test('Testing getValidRequestUri when url has fragment', () {
String url5 = "https://dart.dev/guides/libraries/library-tour#numbers";
@ -208,11 +209,11 @@ void main() {
scheme: 'https',
host: 'dart.dev',
path: '/guides/libraries/library-tour');
expect(getValidRequestUri(url5, null), (uri5Expected, null));
expect(getValidRequestUri(url5, null, null), (uri5Expected, null));
});
test('Testing getValidRequestUri when uri scheme is not supported', () {
String url5 = "mailto:someone@example.com";
expect(getValidRequestUri(url5, null),
expect(getValidRequestUri(url5, null, null),
(null, "Unsupported URL Scheme (mailto)"));
});
test('Testing getValidRequestUri when query params in both url and kvrow',
@ -224,7 +225,7 @@ void main() {
host: 'api.foss42.com',
path: 'country/data',
queryParameters: {'code': 'US'});
expect(getValidRequestUri(url6, [kvRow6]), (uri6Expected, null));
expect(getValidRequestUri(url6, [kvRow6], null), (uri6Expected, null));
});
test('Testing getValidRequestUri when kvrow is null', () {
String url7 = "api.foss42.com/country/data?code=US";
@ -233,7 +234,7 @@ void main() {
host: 'api.foss42.com',
path: 'country/data',
queryParameters: {'code': 'US'});
expect(getValidRequestUri(url7, null), (uri7Expected, null));
expect(getValidRequestUri(url7, null, null), (uri7Expected, null));
});
});