Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions lib/screens/common_widgets/env_editor.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import 'dart:math' as math;
import 'package:apidash/consts.dart';
import 'package:apidash/screens/common_widgets/common_widgets.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:multi_trigger_autocomplete_plus/multi_trigger_autocomplete_plus.dart';


class EnvironmentTextFieldEditor extends StatefulWidget{
const EnvironmentTextFieldEditor({
super.key,
required this.fieldKey,
this.onChanged,
this.initialValue,
this.readOnly = false,
this.hintText,
});

final String fieldKey;
final Function(String)? onChanged;
final String? initialValue;
final bool readOnly;
final String? hintText;

@override
State<StatefulWidget> createState() => _EnvironmentTextField();
}


class _EnvironmentTextField extends State<EnvironmentTextFieldEditor>{
final TextEditingController controller = TextEditingController();
late final FocusNode editorFocusNode;


void insertTab() {
String sp = " ";
int offset = math.min(
controller.selection.baseOffset, controller.selection.extentOffset);
String text = controller.text.substring(0, offset) +
sp +
controller.text.substring(offset);
controller.value = TextEditingValue(
text: text,
selection: controller.selection.copyWith(
baseOffset: controller.selection.baseOffset + sp.length,
extentOffset: controller.selection.extentOffset + sp.length,
),
);
widget.onChanged?.call(text);
}

@override
void initState() {
super.initState();
editorFocusNode = FocusNode(debugLabel: "Editor Focus Node");
}

@override
void dispose() {
editorFocusNode.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return CallbackShortcuts(
bindings: <ShortcutActivator, VoidCallback>{
const SingleActivator(LogicalKeyboardKey.tab): () {
insertTab();
},
},
child: EnvironmentTriggerField(
keyId: widget.fieldKey,
controller: controller,
focusNode: editorFocusNode,
keyboardType: TextInputType.multiline,
expands: true,
maxLines: null,
readOnly: widget.readOnly,
style: kCodeStyle.copyWith(
fontSize: Theme.of(context).textTheme.bodyMedium?.fontSize,
),
textAlignVertical: TextAlignVertical.top,
onChanged: widget.onChanged,
decoration: InputDecoration(
hintText: widget.hintText ?? kHintContent,
hintStyle: TextStyle(
color: Theme.of(context).colorScheme.outlineVariant,
),
focusedBorder: OutlineInputBorder(
borderRadius: kBorderRadius8,
borderSide: BorderSide(
color: Theme.of(context).colorScheme.outlineVariant,
),
),
enabledBorder: OutlineInputBorder(
borderRadius: kBorderRadius8,
borderSide: BorderSide(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
),
),
filled: true,
hoverColor: kColorTransparent,
fillColor: Theme.of(context).colorScheme.surfaceContainerLowest,
),
optionsAlignment: OptionsAlignment.topEnd,
),
);
}

}
20 changes: 17 additions & 3 deletions lib/screens/common_widgets/env_trigger_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ class EnvironmentTriggerField extends StatefulWidget {
this.optionsWidthFactor,
this.autocompleteNoTrigger,
this.readOnly = false,
this.obscureText = false
this.obscureText = false,
this.expands = false,
this.keyboardType,
this.maxLines,
this.textAlignVertical,
this.optionsAlignment = OptionsAlignment.bottom
}) : assert(
!(controller != null && initialValue != null),
'controller and initialValue cannot be simultaneously defined.',
Expand All @@ -36,6 +41,11 @@ class EnvironmentTriggerField extends StatefulWidget {
final AutocompleteNoTrigger? autocompleteNoTrigger;
final bool readOnly;
final bool obscureText;
final TextInputType ? keyboardType;
final bool expands;
final int ? maxLines;
final TextAlignVertical ? textAlignVertical;
final OptionsAlignment optionsAlignment;

@override
State<EnvironmentTriggerField> createState() =>
Expand Down Expand Up @@ -84,6 +94,7 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
textEditingController: controller,
focusNode: _focusNode,
optionsWidthFactor: widget.optionsWidthFactor ?? 1,
optionsAlignment: widget.optionsAlignment,
autocompleteTriggers: [
if (widget.autocompleteNoTrigger != null) widget.autocompleteNoTrigger!,
AutocompleteTrigger(
Expand Down Expand Up @@ -130,8 +141,11 @@ class EnvironmentTriggerFieldState extends State<EnvironmentTriggerField> {
_focusNode.unfocus();
},
readOnly: widget.readOnly,
obscureText: widget.obscureText

obscureText: widget.obscureText,
keyboardType: widget.keyboardType,
expands: widget.expands,
maxLines: widget.maxLines,
textAlignVertical: widget.textAlignVertical
);
},
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:apidash/screens/common_widgets/env_editor.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -62,7 +63,7 @@ class EditRequestBody extends ConsumerWidget {
),
_ => Padding(
padding: kPt5o10,
child: TextFieldEditor(
child: EnvironmentTextFieldEditor(
key: Key("$selectedId-body"),
fieldKey: "$selectedId-body-editor",
initialValue: requestModel?.httpRequestModel?.body,
Expand Down