Przeglądaj źródła

Made podcast creation/editing work.

tags/2.0.3
Teknikode 4 lat temu
rodzic
commit
36a0db2533

+ 1
- 1
Teknik/Areas/Blog/BlogAreaRegistration.cs Wyświetl plik

@@ -43,7 +43,7 @@ namespace Teknik.Areas.Blog
"~/Scripts/ocupload/1.1.2/ocupload.js",
"~/Scripts/PageDown/Markdown.Converter.js",
"~/Scripts/PageDown/Markdown.Sanitizer.js",
"~/Scripts/bootstrap-markdown.js",
//"~/Scripts/bootstrap-markdown.js", Uneeded?
"~/Scripts/bootbox/bootbox.min.js",
"~/Areas/Blog/Scripts/Blog.js"));
// Register Style Bundles

+ 5
- 1
Teknik/Areas/Home/Controllers/HomeController.cs Wyświetl plik

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Teknik.Areas.Podcast.Models;
using Teknik.Areas.Blog.Models;
using Teknik.Areas.Home.ViewModels;
using Teknik.Controllers;
@@ -31,7 +32,10 @@ namespace Teknik.Areas.Home.Controllers
if (foundPosts != null)
lastPosts = foundPosts.ToList();
// Grab the latest podcasts
List<BlogPost> lastPods = new List<BlogPost>();
List<Podcast.Models.Podcast> lastPods = new List<Podcast.Models.Podcast>();
var foundPods = db.Podcasts.OrderBy(post => post.DatePosted).Where(p => p.Published).Take(10);
if (foundPods != null)
lastPods = foundPods.ToList();

model.SitePosts = lastSite;
model.Podcasts = lastPods;

+ 2
- 1
Teknik/Areas/Home/ViewModels/HomeViewModel.cs Wyświetl plik

@@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Teknik.Areas.Blog.Models;
using Teknik.Areas.Podcast.Models;
using Teknik.ViewModels;

namespace Teknik.Areas.Home.ViewModels
@@ -11,7 +12,7 @@ namespace Teknik.Areas.Home.ViewModels
public class HomeViewModel : ViewModelBase
{
public List<BlogPost> SitePosts { get; set; }
public List<BlogPost> Podcasts { get; set; }
public List<Podcast.Models.Podcast> Podcasts { get; set; }
public List<BlogPost> BlogPosts { get; set; }
}
}

+ 17
- 16
Teknik/Areas/Home/Views/Home/Index.cshtml Wyświetl plik

@@ -1,6 +1,7 @@
@model Teknik.Areas.Home.ViewModels.HomeViewModel

@using Teknik.Areas.Blog.Models
@using Teknik.Areas.Podcast.Models

