Added mass disable / enable

This commit is contained in:
2019-06-04 22:46:26 +02:00
parent f190d3b5af
commit 0b818452b0
4 changed files with 133 additions and 58 deletions

View File

@@ -12,9 +12,9 @@ namespace Tv7Playlist.Controllers
{ {
public class HomeController : Controller public class HomeController : Controller
{ {
private readonly IAppConfig _appConfig;
private readonly PlaylistContext _playlistContext; private readonly PlaylistContext _playlistContext;
private readonly IPlaylistSynchronizer _playlistSynchronizer; private readonly IPlaylistSynchronizer _playlistSynchronizer;
private readonly IAppConfig _appConfig;
public HomeController(PlaylistContext playlistContext, IPlaylistSynchronizer playlistSynchronizer, IAppConfig appConfig) public HomeController(PlaylistContext playlistContext, IPlaylistSynchronizer playlistSynchronizer, IAppConfig appConfig)
{ {
@@ -26,12 +26,29 @@ namespace Tv7Playlist.Controllers
[HttpGet] [HttpGet]
public async Task<IActionResult> Index() public async Task<IActionResult> Index()
{ {
var playlistEntries = await _playlistContext.PlaylistEntries.AsNoTracking().OrderBy(e => e.Position).ToListAsync(); var playlistEntries = await _playlistContext.PlaylistEntries.AsNoTracking().OrderBy(e => e.Position)
.Select(e => new PlaylistEntryModel(e)).ToListAsync();
var model = new HomeModel(playlistEntries); var model = new HomeModel(playlistEntries);
return View(model); return View(model);
} }
[HttpPost]
public async Task<IActionResult> DisableSelectedEntries([FromForm] HomeModel model)
{
if (ModelState.IsValid) await UpdateEnabledForItems(model, false);
return Redirect("/");
}
[HttpPost]
public async Task<IActionResult> EnableSelectedEntries([FromForm] HomeModel model)
{
if (ModelState.IsValid) await UpdateEnabledForItems(model, true);
return Redirect("/");
}
[HttpGet] [HttpGet]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error() public IActionResult Error()
@@ -54,8 +71,23 @@ namespace Tv7Playlist.Controllers
public async Task<IActionResult> Synchronize(bool ok) public async Task<IActionResult> Synchronize(bool ok)
{ {
await _playlistSynchronizer.SynchronizeAsync(); await _playlistSynchronizer.SynchronizeAsync();
return RedirectToAction("Index", "Home"); return RedirectToAction("Index", "Home");
} }
private async Task UpdateEnabledForItems(HomeModel model, bool isEnabled)
{
if (model == null) throw new ArgumentNullException(nameof(model));
var idsToUpdate = model.PlaylistEntries.Where(e => e.Selected).Select(e => e.Id);
foreach (var id in idsToUpdate)
{
var entry = await _playlistContext.PlaylistEntries.FindAsync(id);
if (entry == null) continue;
entry.IsEnabled = isEnabled;
}
await _playlistContext.SaveChangesAsync();
}
} }
} }

View File

@@ -1,16 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Tv7Playlist.Data;
namespace Tv7Playlist.Models namespace Tv7Playlist.Models
{ {
public class HomeModel public class HomeModel
{ {
public HomeModel(List<PlaylistEntry> playlistEntries) public HomeModel()
{
}
public HomeModel(List<PlaylistEntryModel> playlistEntries)
{ {
PlaylistEntries = playlistEntries ?? throw new ArgumentNullException(nameof(playlistEntries)); PlaylistEntries = playlistEntries ?? throw new ArgumentNullException(nameof(playlistEntries));
} }
public List<PlaylistEntry> PlaylistEntries { get; } public List<PlaylistEntryModel> PlaylistEntries { get; set; }
} }
} }

View File

@@ -0,0 +1,24 @@
using System;
using Tv7Playlist.Data;
namespace Tv7Playlist.Models
{
public class PlaylistEntryModel
{
public PlaylistEntryModel()
{
}
public PlaylistEntryModel(PlaylistEntry entry)
{
Entry = entry ?? throw new ArgumentNullException(nameof(entry));
Id = entry.Id;
}
public Guid Id { get; set; }
public PlaylistEntry Entry { get; set; }
public bool Selected { get; set; }
}
}

View File

@@ -3,56 +3,72 @@
ViewData["Title"] = "TV7 Playlist"; ViewData["Title"] = "TV7 Playlist";
} }
<div class="row"> <form method="post">
<div class="col col-12">
<table class="table table-hover table-striped"> <div class="row">
<tr> <div class="col col-4">
<th></th> <button class="btn btn-warning" asp-action="DisableSelectedEntries" asp-controller="Home">Disable selected</button>
<th>Number Import</th> <button class="btn btn-info" asp-action="EnableSelectedEntries" asp-controller="Home">Enable selected</button>
<th>Number Export</th> </div>
<th>Position</th>
<th>Name</th>
<th>EPG Name</th>
<th>Enabled</th>
<th>Available</th>
<th>URL Proxy</th>
<th>URL Original</th>
<th>Created</th>
<th>Modified</th>
</tr>
@{
foreach (var channel in Model.PlaylistEntries)
{
<tr>
<td>
<a class="btn btn-secondary" asp-area="" asp-controller="PlaylistEntry" asp-action="Edit" asp-route-id="@channel.Id">Edit</a>
<a class="btn btn-danger" asp-area="" asp-controller="PlaylistEntry" asp-action="Delete" asp-route-id="@channel.Id">Delete</a>
@{
if (channel.IsEnabled)
{
<a class="btn btn-warning" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@channel.Id">Disable</a>
}
else
{
<a class="btn btn-info" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@channel.Id">Enable</a>
}
}
</td>
<td>@channel.ChannelNumberImport</td>
<td>@channel.ChannelNumberExport</td>
<td>@channel.Position</td>
<td>@channel.Name</td>
<td>@channel.EpgMatchName</td>
<td class="text-center">@Html.Raw(channel.IsEnabled ? "<span class=\"text-primary\">Enabled</span>" : "<span class=\"text-danger\">Disabled</span>")</td>
<td class="text-center">@Html.Raw(channel.IsAvailable ? "<span class=\"text-primary\">yes</span>" : "<span class=\"text-danger\">no</span>")</td>
<td>@channel.UrlProxy</td>
<td>@channel.UrlOriginal</td>
<td>@channel.Created.ToString("g")</td>
<td>@channel.Modified.ToString("g")</td>
</tr>
}
}
</table>
</div> </div>
</div>
<div class="row">
<div class="col col-12">
<table class="table table-hover table-striped">
<tr>
<th>Selected</th>
<th>Single Action</th>
<th>Number Import</th>
<th>Number Export</th>
<th>Position</th>
<th>Name</th>
<th>EPG Name</th>
<th>Enabled</th>
<th>Available</th>
<th>URL Proxy</th>
<th>URL Original</th>
<th>Created</th>
<th>Modified</th>
</tr>
@{
for (var i = 0; i < Model.PlaylistEntries.Count; i++)
{
@Html.HiddenFor(m => m.PlaylistEntries[i].Id)
<tr>
<td>
<input asp-for="PlaylistEntries[i].Selected" type="checkbox" />
</td>
<td>
<a class="btn btn-secondary" asp-area="" asp-controller="PlaylistEntry" asp-action="Edit" asp-route-id="@Model.PlaylistEntries[i].Id">Edit</a>
<a class="btn btn-danger" asp-area="" asp-controller="PlaylistEntry" asp-action="Delete" asp-route-id="@Model.PlaylistEntries[i].Id">Delete</a>
@{
if (Model.PlaylistEntries[i].Entry.IsEnabled)
{
<a class="btn btn-warning" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@Model.PlaylistEntries[i].Id">Disable</a>
}
else
{
<a class="btn btn-info" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@Model.PlaylistEntries[i].Id">Enable</a>
}
}
</td>
<td>@Model.PlaylistEntries[i].Entry.ChannelNumberImport</td>
<td>@Model.PlaylistEntries[i].Entry.ChannelNumberExport</td>
<td>@Model.PlaylistEntries[i].Entry.Position</td>
<td>@Model.PlaylistEntries[i].Entry.Name</td>
<td>@Model.PlaylistEntries[i].Entry.EpgMatchName</td>
<td class="text-center">@Html.Raw(Model.PlaylistEntries[i].Entry.IsEnabled ? "<span class=\"text-primary\">Enabled</span>" : "<span class=\"text-danger\">Disabled</span>")</td>
<td class="text-center">@Html.Raw(Model.PlaylistEntries[i].Entry.IsAvailable ? "<span class=\"text-primary\">yes</span>" : "<span class=\"text-danger\">no</span>")</td>
<td>@Model.PlaylistEntries[i].Entry.UrlProxy</td>
<td>@Model.PlaylistEntries[i].Entry.UrlOriginal</td>
<td>@Model.PlaylistEntries[i].Entry.Created.ToString("g")</td>
<td>@Model.PlaylistEntries[i].Entry.Modified.ToString("g")</td>
</tr>
}
}
</table>
</div>
</div>
</form>