|
@@ -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
|