@Styles.Render("~/Content/home")
@Scripts.Render("~/bundles/home")
@@ -133,21 +134,21 @@
<ul class="list-group">
@if (Model.SitePosts.Any())
{
foreach (Post post in Model.SitePosts)
foreach (BlogPost post in Model.SitePosts)
{
<script>
var converter = new Markdown.getSanitizingConverter();
// Title Conversion
var old_post = $("#title_@post.PostId").text();
var old_post = $("#title_@post.BlogPostId").text();
var new_post = converter.makeHtml(old_post);
$("#title_@post.PostId").html(new_post);
$("#title_@post.BlogPostId").html(new_post);
</script>
<li class="list-group-item">
<div class="row">
<div class="col-sm-12">
<div class="blog-post-sm">
<h2 class="blog-post-title-sm text-left">
<a href="@Url.SubRouteUrl("blog", "Blog.Post", new { username = post.Blog.User.Username, id = post.PostId })" id="title_@post.PostId">@post.Title</a>
<a href="@Url.SubRouteUrl("blog", "Blog.Post", new { username = post.Blog.User.Username, id = post.BlogPostId })" id="title_@post.BlogPostId">@post.Title</a>
</h2>
<p class="blog-post-meta-sm text-left text-muted">
Posted on <time datetime="@post.DatePosted.ToString("o")">@post.DatePosted.ToString("MMMM dd, yyyy")</time> by <a href="@Url.SubRouteUrl("profile", "Profile.Index", new { username = post.Blog.User.Username })">@post.Blog.User.Username</a>
@@ -184,24 +185,24 @@
<ul class="list-group">
@if (Model.Podcasts.Any())
{
foreach (Post post in Model.Podcasts)
foreach (Podcast podcast in Model.Podcasts)
{
<script>
var converter = new Markdown.getSanitizingConverter();
// Title Conversion
var old_post = $("#title_@post.PostId").text();
var new_post = converter.makeHtml(old_post);
$("#title_@post.PostId").html(new_post);
var converter = new Markdown.getSanitizingConverter();
// Title Conversion
var old_post = $("#title_@podcast.PodcastId").text();
var new_post = converter.makeHtml(old_post);
$("#title_@podcast.PodcastId").html(new_post);
</script>
<li class="list-group-item">
<div class="row">
<div class="col-sm-12">
<div class="blog-post-sm">
<h2 class="blog-post-title-sm text-left">
<a href="@Url.SubRouteUrl("podcast", "Podcast.View", new { username = post.Blog.User.Username, id = post.PostId })" id="title_@post.PostId">@post.Title</a>
<a href="@Url.SubRouteUrl("podcast", "Podcast.View", new { episode = podcast.Episode })" id="title_@podcast.PodcastId">@podcast.Title</a>
</h2>
<p class="blog-post-meta-sm text-left text-muted">
Posted on <time datetime="@post.DatePosted.ToString("o")">@post.DatePosted.ToString("MMMM dd, yyyy")</time>
Posted on <time datetime="@podcast.DatePosted.ToString("o")">@podcast.DatePosted.ToString("MMMM dd, yyyy")</time>
</p>
</div>
</div>
@@ -235,20 +236,20 @@
<ul class="list-group">
@if (Model.BlogPosts.Any())
{
foreach (Post post in Model.BlogPosts)
foreach (BlogPost post in Model.BlogPosts)
{
<script>
var converter = new Markdown.getSanitizingConverter();
// Title Conversion
var old_post = $("#title_@post.PostId").text();
var old_post = $("#title_@post.BlogPostId").text();
var new_post = converter.makeHtml(old_post);
$("#title_@post.PostId").html(new_post);
$("#title_@post.BlogPostId").html(new_post);
</script>
<li class="list-group-item">
<div class="row">
<div class="col-sm-12">
<div class="blog-post-sm">
<h2 class="blog-post-title-sm text-left"><a href="@Url.SubRouteUrl("blog", "Blog.Post", new { username = post.Blog.User.Username, id = post.PostId })" id="title_@post.PostId">@post.Title</a>
<h2 class="blog-post-title-sm text-left"><a href="@Url.SubRouteUrl("blog", "Blog.Post", new { username = post.Blog.User.Username, id = post.BlogPostId })" id="title_@post.BlogPostId">@post.Title</a>
</h2>
<p class="blog-post-meta-sm text-left text-muted">
Posted on <time datetime="@post.DatePosted.ToString("o")">@post.DatePosted.ToString("MMMM dd, yyyy")</time> by <a href="@Url.SubRouteUrl("profile", "Profile.Index", new { username = post.Blog.User.Username })">@post.Blog.User.Username</a>

+ 1
- 1
Teknik/Areas/Paste/PasteHelper.cs Wyświetl plik

@@ -22,7 +22,7 @@ namespace Teknik.Areas.Paste

// Generate random url
string url = Utility.RandomString(config.PasteConfig.UrlLength);
while (db.Pastes.Where(p => p.Url == url) != null)
while (db.Pastes.Where(p => p.Url == url).FirstOrDefault() != null)
{
url = Utility.RandomString(config.PasteConfig.UrlLength);
}

+ 190
- 68
Teknik/Areas/Podcast/Controllers/PodcastController.cs Wyświetl plik

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Teknik.Areas.Podcast.Models;
using Teknik.Areas.Podcast.ViewModels;
using Teknik.Controllers;
using Teknik.Models;
@@ -13,21 +15,19 @@ namespace Teknik.Areas.Podcast.Controllers
public class PodcastController : DefaultController
{
private TeknikEntities db = new TeknikEntities();

// GET: Blogs/Details/5
[AllowAnonymous]
public ActionResult Index()
{
MainViewModel model = new MainViewModel();
model.Title = Config.PodcastConfig.Title;
model.Description = Config.PodcastConfig.Description;
try
{
ViewBag.Title = "Teknik Blog - " + Config.Title;
var foundPodcasts = (User.IsInRole("Admin")) ? db.Podcasts.FirstOrDefault() : db.Podcasts.Where(p => (p.Published)).FirstOrDefault();
ViewBag.Title = "Teknikast - " + Config.Title;
var foundPodcasts = (User.IsInRole("Podcast")) ? db.Podcasts.FirstOrDefault() : db.Podcasts.Where(p => (p.Published)).FirstOrDefault();
if (foundPodcasts != null)
{
model = new MainViewModel();
model.Title = Config.PodcastConfig.Title;
model.Description = Config.PodcastConfig.Description;
model.HasPodcasts = (foundPodcasts != null);
}
else
@@ -47,14 +47,13 @@ namespace Teknik.Areas.Podcast.Controllers
}
}

#region Posts
// GET: Blogs/Details/5
#region Podcasts
[AllowAnonymous]
public ActionResult View(int episode)
{
PodcastViewModel model = new PodcastViewModel();
// find the podcast specified
var foundPodcast = (User.IsInRole("Admin")) ? db.Podcasts.Where(p => p.Episode == episode).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.Episode == episode)).FirstOrDefault();
var foundPodcast = (User.IsInRole("Podcast")) ? db.Podcasts.Include("Files").Where(p => p.Episode == episode).FirstOrDefault() : db.Podcasts.Include("Files").Where(p => (p.Published && p.Episode == episode)).FirstOrDefault();
if (foundPodcast != null)
{
model.PodcastId = foundPodcast.PodcastId;
@@ -71,12 +70,43 @@ namespace Teknik.Areas.Podcast.Controllers
return View("~/Areas/Podcast/Views/Podcast/ViewPodcast.cshtml", model);
}

[AllowAnonymous]
public ActionResult Download(int episode, string fileName)
{
// find the podcast specified
var foundPodcast = (User.IsInRole("Podcast")) ? db.Podcasts.Include("Files").Where(p => p.Episode == episode).FirstOrDefault() : db.Podcasts.Include("Files").Where(p => (p.Published && p.Episode == episode)).FirstOrDefault();
if (foundPodcast != null)
{
PodcastFile file = foundPodcast.Files.Where(f => f.FileName == fileName).FirstOrDefault();
if (file != null)
{
if (System.IO.File.Exists(file.Path))
{
// Read in the file
byte[] data = System.IO.File.ReadAllBytes(file.Path);

// Create File
var cd = new System.Net.Mime.ContentDisposition
{
FileName = file.FileName,
Inline = true
};

Response.AppendHeader("Content-Disposition", cd.ToString());

return File(data, file.ContentType);
}
}
}
return Redirect(Url.SubRouteUrl("error", "Error.Http404"));
}

[HttpPost]
[AllowAnonymous]
public ActionResult GetPodcasts(int startPodcastID, int count)
{
var podcasts = (User.IsInRole("Admin")) ? db.Podcasts.OrderByDescending(p => p.DatePosted).Skip(startPodcastID).Take(count).ToList()
: db.Podcasts.Where(p => p.Published).OrderByDescending(p => p.DatePosted).Skip(startPodcastID).Take(count).ToList();
var podcasts = (User.IsInRole("Podcast")) ? db.Podcasts.Include("Files").OrderByDescending(p => p.DatePosted).Skip(startPodcastID).Take(count).ToList()
: db.Podcasts.Include("Files").Where(p => p.Published).OrderByDescending(p => p.DatePosted).Skip(startPodcastID).Take(count).ToList();
List<PodcastViewModel> podcastViews = new List<PodcastViewModel>();
if (podcasts != null)
{
@@ -88,67 +118,135 @@ namespace Teknik.Areas.Podcast.Controllers
return PartialView("~/Areas/Podcast/Views/Podcast/Podcasts.cshtml", podcastViews);
}

[HttpPost]
[AllowAnonymous]
public ActionResult GetPodcastEpisode(int podcastId)
{
var foundPodcast = (User.IsInRole("Podcast")) ? db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.PodcastId == podcastId)).FirstOrDefault();
if (foundPodcast != null)
{
return Json(new { result = foundPodcast.Episode });
}
return Json(new { error = "No podcast found" });
}

[HttpPost]
[AllowAnonymous]
public ActionResult GetPodcastTitle(int podcastId)
{
var foundPodcast = (User.IsInRole("Admin")) ? db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.PodcastId == podcastId)).FirstOrDefault();
var foundPodcast = (User.IsInRole("Podcast")) ? db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.PodcastId == podcastId)).FirstOrDefault();
if (foundPodcast != null)
{
return Json(new { result = foundPodcast.Title });
}
return Json(new { error = "No title found" });
return Json(new { error = "No podcast found" });
}

[HttpPost]
[AllowAnonymous]
public ActionResult GetPodcastDescription(int podcastId)
{
var foundPodcast = (User.IsInRole("Admin")) ? db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.PodcastId == podcastId)).FirstOrDefault();
var foundPodcast = (User.IsInRole("Podcast")) ? db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() : db.Podcasts.Where(p => (p.Published && p.PodcastId == podcastId)).FirstOrDefault();
if (foundPodcast != null)
{
return Json(new { result = foundPodcast.Description });
}
return Json(new { error = "No article found" });
return Json(new { error = "No podcast found" });
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreatePodcast(string title, string description, HttpPostedFileBase[] files)
public ActionResult CreatePodcast(int episode, string title, string description)
{
if (ModelState.IsValid)
{
// Handle saving of files
Models.Podcast podcast = db.Podcasts.Create();
podcast.Title = title;
podcast.Description = description;
podcast.DatePosted = DateTime.Now;
podcast.DatePublished = DateTime.Now;
if (User.IsInRole("Podcast"))
{
// Grab the next episode number
Models.Podcast lastPod = db.Podcasts.Where(p => p.Episode == episode).FirstOrDefault();
if (lastPod == null)
{
if (Request.Files.Count > 0)
{
// Create the podcast object
Models.Podcast podcast = db.Podcasts.Create();
podcast.Episode = episode;
podcast.Title = title;
podcast.Description = description;
podcast.DatePosted = DateTime.Now;
podcast.DatePublished = DateTime.Now;

db.Podcasts.Add(podcast);
db.SaveChanges();
return Json(new { result = true });
// Handle saving of files
for (int i = 0; i < Request.Files.Count; i++)
{
HttpPostedFileBase file = Request.Files[i]; //Uploaded file
//Use the following properties to get file's name, size and MIMEType
int fileSize = file.ContentLength;
string fileName = file.FileName;
string mimeType = file.ContentType;
string fileExt = Path.GetExtension(fileName);
if (!Directory.Exists(Config.PodcastConfig.PodcastDirectory))
{
Directory.CreateDirectory(Config.PodcastConfig.PodcastDirectory);
}
string newName = string.Format("Teknikast_Episode_{0}{1}", episode, fileExt);
int index = 1;
while (System.IO.File.Exists(Path.Combine(Config.PodcastConfig.PodcastDirectory, newName)))
{
newName = string.Format("Teknikast_Episode_{0} ({1}){2}", episode, index, fileExt);
index++;
}
string fullPath = Path.Combine(Config.PodcastConfig.PodcastDirectory, newName);
PodcastFile podFile = new PodcastFile();
podFile.Path = fullPath;
podFile.FileName = newName;
podFile.ContentType = mimeType;
podcast.Files = new List<PodcastFile>();
podcast.Files.Add(podFile);

file.SaveAs(fullPath);
}

db.Podcasts.Add(podcast);
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "You must submit at least one podcast audio file" });
}
return Json(new { error = "That episode already exists" });
}
return Json(new { error = "You don't have permission to create a podcast" });
}
return Json(new { error = "No podcast created" });
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EditPodcast(int podcastId, string title, string description)
public ActionResult EditPodcast(int podcastId, int episode, string title, string description)
{
if (ModelState.IsValid)
{
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
if (User.IsInRole("Podcast"))
{
podcast.Title = title;
podcast.Description = description;
db.Entry(podcast).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
{
if (db.Podcasts.Where(p => p.Episode != episode).FirstOrDefault() == null)
{
podcast.Episode = episode;
podcast.Title = title;
podcast.Description = description;
db.Entry(podcast).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "That episode already exists" });
}
return Json(new { error = "No podcast found" });
}
return Json(new { error = "You don't have permission to edit this podcast" });
}
return Json(new { error = "No podcast found" });
return Json(new { error = "Invalid Inputs" });
}

