From a55f918cd6c80aea05065de50016f82e0141773f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 24 Apr 2023 00:54:45 +0530 Subject: [PATCH] Resolves #2 Double click to rename requests --- lib/models/request_model.dart | 18 ++++++ lib/providers/providers.dart | 5 ++ lib/screens/home_page/collection_pane.dart | 22 ++++++- lib/widgets/cards.dart | 71 +++++++++++++++++----- 4 files changed, 99 insertions(+), 17 deletions(-) diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index baba83ed..b72ea9ce 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -10,6 +10,8 @@ class RequestModel { required this.id, this.method = kDefaultHttpMethod, this.url = "", + this.name = "", + this.description = "", this.requestTabIndex = 0, this.requestHeaders, this.requestParams, @@ -23,6 +25,8 @@ class RequestModel { final String id; final HTTPVerb method; final String url; + final String name; + final String description; final int requestTabIndex; final List? requestHeaders; final List? requestParams; @@ -39,6 +43,8 @@ class RequestModel { id: id, method: method, url: url, + name: name, + description: description, requestHeaders: requestHeaders, requestParams: requestParams, requestBodyContentType: requestBodyContentType, @@ -50,6 +56,8 @@ class RequestModel { String? id, HTTPVerb? method, String? url, + String? name, + String? description, int? requestTabIndex, List? requestHeaders, List? requestParams, @@ -63,6 +71,8 @@ class RequestModel { id: id ?? this.id, method: method ?? this.method, url: url ?? this.url, + name: name ?? this.name, + description: description ?? this.description, requestTabIndex: requestTabIndex ?? this.requestTabIndex, requestHeaders: requestHeaders ?? this.requestHeaders, requestParams: requestParams ?? this.requestParams, @@ -87,6 +97,8 @@ class RequestModel { method = kDefaultHttpMethod; } final url = data["url"] as String; + final name = data["name"] as String?; + final description = data["description"] as String?; final requestHeaders = data["requestHeaders"]; final requestParams = data["requestParams"]; try { @@ -110,6 +122,8 @@ class RequestModel { id: id, method: method, url: url, + name: name ?? "", + description: description ?? "", requestTabIndex: 0, requestHeaders: requestHeaders != null ? mapToRows(Map.from(requestHeaders)) @@ -130,6 +144,8 @@ class RequestModel { "id": id, "method": method.name, "url": url, + "name": name, + "description": description, "requestHeaders": rowsToMap(requestHeaders), "requestParams": rowsToMap(requestParams), "requestBodyContentType": requestBodyContentType.name, @@ -146,6 +162,8 @@ class RequestModel { "Request Id: $id", "Request Method: ${method.name}", "Request URL: $url", + "Request Name: $name", + "Request Description: $description", "Request Tab Index: ${requestTabIndex.toString()}", "Request Headers: ${requestHeaders.toString()}", "Request Params: ${requestParams.toString()}", diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index 931f6dcb..d7eb1add 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -24,6 +24,7 @@ class ThemeStateNotifier extends StateNotifier { } final activeIdStateProvider = StateProvider((ref) => null); +final activeIdEditStateProvider = StateProvider((ref) => null); final sentRequestIdStateProvider = StateProvider((ref) => null); final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); @@ -102,6 +103,8 @@ class CollectionStateNotifier extends StateNotifier?> { String id, { HTTPVerb? method, String? url, + String? name, + String? description, int? requestTabIndex, List? requestHeaders, List? requestParams, @@ -115,6 +118,8 @@ class CollectionStateNotifier extends StateNotifier?> { final newModel = state![idx].copyWith( method: method, url: url, + name: name, + description: description, requestTabIndex: requestTabIndex, requestHeaders: requestHeaders, requestParams: requestParams, diff --git a/lib/screens/home_page/collection_pane.dart b/lib/screens/home_page/collection_pane.dart index 75ee0dc1..cab8d95c 100644 --- a/lib/screens/home_page/collection_pane.dart +++ b/lib/screens/home_page/collection_pane.dart @@ -175,15 +175,33 @@ class _RequestItemState extends ConsumerState { @override Widget build(BuildContext context) { final activeRequestId = ref.watch(activeIdStateProvider); + final editRequestId = ref.watch(activeIdEditStateProvider); return SidebarRequestCard( id: widget.id, - activeRequestId: activeRequestId, - url: widget.requestModel.url, method: widget.requestModel.method, + name: widget.requestModel.name, + url: widget.requestModel.url, + activeRequestId: activeRequestId, + editRequestId: editRequestId, onTap: () { ref.read(activeIdStateProvider.notifier).update((state) => widget.id); }, + onDoubleTap: () { + ref.read(activeIdStateProvider.notifier).update((state) => widget.id); + ref + .read(activeIdEditStateProvider.notifier) + .update((state) => widget.id); + }, + onChangedNameEditor: (value) { + value = value.trim(); + ref + .read(collectionStateNotifierProvider.notifier) + .update(editRequestId!, name: value); + }, + onTapOutsideNameEditor: () { + ref.read(activeIdEditStateProvider.notifier).update((state) => null); + }, onMenuSelected: (RequestItemMenuOption item) { if (item == RequestItemMenuOption.delete) { ref.read(activeIdStateProvider.notifier).update((state) => null); diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 1da93c13..b7ca2926 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -8,18 +8,28 @@ class SidebarRequestCard extends StatefulWidget { const SidebarRequestCard({ super.key, required this.id, - required this.activeRequestId, - required this.url, required this.method, + this.name, + this.url, + this.activeRequestId, + this.editRequestId, this.onTap, + this.onDoubleTap, + this.onChangedNameEditor, + this.onTapOutsideNameEditor, this.onMenuSelected, }); final String id; - final String? activeRequestId; - final String url; + final String? name; + final String? url; final HTTPVerb method; + final String? activeRequestId; + final String? editRequestId; final void Function()? onTap; + final void Function()? onDoubleTap; + final Function(String)? onChangedNameEditor; + final Function()? onTapOutsideNameEditor; final Function(RequestItemMenuOption)? onMenuSelected; @override @@ -30,17 +40,29 @@ class _SidebarRequestCardState extends State { @override Widget build(BuildContext context) { final Color color = Theme.of(context).colorScheme.surface; + final Color colorVariant = + Theme.of(context).colorScheme.surfaceVariant.withOpacity(0.5); final Color surfaceTint = Theme.of(context).colorScheme.primary; bool isActiveId = widget.activeRequestId == widget.id; - return Material( - borderRadius: kBorderRadius12, + bool inEditMode = widget.editRequestId == widget.id; + return Card( + shape: const RoundedRectangleBorder( + borderRadius: kBorderRadius12, + ), elevation: isActiveId ? 1 : 0, surfaceTintColor: isActiveId ? surfaceTint : null, - color: color, - type: MaterialType.card, + color: isActiveId + ? Theme.of(context).colorScheme.brightness == Brightness.dark + ? colorVariant + : color + : color, + margin: EdgeInsets.zero, child: InkWell( borderRadius: kBorderRadius12, - onTap: widget.onTap, + hoverColor: colorVariant, + focusColor: colorVariant.withOpacity(0.5), + onTap: inEditMode ? null : widget.onTap, + onDoubleTap: inEditMode ? null : widget.onDoubleTap, child: Padding( padding: EdgeInsets.only( left: 10, @@ -55,14 +77,33 @@ class _SidebarRequestCardState extends State { MethodBox(method: widget.method), kHSpacer5, Expanded( - child: Text( - getRequestTitleFromUrl(widget.url), - softWrap: false, - overflow: TextOverflow.fade, - ), + child: inEditMode + ? TextFormField( + initialValue: widget.name, + autofocus: true, + style: Theme.of(context).textTheme.bodyMedium, + onTapOutside: (_) { + widget.onTapOutsideNameEditor?.call(); + FocusScope.of(context).unfocus(); + }, + onChanged: widget.onChangedNameEditor, + decoration: const InputDecoration( + isCollapsed: true, + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + ), + ) + : Text( + (widget.name != null && + widget.name!.trim().isNotEmpty) + ? widget.name! + : getRequestTitleFromUrl(widget.url), + softWrap: false, + overflow: TextOverflow.fade, + ), ), Visibility( - visible: isActiveId, + visible: isActiveId && !inEditMode, child: RequestCardMenu( onSelected: widget.onMenuSelected, ),