|
@@ -1,12 +1,20 @@
|
|
|
#![allow(clippy::needless_collect)]
|
|
|
+
|
|
|
use crate::entities::{GridSelectOptionFilter, SelectOptionCondition};
|
|
|
-use crate::services::field::select_option::SelectedSelectOptions;
|
|
|
+use crate::services::cell::{AnyCellData, CellFilterOperation};
|
|
|
+use crate::services::field::select_option::{SelectOptionOperation, SelectedSelectOptions};
|
|
|
+use crate::services::field::{MultiSelectTypeOption, SingleSelectTypeOption};
|
|
|
+use flowy_error::FlowyResult;
|
|
|
|
|
|
impl GridSelectOptionFilter {
|
|
|
pub fn apply(&self, selected_options: &SelectedSelectOptions) -> bool {
|
|
|
let selected_option_ids: Vec<&String> = selected_options.options.iter().map(|option| &option.id).collect();
|
|
|
match self.condition {
|
|
|
SelectOptionCondition::OptionIs => {
|
|
|
+ if self.option_ids.len() != selected_option_ids.len() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
// if selected options equal to filter's options, then the required_options will be empty.
|
|
|
let required_options = self
|
|
|
.option_ids
|
|
@@ -31,6 +39,27 @@ impl GridSelectOptionFilter {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+impl CellFilterOperation<GridSelectOptionFilter> for MultiSelectTypeOption {
|
|
|
+ fn apply_filter(&self, any_cell_data: AnyCellData, filter: &GridSelectOptionFilter) -> FlowyResult<bool> {
|
|
|
+ if !any_cell_data.is_multi_select() {
|
|
|
+ return Ok(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ let selected_options = SelectedSelectOptions::from(self.selected_select_option(any_cell_data));
|
|
|
+ Ok(filter.apply(&selected_options))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl CellFilterOperation<GridSelectOptionFilter> for SingleSelectTypeOption {
|
|
|
+ fn apply_filter(&self, any_cell_data: AnyCellData, filter: &GridSelectOptionFilter) -> FlowyResult<bool> {
|
|
|
+ if !any_cell_data.is_single_select() {
|
|
|
+ return Ok(true);
|
|
|
+ }
|
|
|
+ let selected_options = SelectedSelectOptions::from(self.selected_select_option(any_cell_data));
|
|
|
+ Ok(filter.apply(&selected_options))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[cfg(test)]
|
|
|
mod tests {
|
|
|
#![allow(clippy::all)]
|
|
@@ -41,6 +70,7 @@ mod tests {
|
|
|
fn select_option_filter_is_test() {
|
|
|
let option_1 = SelectOption::new("A");
|
|
|
let option_2 = SelectOption::new("B");
|
|
|
+ let option_3 = SelectOption::new("C");
|
|
|
|
|
|
let filter_1 = GridSelectOptionFilter {
|
|
|
condition: SelectOptionCondition::OptionIs,
|
|
@@ -54,6 +84,21 @@ mod tests {
|
|
|
false
|
|
|
);
|
|
|
|
|
|
+ assert_eq!(
|
|
|
+ filter_1.apply(&SelectedSelectOptions {
|
|
|
+ options: vec![option_1.clone(), option_2.clone(), option_3.clone()],
|
|
|
+ }),
|
|
|
+ true
|
|
|
+ );
|
|
|
+
|
|
|
+ assert_eq!(
|
|
|
+ filter_1.apply(&SelectedSelectOptions {
|
|
|
+ options: vec![option_1.clone(), option_3.clone()],
|
|
|
+ }),
|
|
|
+ true
|
|
|
+ );
|
|
|
+
|
|
|
+ assert_eq!(filter_1.apply(&SelectedSelectOptions { options: vec![] }), true);
|
|
|
assert_eq!(
|
|
|
filter_1.apply(&SelectedSelectOptions {
|
|
|
options: vec![option_1.clone()],
|