Skip to content

Commit 963bc40

Browse files
authored
Merge branch 'foss42:main' into har_importer
2 parents ca356f1 + b7f3b81 commit 963bc40

29 files changed

+579
-278
lines changed

integration_test/req_helper.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class ApidashTestRequestHelper {
8484

8585
var headerCells = find.descendant(
8686
of: find.byType(EditRequestHeaders),
87-
matching: find.byType(HeaderField));
87+
matching: find.byType(EnvHeaderField));
8888
var valueCells = find.descendant(
8989
of: find.byType(EditRequestHeaders),
9090
matching: find.byType(EnvCellField));
@@ -95,7 +95,7 @@ class ApidashTestRequestHelper {
9595
tester.testTextInput.enterText(keyValuePairs[i].$2);
9696
headerCells = find.descendant(
9797
of: find.byType(EditRequestHeaders),
98-
matching: find.byType(HeaderField));
98+
matching: find.byType(EnvHeaderField));
9999
valueCells = find.descendant(
100100
of: find.byType(EditRequestHeaders),
101101
matching: find.byType(EnvCellField));
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
export 'api_type_dropdown.dart';
22
export 'button_navbar.dart';
33
export 'code_pane.dart';
4-
export 'editor_title.dart';
54
export 'editor_title_actions.dart';
6-
export 'envfield_url.dart';
5+
export 'editor_title.dart';
6+
export 'env_regexp_span_builder.dart';
7+
export 'env_trigger_field.dart';
8+
export 'env_trigger_options.dart';
79
export 'envfield_cell.dart';
10+
export 'envfield_header.dart';
11+
export 'envfield_url.dart';
812
export 'environment_dropdown.dart';
913
export 'envvar_indicator.dart';
10-
export 'envvar_span.dart';
1114
export 'envvar_popover.dart';
12-
export 'env_trigger_options.dart';
15+
export 'envvar_span.dart';
1316
export 'sidebar_filter.dart';
1417
export 'sidebar_header.dart';
1518
export 'sidebar_save_button.dart';

lib/screens/common_widgets/env_trigger_field.dart

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,54 @@ class EnvironmentTriggerField extends StatefulWidget {
99
super.key,
1010
required this.keyId,
1111
this.initialValue,
12+
this.controller,
13+
this.focusNode,
1214
this.onChanged,
1315
this.onFieldSubmitted,
1416
this.style,
1517
this.decoration,
1618
this.optionsWidthFactor,
17-
});
19+
this.autocompleteNoTrigger,
20+
}) : assert(
21+
!(controller != null && initialValue != null),
22+
'controller and initialValue cannot be simultaneously defined.',
23+
);
1824

1925
final String keyId;
2026
final String? initialValue;
27+
final TextEditingController? controller;
28+
final FocusNode? focusNode;
2129
final void Function(String)? onChanged;
2230
final void Function(String)? onFieldSubmitted;
2331
final TextStyle? style;
2432
final InputDecoration? decoration;
2533
final double? optionsWidthFactor;
34+
final AutocompleteNoTrigger? autocompleteNoTrigger;
2635

2736
@override
2837
State<EnvironmentTriggerField> createState() =>
2938
EnvironmentTriggerFieldState();
3039
}
3140

3241
class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
33-
final TextEditingController controller = TextEditingController();
34-
final FocusNode focusNode = FocusNode();
42+
late TextEditingController controller;
43+
late FocusNode _focusNode;
3544

3645
@override
3746
void initState() {
3847
super.initState();
39-
controller.text = widget.initialValue ?? '';
40-
controller.selection =
41-
TextSelection.collapsed(offset: controller.text.length);
48+
controller = widget.controller ??
49+
TextEditingController.fromValue(TextEditingValue(
50+
text: widget.initialValue!,
51+
selection:
52+
TextSelection.collapsed(offset: widget.initialValue!.length)));
53+
_focusNode = widget.focusNode ?? FocusNode();
4254
}
4355

4456
@override
4557
void dispose() {
4658
controller.dispose();
47-
focusNode.dispose();
59+
_focusNode.dispose();
4860
super.dispose();
4961
}
5062

@@ -53,9 +65,11 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
5365
super.didUpdateWidget(oldWidget);
5466
if ((oldWidget.keyId != widget.keyId) ||
5567
(oldWidget.initialValue != widget.initialValue)) {
56-
controller.text = widget.initialValue ?? "";
57-
controller.selection =
58-
TextSelection.collapsed(offset: controller.text.length);
68+
controller = widget.controller ??
69+
TextEditingController.fromValue(TextEditingValue(
70+
text: widget.initialValue!,
71+
selection: TextSelection.collapsed(
72+
offset: widget.initialValue!.length)));
5973
}
6074
}
6175

