From 6895178168a60ad8f295a33791cda4c8846d6da3 Mon Sep 17 00:00:00 2001
From: BuildFeed Bot
Date: Sat, 6 Oct 2018 19:20:54 +0100
Subject: [PATCH] Begin port to .NET Core
---
BuildFeed.Model/BuildDetails.cs | 2 -
BuildFeed.Model/BuildFeed.Model.csproj | 125 +-
BuildFeed.Model/BuildRepository.cs | 10 +-
BuildFeed.Model/MetaItem.cs | 14 +-
BuildFeed.Model/MongoConfig.cs | 39 +-
BuildFeed.Model/Properties/AssemblyInfo.cs | 39 -
BuildFeed.Model/View/SitemapData.cs | 2 +-
BuildFeed.Model/app.config | 18 -
BuildFeed.sln | 78 +-
BuildFeed/App_Code/BuildHelpers.cshtml | 26 -
BuildFeed/App_Code/PaginationHelpers.cshtml | 164 -
BuildFeed/App_Start/FilterConfig.cs | 12 -
BuildFeed/App_Start/RouteConfig.cs | 26 -
.../Areas/admin/Controllers/RootController.cs | 25 -
.../Areas/admin/Controllers/metaController.cs | 118 -
.../admin/Controllers/usersController.cs | 83 -
.../admin/Models/ViewModel/MetaListing.cs | 12 -
BuildFeed/Areas/admin/Views/Root/index.cshtml | 20 -
BuildFeed/Areas/admin/Views/_ViewStart.cshtml | 3 -
.../Areas/admin/Views/meta/create.cshtml | 107 -
BuildFeed/Areas/admin/Views/meta/index.cshtml | 82 -
.../Areas/admin/Views/users/admins.cshtml | 47 -
.../Areas/admin/Views/users/index.cshtml | 109 -
BuildFeed/Areas/admin/Views/web.config | 36 -
.../Areas/admin/adminAreaRegistration.cs | 13 -
BuildFeed/BuildFeed.csproj | 535 +-
BuildFeed/BuildFeed.csproj.DotSettings | 3 -
BuildFeed/Code/Base32Encoding.cs | 137 -
BuildFeed/Code/CustomContentTypeAttribute.cs | 15 -
BuildFeed/Code/DateTimeModelBinder.cs | 32 -
BuildFeed/Code/DisplayHelpers.cs | 26 +-
BuildFeed/Code/EmailManager/EmailManager.cs | 7 -
.../Code/EmailManager/RegistrationEmail.cs | 24 -
BuildFeed/Code/MvcIntrinsics.cs | 12 -
BuildFeed/Code/OneSignalHelper.cs | 4 +-
BuildFeed/Code/Options/Locale.cs | 89 -
BuildFeed/Code/Options/Theme.cs | 50 -
BuildFeed/Code/OutputCachePushAttribute.cs | 25 -
BuildFeed/Controllers/AccountController.cs | 161 -
BuildFeed/Controllers/BaseController.cs | 31 -
BuildFeed/Controllers/apiController.cs | 264 -
BuildFeed/Controllers/frontController.cs | 61 +-
BuildFeed/Controllers/rssController.cs | 169 -
BuildFeed/Controllers/supportController.cs | 224 -
BuildFeed/Global.asax | 1 -
BuildFeed/Global.asax.cs | 68 -
BuildFeed/Models/ErrorViewModel.cs | 11 +
BuildFeed/Program.cs | 17 +
BuildFeed/Properties/AssemblyInfo.cs | 38 -
.../PublishProfiles/Local Folder.pubxml | 24 -
BuildFeed/Properties/launchSettings.json | 27 +
BuildFeed/Scripts/_references.js | Bin 4664 -> 0 bytes
BuildFeed/Scripts/trumbowyg/langs/da.min.js | 9 -
BuildFeed/Scripts/trumbowyg/langs/fa.min.js | 10 -
BuildFeed/Scripts/trumbowyg/langs/fr.min.js | 10 -
.../Scripts/trumbowyg/langs/zh_tw.min.js | 11 -
.../plugins/base64/trumbowyg.base64.min.js | 1 -
.../cleanpaste/trumbowyg.cleanpaste.min.js | 1 -
.../plugins/colors/trumbowyg.colors.min.js | 1 -
.../plugins/emoji/trumbowyg.emoji.min.js | 1 -
.../insertaudio/trumbowyg.insertaudio.min.js | 1 -
.../plugins/noembed/trumbowyg.noembed.min.js | 1 -
.../plugins/table/trumbowyg.table.min.js | 1 -
.../template/trumbowyg.template.min.js | 1 -
.../plugins/upload/trumbowyg.upload.min.js | 1 -
BuildFeed/Scripts/trumbowyg/trumbowyg.min.js | 2 -
BuildFeed/Scripts/trumbowyg/ui/icons.svg | 1 -
.../Scripts/trumbowyg/ui/trumbowyg.min.css | 2 -
BuildFeed/Startup.cs | 66 +
BuildFeed/Views/Web.config | 32 -
BuildFeed/Views/_ViewImports.cshtml | 7 +
BuildFeed/Views/_ViewStart.cshtml | 4 +-
BuildFeed/Views/account/login.cshtml | 69 -
BuildFeed/Views/account/password.cshtml | 60 -
BuildFeed/Views/account/register.cshtml | 68 -
BuildFeed/Views/account/registerthanks.cshtml | 6 -
.../Views/account/validate-failure.cshtml | 6 -
.../Views/account/validate-success.cshtml | 6 -
BuildFeed/Views/front/AddBulk.cshtml | 5 +-
BuildFeed/Views/front/Pages.cshtml | 7 +-
BuildFeed/Views/front/ViewFamily.cshtml | 11 +-
BuildFeed/Views/front/editBuild.cshtml | 8 +-
BuildFeed/Views/front/index.cshtml | 103 +-
BuildFeed/Views/front/viewBuild.cshtml | 23 +-
BuildFeed/Views/front/viewGroup.cshtml | 9 +-
BuildFeed/Views/front/viewLab.cshtml | 11 +-
BuildFeed/Views/front/viewSource.cshtml | 11 +-
BuildFeed/Views/front/viewVersion.cshtml | 11 +-
BuildFeed/Views/front/viewYear.cshtml | 11 +-
.../DisplayTemplates/Enumeration.cshtml | 4 -
BuildFeed/Views/shared/_default.cshtml | 511 +-
BuildFeed/Views/shared/error.cshtml | 119 -
BuildFeed/Views/support/credits.cshtml | 299 -
BuildFeed/Views/support/rss.cshtml | 52 -
BuildFeed/Views/support/sitemap.cshtml | 130 -
BuildFeed/Web.Debug.config | 8 -
BuildFeed/Web.Release.config | 28 -
BuildFeed/Web.config | 195 -
BuildFeed/appsettings.Development.json | 9 +
BuildFeed/appsettings.json | 17 +
BuildFeed/gulpfile.js | 8 +-
BuildFeed/package-lock.json | 10430 ++++++++--------
BuildFeed/res/Web.config | 9 -
BuildFeed/res/{css => scss}/dark.scss | 0
BuildFeed/res/{css => scss}/default.scss | 0
.../res/{css => scss}/inc/_christmas.scss | 0
BuildFeed/res/{css => scss}/inc/_nord.scss | 0
.../res/{css => scss}/inc/_variables.scss | 0
BuildFeed/res/{css => scss}/light.scss | 0
BuildFeed/res/{css => scss}/rtl.scss | 0
BuildFeed/res/{css => scss}/winter.scss | 0
BuildFeed/res/ts/bfs.js.map | 1 -
BuildFeed/res/ts/christmas.js.map | 1 -
BuildFeed/{ => wwwroot}/BingSiteAuth.xml | 0
.../OneSignalSDKUpdaterWorker.js | 0
BuildFeed/{ => wwwroot}/OneSignalSDKWorker.js | 0
BuildFeed/{ => wwwroot}/browserconfig.xml | 0
BuildFeed/{ => wwwroot}/favicon.ico | Bin
.../{ => wwwroot}/googleacffc6da14c53e15.html | 0
BuildFeed/{ => wwwroot}/manifest.json | 0
BuildFeed/{ => wwwroot}/res/css/dark.css | 0
BuildFeed/{ => wwwroot}/res/css/dark.css.map | 2 +-
BuildFeed/{ => wwwroot}/res/css/default.css | 0
.../{ => wwwroot}/res/css/default.css.map | 0
BuildFeed/{ => wwwroot}/res/css/light.css | 0
BuildFeed/{ => wwwroot}/res/css/light.css.map | 2 +-
BuildFeed/{ => wwwroot}/res/css/rtl.css | 0
BuildFeed/{ => wwwroot}/res/css/rtl.css.map | 0
BuildFeed/{ => wwwroot}/res/css/winter.css | 0
.../{ => wwwroot}/res/css/winter.css.map | 2 +-
BuildFeed/{ => wwwroot}/res/ico/large.png | Bin
BuildFeed/{ => wwwroot}/res/ico/notify.png | Bin
BuildFeed/{ => wwwroot}/res/ico/square.png | Bin
BuildFeed/{ => wwwroot}/res/ico/tiny.png | Bin
BuildFeed/{ => wwwroot}/res/ico/wide.png | Bin
BuildFeed/{res/ts => wwwroot/res/js}/bfs.js | 0
BuildFeed/wwwroot/res/js/bfs.js.map | 1 +
.../{res/ts => wwwroot/res/js}/christmas.js | 0
BuildFeed/wwwroot/res/js/christmas.js.map | 1 +
.../res/js}/trumbowyg/langs/ar.min.js | 0
.../res/js}/trumbowyg/langs/bg.min.js | 0
.../res/js}/trumbowyg/langs/by.min.js | 0
.../res/js}/trumbowyg/langs/ca.min.js | 0
.../res/js}/trumbowyg/langs/cs.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/da.min.js | 9 +
.../res/js}/trumbowyg/langs/de.min.js | 2 +-
.../res/js}/trumbowyg/langs/el.min.js | 0
.../res/js}/trumbowyg/langs/es.min.js | 0
.../res/js}/trumbowyg/langs/es_ar.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/fa.min.js | 10 +
.../res/js}/trumbowyg/langs/fi.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/fr.min.js | 12 +
.../res/js}/trumbowyg/langs/he.min.js | 0
.../res/js}/trumbowyg/langs/hr.min.js | 0
.../res/js}/trumbowyg/langs/hu.min.js | 0
.../res/js}/trumbowyg/langs/id.min.js | 0
.../res/js}/trumbowyg/langs/it.min.js | 0
.../res/js}/trumbowyg/langs/ja.min.js | 0
.../res/js}/trumbowyg/langs/ko.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/lt.min.js | 8 +
.../res/js}/trumbowyg/langs/mn.min.js | 0
.../res/js}/trumbowyg/langs/my.min.js | 0
.../res/js}/trumbowyg/langs/nl.min.js | 0
.../res/js}/trumbowyg/langs/no_nb.min.js | 0
.../res/js}/trumbowyg/langs/ph.min.js | 0
.../res/js}/trumbowyg/langs/pl.min.js | 0
.../res/js}/trumbowyg/langs/pt.min.js | 0
.../res/js}/trumbowyg/langs/pt_br.min.js | 0
.../res/js}/trumbowyg/langs/ro.min.js | 0
.../res/js}/trumbowyg/langs/rs.min.js | 0
.../res/js}/trumbowyg/langs/rs_latin.min.js | 0
.../res/js}/trumbowyg/langs/ru.min.js | 0
.../res/js}/trumbowyg/langs/sk.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/sq.min.js | 8 +
.../res/js}/trumbowyg/langs/sv.min.js | 0
.../wwwroot/res/js/trumbowyg/langs/th.min.js | 9 +
.../res/js}/trumbowyg/langs/tr.min.js | 0
.../res/js}/trumbowyg/langs/ua.min.js | 0
.../res/js}/trumbowyg/langs/vi.min.js | 0
.../res/js}/trumbowyg/langs/zh_cn.min.js | 0
.../res/js/trumbowyg/langs/zh_tw.min.js | 11 +
.../trumbowyg.allowtagsfrompaste.js | 143 +
.../trumbowyg.allowtagsfrompaste.min.js | 1 +
.../plugins/base64/trumbowyg.base64.js | 141 +
.../plugins/base64/trumbowyg.base64.min.js | 1 +
.../cleanpaste/trumbowyg.cleanpaste.js | 112 +
.../cleanpaste/trumbowyg.cleanpaste.min.js | 1 +
.../plugins/colors/trumbowyg.colors.js | 198 +
.../plugins/colors/trumbowyg.colors.min.js | 1 +
.../colors/ui/sass/trumbowyg.colors.scss | 49 +
.../plugins/colors/ui/trumbowyg.colors.css | 43 +
.../colors/ui/trumbowyg.colors.min.css | 2 +-
.../plugins/emoji/trumbowyg.emoji.js | 1279 ++
.../plugins/emoji/trumbowyg.emoji.min.js | 1 +
.../emoji/ui/sass/trumbowyg.emoji.scss | 56 +
.../plugins/emoji/ui/trumbowyg.emoji.css | 47 +
.../plugins/emoji/ui/trumbowyg.emoji.min.css | 2 +-
.../fontfamily/trumbowyg.fontfamily.js | 82 +
.../fontfamily/trumbowyg.fontfamily.min.js | 1 +
.../plugins/fontsize/trumbowyg.fontsize.js | 160 +
.../fontsize/trumbowyg.fontsize.min.js | 1 +
.../plugins/highlight/trumbowyg.highlight.js | 82 +
.../highlight/trumbowyg.highlight.min.js | 1 +
.../ui/sass/trumbowyg.highlight.scss | 25 +
.../highlight/ui/trumbowyg.highlight.css | 20 +
.../highlight/ui/trumbowyg.highlight.min.css | 2 +
.../plugins/history/trumbowyg.history.js | 202 +
.../plugins/history/trumbowyg.history.min.js | 1 +
.../insertaudio/trumbowyg.insertaudio.js | 92 +
.../insertaudio/trumbowyg.insertaudio.min.js | 1 +
.../lineheight/trumbowyg.lineheight.js | 122 +
.../lineheight/trumbowyg.lineheight.min.js | 1 +
.../plugins/mathml/trumbowyg.mathml.js | 98 +
.../plugins/mathml/trumbowyg.mathml.min.js | 1 +
.../mathml/ui/sass/trumbowyg.mathml.scss | 36 +
.../plugins/mathml/ui/trumbowyg.mathml.css | 29 +
.../mathml/ui/trumbowyg.mathml.min.css | 2 +
.../plugins/mention/trumbowyg.mention.js | 111 +
.../plugins/mention/trumbowyg.mention.min.js | 1 +
.../mention/ui/sass/trumbowyg.mention.scss | 39 +
.../plugins/mention/ui/trumbowyg.mention.css | 32 +
.../mention/ui/trumbowyg.mention.min.css | 2 +
.../plugins/noembed/trumbowyg.noembed.js | 111 +
.../plugins/noembed/trumbowyg.noembed.min.js | 1 +
.../pasteembed/trumbowyg.pasteembed.js | 96 +
.../pasteembed/trumbowyg.pasteembed.min.js | 1 +
.../pasteimage/trumbowyg.pasteimage.js | 41 +
.../pasteimage/trumbowyg.pasteimage.min.js | 2 +-
.../preformatted/trumbowyg.preformatted.js | 136 +
.../trumbowyg.preformatted.min.js | 2 +-
.../plugins/resizimg/trumbowyg.resizimg.js | 69 +
.../resizimg/trumbowyg.resizimg.min.js | 1 +
.../trumbowyg/plugins/ruby/trumbowyg.ruby.js | 82 +
.../plugins/ruby/trumbowyg.ruby.min.js | 1 +
.../plugins/table/trumbowyg.table.js | 304 +
.../plugins/table/trumbowyg.table.min.js | 1 +
.../table/ui/sass/trumbowyg.table.scss | 42 +
.../plugins/table/ui/trumbowyg.table.css | 33 +
.../plugins/table/ui/trumbowyg.table.min.css | 2 +
.../plugins/template/trumbowyg.template.js | 70 +
.../template/trumbowyg.template.min.js | 1 +
.../plugins/upload/trumbowyg.upload.js | 266 +
.../plugins/upload/trumbowyg.upload.min.js | 1 +
.../wwwroot/res/js/trumbowyg/trumbowyg.js | 1825 +++
.../wwwroot/res/js/trumbowyg/trumbowyg.min.js | 2 +
.../wwwroot/res/js/trumbowyg/ui/icons.svg | 1 +
.../res/js/trumbowyg/ui/sass/trumbowyg.scss | 809 ++
.../wwwroot/res/js/trumbowyg/ui/trumbowyg.css | 587 +
.../res/js/trumbowyg/ui/trumbowyg.min.css | 2 +
BuildFeed/{ => wwwroot}/robots.txt | 0
.../yandex_702baad42b020be7.html | 0
251 files changed, 13444 insertions(+), 10017 deletions(-)
delete mode 100644 BuildFeed.Model/Properties/AssemblyInfo.cs
delete mode 100644 BuildFeed.Model/app.config
delete mode 100644 BuildFeed/App_Code/BuildHelpers.cshtml
delete mode 100644 BuildFeed/App_Code/PaginationHelpers.cshtml
delete mode 100644 BuildFeed/App_Start/FilterConfig.cs
delete mode 100644 BuildFeed/App_Start/RouteConfig.cs
delete mode 100644 BuildFeed/Areas/admin/Controllers/RootController.cs
delete mode 100644 BuildFeed/Areas/admin/Controllers/metaController.cs
delete mode 100644 BuildFeed/Areas/admin/Controllers/usersController.cs
delete mode 100644 BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs
delete mode 100644 BuildFeed/Areas/admin/Views/Root/index.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/_ViewStart.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/meta/create.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/meta/index.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/users/admins.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/users/index.cshtml
delete mode 100644 BuildFeed/Areas/admin/Views/web.config
delete mode 100644 BuildFeed/Areas/admin/adminAreaRegistration.cs
delete mode 100644 BuildFeed/BuildFeed.csproj.DotSettings
delete mode 100644 BuildFeed/Code/Base32Encoding.cs
delete mode 100644 BuildFeed/Code/CustomContentTypeAttribute.cs
delete mode 100644 BuildFeed/Code/DateTimeModelBinder.cs
delete mode 100644 BuildFeed/Code/EmailManager/EmailManager.cs
delete mode 100644 BuildFeed/Code/EmailManager/RegistrationEmail.cs
delete mode 100644 BuildFeed/Code/MvcIntrinsics.cs
delete mode 100644 BuildFeed/Code/Options/Locale.cs
delete mode 100644 BuildFeed/Code/Options/Theme.cs
delete mode 100644 BuildFeed/Code/OutputCachePushAttribute.cs
delete mode 100644 BuildFeed/Controllers/AccountController.cs
delete mode 100644 BuildFeed/Controllers/BaseController.cs
delete mode 100644 BuildFeed/Controllers/apiController.cs
delete mode 100644 BuildFeed/Controllers/rssController.cs
delete mode 100644 BuildFeed/Controllers/supportController.cs
delete mode 100644 BuildFeed/Global.asax
delete mode 100644 BuildFeed/Global.asax.cs
create mode 100644 BuildFeed/Models/ErrorViewModel.cs
create mode 100644 BuildFeed/Program.cs
delete mode 100644 BuildFeed/Properties/AssemblyInfo.cs
delete mode 100644 BuildFeed/Properties/PublishProfiles/Local Folder.pubxml
create mode 100644 BuildFeed/Properties/launchSettings.json
delete mode 100644 BuildFeed/Scripts/_references.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/langs/da.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/langs/fa.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/langs/fr.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/langs/zh_tw.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/base64/trumbowyg.base64.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/colors/trumbowyg.colors.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/table/trumbowyg.table.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/template/trumbowyg.template.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/plugins/upload/trumbowyg.upload.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/trumbowyg.min.js
delete mode 100644 BuildFeed/Scripts/trumbowyg/ui/icons.svg
delete mode 100644 BuildFeed/Scripts/trumbowyg/ui/trumbowyg.min.css
create mode 100644 BuildFeed/Startup.cs
delete mode 100644 BuildFeed/Views/Web.config
create mode 100644 BuildFeed/Views/_ViewImports.cshtml
delete mode 100644 BuildFeed/Views/account/login.cshtml
delete mode 100644 BuildFeed/Views/account/password.cshtml
delete mode 100644 BuildFeed/Views/account/register.cshtml
delete mode 100644 BuildFeed/Views/account/registerthanks.cshtml
delete mode 100644 BuildFeed/Views/account/validate-failure.cshtml
delete mode 100644 BuildFeed/Views/account/validate-success.cshtml
delete mode 100644 BuildFeed/Views/shared/DisplayTemplates/Enumeration.cshtml
delete mode 100644 BuildFeed/Views/shared/error.cshtml
delete mode 100644 BuildFeed/Views/support/credits.cshtml
delete mode 100644 BuildFeed/Views/support/rss.cshtml
delete mode 100644 BuildFeed/Views/support/sitemap.cshtml
delete mode 100644 BuildFeed/Web.Debug.config
delete mode 100644 BuildFeed/Web.Release.config
delete mode 100644 BuildFeed/Web.config
create mode 100644 BuildFeed/appsettings.Development.json
create mode 100644 BuildFeed/appsettings.json
delete mode 100644 BuildFeed/res/Web.config
rename BuildFeed/res/{css => scss}/dark.scss (100%)
rename BuildFeed/res/{css => scss}/default.scss (100%)
rename BuildFeed/res/{css => scss}/inc/_christmas.scss (100%)
rename BuildFeed/res/{css => scss}/inc/_nord.scss (100%)
rename BuildFeed/res/{css => scss}/inc/_variables.scss (100%)
rename BuildFeed/res/{css => scss}/light.scss (100%)
rename BuildFeed/res/{css => scss}/rtl.scss (100%)
rename BuildFeed/res/{css => scss}/winter.scss (100%)
delete mode 100644 BuildFeed/res/ts/bfs.js.map
delete mode 100644 BuildFeed/res/ts/christmas.js.map
rename BuildFeed/{ => wwwroot}/BingSiteAuth.xml (100%)
rename BuildFeed/{ => wwwroot}/OneSignalSDKUpdaterWorker.js (100%)
rename BuildFeed/{ => wwwroot}/OneSignalSDKWorker.js (100%)
rename BuildFeed/{ => wwwroot}/browserconfig.xml (100%)
rename BuildFeed/{ => wwwroot}/favicon.ico (100%)
rename BuildFeed/{ => wwwroot}/googleacffc6da14c53e15.html (100%)
rename BuildFeed/{ => wwwroot}/manifest.json (100%)
rename BuildFeed/{ => wwwroot}/res/css/dark.css (100%)
rename BuildFeed/{ => wwwroot}/res/css/dark.css.map (59%)
rename BuildFeed/{ => wwwroot}/res/css/default.css (100%)
rename BuildFeed/{ => wwwroot}/res/css/default.css.map (100%)
rename BuildFeed/{ => wwwroot}/res/css/light.css (100%)
rename BuildFeed/{ => wwwroot}/res/css/light.css.map (59%)
rename BuildFeed/{ => wwwroot}/res/css/rtl.css (100%)
rename BuildFeed/{ => wwwroot}/res/css/rtl.css.map (100%)
rename BuildFeed/{ => wwwroot}/res/css/winter.css (100%)
rename BuildFeed/{ => wwwroot}/res/css/winter.css.map (52%)
rename BuildFeed/{ => wwwroot}/res/ico/large.png (100%)
rename BuildFeed/{ => wwwroot}/res/ico/notify.png (100%)
rename BuildFeed/{ => wwwroot}/res/ico/square.png (100%)
rename BuildFeed/{ => wwwroot}/res/ico/tiny.png (100%)
rename BuildFeed/{ => wwwroot}/res/ico/wide.png (100%)
rename BuildFeed/{res/ts => wwwroot/res/js}/bfs.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/bfs.js.map
rename BuildFeed/{res/ts => wwwroot/res/js}/christmas.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/christmas.js.map
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ar.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/bg.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/by.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ca.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/cs.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/da.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/de.min.js (86%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/el.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/es.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/es_ar.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/fa.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/fi.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/fr.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/he.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/hr.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/hu.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/id.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/it.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ja.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ko.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/lt.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/mn.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/my.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/nl.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/no_nb.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ph.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/pl.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/pt.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/pt_br.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ro.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/rs.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/rs_latin.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ru.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/sk.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/sq.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/sv.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/th.min.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/tr.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/ua.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/vi.min.js (100%)
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/langs/zh_cn.min.js (100%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/langs/zh_tw.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/allowtagsfrompaste/trumbowyg.allowtagsfrompaste.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/allowtagsfrompaste/trumbowyg.allowtagsfrompaste.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/base64/trumbowyg.base64.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/base64/trumbowyg.base64.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/colors/trumbowyg.colors.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/colors/trumbowyg.colors.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/colors/ui/sass/trumbowyg.colors.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/colors/ui/trumbowyg.colors.css
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css (83%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/emoji/trumbowyg.emoji.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/emoji/ui/sass/trumbowyg.emoji.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/emoji/ui/trumbowyg.emoji.css
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/plugins/emoji/ui/trumbowyg.emoji.min.css (80%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/fontfamily/trumbowyg.fontfamily.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/fontfamily/trumbowyg.fontfamily.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/fontsize/trumbowyg.fontsize.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/fontsize/trumbowyg.fontsize.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/highlight/trumbowyg.highlight.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/highlight/trumbowyg.highlight.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/highlight/ui/sass/trumbowyg.highlight.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/highlight/ui/trumbowyg.highlight.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/highlight/ui/trumbowyg.highlight.min.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/history/trumbowyg.history.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/history/trumbowyg.history.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/lineheight/trumbowyg.lineheight.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/lineheight/trumbowyg.lineheight.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mathml/trumbowyg.mathml.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mathml/trumbowyg.mathml.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mathml/ui/sass/trumbowyg.mathml.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mathml/ui/trumbowyg.mathml.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mathml/ui/trumbowyg.mathml.min.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mention/trumbowyg.mention.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mention/trumbowyg.mention.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mention/ui/sass/trumbowyg.mention.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mention/ui/trumbowyg.mention.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/mention/ui/trumbowyg.mention.min.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/noembed/trumbowyg.noembed.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/pasteembed/trumbowyg.pasteembed.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/pasteembed/trumbowyg.pasteembed.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/pasteimage/trumbowyg.pasteimage.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/plugins/pasteimage/trumbowyg.pasteimage.min.js (83%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/preformatted/trumbowyg.preformatted.js
rename BuildFeed/{Scripts => wwwroot/res/js}/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js (74%)
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/resizimg/trumbowyg.resizimg.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/resizimg/trumbowyg.resizimg.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/ruby/trumbowyg.ruby.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/ruby/trumbowyg.ruby.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/table/trumbowyg.table.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/table/trumbowyg.table.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/table/ui/sass/trumbowyg.table.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/table/ui/trumbowyg.table.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/table/ui/trumbowyg.table.min.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/template/trumbowyg.template.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/template/trumbowyg.template.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/upload/trumbowyg.upload.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/plugins/upload/trumbowyg.upload.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/trumbowyg.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/trumbowyg.min.js
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/ui/icons.svg
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/ui/sass/trumbowyg.scss
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/ui/trumbowyg.css
create mode 100644 BuildFeed/wwwroot/res/js/trumbowyg/ui/trumbowyg.min.css
rename BuildFeed/{ => wwwroot}/robots.txt (100%)
rename BuildFeed/{ => wwwroot}/yandex_702baad42b020be7.html (100%)
diff --git a/BuildFeed.Model/BuildDetails.cs b/BuildFeed.Model/BuildDetails.cs
index 0fdf537..d79aa00 100644
--- a/BuildFeed.Model/BuildDetails.cs
+++ b/BuildFeed.Model/BuildDetails.cs
@@ -1,6 +1,5 @@
using System;
using System.ComponentModel.DataAnnotations;
-using System.Web.Mvc;
using BuildFeed.Local;
using MongoDB.Bson.Serialization.Attributes;
@@ -42,7 +41,6 @@ public class BuildDetails
public TypeOfSource SourceType { get; set; }
[Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_SourceDetails))]
- [AllowHtml]
public string SourceDetails { get; set; }
[Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_LeakDate))]
diff --git a/BuildFeed.Model/BuildFeed.Model.csproj b/BuildFeed.Model/BuildFeed.Model.csproj
index decf0bd..27aea8f 100644
--- a/BuildFeed.Model/BuildFeed.Model.csproj
+++ b/BuildFeed.Model/BuildFeed.Model.csproj
@@ -1,118 +1,19 @@
-
-
-
+
+
- Debug
- AnyCPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}
- Library
- Properties
- BuildFeed.Model
- BuildFeed.Model
- v4.7.1
- 512
-
- true
- true
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
+ netstandard2.0
+
-
- 7.0.1
-
-
- 1.8.9
-
-
- 5.2.6
-
-
- 3.2.6
-
-
- 3.2.6
-
-
- 2.7.0
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {9ebd4db1-1d37-456b-ad90-357aa89dd1b7}
- BuildFeed.Local
-
-
-
-
-
\ No newline at end of file
+
+
diff --git a/BuildFeed.Model/BuildRepository.cs b/BuildFeed.Model/BuildRepository.cs
index b6c41f7..7bf1d4d 100644
--- a/BuildFeed.Model/BuildRepository.cs
+++ b/BuildFeed.Model/BuildRepository.cs
@@ -31,22 +31,22 @@ public partial class BuildRepository
private readonly IMongoCollection _buildCollection;
- public BuildRepository()
+ public BuildRepository(MongoConfig config)
{
var settings = new MongoClientSettings
{
- Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port)
+ Server = new MongoServerAddress(config.Host, config.Port)
};
- if (!string.IsNullOrEmpty(MongoConfig.Username) && !string.IsNullOrEmpty(MongoConfig.Password))
+ if (!string.IsNullOrEmpty(config.Username) && !string.IsNullOrEmpty(config.Password))
{
settings.Credential =
- MongoCredential.CreateCredential(MongoConfig.Database, MongoConfig.Username, MongoConfig.Password);
+ MongoCredential.CreateCredential(config.Database, config.Username, config.Password);
}
var dbClient = new MongoClient(settings);
- IMongoDatabase buildDatabase = dbClient.GetDatabase(MongoConfig.Database);
+ IMongoDatabase buildDatabase = dbClient.GetDatabase(config.Database);
_buildCollection = buildDatabase.GetCollection(BUILD_COLLECTION_NAME);
}
diff --git a/BuildFeed.Model/MetaItem.cs b/BuildFeed.Model/MetaItem.cs
index b973e3b..51152b1 100644
--- a/BuildFeed.Model/MetaItem.cs
+++ b/BuildFeed.Model/MetaItem.cs
@@ -4,7 +4,6 @@
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
-using System.Web.Mvc;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
@@ -24,7 +23,6 @@ public class MetaItemModel
public string MetaDescription { get; set; }
[DisplayName("Page Content")]
- [AllowHtml]
public string PageContent { get; set; }
}
@@ -35,24 +33,24 @@ public class MetaItem
private readonly IMongoCollection _metaCollection;
- public MetaItem()
+ public MetaItem(MongoConfig config)
{
var settings = new MongoClientSettings
{
- Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port)
+ Server = new MongoServerAddress(config.Host, config.Port)
};
- if (!string.IsNullOrEmpty(MongoConfig.Username) && !string.IsNullOrEmpty(MongoConfig.Password))
+ if (!string.IsNullOrEmpty(config.Username) && !string.IsNullOrEmpty(config.Password))
{
settings.Credential =
- MongoCredential.CreateCredential(MongoConfig.Database, MongoConfig.Username, MongoConfig.Password);
+ MongoCredential.CreateCredential(config.Database, config.Username, config.Password);
}
var dbClient = new MongoClient(settings);
- _metaCollection = dbClient.GetDatabase(MongoConfig.Database)
+ _metaCollection = dbClient.GetDatabase(config.Database)
.GetCollection(META_COLLECTION_NAME);
- _bModel = new BuildRepository();
+ _bModel = new BuildRepository(config);
}
[DataObjectMethod(DataObjectMethodType.Select, false)]
diff --git a/BuildFeed.Model/MongoConfig.cs b/BuildFeed.Model/MongoConfig.cs
index 0906e7f..79b9e8a 100644
--- a/BuildFeed.Model/MongoConfig.cs
+++ b/BuildFeed.Model/MongoConfig.cs
@@ -1,40 +1,37 @@
-using System.Configuration;
-
-namespace BuildFeed.Model
+namespace BuildFeed.Model
{
- public static class MongoConfig
+ public class MongoConfig
{
- public static string Host { get; }
- public static int Port { get; }
- public static string Database { get; }
- public static string Username { get; }
- public static string Password { get; }
+ public string Host { get; }
+ public int Port { get; }
+ public string Database { get; }
+ public string Username { get; }
+ public string Password { get; }
- static MongoConfig()
+ public MongoConfig(string host, int? port, string database, string username, string password)
{
- Host = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoHost"])
- ? ConfigurationManager.AppSettings["data:MongoHost"]
+ Host = !string.IsNullOrEmpty(host)
+ ? host
: "localhost";
- bool success = int.TryParse(ConfigurationManager.AppSettings["data:MongoPort"], out int port);
- if (!success)
+ if (!port.HasValue)
{
port = 27017; // mongo default port
}
- Port = port;
+ Port = port.Value;
- Database = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoDB"])
- ? ConfigurationManager.AppSettings["data:MongoDB"]
+ Database = !string.IsNullOrEmpty(database)
+ ? database
: "MongoAuth";
- Username = ConfigurationManager.AppSettings["data:MongoUser"] ?? "";
- Password = ConfigurationManager.AppSettings["data:MongoPass"] ?? "";
+ Username = username ?? "";
+ Password = password ?? "";
}
- public static void SetupIndexes()
+ public void SetupIndexes()
{
- var b = new BuildRepository();
+ var b = new BuildRepository(this);
#pragma warning disable 4014
b.SetupIndexes();
#pragma warning restore 4014
diff --git a/BuildFeed.Model/Properties/AssemblyInfo.cs b/BuildFeed.Model/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8e21a56..0000000
--- a/BuildFeed.Model/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-
-[assembly: AssemblyTitle("BuildFeed.Model")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("BuildFeed.Model")]
-[assembly: AssemblyCopyright("Copyright © 2013 - 2018, The BuildFeed Team")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-
-[assembly: Guid("7e2b4f61-1c11-4471-af80-5480e94c0664")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/BuildFeed.Model/View/SitemapData.cs b/BuildFeed.Model/View/SitemapData.cs
index e610007..124e5bb 100644
--- a/BuildFeed.Model/View/SitemapData.cs
+++ b/BuildFeed.Model/View/SitemapData.cs
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Web.Routing;
+using Microsoft.AspNetCore.Routing;
namespace BuildFeed.Model.View
{
diff --git a/BuildFeed.Model/app.config b/BuildFeed.Model/app.config
deleted file mode 100644
index ac76913..0000000
--- a/BuildFeed.Model/app.config
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/BuildFeed.sln b/BuildFeed.sln
index a687b73..5d88b83 100644
--- a/BuildFeed.sln
+++ b/BuildFeed.sln
@@ -3,12 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildFeed", "BuildFeed\BuildFeed.csproj", "{CDDCF754-ECAA-4A66-ADAA-62957A57A51B}"
- ProjectSection(ProjectDependencies) = postProject
- {7E2B4F61-1C11-4471-AF80-5480E94C0664} = {7E2B4F61-1C11-4471-AF80-5480E94C0664}
- {7C67BFB9-1B3B-4676-A58D-10573DA82CFE} = {7C67BFB9-1B3B-4676-A58D-10573DA82CFE}
- EndProjectSection
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoAuth", "Authentication\MongoAuth\MongoAuth.csproj", "{7C67BFB9-1B3B-4676-A58D-10573DA82CFE}"
EndProject
Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "BuildFeedApp-Westminster", "Mobile\BuildFeedApp-Westminster\BuildFeedApp-Westminster.jsproj", "{5CAADB66-1FC2-4492-B766-36354687120D}"
@@ -17,15 +11,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authentication", "Authentic
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{2B646675-44D1-4722-8A86-8C64876C8FB7}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildFeed.Model", "BuildFeed.Model\BuildFeed.Model.csproj", "{7E2B4F61-1C11-4471-AF80-5480E94C0664}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{948A2168-A092-4958-A465-427271563061}"
ProjectSection(SolutionItems) = preProject
LICENSE.md = LICENSE.md
README.md = README.md
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildFeed.Local", "BuildFeed.Local\BuildFeed.Local.csproj", "{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildFeed.Local", "BuildFeed.Local\BuildFeed.Local.csproj", "{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildFeed.Model", "BuildFeed.Model\BuildFeed.Model.csproj", "{0D3A70CB-4657-485A-8662-14665C3F1B10}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildFeed", "BuildFeed\BuildFeed.csproj", "{73311A63-73DC-4AF4-89F0-92B2443C05D9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -39,22 +35,6 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|ARM.Build.0 = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|x64.Build.0 = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Debug|x86.Build.0 = Debug|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|Any CPU.Build.0 = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|ARM.ActiveCfg = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|ARM.Build.0 = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|x64.ActiveCfg = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|x64.Build.0 = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|x86.ActiveCfg = Release|Any CPU
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}.Release|x86.Build.0 = Release|Any CPU
{7C67BFB9-1B3B-4676-A58D-10573DA82CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C67BFB9-1B3B-4676-A58D-10573DA82CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C67BFB9-1B3B-4676-A58D-10573DA82CFE}.Debug|ARM.ActiveCfg = Debug|Any CPU
@@ -95,22 +75,6 @@ Global
{5CAADB66-1FC2-4492-B766-36354687120D}.Release|x86.ActiveCfg = Release|x86
{5CAADB66-1FC2-4492-B766-36354687120D}.Release|x86.Build.0 = Release|x86
{5CAADB66-1FC2-4492-B766-36354687120D}.Release|x86.Deploy.0 = Release|x86
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|ARM.Build.0 = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|x64.Build.0 = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Debug|x86.Build.0 = Debug|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|Any CPU.Build.0 = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|ARM.ActiveCfg = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|ARM.Build.0 = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|x64.ActiveCfg = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|x64.Build.0 = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|x86.ActiveCfg = Release|Any CPU
- {7E2B4F61-1C11-4471-AF80-5480E94C0664}.Release|x86.Build.0 = Release|Any CPU
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Debug|ARM.ActiveCfg = Debug|Any CPU
@@ -127,6 +91,38 @@ Global
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Release|x64.Build.0 = Release|Any CPU
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Release|x86.ActiveCfg = Release|Any CPU
{9EBD4DB1-1D37-456B-AD90-357AA89DD1B7}.Release|x86.Build.0 = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|ARM.Build.0 = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|x64.Build.0 = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Debug|x86.Build.0 = Debug|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|ARM.ActiveCfg = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|ARM.Build.0 = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|x64.ActiveCfg = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|x64.Build.0 = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|x86.ActiveCfg = Release|Any CPU
+ {0D3A70CB-4657-485A-8662-14665C3F1B10}.Release|x86.Build.0 = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|ARM.Build.0 = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|x64.Build.0 = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Debug|x86.Build.0 = Debug|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|ARM.ActiveCfg = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|ARM.Build.0 = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|x64.ActiveCfg = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|x64.Build.0 = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|x86.ActiveCfg = Release|Any CPU
+ {73311A63-73DC-4AF4-89F0-92B2443C05D9}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/BuildFeed/App_Code/BuildHelpers.cshtml b/BuildFeed/App_Code/BuildHelpers.cshtml
deleted file mode 100644
index 8766466..0000000
--- a/BuildFeed/App_Code/BuildHelpers.cshtml
+++ /dev/null
@@ -1,26 +0,0 @@
-@using BuildFeed.Model.View
-@helper LatestBuild(string title, FrontPageBuild build)
-{
- @title
-
-
- @if (build.Revision.HasValue)
- {
- @($"{build.Number}.{build.Revision}")
- }
- else
- {
- @build.Number
- }
-
-
- @build.Lab
-
- @if (build.BuildTime.HasValue)
- {
-
- @build.BuildTime.Value.ToString("HH:mm, dddd dd MMMM yyyy")
-
- }
-
-}
diff --git a/BuildFeed/App_Code/PaginationHelpers.cshtml b/BuildFeed/App_Code/PaginationHelpers.cshtml
deleted file mode 100644
index 156cd0b..0000000
--- a/BuildFeed/App_Code/PaginationHelpers.cshtml
+++ /dev/null
@@ -1,164 +0,0 @@
-@using System.Web.Mvc.Html
-@using System.Web.Routing
-@using BuildFeed.Code
-@helper PaginationBlock(int currentPage, int totalPages, string view, RouteValueDictionary rd)
-{
- string multiView = view + "Page";
-
- if (totalPages > 1)
- {
-
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/App_Start/FilterConfig.cs b/BuildFeed/App_Start/FilterConfig.cs
deleted file mode 100644
index 0a738c6..0000000
--- a/BuildFeed/App_Start/FilterConfig.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Web.Mvc;
-
-namespace BuildFeed
-{
- public class FilterConfig
- {
- public static void RegisterGlobalFilters(GlobalFilterCollection filters)
- {
- filters.Add(new HandleErrorAttribute());
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/App_Start/RouteConfig.cs b/BuildFeed/App_Start/RouteConfig.cs
deleted file mode 100644
index 8a4a2c6..0000000
--- a/BuildFeed/App_Start/RouteConfig.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System.Web.Http;
-using System.Web.Mvc;
-using System.Web.Routing;
-
-namespace BuildFeed
-{
- public class RouteConfig
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
-
- routes.AppendTrailingSlash = true;
- routes.MapHttpRoute("API",
- "api/{action}/{id}",
- new
- {
- controller = "api",
- action = "GetBuilds",
- id = UrlParameter.Optional
- });
-
- routes.MapMvcAttributeRoutes();
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Controllers/RootController.cs b/BuildFeed/Areas/admin/Controllers/RootController.cs
deleted file mode 100644
index 6e6e8bd..0000000
--- a/BuildFeed/Areas/admin/Controllers/RootController.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System.Threading.Tasks;
-using System.Web.Mvc;
-using BuildFeed.Controllers;
-using BuildFeed.Model;
-
-namespace BuildFeed.Admin.Controllers
-{
- [Authorize(Roles = "Administrators")]
- [RouteArea("admin")]
- [RoutePrefix("")]
- public class RootController : BaseController
- {
- [Route("")]
- public ActionResult Index() => View();
-
- [Route("regen-cache")]
- public async Task RegenerateCache()
- {
- var bRepo = new BuildRepository();
- await bRepo.RegenerateCachedProperties();
-
- return RedirectToAction(nameof(Index));
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Controllers/metaController.cs b/BuildFeed/Areas/admin/Controllers/metaController.cs
deleted file mode 100644
index c77c616..0000000
--- a/BuildFeed/Areas/admin/Controllers/metaController.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using System.Linq;
-using System.Threading.Tasks;
-using System.Web.Mvc;
-using BuildFeed.Admin.Models.ViewModel;
-using BuildFeed.Controllers;
-using BuildFeed.Model;
-
-namespace BuildFeed.Admin.Controllers
-{
- [Authorize(Roles = "Administrators")]
- [RouteArea("admin")]
- [RoutePrefix("meta")]
- public class MetaController : BaseController
- {
- private readonly MetaItem _mModel;
-
- public MetaController()
- {
- _mModel = new MetaItem();
- }
-
- [Route("")]
- public async Task Index() => View(new MetaListing
- {
- CurrentItems = from i in await _mModel.Select()
- group i by i.Id.Type
- into b
- orderby b.Key.ToString()
- select b,
-
- NewItems = from i in (from l in await _mModel.SelectUnusedLabs()
- select new MetaItemModel
- {
- Id = new MetaItemKey
- {
- Type = MetaType.Lab,
- Value = l
- }
- }).Concat(from v in await _mModel.SelectUnusedVersions()
- select new MetaItemModel
- {
- Id = new MetaItemKey
- {
- Type = MetaType.Version,
- Value = v
- }
- })
- .Concat(from y in await _mModel.SelectUnusedYears()
- select new MetaItemModel
- {
- Id = new MetaItemKey
- {
- Type = MetaType.Year,
- Value = y
- }
- })
- .Concat(from y in await _mModel.SelectUnusedFamilies()
- select new MetaItemModel
- {
- Id = new MetaItemKey
- {
- Type = MetaType.Family,
- Value = y
- }
- })
- group i by i.Id.Type
- into b
- orderby b.Key.ToString()
- select b
- });
-
- [Route("create/{type}/{value}")]
- public ActionResult Create(MetaType type, string value) => View(new MetaItemModel
- {
- Id = new MetaItemKey
- {
- Type = type,
- Value = value
- }
- });
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- [Route("create/{type}/{value}")]
- public async Task Create(MetaItemModel meta)
- {
- if (ModelState.IsValid)
- {
- await _mModel.Insert(meta);
- return RedirectToAction(nameof(Index));
- }
-
- return View(meta);
- }
-
- [Route("edit/{type}/{value}")]
- public async Task Edit(MetaType type, string value) => View(nameof(Create),
- await _mModel.SelectById(new MetaItemKey
- {
- Type = type,
- Value = value
- }));
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- [Route("edit/{type}/{value}")]
- public async Task Edit(MetaItemModel meta)
- {
- if (ModelState.IsValid)
- {
- await _mModel.Update(meta);
- return RedirectToAction("Index");
- }
-
- return View(nameof(Create), meta);
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Controllers/usersController.cs b/BuildFeed/Areas/admin/Controllers/usersController.cs
deleted file mode 100644
index 33ff342..0000000
--- a/BuildFeed/Areas/admin/Controllers/usersController.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-using System.Linq;
-using System.Web.Mvc;
-using System.Web.Security;
-using BuildFeed.Controllers;
-using MongoAuth;
-
-namespace BuildFeed.Admin.Controllers
-{
- [Authorize(Roles = "Administrators")]
- [RouteArea("admin")]
- [RoutePrefix("users")]
- public class UsersController : BaseController
- {
- [Route]
- public ActionResult Index() => View(Membership.GetAllUsers().Cast());
-
- [Route("admins")]
- public ActionResult Admins()
- {
- var admins = Roles.GetUsersInRole("Administrators").Select(Membership.GetUser).ToList();
-
- return View(admins.OrderByDescending(m => m.UserName));
- }
-
- [Route("approve/{id:guid}")]
- public ActionResult Approve(Guid id)
- {
- var provider = Membership.Provider as MongoMembershipProvider;
- provider?.ChangeApproval(id, true);
- return RedirectToAction(nameof(Index));
- }
-
- [Route("unapprove/{id:guid}")]
- public ActionResult Unapprove(Guid id)
- {
- var provider = Membership.Provider as MongoMembershipProvider;
- provider?.ChangeApproval(id, false);
- return RedirectToAction(nameof(Index));
- }
-
- [Route("lock/{id:guid}")]
- public ActionResult Lock(Guid id)
- {
- var provider = Membership.Provider as MongoMembershipProvider;
- provider?.ChangeLockStatus(id, true);
- return RedirectToAction(nameof(Index));
- }
-
- [Route("unlock/{id:guid}")]
- public ActionResult Unlock(Guid id)
- {
- var provider = Membership.Provider as MongoMembershipProvider;
- provider?.ChangeLockStatus(id, false);
- return RedirectToAction(nameof(Index));
- }
-
- [Route("delete/{id:guid}")]
- public ActionResult Delete(Guid id)
- {
- var provider = Membership.Provider as MongoMembershipProvider;
- provider?.DeleteUser(id);
- return RedirectToAction(nameof(Index));
- }
-
- [Route("cleanup")]
- public ActionResult Cleanup()
- {
- MembershipUserCollection users = Membership.GetAllUsers();
-
- foreach (MembershipUser user in users)
- {
- if (!user.IsApproved
- && user.CreationDate.AddDays(30) < DateTime.Now)
- {
- Membership.DeleteUser(user.UserName);
- }
- }
-
- return RedirectToAction(nameof(Index));
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs b/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs
deleted file mode 100644
index b36ac49..0000000
--- a/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using BuildFeed.Model;
-
-namespace BuildFeed.Admin.Models.ViewModel
-{
- public class MetaListing
- {
- public IEnumerable> CurrentItems { get; set; }
- public IEnumerable> NewItems { get; set; }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/Root/index.cshtml b/BuildFeed/Areas/admin/Views/Root/index.cshtml
deleted file mode 100644
index 4948f17..0000000
--- a/BuildFeed/Areas/admin/Views/Root/index.cshtml
+++ /dev/null
@@ -1,20 +0,0 @@
-@{
- ViewBag.Title = $"Administration | {InvariantTerms.SiteName}";
-}
-
-Administration
-
-
- -
- @Html.ActionLink("Manage users", nameof(UsersController.Index), "Users")
-
- - @Html.ActionLink("View administrators", nameof(UsersController.Admins), "Users")
-
-
- -
- @Html.ActionLink("Manage metadata", nameof(MetaController.Index), "Meta")
-
- -
- @Html.ActionLink("Regenerate cached properties", nameof(RootController.RegenerateCache), "Root")
-
-
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/_ViewStart.cshtml b/BuildFeed/Areas/admin/Views/_ViewStart.cshtml
deleted file mode 100644
index d599c2d..0000000
--- a/BuildFeed/Areas/admin/Views/_ViewStart.cshtml
+++ /dev/null
@@ -1,3 +0,0 @@
-@{
- Layout = "~/Views/shared/_default.cshtml";
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/meta/create.cshtml b/BuildFeed/Areas/admin/Views/meta/create.cshtml
deleted file mode 100644
index 288f717..0000000
--- a/BuildFeed/Areas/admin/Views/meta/create.cshtml
+++ /dev/null
@@ -1,107 +0,0 @@
-@using BuildFeed.Model
-@model MetaItemModel
-@{
- ViewBag.Title = $"Add metadata for {Model.Id.Value} | {InvariantTerms.SiteName}";
-}
-
-@section head
-{
-
-}
-
-@($"Add metadata for {Model.Id.Value}")
-
-
-@using (Html.BeginForm())
-{
- @Html.AntiForgeryToken()
-
- @Html.HiddenFor(model => model.Id.Type)
- @Html.HiddenFor(model => model.Id.Value)
-
-
-
-
-
-
-}
-
-@section Scripts
-{
-
-
-
-
-
-
-
-}
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/meta/index.cshtml b/BuildFeed/Areas/admin/Views/meta/index.cshtml
deleted file mode 100644
index a8dcec7..0000000
--- a/BuildFeed/Areas/admin/Views/meta/index.cshtml
+++ /dev/null
@@ -1,82 +0,0 @@
-@using BuildFeed.Admin.Models.ViewModel
-@using BuildFeed.Model
-@model MetaListing
-
-@{
- ViewBag.Title = $"Manage metadata | {InvariantTerms.SiteName}";
-}
-
-Manage metadata
-
- - @Html.ActionLink("Return to admin panel", nameof(RootController.Index), "Root")
-
-Current items
-
-
-
- Name |
- |
-
-
-
- @foreach (var group in Model.CurrentItems)
- {
-
-
- @group.Key
- |
-
- foreach (MetaItemModel item in group)
- {
-
- @item.Id.Value |
-
- @Html.ActionLink("Edit", nameof(MetaController.Edit), new
- {
- type = item.Id.Type,
- value = item.Id.Value
- }, new
- {
- @class = "button",
- style = "width:50px"
- }) |
-
- }
- }
-
-
-Add new items
-
-
-
- Name |
- |
-
-
-
- @foreach (var group in Model.NewItems)
- {
-
-
- @group.Key
- |
-
- foreach (MetaItemModel item in group)
- {
-
- @item.Id.Value |
-
- @Html.ActionLink("Create", nameof(MetaController.Create), new
- {
- type = item.Id.Type,
- value = item.Id.Value
- }, new
- {
- @class = "button",
- style = "width:50px"
- }) |
-
- }
- }
-
-
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/users/admins.cshtml b/BuildFeed/Areas/admin/Views/users/admins.cshtml
deleted file mode 100644
index adde895..0000000
--- a/BuildFeed/Areas/admin/Views/users/admins.cshtml
+++ /dev/null
@@ -1,47 +0,0 @@
-@using Humanizer
-@model IEnumerable
-
-@{
- ViewBag.Title = "View administrators | BuildFeed";
-}
-
-View administrators
-
-
- - @Html.ActionLink("Manage users", "Index")
- - @Html.ActionLink("Return to admin panel", "Index", "Root")
-
-
-
-
-
-
- Username
- |
-
- Email Address
- |
-
- Last Login Time
- |
-
-
-
- @foreach (MembershipUser mu in Model)
- {
-
-
- @mu.UserName
- |
-
- @mu.Email
- |
-
- @(mu.LastLoginDate == default(DateTime)
- ? "Never"
- : mu.LastLoginDate.Humanize())
- |
-
- }
-
-
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/users/index.cshtml b/BuildFeed/Areas/admin/Views/users/index.cshtml
deleted file mode 100644
index b6b0a4e..0000000
--- a/BuildFeed/Areas/admin/Views/users/index.cshtml
+++ /dev/null
@@ -1,109 +0,0 @@
-@using Humanizer
-@model IEnumerable
-
-@{
- ViewBag.Title = $"Manage users | {InvariantTerms.SiteName}";
-}
-
-Manage users
-
-
- - @Html.ActionLink("View administrators", "Admins")
- - @Html.ActionLink("Clean-up old unapproved users", "Cleanup")
- - @Html.ActionLink("Return to admin panel", "Index", "Root")
-
-
-
-
-
-
- Username
- |
-
- Email Address
- |
-
- Registration Time
- |
-
- Last Login Time
- |
-
- Last Lockout Time
- |
- |
- |
- |
-
-
-
- @foreach (MembershipUser mu in Model)
- {
-
-
- @mu.UserName
- |
-
- @mu.Email
- |
-
- @mu.CreationDate.Humanize()
- |
-
- @(mu.LastLoginDate == DateTime.MinValue
- ? "Never"
- : mu.LastLoginDate.Humanize())
- |
-
- @(mu.LastLockoutDate == DateTime.MinValue
- ? "Never"
- : mu.LastLockoutDate.Humanize())
- |
-
- @(mu.IsApproved
- ? Html.ActionLink("Unapprove", nameof(UsersController.Unapprove), new
- {
- id = mu.ProviderUserKey
- }, new
- {
- @class = "button delete-button"
- })
- : Html.ActionLink("Approve", nameof(UsersController.Approve), new
- {
- id = mu.ProviderUserKey
- }, new
- {
- @class = "button add-button"
- }))
- |
-
- @(!mu.IsLockedOut
- ? Html.ActionLink("Lock", nameof(UsersController.Lock), new
- {
- id = mu.ProviderUserKey
- }, new
- {
- @class = "button delete-button"
- })
- : Html.ActionLink("Unlock", nameof(UsersController.Unlock), new
- {
- id = mu.ProviderUserKey
- }, new
- {
- @class = "button add-button"
- }))
- |
-
- @Html.ActionLink("Delete", nameof(UsersController.Delete), new
- {
- id = mu.ProviderUserKey
- }, new
- {
- @class = "button delete-button",
- onclick = @"return !(confirm(""Are you sure you want to delete this user?"") === false);"
- })
- |
-
- }
-
-
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/Views/web.config b/BuildFeed/Areas/admin/Views/web.config
deleted file mode 100644
index 9ab7a67..0000000
--- a/BuildFeed/Areas/admin/Views/web.config
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BuildFeed/Areas/admin/adminAreaRegistration.cs b/BuildFeed/Areas/admin/adminAreaRegistration.cs
deleted file mode 100644
index 9723209..0000000
--- a/BuildFeed/Areas/admin/adminAreaRegistration.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System.Web.Mvc;
-
-namespace BuildFeed.Admin
-{
- public class AdminAreaRegistration : AreaRegistration
- {
- public override string AreaName => "admin";
-
- public override void RegisterArea(AreaRegistrationContext context)
- {
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/BuildFeed.csproj b/BuildFeed/BuildFeed.csproj
index 93b1115..4e87b72 100644
--- a/BuildFeed/BuildFeed.csproj
+++ b/BuildFeed/BuildFeed.csproj
@@ -1,430 +1,133 @@
-
-
-
-
+
+
- Debug
- AnyCPU
-
-
- 2.0
- {CDDCF754-ECAA-4A66-ADAA-62957A57A51B}
- {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
- Library
- Properties
- BuildFeed
- BuildFeed
- v4.7.1
- false
- true
- true
-
-
-
-
- /subscriptions/4af45631-0e5c-4253-9e38-d0c47f9c5b32/resourcegroups/Default-ApplicationInsights-CentralUS/providers/microsoft.insights/components/BuildFeed
-
-
-
-
- true
- Latest
-
- False
- False
- true
- true
-
-
- true
- full
- false
- bin\
- DEBUG;TRACE
- prompt
- 4
- ExtendedCorrectnessRules.ruleset
-
-
- pdbonly
- true
- bin\
- TRACE
- prompt
- 4
- ES6
- None
- True
- False
- ES6
- False
-
-
- False
- True
- True
-
-
+ netcoreapp2.1
+ aspnet-BuildFeed-794E2AE1-72C2-4F00-B783-1C78917251E7
+ 3.0
+
-
-
-
- 2.5.1
-
-
- 5.2.6
-
-
- 3.2.6
-
-
- 5.2.6
-
-
- 3.2.6
-
-
- 2.0.1
-
-
- 2.9.0
-
-
- 1.0.0
-
-
- 0.3.0
-
-
- 1.0.3
-
-
- 1.3.0
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Global.asax
-
-
+
+
+
-
-
-
-
-
-
- package.json
-
-
-
-
- winter.scss
-
-
- winter.css
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- dark.scss
-
-
- dark.css
-
-
- default.scss
-
-
- default.css
-
-
- light.scss
-
-
- light.css
-
-
- rtl.scss
-
-
- rtl.css
-
-
- bfs.ts
-
-
- bfs.js
-
-
- christmas.ts
-
-
- christmas.js
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Designer
-
-
- Web.config
- Designer
-
-
- Web.config
- Designer
-
-
-
-
-
-
-
-
-
-
-
-
-
- Designer
-
-
-
-
-
-
-
-
-
-
-
-
- Always
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
-
-
-
- {7c67bfb9-1b3b-4676-a58d-10573da82cfe}
- MongoAuth
-
-
- {9ebd4db1-1d37-456b-ad90-357aa89dd1b7}
- BuildFeed.Local
-
-
- {7e2b4f61-1c11-4471-af80-5480e94c0664}
- BuildFeed.Model
-
-
-
- 10.0
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
-
-
-
- ES2015
- None
- False
- False
- None
- True
-
-
- False
- True
- False
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- True
- True
- 50468
- /
- http://localhost:50505/
- False
- False
-
-
- False
-
-
-
-
-
- attrib +H $(ProjectDir)node_modules /D
-attrib +H $(ProjectDir)obj /D
-
-
\ No newline at end of file
+
+
diff --git a/BuildFeed/BuildFeed.csproj.DotSettings b/BuildFeed/BuildFeed.csproj.DotSettings
deleted file mode 100644
index b9bda2e..0000000
--- a/BuildFeed/BuildFeed.csproj.DotSettings
+++ /dev/null
@@ -1,3 +0,0 @@
-
- True
- True
\ No newline at end of file
diff --git a/BuildFeed/Code/Base32Encoding.cs b/BuildFeed/Code/Base32Encoding.cs
deleted file mode 100644
index 6592bba..0000000
--- a/BuildFeed/Code/Base32Encoding.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-
-namespace BuildFeed.Code
-{
- /* Based off http://stackoverflow.com/a/7135008 */
- public class Base32Encoding
- {
- public static byte[] ToBytes(string input)
- {
- if (string.IsNullOrEmpty(input))
- {
- throw new ArgumentNullException(nameof(input));
- }
-
- input = input.TrimEnd('='); //remove padding characters
- int byteCount = input.Length * 5 / 8; //this must be TRUNCATED
- var returnArray = new byte[byteCount];
-
- byte curByte = 0,
- bitsRemaining = 8;
-
- int arrayIndex = 0;
-
- foreach (char c in input)
- {
- int cValue = CharToValue(c);
-
- int mask;
- if (bitsRemaining > 5)
- {
- mask = cValue << (bitsRemaining - 5);
- curByte = (byte)(curByte | mask);
- bitsRemaining -= 5;
- }
- else
- {
- mask = cValue >> (5 - bitsRemaining);
- curByte = (byte)(curByte | mask);
- returnArray[arrayIndex++] = curByte;
- curByte = (byte)(cValue << (3 + bitsRemaining));
- bitsRemaining += 3;
- }
- }
-
- //if we didn't end with a full byte
- if (arrayIndex != byteCount)
- {
- returnArray[arrayIndex] = curByte;
- }
-
- return returnArray;
- }
-
- public static string ToString(byte[] input)
- {
- if (input == null || input.Length == 0)
- {
- throw new ArgumentNullException(nameof(input));
- }
-
- int charCount = (int)Math.Ceiling(input.Length / 5d) * 8;
- var returnArray = new char[charCount];
-
- byte nextChar = 0,
- bitsRemaining = 5;
- int arrayIndex = 0;
-
- foreach (byte b in input)
- {
- nextChar = (byte)(nextChar | (b >> (8 - bitsRemaining)));
- returnArray[arrayIndex++] = ValueToChar(nextChar);
-
- if (bitsRemaining < 4)
- {
- nextChar = (byte)((b >> (3 - bitsRemaining)) & 31);
- returnArray[arrayIndex++] = ValueToChar(nextChar);
- bitsRemaining += 5;
- }
-
- bitsRemaining -= 3;
- nextChar = (byte)((b << bitsRemaining) & 31);
- }
-
- //if we didn't end with a full char
- if (arrayIndex != charCount)
- {
- returnArray[arrayIndex++] = ValueToChar(nextChar);
- while (arrayIndex != charCount)
- {
- returnArray[arrayIndex++] = '='; //padding
- }
- }
-
- return new string(returnArray);
- }
-
- private static int CharToValue(char c)
- {
- int value = c;
-
- //65-90 == uppercase letters
- if (value < 91 && value > 64)
- {
- return value - 65;
- }
-
- //50-55 == numbers 2-7
- if (value < 56 && value > 49)
- {
- return value - 24;
- }
-
- //97-122 == lowercase letters
- if (value < 123 && value > 96)
- {
- return value - 97;
- }
-
- throw new ArgumentException("Character is not a Base32 character.", nameof(c));
- }
-
- private static char ValueToChar(byte b)
- {
- if (b < 26)
- {
- return (char)(b + 65);
- }
-
- if (b < 32)
- {
- return (char)(b + 24);
- }
-
- throw new ArgumentException("Byte is not a value Base32 value.", nameof(b));
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/CustomContentTypeAttribute.cs b/BuildFeed/Code/CustomContentTypeAttribute.cs
deleted file mode 100644
index 628db91..0000000
--- a/BuildFeed/Code/CustomContentTypeAttribute.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Web.Mvc;
-
-namespace BuildFeed.Code
-{
- // this class is a hacky workaround because Microsoft just don't feel like caching the correct content type
- public class CustomContentTypeAttribute : ActionFilterAttribute
- {
- public string ContentType { get; set; }
-
- public override void OnResultExecuted(ResultExecutedContext filterContext)
- {
- filterContext.HttpContext.Response.ContentType = ContentType;
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/DateTimeModelBinder.cs b/BuildFeed/Code/DateTimeModelBinder.cs
deleted file mode 100644
index 052bc5b..0000000
--- a/BuildFeed/Code/DateTimeModelBinder.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-using System.Globalization;
-using System.Web.Mvc;
-
-namespace BuildFeed.Code
-{
- public class DateTimeModelBinder : DefaultModelBinder
- {
- public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
- {
- ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
-
- bool success = DateTime.TryParse(value.AttemptedValue,
- CultureInfo.CurrentUICulture.DateTimeFormat,
- DateTimeStyles.AllowWhiteSpaces,
- out DateTime retValue);
-
- if (!success)
- {
- success = DateTime.TryParseExact(value.AttemptedValue,
- "yyMMdd-HHmm",
- CultureInfo.InvariantCulture,
- DateTimeStyles.AllowWhiteSpaces,
- out retValue);
- }
-
- return success
- ? retValue as DateTime?
- : null;
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/DisplayHelpers.cs b/BuildFeed/Code/DisplayHelpers.cs
index d0d4a64..0e06914 100644
--- a/BuildFeed/Code/DisplayHelpers.cs
+++ b/BuildFeed/Code/DisplayHelpers.cs
@@ -3,14 +3,14 @@
using System.Globalization;
using System.Linq;
using System.Text;
-using System.Web;
-using System.Web.Mvc;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.AspNetCore.Mvc.ViewFeatures;
namespace BuildFeed.Code
{
public static class MvcExtensions
{
- public static IHtmlString CheckboxListForEnum(this HtmlHelper html, string id, T currentItem)
+ public static string CheckboxListForEnum(this HtmlHelper html, string id, T currentItem)
where T : struct
{
var sb = new StringBuilder();
@@ -29,9 +29,15 @@ public static IHtmlString CheckboxListForEnum(this HtmlHelper html, string id
var wrapper = new TagBuilder("div");
wrapper.Attributes.Add("class", "checkbox");
- var label = new TagBuilder("label");
+ var label = new TagBuilder("label")
+ {
+ TagRenderMode = TagRenderMode.Normal
+ };
- var input = new TagBuilder("input");
+ var input = new TagBuilder("input")
+ {
+ TagRenderMode = TagRenderMode.SelfClosing
+ };
if ((enumValue & currentValue) != 0)
{
input.MergeAttribute("checked", "checked");
@@ -41,15 +47,15 @@ public static IHtmlString CheckboxListForEnum(this HtmlHelper html, string id
input.MergeAttribute("value", enumValue.ToString());
input.MergeAttribute("name", id);
- label.InnerHtml = input.ToString(TagRenderMode.SelfClosing);
- label.InnerHtml += GetDisplayTextForEnum(enumItem);
+ label.InnerHtml.AppendHtml(input.ToString());
+ label.InnerHtml.Append(GetDisplayTextForEnum(enumItem));
- wrapper.InnerHtml = label.ToString(TagRenderMode.Normal);
+ wrapper.InnerHtml.AppendHtml(label.ToString());
- sb.Append(wrapper.ToString(TagRenderMode.Normal));
+ sb.Append(wrapper);
}
- return new HtmlString(sb.ToString());
+ return sb.ToString();
}
public static string GetDisplayTextForEnum(object o)
diff --git a/BuildFeed/Code/EmailManager/EmailManager.cs b/BuildFeed/Code/EmailManager/EmailManager.cs
deleted file mode 100644
index d62bd88..0000000
--- a/BuildFeed/Code/EmailManager/EmailManager.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace BuildFeed.Code
-{
- public static partial class EmailManager
- {
- private const string EMAIL_FROM = "thomas@buildfeed.net";
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/EmailManager/RegistrationEmail.cs b/BuildFeed/Code/EmailManager/RegistrationEmail.cs
deleted file mode 100644
index 3fd6ca9..0000000
--- a/BuildFeed/Code/EmailManager/RegistrationEmail.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.Net.Mail;
-using System.Threading.Tasks;
-using System.Web.Security;
-using BuildFeed.Local;
-
-namespace BuildFeed.Code
-{
- public static partial class EmailManager
- {
- public static async Task SendRegistrationEmail(MembershipUser mu, string validationLink)
- {
- using (var mm = new MailMessage(EMAIL_FROM, mu.Email))
- {
- mm.Subject = string.Format(VariantTerms.Email_Registration_Subject, InvariantTerms.SiteName);
- mm.Body = string.Format(VariantTerms.Email_Registration_Body, InvariantTerms.SiteName, validationLink);
-
- using (var sc = new SmtpClient())
- {
- await sc.SendMailAsync(mm);
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/MvcIntrinsics.cs b/BuildFeed/Code/MvcIntrinsics.cs
deleted file mode 100644
index 65770b5..0000000
--- a/BuildFeed/Code/MvcIntrinsics.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Web.Mvc;
-using System.Web.WebPages;
-
-namespace BuildFeed.Code
-{
- public static class MvcIntrinsics
- {
- public static AjaxHelper Ajax => ((WebViewPage)WebPageContext.Current.Page).Ajax;
- public static HtmlHelper Html => ((WebViewPage)WebPageContext.Current.Page).Html;
- public static UrlHelper Url => ((WebViewPage)WebPageContext.Current.Page).Url;
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/OneSignalHelper.cs b/BuildFeed/Code/OneSignalHelper.cs
index ca88332..7ee0c5a 100644
--- a/BuildFeed/Code/OneSignalHelper.cs
+++ b/BuildFeed/Code/OneSignalHelper.cs
@@ -12,11 +12,11 @@ namespace BuildFeed.Code
{
public static class OneSignalHelper
{
- public static void PushNewBuild(this OneSignalClient osc, Build build, string url)
+ public static void PushNewBuild(this OneSignalClient osc, Guid appId, Build build, string url)
{
osc.Notifications.Create(new NotificationCreateOptions
{
- AppId = Guid.Parse(ConfigurationManager.AppSettings["push:AppId"]),
+ AppId = appId,
IncludedSegments = new List
{
#if DEBUG
diff --git a/BuildFeed/Code/Options/Locale.cs b/BuildFeed/Code/Options/Locale.cs
deleted file mode 100644
index e4ee295..0000000
--- a/BuildFeed/Code/Options/Locale.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System.Globalization;
-using System.Linq;
-using System.Web;
-
-namespace BuildFeed.Code.Options
-{
- public class Locale
- {
- private const string LANG_COOKIE_NAME = "bf_lang";
-
- public static readonly Locale[] AvailableLocales =
- {
- new Locale("ar"),
- //new Locale("bn"),
- new Locale("cs"),
- new Locale("de"),
- new Locale("el"),
- new Locale("en"),
- new Locale("es"),
- new Locale("fa"),
- new Locale("fi"),
- new Locale("fr"),
- new Locale("he"),
- new Locale("hr"),
- new Locale("hu"),
- new Locale("id"),
- new Locale("it"),
- new Locale("ja"),
- new Locale("ko"),
- new Locale("lt"),
- new Locale("nl"),
- new Locale("pl"),
- new Locale("pt"),
- new Locale("pt-br"),
- //new Locale("qps-ploc"),
- new Locale("ro"),
- new Locale("ru"),
- new Locale("sk"),
- new Locale("sl"),
- new Locale("sv"),
- new Locale("tr"),
- new Locale("uk"),
- new Locale("vi"),
- new Locale("zh-hans"),
- new Locale("zh-hant")
- };
-
- public string DisplayName => Info.NativeName;
-
- public CultureInfo Info { get; set; }
- public string LocaleId { get; set; }
-
- public Locale(string localeId)
- {
- LocaleId = localeId;
- Info = CultureInfo.GetCultureInfo(localeId);
- }
-
- public static CultureInfo DetectCulture(HttpContextBase context)
- {
- string langCookie = context.Request.Cookies[LANG_COOKIE_NAME]?.Value;
-
- if (!string.IsNullOrEmpty(langCookie))
- {
- try
- {
- var ci = (CultureInfo)CultureInfo.GetCultureInfo(langCookie).Clone();
-
- // Get Gregorian Calendar in locale if available
- Calendar gc = ci.OptionalCalendars.FirstOrDefault(c
- => c is GregorianCalendar
- && ((GregorianCalendar)c).CalendarType == GregorianCalendarTypes.Localized);
- if (gc != null)
- {
- ci.DateTimeFormat.Calendar = gc;
- }
-
- return ci;
- }
-
- catch (CultureNotFoundException)
- {
- }
- }
-
- return CultureInfo.CurrentCulture;
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/Options/Theme.cs b/BuildFeed/Code/Options/Theme.cs
deleted file mode 100644
index 63cd3f5..0000000
--- a/BuildFeed/Code/Options/Theme.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using System.Web;
-using BuildFeed.Local;
-
-namespace BuildFeed.Code.Options
-{
- public class Theme
- {
- private const string THEME_COOKIE_NAME = "bf_theme";
-
- public static Theme[] AvailableThemes = (from st in Enum.GetValues(typeof(SiteTheme)).Cast()
- select new Theme(st)).ToArray();
-
- public string CookieValue => Value.ToString();
- public string CssPath => $"~/res/css/{Value.ToString().ToLower()}.css";
- public string DisplayName => MvcExtensions.GetDisplayTextForEnum(Value);
- public SiteTheme Value { get; }
-
- public Theme(SiteTheme st)
- {
- Value = st;
- }
-
- public static SiteTheme DetectTheme(HttpContextBase context)
- {
- string themeCookie = context.Request.Cookies[THEME_COOKIE_NAME]?.Value;
- var theme = SiteTheme.Dark;
- if (!string.IsNullOrEmpty(themeCookie))
- {
- Enum.TryParse(themeCookie, out theme);
- }
-
- return theme;
- }
- }
-
- public enum SiteTheme
- {
- [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeDark))]
- Dark = 0,
-
- [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeLight))]
- Light,
-
- [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeWinter))]
- Winter
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Code/OutputCachePushAttribute.cs b/BuildFeed/Code/OutputCachePushAttribute.cs
deleted file mode 100644
index dda114c..0000000
--- a/BuildFeed/Code/OutputCachePushAttribute.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System.Globalization;
-using System.Web;
-using System.Web.Mvc;
-using BuildFeed.Code.Options;
-
-namespace BuildFeed.Code
-{
- public class OutputCachePushAttribute : ActionFilterAttribute
- {
- public override void OnResultExecuted(ResultExecutedContext filterContext)
- {
- bool isRtl = CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft;
- var theme = new Theme(Theme.DetectTheme(filterContext.HttpContext));
-
- filterContext.HttpContext.Response.PushPromise("/res/css/default.css");
- filterContext.HttpContext.Response.PushPromise(VirtualPathUtility.ToAbsolute(theme.CssPath));
- if (isRtl)
- {
- filterContext.HttpContext.Response.PushPromise("/res/css/rtl.css");
- }
-
- filterContext.HttpContext.Response.PushPromise("/res/ts/bfs.js");
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Controllers/AccountController.cs b/BuildFeed/Controllers/AccountController.cs
deleted file mode 100644
index 93ffbdf..0000000
--- a/BuildFeed/Controllers/AccountController.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using System.Web;
-using System.Web.Mvc;
-using System.Web.Security;
-using BuildFeed.Code;
-using BuildFeed.Local;
-using BuildFeed.Model.View;
-using MongoAuth;
-
-namespace BuildFeed.Controllers
-{
- public class AccountController : BaseController
- {
- [Route("login/")]
- public ActionResult Login() => View();
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- [Route("login/")]
- public ActionResult Login(LoginUser ru)
- {
- if (ModelState.IsValid)
- {
- bool isAuthenticated = Membership.ValidateUser(ru.UserName, ru.Password);
-
- if (isAuthenticated)
- {
- int expiryLength = ru.RememberMe
- ? 129600
- : 60;
-
- var ticket = new FormsAuthenticationTicket(ru.UserName, true, expiryLength);
- string encryptedTicket = FormsAuthentication.Encrypt(ticket);
- var cookieTicket = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
- {
- Expires = DateTime.Now.AddMinutes(expiryLength),
- Path = FormsAuthentication.FormsCookiePath
- };
- Response.Cookies.Add(cookieTicket);
-
- string returnUrl = string.IsNullOrEmpty(Request.QueryString["ReturnUrl"])
- ? "/"
- : Request.QueryString["ReturnUrl"];
-
- return Redirect(returnUrl);
- }
- }
-
- ViewData["ErrorMessage"] = "The username and password are not valid.";
- return View(ru);
- }
-
- [Authorize]
- [Route("password/")]
- public ActionResult Password() => View();
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- [Authorize]
- [Route("password/")]
- public ActionResult Password(ChangePassword cp)
- {
- if (ModelState.IsValid)
- {
- MembershipUser user = Membership.GetUser();
-
- if (user != null)
- {
- bool success = user.ChangePassword(cp.OldPassword, cp.NewPassword);
-
- if (success)
- {
- return Redirect("/");
- }
- }
- }
-
- ViewData["ErrorMessage"] = VariantTerms.Support_Error_ChangingPasswordFail;
- return View(cp);
- }
-
- [Route("logout/")]
- public ActionResult Logout()
- {
- FormsAuthentication.SignOut();
- return Redirect("/");
- }
-
- [Route("register/")]
- public ActionResult Register() => View();
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- [Route("register/")]
- public async Task Register(RegistrationUser ru)
- {
- if (ModelState.IsValid)
- {
- MembershipUser mu = Membership.CreateUser(ru.UserName,
- ru.Password,
- ru.EmailAddress,
- "{IGNORE}",
- "{IGNORE}",
- false,
- out MembershipCreateStatus status);
-
- switch (status)
- {
- case MembershipCreateStatus.Success:
- {
- Roles.AddUserToRole(mu.UserName, "Users");
-
- var provider = (MongoMembershipProvider)Membership.Provider;
- var id = (Guid)mu.ProviderUserKey;
- string hash = (await provider.GenerateValidationHash(id)).ToLowerInvariant();
-
- string fullUrl = Request.Url?.GetLeftPart(UriPartial.Authority)
- + Url.Action("Validate",
- "Account",
- new
- {
- id,
- hash
- });
- await EmailManager.SendRegistrationEmail(mu, fullUrl);
- return RedirectToAction(nameof(RegisterThanks));
- }
- case MembershipCreateStatus.InvalidPassword:
- ViewData["ErrorMessage"] = VariantTerms.Support_Error_InvalidPassword;
- break;
- case MembershipCreateStatus.DuplicateEmail:
- ViewData["ErrorMessage"] = VariantTerms.Support_Error_DuplicateEmail;
- break;
- case MembershipCreateStatus.DuplicateUserName:
- ViewData["ErrorMessage"] = VariantTerms.Support_Error_DuplicateUserName;
- break;
- default:
- ViewData["ErrorMessage"] = VariantTerms.Support_Error_UnknownError;
- break;
- }
- }
-
- return View(ru);
- }
-
- [Route("register/thanks/")]
- public ActionResult RegisterThanks() => View();
-
- [Route("validate/{id:guid}/{hash}/")]
- public async Task Validate(Guid id, string hash)
- {
- var provider = (MongoMembershipProvider)Membership.Provider;
- bool success = await provider.ValidateUserFromHash(id, hash);
-
- return View(success
- ? "validate-success"
- : "validate-failure");
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Controllers/BaseController.cs b/BuildFeed/Controllers/BaseController.cs
deleted file mode 100644
index b26be30..0000000
--- a/BuildFeed/Controllers/BaseController.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System.Globalization;
-using System.Linq;
-using System.Reflection;
-using System.Web.Mvc;
-using System.Web.Routing;
-using BuildFeed.Code.Options;
-
-namespace BuildFeed.Controllers
-{
- public class BaseController : Controller
- {
- public static string VersionString = Assembly.GetExecutingAssembly()
- .GetCustomAttributes(typeof(AssemblyMetadataAttribute))
- .OfType()
- .FirstOrDefault(a => a.Key == "GitHash")
- ?.Value
- ?? "N/A";
-
- protected override void Initialize(RequestContext requestContext)
- {
- CultureInfo ci = Locale.DetectCulture(requestContext.HttpContext);
- CultureInfo.CurrentCulture = ci;
- CultureInfo.CurrentUICulture = ci;
-
- ViewBag.Theme = new Theme(Theme.DetectTheme(requestContext.HttpContext));
- ViewBag.Version = VersionString;
-
- base.Initialize(requestContext);
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Controllers/apiController.cs b/BuildFeed/Controllers/apiController.cs
deleted file mode 100644
index 55c8858..0000000
--- a/BuildFeed/Controllers/apiController.cs
+++ /dev/null
@@ -1,264 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Web.Http;
-using System.Web.Security;
-using AutoMapper;
-using BuildFeed.Code;
-using BuildFeed.Local;
-using BuildFeed.Model;
-using BuildFeed.Model.Api;
-using BuildFeed.Model.View;
-using OneSignal.RestAPIv3.Client;
-
-#pragma warning disable SG0016 // Controller method is vulnerable to CSRF - Not relevant for API
-
-namespace BuildFeed.Controllers
-{
- public class ApiController : System.Web.Http.ApiController
- {
- private readonly BuildRepository _bModel;
-
- public ApiController()
- {
- _bModel = new BuildRepository();
- }
-
- public async Task GetBuilds(int limit = 20, int skip = 0)
- => (from b in await _bModel.SelectBuildsByOrder(limit, skip)
- select Mapper.Map(b)).ToArray();
-
- public async Task GetBuildGroups(int limit = 20, int skip = 0)
- {
- var bgroups = await _bModel.SelectAllGroups(limit, skip);
- return bgroups.ToArray();
- }
-
- public async Task GetBuildsForBuildGroup(uint major, uint minor, uint number, uint? revision = null)
- => (from b in await _bModel.SelectGroup(new BuildGroup
- {
- Major = major,
- Minor = minor,
- Build = number,
- Revision = revision
- })
- select Mapper.Map(b)).ToArray();
-
- public async Task GetBuildsByLab(string lab, int limit = 20, int skip = 0)
- => (from b in await _bModel.SelectLab(lab, limit, skip)
- select Mapper.Map(b)).ToArray();
-
- public async Task> GetFamilyOverviews() => await _bModel.SelectFamilyOverviews();
-
- public async Task> GetWin10Labs()
- {
- var labs = new List();
- labs.AddRange(await _bModel.SelectLabsForVersion(6, 4));
- labs.AddRange(await _bModel.SelectLabsForVersion(10, 0));
-
- return labs.GroupBy(l => l).Select(l => l.Key).Where(l => l.All(c => c != '(')).ToArray();
- }
-
- [HttpPost]
- public async Task AddWin10Builds(NewBuildPost apiModel)
- {
- if (apiModel == null)
- {
- return false;
- }
-
- if (Membership.ValidateUser(apiModel.Username, apiModel.Password)
- && (Roles.IsUserInRole(apiModel.Username, "Editors")
- || Roles.IsUserInRole(apiModel.Username, "Administrators")))
- {
- var generateOldItem = new Func(nb =>
- {
- var bi = new BuildDetails
- {
- MajorVersion = nb.MajorVersion,
- MinorVersion = nb.MinorVersion,
- Number = nb.Number,
- Revision = nb.Revision,
- Lab = nb.Lab,
- BuildTime = nb.BuildTime.HasValue
- ? DateTime.SpecifyKind(nb.BuildTime.Value, DateTimeKind.Utc)
- : null as DateTime?,
- SourceType = TypeOfSource.PrivateLeak
- };
-
- return bi;
- });
-
- var builds = apiModel.NewBuilds.Select(nb => new Build
- {
- MajorVersion = nb.MajorVersion,
- MinorVersion = nb.MinorVersion,
- Number = nb.Number,
- Revision = nb.Revision,
- Lab = nb.Lab,
- BuildTime = nb.BuildTime.HasValue
- ? DateTime.SpecifyKind(nb.BuildTime.Value, DateTimeKind.Utc)
- : null as DateTime?,
- Added = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
- Modified = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
- SourceType = TypeOfSource.PrivateLeak,
-
- History = new List>
- {
- new ItemHistory
- {
- Type = ItemHistoryType.Added,
- Time = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
- UserName = apiModel.Username,
- Item = generateOldItem(nb)
- }
- }
- });
-
- foreach (Build build in builds)
- {
- await _bModel.Insert(build);
-
- var osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
- osc.PushNewBuild(build,
- $"https://buildfeed.net{Url.Route("Build", new { controller = "Front", action = nameof(FrontController.ViewBuild), id = build.Id, area = "", httproute = "" })}?utm_source=notification&utm_campaign=new_build");
- }
-
- return true;
- }
-
- return false;
- }
-
- public async Task> GetSearchResult(string id, int maxResults = 16)
- {
- if (string.IsNullOrWhiteSpace(id))
- {
- return Array.Empty();
- }
-
- var results = new List();
-
- results.AddRange(from s in (from c in await _bModel.SelectAllSources()
- select new
- {
- Text = MvcExtensions.GetDisplayTextForEnum(c),
- Value = c
- })
- where s.Text.ToLower().Contains(id.ToLower())
- orderby s.Text.ToLower().IndexOf(id.ToLower(), StringComparison.Ordinal)
- select new SearchResult
- {
- Url = Url.Route("Source Root",
- new
- {
- controller = "Front",
- action = "ViewSource",
- source = s.Value
- }),
- Label = s.Text.Replace(id, "" + id + ""),
- Title = s.Text,
- Group = VariantTerms.Search_Source
- });
-
- if (results.Count >= maxResults)
- {
- return results.Take(maxResults);
- }
-
- results.AddRange(from v in await _bModel.SelectAllVersions()
- where $"{v.Major}.{v.Minor}".StartsWith(id)
- orderby v.Major descending, v.Minor descending
- select new SearchResult
- {
- Url = Url.Route("Version Root",
- new
- {
- controller = "Front",
- action = "ViewVersion",
- major = v.Major,
- minor = v.Minor
- }),
- Label = $"{v.Major}.{v.Minor}".Replace(id, "" + id + ""),
- Title = "",
- Group = VariantTerms.Search_Version
- });
-
- if (results.Count >= maxResults)
- {
- return results.Take(maxResults);
- }
-
- results.AddRange(from y in await _bModel.SelectAllYears()
- where y.ToString().Contains(id)
- orderby y descending
- select new SearchResult
- {
- Url = Url.Route("Year Root",
- new
- {
- controller = "Front",
- action = "ViewYear",
- year = y
- }),
- Label = y.ToString().Replace(id, "" + id + ""),
- Title = "",
- Group = VariantTerms.Search_Year
- });
-
- if (results.Count >= maxResults)
- {
- return results.Take(maxResults);
- }
-
- results.AddRange(from l in await _bModel.SearchLabs(id)
- select new SearchResult
- {
- Url = Url.Route("Lab Root",
- new
- {
- controller = "Front",
- action = "ViewLab",
- lab = l.Replace('/', '-')
- }),
- Label = l.Replace(id, $"{id}"),
- Title = l,
- Group = VariantTerms.Search_Lab
- });
-
- if (results.Count >= maxResults)
- {
- return results.Take(maxResults);
- }
-
- results.AddRange(from b in await _bModel.SelectBuildsByStringSearch(id, maxResults)
- select new SearchResult
- {
- Url = Url.Route("Build",
- new
- {
- controller = "Front",
- action = "ViewBuild",
- id = b.Id
- }),
- Label = b.FullBuildString.Replace(id, $"{id}"),
- Title = b.FullBuildString,
- Group = VariantTerms.Search_Build
- });
-
- if (results.Count == 0)
- {
- results.Add(new SearchResult
- {
- Url = "/",
- Label = VariantTerms.Search_Empty,
- Group = ""
- });
- }
-
- return results.Take(16);
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Controllers/frontController.cs b/BuildFeed/Controllers/frontController.cs
index d3dd6a9..6f59f23 100644
--- a/BuildFeed/Controllers/frontController.cs
+++ b/BuildFeed/Controllers/frontController.cs
@@ -8,27 +8,37 @@
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Security.Policy;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
-using System.Web.Mvc;
using BuildFeed.Code;
using BuildFeed.Model;
using BuildFeed.Model.View;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.IdentityModel.Protocols;
using OneSignal.RestAPIv3.Client;
namespace BuildFeed.Controllers
{
- public class FrontController : BaseController
+ public class FrontController : Controller
{
public const int PAGE_SIZE = 72;
private readonly BuildRepository _bModel;
private readonly MetaItem _mModel;
+ private readonly IHostingEnvironment _env;
+ private readonly IConfiguration _config;
- public FrontController()
+ public FrontController(IHostingEnvironment env, IConfiguration config, BuildRepository bModel, MetaItem mModel)
{
- _bModel = new BuildRepository();
- _mModel = new MetaItem();
+ _env = env;
+ _bModel = bModel;
+ _mModel = mModel;
+ _config = config;
}
[Route("", Order = 1)]
@@ -61,7 +71,7 @@ public async Task IndexPage(int page)
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("Pages", buildGroups);
@@ -105,7 +115,7 @@ public async Task ViewBuild(Guid id)
Build b = await _bModel.SelectById(id);
if (b == null)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View(b);
@@ -117,7 +127,7 @@ public async Task ViewBuild(long id)
Build b = await _bModel.SelectByLegacyId(id);
if (b == null)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return RedirectToAction(nameof(ViewBuild),
@@ -137,10 +147,10 @@ public async Task TwitterCard(Guid id)
Build b = await _bModel.SelectById(id);
if (b == null)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
- string path = Path.Combine(Server.MapPath("~/res/card/"), $"{b.Family}.png");
+ string path = Path.Combine(_env.WebRootPath, "res/card", $"{b.Family}.png");
bool backExists = System.IO.File.Exists(path);
using (Bitmap bm = backExists
@@ -252,7 +262,7 @@ public async Task TwitterCard(Guid id)
}
Response.ContentType = "image/png";
- bm.Save(Response.OutputStream, ImageFormat.Png);
+ bm.Save(Response.Body, ImageFormat.Png);
}
}
@@ -265,7 +275,7 @@ public async Task TwitterCard(long id)
Build b = await _bModel.SelectByLegacyId(id);
if (b == null)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return RedirectToAction(nameof(TwitterCard),
@@ -308,7 +318,7 @@ public async Task ViewFamilyPage(ProjectFamily family, int page)
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("viewFamily", builds);
@@ -347,7 +357,7 @@ public async Task ViewLabPage(string lab, int page)
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("viewLab", builds);
@@ -386,7 +396,7 @@ public async Task ViewSourcePage(TypeOfSource source, int page)
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("viewSource", builds);
@@ -424,7 +434,7 @@ public async Task ViewYearPage(int year, int page)
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("viewYear", builds);
@@ -464,7 +474,7 @@ public async Task ViewVersionPage(uint major, uint minor, int page
if (ViewBag.PageNumber > ViewBag.PageCount)
{
- return new HttpNotFoundResult();
+ return NotFound();
}
return View("viewVersion", builds);
@@ -538,8 +548,11 @@ public async Task AddBuild(Build build)
return View("EditBuild", build);
}
- var osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
- osc.PushNewBuild(build,
+
+ var osc = new OneSignalClient(_config.GetValue("push:OneSignalApiKey"));
+ osc.PushNewBuild(
+ _config.GetValue("push:AppId"),
+ build,
$"https://buildfeed.net{Url.Action(nameof(ViewBuild), new { id = build.Id })}?utm_source=notification&utm_campaign=new_build");
return RedirectToAction(nameof(ViewBuild),
@@ -562,12 +575,12 @@ public async Task AddBuild(Build build)
[HttpPost]
public async Task AddBulk(FormCollection values)
{
- var osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
+ var osc = new OneSignalClient(_config.GetValue("push:OneSignalApiKey"));
var success = new List();
var failed = new List();
- bool notify = bool.Parse(values[nameof(BulkAddition.SendNotifications)].Split(',')[0]);
+ bool notify = bool.Parse(values[nameof(BulkAddition.SendNotifications)][0]);
- foreach (string line in values[nameof(BulkAddition.Builds)]
+ foreach (string line in values[nameof(BulkAddition.Builds)][0]
.Split(new[]
{
'\r',
@@ -636,7 +649,9 @@ public async Task AddBulk(FormCollection values)
if (notify)
{
- osc.PushNewBuild(b,
+ osc.PushNewBuild(
+ _config.GetValue("push:AppId"),
+ b,
$"https://buildfeed.net{Url.Action(nameof(ViewBuild), new { id = b.Id })}?utm_source=notification&utm_campaign=new_build");
}
diff --git a/BuildFeed/Controllers/rssController.cs b/BuildFeed/Controllers/rssController.cs
deleted file mode 100644
index 59e2d88..0000000
--- a/BuildFeed/Controllers/rssController.cs
+++ /dev/null
@@ -1,169 +0,0 @@
-using System;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Web.Mvc;
-using BuildFeed.Model;
-using WilderMinds.RssSyndication;
-
-namespace BuildFeed.Controllers
-{
- public class RssController : BaseController
- {
- private const int RSS_SIZE = 25;
- private readonly BuildRepository _bModel;
-
- public RssController()
- {
- _bModel = new BuildRepository();
- }
-
- [Route("rss/compiled")]
- public async Task Index()
- {
- var builds = await _bModel.SelectBuildsByCompileDate(RSS_SIZE);
-
- var feed = new Feed
- {
- Title = "BuildFeed RSS - Recently Compiled",
- Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"),
- Items = (from build in builds
- select new Item
- {
- Title = build.AlternateBuildString,
- Link = new Uri(
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"),
- Permalink =
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}",
- Categories = build.RssCategories,
- PublishDate = DateTime.SpecifyKind(build.BuildTime.GetValueOrDefault(), DateTimeKind.Utc)
- }).ToList()
- };
-
- return new ContentResult
- {
- Content = feed.Serialize(),
- ContentType = "application/rss+xml",
- ContentEncoding = Encoding.UTF8
- };
- }
-
- [Route("rss/added")]
- public async Task Added()
- {
- var builds = await _bModel.SelectBuildsByAddedDate(RSS_SIZE);
-
- var feed = new Feed
- {
- Title = "BuildFeed RSS - Recently Added",
- Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"),
- Items = (from build in builds
- select new Item
- {
- Title = build.AlternateBuildString,
- Link = new Uri(
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"),
- Permalink =
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}",
- Categories = build.RssCategories,
- PublishDate = DateTime.SpecifyKind(build.Added, DateTimeKind.Utc)
- }).ToList()
- };
-
- return new ContentResult
- {
- Content = feed.Serialize(),
- ContentType = "application/rss+xml",
- ContentEncoding = Encoding.UTF8
- };
- }
-
- [Route("rss/leaked")]
- public async Task Leaked()
- {
- var builds = await _bModel.SelectBuildsByLeakedDate(RSS_SIZE);
-
- var feed = new Feed
- {
- Title = "BuildFeed RSS - Recently Leaked",
- Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"),
- Items = (from build in builds
- select new Item
- {
- Title = build.AlternateBuildString,
- Link = new Uri(
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"),
- Permalink =
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}",
- Categories = build.RssCategories,
- PublishDate = DateTime.SpecifyKind(build.LeakDate.GetValueOrDefault(), DateTimeKind.Utc)
- }).ToList()
- };
-
- return new ContentResult
- {
- Content = feed.Serialize(),
- ContentType = "application/rss+xml",
- ContentEncoding = Encoding.UTF8
- };
- }
-
- [Route("rss/version")]
- public async Task Version()
- {
- var builds = await _bModel.SelectBuildsByOrder(RSS_SIZE);
-
- var feed = new Feed
- {
- Title = "BuildFeed RSS - Highest Version",
- Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"),
- Items = (from build in builds
- select new Item
- {
- Title = build.AlternateBuildString,
- Link = new Uri(
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"),
- Permalink =
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}",
- Categories = build.RssCategories
- }).ToList()
- };
-
- return new ContentResult
- {
- Content = feed.Serialize(),
- ContentType = "application/rss+xml",
- ContentEncoding = Encoding.UTF8
- };
- }
-
- [Route("rss/lab/{lab}")]
- public async Task Lab(string lab)
- {
- var builds = await _bModel.SelectLab(lab, RSS_SIZE);
-
- var feed = new Feed
- {
- Title = $"BuildFeed RSS - {lab} Lab",
- Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"),
- Items = (from build in builds
- select new Item
- {
- Title = build.AlternateBuildString,
- Link = new Uri(
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"),
- Permalink =
- $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}",
- Categories = build.RssCategories
- }).ToList()
- };
-
- return new ContentResult
- {
- Content = feed.Serialize(),
- ContentType = "application/rss+xml",
- ContentEncoding = Encoding.UTF8
- };
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Controllers/supportController.cs b/BuildFeed/Controllers/supportController.cs
deleted file mode 100644
index 736f579..0000000
--- a/BuildFeed/Controllers/supportController.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Web.Mvc;
-using System.Web.Routing;
-using System.Xml.Linq;
-using BuildFeed.Code;
-using BuildFeed.Local;
-using BuildFeed.Model;
-using BuildFeed.Model.View;
-
-namespace BuildFeed.Controllers
-{
- public class SupportController : BaseController
- {
- private readonly BuildRepository _bModel;
-
- public SupportController()
- {
- _bModel = new BuildRepository();
- }
-
- [Route("rss")]
- public async Task Rss()
- {
- ViewBag.Labs = await _bModel.SelectAllLabs();
- return View();
- }
-
- [Route("sitemap/")]
- #if !DEBUG
- [OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "userName;lang;theme")]
- #endif
- public async Task Sitemap()
- {
- var builds = await _bModel.SelectBuildsByOrder();
- var actions = new Dictionary
- {
- {
- "Pages", new[]
- {
- new SitemapPagedAction
- {
- UrlParams = new RouteValueDictionary(new
- {
- controller = "Front",
- action = "Index",
- page = 1
- }),
- Pages = (builds.Count + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE
- }
- }
- },
- {
- "Versions", (from b in builds
- group b by new BuildVersion
- {
- Major = b.MajorVersion,
- Minor = b.MinorVersion
- }
- into bv
- orderby bv.Key.Major descending, bv.Key.Minor descending
- select new SitemapPagedAction
- {
- Name = $"{InvariantTerms.ProductName} {bv.Key.Major}.{bv.Key.Minor}",
- UrlParams = new RouteValueDictionary(new
- {
- controller = "Front",
- action = "ViewVersion",
- major = bv.Key.Major,
- minor = bv.Key.Minor,
- page = 1
- }),
- Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE
- }).ToArray()
- },
- {
- "Labs", (from b in builds
- where !string.IsNullOrEmpty(b.Lab)
- group b by b.Lab
- into bv
- orderby bv.Key
- select new SitemapPagedAction
- {
- Name = bv.Key,
- UrlParams = new RouteValueDictionary(new
- {
- controller = "Front",
- action = "ViewLab",
- lab = bv.Key,
- page = 1
- }),
- Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE
- }).ToArray()
- },
- {
- "Years", (from b in builds
- where b.BuildTime.HasValue
- group b by b.BuildTime.Value.Year
- into bv
- orderby bv.Key descending
- select new SitemapPagedAction
- {
- Name = bv.Key.ToString(),
- UrlParams = new RouteValueDictionary(new
- {
- controller = "Front",
- action = "ViewYear",
- year = bv.Key,
- page = 1
- }),
- Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE
- }).ToArray()
- },
- {
- "Sources", (from b in builds
- group b by b.SourceType
- into bv
- orderby bv.Key
- select new SitemapPagedAction
- {
- Name = MvcExtensions.GetDisplayTextForEnum(bv.Key),
- UrlParams = new RouteValueDictionary(new
- {
- controller = "Front",
- action = "ViewSource",
- source = bv.Key,
- page = 1
- }),
- Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE
- }).ToArray()
- }
- };
-
-
- var model = new SitemapData
- {
- Builds = (from b in builds
- group b by new
- {
- Major = b.MajorVersion,
- Minor = b.MinorVersion,
- Build = b.Number,
- b.Revision
- }
- into bg
- orderby bg.Key.Major descending, bg.Key.Minor descending, bg.Key.Build descending, bg.Key.Revision
- descending
- select new SitemapDataBuildGroup
- {
- Id = new BuildGroup
- {
- Major = bg.Key.Major,
- Minor = bg.Key.Minor,
- Build = bg.Key.Build,
- Revision = bg.Key.Revision
- },
- Builds = (from bgb in bg
- select new SitemapDataBuild
- {
- Id = bgb.Id,
- Name = bgb.FullBuildString
- }).ToArray()
- }).ToArray(),
- Actions = actions,
- Labs = (from b in builds
- group b by b.Lab
- into lab
- select lab.Key).ToArray()
- };
-
- return View(model);
- }
-
- [Route("xml-sitemap/")]
- #if !DEBUG
- [OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "userName;lang;theme")]
- #endif
- public async Task XmlSitemap()
- {
- XNamespace xn = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9");
- var xlist = new List();
-
- // home page
- var home = new XElement(xn + "url");
- home.Add(new XElement(xn + "loc", Request.Url?.GetLeftPart(UriPartial.Authority) + "/"));
- home.Add(new XElement(xn + "changefreq", "daily"));
- xlist.Add(home);
-
- foreach (Build b in await _bModel.Select())
- {
- var url = new XElement(xn + "url");
- url.Add(new XElement(xn + "loc",
- Request.Url?.GetLeftPart(UriPartial.Authority)
- + Url.Action("ViewBuild",
- "Front",
- new
- {
- id = b.Id
- })));
- if (b.Modified != DateTime.MinValue)
- {
- url.Add(new XElement(xn + "lastmod", b.Modified.ToString("yyyy-MM-dd")));
- }
-
- xlist.Add(url);
- }
-
- var decl = new XDeclaration("1.0", "utf-8", "");
- var root = new XElement(xn + "urlset", xlist);
-
- var xdoc = new XDocument(decl, root);
-
- Response.ContentType = "application/xml";
- xdoc.Save(Response.OutputStream);
-
- return new EmptyResult();
- }
-
- [Route("credits/")]
- public ActionResult Credits() => View();
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Global.asax b/BuildFeed/Global.asax
deleted file mode 100644
index 9d17b82..0000000
--- a/BuildFeed/Global.asax
+++ /dev/null
@@ -1 +0,0 @@
-<%@ Application Codebehind="Global.asax.cs" Inherits="BuildFeed.MvcApplication" Language="C#" %>
\ No newline at end of file
diff --git a/BuildFeed/Global.asax.cs b/BuildFeed/Global.asax.cs
deleted file mode 100644
index 8ed7e25..0000000
--- a/BuildFeed/Global.asax.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-using System.Web.Mvc;
-using System.Web.Routing;
-using System.Web.Security;
-using BuildFeed.Code;
-using BuildFeed.Code.Options;
-using BuildFeed.Model;
-
-namespace BuildFeed
-{
- public class MvcApplication : HttpApplication
- {
- protected void Application_Start()
- {
- // Disable ASP.NET MVC version header
- MvcHandler.DisableMvcResponseHeader = true;
-
- // Don't bother looking for the legacy aspx view engine.
- ViewEngines.Engines.Clear();
- ViewEngines.Engines.Add(new RazorViewEngine());
-
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- AreaRegistration.RegisterAllAreas();
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
-
- var db = new DateTimeModelBinder();
-
- ModelBinders.Binders.Add(typeof(DateTime), db);
- ModelBinders.Binders.Add(typeof(DateTime?), db);
-
- ModelMappings.Initialise();
-
- Roles.CreateRole("Administrators");
- Roles.CreateRole("Editors");
- Roles.CreateRole("Users");
-
- MongoConfig.SetupIndexes();
- }
-
- public override string GetVaryByCustomString(HttpContext context, string custom)
- {
- var parts = custom.Split(';');
- var varyParts = new List();
- var contextWrapper = new HttpContextWrapper(context);
-
- foreach (string part in parts)
- {
- switch (part)
- {
- case "userName":
- varyParts.Add($"user:{context.User.Identity.Name}");
- break;
- case "lang":
- varyParts.Add($"lang:{Locale.DetectCulture(contextWrapper).IetfLanguageTag}");
- break;
- case "theme":
- varyParts.Add($"theme:{Theme.DetectTheme(contextWrapper)}");
- break;
- }
- }
-
- return string.Join(";", varyParts.OrderBy(s => s));
- }
- }
-}
\ No newline at end of file
diff --git a/BuildFeed/Models/ErrorViewModel.cs b/BuildFeed/Models/ErrorViewModel.cs
new file mode 100644
index 0000000..1a8863f
--- /dev/null
+++ b/BuildFeed/Models/ErrorViewModel.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace BuildFeed.Models
+{
+ public class ErrorViewModel
+ {
+ public string RequestId { get; set; }
+
+ public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+ }
+}
\ No newline at end of file
diff --git a/BuildFeed/Program.cs b/BuildFeed/Program.cs
new file mode 100644
index 0000000..2d99b14
--- /dev/null
+++ b/BuildFeed/Program.cs
@@ -0,0 +1,17 @@
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Hosting;
+
+namespace BuildFeed
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateWebHostBuilder(args).Build().Run();
+ }
+
+ public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
+ WebHost.CreateDefaultBuilder(args)
+ .UseStartup();
+ }
+}
\ No newline at end of file
diff --git a/BuildFeed/Properties/AssemblyInfo.cs b/BuildFeed/Properties/AssemblyInfo.cs
deleted file mode 100644
index dc0e127..0000000
--- a/BuildFeed/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-
-[assembly: AssemblyTitle("BuildFeed")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("BuildFeed")]
-[assembly: AssemblyCopyright("Copyright © 2013 - 2018, The BuildFeed Team")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-
-[assembly: Guid("6c5846cb-43ac-4818-a9b5-a6cd1d6983a3")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/BuildFeed/Properties/PublishProfiles/Local Folder.pubxml b/BuildFeed/Properties/PublishProfiles/Local Folder.pubxml
deleted file mode 100644
index e1ed985..0000000
--- a/BuildFeed/Properties/PublishProfiles/Local Folder.pubxml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- FileSystem
- Release
- Any CPU
-
- True
- False
- $(HOMEDRIVE)$(HOMEPATH)\Documents\Publish\buildfeed.net
- True
- True
- False
- False
- MergeAllOutputsToASingleAssembly
- True
- BuildFeed.Views
- True
-
-
\ No newline at end of file
diff --git a/BuildFeed/Properties/launchSettings.json b/BuildFeed/Properties/launchSettings.json
new file mode 100644
index 0000000..0081cbd
--- /dev/null
+++ b/BuildFeed/Properties/launchSettings.json
@@ -0,0 +1,27 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:50201",
+ "sslPort": 44395
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "BuildFeed": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BuildFeed/Scripts/_references.js b/BuildFeed/Scripts/_references.js
deleted file mode 100644
index b7dcf6b4f95974cd373c95b2e0df1a136d24cc84..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4664
zcmchb-A;o*5QXR3#CK@CmnOz|rM?PjE7(&0gaxAyuYR+5L2Vln%TCC`0<(M0&K_oW
z`2Jdo9t(Mtm2~2yl2$&Xlnu`kt}9tfPVGgWliqPPV>vBoWs7w&m*lc}=hVPEk{-NVcJNi)geL`eWl)5U{ww@6
zc&7!g4}g3tcZ@>I{Vbyz*cR}vKG%8r(#AfPFjnt45bu7G>8byWeOc8WS-CNcU3%}`#WP{^Oa55uZ
z?^&HJ{8sqgL-^I9G>WFR8IFzK8Y3MvMyrtG#D2f!e)p&0wWoV`i*Kowy%A1tf}?AQ
zh2J`(nA#id6+X%PV)8)EzQU_}Ky&0Wq0ls@c4SAIPils=X1-eXDGy|1n$PO@HO{A^
z1B**?+~dBNWY&jlHblsrqLJk^o3TY`Hu}e4hfg#YFNp`I8U3{i&8o&b`j0}rR4{vv
dLphvgcg{LA%g)bj1;2C5#ujt4Io8@S!VlLt4^#jE
diff --git a/BuildFeed/Scripts/trumbowyg/langs/da.min.js b/BuildFeed/Scripts/trumbowyg/langs/da.min.js
deleted file mode 100644
index 47adf1a..0000000
--- a/BuildFeed/Scripts/trumbowyg/langs/da.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/* ===========================================================
- * da.js
- * Danish translation for Trumbowyg
- * http://alex-d.github.com/Trumbowyg
- * ===========================================================
- * Author : Christian Pedersen
- * Github : https://github.com/chripede
- */
-jQuery.trumbowyg.langs.da={viewHTML:"Vis HTML",formatting:"Formatter",p:"Afsnit",blockquote:"Citat",code:"Kode",header:"Overskrift",bold:"Fed",italic:"Kursiv",strikethrough:"Gennemstreg",underline:"Understreg",strong:"Vigtig",em:"Fremhæv",del:"Slettet",unorderedList:"Uordnet liste",orderedList:"Ordnet liste",insertImage:"Indsæt billede",insertVideo:"Indsæt video",link:"Link",createLink:"Indsæt link",unlink:"Fjern link",justifyLeft:"Venstrestil",justifyCenter:"Centrer",justifyRight:"Højrestil",justifyFull:"Lige margener",horizontalRule:"Horisontal linie",fullscreen:"Fuld skærm",close:"Luk",submit:"Bekræft",reset:"Annuller",required:"Påkrævet",description:"Beskrivelse",title:"Titel",text:"Tekst"};
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/langs/fa.min.js b/BuildFeed/Scripts/trumbowyg/langs/fa.min.js
deleted file mode 100644
index c3f9843..0000000
--- a/BuildFeed/Scripts/trumbowyg/langs/fa.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/* ===========================================================
- * fa.js
- * Persian translation for Trumbowyg
- * http://alex-d.github.com/Trumbowyg
- * ===========================================================
- * Author : Kiarash Soleimanzadeh
- * Github : https://github.com/kiyarash
- * Email : kiarash.s@hotmail.com
- */
-jQuery.trumbowyg.langs.fa={viewHTML:"نمایش کد اچ تی ام ال",formatting:"قالب بندی",p:"پاراگراف",blockquote:"نقل قول",code:"کد",header:"سر تیتر",bold:"ضخیم",italic:"مورب",strikethrough:"میان خط دار",underline:"زیر خط دار",strong:"برجسته",em:"مورب",del:"حذف شده",unorderedList:"لیست نامرتب",orderedList:"لیست مرتب",insertImage:"درج تصویر",insertVideo:"درج ویدئو",link:"لینک",createLink:"درج لینک",unlink:"حذف لینک",justifyLeft:"تراز به چپ",justifyCenter:"تراز به وسط",justifyRight:"تراز به راست",justifyFull:"تراز به چپ و راست",horizontalRule:"درج خط افقی",fullscreen:"تمام صفحه",close:"بستن",submit:"تائید",reset:"انصراف",required:"اجباری",description:"توضیحات",title:"عنوان",text:"متن"};
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/langs/fr.min.js b/BuildFeed/Scripts/trumbowyg/langs/fr.min.js
deleted file mode 100644
index 9a6062e..0000000
--- a/BuildFeed/Scripts/trumbowyg/langs/fr.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/* ===========================================================
- * fr.js
- * French translation for Trumbowyg
- * http://alex-d.github.com/Trumbowyg
- * ===========================================================
- * Author : Alexandre Demode (Alex-D)
- * Twitter : @AlexandreDemode
- * Website : alex-d.fr
- */
-jQuery.trumbowyg.langs.fr={viewHTML:"Voir le HTML",undo:"Annuler",redo:"Refaire",formatting:"Format",p:"Paragraphe",blockquote:"Citation",code:"Code",header:"Titre",bold:"Gras",italic:"Italique",strikethrough:"Rayé",underline:"Souligné",strong:"Fort",em:"Emphase",del:"Supprimé",superscript:"Exposant",subscript:"Indice",unorderedList:"Liste à puces",orderedList:"Liste ordonnée",insertImage:"Insérer une image",insertVideo:"Insérer une video",link:"Lien",createLink:"Insérer un lien",unlink:"Supprimer le lien",justifyLeft:"Aligner à gauche",justifyCenter:"Centrer",justifyRight:"Aligner à droite",justifyFull:"Justifier",horizontalRule:"Insérer un séparateur horizontal",removeformat:"Supprimer formatage",fullscreen:"Plein écran",close:"Fermer",submit:"Valider",reset:"Annuler",required:"Obligatoire",description:"Description",title:"Titre",text:"Texte",target:"Cible"};
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/langs/zh_tw.min.js b/BuildFeed/Scripts/trumbowyg/langs/zh_tw.min.js
deleted file mode 100644
index 0231b50..0000000
--- a/BuildFeed/Scripts/trumbowyg/langs/zh_tw.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/* ===========================================================
- * zh_tw.js
- * Traditional Chinese translation for Trumbowyg
- * http://alex-d.github.com/Trumbowyg
- * ===========================================================
- * Author : Peter Dave Hello (PeterDaveHello)
- * Twitter : @PeterDaveHello
- * Github : https://github.com/PeterDaveHello
- */
-// jshint camelcase:false
-jQuery.trumbowyg.langs.zh_tw={viewHTML:"原始碼",formatting:"格式",p:"段落",blockquote:"引用",code:"代碼",header:"標題",bold:"加粗",italic:"斜體",strikethrough:"刪除線",underline:"底線",strong:"加粗",em:"斜體",del:"刪除線",unorderedList:"無序列表",orderedList:"有序列表",insertImage:"插入圖片",insertVideo:"插入影片",link:"超連結",createLink:"插入連結",unlink:"取消連結",justifyLeft:"靠左對齊",justifyCenter:"置中對齊",justifyRight:"靠右對齊",justifyFull:"左右對齊",horizontalRule:"插入分隔線",fullscreen:"全螢幕",close:"關閉",submit:"確定",reset:"取消",required:"必需的",description:"描述",title:"標題",text:"文字"};
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/base64/trumbowyg.base64.min.js b/BuildFeed/Scripts/trumbowyg/plugins/base64/trumbowyg.base64.min.js
deleted file mode 100644
index 778353a..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/base64/trumbowyg.base64.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"use strict";var a=function(){return"undefined"!=typeof FileReader},r=function(e){return/^data:image\/[a-z]?/i.test(e)};e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser.",errInvalidImage:"Invalid image file."},fr:{base64:"Image en base64",file:"Fichier"},cs:{base64:"Vložit obrázek",file:"Soubor"},zh_cn:{base64:"图片(Base64编码)",file:"文件"},nl:{errFileReaderNotSupported:"Uw browser ondersteunt deze functionaliteit niet.",errInvalidImage:"De gekozen afbeelding is ongeldig."},ru:{base64:"Изображение как код в base64",file:"Файл",errFileReaderNotSupported:"FileReader не поддерживается вашим браузером.",errInvalidImage:"Недопустимый файл изображения."},ja:{base64:"画像 (Base64形式)",file:"ファイル",errFileReaderNotSupported:"あなたのブラウザーはFileReaderをサポートしていません",errInvalidImage:"画像形式が正しくありません"}},plugins:{base64:{shouldInit:a,init:function(i){var t={isSupported:a,fn:function(){i.saveRange();var a,t=i.openModalInsert(i.lang.base64,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:i.getRangeText()}},function(n){var l=new FileReader;l.onloadend=function(a){r(a.target.result)?(i.execCmd("insertImage",l.result),e(['img[src="',l.result,'"]:not([alt])'].join(""),i.$box).attr("alt",n.alt),i.closeModal()):i.addErrorOnModalField(e("input[type=file]",t),i.lang.errInvalidImage)},l.readAsDataURL(a)});e("input[type=file]").on("change",function(e){a=e.target.files[0]})}};i.addBtnDef("base64",t)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js b/BuildFeed/Scripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js
deleted file mode 100644
index 3636e5e..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(r){"use strict";function e(r){for(var e="",t=r.length-1;t>=0;t-=1)e+=r.charAt(t);return e}function t(r){var e=r;return e=e.replace(/<[^> ]*/g,function(r){return r.toLowerCase()}),e=e.replace(/<[^>]*>/g,function(r){return r=r.replace(/ [^=]+=/g,function(r){return r.toLowerCase()})}),e=e.replace(/<[^>]*>/g,function(r){return r=r.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')})}function n(r,n){var a,c,i,l="",s="";for(a=0;n.charAt(a)===r.charAt(a);a+=1)l+=n.charAt(a);for(var u=a;u>=0;u-=1){if("<"===r.charAt(u)){a=u,l=r.substring(0,a);break}if(">"===r.charAt(u))break}for(n=e(n),r=e(r),c=0;n.charAt(c)===r.charAt(c);c+=1)s+=n.charAt(c);for(var g=c;g>=0;g-=1){if(">"===r.charAt(g)){c=g,s=r.substring(0,c);break}if("<"===r.charAt(g))break}if(s=e(s),a===n.length-c)return!1;for(n=e(n),i=n.substring(a,n.length-c),i=t(i),i=i.replace(/)/g,")/g,")/g,")/g,"\s*/g,""),i=i.replace(/ /gi," "),i=i.replace(/ <\//gi,"");-1!==i.indexOf(" ");){var o=i.split(" ");i=o.join(" ")}return i=i.replace(/^\s*|\s*$/g,""),i=i.replace(/<[^>]*>/g,function(r){return r=r.replace(/ ([^=]+)="[^"]*"/g,function(r,e){return-1!==["alt","href","src","title"].indexOf(e)?r:""})}),i=i.replace(/<\?xml[^>]*>/g,""),i=i.replace(/<[^ >]+:[^>]*>/g,""),i=i.replace(/<\/[^ >]+:[^>]*>/g,""),i=i.replace(/<(div|span|style|meta|link){1}.*?>/gi,""),n=l+i+s}r.extend(!0,r.trumbowyg,{plugins:{cleanPaste:{init:function(r){r.pasteHandlers.push(function(){try{var e=r.$ed.html();setTimeout(function(){var t=r.$ed.html();t=n(e,t),r.$ed.html(t)},0)}catch(t){}})}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/colors/trumbowyg.colors.min.js b/BuildFeed/Scripts/trumbowyg/plugins/colors/trumbowyg.colors.min.js
deleted file mode 100644
index 0bffe12..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/colors/trumbowyg.colors.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(o){"use strict";function r(o){return("0"+parseInt(o).toString(16)).slice(-2)}function e(o){return-1===o.search("rgb")?o.replace("#",""):"rgba(0, 0, 0, 0)"===o?"transparent":(o=o.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/),r(o[1])+r(o[2])+r(o[3]))}function f(o,r){var f=[];if(!o.style)return f;if(""!==o.style.backgroundColor){var c=e(o.style.backgroundColor);r.o.plugins.colors.colorList.indexOf(c)>=0?f.push("backColor"+c):f.push("backColorFree")}var a;return""!==o.style.color?a=e(o.style.color):o.hasAttribute("color")&&(a=e(o.getAttribute("color"))),a&&(r.o.plugins.colors.colorList.indexOf(a)>=0?f.push("foreColor"+a):f.push("foreColorFree")),f}function c(r,e){var f=[];o.each(e.o.plugins.colors.colorList,function(o,c){var a=r+c,d={fn:r,forceCss:!0,param:"#"+c,style:"background-color: #"+c+";"};e.addBtnDef(a,d),f.push(a)});var c=r+"Remove",a={fn:"removeFormat",param:r,style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"};e.addBtnDef(c,a),f.push(c);var d=r+"Free",l={fn:function(){e.openModalInsert(e.lang[r],{color:{label:r,value:"#FFFFFF"}},function(o){return e.execCmd(r,o.color),!0})},text:"#",style:"text-indent: 0;line-height: 20px;padding: 0 5px;"};return e.addBtnDef(d,l),f.push(d),f}o.extend(!0,o.trumbowyg,{langs:{cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},en:{foreColor:"Text color",backColor:"Background color"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"},zh_cn:{foreColor:"文字颜色",backColor:"背景颜色"},ru:{foreColor:"Цвет текста",backColor:"Цвет выделения текста"},ja:{foreColor:"文字色",backColor:"背景色"}}});var a={colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"]};o.extend(!0,o.trumbowyg,{plugins:{color:{init:function(o){o.o.plugins.colors=o.o.plugins.colors||a;var r={dropdown:c("foreColor",o)},e={dropdown:c("backColor",o)};o.addBtnDef("foreColor",r),o.addBtnDef("backColor",e)},tagHandler:f}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js b/BuildFeed/Scripts/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js
deleted file mode 100644
index f8adf11..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/emoji/trumbowyg.emoji.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"use strict";function a(a){var o=[];return e.each(a.o.plugins.emoji.emojiList,function(r,i){if(e.isArray(i)){var n=i[0],t=i[1],_='',s="emoji-"+n.replace(/:/g,""),l={hasIcon:!1,text:_,fn:function(){return a.execCmd("insertImage",t,!1,!0),!0}};a.addBtnDef(s,l),o.push(s)}else{var c=i.replace(/:/g,""),u="emoji-"+c,h={text:i,fn:function(){return a.execCmd("insertText",i),!0}};a.addBtnDef(u,h),o.push(u)}}),o}var o={emojiList:[":bowtie:",":smile:",":laughing:",":blush:",":smiley:",":relaxed:",":smirk:",":heart_eyes:",":kissing_heart:",":kissing_closed_eyes:",":flushed:",":relieved:",":satisfied:",":grin:",":wink:",":stuck_out_tongue_winking_eye:",":stuck_out_tongue_closed_eyes:",":grinning:",":kissing:",":kissing_smiling_eyes:",":stuck_out_tongue:",":sleeping:",":worried:",":frowning:",":anguished:",":open_mouth:",":grimacing:",":confused:",":hushed:",":expressionless:",":unamused:",":sweat_smile:",":sweat:",":disappointed_relieved:",":weary:",":pensive:",":disappointed:",":confounded:",":fearful:",":cold_sweat:",":persevere:",":cry:",":sob:",":joy:",":astonished:",":scream:",":neckbeard:",":tired_face:",":angry:",":rage:",":triumph:",":sleepy:",":yum:",":mask:",":sunglasses:",":dizzy_face:",":imp:",":smiling_imp:",":neutral_face:",":no_mouth:",":innocent:",":alien:",":yellow_heart:",":blue_heart:",":purple_heart:",":heart:",":green_heart:",":broken_heart:",":heartbeat:",":heartpulse:",":two_hearts:",":revolving_hearts:",":cupid:",":sparkling_heart:",":sparkles:",":star:",":star2:",":dizzy:",":boom:",":collision:",":anger:",":exclamation:",":question:",":grey_exclamation:",":grey_question:",":zzz:",":dash:",":sweat_drops:",":notes:",":musical_note:",":fire:",":hankey:",":poop:",":shit:",":+1:",":thumbsup:",":-1:",":thumbsdown:",":ok_hand:",":punch:",":facepunch:",":fist:",":v:",":wave:",":hand:",":raised_hand:",":open_hands:",":point_up:",":point_down:",":point_left:",":point_right:",":raised_hands:",":pray:",":point_up_2:",":clap:",":muscle:",":metal:",":fu:",":runner:",":running:",":couple:",":family:",":two_men_holding_hands:",":two_women_holding_hands:",":dancer:",":dancers:",":ok_woman:",":no_good:",":information_desk_person:",":raising_hand:",":bride_with_veil:",":person_with_pouting_face:",":person_frowning:",":bow:",":couplekiss:",":couple_with_heart:",":massage:",":haircut:",":nail_care:",":boy:",":girl:",":woman:",":man:",":baby:",":older_woman:",":older_man:",":person_with_blond_hair:",":man_with_gua_pi_mao:",":man_with_turban:",":construction_worker:",":cop:",":angel:",":princess:",":smiley_cat:",":smile_cat:",":heart_eyes_cat:",":kissing_cat:",":smirk_cat:",":scream_cat:",":crying_cat_face:",":joy_cat:",":pouting_cat:",":japanese_ogre:",":japanese_goblin:",":see_no_evil:",":hear_no_evil:",":speak_no_evil:",":guardsman:",":skull:",":feet:",":lips:",":kiss:",":droplet:",":ear:",":eyes:",":nose:",":tongue:",":love_letter:",":bust_in_silhouette:",":busts_in_silhouette:",":speech_balloon:",":thought_balloon:",":feelsgood:",":finnadie:",":goberserk:",":godmode:",":hurtrealbad:",":rage1:",":rage2:",":rage3:",":rage4:",":suspect:",":trollface:",":sunny:",":umbrella:",":cloud:",":snowflake:",":snowman:",":zap:",":cyclone:",":foggy:",":ocean:",":cat:",":dog:",":mouse:",":hamster:",":rabbit:",":wolf:",":frog:",":tiger:",":koala:",":bear:",":pig:",":pig_nose:",":cow:",":boar:",":monkey_face:",":monkey:",":horse:",":racehorse:",":camel:",":sheep:",":elephant:",":panda_face:",":snake:",":bird:",":baby_chick:",":hatched_chick:",":hatching_chick:",":chicken:",":penguin:",":turtle:",":bug:",":honeybee:",":ant:",":beetle:",":snail:",":octopus:",":tropical_fish:",":fish:",":whale:",":whale2:",":dolphin:",":cow2:",":ram:",":rat:",":water_buffalo:",":tiger2:",":rabbit2:",":dragon:",":goat:",":rooster:",":dog2:",":pig2:",":mouse2:",":ox:",":dragon_face:",":blowfish:",":crocodile:",":dromedary_camel:",":leopard:",":cat2:",":poodle:",":paw_prints:",":bouquet:",":cherry_blossom:",":tulip:",":four_leaf_clover:",":rose:",":sunflower:",":hibiscus:",":maple_leaf:",":leaves:",":fallen_leaf:",":herb:",":mushroom:",":cactus:",":palm_tree:",":evergreen_tree:",":deciduous_tree:",":chestnut:",":seedling:",":blossom:",":ear_of_rice:",":shell:",":globe_with_meridians:",":sun_with_face:",":full_moon_with_face:",":new_moon_with_face:",":new_moon:",":waxing_crescent_moon:",":first_quarter_moon:",":waxing_gibbous_moon:",":full_moon:",":waning_gibbous_moon:",":last_quarter_moon:",":waning_crescent_moon:",":last_quarter_moon_with_face:",":first_quarter_moon_with_face:",":crescent_moon:",":earth_africa:",":earth_americas:",":earth_asia:",":volcano:",":milky_way:",":partly_sunny:",":octocat:",":squirrel:",":bamboo:",":gift_heart:",":dolls:",":school_satchel:",":mortar_board:",":flags:",":fireworks:",":sparkler:",":wind_chime:",":rice_scene:",":jack_o_lantern:",":ghost:",":santa:",":christmas_tree:",":gift:",":bell:",":no_bell:",":tanabata_tree:",":tada:",":confetti_ball:",":balloon:",":crystal_ball:",":cd:",":dvd:",":floppy_disk:",":camera:",":video_camera:",":movie_camera:",":computer:",":tv:",":iphone:",":phone:",":telephone:",":telephone_receiver:",":pager:",":fax:",":minidisc:",":vhs:",":sound:",":speaker:",":mute:",":loudspeaker:",":mega:",":hourglass:",":hourglass_flowing_sand:",":alarm_clock:",":watch:",":radio:",":satellite:",":loop:",":mag:",":mag_right:",":unlock:",":lock:",":lock_with_ink_pen:",":closed_lock_with_key:",":key:",":bulb:",":flashlight:",":high_brightness:",":low_brightness:",":electric_plug:",":battery:",":calling:",":email:",":mailbox:",":postbox:",":bath:",":bathtub:",":shower:",":toilet:",":wrench:",":nut_and_bolt:",":hammer:",":seat:",":moneybag:",":yen:",":dollar:",":pound:",":euro:",":credit_card:",":money_with_wings:",":e-mail:",":inbox_tray:",":outbox_tray:",":envelope:",":incoming_envelope:",":postal_horn:",":mailbox_closed:",":mailbox_with_mail:",":mailbox_with_no_mail:",":package:",":door:",":smoking:",":bomb:",":gun:",":hocho:",":pill:",":syringe:",":page_facing_up:",":page_with_curl:",":bookmark_tabs:",":bar_chart:",":chart_with_upwards_trend:",":chart_with_downwards_trend:",":scroll:",":clipboard:",":calendar:",":date:",":card_index:",":file_folder:",":open_file_folder:",":scissors:",":pushpin:",":paperclip:",":black_nib:",":pencil2:",":straight_ruler:",":triangular_ruler:",":closed_book:",":green_book:",":blue_book:",":orange_book:",":notebook:",":notebook_with_decorative_cover:",":ledger:",":books:",":bookmark:",":name_badge:",":microscope:",":telescope:",":newspaper:",":football:",":basketball:",":soccer:",":baseball:",":tennis:",":8ball:",":rugby_football:",":bowling:",":golf:",":mountain_bicyclist:",":bicyclist:",":horse_racing:",":snowboarder:",":swimmer:",":surfer:",":ski:",":spades:",":hearts:",":clubs:",":diamonds:",":gem:",":ring:",":trophy:",":musical_score:",":musical_keyboard:",":violin:",":space_invader:",":video_game:",":black_joker:",":flower_playing_cards:",":game_die:",":dart:",":mahjong:",":clapper:",":memo:",":pencil:",":book:",":art:",":microphone:",":headphones:",":trumpet:",":saxophone:",":guitar:",":shoe:",":sandal:",":high_heel:",":lipstick:",":boot:",":shirt:",":tshirt:",":necktie:",":womans_clothes:",":dress:",":running_shirt_with_sash:",":jeans:",":kimono:",":bikini:",":ribbon:",":tophat:",":crown:",":womans_hat:",":mans_shoe:",":closed_umbrella:",":briefcase:",":handbag:",":pouch:",":purse:",":eyeglasses:",":fishing_pole_and_fish:",":coffee:",":tea:",":sake:",":baby_bottle:",":beer:",":beers:",":cocktail:",":tropical_drink:",":wine_glass:",":fork_and_knife:",":pizza:",":hamburger:",":fries:",":poultry_leg:",":meat_on_bone:",":spaghetti:",":curry:",":fried_shrimp:",":bento:",":sushi:",":fish_cake:",":rice_ball:",":rice_cracker:",":rice:",":ramen:",":stew:",":oden:",":dango:",":egg:",":bread:",":doughnut:",":custard:",":icecream:",":ice_cream:",":shaved_ice:",":birthday:",":cake:",":cookie:",":chocolate_bar:",":candy:",":lollipop:",":honey_pot:",":apple:",":green_apple:",":tangerine:",":lemon:",":cherries:",":grapes:",":watermelon:",":strawberry:",":peach:",":melon:",":banana:",":pear:",":pineapple:",":sweet_potato:",":eggplant:",":tomato:",":corn:",":house:",":house_with_garden:",":school:",":office:",":post_office:",":hospital:",":bank:",":convenience_store:",":love_hotel:",":hotel:",":wedding:",":church:",":department_store:",":european_post_office:",":city_sunrise:",":city_sunset:",":japanese_castle:",":european_castle:",":tent:",":factory:",":tokyo_tower:",":japan:",":mount_fuji:",":sunrise_over_mountains:",":sunrise:",":stars:",":statue_of_liberty:",":bridge_at_night:",":carousel_horse:",":rainbow:",":ferris_wheel:",":fountain:",":roller_coaster:",":ship:",":speedboat:",":boat:",":sailboat:",":rowboat:",":anchor:",":rocket:",":airplane:",":helicopter:",":steam_locomotive:",":tram:",":mountain_railway:",":bike:",":aerial_tramway:",":suspension_railway:",":mountain_cableway:",":tractor:",":blue_car:",":oncoming_automobile:",":car:",":red_car:",":taxi:",":oncoming_taxi:",":articulated_lorry:",":bus:",":oncoming_bus:",":rotating_light:",":police_car:",":oncoming_police_car:",":fire_engine:",":ambulance:",":minibus:",":truck:",":train:",":station:",":train2:",":bullettrain_front:",":bullettrain_side:",":light_rail:",":monorail:",":railway_car:",":trolleybus:",":ticket:",":fuelpump:",":vertical_traffic_light:",":traffic_light:",":warning:",":construction:",":beginner:",":atm:",":slot_machine:",":busstop:",":barber:",":hotsprings:",":checkered_flag:",":crossed_flags:",":izakaya_lantern:",":moyai:",":circus_tent:",":performing_arts:",":round_pushpin:",":triangular_flag_on_post:",":jp:",":kr:",":cn:",":us:",":fr:",":es:",":it:",":ru:",":gb:",":uk:",":de:",":one:",":two:",":three:",":four:",":five:",":six:",":seven:",":eight:",":nine:",":keycap_ten:",":1234:",":zero:",":hash:",":symbols:",":arrow_backward:",":arrow_down:",":arrow_forward:",":arrow_left:",":capital_abcd:",":abcd:",":abc:",":arrow_lower_left:",":arrow_lower_right:",":arrow_right:",":arrow_up:",":arrow_upper_left:",":arrow_upper_right:",":arrow_double_down:",":arrow_double_up:",":arrow_down_small:",":arrow_heading_down:",":arrow_heading_up:",":leftwards_arrow_with_hook:",":arrow_right_hook:",":left_right_arrow:",":arrow_up_down:",":arrow_up_small:",":arrows_clockwise:",":arrows_counterclockwise:",":rewind:",":fast_forward:",":information_source:",":ok:",":twisted_rightwards_arrows:",":repeat:",":repeat_one:",":new:",":top:",":up:",":cool:",":free:",":ng:",":cinema:",":koko:",":signal_strength:",":u5272:",":u5408:",":u55b6:",":u6307:",":u6708:",":u6709:",":u6e80:",":u7121:",":u7533:",":u7a7a:",":u7981:",":sa:",":restroom:",":mens:",":womens:",":baby_symbol:",":no_smoking:",":parking:",":wheelchair:",":metro:",":baggage_claim:",":accept:",":wc:",":potable_water:",":put_litter_in_its_place:",":secret:",":congratulations:",":m:",":passport_control:",":left_luggage:",":customs:",":ideograph_advantage:",":cl:",":sos:",":id:",":no_entry_sign:",":underage:",":no_mobile_phones:",":do_not_litter:",":non-potable_water:",":no_bicycles:",":no_pedestrians:",":children_crossing:",":no_entry:",":eight_spoked_asterisk:",":sparkle:",":eight_pointed_black_star:",":heart_decoration:",":vs:",":vibration_mode:",":mobile_phone_off:",":chart:",":currency_exchange:",":aries:",":taurus:",":gemini:",":cancer:",":leo:",":virgo:",":libra:",":scorpius:",":sagittarius:",":capricorn:",":aquarius:",":pisces:",":ophiuchus:",":six_pointed_star:",":negative_squared_cross_mark:",":a:",":b:",":ab:",":o2:",":diamond_shape_with_a_dot_inside:",":recycle:",":end:",":back:",":on:",":soon:",":clock1:",":clock130:",":clock10:",":clock1030:",":clock11:",":clock1130:",":clock12:",":clock1230:",":clock2:",":clock230:",":clock3:",":clock330:",":clock4:",":clock430:",":clock5:",":clock530:",":clock6:",":clock630:",":clock7:",":clock730:",":clock8:",":clock830:",":clock9:",":clock930:",":heavy_dollar_sign:",":copyright:",":registered:",":tm:",":x:",":heavy_exclamation_mark:",":bangbang:",":interrobang:",":o:",":heavy_multiplication_x:",":heavy_plus_sign:",":heavy_minus_sign:",":heavy_division_sign:",":white_flower:",":100:",":heavy_check_mark:",":ballot_box_with_check:",":radio_button:",":link:",":curly_loop:",":wavy_dash:",":part_alternation_mark:",":trident:",":black_small_square:",":white_small_square:",":black_medium_small_square:",":white_medium_small_square:",":black_medium_square:",":white_medium_square:",":white_large_square:",":white_check_mark:",":black_square_button:",":white_square_button:",":black_circle:",":white_circle:",":red_circle:",":large_blue_circle:",":large_blue_diamond:",":large_orange_diamond:",":small_blue_diamond:",":small_orange_diamond:",":small_red_triangle:",":small_red_triangle_down:",":shipit:"]};e.extend(!0,e.trumbowyg,{langs:{en:{emoji:"Add an emoji"},fr:{emoji:"Ajouter un emoji"},zh_cn:{emoji:"添加表情"},ru:{emoji:"Вставить emoji"},ja:{emoji:"絵文字の挿入"}},plugins:{emoji:{init:function(e){e.o.plugins.emoji=e.o.plugins.emoji||o;var r={dropdown:a(e)};e.addBtnDef("emoji",r)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js b/BuildFeed/Scripts/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js
deleted file mode 100644
index e2d70ee..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/insertaudio/trumbowyg.insertaudio.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"use strict";var r={src:{label:"URL",required:!0},autoplay:{label:"AutoPlay",required:!1,type:"checkbox"},muted:{label:"Muted",required:!1,type:"checkbox"},preload:{label:"preload options",required:!1}};e.extend(!0,e.trumbowyg,{langs:{en:{insertAudio:"Insert Audio"},ru:{insertAudio:"Вставить аудио"},ja:{insertAudio:"音声の挿入"}},plugins:{insertAudio:{init:function(t){var n={fn:function(){var n=function(r){var n="";var o=e(n)[0];return t.range.deleteContents(),t.range.insertNode(o),!0};t.openModalInsert(t.lang.insertAudio,r,n)}};t.addBtnDef("insertAudio",n)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js b/BuildFeed/Scripts/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js
deleted file mode 100644
index 703a2cb..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/noembed/trumbowyg.noembed.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"use strict";var r={proxy:"https://noembed.com/embed?nowrap=on",urlFiled:"url",data:[],success:void 0,error:void 0};e.extend(!0,e.trumbowyg,{langs:{en:{noembed:"Noembed",noembedError:"Error"},sk:{noembedError:"Chyba"},fr:{noembedError:"Erreur"},cs:{noembedError:"Chyba"},ru:{noembedError:"Ошибка"},ja:{noembedError:"エラー"}},plugins:{noembed:{init:function(o){o.o.plugins.noembed=e.extend(!0,{},r,o.o.plugins.noembed||{});var n={fn:function(){var r=o.openModalInsert(o.lang.noembed,{url:{label:"URL",required:!0}},function(n){e.ajax({url:o.o.plugins.noembed.proxy,type:"GET",data:n,cache:!1,dataType:"json",success:o.o.plugins.noembed.success||function(n){n.html?(o.execCmd("insertHTML",n.html),setTimeout(function(){o.closeModal()},250)):o.addErrorOnModalField(e("input[type=text]",r),n.error)},error:o.o.plugins.noembed.error||function(){o.addErrorOnModalField(e("input[type=text]",r),o.lang.noembedError)}})})}};o.addBtnDef("noembed",n)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/table/trumbowyg.table.min.js b/BuildFeed/Scripts/trumbowyg/plugins/table/trumbowyg.table.min.js
deleted file mode 100644
index 7e04744..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/table/trumbowyg.table.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){"use strict";var t={rows:0,columns:0,styler:""};e.extend(!0,e.trumbowyg,{langs:{en:{table:"Insert table",tableAddRow:"Add rows",tableAddColumn:"Add columns",rows:"Rows",columns:"Columns",styler:"Table class",error:"Error"},sk:{table:"Vytvoriť tabuľky",tableAddRow:"Pridať riadok",tableAddColumn:"Pridať stĺpec",rows:"Riadky",columns:"Stĺpce",styler:"Tabuľku triedy",error:"Chyba"},fr:{table:"Insérer un tableau",tableAddRow:"Ajouter des lignes",tableAddColumn:"Ajouter des colonnes",rows:"Lignes",columns:"Colonnes",styler:"Classes CSS sur la table",error:"Erreur"},cs:{table:"Vytvořit příkaz Table",tableAddRow:"Přidat řádek",tableAddColumn:"Přidat sloupec",rows:"Řádky",columns:"Sloupce",styler:"Tabulku třída",error:"Chyba"},ru:{table:"Вставить таблицу",tableAddRow:"Добавить строки",tableAddColumn:"Добавить столбцы",rows:"Строки",columns:"Столбцы",styler:"Имя CSS класса для таблицы",error:"Ошибка"},ja:{table:"表の挿入",tableAddRow:"行の追加",tableAddColumn:"列の追加",rows:"行",columns:"列",styler:"表のクラス",error:"エラー"}},plugins:{table:{init:function(r){r.o.plugins.table=e.extend(!0,{},t,r.o.plugins.table||{});var l={fn:function(){r.saveRange(),r.openModalInsert(r.lang.table,{rows:{type:"number",required:!0},columns:{type:"number",required:!0},styler:{label:r.lang.styler,type:"text"}},function(t){var l=e("");0!==t.styler.length&&l.addClass(t.styler);for(var n=0;n").appendTo(l),o=0;o").appendTo(a);return r.range.deleteContents(),r.range.insertNode(l[0]),!0})}},n={fn:function(){r.saveRange();var t=e("
");return r.range.deleteContents(),r.range.insertNode(t[0]),!0}},a={fn:function(){r.saveRange();var t=e(" | ");return r.range.deleteContents(),r.range.insertNode(t[0]),!0}};r.addBtnDef("table",l),r.addBtnDef("tableAddRow",n),r.addBtnDef("tableAddColumn",a)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/template/trumbowyg.template.min.js b/BuildFeed/Scripts/trumbowyg/plugins/template/trumbowyg.template.min.js
deleted file mode 100644
index e80f4c9..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/template/trumbowyg.template.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t){"use strict";function e(e){var n=e.o.plugins.templates,a=[];return t.each(n,function(t,n){e.addBtnDef("template_"+t,{fn:function(){e.html(n.html)},hasIcon:!1,title:n.name}),a.push("template_"+t)}),a}t.extend(!0,t.trumbowyg,{langs:{en:{template:"Template"},nl:{template:"Sjabloon"},ru:{template:"Шаблон"},ja:{template:"テンプレート"}}}),t.extend(!0,t.trumbowyg,{plugins:{template:{shouldInit:function(t){return t.o.plugins.hasOwnProperty("templates")},init:function(t){t.addBtnDef("template",{dropdown:e(t),hasIcon:!1,text:t.lang.template})}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/plugins/upload/trumbowyg.upload.min.js b/BuildFeed/Scripts/trumbowyg/plugins/upload/trumbowyg.upload.min.js
deleted file mode 100644
index 142310c..0000000
--- a/BuildFeed/Scripts/trumbowyg/plugins/upload/trumbowyg.upload.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(r){"use strict";function e(r,a){var o=a.shift(),l=a;if(null!==r){if(0===l.length)return r[o];if("object"==typeof r)return e(r[o],l)}return r}function a(){if(!r.trumbowyg.addedXhrProgressEvent){var e=r.ajaxSettings.xhr;r.ajaxSetup({xhr:function(){var r=e(),a=this;return r&&"object"==typeof r.upload&&void 0!==a.progressUpload&&r.upload.addEventListener("progress",function(r){a.progressUpload(r)},!1),r}}),r.trumbowyg.addedXhrProgressEvent=!0}}var o={serverPath:"",fileFieldName:"fileToUpload",data:[],headers:{},xhrFields:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0};a(),r.extend(!0,r.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"},zh_cn:{upload:"上传",file:"文件",uploadError:"错误"},zh_tw:{upload:"上傳",file:"文件",uploadError:"錯誤"},ru:{upload:"Загрузка",file:"Файл",uploadError:"Ошибка"},ja:{upload:"アップロード",file:"ファイル",uploadError:"エラー"},pt_br:{upload:"Enviar do local",file:"Arquivo",uploadError:"Erro"}},plugins:{upload:{init:function(a){a.o.plugins.upload=r.extend(!0,{},o,a.o.plugins.upload||{});var l={fn:function(){a.saveRange();var o,l=a.o.prefix,t=a.openModalInsert(a.lang.upload,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:a.getRangeText()}},function(u){var p=new FormData;p.append(a.o.plugins.upload.fileFieldName,o),a.o.plugins.upload.data.map(function(r){p.append(r.name,r.value)}),r.map(u,function(r,e){"file"!==e&&p.append(e,r)}),0===r("."+l+"progress",t).length&&r("."+l+"modal-title",t).after(r("",{"class":l+"progress"}).append(r("",{"class":l+"progress-bar"}))),r.ajax({url:a.o.plugins.upload.serverPath,headers:a.o.plugins.upload.headers,xhrFields:a.o.plugins.upload.xhrFields,type:"POST",data:p,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(e){r("."+l+"progress-bar").css("width",Math.round(100*e.loaded/e.total)+"%")},success:function(o){if(a.o.plugins.upload.success)a.o.plugins.upload.success(o,a,t,u);else if(e(o,a.o.plugins.upload.statusPropertyName.split("."))){var l=e(o,a.o.plugins.upload.urlPropertyName.split("."));a.execCmd("insertImage",l),r('img[src="'+l+'"]:not([alt])',a.$box).attr("alt",u.alt),setTimeout(function(){a.closeModal()},250),a.$c.trigger("tbwuploadsuccess",[a,o,l])}else a.addErrorOnModalField(r("input[type=file]",t),a.lang[o.message]),a.$c.trigger("tbwuploaderror",[a,o])},error:a.o.plugins.upload.error||function(){a.addErrorOnModalField(r("input[type=file]",t),a.lang.uploadError),a.$c.trigger("tbwuploaderror",[a])}})});r("input[type=file]").on("change",function(r){try{o=r.target.files[0]}catch(e){o=r.target.value}})}};a.addBtnDef("upload",l)}}}})}(jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/trumbowyg.min.js b/BuildFeed/Scripts/trumbowyg/trumbowyg.min.js
deleted file mode 100644
index afc729b..0000000
--- a/BuildFeed/Scripts/trumbowyg/trumbowyg.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Trumbowyg v2.8.1 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
-jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",formatting:"Formatting",p:"Paragraph",blockquote:"Quote",code:"Code",header:"Header",bold:"Bold",italic:"Italic",strikethrough:"Stroke",underline:"Underline",strong:"Strong",em:"Emphasis",del:"Deleted",superscript:"Superscript",subscript:"Subscript",unorderedList:"Unordered list",orderedList:"Ordered list",insertImage:"Insert Image",link:"Link",createLink:"Insert link",unlink:"Remove link",justifyLeft:"Align Left",justifyCenter:"Align Center",justifyRight:"Align Right",justifyFull:"Align Justify",horizontalRule:"Insert horizontal rule",removeformat:"Remove format",fullscreen:"Fullscreen",close:"Close",submit:"Confirm",reset:"Cancel",required:"Required",description:"Description",title:"Title",text:"Text",target:"Target"}},plugins:{},svgPath:null,hideButtonTexts:null},Object.defineProperty(jQuery.trumbowyg,"defaultOptions",{value:{lang:"en",fixedBtnPane:!1,fixedFullWidth:!1,autogrow:!1,autogrowOnEnter:!1,prefix:"trumbowyg-",semantic:!0,resetCss:!1,removeformatPasted:!1,tagsToRemove:[],btns:[["viewHTML"],["undo","redo"],["formatting"],["strong","em","del"],["superscript","subscript"],["link"],["insertImage"],["justifyLeft","justifyCenter","justifyRight","justifyFull"],["unorderedList","orderedList"],["horizontalRule"],["removeformat"],["fullscreen"]],btnsDef:{},inlineElementsSelector:"a,abbr,acronym,b,caption,cite,code,col,dfn,dir,dt,dd,em,font,hr,i,kbd,li,q,span,strikeout,strong,sub,sup,u",pasteHandlers:[],plugins:{}},writable:!1,enumerable:!0,configurable:!1}),function(e,t,n,a){"use strict";var o="tbwconfirm",r="tbwcancel";a.fn.trumbowyg=function(e,t){var n="trumbowyg";if(e===Object(e)||!e)return this.each(function(){a(this).data(n)||a(this).data(n,new i(this,e))});if(1===this.length)try{var o=a(this).data(n);switch(e){case"execCmd":return o.execCmd(t.cmd,t.param,t.forceCss);case"openModal":return o.openModal(t.title,t.content);case"closeModal":return o.closeModal();case"openModalInsert":return o.openModalInsert(t.title,t.fields,t.callback);case"saveRange":return o.saveRange();case"getRange":return o.range;case"getRangeText":return o.getRangeText();case"restoreRange":return o.restoreRange();case"enable":return o.setDisabled(!1);case"disable":return o.setDisabled(!0);case"destroy":return o.destroy();case"empty":return o.empty();case"html":return o.html(t)}}catch(r){}return!1};var i=function(o,r){var i=this,s="trumbowyg-icons",l=a.trumbowyg;i.doc=o.ownerDocument||n,i.$ta=a(o),i.$c=a(o),r=r||{},null!=r.lang||null!=l.langs[r.lang]?i.lang=a.extend(!0,{},l.langs.en,l.langs[r.lang]):i.lang=l.langs.en,i.hideButtonTexts=null!=l.hideButtonTexts?l.hideButtonTexts:r.hideButtonTexts;var d=null!=l.svgPath?l.svgPath:r.svgPath;if(i.hasSvg=d!==!1,i.svgPath=i.doc.querySelector("base")?t.location.href.split("#")[0]:"",0===a("#"+s,i.doc).length&&d!==!1){if(null==d)try{throw new Error}catch(c){if(c.hasOwnProperty("stack")){var u=c.stack.split("\n");for(var g in u)if(u[g].match(/https?:\/\//)){d=u[Number(g)].match(/((https?:\/\/.+\/)([^\/]+\.js))(\?.*)?:/)[1].split("/"),d.pop(),d=d.join("/")+"/ui/icons.svg";break}}else console.warn("You must define svgPath: https://goo.gl/CfTY9U")}var f=i.doc.createElement("div");f.id=s,i.doc.body.insertBefore(f,i.doc.body.childNodes[0]),a.ajax({async:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",dataType:"xml",crossDomain:!0,url:d,data:null,beforeSend:null,complete:null,success:function(e){f.innerHTML=(new XMLSerializer).serializeToString(e.documentElement)}})}var h=i.lang.header,p=function(){return(t.chrome||t.Intl&&Intl.v8BreakIterator)&&"CSS"in t};i.btnsDef={viewHTML:{fn:"toggle"},undo:{isSupported:p,key:"Z"},redo:{isSupported:p,key:"Y"},p:{fn:"formatBlock"},blockquote:{fn:"formatBlock"},h1:{fn:"formatBlock",title:h+" 1"},h2:{fn:"formatBlock",title:h+" 2"},h3:{fn:"formatBlock",title:h+" 3"},h4:{fn:"formatBlock",title:h+" 4"},subscript:{tag:"sub"},superscript:{tag:"sup"},bold:{key:"B",tag:"b"},italic:{key:"I",tag:"i"},underline:{tag:"u"},strikethrough:{tag:"strike"},strong:{fn:"bold",key:"B"},em:{fn:"italic",key:"I"},del:{fn:"strikethrough"},createLink:{key:"K",tag:"a"},unlink:{},insertImage:{},justifyLeft:{tag:"left",forceCss:!0},justifyCenter:{tag:"center",forceCss:!0},justifyRight:{tag:"right",forceCss:!0},justifyFull:{tag:"justify",forceCss:!0},unorderedList:{fn:"insertUnorderedList",tag:"ul"},orderedList:{fn:"insertOrderedList",tag:"ol"},horizontalRule:{fn:"insertHorizontalRule"},removeformat:{},fullscreen:{"class":"trumbowyg-not-disable"},close:{fn:"destroy","class":"trumbowyg-not-disable"},formatting:{dropdown:["p","blockquote","h1","h2","h3","h4"],ico:"p"},link:{dropdown:["createLink","unlink"]}},i.o=a.extend(!0,{},l.defaultOptions,r),i.o.hasOwnProperty("imgDblClickHandler")||(i.o.imgDblClickHandler=i.getDefaultImgDblClickHandler()),i.disabled=i.o.disabled||"TEXTAREA"===o.nodeName&&o.disabled,r.btns?i.o.btns=r.btns:i.o.semantic||(i.o.btns[3]=["bold","italic","underline","strikethrough"]),a.each(i.o.btnsDef,function(e,t){i.addBtnDef(e,t)}),i.eventNamespace="trumbowyg-event",i.keys=[],i.tagToButton={},i.tagHandlers=[],i.pasteHandlers=[].concat(i.o.pasteHandlers),i.isIE=-1!==e.userAgent.indexOf("MSIE")||-1!==e.appVersion.indexOf("Trident/"),i.init()};i.prototype={init:function(){var e=this;e.height=e.$ta.height(),e.initPlugins();try{e.doc.execCommand("enableObjectResizing",!1,!1),e.doc.execCommand("defaultParagraphSeparator",!1,"p")}catch(t){}e.buildEditor(),e.buildBtnPane(),e.fixedBtnPaneEvents(),e.buildOverlay(),setTimeout(function(){e.disabled&&e.setDisabled(!0),e.$c.trigger("tbwinit")})},addBtnDef:function(e,t){this.btnsDef[e]=t},buildEditor:function(){var e=this,n=e.o.prefix,o="";e.$box=a("",{"class":n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=a(""),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=a("",{name:e.$ta.attr("id"),height:e.height}).val(o),e.$box.insertAfter(e.$ed).append(e.$ta,e.$ed),e.syncCode()),e.$ta.addClass(n+"textarea").attr("tabindex",-1),e.$ed.addClass(n+"editor").attr({contenteditable:!0,dir:e.lang._dir||"ltr"}).html(o),e.o.tabindex&&e.$ed.attr("tabindex",e.o.tabindex),e.$c.is("[placeholder]")&&e.$ed.attr("placeholder",e.$c.attr("placeholder")),e.$c.is("[spellcheck]")&&e.$ed.attr("spellcheck",e.$c.attr("spellcheck")),e.o.resetCss&&e.$ed.addClass(n+"reset-css"),e.o.autogrow||e.$ta.add(e.$ed).css({height:e.height}),e.semanticCode(),e.o.autogrowOnEnter&&e.$ed.addClass(n+"autogrow-on-enter");var r,i=!1,s=!1,l=e.isIE?"keyup":"input";e.$ed.on("dblclick","img",e.o.imgDblClickHandler).on("keydown",function(t){if((t.ctrlKey||t.metaKey)&&!t.altKey){i=!0;var n=e.keys[String.fromCharCode(t.which).toUpperCase()];try{return e.execCmd(n.fn,n.param),!1}catch(a){}}}).on("compositionstart compositionupdate",function(){s=!0}).on(l+" compositionend",function(t){if("compositionend"===t.type)s=!1;else if(s)return;var n=t.which;n>=37&&40>=n||(!t.ctrlKey&&!t.metaKey||89!==n&&90!==n?i||17===n?"undefined"==typeof t.which&&e.semanticCode(!1,!1,!0):(e.semanticCode(!1,"compositionend"===t.type&&13===n),e.$c.trigger("tbwchange")):e.$c.trigger("tbwchange"),setTimeout(function(){i=!1},200))}).on("mouseup keydown keyup",function(){clearTimeout(r),r=setTimeout(function(){e.updateButtonPaneStatus()},50)}).on("focus blur",function(t){if(e.$c.trigger("tbw"+t.type),"blur"===t.type&&a("."+n+"active-button",e.$btnPane).removeClass(n+"active-button "+n+"active"),e.o.autogrowOnEnter){if(e.autogrowOnEnterDontClose)return;"focus"===t.type?(e.autogrowOnEnterWasFocused=!0,e.autogrowEditorOnEnter()):e.o.autogrow||(e.$ed.css({height:e.$ed.css("min-height")}),e.$c.trigger("tbwresize"))}}).on("cut",function(){setTimeout(function(){e.semanticCode(!1,!0),e.$c.trigger("tbwchange")},0)}).on("paste",function(n){if(e.o.removeformatPasted){n.preventDefault(),t.getSelection&&t.getSelection().deleteFromDocument&&t.getSelection().deleteFromDocument();try{var o=t.clipboardData.getData("Text");try{e.doc.selection.createRange().pasteHTML(o)}catch(r){e.doc.getSelection().getRangeAt(0).insertNode(e.doc.createTextNode(o))}e.$c.trigger("tbwchange",n)}catch(i){e.execCmd("insertText",(n.originalEvent||n).clipboardData.getData("text/plain"))}}a.each(e.pasteHandlers,function(e,t){t(n)}),setTimeout(function(){e.semanticCode(!1,!0),e.$c.trigger("tbwpaste",n)},0)}),e.$ta.on("keyup",function(){e.$c.trigger("tbwchange")}).on("paste",function(){setTimeout(function(){e.$c.trigger("tbwchange")},0)}),e.$box.on("keydown",function(t){return 27===t.which&&1===a("."+n+"modal-box",e.$box).length?(e.closeModal(),!1):void 0})},autogrowEditorOnEnter:function(){var e=this;e.$ed.removeClass("autogrow-on-enter");var t=e.$ed[0].clientHeight;e.$ed.height("auto");var n=e.$ed[0].scrollHeight;e.$ed.addClass("autogrow-on-enter"),t!==n&&(e.$ed.height(t),setTimeout(function(){e.$ed.css({height:n}),e.$c.trigger("tbwresize")},0))},buildBtnPane:function(){var e=this,t=e.o.prefix,n=e.$btnPane=a("",{"class":t+"button-pane"});a.each(e.o.btns,function(o,r){a.isArray(r)||(r=[r]);var i=a("",{"class":t+"button-group "+(r.indexOf("fullscreen")>=0?t+"right":"")});a.each(r,function(t,n){try{e.isSupportedBtn(n)&&i.append(e.buildBtn(n))}catch(a){}}),n.append(i)}),e.$box.prepend(n)},buildBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=o.dropdown,i=null!=o.hasIcon?o.hasIcon:!0,s=t.lang[e]||e,l=a("",{type:"button","class":n+e+"-button "+(o["class"]||"")+(i?"":" "+n+"textual-button"),html:t.hasSvg&&i?'':t.hideButtonTexts?"":o.text||o.title||t.lang[e]||e,title:(o.title||o.text||s)+(o.key?" (Ctrl + "+o.key+")":""),tabindex:-1,mousedown:function(){return(!r||a("."+e+"-"+n+"dropdown",t.$box).is(":hidden"))&&a("body",t.doc).trigger("mousedown"),!t.$btnPane.hasClass(n+"disable")||a(this).hasClass(n+"active")||a(this).hasClass(n+"not-disable")?(t.execCmd((r?"dropdown":!1)||o.fn||e,o.param||e,o.forceCss),!1):!1}});if(r){l.addClass(n+"open-dropdown");var d=n+"dropdown",c=a("",{"class":d+"-"+e+" "+d+" "+n+"fixed-top","data-dropdown":e});a.each(r,function(e,n){t.btnsDef[n]&&t.isSupportedBtn(n)&&c.append(t.buildSubBtn(n))}),t.$box.append(c.hide())}else o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e});return r||(t.tagToButton[(o.tag||e).toLowerCase()]=e),l},buildSubBtn:function(e){var t=this,n=t.o.prefix,o=t.btnsDef[e],r=null!=o.hasIcon?o.hasIcon:!0;return o.key&&(t.keys[o.key]={fn:o.fn||e,param:o.param||e}),t.tagToButton[(o.tag||e).toLowerCase()]=e,a("",{type:"button","class":n+e+"-dropdown-button"+(o.ico?" "+n+o.ico+"-button":""),html:t.hasSvg&&r?''+(o.text||o.title||t.lang[e]||e):o.text||o.title||t.lang[e]||e,title:o.key?" (Ctrl + "+o.key+")":null,style:o.style||null,mousedown:function(){return a("body",t.doc).trigger("mousedown"),t.execCmd(o.fn||e,o.param||e,o.forceCss),!1}})},isSupportedBtn:function(e){try{return this.btnsDef[e].isSupported()}catch(t){}return!0},buildOverlay:function(){var e=this;return e.$overlay=a("",{"class":e.o.prefix+"overlay"}).appendTo(e.$box),e.$overlay},showOverlay:function(){var e=this;a(t).trigger("scroll"),e.$overlay.fadeIn(200),e.$box.addClass(e.o.prefix+"box-blur")},hideOverlay:function(){var e=this;e.$overlay.fadeOut(50),e.$box.removeClass(e.o.prefix+"box-blur")},fixedBtnPaneEvents:function(){var e=this,n=e.o.fixedFullWidth,o=e.$box;e.o.fixedBtnPane&&(e.isFixed=!1,a(t).on("scroll."+e.eventNamespace+" resize."+e.eventNamespace,function(){if(o){e.syncCode();var r=a(t).scrollTop(),i=o.offset().top+1,s=e.$btnPane,l=s.outerHeight()-2;r-i>0&&r-i-e.height<0?(e.isFixed||(e.isFixed=!0,s.css({position:"fixed",top:0,left:n?"0":"auto",zIndex:7}),a([e.$ta,e.$ed]).css({marginTop:s.height()})),s.css({width:n?"100%":o.width()-1+"px"}),a("."+e.o.prefix+"fixed-top",o).css({position:n?"fixed":"absolute",top:n?l:l+(r-i)+"px",zIndex:15})):e.isFixed&&(e.isFixed=!1,s.removeAttr("style"),a([e.$ta,e.$ed]).css({marginTop:0}),a("."+e.o.prefix+"fixed-top",o).css({position:"absolute",top:l}))}}))},setDisabled:function(e){var t=this,n=t.o.prefix;t.disabled=e,e?t.$ta.attr("disabled",!0):t.$ta.removeAttr("disabled"),t.$box.toggleClass(n+"disabled",e),t.$ed.attr("contenteditable",!e)},destroy:function(){var e=this,n=e.o.prefix;e.isTextarea?e.$box.after(e.$ta.css({height:""}).val(e.html()).removeClass(n+"textarea").show()):e.$box.after(e.$ed.css({height:""}).removeClass(n+"editor").removeAttr("contenteditable").removeAttr("dir").html(e.html()).show()),e.$ed.off("dblclick","img"),e.destroyPlugins(),e.$box.remove(),e.$c.removeData("trumbowyg"),a("body").removeClass(n+"body-fullscreen"),e.$c.trigger("tbwclose"),a(t).off("scroll."+e.eventNamespace+" resize."+e.eventNamespace)},empty:function(){this.$ta.val(""),this.syncCode(!0)},toggle:function(){var e=this,t=e.o.prefix;e.o.autogrowOnEnter&&(e.autogrowOnEnterDontClose=!e.$box.hasClass(t+"editor-hidden")),e.semanticCode(!1,!0),setTimeout(function(){e.doc.activeElement.blur(),e.$box.toggleClass(t+"editor-hidden "+t+"editor-visible"),e.$btnPane.toggleClass(t+"disable"),a("."+t+"viewHTML-button",e.$btnPane).toggleClass(t+"active"),e.$box.hasClass(t+"editor-visible")?e.$ta.attr("tabindex",-1):e.$ta.removeAttr("tabindex"),e.o.autogrowOnEnter&&!e.autogrowOnEnterDontClose&&e.autogrowEditorOnEnter()},0)},dropdown:function(e){var n=this,o=n.doc,r=n.o.prefix,i=a("[data-dropdown="+e+"]",n.$box),s=a("."+r+e+"-button",n.$btnPane),l=i.is(":hidden");if(a("body",o).trigger("mousedown"),l){var d=s.offset().left;s.addClass(r+"active"),i.css({position:"absolute",top:s.offset().top-n.$btnPane.offset().top+s.outerHeight(),left:n.o.fixedFullWidth&&n.isFixed?d+"px":d-n.$btnPane.offset().left+"px"}).show(),a(t).trigger("scroll"),a("body",o).on("mousedown."+n.eventNamespace,function(e){i.is(e.target)||(a("."+r+"dropdown",o).hide(),a("."+r+"active",o).removeClass(r+"active"),a("body",o).off("mousedown."+n.eventNamespace))})}},html:function(e){var t=this;return null!=e?(t.$ta.val(e),t.syncCode(!0),t):t.$ta.val()},syncTextarea:function(){var e=this;e.$ta.val(e.$ed.text().trim().length>0||e.$ed.find("hr,img,embed,iframe,input").length>0?e.$ed.html():"")},syncCode:function(e){var t=this;if(!e&&t.$ed.is(":visible"))t.syncTextarea();else{var n=a("").html(t.$ta.val()),o=a("
").append(n);a(t.o.tagsToRemove.join(","),o).remove(),t.$ed.html(o.contents().html())}if(t.o.autogrow&&(t.height=t.$ed.height(),t.height!==t.$ta.css("height")&&(t.$ta.css({height:t.height}),t.$c.trigger("tbwresize"))),t.o.autogrowOnEnter){t.$ed.height("auto");var r=t.autogrowOnEnterWasFocused?t.$ed[0].scrollHeight:t.$ed.css("min-height");r!==t.$ta.css("height")&&(t.$ed.css({height:r}),t.$c.trigger("tbwresize"))}},semanticCode:function(e,t,n){var o=this;if(o.saveRange(),o.syncCode(e),o.o.semantic){if(o.semanticTag("b","strong"),o.semanticTag("i","em"),o.semanticTag("strike","del"),t){var r=o.o.inlineElementsSelector,i=":not("+r+")";o.$ed.contents().filter(function(){return 3===this.nodeType&&this.nodeValue.trim().length>0}).wrap("
");var s=function(e){if(0!==e.length){var t=e.nextUntil(i).addBack().wrapAll("
").parent(),n=t.nextAll(r).first();t.next("br").remove(),s(n)}};s(o.$ed.children(r).first()),o.semanticTag("div","p",!0),o.$ed.find("p").filter(function(){return o.range&&this===o.range.startContainer?!1:0===a(this).text().trim().length&&0===a(this).children().not("br,span").length}).contents().unwrap(),a("[data-tbw]",o.$ed).contents().unwrap(),o.$ed.find("p:empty").remove()}n||o.restoreRange(),o.syncTextarea()}},semanticTag:function(e,t,n){a(e,this.$ed).each(function(){var e=a(this);e.wrap("<"+t+"/>"),n&&a.each(e.prop("attributes"),function(){e.parent().attr(this.name,this.value)}),e.contents().unwrap()})},createLink:function(){for(var e,t,n,o=this,r=o.doc.getSelection(),i=r.focusNode;["A","DIV"].indexOf(i.nodeName)<0;)i=i.parentNode;if(i&&"A"===i.nodeName){var s=a(i);e=s.attr("href"),t=s.attr("title"),n=s.attr("target");var l=o.doc.createRange();l.selectNode(i),r.removeAllRanges(),r.addRange(l)}o.saveRange(),o.openModalInsert(o.lang.createLink,{url:{label:"URL",required:!0,value:e},title:{label:o.lang.title,value:t},text:{label:o.lang.text,value:o.getRangeText()},target:{label:o.lang.target,value:n}},function(e){var t=a(['
',e.text,""].join(""));return e.title.length>0&&t.attr("title",e.title),e.target.length>0&&t.attr("target",e.target),o.range.deleteContents(),o.range.insertNode(t[0]),!0})},unlink:function(){var e=this,t=e.doc.getSelection(),n=t.focusNode;if(t.isCollapsed){for(;["A","DIV"].indexOf(n.nodeName)<0;)n=n.parentNode;if(n&&"A"===n.nodeName){var a=e.doc.createRange();a.selectNode(n),t.removeAllRanges(),t.addRange(a)}}e.execCmd("unlink",void 0,void 0,!0)},insertImage:function(){var e=this;e.saveRange(),e.openModalInsert(e.lang.insertImage,{url:{label:"URL",required:!0},alt:{label:e.lang.description,value:e.getRangeText()}},function(t){return e.execCmd("insertImage",t.url),a('img[src="'+t.url+'"]:not([alt])',e.$box).attr("alt",t.alt),!0})},fullscreen:function(){var e,n=this,o=n.o.prefix,r=o+"fullscreen";n.$box.toggleClass(r),e=n.$box.hasClass(r),a("body").toggleClass(o+"body-fullscreen",e),a(t).trigger("scroll"),n.$c.trigger("tbw"+(e?"open":"close")+"fullscreen")},execCmd:function(e,t,n,a){var o=this;a=!!a||"","dropdown"!==e&&o.$ed.focus();try{o.doc.execCommand("styleWithCSS",!1,n||!1)}catch(r){}try{o[e+a](t)}catch(r){try{e(t)}catch(i){"insertHorizontalRule"===e?t=void 0:"formatBlock"===e&&o.isIE&&(t="<"+t+">"),o.doc.execCommand(e,!1,t),o.syncCode(),o.semanticCode(!1,!0)}"dropdown"!==e&&(o.updateButtonPaneStatus(),o.$c.trigger("tbwchange"))}},openModal:function(e,n){var i=this,s=i.o.prefix;if(a("."+s+"modal-box",i.$box).length>0)return!1;i.o.autogrowOnEnter&&(i.autogrowOnEnterDontClose=!0),i.saveRange(),i.showOverlay(),i.$btnPane.addClass(s+"disable");var l=a("
",{"class":s+"modal "+s+"fixed-top"}).css({top:i.$btnPane.height()}).appendTo(i.$box);i.$overlay.one("click",function(){return l.trigger(r),!1});var d=a("
",{action:"",html:n}).on("submit",function(){return l.trigger(o),!1}).on("reset",function(){return l.trigger(r),!1}).on("submit reset",function(){i.o.autogrowOnEnter&&(i.autogrowOnEnterDontClose=!1)}),c=a("
",{"class":s+"modal-box",html:d}).css({top:"-"+i.$btnPane.outerHeight()+"px",opacity:0}).appendTo(l).animate({top:0,opacity:1},100);return a("
",{text:e,"class":s+"modal-title"}).prependTo(c),l.height(c.outerHeight()+10),a("input:first",c).focus(),i.buildModalBtn("submit",c),i.buildModalBtn("reset",c),a(t).trigger("scroll"),l},buildModalBtn:function(e,t){var n=this,o=n.o.prefix;return a("
",{"class":o+"modal-button "+o+"modal-"+e,type:e,text:n.lang[e]||e}).appendTo(a("form",t))},closeModal:function(){var e=this,t=e.o.prefix;e.$btnPane.removeClass(t+"disable"),e.$overlay.off();var n=a("."+t+"modal-box",e.$box);n.animate({top:"-"+n.height()},100,function(){n.parent().remove(),e.hideOverlay()}),e.restoreRange()},openModalInsert:function(e,t,n){var i=this,s=i.o.prefix,l=i.lang,d="";return a.each(t,function(e,t){var n=t.label,a=t.name||e,o=t.attributes||{},r=Object.keys(o).map(function(e){return e+'="'+o[e]+'"'}).join(" ");d+='
"}),i.openModal(e,d).on(o,function(){var e=a("form",a(this)),r=!0,s={};a.each(t,function(t,n){var o=a('input[name="'+t+'"]',e),l=o.attr("type");"checkbox"===l.toLowerCase()?s[t]=o.is(":checked"):s[t]=a.trim(o.val()),n.required&&""===s[t]?(r=!1,i.addErrorOnModalField(o,i.lang.required)):n.pattern&&!n.pattern.test(s[t])&&(r=!1,i.addErrorOnModalField(o,n.patternError))}),r&&(i.restoreRange(),n(s,t)&&(i.syncCode(),i.$c.trigger("tbwchange"),i.closeModal(),a(this).off(o)))}).one(r,function(){a(this).off(o),i.closeModal()})},addErrorOnModalField:function(e,t){var n=this.o.prefix,o=e.parent();e.on("change keyup",function(){o.removeClass(n+"input-error")}),o.addClass(n+"input-error").find("input+span").append(a("
",{"class":n+"msg-error",text:t}))},getDefaultImgDblClickHandler:function(){var e=this;return function(){var t=a(this),n=t.attr("src"),o="(Base64)";return 0===n.indexOf("data:image")&&(n=o),e.openModalInsert(e.lang.insertImage,{url:{label:"URL",value:n,required:!0},alt:{label:e.lang.description,value:t.attr("alt")}},function(e){return e.src!==o&&t.attr({src:e.src}),t.attr({alt:e.alt}),!0}),!1}},saveRange:function(){var e=this,t=e.doc.getSelection();if(e.range=null,t.rangeCount){var n,a=e.range=t.getRangeAt(0),o=e.doc.createRange();o.selectNodeContents(e.$ed[0]),o.setEnd(a.startContainer,a.startOffset),n=(o+"").length,e.metaRange={start:n,end:n+(a+"").length}}},restoreRange:function(){var e,t=this,n=t.metaRange,a=t.range,o=t.doc.getSelection();if(a){if(n&&n.start!==n.end){var r,i=0,s=[t.$ed[0]],l=!1,d=!1;for(e=t.doc.createRange();!d&&(r=s.pop());)if(3===r.nodeType){var c=i+r.length;!l&&n.start>=i&&n.start<=c&&(e.setStart(r,n.start-i),l=!0),l&&n.end>=i&&n.end<=c&&(e.setEnd(r,n.end-i),d=!0),i=c}else for(var u=r.childNodes,g=u.length;g>0;)g-=1,s.push(u[g])}o.removeAllRanges(),o.addRange(e||a)}},getRangeText:function(){return this.range+""},updateButtonPaneStatus:function(){var e=this,t=e.o.prefix,n=e.getTagsRecursive(e.doc.getSelection().focusNode),o=t+"active-button "+t+"active";a("."+t+"active-button",e.$btnPane).removeClass(o),a.each(n,function(n,r){var i=e.tagToButton[r.toLowerCase()],s=a("."+t+i+"-button",e.$btnPane);if(s.length>0)s.addClass(o);else try{s=a("."+t+"dropdown ."+t+i+"-dropdown-button",e.$box);var l=s.parent().data("dropdown");a("."+t+l+"-button",e.$box).addClass(o)}catch(d){}})},getTagsRecursive:function(e,t){var n=this;if(t=t||(e&&e.tagName?[e.tagName]:[]),!e||!e.parentNode)return t;e=e.parentNode;var o=e.tagName;return"DIV"===o?t:("P"===o&&""!==e.style.textAlign&&t.push(e.style.textAlign),a.each(n.tagHandlers,function(a,o){t=t.concat(o(e,n))}),t.push(o),n.getTagsRecursive(e,t).filter(function(e){return null!=e}))},initPlugins:function(){var e=this;e.loadedPlugins=[],a.each(a.trumbowyg.plugins,function(t,n){(!n.shouldInit||n.shouldInit(e))&&(n.init(e),n.tagHandler&&e.tagHandlers.push(n.tagHandler),e.loadedPlugins.push(n))})},destroyPlugins:function(){a.each(this.loadedPlugins,function(e,t){t.destroy&&t.destroy()})}}}(navigator,window,document,jQuery);
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/ui/icons.svg b/BuildFeed/Scripts/trumbowyg/ui/icons.svg
deleted file mode 100644
index 5c0f4f6..0000000
--- a/BuildFeed/Scripts/trumbowyg/ui/icons.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/BuildFeed/Scripts/trumbowyg/ui/trumbowyg.min.css b/BuildFeed/Scripts/trumbowyg/ui/trumbowyg.min.css
deleted file mode 100644
index 6b1eeb7..0000000
--- a/BuildFeed/Scripts/trumbowyg/ui/trumbowyg.min.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Trumbowyg v2.8.1 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
-#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}.trumbowyg-button-pane,.trumbowyg-modal{z-index:11;-webkit-backface-visibility:hidden}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before{box-sizing:border-box}.trumbowyg-box svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px;margin:17px auto}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;white-space:normal;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;backface-visibility:hidden}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group:not(:empty)+.trumbowyg-button-group::before{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;vertical-align:middle;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-button-pane .trumbowyg-right::before{display:none!important}.trumbowyg-dropdown{width:200px;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:11}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;overflow:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;transition:width 150ms linear}.trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:29px;line-height:29px;overflow:hidden}.trumbowyg-modal-box label .trumbowyg-input-infos{display:block;text-align:left;height:25px;line-height:25px;transition:all 150ms}.trumbowyg-modal-box label .trumbowyg-input-infos span{display:block;color:#69878f;background-color:#fbfcfc;border:1px solid #DEDEDE;padding:0 7px;width:150px}.trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-modal-box label.trumbowyg-input-error textarea{border:1px solid #e74c3c}.trumbowyg-modal-box label.trumbowyg-input-error .trumbowyg-input-infos{margin-top:-27px}.trumbowyg-modal-box label input{position:absolute;top:0;right:0;height:27px;line-height:27px;border:1px solid #DEDEDE;background:#fff;font-size:14px;max-width:330px;width:70%;padding:0 7px;transition:all 150ms}.trumbowyg-modal-box label input:focus,.trumbowyg-modal-box label input:hover{outline:0;border:1px solid #95a5a6}.trumbowyg-modal-box label input:focus{background:#fbfcfc}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video{max-width:100%}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;white-space:normal!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::before{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}
\ No newline at end of file
diff --git a/BuildFeed/Startup.cs b/BuildFeed/Startup.cs
new file mode 100644
index 0000000..584ed85
--- /dev/null
+++ b/BuildFeed/Startup.cs
@@ -0,0 +1,66 @@
+using BuildFeed.Model;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace BuildFeed
+{
+ public class Startup
+ {
+ public IConfiguration Configuration { get; }
+
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
+
+ services.AddTransient(provider => Configuration);
+
+ var config = new MongoConfig(
+ Configuration.GetValue
("data:MongoHost"),
+ Configuration.GetValue("data:MongoPort"),
+ Configuration.GetValue("data:MongoDB"),
+ Configuration.GetValue("data:MongoUser"),
+ Configuration.GetValue("data:MongoPass")
+ );
+
+ services.AddTransient(provider => new BuildRepository(config));
+ services.AddTransient(provider => new MetaItem(config));
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env)
+ {
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ app.UseDatabaseErrorPage();
+ }
+ else
+ {
+ app.UseExceptionHandler("/Home/Error");
+ app.UseHsts();
+ }
+
+ app.UseHttpsRedirection();
+ app.UseStaticFiles();
+
+ app.UseAuthentication();
+
+ app.UseMvc(routes =>
+ {
+ routes.MapRoute(
+ "default",
+ "{controller=Home}/{action=Index}/{id?}");
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/BuildFeed/Views/Web.config b/BuildFeed/Views/Web.config
deleted file mode 100644
index 03aca21..0000000
--- a/BuildFeed/Views/Web.config
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BuildFeed/Views/_ViewImports.cshtml b/BuildFeed/Views/_ViewImports.cshtml
new file mode 100644
index 0000000..8109a4f
--- /dev/null
+++ b/BuildFeed/Views/_ViewImports.cshtml
@@ -0,0 +1,7 @@
+@using BuildFeed
+@using BuildFeed.Code
+@using BuildFeed.Controllers
+@using BuildFeed.Model
+@using BuildFeed.Model.View
+@using BuildFeed.Local
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/BuildFeed/Views/_ViewStart.cshtml b/BuildFeed/Views/_ViewStart.cshtml
index b43c42a..3ab4462 100644
--- a/BuildFeed/Views/_ViewStart.cshtml
+++ b/BuildFeed/Views/_ViewStart.cshtml
@@ -1,3 +1,3 @@
@{
- Layout = "~/Views/shared/_default.cshtml";
-}
\ No newline at end of file
+ Layout = "_default";
+}
diff --git a/BuildFeed/Views/account/login.cshtml b/BuildFeed/Views/account/login.cshtml
deleted file mode 100644
index 0b914c5..0000000
--- a/BuildFeed/Views/account/login.cshtml
+++ /dev/null
@@ -1,69 +0,0 @@
-@using BuildFeed.Controllers
-@using BuildFeed.Model.View
-@model LoginUser
-
-@{
- ViewBag.Title = $"{VariantTerms.Support_Login} | {InvariantTerms.SiteName}";
- Html.EnableClientValidation();
- Html.EnableUnobtrusiveJavaScript();
-}
-
-@VariantTerms.Support_Login
-
-@using (Html.BeginForm())
-{
- @Html.AntiForgeryToken()
-
- if (ViewData["ErrorMessage"] != null)
- {
-
- @ViewData["ErrorMessage"]
-
- }
-
-
-
-
-
-
-
-
-}
-
-@section Scripts
-{
-
-
-
-}
\ No newline at end of file
diff --git a/BuildFeed/Views/account/password.cshtml b/BuildFeed/Views/account/password.cshtml
deleted file mode 100644
index 38a951e..0000000
--- a/BuildFeed/Views/account/password.cshtml
+++ /dev/null
@@ -1,60 +0,0 @@
-@using BuildFeed.Model.View
-@model ChangePassword
-
-@{
- ViewBag.Title = $"{VariantTerms.Support_ChangePassword} | {InvariantTerms.SiteName}";
- Html.EnableClientValidation();
- Html.EnableUnobtrusiveJavaScript();
-}
-
-@VariantTerms.Support_ChangePassword
-
-@using (Html.BeginForm())
-{
- @Html.AntiForgeryToken()
-
- if (ViewData["ErrorMessage"] != null)
- {
-
- @ViewData["ErrorMessage"]
-
- }
-
-
-
-
-
-
-
-
-}
-
-@section Scripts
-{
-
-
-
-}
\ No newline at end of file
diff --git a/BuildFeed/Views/account/register.cshtml b/BuildFeed/Views/account/register.cshtml
deleted file mode 100644
index 85ba923..0000000
--- a/BuildFeed/Views/account/register.cshtml
+++ /dev/null
@@ -1,68 +0,0 @@
-@using BuildFeed.Model.View
-@model RegistrationUser
-
-@{
- ViewBag.Title = $"{VariantTerms.Support_Register} | {InvariantTerms.SiteName}";
- Html.EnableClientValidation();
- Html.EnableUnobtrusiveJavaScript();
-}
-
-@VariantTerms.Support_Register
-
-@using (Html.BeginForm())
-{
- @Html.AntiForgeryToken()
-
- if (ViewData["ErrorMessage"] != null)
- {
-
- @ViewData["ErrorMessage"]
-
- }
-
-
-
-
-
-
-
-
-
-
-}
-
-@section Scripts
-{
-
-
-
-}
\ No newline at end of file
diff --git a/BuildFeed/Views/account/registerthanks.cshtml b/BuildFeed/Views/account/registerthanks.cshtml
deleted file mode 100644
index 39de3ed..0000000
--- a/BuildFeed/Views/account/registerthanks.cshtml
+++ /dev/null
@@ -1,6 +0,0 @@
-@{
- ViewBag.Title = $"{VariantTerms.Support_EmailValidationTitle} | {InvariantTerms.SiteName}";
-}
-
-@VariantTerms.Support_EmailValidationTitle
-@VariantTerms.Support_EmailValidationContent
\ No newline at end of file
diff --git a/BuildFeed/Views/account/validate-failure.cshtml b/BuildFeed/Views/account/validate-failure.cshtml
deleted file mode 100644
index 54a8c32..0000000
--- a/BuildFeed/Views/account/validate-failure.cshtml
+++ /dev/null
@@ -1,6 +0,0 @@
-@{
- ViewBag.Title = $"{VariantTerms.Support_ValidationFailureTitle} | {InvariantTerms.SiteName}";
-}
-
-@VariantTerms.Support_ValidationFailureTitle
-@VariantTerms.Support_ValidationFailureContent
\ No newline at end of file
diff --git a/BuildFeed/Views/account/validate-success.cshtml b/BuildFeed/Views/account/validate-success.cshtml
deleted file mode 100644
index 10e679e..0000000
--- a/BuildFeed/Views/account/validate-success.cshtml
+++ /dev/null
@@ -1,6 +0,0 @@
-@{
- ViewBag.Title = $"{VariantTerms.Support_ValidationSuccessTitle} | {InvariantTerms.SiteName}";
-}
-
-@VariantTerms.Support_ValidationSuccessTitle
-@VariantTerms.Support_ValidationSuccessContent
\ No newline at end of file
diff --git a/BuildFeed/Views/front/AddBulk.cshtml b/BuildFeed/Views/front/AddBulk.cshtml
index b190434..466d69b 100644
--- a/BuildFeed/Views/front/AddBulk.cshtml
+++ b/BuildFeed/Views/front/AddBulk.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using BuildFeed.Model.View
-@model BulkAddition
+@model BulkAddition
@{
ViewBag.Title = $"{VariantTerms.Common_AddBulk} | {InvariantTerms.SiteName}";
diff --git a/BuildFeed/Views/front/Pages.cshtml b/BuildFeed/Views/front/Pages.cshtml
index 4f6f6a6..48ff8e4 100644
--- a/BuildFeed/Views/front/Pages.cshtml
+++ b/BuildFeed/Views/front/Pages.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model.View
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = $"{string.Format(VariantTerms.Front_HomepageH1, InvariantTerms.ProductName)} {string.Format(VariantTerms.Common_TitlePage, (int)ViewBag.PageNumber)} | {InvariantTerms.SiteName}";
@@ -58,4 +55,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, nameof(FrontController.Index), ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, nameof(FrontController.Index), ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/front/ViewFamily.cshtml b/BuildFeed/Views/front/ViewFamily.cshtml
index bfe5c80..60b2c50 100644
--- a/BuildFeed/Views/front/ViewFamily.cshtml
+++ b/BuildFeed/Views/front/ViewFamily.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = string.Format("{0} {1} | {2}", ViewBag.ItemId, ViewBag.PageNumber == 1
@@ -95,7 +92,7 @@
@VariantTerms.Front_Private
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@@ -124,4 +121,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "ViewFamily", ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "ViewFamily", ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/front/editBuild.cshtml b/BuildFeed/Views/front/editBuild.cshtml
index 9d5014e..8f67130 100644
--- a/BuildFeed/Views/front/editBuild.cshtml
+++ b/BuildFeed/Views/front/editBuild.cshtml
@@ -1,12 +1,8 @@
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@model Build
+@model Build
@{
ViewBag.Title = (string)ViewContext.RouteData.Values["action"] == nameof(FrontController.AddBuild)
? $"{VariantTerms.Common_AddBuild} | {InvariantTerms.SiteName}"
: $"{VariantTerms.Front_EditBuild} {Model.FullBuildString} | {InvariantTerms.SiteName}";
- Html.EnableClientValidation();
- Html.EnableUnobtrusiveJavaScript();
}
@section head
@@ -86,7 +82,7 @@ else
diff --git a/BuildFeed/Views/front/index.cshtml b/BuildFeed/Views/front/index.cshtml
index 6205e8a..dd58c2e 100644
--- a/BuildFeed/Views/front/index.cshtml
+++ b/BuildFeed/Views/front/index.cshtml
@@ -1,25 +1,34 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using BuildFeed.Model.View
+@using Microsoft.AspNetCore.Html
@model Dictionary
@{
ViewBag.Title = string.Format(VariantTerms.Front_HomeH1, InvariantTerms.SiteName);
+
+ HtmlString LatestBuild(string title, FrontPageBuild build)
+ {
+ string buildText = build.Revision.HasValue
+ ? $"{build.Number}.{build.Revision}"
+ : build.Number.ToString();
+ string dateText = build.BuildTime.HasValue
+ ? $@"{build.BuildTime.Value:HH:mm, dddd dd MMMM yyyy}
"
+ : "";
+ return new HtmlString($@"{title}
{buildText}
{build.Lab}
{dateText}
");
+ }
+
}
@section Head
-{
+ {
-
+ @**@
}
@string.Format(VariantTerms.Front_HomeH1, InvariantTerms.SiteName)
@VariantTerms.Front_LatestBuilds
+ {
+ Page = 1
+ })" class="latest-full">
@VariantTerms.Front_FullBuildListing
@@ -34,46 +43,46 @@
@if (family.CurrentCanary != null && family.CurrentCanary.Id != family.CurrentInsider?.Id)
{
- @BuildHelpers.LatestBuild(VariantTerms.Front_CurrentCanary, family.CurrentCanary)
+ {
+ family.CurrentCanary.Id
+ })" class="latest-flex-item latest-flex-red">
+ @LatestBuild(VariantTerms.Front_CurrentCanary, family.CurrentCanary)
}
@if (family.CurrentInsider != null && family.CurrentInsider.Id != family.CurrentRelease?.Id)
{
- @BuildHelpers.LatestBuild(VariantTerms.Front_CurrentInsider, family.CurrentInsider)
+ {
+ family.CurrentInsider.Id
+ })" class="latest-flex-item latest-flex-yellow">
+ @LatestBuild(VariantTerms.Front_CurrentInsider, family.CurrentInsider)
}
@if (family.CurrentRelease != null)
{
- @BuildHelpers.LatestBuild(VariantTerms.Front_CurrentRelease, family.CurrentRelease)
+ {
+ family.CurrentRelease.Id
+ })" class="latest-flex-item latest-flex-blue">
+ @LatestBuild(VariantTerms.Front_CurrentRelease, family.CurrentRelease)
}
@if (family.CurrentAnalog != null)
{
- @BuildHelpers.LatestBuild(VariantTerms.Front_CurrentAnalog, family.CurrentAnalog)
+ {
+ family.CurrentAnalog.Id
+ })" class="latest-flex-item latest-flex-purple">
+ @LatestBuild(VariantTerms.Front_CurrentAnalog, family.CurrentAnalog)
}
@if (family.CurrentXbox != null)
{
- @BuildHelpers.LatestBuild(VariantTerms.Front_CurrentXbox, family.CurrentXbox)
+ {
+ family.CurrentXbox.Id
+ })" class="latest-flex-item latest-flex-green">
+ @LatestBuild(VariantTerms.Front_CurrentXbox, family.CurrentXbox)
}
@@ -95,9 +104,9 @@
foreach (ProjectFamily version in versions)
{
}
@@ -121,9 +130,9 @@
foreach (int year in years)
{
}
@@ -147,9 +156,9 @@
foreach (TypeOfSource source in sources)
{
}
@@ -174,17 +183,17 @@
@VariantTerms.About_A3
@section Scripts
-{
+ {
}
\ No newline at end of file
diff --git a/BuildFeed/Views/front/viewBuild.cshtml b/BuildFeed/Views/front/viewBuild.cshtml
index 5fd2b85..a3e6989 100644
--- a/BuildFeed/Views/front/viewBuild.cshtml
+++ b/BuildFeed/Views/front/viewBuild.cshtml
@@ -1,7 +1,4 @@
@using System.Globalization
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
@model Build
@{
@@ -11,17 +8,17 @@
@section head
{
-
+
-
+
@{
string metaDesc = Model.BuildTime.HasValue
? string.Format(VariantTerms.Meta_BuildDate, Model.Number, Model.Lab, Model.BuildTime.Value.ToLongDateWithoutDay())
@@ -178,7 +175,7 @@
-@if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+@*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@VariantTerms.Front_EditorActions
@@ -201,7 +198,7 @@
})
}
-}
+}*@
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
diff --git a/BuildFeed/Views/front/viewLab.cshtml b/BuildFeed/Views/front/viewLab.cshtml
index 5060a47..f5e2ed0 100644
--- a/BuildFeed/Views/front/viewLab.cshtml
+++ b/BuildFeed/Views/front/viewLab.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = string.Format("{0} {1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1
@@ -100,7 +97,7 @@
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@@ -129,4 +126,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewLab", ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewLab", ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/front/viewSource.cshtml b/BuildFeed/Views/front/viewSource.cshtml
index a1fb257..8ccdca2 100644
--- a/BuildFeed/Views/front/viewSource.cshtml
+++ b/BuildFeed/Views/front/viewSource.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = string.Format("{0} {1} | {2}", ViewBag.ItemId, ViewBag.PageNumber == 1
@@ -100,7 +97,7 @@
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@@ -129,4 +126,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewSource", ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewSource", ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/front/viewVersion.cshtml b/BuildFeed/Views/front/viewVersion.cshtml
index 210271d..679c19d 100644
--- a/BuildFeed/Views/front/viewVersion.cshtml
+++ b/BuildFeed/Views/front/viewVersion.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = $"{InvariantTerms.ProductName} {ViewBag.ItemId} {(ViewBag.PageNumber == 1 ? "" : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber))} | {InvariantTerms.SiteName}";
@@ -99,7 +96,7 @@
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@@ -128,4 +125,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewVersion", ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewVersion", ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/front/viewYear.cshtml b/BuildFeed/Views/front/viewYear.cshtml
index 5c14de6..134515d 100644
--- a/BuildFeed/Views/front/viewYear.cshtml
+++ b/BuildFeed/Views/front/viewYear.cshtml
@@ -1,7 +1,4 @@
-@using BuildFeed.Code
-@using BuildFeed.Controllers
-@using BuildFeed.Model
-@using Humanizer
+@using Humanizer
@model IEnumerable
@{
ViewBag.Title = string.Format("{0} {1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1
@@ -106,7 +103,7 @@
}
- @if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
+ @*if (Roles.IsUserInRole("Editors") || Roles.IsUserInRole("Administrators"))
{
@@ -135,4 +132,4 @@
-@PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewYear", ViewContext.RouteData.Values)
\ No newline at end of file
+@*PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewYear", ViewContext.RouteData.Values)*@
\ No newline at end of file
diff --git a/BuildFeed/Views/shared/DisplayTemplates/Enumeration.cshtml b/BuildFeed/Views/shared/DisplayTemplates/Enumeration.cshtml
deleted file mode 100644
index c82b279..0000000
--- a/BuildFeed/Views/shared/DisplayTemplates/Enumeration.cshtml
+++ /dev/null
@@ -1,4 +0,0 @@
-@using BuildFeed.Code
-@model Enum
-
-@MvcExtensions.GetDisplayTextForEnum(ViewData.Model)
\ No newline at end of file
diff --git a/BuildFeed/Views/shared/_default.cshtml b/BuildFeed/Views/shared/_default.cshtml
index b2ed7ed..d900f60 100644
--- a/BuildFeed/Views/shared/_default.cshtml
+++ b/BuildFeed/Views/shared/_default.cshtml
@@ -1,17 +1,6 @@
@using System.Globalization
-@using BuildFeed.Code.Options
-@using BuildFeed.Controllers
@{
bool isRtl = CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft;
-
- Response.PushPromise("/res/css/default.css?20170517");
- Response.PushPromise(VirtualPathUtility.ToAbsolute(((Theme)ViewBag.Theme).CssPath) + "?20170517");
- if (isRtl)
- {
- Response.PushPromise("/res/css/rtl.css");
- }
-
- Response.PushPromise("/res/ts/bfs.js");
}
@ViewBag.Title
-
-
+
+
@if (isRtl)
{
-
+
}
@switch (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)
{
@@ -75,256 +64,256 @@
-
-
-
-
-
- @RenderBody()
-
-
-
@VariantTerms.Front_Comments
diff --git a/BuildFeed/Views/front/viewGroup.cshtml b/BuildFeed/Views/front/viewGroup.cshtml index 661fd09..730c4ce 100644 --- a/BuildFeed/Views/front/viewGroup.cshtml +++ b/BuildFeed/Views/front/viewGroup.cshtml @@ -1,7 +1,4 @@ -@using BuildFeed.Code -@using BuildFeed.Controllers -@using BuildFeed.Model -@using Humanizer +@using Humanizer @model Tuple