This commit is contained in:
Alex Wied
2026-07-10 12:20:51 -04:00
parent a19a434e70
commit 9805c2e623
+41 -37
View File
@@ -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(