[HttpPost]
@@ -157,18 +255,23 @@ namespace Teknik.Areas.Podcast.Controllers
{
if (ModelState.IsValid)
{
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
if (User.IsInRole("Podcast"))
{
podcast.Published = publish;
if (publish)
podcast.DatePublished = DateTime.Now;
db.Entry(podcast).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
{
podcast.Published = publish;
if (publish)
podcast.DatePublished = DateTime.Now;
db.Entry(podcast).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "No podcast found" });
}
return Json(new { error = "You don't have permission to publish this podcast" });
}
return Json(new { error = "No podcast found" });
return Json(new { error = "Invalid Inputs" });
}

[HttpPost]
@@ -177,15 +280,20 @@ namespace Teknik.Areas.Podcast.Controllers
{
if (ModelState.IsValid)
{
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
if (User.IsInRole("Podcast"))
{
db.Podcasts.Remove(podcast);
db.SaveChanges();
return Json(new { result = true });
Models.Podcast podcast = db.Podcasts.Find(podcastId);
if (podcast != null)
{
db.Podcasts.Remove(podcast);
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "No podcast found" });
}
return Json(new { error = "You don't have permission to delete this podcast" });
}
return Json(new { error = "No post found" });
return Json(new { error = "Invalid Inputs" });
}
#endregion

