| 
					
				 | 
			
			
				@@ -96,18 +96,21 @@ impl SelectOptionOperation for SingleSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 impl CellDataOperation for SingleSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> DecodedCellData { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if !type_option_cell_data.is_single_select() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return DecodedCellData::default(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn decode_cell_data<T: Into<TypeOptionCellData>>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        &self, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type_option_cell_data: T, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _field_meta: &FieldMeta, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> DecodedCellData { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let type_option_cell_data = type_option_cell_data.into(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if !type_option_cell_data.is_select_option() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return DecodedCellData::default(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if let Some(option_id) = select_option_ids(type_option_cell_data.data).first() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return match self.options.iter().find(|option| &option.id == option_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    None => DecodedCellData::default(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Some(option) => DecodedCellData::from_content(option.name.clone()), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if let Some(option_id) = select_option_ids(type_option_cell_data.data).first() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return match self.options.iter().find(|option| &option.id == option_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                None => DecodedCellData::default(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Some(option) => DecodedCellData::from_content(option.name.clone()), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DecodedCellData::default() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -129,7 +132,7 @@ impl CellDataOperation for SingleSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             new_cell_data = "".to_string() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Ok(TypeOptionCellData::new(&new_cell_data, self.field_type()).json()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ok(new_cell_data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -185,23 +188,26 @@ impl SelectOptionOperation for MultiSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 impl CellDataOperation for MultiSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> DecodedCellData { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if !type_option_cell_data.is_multi_select() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return DecodedCellData::default(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let option_ids = select_option_ids(type_option_cell_data.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let content = self 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .iter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .filter(|option| option_ids.contains(&option.id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .map(|option| option.name.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .collect::<Vec<String>>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            DecodedCellData::from_content(content) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            DecodedCellData::default() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn decode_cell_data<T: Into<TypeOptionCellData>>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        &self, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type_option_cell_data: T, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _field_meta: &FieldMeta, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> DecodedCellData { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let type_option_cell_data = type_option_cell_data.into(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if !type_option_cell_data.is_select_option() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return DecodedCellData::default(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let option_ids = select_option_ids(type_option_cell_data.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let content = self 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .iter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .filter(|option| option_ids.contains(&option.id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .map(|option| option.name.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .collect::<Vec<String>>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DecodedCellData::from_content(content) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fn apply_changeset<T: Into<CellContentChangeset>>( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -237,7 +243,7 @@ impl CellDataOperation for MultiSelectTypeOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Ok(TypeOptionCellData::new(&new_cell_data, self.field_type()).json()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ok(new_cell_data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -485,108 +491,108 @@ fn make_select_context_from(cell_meta: &Option<CellMeta>, options: &[SelectOptio 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#[cfg(test)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    use crate::services::field::FieldBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    use crate::services::field::{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        MultiSelectTypeOption, MultiSelectTypeOptionBuilder, SelectOption, SelectOptionCellContentChangeset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SingleSelectTypeOption, SingleSelectTypeOptionBuilder, SELECTION_IDS_SEPARATOR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    use crate::services::row::CellDataOperation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn single_select_test() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let google_option = SelectOption::new("Google"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let facebook_option = SelectOption::new("Facebook"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let twitter_option = SelectOption::new("Twitter"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let single_select = SingleSelectTypeOptionBuilder::default() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(google_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(facebook_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(twitter_option); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let field_meta = FieldBuilder::new(single_select) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .name("Platform") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .visibility(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let type_option = SingleSelectTypeOption::from(&field_meta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let option_ids = vec![google_option.id.clone(), facebook_option.id].join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let data = SelectOptionCellContentChangeset::from_insert(&option_ids).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let data = SelectOptionCellContentChangeset::from_insert(&google_option.id).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .apply_changeset(SelectOptionCellContentChangeset::from_insert("").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .apply_changeset(SelectOptionCellContentChangeset::from_insert("123").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid changeset 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert!(type_option.apply_changeset("123", None).is_err()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn multi_select_test() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let google_option = SelectOption::new("Google"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let facebook_option = SelectOption::new("Facebook"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let twitter_option = SelectOption::new("Twitter"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let multi_select = MultiSelectTypeOptionBuilder::default() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(google_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(facebook_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .option(twitter_option); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let field_meta = FieldBuilder::new(multi_select) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .name("Platform") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .visibility(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let type_option = MultiSelectTypeOption::from(&field_meta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let option_ids = vec![google_option.id.clone(), facebook_option.id.clone()].join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let data = SelectOptionCellContentChangeset::from_insert(&option_ids).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            vec![google_option.name.clone(), facebook_option.name].join(SELECTION_IDS_SEPARATOR), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let data = SelectOptionCellContentChangeset::from_insert(&google_option.id).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .apply_changeset(SelectOptionCellContentChangeset::from_insert("").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .apply_changeset(SelectOptionCellContentChangeset::from_insert("123,456").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Invalid changeset 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert!(type_option.apply_changeset("123", None).is_err()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// #[cfg(test)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     use crate::services::field::FieldBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     use crate::services::field::{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         MultiSelectTypeOption, MultiSelectTypeOptionBuilder, SelectOption, SelectOptionCellContentChangeset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         SingleSelectTypeOption, SingleSelectTypeOptionBuilder, SELECTION_IDS_SEPARATOR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     use crate::services::row::CellDataOperation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     fn single_select_test() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let google_option = SelectOption::new("Google"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let facebook_option = SelectOption::new("Facebook"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let twitter_option = SelectOption::new("Twitter"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let single_select = SingleSelectTypeOptionBuilder::default() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(google_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(facebook_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(twitter_option); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let field_meta = FieldBuilder::new(single_select) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .name("Platform") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .visibility(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let type_option = SingleSelectTypeOption::from(&field_meta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let option_ids = vec![google_option.id.clone(), facebook_option.id].join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let data = SelectOptionCellContentChangeset::from_insert(&option_ids).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let data = SelectOptionCellContentChangeset::from_insert(&google_option.id).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .apply_changeset(SelectOptionCellContentChangeset::from_insert("").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .apply_changeset(SelectOptionCellContentChangeset::from_insert("123").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid changeset 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert!(type_option.apply_changeset("123", None).is_err()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     fn multi_select_test() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let google_option = SelectOption::new("Google"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let facebook_option = SelectOption::new("Facebook"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let twitter_option = SelectOption::new("Twitter"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let multi_select = MultiSelectTypeOptionBuilder::default() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(google_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(facebook_option.clone()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .option(twitter_option); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let field_meta = FieldBuilder::new(multi_select) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .name("Platform") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .visibility(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let type_option = MultiSelectTypeOption::from(&field_meta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let option_ids = vec![google_option.id.clone(), facebook_option.id.clone()].join(SELECTION_IDS_SEPARATOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let data = SelectOptionCellContentChangeset::from_insert(&option_ids).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             vec![google_option.name.clone(), facebook_option.name].join(SELECTION_IDS_SEPARATOR), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let data = SelectOptionCellContentChangeset::from_insert(&google_option.id).to_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option.apply_changeset(data, None).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             type_option.decode_cell_data(cell_data, &field_meta).content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             google_option.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .apply_changeset(SelectOptionCellContentChangeset::from_insert("").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid option id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         let cell_data = type_option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .apply_changeset(SelectOptionCellContentChangeset::from_insert("123,456").to_str(), None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//             .unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert_eq!(type_option.decode_cell_data(cell_data, &field_meta).content, "",); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         // Invalid changeset 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//         assert!(type_option.apply_changeset("123", None).is_err()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// } 
			 |