mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
Changed blog add/edit posts to use separate pages instead of modal popups. Also added editor helpers.
This commit is contained in:
parent
563ff86c3a
commit
23b6e61efc
@ -26,11 +26,27 @@ namespace Teknik.Areas.Blog
|
||||
new { controller = "Blog", action = "Blog", username = string.Empty }, // Parameter defaults
|
||||
new[] { typeof(Controllers.BlogController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"Blog.New", // Route name
|
||||
new List<string>() { "blog" }, // Subdomains
|
||||
new List<string>() { config.Host },
|
||||
"{username}/New", // URL with parameters
|
||||
new { controller = "Blog", action = "NewPost", username = "" }, // Parameter defaults
|
||||
new[] { typeof(Controllers.BlogController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"Blog.Edit", // Route name
|
||||
new List<string>() { "blog" }, // Subdomains
|
||||
new List<string>() { config.Host },
|
||||
"{username}/Edit/{id}", // URL with parameters
|
||||
new { controller = "Blog", action = "EditPost", username = "", id = 0 }, // Parameter defaults
|
||||
new[] { typeof(Controllers.BlogController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"Blog.Post", // Route name
|
||||
new List<string>() { "blog" }, // Subdomains
|
||||
new List<string>() { config.Host },
|
||||
"{username}/{id}", // URL with parameters
|
||||
"{username}/p/{id}", // URL with parameters
|
||||
new { controller = "Blog", action = "Post", username = "", id = 0 }, // Parameter defaults
|
||||
new[] { typeof(Controllers.BlogController).Namespace }
|
||||
);
|
||||
@ -50,6 +66,7 @@ namespace Teknik.Areas.Blog
|
||||
"~/Areas/Blog/Scripts/Blog.js"));
|
||||
// Register Style Bundles
|
||||
BundleTable.Bundles.Add(new StyleBundle("~/Content/blog").Include(
|
||||
"~/Scripts/mdd_styles.css",
|
||||
"~/Areas/Blog/Content/Blog.css"));
|
||||
}
|
||||
}
|
||||
|
@ -116,6 +116,77 @@ namespace Teknik.Areas.Blog.Controllers
|
||||
return View("~/Areas/Blog/Views/Blog/ViewPost.cshtml", model);
|
||||
}
|
||||
|
||||
public ActionResult NewPost(string username)
|
||||
{
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
|
||||
}
|
||||
BlogViewModel model = new BlogViewModel();
|
||||
// find the post specified
|
||||
bool isAuth = User.IsInRole("Admin");
|
||||
var blog = db.Blogs.Where(p => (p.User.Username == username) && (p.User.Username == User.Identity.Name || isAuth)).FirstOrDefault();
|
||||
if (blog != null)
|
||||
{
|
||||
model = new BlogViewModel(blog);
|
||||
if (blog.User.Username == Constants.SERVERUSER)
|
||||
{
|
||||
ViewBag.Title = model.Title + " - " + Config.BlogConfig.Title + " - " + Config.Title;
|
||||
ViewBag.Description = Config.BlogConfig.Description;
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewBag.Title = username + "'s Blog - " + Config.Title;
|
||||
if (!string.IsNullOrEmpty(blog.User.BlogSettings.Title))
|
||||
{
|
||||
ViewBag.Title = blog.User.BlogSettings.Title + " - " + ViewBag.Title;
|
||||
}
|
||||
ViewBag.Title = model.Title + " - " + ViewBag.Title;
|
||||
ViewBag.Description = blog.User.BlogSettings.Description;
|
||||
}
|
||||
return View("~/Areas/Blog/Views/Blog/NewPost.cshtml", model);
|
||||
}
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Blog does not exist.";
|
||||
return View("~/Areas/Blog/Views/Blog/Blog.cshtml", model);
|
||||
}
|
||||
public ActionResult EditPost(string username, int id)
|
||||
{
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
|
||||
}
|
||||
PostViewModel model = new PostViewModel();
|
||||
// find the post specified
|
||||
bool isAuth = User.IsInRole("Admin");
|
||||
var post = db.BlogPosts.Where(p => (p.Blog.User.Username == username && p.BlogPostId == id) &&
|
||||
(p.Published || p.Blog.User.Username == User.Identity.Name || isAuth)).FirstOrDefault();
|
||||
if (post != null)
|
||||
{
|
||||
model = new PostViewModel(post);
|
||||
|
||||
if (post.System)
|
||||
{
|
||||
ViewBag.Title = model.Title + " - " + Config.BlogConfig.Title + " - " + Config.Title;
|
||||
ViewBag.Description = Config.BlogConfig.Description;
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewBag.Title = username + "'s Blog - " + Config.Title;
|
||||
if (!string.IsNullOrEmpty(post.Blog.User.BlogSettings.Title))
|
||||
{
|
||||
ViewBag.Title = post.Blog.User.BlogSettings.Title + " - " + ViewBag.Title;
|
||||
}
|
||||
ViewBag.Title = model.Title + " - " + ViewBag.Title;
|
||||
ViewBag.Description = post.Blog.User.BlogSettings.Description;
|
||||
}
|
||||
return View("~/Areas/Blog/Views/Blog/EditPost.cshtml", model);
|
||||
}
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Blog Post does not exist.";
|
||||
return View("~/Areas/Blog/Views/Blog/ViewPost.cshtml", model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public ActionResult GetPosts(int blogID, int startPostID, int count)
|
||||
@ -134,39 +205,33 @@ namespace Teknik.Areas.Blog.Controllers
|
||||
return PartialView("~/Areas/Blog/Views/Blog/Posts.cshtml", postViews);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public ActionResult GetPostTitle(int postID)
|
||||
{
|
||||
bool isAuth = User.IsInRole("Admin");
|
||||
BlogPost post = db.BlogPosts.Where(p => (p.BlogPostId == postID) && (p.Published || p.Blog.User.Username == User.Identity.Name || isAuth)).FirstOrDefault();
|
||||
if (post != null)
|
||||
{
|
||||
return Json(new { result = post.Title });
|
||||
}
|
||||
return Json(new { error = "No title found" });
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public ActionResult GetPostArticle(int postID)
|
||||
{
|
||||
bool isAuth = User.IsInRole("Admin");
|
||||
BlogPost post = db.BlogPosts.Where(p => (p.BlogPostId == postID) && (p.Published || p.Blog.User.Username == User.Identity.Name || isAuth)).FirstOrDefault();
|
||||
if (post != null)
|
||||
{
|
||||
return Json(new { result = post.Article });
|
||||
}
|
||||
return Json(new { error = "No article found" });
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult CreatePost(int blogID, string title, string article)
|
||||
{
|
||||
BlogViewModel model = new BlogViewModel();
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
bool isAuth = User.IsInRole("Admin");
|
||||
var blog = db.Blogs.Where(p => (p.BlogId == blogID) && (p.User.Username == User.Identity.Name || isAuth)).FirstOrDefault();
|
||||
if (blog != null)
|
||||
{
|
||||
if (User.IsInRole("Admin") || db.Blogs.Where(b => b.User.Username == User.Identity.Name).FirstOrDefault() != null)
|
||||
{
|
||||
// Validate the fields
|
||||
if (string.IsNullOrEmpty(title))
|
||||
{
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You must write something for the title";
|
||||
return View("~/Areas/Blog/Views/Blog/NewPost.cshtml", model);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(article))
|
||||
{
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You must write something for the article";
|
||||
return View("~/Areas/Blog/Views/Blog/NewPost.cshtml", model);
|
||||
}
|
||||
|
||||
bool system = (blogID == Config.BlogConfig.ServerBlogId);
|
||||
if (system)
|
||||
{
|
||||
@ -187,35 +252,66 @@ namespace Teknik.Areas.Blog.Controllers
|
||||
|
||||
db.BlogPosts.Add(post);
|
||||
db.SaveChanges();
|
||||
return Json(new { result = true });
|
||||
return Post(blog.User.Username, post.BlogPostId);
|
||||
}
|
||||
return Json(new { error = "You are not authorized to create a post for this blog" });
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You are not authorized to create a post for this blog";
|
||||
return View("~/Areas/Blog/Views/Blog/Blog.cshtml", model);
|
||||
}
|
||||
return Json(new { error = "No post created" });
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Blog does not exist.";
|
||||
return View("~/Areas/Blog/Views/Blog/Blog.cshtml", model);
|
||||
}
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "No post created";
|
||||
return View("~/Areas/Blog/Views/Blog/NewPost.cshtml", model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult EditPost(int postID, string title, string article)
|
||||
{
|
||||
PostViewModel model = new PostViewModel();
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
BlogPost post = db.BlogPosts.Where(p => p.BlogPostId == postID).FirstOrDefault();
|
||||
if (post != null)
|
||||
{
|
||||
model = new PostViewModel(post);
|
||||
if (User.IsInRole("Admin") || post.Blog.User.Username == User.Identity.Name)
|
||||
{
|
||||
// Validate the fields
|
||||
if (string.IsNullOrEmpty(title))
|
||||
{
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You must write something for the title";
|
||||
return View("~/Areas/Blog/Views/Blog/EditPost.cshtml", model);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(article))
|
||||
{
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You must write something for the article";
|
||||
return View("~/Areas/Blog/Views/Blog/EditPost.cshtml", model);
|
||||
}
|
||||
|
||||
post.Title = title;
|
||||
post.Article = article;
|
||||
post.DateEdited = DateTime.Now;
|
||||
db.Entry(post).State = EntityState.Modified;
|
||||
db.SaveChanges();
|
||||
return Json(new { result = true });
|
||||
return Post(post.Blog.User.Username, post.BlogPostId);
|
||||
}
|
||||
return Json(new { error = "You are not authorized to edit this post" });
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "You are not authorized to edit this post";
|
||||
return View("~/Areas/Blog/Views/Blog/EditPost.cshtml", model);
|
||||
}
|
||||
return Json(new { error = "No post found" });
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Post does not exist.";
|
||||
return View("~/Areas/Blog/Views/Blog/ViewPost.cshtml", model);
|
||||
}
|
||||
return Json(new { error = "Invalid Parameters" });
|
||||
model.Error = true;
|
||||
model.ErrorMessage = "Invalid Parameters";
|
||||
return View("~/Areas/Blog/Views/Blog/EditPost.cshtml", model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
|
@ -1,72 +1,8 @@
|
||||
$(document).ready(function () {
|
||||
$("#blog_submit").click(function () {
|
||||
$('#newPost').modal('hide');
|
||||
blogID = $("#blog_blogid").val();
|
||||
title = $("#blog_title").val();
|
||||
post = $("#blog_post").val();
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: addPostURL,
|
||||
data: { blogID: blogID, title: title, article: post },
|
||||
success: function (html) {
|
||||
if (html.result) {
|
||||
window.location.reload();
|
||||
}
|
||||
else {
|
||||
$("#top_msg").css('display', 'inline', 'important');
|
||||
$("#top_msg").html('<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' + html.error + '</div>');
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#editPost').on('show.bs.modal', function (e) {
|
||||
$("#edit_blog_post").val("");
|
||||
postID = $(e.relatedTarget).attr("id");
|
||||
$("#edit_blog_postid").val(postID);
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: getPostTitleURL,
|
||||
data: { postID: postID },
|
||||
success: function (html) {
|
||||
if (html.result) {
|
||||
$("#edit_blog_title").val(html.result);
|
||||
}
|
||||
}
|
||||
});
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: getPostArticleURL,
|
||||
data: { postID: postID },
|
||||
success: function (html) {
|
||||
if (html.result) {
|
||||
$("#edit_blog_post").val(html.result);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#edit_submit").click(function () {
|
||||
$('#editPost').modal('hide');
|
||||
postID = $("#edit_blog_postid").val();
|
||||
title = $("#edit_blog_title").val();
|
||||
post = $("#edit_blog_post").val();
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: editPostURL,
|
||||
data: { postID: postID, title: title, article: post },
|
||||
success: function (html) {
|
||||
if (html.result) {
|
||||
window.location.reload();
|
||||
}
|
||||
else {
|
||||
$("#top_msg").css('display', 'inline', 'important');
|
||||
$("#top_msg").html('<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' + html.error + '</div>');
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
$("textarea.mdd_editor").MarkdownDeep({
|
||||
help_location: helpURL,
|
||||
disableTabHandling: false,
|
||||
resizebar: false
|
||||
});
|
||||
|
||||
$("#comment_submit").click(function () {
|
||||
|
@ -22,5 +22,20 @@ namespace Teknik.Areas.Blog.ViewModels
|
||||
public User User { get; set; }
|
||||
|
||||
public bool HasPosts { get; set; }
|
||||
|
||||
public BlogViewModel()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public BlogViewModel(Models.Blog blog)
|
||||
{
|
||||
BlogId = blog.BlogId;
|
||||
UserId = blog.UserId;
|
||||
Title = blog.User.BlogSettings.Title;
|
||||
Description = blog.User.BlogSettings.Description;
|
||||
User = blog.User;
|
||||
HasPosts = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,11 +8,7 @@
|
||||
var uploadURL = '@Url.SubRouteUrl("upload", "Upload.Upload")';
|
||||
|
||||
var getPostsURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPosts" })';
|
||||
var getPostTitleURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPostTitle" })';
|
||||
var getPostArticleURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPostArticle" })';
|
||||
var publishPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "PublishPost" })';
|
||||
var addPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "CreatePost" })';
|
||||
var editPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "EditPost" })';
|
||||
var deletePostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "DeletePost" })';
|
||||
|
||||
var getCommentsURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetComments" })';
|
||||
@ -45,69 +41,7 @@
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-center">
|
||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#newPost">Create Post</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="newPost" tabindex="-1" role="dialog" aria-labelledby="newPostLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form class="form" action="##" method="post" id="publishPost">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Cancel</span></button>
|
||||
<h4 class="modal-title" id="newPostLabel">Create a New Post</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input name="blog_blogid" id="blog_blogid" type="hidden" value="@Model.BlogId" />
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="blog_title"><h4>Title</h4></label>
|
||||
<input class="form-control" name="blog_title" id="blog_title" placeholder="generic click bait" title="enter a title for your post." type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="blog_post"><h4>Article</h4></label>
|
||||
<textarea class="form-control wmd-input" name="blog_post" id="blog_post" placeholder="I ate a burger today." title="enter any information you want to share with the world." data-provide="markdown" rows="10"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-primary" id="blog_submit">Create</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="editPost" tabindex="-1" role="dialog" aria-labelledby="editPostLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form class="form" action="##" method="post" id="editPostForm">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Cancel</span></button>
|
||||
<h4 class="modal-title" id="editPostLabel">Edit Your Post</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input name="edit_blog_postid" id="edit_blog_postid" type="hidden" />
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="edit_blog_title"><h4>Title</h4></label>
|
||||
<input class="form-control" name="edit_blog_title" id="edit_blog_title" placeholder="generic click bait" title="enter a title for your post." type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="edit_blog_post"><h4>Article</h4></label>
|
||||
<textarea class="form-control" name="edit_blog_post" id="edit_blog_post" placeholder="I ate a burger today." title="enter any information you want to share with the world." data-provide="markdown" rows="10"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-primary" id="edit_submit">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<a href="@Url.SubRouteUrl("blog", "Blog.New", new { username = Model.User.Username })" role="button" class="btn btn-primary">Create Post</a>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
59
Teknik/Areas/Blog/Views/Blog/EditPost.cshtml
Normal file
59
Teknik/Areas/Blog/Views/Blog/EditPost.cshtml
Normal file
@ -0,0 +1,59 @@
|
||||
@model Teknik.Areas.Blog.ViewModels.PostViewModel
|
||||
|
||||
@using Teknik.Helpers
|
||||
|
||||
<script>
|
||||
// We need to define the action URLs for the script
|
||||
var helpURL = '@Url.SubRouteUrl("help", "Help.Markdown")';
|
||||
</script>
|
||||
|
||||
@Styles.Render("~/Content/blog")
|
||||
@Scripts.Render("~/bundles/blog")
|
||||
|
||||
<div class="container">
|
||||
@if (Model.Error)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 text-center">
|
||||
<div class="alert alert-danger" role="alert">@Model.ErrorMessage</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 text-center">
|
||||
<h2>Edit Post</h2>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form" action="@Url.SubRouteUrl("blog", "Blog.Action", new { action = "EditPost" })" method="post" id="newPost">
|
||||
<input name="postID" id="postID" type="hidden" value="@Model.PostId" />
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<label for="title"><h4>Title</h4></label>
|
||||
<input class="form-control" name="title" id="title" placeholder="generic click bait" title="enter a title for your post." type="text" value="@Model.Title" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<label for="article"><h4>Article</h4></label>
|
||||
<div class="mdd_toolbar"></div>
|
||||
<textarea class="form-control mdd_editor" name="article" id="article" placeholder="I ate a burger today." title="enter any information you want to share with the world." data-provide="markdown" rows="10">@Model.Article</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Preview</div>
|
||||
<div class="panel-body">
|
||||
<div class="mdd_preview"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<button type="submit" class="btn btn-primary" id="submit">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
59
Teknik/Areas/Blog/Views/Blog/NewPost.cshtml
Normal file
59
Teknik/Areas/Blog/Views/Blog/NewPost.cshtml
Normal file
@ -0,0 +1,59 @@
|
||||
@model Teknik.Areas.Blog.ViewModels.BlogViewModel
|
||||
|
||||
@using Teknik.Helpers
|
||||
|
||||
<script>
|
||||
// We need to define the action URLs for the script
|
||||
var helpURL = '@Url.SubRouteUrl("help", "Help.Markdown")';
|
||||
</script>
|
||||
|
||||
@Styles.Render("~/Content/blog")
|
||||
@Scripts.Render("~/bundles/blog")
|
||||
|
||||
<div class="container">
|
||||
@if (Model.Error)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 text-center">
|
||||
<div class="alert alert-danger" role="alert">@Model.ErrorMessage</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1 text-center">
|
||||
<h2>Create a New Post</h2>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form" action="@Url.SubRouteUrl("blog", "Blog.Action", new { action = "CreatePost" })" method="post" id="newPost">
|
||||
<input name="blogID" id="blogID" type="hidden" value="@Model.BlogId" />
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<label for="title"><h4>Title</h4></label>
|
||||
<input class="form-control" name="title" id="title" placeholder="generic click bait" title="enter a title for your post." type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<label for="article"><h4>Article</h4></label>
|
||||
<div class="mdd_toolbar"></div>
|
||||
<textarea class="form-control mdd_editor" name="article" id="article" placeholder="I ate a burger today." title="enter any information you want to share with the world." data-provide="markdown" rows="10"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Preview</div>
|
||||
<div class="panel-body">
|
||||
<div class="mdd_preview"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-10 col-sm-offset-1">
|
||||
<button type="submit" class="btn btn-primary" id="submit">Create Post</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
@ -17,7 +17,7 @@
|
||||
@if (Model.Blog.User.Username == User.Identity.Name || User.IsInRole("Admin"))
|
||||
{
|
||||
<br />
|
||||
<button type="button" class="btn btn-info edit_post" id="@Model.PostId" data-toggle="modal" data-target="#editPost">Edit</button>
|
||||
<a href="@Url.SubRouteUrl("blog", "Blog.Edit", new { username = Model.Blog.User.Username, id = Model.PostId })" role="button" class="btn btn-primary">Edit</a>
|
||||
if (Model.Published)
|
||||
{
|
||||
<button type="button" class="btn btn-warning unpublish_post" id="@Model.PostId">Unpublish</button>
|
||||
|
@ -8,11 +8,7 @@
|
||||
var uploadURL = '@Url.SubRouteUrl("upload", "Upload.Upload")';
|
||||
|
||||
var getPostsURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPosts" })';
|
||||
var getPostTitleURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPostTitle" })';
|
||||
var getPostArticleURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetPostArticle" })';
|
||||
var publishPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "PublishPost" })';
|
||||
var addPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "CreatePost" })';
|
||||
var editPostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "EditPost" })';
|
||||
var deletePostURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "DeletePost" })';
|
||||
|
||||
var getCommentsURL = '@Url.SubRouteUrl("blog", "Blog.Action", new { action = "GetComments" })';
|
||||
@ -28,42 +24,6 @@
|
||||
<div class="container">
|
||||
@if (!Model.Error)
|
||||
{
|
||||
if (User.IsInRole("Admin") || Model.Blog.User.Username == User.Identity.Name)
|
||||
{
|
||||
<div class="modal fade" id="editPost" tabindex="-1" role="dialog" aria-labelledby="editPostLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form class="form" action="##" method="post" id="editPostForm">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Cancel</span></button>
|
||||
<h4 class="modal-title" id="editPostLabel">Edit Your Post</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input name="edit_blog_userid" id="edit_blog_userid" type="hidden" value="@Model.Blog.User.UserId" />
|
||||
<input name="edit_blog_postid" id="edit_blog_postid" type="hidden" />
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="edit_blog_title"><h4>Title</h4></label>
|
||||
<input class="form-control" name="edit_blog_title" id="edit_blog_title" placeholder="generic click bait" title="enter a title for your post." type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-sm-12">
|
||||
<label for="edit_blog_post"><h4>Article</h4></label>
|
||||
<textarea class="form-control" name="edit_blog_post" id="edit_blog_post" placeholder="I ate a burger today." title="enter any information you want to share with the world." data-provide="markdown" rows="10"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-primary" id="edit_submit">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="@Url.SubRouteUrl("blog", "Blog.Blog", new { username = (Model.System) ? string.Empty : Model.Blog.User.Username })">@((Model.System) ? Model.Config.BlogConfig.Title : (string.IsNullOrEmpty(Model.Blog.User.BlogSettings.Title) ? string.Format("{0}'s Blog", Model.Blog.User.Username) : Model.Blog.User.BlogSettings.Title))</a></li>
|
||||
<li class="active"><a href="#">@Model.Title</a></li>
|
||||
|
@ -101,5 +101,14 @@ namespace Teknik.Areas.Help.Controllers
|
||||
HelpViewModel model = new HelpViewModel();
|
||||
return View("~/Areas/Help/Views/Help/Upload.cshtml", model);
|
||||
}
|
||||
|
||||
[TrackPageView]
|
||||
[AllowAnonymous]
|
||||
public ActionResult Markdown()
|
||||
{
|
||||
ViewBag.Title = "Markdown Help - " + Config.Title;
|
||||
HelpViewModel model = new HelpViewModel();
|
||||
return View("~/Areas/Help/Views/Help/Markdown.cshtml", model);
|
||||
}
|
||||
}
|
||||
}
|
@ -90,6 +90,14 @@ namespace Teknik.Areas.Help
|
||||
new { controller = "Help", action = "Upload" }, // Parameter defaults
|
||||
new[] { typeof(Controllers.HelpController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"Help.Markdown", // Route name
|
||||
new List<string>() { "help" }, // Subdomains
|
||||
new List<string>() { config.Host }, // domains
|
||||
"Markdown", // URL with parameters
|
||||
new { controller = "Help", action = "Markdown" }, // Parameter defaults
|
||||
new[] { typeof(Controllers.HelpController).Namespace }
|
||||
);
|
||||
|
||||
// Register Style Bundles
|
||||
BundleTable.Bundles.Add(new StyleBundle("~/Content/help").Include(
|
||||
|
@ -31,6 +31,8 @@
|
||||
<dd>The public Mumble server and configuration settings needed.</dd>
|
||||
<dt><a href="@Url.SubRouteUrl("help", "Help.Upload")">Uploads</a></dt>
|
||||
<dd>How the Upload service works and special considerations.</dd>
|
||||
<dt><a href="@Url.SubRouteUrl("help", "Help.Markdown")">Markdown</a></dt>
|
||||
<dd>Markdown syntax used throughout the site.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
133
Teknik/Areas/Help/Views/Help/Markdown.cshtml
Normal file
133
Teknik/Areas/Help/Views/Help/Markdown.cshtml
Normal file
@ -0,0 +1,133 @@
|
||||
@model Teknik.Areas.Help.ViewModels.HelpViewModel
|
||||
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<h2>Markdown Formatting</h2>
|
||||
<p><a href="http://daringfireball.net/projects/markdown/" target="_blank">Markdown</a> turns plain text formatting into fancy HTML formatting.</p>
|
||||
<h3>Phrase Emphasis</h3>
|
||||
<pre><code>*italic* **bold**
|
||||
_italic_ __bold__
|
||||
</code></pre>
|
||||
<h3>Links</h3>
|
||||
<p>Inline:</p>
|
||||
<pre><code>An [example](http://url.com/ "Title")
|
||||
</code></pre>
|
||||
<p>Reference-style labels (titles are optional):</p>
|
||||
<pre><code>An [example][id]. Then, anywhere
|
||||
else in the doc, define the link:
|
||||
[id]: http://example.com/ "Title"
|
||||
</code></pre>
|
||||
<h3>Images</h3>
|
||||
<p>Inline (titles are optional):</p>
|
||||
<pre><code>![alt text](/path/img.jpg "Title")
|
||||
</code></pre>
|
||||
<p>Reference-style:</p>
|
||||
<pre><code>![alt text][id]
|
||||
[id]: /url/to/img.jpg "Title"
|
||||
</code></pre>
|
||||
<h3>Headers</h3>
|
||||
<p>Setext-style:</p>
|
||||
<pre><code>Header 1
|
||||
========
|
||||
Header 2
|
||||
--------
|
||||
</code></pre>
|
||||
<p>atx-style (closing #'s are optional):</p>
|
||||
<pre><code># Header 1 #
|
||||
## Header 2 ##
|
||||
###### Header 6
|
||||
</code></pre>
|
||||
<h3>Lists</h3>
|
||||
<p>Ordered, without paragraphs:</p>
|
||||
<pre><code>1. Foo
|
||||
2. Bar
|
||||
</code></pre>
|
||||
<p>Unordered, with paragraphs:</p>
|
||||
<pre><code>* A list item.
|
||||
With multiple paragraphs.
|
||||
* Bar
|
||||
</code></pre>
|
||||
<p>You can nest them:</p>
|
||||
<pre><code>* Abacus
|
||||
* answer
|
||||
* Bubbles
|
||||
1. bunk
|
||||
2. bupkis
|
||||
* BELITTLER
|
||||
3. burper
|
||||
* Cunning
|
||||
</code></pre>
|
||||
<h3>Blockquotes</h3>
|
||||
<pre><code>> Email-style angle brackets
|
||||
> are used for blockquotes.
|
||||
> > And, they can be nested.
|
||||
> #### Headers in blockquotes
|
||||
>
|
||||
> * You can quote a list.
|
||||
> * Etc.
|
||||
</code></pre>
|
||||
<h3>Code Spans</h3>
|
||||
<pre><code>`<code>` spans are delimited
|
||||
by backticks.
|
||||
You can include literal backticks
|
||||
like `` `this` ``.
|
||||
</code></pre>
|
||||
<h3>Preformatted Code Blocks</h3>
|
||||
<p>Indent every line of a code block by at least 4 spaces or 1 tab.</p>
|
||||
<pre><code>This is a normal paragraph.
|
||||
This is a preformatted
|
||||
code block.
|
||||
</code></pre>
|
||||
<h3>Horizontal Rules</h3>
|
||||
<p>Three or more dashes or asterisks:</p>
|
||||
<pre><code>---
|
||||
* * *
|
||||
- - - -
|
||||
</code></pre>
|
||||
<h3>Manual Line Breaks</h3>
|
||||
<p>End a line with two or more spaces:</p>
|
||||
<pre><code>Roses are red,
|
||||
Violets are blue.
|
||||
</code></pre>
|
||||
<h2>Extra Mode</h2>
|
||||
These formatting features are only available when Extra Mode is enabled.
|
||||
|
||||
<h3>Markdown In Html</h3>
|
||||
<p>Enable markdown in HTML block level elements:</p>
|
||||
<pre><code><div markdown="1">
|
||||
Markdown **still** works.
|
||||
</div>
|
||||
</code></pre>
|
||||
<h3>Fenced Code Blocks</h3>
|
||||
<p>Code blocks delimited by 3 or more tildas:</p>
|
||||
<pre><code>~~~
|
||||
This is a preformatted
|
||||
code block
|
||||
~~~
|
||||
</code></pre>
|
||||
<h3>Header IDs</h3>
|
||||
<p>Set the id of headings with <code>{#<id>}</code> at end of heading line:</p>
|
||||
<pre><code>## My Heading {#myheading}
|
||||
</code></pre>
|
||||
<h3>Tables</h3>
|
||||
<pre><code>Fruit |Color
|
||||
---------|----------
|
||||
Apples |Red
|
||||
Pears |Green
|
||||
Bananas |Yellow</code></pre>
|
||||
<h3>Definition Lists</h3>
|
||||
<pre><code>Term 1
|
||||
: Definition 1
|
||||
Term 2
|
||||
: Definition 2</code></pre>
|
||||
<h3>Footnotes</h3>
|
||||
<pre><code>Body text with a footnote [^1]
|
||||
[^1]: Footnote text here
|
||||
</code></pre>
|
||||
<h3>Abbreviations</h3>
|
||||
<pre><code>MDD <- will have title
|
||||
*[MDD]: MarkdownDeep
|
||||
</code></pre>
|
||||
<p> </p>
|
||||
</div>
|
||||
</div>
|
@ -559,6 +559,9 @@
|
||||
<Content Include="Content\bootstrap.css.map" />
|
||||
<Content Include="Content\bootstrap-theme.min.css.map" />
|
||||
<Content Include="Content\bootstrap-theme.css.map" />
|
||||
<Content Include="Areas\Blog\Views\Blog\NewPost.cshtml" />
|
||||
<Content Include="Areas\Blog\Views\Blog\EditPost.cshtml" />
|
||||
<Content Include="Areas\Help\Views\Help\Markdown.cshtml" />
|
||||
<None Include="Properties\PublishProfiles\Teknik Dev.pubxml" />
|
||||
<None Include="Properties\PublishProfiles\Teknik Production.pubxml" />
|
||||
<None Include="Scripts\jquery-2.1.4.intellisense.js" />
|
||||
|
Loading…
Reference in New Issue
Block a user