This commit is contained in:
Alex Wied
2026-07-14 21:31:15 -04:00
parent fc970084d7
commit 08b7f30cdf
7 changed files with 227 additions and 15 deletions
+44 -12
View File
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use crate::rdf::ontology::{IndexEntry, LabeledIri, Ontology};
use crate::rdf::term_helper::{TermHelper, TermHelperMut};
use gl_search::{Schema, SearchDocument, SearchIndex, doc, IndexWriter, Value};
use gl_search::{Schema, SearchDocument, SearchIndex, doc, Value};
use http::StatusCode;
use iced::alignment::Horizontal;
use iced::widget::button::Style;
@@ -21,10 +21,12 @@ use oxigraph::model::vocab::{rdf, rdfs};
use oxigraph::model::{BaseDirection, Dataset, NamedNode, Quad, Term};
use tracing::{debug, debug_span, error, trace};
use tracing::span::EnteredSpan;
use crate::navigator::Navigator;
use crate::rdf::curie::CurieHelper;
use crate::rdf::language;
use crate::rdf::vocab::rda;
use crate::widget::iri_input::iri_input;
use crate::widget::navigation_area::navigation_area;
#[derive(Clone, Debug)]
pub(crate) enum Message {
@@ -37,6 +39,7 @@ pub(crate) enum Message {
WindowClosed(window::Id),
URLInputChanged(String),
URLInputSubmitted,
NavigateTo(Url),
FetchDocument(Url),
LoadDocument(RdfSource<KeyedDataset<RowState>>),
ShowNewDocumentButtons,
@@ -64,6 +67,8 @@ pub(crate) enum Message {
NewDocument(NamedNode),
NavigateToPredicate(QuadKey),
NavigateToObject(QuadKey),
NavigateBack,
NavigateForward,
ResetState,
}
@@ -95,6 +100,7 @@ pub(crate) struct Publisher {
abbreviated_datatypes: Vec<String>,
window_id: window::Id,
url_input: String,
navigator: Navigator<Url>,
document: RdfSource<KeyedDataset<RowState>>,
hovered_row: Option<QuadKey>,
search_state: Option<SearchState>,
@@ -139,8 +145,9 @@ impl Publisher {
))
.build();
let url_input = "http://fedora.quill.lan/rest/".to_string();
let document = RdfSource::new(Url::parse(&url_input).unwrap());
let starting_url = Url::parse("http://fedora.quill.lan/rest/").unwrap();
let navigator = Navigator::new(starting_url.clone());
let document = RdfSource::new(starting_url.clone());
(
Self {
@@ -149,7 +156,8 @@ impl Publisher {
ontology,
abbreviated_datatypes,
window_id: id,
url_input,
url_input: starting_url.to_string(),
navigator,
document,
hovered_row: None,
search_state: None,
@@ -255,6 +263,10 @@ impl Publisher {
}
Message::URLInputSubmitted => {
let url = Url::parse(&self.url_input).expect("Invalid URL");
self.navigator.goto(url.clone());
task = Task::done(Message::NavigateTo(url));
}
Message::NavigateTo(url) => {
task = Task::done(Message::DeleteAllRows)
.chain(Task::done(Message::ResetState))
.chain(Task::done(Message::FetchDocument(url)));
@@ -558,18 +570,30 @@ impl Publisher {
}
Message::NavigateToPredicate(key) => {
if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) {
self.url_input = quad.predicate.as_str().to_string();
task = Task::done(Message::URLInputSubmitted);
let url = Url::parse(quad.predicate.as_str()).expect("Invalid URL");
task = Task::done(Message::URLInputChanged(url.to_string()))
.chain(Task::done(Message::URLInputSubmitted));
}
}
Message::NavigateToObject(key) => {
if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) {
if let Term::NamedNode(node) = &quad.object {
self.url_input = node.as_str().to_string();
task = Task::done(Message::URLInputSubmitted);
let url = Url::parse(node.as_str()).expect("Invalid URL");
task = Task::done(Message::URLInputChanged(url.to_string()))
.chain(Task::done(Message::URLInputSubmitted));
}
}
}
Message::NavigateBack => {
let url = self.navigator.back().clone();
task = Task::done(Message::URLInputChanged(url.to_string()))
.chain(Task::done(Message::NavigateTo(url)));
}
Message::NavigateForward => {
let url = self.navigator.forward().clone();
task = Task::done(Message::URLInputChanged(url.to_string()))
.chain(Task::done(Message::NavigateTo(url)));
}
_ => {}
}
task
@@ -634,14 +658,14 @@ impl Publisher {
})
.unwrap_or(Horizontal::Left);
let object_input_base = iri_input(&self.curie_helper, "Object", value.as_str());
let object_input_base = iri_input(&self.curie_helper, "Object", value.as_str())
.on_shift_click(Message::NavigateToObject(key));
let object_input = if self.ontology.is_read_only(triple.as_ref()) {
object_input_base
} else {
object_input_base.align_x(value_alignment)
.on_input(move |value| Message::ObjectUpdated(key, value))
.on_control_click(Message::OpenQueryWindow(SearchResultClickAction::Object(key)))
.on_shift_click(Message::NavigateToObject(key))
};
let selected_datatype = term.datatype()
@@ -797,6 +821,10 @@ impl Publisher {
].into();
}
let back_button = button("\u{21e6}").on_press(Message::NavigateBack);
let forward_button = button("\u{21e8}").on_press(Message::NavigateForward);
let add_row_button = button("Add row").on_press(Message::AddRow(None));
let reindex_ontology_button = button("Rebuild index").on_press(Message::RebuildIndex);
@@ -831,8 +859,10 @@ impl Publisher {
save_button_base
};
let content = column![
let content = navigation_area(column![
row![
back_button,
forward_button,
add_row_button,
reindex_ontology_button,
traverse_button,
@@ -841,7 +871,9 @@ impl Publisher {
],
scrollable(body),
space::vertical(),
];
])
.on_back_click(Message::NavigateBack)
.on_forward_click(Message::NavigateForward);
if self.show_overwrite_confirmation {
let confirmation_modal = container(column![