now can edit the posts directly from admin panel
							parent
							
								
									0da7e92c09
								
							
						
					
					
						commit
						e983cc1b9d
					
				
							
								
								
									
										58
									
								
								src/admin.rs
								
								
								
								
							
							
						
						
									
										58
									
								
								src/admin.rs
								
								
								
								
							|  | @ -90,7 +90,7 @@ fn add_post(mut cookies: Cookies<'_>) -> Result<Template, Redirect> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[post("/add_post", data = "<post>")] | #[post("/add_post", data = "<post>")] | ||||||
| fn write_post(mut cookies: Cookies<'_>, post: Form<NewPost>) -> Redirect { | fn write_add_post(mut cookies: Cookies<'_>, post: Form<NewPost>) -> Redirect { | ||||||
|     let password = env::var("admin_pass").expect("admin_pass not setted"); |     let password = env::var("admin_pass").expect("admin_pass not setted"); | ||||||
| 
 | 
 | ||||||
|     match cookies.get_private("user") { |     match cookies.get_private("user") { | ||||||
|  | @ -108,6 +108,58 @@ fn write_post(mut cookies: Cookies<'_>, post: Form<NewPost>) -> Redirect { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn get_routes() -> Vec<Route> { | #[get("/edit_post/<id>")] | ||||||
|     routes![index, login, panel, add_post, write_post] | fn edit_post(mut cookies: Cookies<'_>, id: i32) -> Result<Template, Redirect> { | ||||||
|  |     let password = env::var("admin_pass").expect("admin_pass not setted"); | ||||||
|  | 
 | ||||||
|  |     match cookies.get_private("user") { | ||||||
|  |         Some(cookie) => { | ||||||
|  |             if cookie.value() == password { | ||||||
|  |                 let mut context = get_context(); | ||||||
|  | 
 | ||||||
|  |                 let post = posts::get_post(id).unwrap(); | ||||||
|  | 
 | ||||||
|  |                 context.insert("id", &post.id); | ||||||
|  |                 context.insert("title", &post.title); | ||||||
|  |                 context.insert("content", &post.content); | ||||||
|  |                 context.insert("published", &post.published); | ||||||
|  | 
 | ||||||
|  |                 Ok(Template::render("admin/edit_post", context)) | ||||||
|  |             } else { | ||||||
|  |                 Err(Redirect::to("/admin")) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         None => Err(Redirect::to("/admin")), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[post("/edit_post/<id>", data = "<post>")] | ||||||
|  | fn write_edit_post(mut cookies: Cookies<'_>, id: i32, post: Form<NewPost>) -> Redirect { | ||||||
|  |     let password = env::var("admin_pass").expect("admin_pass not setted"); | ||||||
|  | 
 | ||||||
|  |     match cookies.get_private("user") { | ||||||
|  |         Some(cookie) => { | ||||||
|  |             if cookie.value() == password { | ||||||
|  |                 match posts::edit_post(id, &post) { | ||||||
|  |                     Ok(post) => Redirect::to(format!("/post/{}", post.id)), | ||||||
|  |                     Err(_) => Redirect::to("admin/add_post"), | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 Redirect::to("/admin") | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         None => Redirect::to("/admin"), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn get_routes() -> Vec<Route> { | ||||||
|  |     routes![ | ||||||
|  |         index, | ||||||
|  |         login, | ||||||
|  |         panel, | ||||||
|  |         add_post, | ||||||
|  |         write_add_post, | ||||||
|  |         edit_post, | ||||||
|  |         write_edit_post | ||||||
|  |     ] | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -23,9 +23,10 @@ pub mod posts { | ||||||
|         use crate::schema::posts::dsl::*; |         use crate::schema::posts::dsl::*; | ||||||
| 
 | 
 | ||||||
|         let connection = establish_connection(); |         let connection = establish_connection(); | ||||||
|         let visible_posts = posts.filter(published.eq(true)).order(created_at.desc()); |         let visible_posts = posts.order(created_at.desc()); | ||||||
|         let visible_posts = match page { |         let visible_posts = match page { | ||||||
|             Some(number_page) => visible_posts |             Some(number_page) => visible_posts | ||||||
|  |                 .filter(published.eq(true)) | ||||||
|                 .limit(MAX_POSTS_PER_PAGE as i64) |                 .limit(MAX_POSTS_PER_PAGE as i64) | ||||||
|                 .offset((MAX_POSTS_PER_PAGE * (number_page - 1)) as i64) |                 .offset((MAX_POSTS_PER_PAGE * (number_page - 1)) as i64) | ||||||
|                 .load::<Post>(&connection) |                 .load::<Post>(&connection) | ||||||
|  | @ -61,4 +62,17 @@ pub mod posts { | ||||||
|             .values(new_post) |             .values(new_post) | ||||||
|             .get_result(&connection) |             .get_result(&connection) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     pub fn edit_post(updated_id: i32, new_post: &NewPost) -> Result<Post, Error> { | ||||||
|  |         use crate::schema::posts::dsl::*; | ||||||
|  |         let connection = establish_connection(); | ||||||
|  | 
 | ||||||
|  |         diesel::update(posts.filter(id.eq(updated_id))) | ||||||
|  |             .set(( | ||||||
|  |                 title.eq(&new_post.title), | ||||||
|  |                 content.eq(&new_post.content), | ||||||
|  |                 published.eq(&new_post.published), | ||||||
|  |             )) | ||||||
|  |             .get_result(&connection) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,74 @@ | ||||||
|  | {% extends "base" %} | ||||||
|  | 
 | ||||||
|  | {% block extracss %} | ||||||
|  | <style> | ||||||
|  |   div.container { | ||||||
|  |       display: grid; | ||||||
|  |       grid-template-columns: 1fr 1fr; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   div.editable form { | ||||||
|  |       height: 100%; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   div.editable input#title { | ||||||
|  |       width: 76%; | ||||||
|  |       margin: 10px 10px 10px 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   div.editable textarea { | ||||||
|  |       width: 95%; | ||||||
|  |       height: 85%; | ||||||
|  |       box-sizing: border-box; | ||||||
|  |   } | ||||||
|  | </style> | ||||||
|  | {% endblock extracss %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  | <div class="editable"> | ||||||
|  |   <form action="/admin/edit_post/{{ id }}" method="post"> | ||||||
|  |     <input id="title" name="title" type="text" value={{ title }}/> | ||||||
|  |     <label for="">Visible</label> | ||||||
|  |     <input name="published" type="checkbox" value="true"{% if published %}checked{% endif %}/> | ||||||
|  |     <textarea id="content" name="content">{{ content }}</textarea> | ||||||
|  |     <button>Publicar</button> | ||||||
|  |   </form> | ||||||
|  | </div> | ||||||
|  | <div id="preview" class="preview"> | ||||||
|  | </div> | ||||||
|  | {% endblock content %} | ||||||
|  | 
 | ||||||
|  | {% block extrajs %} | ||||||
|  | <script src="https://cdn.jsdelivr.net/npm/showdown@1.9.0/dist/showdown.min.js"></script> | ||||||
|  | <script> | ||||||
|  |   function delay(fn, ms) { | ||||||
|  |       let timer = 0 | ||||||
|  |       return function(...args) { | ||||||
|  |           clearTimeout(timer) | ||||||
|  |           timer = setTimeout(fn.bind(this, ...args), ms || 0) | ||||||
|  |       } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let converter = new showdown.Converter({ | ||||||
|  |       parseImgDimensions: true, | ||||||
|  |       strikethrough: true, | ||||||
|  |       tables: true, | ||||||
|  |       tasklists: true, | ||||||
|  |       emoji: true | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   text = "# " + document.getElementById("title").value.trim() + "\n" + document.getElementById("content").value; | ||||||
|  |   document.getElementById("preview").innerHTML = converter.makeHtml(text); | ||||||
|  | 
 | ||||||
|  |   document.getElementById("content").addEventListener("keyup", delay(() => { | ||||||
|  |       let text = "# " + document.getElementById("title").value.trim() + "\n" + document.getElementById("content").value; | ||||||
|  |       document.getElementById("preview").innerHTML = converter.makeHtml(text); | ||||||
|  |   }, 500)); | ||||||
|  | 
 | ||||||
|  |   document.getElementById("title").addEventListener("keyup", delay(() => { | ||||||
|  |       let text = "# " + document.getElementById("title").value.trim() + "\n" + document.getElementById("content").value; | ||||||
|  |       document.getElementById("preview").innerHTML = converter.makeHtml(text); | ||||||
|  |   }, 500)); | ||||||
|  | </script> | ||||||
|  | {% endblock extrajs %} | ||||||
|  | @ -45,15 +45,14 @@ | ||||||
|         <p class="colored"><a href="/post/{{ post.title | slugify }}-{{ post.id }}">{{ post.title }}</a></p> |         <p class="colored"><a href="/post/{{ post.title | slugify }}-{{ post.id }}">{{ post.title }}</a></p> | ||||||
|         <p class="colored center">0</p> |         <p class="colored center">0</p> | ||||||
|         <p class="colored center">{{ post.published }}</p> |         <p class="colored center">{{ post.published }}</p> | ||||||
|         <p class="colored"><a href="#">Editar</a></p> |         <p class="colored"><a href="/admin/edit_post/{{ post.id }}">Editar</a></p> | ||||||
|       {% else %} |       {% else %} | ||||||
|         <p>{{ post.id }}</p> |         <p>{{ post.id }}</p> | ||||||
|         <p><a href="/post/{{ post.title | slugify }}-{{ post.id }}">{{ post.title }}</a></p> |         <p><a href="/post/{{ post.title | slugify }}-{{ post.id }}">{{ post.title }}</a></p> | ||||||
|         <p class="center">0</p> |         <p class="center">0</p> | ||||||
|         <p class="center">{{ post.published }}</p> |         <p class="center">{{ post.published }}</p> | ||||||
|         <p><a href="#">Editar</a></p> |         <p><a href="/admin/edit_post/{{ post.id }}">Editar</a></p> | ||||||
|       {% endif %} |       {% endif %} | ||||||
|     {% endfor %} |     {% endfor %} | ||||||
|   </div> |   </div> | ||||||
| </h3> |  | ||||||
| {% endblock content %} | {% endblock content %} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 kirbylife
						kirbylife