This commit is contained in:
Alex Wied
2026-07-10 12:20:51 -04:00
parent a19a434e70
commit 9805c2e623
+40 -36
View File
@@ -76,8 +76,8 @@ pub(crate) enum SearchResultClickAction {
struct SearchState { struct SearchState {
window_id: window::Id, window_id: window::Id,
action: SearchResultClickAction, action: SearchResultClickAction,
entity_selection: Option<LabeledIri>,
query: String, query: String,
type_: LabeledIri,
results: Vec<SearchDocument>, results: Vec<SearchDocument>,
} }
@@ -313,46 +313,46 @@ impl Publisher {
self.modified = true; self.modified = true;
} }
Message::OpenQueryWindow(action) => { Message::OpenQueryWindow(action) => {
if let Some(search_state) = &mut self.search_state { let selected_entity_class = match action {
search_state.action = action; SearchResultClickAction::Predicate(_) => Some(rdf::PROPERTY),
} else { SearchResultClickAction::Object(key) => {
if let Some(entity) = self.ontology.searchable_classes(&*language::ENGLISH_OR_UNTAGGED).into_iter().next() { self.document
let (id, window_task) = window::open(Settings::default()); .dataset()
self.search_state = Some(SearchState { .quads
window_id: id, .get(key)
action, .and_then(|quad| if quad.predicate == rdf::TYPE {
query: String::new(), Some(rdfs::CLASS)
type_: entity, } else { None })
results: Vec::new(), },
}); SearchResultClickAction::URLInput => None,
task = window_task.map(|_| Message::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_) => { Message::QueryTypeUpdated(type_) => {
if let Some(search_state) = &mut self.search_state { if let Some(search_state) = &mut self.search_state {
search_state.type_ = type_; search_state.entity_selection = Some(type_);
task = Task::done(Message::QueryUpdated(search_state.query.clone())); task = Task::done(Message::QueryUpdated(search_state.query.clone()));
} }
} }
Message::QueryUpdated(new_query) => { Message::QueryUpdated(new_query) => {
if let Some(search_state) = &mut self.search_state { if let Some(search_state) = &mut self.search_state {
let selected_entity_class = &search_state.type_.iri; let catalog_id = search_state.entity_selection
let catalog_id = match search_state.action { .clone()
SearchResultClickAction::Predicate(_) => self.ontology.catalog_id(&rdf::PROPERTY.into_owned()), .and_then(|info| self.ontology.catalog_id(&info.iri));
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)
})
},
SearchResultClickAction::URLInput => self.ontology.catalog_id(selected_entity_class),
};
let index = self.index.clone(); let index = self.index.clone();
let query = new_query.clone(); let query = new_query.clone();
@@ -677,12 +677,9 @@ impl Publisher {
.into_iter() .into_iter()
.collect::<Vec<_>>(); .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)); .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![ let mut columns = vec![
table::column(text("CURIE"), |document: &SearchDocument| { table::column(text("CURIE"), |document: &SearchDocument| {
let iri = document.get_first(Schema::iri_field()) 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() { for field in fields.into_iter() {
let field_name = field.name.clone(); let field_name = field.name.clone();
columns.push( columns.push(