@@ -224,17 +332,21 @@ namespace Teknik.Areas.Podcast.Controllers
{
if (ModelState.IsValid)
{
Models.PodcastComment comment = db.PodcastComments.Create();
comment.PodcastId = podcastId;
comment.UserId = db.Users.Where(u => u.Username == User.Identity.Name).First().UserId;
comment.Article = article;
comment.DatePosted = DateTime.Now;
if (db.Podcasts.Where(p => p.PodcastId == podcastId).FirstOrDefault() != null)
{
Models.PodcastComment comment = db.PodcastComments.Create();
comment.PodcastId = podcastId;
comment.UserId = db.Users.Where(u => u.Username == User.Identity.Name).First().UserId;
comment.Article = article;
comment.DatePosted = DateTime.Now;

db.PodcastComments.Add(comment);
db.SaveChanges();
return Json(new { result = true });
db.PodcastComments.Add(comment);
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "That podcast does not exist" });
}
return Json(new { error = "No comment created" });
return Json(new { error = "Invalid Parameters" });
}

[HttpPost]
@@ -246,13 +358,18 @@ namespace Teknik.Areas.Podcast.Controllers
Models.PodcastComment comment = db.PodcastComments.Find(commentID);
if (comment != null)
{
comment.Article = article;
db.Entry(comment).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
if (comment.User.Username == User.Identity.Name || User.IsInRole("Admin"))
{
comment.Article = article;
db.Entry(comment).State = EntityState.Modified;
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "You don't have permission to edit this comment" });
}
return Json(new { error = "No comment found" });
}
return Json(new { error = "No comment found" });
return Json(new { error = "Invalid Parameters" });
}

