Skip to content

New Widget: Tag Input #1893

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Mar 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a3c2ebc
added mentionable input support
mehsaandev Jan 29, 2025
4e5f2ec
added TagInput widget
mehsaandev Jan 31, 2025
64153ad
updated utils for taginput
mehsaandev Feb 2, 2025
7838ffd
Added itemTemplate
mehsaandev Feb 3, 2025
b5d5639
Merge branch 'main' into mentionable-input
mehsaandev Feb 4, 2025
cbe68d1
fixed data list
mehsaandev Feb 11, 2025
5ea49fd
Added ItemTemplate for TagInput
mehsaandev Feb 17, 2025
7875e4f
Added: Search Tag
mehsaandev Feb 27, 2025
fbd4aef
Merge branch 'main' into mentionable-input
mehsaandev Feb 27, 2025
02c373c
revert textformfield
mehsaandev Feb 28, 2025
db6c0b6
fixed indentation
mehsaandev Feb 28, 2025
31f4af1
Added Dynamic triggers styling
mehsaandev Feb 28, 2025
7c73b82
Added endingWidget for TagInput
mehsaandev Feb 28, 2025
58eebd4
Removed unused imports
mehsaandev Mar 3, 2025
04a53bc
Merge branch 'main' into mentionable-input
mehsaandev Mar 13, 2025
66a4841
added common utlity for Tag and Text input
mehsaandev Mar 13, 2025
193686d
updated taginput
mehsaandev Mar 13, 2025
940d34b
removed tags list, Only item-template will work
mehsaandev Mar 13, 2025
91a5245
Updated overlay height adjustments & preserved overlay focus
mehsaandev Mar 18, 2025
d92f06a
added overlay check for dynamic triggers
mehsaandev Mar 18, 2025
e1d0a42
updated Tag/TextInputController inheritance
mehsaandev Mar 26, 2025
caf0a5c
Merge branch 'main' into mentionable-input
mehsaandev Mar 26, 2025
8719ae5
Merge branch 'main' into mentionable-input
mehsaandev Mar 26, 2025
b4d4479
Merge branch 'main' into mentionable-input
mehsaandev Mar 26, 2025
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
75 changes: 75 additions & 0 deletions modules/ensemble/lib/util/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,81 @@ class Utils {
return null;
}

static BorderRadiusGeometry? getBorderRadiusGeometry(dynamic value) {
if (value is int) {
// Optimize: Ignore zero border radius as it causes unnecessary clipping
if (value != 0) {
return BorderRadius.all(Radius.circular(value.toDouble()));
}
} else if (value is String) {
// Convert the string to a list of integers
List<int> numbers = stringToIntegers(value, min: 0);

// Handle 1 to 4 values for BorderRadius
switch (numbers.length) {
case 1:
return BorderRadius.all(Radius.circular(numbers[0].toDouble()));
case 2:
return BorderRadius.vertical(
top: Radius.circular(numbers[0].toDouble()),
bottom: Radius.circular(numbers[1].toDouble()),
);
case 3:
return BorderRadius.only(
topLeft: Radius.circular(numbers[0].toDouble()),
topRight: Radius.circular(numbers[1].toDouble()),
bottomLeft: Radius.circular(numbers[2].toDouble()),
);
case 4:
return BorderRadius.only(
topLeft: Radius.circular(numbers[0].toDouble()),
topRight: Radius.circular(numbers[1].toDouble()),
bottomRight: Radius.circular(numbers[2].toDouble()),
bottomLeft: Radius.circular(numbers[3].toDouble()),
);
default:
throw LanguageError('borderRadius requires 1 to 4 integers');
}
}

// If the input is invalid, return null
return null;
}

static BoxDecoration? getBoxDecoration(dynamic style) {
if (style is Map) {
return BoxDecoration(
color: Utils.getColor(style['backgroundColor']),
border: Border.all(
color: Utils.getColor(style['borderColor']) ?? Colors.transparent,
width: Utils.optionalDouble(style['borderWidth']) ?? 1.0,

),
borderRadius: getBorderRadiusGeometry(style['borderRadius']),
boxShadow: [
if (style['shadow'] != null) BoxShadow(
blurRadius: Utils.optionalDouble(style['shadow']['blurRadius']) ?? 0.0,
color: Utils.getColor(style['shadow']['color']) ?? Colors.black,
offset: Utils.getOffset(style['shadow']['offset']) ?? Offset.zero,
spreadRadius: Utils.optionalDouble(style['shadow']['spreadRadius']) ?? 0.0,
),
],
gradient: style['gradient'] != null ? LinearGradient(
begin: getAlignment(style['gradient']['begin']) ?? Alignment.centerLeft,
end: getAlignment(style['gradient']['end']) ?? Alignment.centerRight,
colors: (style['gradient']['colors'] as List?)
?.map((c) => Utils.getColor(c) ?? Colors.transparent)
.toList() ?? [Colors.transparent],
stops: (style['gradient']['stops'] as List?)
?.map((s) => Utils.optionalDouble(s) ?? 0.0)
.toList(),
) : null,
backgroundBlendMode: BlendMode.values.from(style['blendMode']),
shape: BoxShape.values.from(style['shape']) ?? BoxShape.rectangle,
);
}
return null;
}
/// return the padding/margin value
static EdgeInsets getInsets(dynamic value, {EdgeInsets? fallback}) {
return optionalInsets(value) ?? fallback ?? const EdgeInsets.all(0);
Expand Down
2 changes: 1 addition & 1 deletion modules/ensemble/lib/widget/confirmation_input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import 'package:ensemble/framework/widget/widget.dart' as framework;
import 'package:ensemble/framework/widget/icon.dart' as ensembleIcon;
import 'package:ensemble/widget/helpers/box_wrapper.dart';
import 'package:ensemble/widget/helpers/controllers.dart';
import 'package:ensemble/widget/helpers/input_field_helper.dart';
import 'package:ensemble/widget/helpers/widgets.dart';
import 'package:ensemble/widget/input/form_textfield.dart';
import 'package:flutter/material.dart';
import 'package:ensemble_ts_interpreter/invokables/invokable.dart';
import 'package:otp_pin_field/otp_pin_field.dart';
Expand Down
Loading