@@ -64,9 +78,10 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
6478
return MultiTriggerAutocomplete(
6579
key: Key(widget.keyId),
6680
textEditingController: controller,
67-
focusNode: focusNode,
68-
optionsWidthFactor: widget.optionsWidthFactor,
81+
focusNode: _focusNode,
82+
optionsWidthFactor: widget.optionsWidthFactor ?? 1,
6983
autocompleteTriggers: [
84+
if (widget.autocompleteNoTrigger != null) widget.autocompleteNoTrigger!,
7085
AutocompleteTrigger(
7186
trigger: '{',
7287
triggerEnd: "}}",
@@ -108,7 +123,7 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
108123
onSubmitted: widget.onFieldSubmitted,
109124
specialTextSpanBuilder: EnvRegExpSpanBuilder(),
110125
onTapOutside: (event) {
111-
focusNode.unfocus();
126+
_focusNode.unfocus();
112127
},
113128
);
114129
},

lib/screens/common_widgets/env_trigger_options.dart

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import 'package:apidash/consts.dart';
2-
import 'package:apidash_core/apidash_core.dart';
31
import 'package:apidash_design_system/apidash_design_system.dart';
42
import 'package:flutter/material.dart';
53
import 'package:hooks_riverpod/hooks_riverpod.dart';
64
import 'package:apidash/providers/providers.dart';
5+
import 'package:apidash_core/models/models.dart';
76
import 'package:apidash/utils/utils.dart';
8-
97
import 'envvar_indicator.dart';
108

119
class EnvironmentTriggerOptions extends ConsumerWidget {
@@ -26,41 +24,21 @@ class EnvironmentTriggerOptions extends ConsumerWidget {
2624
getEnvironmentTriggerSuggestions(query, envMap, activeEnvironmentId);
2725
return suggestions == null || suggestions.isEmpty
2826
? const SizedBox.shrink()
29-
: ClipRRect(
30-
borderRadius: kBorderRadius8,
31-
child: Material(
32-
type: MaterialType.card,
33-
elevation: 8,
34-
child: ConstrainedBox(
35-
constraints:
36-
const BoxConstraints(maxHeight: kSuggestionsMenuMaxHeight),
37-
child: Ink(
38-
width: kSuggestionsMenuWidth,
39-
decoration: BoxDecoration(
40-
color: Theme.of(context).colorScheme.surface,
41-
borderRadius: kBorderRadius8,
42-
border: Border.all(
43-
color: Theme.of(context).colorScheme.outlineVariant,
44-
),
45-
),
46-
child: ListView.separated(
47-
shrinkWrap: true,
48-
itemCount: suggestions.length,
49-
separatorBuilder: (context, index) =>
50-
const Divider(height: 2),
51-
itemBuilder: (context, index) {
52-
final suggestion = suggestions[index];
53-
return ListTile(
54-
dense: true,
55-
leading: EnvVarIndicator(suggestion: suggestion),
56-
title: Text(suggestion.variable.key),
57-
subtitle: Text(suggestion.variable.value),
58-
onTap: () => onSuggestionTap(suggestion),
59-
);
60-
},
61-
),
62-
),
63-
),
27+
: SuggestionsMenuBox(
28+
child: ListView.separated(
29+
shrinkWrap: true,
30+
itemCount: suggestions.length,
31+
separatorBuilder: (context, index) => const Divider(height: 2),
32+
itemBuilder: (context, index) {
33+
final suggestion = suggestions[index];
34+
return ListTile(
35+
dense: true,
36+
leading: EnvVarIndicator(suggestion: suggestion),
37+
title: Text(suggestion.variable.key),
38+
subtitle: Text(suggestion.variable.value),
39+
onTap: () => onSuggestionTap(suggestion),
40+
);
41+
},
6442
),
6543
);
6644
}

lib/screens/common_widgets/envfield_cell.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:apidash_design_system/apidash_design_system.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:multi_trigger_autocomplete_plus/multi_trigger_autocomplete_plus.dart';
34
import 'env_trigger_field.dart';
45

56
class EnvCellField extends StatelessWidget {
@@ -10,27 +11,34 @@ class EnvCellField extends StatelessWidget {
1011
this.hintText,
1112
this.onChanged,
1213
this.colorScheme,
14+
this.autocompleteNoTrigger,
15+
this.focusNode,
1316
});
1417

1518
final String keyId;
1619
final String? initialValue;
1720
final String? hintText;
1821
final void Function(String)? onChanged;
1922
final ColorScheme? colorScheme;
23+
final AutocompleteNoTrigger? autocompleteNoTrigger;
24+
final FocusNode? focusNode;
2025

2126
@override
2227
Widget build(BuildContext context) {
2328
var clrScheme = colorScheme ?? Theme.of(context).colorScheme;
2429
return EnvironmentTriggerField(
2530
keyId: keyId,
2631
initialValue: initialValue,
32+
focusNode: focusNode,
2733
style: kCodeStyle.copyWith(
2834
color: clrScheme.onSurface,
35+
fontSize: Theme.of(context).textTheme.bodyMedium?.fontSize,
2936
),
3037
decoration: getTextFieldInputDecoration(
3138
clrScheme,
3239
hintText: hintText,
3340
),
41+
autocompleteNoTrigger: autocompleteNoTrigger,
3442
onChanged: onChanged,
3543
);
3644
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:apidash/widgets/widgets.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:multi_trigger_autocomplete_plus/multi_trigger_autocomplete_plus.dart';
4+
import 'package:apidash/utils/utils.dart';
5+
import 'envfield_cell.dart';
6+
7+
class EnvHeaderField extends StatefulWidget {
8+
const EnvHeaderField({
9+
super.key,
10+
required this.keyId,
11+
this.hintText,
12+
this.initialValue,
13+
this.onChanged,
14+
this.colorScheme,
15+
});
16+
final String keyId;
17+
final String? hintText;
18+
final String? initialValue;
19+
final void Function(String)? onChanged;
20+
final ColorScheme? colorScheme;
21+
22+
@override
23+
State<EnvHeaderField> createState() => _EnvHeaderFieldState();
24+
}
25+
26+
class _EnvHeaderFieldState extends State<EnvHeaderField> {
27+
final FocusNode focusNode = FocusNode();
28+
@override
29+
Widget build(BuildContext context) {
30+
var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme;
31+
return EnvCellField(
32+
keyId: widget.keyId,
33+
hintText: widget.hintText,
34+
initialValue: widget.initialValue ?? "",
35+
focusNode: focusNode,
36+
onChanged: widget.onChanged,
37+
colorScheme: colorScheme,
38+
autocompleteNoTrigger: AutocompleteNoTrigger(
39+
optionsViewBuilder: (context, autocompleteQuery, controller) {
40+
return HeaderSuggestions(
41+
suggestionsCallback: headerSuggestionCallback,
42+
query: autocompleteQuery.query,
43+
onSuggestionTap: (suggestion) {
44+
controller.text = suggestion;
45+
widget.onChanged?.call(controller.text);
46+
focusNode.unfocus();
47+
});
48+
}),
49+
);
50+
}
51+
52+
Future<List<String>?> headerSuggestionCallback(String pattern) async {
53+
if (pattern.isEmpty) {
54+
return null;
55+
}
56+
return getHeaderSuggestions(pattern)
57+
.where(
58+
(suggestion) => suggestion.toLowerCase() != pattern.toLowerCase())
59+
.toList();
60+
}
61+
}

lib/screens/common_widgets/envfield_url.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,21 @@ class EnvURLField extends StatelessWidget {
1010
this.initialValue,
1111
this.onChanged,
1212
this.onFieldSubmitted,
13+
this.focusNode,
1314
});
1415

1516
final String selectedId;
1617
final String? initialValue;
1718
final void Function(String)? onChanged;
1819
final void Function(String)? onFieldSubmitted;
20+
final FocusNode? focusNode;
1921

2022
@override
2123
Widget build(BuildContext context) {
2224
return EnvironmentTriggerField(
2325
keyId: "url-$selectedId",
2426
initialValue: initialValue,
27+
focusNode: focusNode,
2528
style: kCodeStyle,
2629
decoration: InputDecoration(
2730
hintText: kHintTextUrlCard,

lib/screens/history/history_widgets/his_request_pane.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class HisRequestBody extends ConsumerWidget {
140140
// TODO: Fix JsonTextFieldEditor & plug it here
141141
ContentType.json => Padding(
142142
padding: kPt5o10,
143-
child: TextFieldEditor(
143+
child: JsonTextFieldEditor(
144144
key: Key("${selectedHistoryModel?.historyId}-json-body"),
145145
fieldKey:
146146
"${selectedHistoryModel?.historyId}-json-body-viewer",

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class EditRequestBody extends ConsumerWidget {
2020
.select((value) => value?.httpRequestModel?.bodyContentType));
2121
final apiType = ref
2222
.watch(selectedRequestModelProvider.select((value) => value?.apiType));
23+
final mode = ref.watch(settingsProvider.select(
24+
(value) => value.isDark,
25+
));
2326

2427
return Column(
2528
children: [
@@ -42,12 +45,11 @@ class EditRequestBody extends ConsumerWidget {
4245
child: switch (contentType) {
4346
ContentType.formdata =>
4447
const Padding(padding: kPh4, child: FormDataWidget()),
45-
// TODO: Fix JsonTextFieldEditor & plug it here
4648
ContentType.json => Padding(
4749
padding: kPt5o10,
48-
child: TextFieldEditor(
50+
child: JsonTextFieldEditor(
4951
key: Key("$selectedId-json-body"),
50-
fieldKey: "$selectedId-json-body-editor",
52+
fieldKey: "$selectedId-json-body-editor-$mode",
5153
initialValue: requestModel?.httpRequestModel?.body,
5254
onChanged: (String value) {
5355
ref

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
66
import 'package:data_table_2/data_table_2.dart';
77
import 'package:apidash/providers/providers.dart';
8-
import 'package:apidash/widgets/widgets.dart';
98
import 'package:apidash/consts.dart';
109
import 'package:apidash/screens/common_widgets/common_widgets.dart';
1110

@@ -104,7 +103,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
104103
),
105104
),
106105
DataCell(
107-
HeaderField(
106+
EnvHeaderField(
108107
keyId: "$selectedId-$index-headers-k-$seed",
109108
initialValue: headerRows[index].name,
110109
hintText: kHintAddName,

0 commit comments

Comments
 (0)