.
This commit is contained in:
+41
-37
@@ -76,8 +76,8 @@ pub(crate) enum SearchResultClickAction {
|
||||
struct SearchState {
|
||||
window_id: window::Id,
|
||||
action: SearchResultClickAction,
|
||||
entity_selection: Option<LabeledIri>,
|
||||
query: String,
|
||||
type_: LabeledIri,
|
||||
results: Vec<SearchDocument>,
|
||||
}
|
||||
|
||||
@@ -313,47 +313,47 @@ impl Publisher {
|
||||
self.modified = true;
|
||||
}
|
||||
Message::OpenQueryWindow(action) => {
|
||||
if let Some(search_state) = &mut self.search_state {
|
||||
search_state.action = action;
|
||||
} else {
|
||||
if let Some(entity) = self.ontology.searchable_classes(&*language::ENGLISH_OR_UNTAGGED).into_iter().next() {
|
||||
let (id, window_task) = window::open(Settings::default());
|
||||
self.search_state = Some(SearchState {
|
||||
window_id: id,
|
||||
action,
|
||||
query: String::new(),
|
||||
type_: entity,
|
||||
results: Vec::new(),
|
||||
});
|
||||
task = window_task.map(|_| Message::None)
|
||||
};
|
||||
}
|
||||
}
|
||||
Message::QueryTypeUpdated(type_) => {
|
||||
if let Some(search_state) = &mut self.search_state {
|
||||
search_state.type_ = type_;
|
||||
task = Task::done(Message::QueryUpdated(search_state.query.clone()));
|
||||
}
|
||||
}
|
||||
Message::QueryUpdated(new_query) => {
|
||||
if let Some(search_state) = &mut self.search_state {
|
||||
let selected_entity_class = &search_state.type_.iri;
|
||||
let catalog_id = match search_state.action {
|
||||
SearchResultClickAction::Predicate(_) => self.ontology.catalog_id(&rdf::PROPERTY.into_owned()),
|
||||
let selected_entity_class = match action {
|
||||
SearchResultClickAction::Predicate(_) => Some(rdf::PROPERTY),
|
||||
SearchResultClickAction::Object(key) => {
|
||||
self.document
|
||||
.dataset()
|
||||
.quads
|
||||
.get(key)
|
||||
.and_then(|quad| if quad.predicate == rdf::TYPE {
|
||||
self.ontology.catalog_id(&rdfs::CLASS.into_owned())
|
||||
} else {
|
||||
self.ontology.catalog_id(selected_entity_class)
|
||||
})
|
||||
Some(rdfs::CLASS)
|
||||
} else { None })
|
||||
},
|
||||
SearchResultClickAction::URLInput => self.ontology.catalog_id(selected_entity_class),
|
||||
SearchResultClickAction::URLInput => None,
|
||||
};
|
||||
|
||||
let (id, window_task) = window::open(Settings::default());
|
||||
self.search_state = Some(SearchState {
|
||||
window_id: id,
|
||||
action,
|
||||
entity_selection: None,
|
||||
query: String::new(),
|
||||
results: Vec::new(),
|
||||
});
|
||||
task = window_task.map(|_| Message::None);
|
||||
|
||||
if let Some(selected_entity_class) = selected_entity_class {
|
||||
let selection = self.ontology.info(&selected_entity_class.into_owned(), &*language::ENGLISH_OR_UNTAGGED);
|
||||
task = task.chain(Task::done(Message::QueryTypeUpdated(selection)));
|
||||
}
|
||||
}
|
||||
Message::QueryTypeUpdated(type_) => {
|
||||
if let Some(search_state) = &mut self.search_state {
|
||||
search_state.entity_selection = Some(type_);
|
||||
task = Task::done(Message::QueryUpdated(search_state.query.clone()));
|
||||
}
|
||||
}
|
||||
Message::QueryUpdated(new_query) => {
|
||||
if let Some(search_state) = &mut self.search_state {
|
||||
let catalog_id = search_state.entity_selection
|
||||
.clone()
|
||||
.and_then(|info| self.ontology.catalog_id(&info.iri));
|
||||
|
||||
let index = self.index.clone();
|
||||
let query = new_query.clone();
|
||||
let search_task = tokio::task::spawn_blocking(move || {
|
||||
@@ -677,12 +677,9 @@ impl Publisher {
|
||||
.into_iter()
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let type_selector = pick_list(Some(&search_state.type_), entities, ToString::to_string)
|
||||
let type_selector = pick_list(search_state.entity_selection.as_ref(), entities, ToString::to_string)
|
||||
.on_select(|selection| Message::QueryTypeUpdated(selection));
|
||||
|
||||
let fields = self.ontology.fields_for_class(&search_state.type_.iri, &*language::ENGLISH_OR_UNTAGGED)
|
||||
.expect("Unable to load fields for class");
|
||||
|
||||
let mut columns = vec![
|
||||
table::column(text("CURIE"), |document: &SearchDocument| {
|
||||
let iri = document.get_first(Schema::iri_field())
|
||||
@@ -696,6 +693,13 @@ impl Publisher {
|
||||
})
|
||||
];
|
||||
|
||||
let fields = if let Some(selection) = search_state.entity_selection.as_ref() {
|
||||
self.ontology.fields_for_class(&selection.iri, &*language::ENGLISH_OR_UNTAGGED)
|
||||
.expect("Unable to load fields for class")
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
||||
for field in fields.into_iter() {
|
||||
let field_name = field.name.clone();
|
||||
columns.push(
|
||||
|
||||
Reference in New Issue
Block a user