Refactor server-side initiated edit mode.
Implement support for opening articles for editing without javascript
This commit is contained in:
parent
413675e152
commit
cdcdf8e72f
4 changed files with 17 additions and 7 deletions
|
@ -16,11 +16,12 @@ pub struct ArticleResource {
|
|||
state: State,
|
||||
article_id: i32,
|
||||
revision: i32,
|
||||
edit: bool,
|
||||
}
|
||||
|
||||
impl ArticleResource {
|
||||
pub fn new(state: State, article_id: i32, revision: i32) -> Self {
|
||||
Self { state, article_id, revision }
|
||||
pub fn new(state: State, article_id: i32, revision: i32, edit: bool) -> Self {
|
||||
Self { state, article_id, revision, edit }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,6 +48,7 @@ impl Resource for ArticleResource {
|
|||
revision: i32,
|
||||
created: &'a chrono::DateTime<Local>,
|
||||
|
||||
edit: bool,
|
||||
cancel_url: Option<&'a str>,
|
||||
title: &'a str,
|
||||
raw: &'a str,
|
||||
|
@ -68,6 +70,7 @@ impl Resource for ArticleResource {
|
|||
article_id: data.article_id,
|
||||
revision: data.revision,
|
||||
created: &Local.from_utc_datetime(&data.created),
|
||||
edit: self.edit,
|
||||
cancel_url: Some(&data.slug),
|
||||
title: &data.title,
|
||||
raw: &data.body,
|
||||
|
|
|
@ -56,6 +56,7 @@ impl Resource for NewArticleResource {
|
|||
revision: &'a str,
|
||||
created: &'a str,
|
||||
|
||||
edit: bool,
|
||||
cancel_url: Option<&'a str>,
|
||||
title: &'a str,
|
||||
raw: &'a str,
|
||||
|
@ -76,6 +77,11 @@ impl Resource for NewArticleResource {
|
|||
article_id: NDASH,
|
||||
revision: NDASH,
|
||||
created: NDASH,
|
||||
|
||||
// Implicitly start in edit-mode when no slug is given. This
|
||||
// currently directly corresponds to the /_new endpoint
|
||||
edit: self.slug.is_none(),
|
||||
|
||||
cancel_url: self.slug.as_ref().map(|x| &**x),
|
||||
title: &title,
|
||||
raw: "",
|
||||
|
|
|
@ -59,7 +59,7 @@ impl Lookup for WikiLookup {
|
|||
type Error = Box<::std::error::Error + Send + Sync>;
|
||||
type Future = Box<Future<Item = Option<Self::Resource>, Error = Self::Error>>;
|
||||
|
||||
fn lookup(&self, path: &str, _query: Option<&str>, _fragment: Option<&str>) -> Self::Future {
|
||||
fn lookup(&self, path: &str, query: Option<&str>, _fragment: Option<&str>) -> Self::Future {
|
||||
assert!(path.starts_with("/"));
|
||||
|
||||
if path.starts_with("/_") {
|
||||
|
@ -92,14 +92,15 @@ impl Lookup for WikiLookup {
|
|||
}
|
||||
|
||||
let state = self.state.clone();
|
||||
let edit = query == Some("edit");
|
||||
|
||||
use state::SlugLookup;
|
||||
Box::new(self.state.lookup_slug(slug.clone())
|
||||
.and_then(|x| Ok(Some(match x {
|
||||
.and_then(move |x| Ok(Some(match x {
|
||||
SlugLookup::Miss =>
|
||||
Box::new(NewArticleResource::new(state, Some(slug))) as BoxResource,
|
||||
SlugLookup::Hit { article_id, revision } =>
|
||||
Box::new(ArticleResource::new(state, article_id, revision)) as BoxResource,
|
||||
Box::new(ArticleResource::new(state, article_id, revision, edit)) as BoxResource,
|
||||
SlugLookup::Redirect(slug) =>
|
||||
Box::new(ArticleRedirectResource::new(slug)) as BoxResource,
|
||||
})))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script src="_assets/script-{{script_js_checksum}}.js" defer></script>
|
||||
|
||||
<div class="container {{^cancel_url}}edit{{/cancel_url}}">
|
||||
<div class="container {{#edit?}}edit{{/edit}}">
|
||||
<div class="rendered">
|
||||
{{>article_revision_contents.html}}
|
||||
</div>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<footer>
|
||||
<ul>
|
||||
<li><a href="_new">Create article</a></li>
|
||||
<li><a id="openEditor" href="?editor">Edit</a></li>
|
||||
<li><a id="openEditor" href="?edit">Edit</a></li>
|
||||
</ul>
|
||||
<dl>
|
||||
<dt>Article ID</dt>
|
||||
|
|
Loading…
Reference in a new issue