Merge pull request #1140 from richardshiue/improv-select-options

grid: fix pressing enter on an option that already exists recreates it
This commit is contained in:
Nathan.fooo 2022-09-25 14:04:04 +08:00 committed by GitHub
commit ae3a68efb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 5 deletions

View File

@ -54,6 +54,9 @@ class SelectOptionCellEditorBloc
selectOption: (_SelectOption value) {
_onSelectOption(value.optionId);
},
trySelectOption: (_TrySelectOption value) {
_trySelectOption(value.optionName, emit);
},
filterOption: (_SelectOptionFilter value) {
_filterOption(value.optionName, emit);
},
@ -100,6 +103,36 @@ class SelectOptionCellEditorBloc
}
}
void _trySelectOption(
String optionName, Emitter<SelectOptionEditorState> emit) async {
SelectOptionPB? matchingOption;
bool optionExistsButSelected = false;
for (final option in state.options) {
if (option.name.toLowerCase() == optionName.toLowerCase()) {
if (!state.selectedOptions.contains(option)) {
matchingOption = option;
break;
} else {
optionExistsButSelected = true;
}
}
}
// if there isn't a matching option at all, then create it
if (matchingOption == null && !optionExistsButSelected) {
_createOption(optionName);
}
// if there is an unselected matching option, select it
if (matchingOption != null) {
_selectOptionService.select(optionId: matchingOption.id);
}
// clear the filter
emit(state.copyWith(filter: none()));
}
void _filterOption(String optionName, Emitter<SelectOptionEditorState> emit) {
final _MakeOptionResult result =
_makeOptions(Some(optionName), state.allOptions);
@ -187,6 +220,8 @@ class SelectOptionEditorEvent with _$SelectOptionEditorEvent {
_DeleteOption;
const factory SelectOptionEditorEvent.filterOption(String optionName) =
_SelectOptionFilter;
const factory SelectOptionEditorEvent.trySelectOption(String optionName) =
_TrySelectOption;
}
@freezed

View File

@ -154,10 +154,10 @@ class _TextField extends StatelessWidget {
.read<SelectOptionCellEditorBloc>()
.add(SelectOptionEditorEvent.filterOption(text));
},
onNewTag: (tagName) {
onSubmitted: (tagName) {
context
.read<SelectOptionCellEditorBloc>()
.add(SelectOptionEditorEvent.newOption(tagName));
.add(SelectOptionEditorEvent.trySelectOption(tagName));
},
),
);

View File

@ -17,7 +17,7 @@ class SelectOptionTextField extends StatefulWidget {
final LinkedHashMap<String, SelectOptionPB> selectedOptionMap;
final double distanceToText;
final Function(String) onNewTag;
final Function(String) onSubmitted;
final Function(String) newText;
final VoidCallback? onClick;
@ -26,7 +26,7 @@ class SelectOptionTextField extends StatefulWidget {
required this.selectedOptionMap,
required this.distanceToText,
required this.tagController,
required this.onNewTag,
required this.onSubmitted,
required this.newText,
this.onClick,
TextEditingController? textController,
@ -88,7 +88,7 @@ class _SelectOptionTextFieldState extends State<SelectOptionTextField> {
}
if (text.isNotEmpty) {
widget.onNewTag(text);
widget.onSubmitted(text);
focusNode.requestFocus();
}
},