[HttpPost]
@@ -264,12 +381,17 @@ namespace Teknik.Areas.Podcast.Controllers
Models.PodcastComment comment = db.PodcastComments.Find(commentID);
if (comment != null)
{
db.PodcastComments.Remove(comment);
db.SaveChanges();
return Json(new { result = true });
if (comment.User.Username == User.Identity.Name || User.IsInRole("Admin"))
{
db.PodcastComments.Remove(comment);
db.SaveChanges();
return Json(new { result = true });
}
return Json(new { error = "You don't have permission to delete this comment" });
}
return Json(new { error = "No comment found" });
}
return Json(new { error = "No comment found" });
return Json(new { error = "Invalid Parameters" });
}
#endregion
}

+ 8
- 1
Teknik/Areas/Podcast/PodcastAreaRegistration.cs Wyświetl plik

@@ -30,6 +30,13 @@ namespace Teknik.Areas.Podcast
new { controller = "Podcast", action = "View" }, // Parameter defaults
new[] { typeof(Controllers.PodcastController).Namespace }
);
context.MapSubdomainRoute(
"Podcast.Download", // Route name
new List<string>() { "dev", "podcast" }, // Subdomains
"File/{episode}/{fileName}", // URL with parameters
new { controller = "Podcast", action = "Download" }, // Parameter defaults
new[] { typeof(Controllers.PodcastController).Namespace }
);
context.MapSubdomainRoute(
"Podcast.Action", // Route name
new List<string>() { "dev", "podcast" }, // Subdomains
@@ -43,7 +50,7 @@ namespace Teknik.Areas.Podcast
"~/Scripts/bootbox/bootbox.min.js",
"~/Scripts/PageDown/Markdown.Converter.js",
"~/Scripts/PageDown/Markdown.Sanitizer.js",
"~/Scripts/bootstrap-markdown.js",
//"~/Scripts/bootstrap-markdown.js", Uneeded?
"~/Scripts/jquery-ui.widgets.js",
"~/Scripts/jquery.iframe-transport.js",
"~/Scripts/audioplayer.min.js",

+ 40
- 15
Teknik/Areas/Podcast/Scripts/Podcast.js Wyświetl plik

@@ -1,31 +1,55 @@
$(document).ready(function () {
$("#podcast_submit").click(function () {
$('#newPodcast').modal('hide');
var fd = new FormData();
var fileInput = document.getElementById('podcast_files');
for (i = 0; i < fileInput.files.length; i++) {
//Appending each file to FormData object
fd.append(fileInput.files[i].name, fileInput.files[i]);
}
episode = $("#podcast_episode").val();
title = $("#podcast_title").val();
post = $("#podcast_description").val();
files = $("#podcast_files").val();
$.ajax({
type: "POST",
url: addPodcastURL,
data: AddAntiForgeryToken({ title: title, description: post, files: files }),
success: function (html) {
if (html.result) {
description = $("#podcast_description").val();

fd.append("episode", episode);
fd.append("title", title);
fd.append("description", description);
fd.append('__RequestVerificationToken', $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val());

var xhr = new XMLHttpRequest();
xhr.open('POST', addPodcastURL);
xhr.send(fd);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
obj = JSON.parse(xhr.responseText);
if (obj.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">&times;</button>' + html.error + '</div>');
$("#top_msg").html('<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>' + obj.error + '</div>');
}
}
});
}
return false;
});

$('#editPodcast').on('show.bs.modal', function (e) {
$("#edit_podcast_episode").val("");
$("#edit_podcast_title").val("");
$("#edit_podcast_description").val("");
podcastId = $(e.relatedTarget).attr("id");
$("#edit_podcast_podcastid").val(podcastId);
$("#edit_podcast_podcastId").val(podcastId);
$.ajax({
type: "POST",
url: getPodcastEpisodeURL,
data: { podcastID: podcastId },
success: function (html) {
if (html.result) {
$("#edit_podcast_episode").val(html.result);
}
}
});
$.ajax({
type: "POST",
url: getPodcastTitleURL,
@@ -51,12 +75,13 @@
$("#edit_submit").click(function () {
$('#editPodcast').modal('hide');
podcastId = $("#edit_podcast_podcastId").val();
episode = $("#edit_podcast_episode").val();
title = $("#edit_podcast_title").val();
description = $("#edit_podcast_description").val();
$.ajax({
type: "POST",
url: editPodcastURL,
data: AddAntiForgeryToken({ podcastId: podcastId, title: title, description: description }),
data: AddAntiForgeryToken({ podcastId: podcastId, episode: episode, title: title, description: description }),
success: function (html) {
if (html.result) {
window.location.reload();
@@ -138,9 +163,9 @@ function loadMorePodcasts(start, count) {
success: function (html) {
if (html) {
$(".podcast-main").append(html);
linkPostDelete('.delete_podcast');
linkPostPublish('.publish_podcast');
linkPostUnpublish('.unpublish_podcast');
linkPodcastDelete('.delete_podcast');
linkPodcastPublish('.publish_podcast');
linkPodcastUnpublish('.unpublish_podcast');
linkAudioPlayer('audio');
$(window).bind('scroll', bindScrollPosts);
}

+ 17
- 4
Teknik/Areas/Podcast/Views/Podcast/Main.cshtml Wyświetl plik

@@ -6,8 +6,9 @@
var uploadURL = '@Url.SubRouteUrl("upload", "Upload.Upload")';

var getPodcastsURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcasts" })';
var getPodcastEpisodeURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastEpisode" })';
var getPodcastTitleURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastTitle" })';
var getPodcastArticleURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastArticle" })';
var getPodcastDescriptionURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastDescription" })';
var publishPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "PublishPodcast" })';
var addPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "CreatePodcast" })';
var editPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "EditPodcast" })';
@@ -37,7 +38,7 @@
</p>
</div>
</div>
@if (User.IsInRole("Admin") || User.IsInRole("Podcast"))
@if (User.IsInRole("Podcast"))
{
<div class="row">
<div class="col-sm-12 text-center">
@@ -47,12 +48,18 @@
<div class="modal fade" id="newPodcast" tabindex="-1" role="dialog" aria-labelledby="newPodcastLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form class="form" action="##" method="post" id="publishPodcast">
<form class="form" action="##" method="post" id="publishPodcast" enctype="multipart/form-data">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Cancel</span></button>
<h4 class="modal-title" id="newPodcastLabel">Create a New Podcast</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="form-group col-sm-12">
<label for="podcast_episode"><h4>Episode Number</h4></label>
<input class="form-control" name="podcast_episode" id="podcast_episode" placeholder="1" title="enter an episode number for the podcast" type="number" />
</div>
</div>
<div class="row">
<div class="form-group col-sm-12">
<label for="podcast_title"><h4>Title</h4></label>
@@ -68,7 +75,7 @@
<div class="row">
<div class="form-group col-sm-12">
<label for="files"><h4>Upload Podcast</h4></label>
<input id="files" name="files" type="file" placeholder="podcast.ogg" title="select the podcast file." multiple="multiple" />
<input id="podcast_files" name="podcast_files" type="file" placeholder="podcast.ogg" title="select the podcast file." multiple>
</div>
</div>
<div class="row">
@@ -94,6 +101,12 @@
</div>
<div class="modal-body">
<input name="edit_podcast_podcastId" id="edit_podcast_podcastId" type="hidden" />
<div class="row">
<div class="form-group col-sm-12">
<label for="edit_podcast_episode"><h4>Episode Number</h4></label>
<input class="form-control" name="edit_podcast_episode" id="edit_podcast_episode" placeholder="1" title="enter an episode number for the podcast" type="number" />
</div>
</div>
<div class="row">
<div class="form-group col-sm-12">
<label for="edit_podcast_title"><h4>Title</h4></label>

+ 14
- 8
Teknik/Areas/Podcast/Views/Podcast/Podcast.cshtml Wyświetl plik

@@ -11,10 +11,10 @@
<div class="row">
<div class="col-sm-10 col-sm-offset-1">
<div class="podcast-post">
<h2 class="podcast-post-title text-center"><a href="@Url.SubRouteUrl("podcast", "Podcast.View", new { episode = Model.Episode })" id="title_@Model.PodcastId">@Model.Title</a></h2>
<h2 class="podcast-post-title text-center"><a href="@Url.SubRouteUrl("podcast", "Podcast.View", new { episode = Model.Episode })" id="title_@Model.PodcastId">Episode @Model.Episode - @Model.Title</a></h2>
<p class="podcast-post-meta text-center text-muted">
Posted on <time datetime="@Model.DatePosted.ToString("o")">@Model.DatePosted.ToString("MMMM dd, yyyy")</time>
@if (User.IsInRole("Admin") || User.IsInRole("Podcast"))
@if (User.IsInRole("Podcast"))
{
<br />
<button type="button" class="btn btn-info edit_post" id="@Model.PodcastId" data-toggle="modal" data-target="#editPodcast">Edit</button>
@@ -26,24 +26,30 @@
{
<button type="button" class="btn btn-success publish_podcast" id="@Model.PodcastId">Publish</button>
}
<button type="button" class="btn btn-danger delete_post" id="@Model.PodcastId">Delete</button>
<button type="button" class="btn btn-danger delete_podcast" id="@Model.PodcastId">Delete</button>
}
</p>
@if (Model.Files != null)
{
<div class="text-center">
<audio preload="none" controls>
@foreach (PodcastFile file in Model.Files)
{
<source src="@file.Path" type="@file.ContentType" />
<source src="@Url.SubRouteUrl("podcast", "Podcast.Download", new { episode = Model.Episode, fileName = file.FileName })" type="@file.ContentType" />
}
</audio>
</div>
}
<br />
<p id="podcast_@Model.PodcastId">@Model.Description</p>
@foreach (PodcastFile file in Model.Files)
@if (Model.Files != null)
{
<div class="row text-center">
<a href="@Url.SubRouteUrl("podcast", "Podcast.Download", new { file = file.FileName })">Direct Download - @file.ContentType</a>
</div>
foreach (PodcastFile file in Model.Files)
{
<div class="row text-center">
<a href="@Url.SubRouteUrl("podcast", "Podcast.Download", new { episode = Model.Episode, fileName = file.FileName })">Direct Download - @file.ContentType</a>
</div>
}
}
</div>
</div>

+ 32
- 2
Teknik/Areas/Podcast/Views/Podcast/ViewPodcast.cshtml Wyświetl plik

@@ -1,9 +1,33 @@
@model Teknik.Areas.Podcast.ViewModels.PodcastViewModel
<script>
// We need to define the action URLs for the script

var uploadURL = '@Url.SubRouteUrl("upload", "Upload.Upload")';

var getPodcastsURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcasts" })';
var getPodcastEpisodeURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastEpisode" })';
var getPodcastTitleURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastTitle" })';
var getPodcastDescriptionURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetPodcastDescription" })';
var publishPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "PublishPodcast" })';
var addPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "CreatePodcast" })';
var editPodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "EditPodcast" })';
var deletePodcastURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "DeletePodcast" })';

var getCommentsURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetComments" })';
var getCommentArticleURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "GetCommentArticle" })';
var addCommentURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "CreateComment" })';
var editCommentURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "EditComment" })';
var deleteCommentURL = '@Url.SubRouteUrl("podcast", "Podcast.Action", new { action = "DeleteComment" })';
</script>

