mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
Created initial Vault viewing page to handle multiple formats.
This commit is contained in:
parent
192a5c4aa2
commit
6a620e18f1
@ -17,6 +17,10 @@ namespace Teknik.Areas.Paste.Models
|
||||
|
||||
public virtual User User { get; set; }
|
||||
|
||||
public int? VaultId { get; set; }
|
||||
|
||||
public virtual Vault.Models.Vault Vault { get; set; }
|
||||
|
||||
public DateTime DatePosted { get; set; }
|
||||
|
||||
[CaseSensitive]
|
||||
|
@ -20,18 +20,16 @@
|
||||
</div>
|
||||
<hr />
|
||||
<div class="row">
|
||||
<div class="col-sm-1 col-sm-offset-1 text-center">
|
||||
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Simple", new { url = Model.Url })">Simple</a>
|
||||
</div>
|
||||
<div class="col-sm-1 text-center">
|
||||
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Raw", new { url = Model.Url })">Raw</a>
|
||||
</div>
|
||||
<div class="col-sm-1 text-center">
|
||||
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Download", new { url = Model.Url })">Download</a>
|
||||
<div class="col-sm-12 pull-left">
|
||||
<div class="btn-group" role="group">
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Simple", new { url = Model.Url })">Simple</a>
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Raw", new { url = Model.Url })">Raw</a>
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Download", new { url = Model.Url })">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="row">
|
||||
<div class="col-sm-10 col-sm-offset-1">@Html.Raw(Model.Content)</div>
|
||||
<div class="col-sm-12">@Html.Raw(Model.Content)</div>
|
||||
</div>
|
||||
</div>
|
@ -15,6 +15,10 @@ namespace Teknik.Areas.Upload.Models
|
||||
|
||||
public virtual User User { get; set; }
|
||||
|
||||
public int? VaultId { get; set; }
|
||||
|
||||
public virtual Vault.Models.Vault Vault { get; set; }
|
||||
|
||||
public DateTime DateUploaded { get; set; }
|
||||
|
||||
[CaseSensitive]
|
||||
|
@ -41,6 +41,10 @@ namespace Teknik.Areas.Users.Models
|
||||
|
||||
public virtual ICollection<Paste.Models.Paste> Pastes { get; set; }
|
||||
|
||||
public virtual ICollection<Shortener.Models.ShortenedUrl> ShortenedUrls { get; set; }
|
||||
|
||||
public virtual ICollection<Vault.Models.Vault> Vaults { get; set; }
|
||||
|
||||
public User()
|
||||
{
|
||||
Username = string.Empty;
|
||||
|
@ -472,6 +472,18 @@ namespace Teknik.Areas.Users.Utility
|
||||
db.SaveChanges();
|
||||
}
|
||||
|
||||
// Update vaults
|
||||
List<Vault.Models.Vault> vaults = db.Vaults.Where(u => u.User.Username == user.Username).ToList();
|
||||
if (vaults != null)
|
||||
{
|
||||
foreach (Vault.Models.Vault vault in vaults)
|
||||
{
|
||||
vault.UserId = null;
|
||||
db.Entry(vault).State = EntityState.Modified;
|
||||
}
|
||||
db.SaveChanges();
|
||||
}
|
||||
|
||||
// Delete Blogs
|
||||
Blog.Models.Blog blog = db.Blogs.Where(u => u.User.Username == user.Username).FirstOrDefault();
|
||||
if (blog != null)
|
||||
|
5
Teknik/Areas/Vault/Content/Vault.css
Normal file
5
Teknik/Areas/Vault/Content/Vault.css
Normal file
@ -0,0 +1,5 @@
|
||||
.paste-content {
|
||||
height: 100%;
|
||||
max-height: 500px;
|
||||
overflow-y: auto;
|
||||
}
|
@ -3,16 +3,22 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using Teknik.Areas.Vault.Models;
|
||||
using Teknik.Areas.Vault.ViewModels;
|
||||
using Teknik.Attributes;
|
||||
using Teknik.Controllers;
|
||||
using Teknik.Models;
|
||||
using Teknik.Utilities;
|
||||
|
||||
namespace Teknik.Areas.Vault.Controllers
|
||||
{
|
||||
[TeknikAuthorize]
|
||||
public class VaultController : DefaultController
|
||||
{
|
||||
private TeknikEntities db = new TeknikEntities();
|
||||
|
||||
[AllowAnonymous]
|
||||
public ActionResult Index()
|
||||
public ActionResult Create()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
@ -20,7 +26,21 @@ namespace Teknik.Areas.Vault.Controllers
|
||||
[AllowAnonymous]
|
||||
public ActionResult ViewVault(string id)
|
||||
{
|
||||
return View();
|
||||
Models.Vault foundVault = db.Vaults.Where(v => v.Url == id).FirstOrDefault();
|
||||
if (foundVault != null)
|
||||
{
|
||||
VaultViewModel model = new VaultViewModel();
|
||||
|
||||
model.Url = foundVault.Url;
|
||||
model.Title = foundVault.Title;
|
||||
model.Description = foundVault.Description;
|
||||
model.DateCreated = foundVault.DateCreated;
|
||||
model.DateEdited = foundVault.DateEdited;
|
||||
model.Items = foundVault.Items.ToList();
|
||||
|
||||
return View(model);
|
||||
}
|
||||
return Redirect(Url.SubRouteUrl("error", "Error.Http404"));
|
||||
}
|
||||
}
|
||||
}
|
@ -10,6 +10,7 @@ namespace Teknik.Areas.Vault.Models
|
||||
public int VaultId { get; set; }
|
||||
public int? UserId { get; set; }
|
||||
public virtual Users.Models.User User { get; set; }
|
||||
public string Url { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public DateTime DateCreated { get; set; }
|
||||
|
@ -10,7 +10,7 @@ namespace Teknik.Areas.Vault.Models
|
||||
public int VaultItemId { get; set; }
|
||||
public int VaultId { get; set; }
|
||||
public virtual Vault Vault { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public DateTime DateAdded { get; set; }
|
||||
}
|
||||
|
@ -20,14 +20,27 @@ namespace Teknik.Areas.Vault
|
||||
{
|
||||
Config config = Config.Load();
|
||||
context.MapSubdomainRoute(
|
||||
"Vault.Index",
|
||||
"Vault.Create",
|
||||
new List<string>() { "vault", "v" }, // Subdomains
|
||||
new List<string>() { config.Host }, // domains
|
||||
"",
|
||||
new { controller = "Vault", action = "Index" },
|
||||
new { controller = "Vault", action = "Create" },
|
||||
new[] { typeof(Controllers.VaultController).Namespace }
|
||||
);
|
||||
|
||||
context.MapSubdomainRoute(
|
||||
"Vault.ViewVault",
|
||||
new List<string>() { "vault", "v" }, // Subdomains
|
||||
new List<string>() { config.Host }, // domains
|
||||
"{id}",
|
||||
new { controller = "Vault", action = "ViewVault" },
|
||||
new[] { typeof(Controllers.VaultController).Namespace }
|
||||
);
|
||||
|
||||
// Register style bundles
|
||||
BundleTable.Bundles.Add(new CdnStyleBundle("~/Content/vault", config.CdnHost).Include(
|
||||
"~/Areas/Vault/Content/Vault.css"));
|
||||
|
||||
// Register Script Bundle
|
||||
BundleTable.Bundles.Add(new CdnScriptBundle("~/bundles/vault", config.CdnHost).Include(
|
||||
"~/Areas/Vault/Scripts/Vault.js"));
|
||||
|
23
Teknik/Areas/Vault/ViewModels/CreateVaultViewModel.cs
Normal file
23
Teknik/Areas/Vault/ViewModels/CreateVaultViewModel.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using Teknik.Areas.Vault.Models;
|
||||
using Teknik.ViewModels;
|
||||
|
||||
namespace Teknik.Areas.Vault.ViewModels
|
||||
{
|
||||
public class CreateVaultViewModel : ViewModelBase
|
||||
{
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public List<VaultItem> Items { get; set; }
|
||||
|
||||
public CreateVaultViewModel()
|
||||
{
|
||||
Title = string.Empty;
|
||||
Description = string.Empty;
|
||||
Items = new List<VaultItem>();
|
||||
}
|
||||
}
|
||||
}
|
@ -9,14 +9,22 @@ namespace Teknik.Areas.Vault.ViewModels
|
||||
{
|
||||
public class VaultViewModel : ViewModelBase
|
||||
{
|
||||
public int VaultId { get; set; }
|
||||
public string Url { get; set; }
|
||||
public int? UserId { get; set; }
|
||||
public Users.Models.User User { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public DateTime DateCreated { get; set; }
|
||||
public DateTime DateEdited { get; set; }
|
||||
public List<UploadItem> Uploads { get; set; }
|
||||
public List<PasteItem> Pastes { get; set; }
|
||||
public List<VaultItem> Items { get; set; }
|
||||
|
||||
public VaultViewModel()
|
||||
{
|
||||
Title = string.Empty;
|
||||
Description = string.Empty;
|
||||
DateCreated = DateTime.Now;
|
||||
DateEdited = DateTime.Now;
|
||||
Items = new List<VaultItem>();
|
||||
}
|
||||
}
|
||||
}
|
3
Teknik/Areas/Vault/Views/Vault/Create.cshtml
Normal file
3
Teknik/Areas/Vault/Views/Vault/Create.cshtml
Normal file
@ -0,0 +1,3 @@
|
||||
@model Teknik.Areas.Vault.ViewModels.CreateVaultViewModel
|
||||
|
||||
|
@ -1,7 +1,126 @@
|
||||
@model Teknik.Areas.Vault.ViewModels.VaultViewModel
|
||||
|
||||
@using Teknik.Areas.Vault.Models;
|
||||
@using Teknik.Utilities
|
||||
@using Teknik.Pygments
|
||||
|
||||
@Styles.Render("~/Content/vault")
|
||||
|
||||
<div class="container">
|
||||
<p>Coming Soon!</p>
|
||||
<div class="row text-center">
|
||||
<div class="col-sm-12 text-center">
|
||||
<h2><b>@((string.IsNullOrEmpty(Model.Title)) ? "Untitled" : Model.Title)</b> <small>Created on <time datetime="@Model.DateCreated.ToString("s")">@Model.DateCreated.ToString("dddd, MMMM d, yyyy") at @Model.DateCreated.ToString("h:mm:ss tt")</time></small></h2>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
|
||||
@foreach (VaultItem item in Model.Items)
|
||||
{
|
||||
Type itemType = item.GetType();
|
||||
if (itemType == typeof(PasteItem))
|
||||
{
|
||||
PasteItem paste = (PasteItem)item;
|
||||
|
||||
// Transform content into HTML
|
||||
if (!Highlighter.Lexers.ToList().Exists(l => l.Aliases.Contains(paste.Paste.Syntax)))
|
||||
{
|
||||
paste.Paste.Syntax = "text";
|
||||
}
|
||||
Highlighter highlighter = new Highlighter();
|
||||
// Add a space in front of the content due to bug with pygment (No idea why yet)
|
||||
paste.Paste.Content = highlighter.HighlightToHtml(" " + paste.Paste.Content, paste.Paste.Syntax, Model.Config.PasteConfig.SyntaxVisualStyle, generateInlineStyles: true, fragment: true);
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading text-left">
|
||||
<h4><b><a href="@Url.SubRouteUrl("p", "Paste.View", new { file = paste.Paste.Url })" target="_blank">@((string.IsNullOrEmpty(paste.Title)) ? "Paste" : paste.Title)</a></b> <small>Pasted on <time datetime="@paste.Paste.DatePosted.ToString("s")">@paste.Paste.DatePosted.ToString("dddd, MMMM d, yyyy") at @paste.Paste.DatePosted.ToString("h:mm:ss tt")</time> - Format: <b id="syntaxLanguage">@paste.Paste.Syntax</b></small></h4>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 pull-left">
|
||||
<div class="btn-group" role="group">
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Simple", new { url = paste.Paste.Url })">Simple</a>
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Raw", new { url = paste.Paste.Url })">Raw</a>
|
||||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Download", new { url = paste.Paste.Url })">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="row paste-item">
|
||||
<div class="col-sm-12 paste-content">@Html.Raw(paste.Paste.Content)</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(paste.Description))
|
||||
{
|
||||
<div class="panel-footer">
|
||||
<p>@paste.Description</p>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
else if (itemType == typeof(UploadItem))
|
||||
{
|
||||
UploadItem upload = (UploadItem)item;
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-left">
|
||||
<h4><b><a href="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" target="_blank">@((string.IsNullOrEmpty(upload.Title)) ? "Upload" : upload.Title)</a></b> <small>Uploaded on <time datetime="@upload.Upload.DateUploaded.ToString("s")">@upload.Upload.DateUploaded.ToString("dddd, MMMM d, yyyy") at @upload.Upload.DateUploaded.ToString("h:mm:ss tt")</time></small></h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
@if (upload.Upload.ContentType.StartsWith("image"))
|
||||
{
|
||||
<a href="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" target="_blank">
|
||||
<img src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" class="img-thumbnail center-block" />
|
||||
</a>
|
||||
}
|
||||
else if (upload.Upload.ContentType.StartsWith("audio"))
|
||||
{
|
||||
<div class="text-center">
|
||||
<audio preload="none" controls>
|
||||
<source src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" type="@upload.Upload.ContentType" />
|
||||
</audio>
|
||||
</div>
|
||||
}
|
||||
else if (upload.Upload.ContentType.StartsWith("video"))
|
||||
{
|
||||
<div class="text-center">
|
||||
<video preload="none" controls>
|
||||
<source src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" type="@upload.Upload.ContentType" />
|
||||
</video>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-sm-4 text-center">
|
||||
<label for="size">Size</label>
|
||||
<p id="size">@StringHelper.GetBytesReadable(upload.Upload.ContentLength)</p>
|
||||
</div>
|
||||
<div class="col-sm-4 text-center">
|
||||
<label for="type">Type</label>
|
||||
<p id="type">@upload.Upload.ContentType</p>
|
||||
</div>
|
||||
<div class="col-sm-4 text-center">
|
||||
<label for="dateUploaded">Date Uploaded</label>
|
||||
<p id="dateUploaded"><time datetime="@upload.Upload.DateUploaded.ToString("s")">@upload.Upload.DateUploaded.ToString("MMMM dd, yyyy")</time></p>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(upload.Description))
|
||||
{
|
||||
<div class="panel-footer">
|
||||
<p>@upload.Description</p>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
// Nothing to see here folks. :)
|
||||
}
|
||||
}
|
||||
</div>
|
@ -13,6 +13,7 @@ using Teknik.Areas.Shortener.Models;
|
||||
using Teknik.Attributes;
|
||||
using System.Data.Entity.ModelConfiguration.Conventions;
|
||||
using System.Linq;
|
||||
using Teknik.Areas.Vault.Models;
|
||||
|
||||
namespace Teknik.Models
|
||||
{
|
||||
@ -52,6 +53,8 @@ namespace Teknik.Models
|
||||
public DbSet<Takedown> Takedowns { get; set; }
|
||||
// Url Shortener
|
||||
public DbSet<ShortenedUrl> ShortenedUrls { get; set; }
|
||||
// Vaults
|
||||
public DbSet<Vault> Vaults { get; set; }
|
||||
|
||||
protected override void OnModelCreating(DbModelBuilder modelBuilder)
|
||||
{
|
||||
@ -101,6 +104,16 @@ namespace Teknik.Models
|
||||
.WithOptional(u => u.User)
|
||||
.WillCascadeOnDelete(false);
|
||||
|
||||
modelBuilder.Entity<User>()
|
||||
.HasMany<ShortenedUrl>(u => u.ShortenedUrls)
|
||||
.WithOptional(u => u.User)
|
||||
.WillCascadeOnDelete(false);
|
||||
|
||||
modelBuilder.Entity<User>()
|
||||
.HasMany<Vault>(u => u.Vaults)
|
||||
.WithOptional(u => u.User)
|
||||
.WillCascadeOnDelete(false);
|
||||
|
||||
// Upload Mappings
|
||||
modelBuilder.Entity<Upload>()
|
||||
.HasOptional(u => u.User);
|
||||
@ -109,6 +122,14 @@ namespace Teknik.Models
|
||||
modelBuilder.Entity<Paste>()
|
||||
.HasOptional(u => u.User);
|
||||
|
||||
// Shortened URL Mappings
|
||||
modelBuilder.Entity<ShortenedUrl>()
|
||||
.HasOptional(u => u.User);
|
||||
|
||||
// Vault Mappings
|
||||
modelBuilder.Entity<Vault>()
|
||||
.HasOptional(u => u.User);
|
||||
|
||||
// Users
|
||||
modelBuilder.Entity<User>().ToTable("Users");
|
||||
modelBuilder.Entity<Group>().ToTable("Groups");
|
||||
@ -133,6 +154,10 @@ namespace Teknik.Models
|
||||
modelBuilder.Entity<Upload>().ToTable("Uploads");
|
||||
// Pastes
|
||||
modelBuilder.Entity<Paste>().ToTable("Pastes");
|
||||
// Shortened Urls
|
||||
modelBuilder.Entity<ShortenedUrl>().ToTable("ShortenedUrls");
|
||||
// Vaults
|
||||
modelBuilder.Entity<Vault>().ToTable("Vaults");
|
||||
// Podcasts
|
||||
modelBuilder.Entity<Podcast>().ToTable("Podcasts");
|
||||
modelBuilder.Entity<PodcastFile>().ToTable("PodcastFiles");
|
||||
@ -140,8 +165,6 @@ namespace Teknik.Models
|
||||
// Transparency
|
||||
modelBuilder.Entity<Transaction>().ToTable("Transactions");
|
||||
modelBuilder.Entity<Takedown>().ToTable("Takedowns");
|
||||
// Shortened Urls
|
||||
modelBuilder.Entity<ShortenedUrl>().ToTable("ShortenedUrls");
|
||||
|
||||
// Custom Attributes
|
||||
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<CaseSensitiveAttribute, bool>(
|
||||
|
@ -242,6 +242,7 @@
|
||||
<Compile Include="Areas\User\Models\TrustedDevice.cs" />
|
||||
<Compile Include="Areas\User\ViewModels\AuthTokenViewModel.cs" />
|
||||
<Compile Include="Areas\User\ViewModels\TwoFactorViewModel.cs" />
|
||||
<Compile Include="Areas\Vault\ViewModels\CreateVaultViewModel.cs" />
|
||||
<Compile Include="Attributes\TeknikAuthorizeAttribute.cs" />
|
||||
<Compile Include="Filters\CORSActionFilter.cs" />
|
||||
<Compile Include="Models\TransferTypes.cs" />
|
||||
@ -339,6 +340,7 @@
|
||||
<Content Include="Areas\User\Scripts\User.js" />
|
||||
<Content Include="Areas\Shortener\Scripts\Shortener.js" />
|
||||
<Content Include="Areas\Upload\Scripts\Download.js" />
|
||||
<Content Include="Areas\Vault\Content\Vault.css" />
|
||||
<Content Include="Content\audioplayer.css" />
|
||||
<Content Include="Content\Bootstra.386\bootstrap-theme.css" />
|
||||
<Content Include="Content\Bootstra.386\bootstrap.css" />
|
||||
@ -572,6 +574,7 @@
|
||||
<Content Include="Areas\User\Views\User\AuthToken.cshtml" />
|
||||
<Content Include="Areas\Error\Views\Error\Http401.cshtml" />
|
||||
<Content Include="Areas\Transparency\Views\_ViewStart.cshtml" />
|
||||
<Content Include="Areas\Vault\Views\Vault\Create.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