@Styles.Render("~/Content/podcast")
@Scripts.Render("~/bundles/podcast")

<div class="container">
@if (!Model.Error)
{
@if (User.IsInRole("Admin"))
if (User.IsInRole("Podcast"))
{
<div class="modal fade" id="editPodcast" tabindex="-1" role="dialog" aria-labelledby="editPodcastLabel" aria-hidden="true">
<div class="modal-dialog">
@@ -15,6 +39,12 @@
</div>
<div class="modal-body">
<input name="edit_podcast_postid" id="edit_podcast_postid" type="hidden" />
<div class="row">
<div class="form-group col-sm-12">
<label for="edit_podcast_episode"><h4>Episode Number</h4></label>
<input class="form-control" name="edit_podcast_episode" id="edit_podcast_episode" placeholder="1" title="enter an episode number for the podcast" type="number" />
</div>
</div>
<div class="row">
<div class="form-group col-sm-12">
<label for="edit_podcast_title"><h4>Title</h4></label>
@@ -50,7 +80,7 @@
<div class="podcast-main" id="@Model.PodcastId">
@Html.Partial("Podcast", Model)
</div>
@if (User.IsInRole("Admin"))
if (User.Identity.IsAuthenticated)
{
<div class="row">
<div class="col-sm-10 col-sm-offset-1">

+ 2
- 0
Teknik/Configuration/PodcastConfig.cs Wyświetl plik

@@ -11,6 +11,7 @@ namespace Teknik.Configuration
public string Description { get; set; }
public int PodcastsToLoad { get; set; }
public int CommentsToLoad { get; set; }
public string PodcastDirectory { get; set; }

public PodcastConfig()
{
@@ -23,6 +24,7 @@ namespace Teknik.Configuration
Description = string.Empty;
PodcastsToLoad = 10;
CommentsToLoad = 10;
PodcastDirectory = string.Empty;
}
}
}

+ 1
- 1
Teknik/Teknik.csproj Wyświetl plik

@@ -341,7 +341,6 @@
<Content Include="Global.asax" />
<Content Include="Content\teknik.css" />
<Content Include="Images\Icon.png" />
<Content Include="App_Data\Config.json" />
<Content Include="ConnectionStrings.config" />
<Content Include="Areas\Blog\Views\web.config" />
<Content Include="Areas\Blog\Views\Blog\Blog.cshtml" />
@@ -422,6 +421,7 @@
<Content Include="Areas\Podcast\Views\Podcast\Comment.cshtml" />
<Content Include="Areas\Podcast\Views\Podcast\Comments.cshtml" />
<Content Include="Areas\Podcast\Views\Podcast\ViewPodcast.cshtml" />
<Content Include="App_Data\Config.json" />
<None Include="Properties\PublishProfiles\Teknik Dev.pubxml" />
<None Include="Scripts\jquery-2.1.4.intellisense.js" />
<Content Include="Scripts\bootbox\bootbox.min.js" />

Ładowanie…
Anuluj
Zapisz