using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using Microsoft.JSInterop; using Seenginx.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Seenginx.Components { public partial class FilesWithEditor : ComponentBase where CFile : ConfigFile { [Inject] public IJSRuntime JsRuntime { get; set; } [Parameter] public List Files { get; set; } = new List(); [Parameter] public List Filters { get; set; } = new List(); [Parameter] public Dictionary FilterFolder { get; set; } = new Dictionary(); [Parameter] public EventCallback AddFile { get; set; } [Parameter] public EventCallback UpdateFile { get; set; } [Parameter] public EventCallback DeleteFile { get; set; } [Parameter] public RenderFragment Editor { get; set; } = null; [Parameter] public RenderFragment CreateDialog { get; set; } [Parameter] public RenderFragment UpdateDialog { get; set; } [Parameter] public RenderFragment DeleteDialog { get; set; } protected string SelectedFilter { get; set; } protected string SearchInput { get; set; } protected bool IsAnyFileSelected => SelectedFile != default; protected string IsSelectedFileDeletable { get { if (SelectedFile != null && SelectedFile.CanBeDeleted) return string.Empty; else return "is-hidden"; } } [Parameter] public EventCallback SelectedFileChanged { get; set; } [Parameter] public CFile SelectedFile { get; set; } = default; protected async override Task OnInitializedAsync() { SelectedFilter = Filters.First(); await base.OnInitializedAsync(); } protected async Task OnDeselectClick() { await JsRuntime.InvokeVoidAsync("DeleteEditor"); SelectedFile = null; await SelectedFileChanged.InvokeAsync(SelectedFile); } protected async Task OnFilterClick(string filter) { SelectedFilter = filter; SearchFile(); } protected async Task SearchInputChanged(string searchInput) { SearchInput = searchInput; SearchFile(); } private void SearchFile() { if (string.IsNullOrEmpty(SearchInput)) { if (SelectedFilter == "All") Files.ForEach(f => f.Unhide()); else if (SelectedFilter == "Root") Files.ForEach(f => { if (f.Folder == FilterFolder[SelectedFilter]) f.Unhide(); else f.Hide(); }); else Files.ForEach(f => { if (f.Folder.Contains(FilterFolder[SelectedFilter])) f.Unhide(); else f.Hide(); }); } else { if (SelectedFilter == "All") Files.ForEach(f => { if (f.Name.ToLower().Contains(SearchInput)) f.Unhide(); else f.Hide(); }); else Files.ForEach(f => { if (SelectedFilter == "Root") { if (f.Folder == FilterFolder[SelectedFilter] && f.Folder.ToLower().Contains(SearchInput.ToLower())) f.Unhide(); else f.Hide(); } else { Files.ForEach(f => { if (f.Folder.Contains(FilterFolder[SelectedFilter]) && f.Folder.ToLower().Contains(SearchInput.ToLower())) f.Unhide(); else f.Hide(); }); } }); } } protected async Task OnFileClick(MouseEventArgs e, CFile file) { Files.ForEach(f => f.Deselect()); file.Select(); await JsRuntime.InvokeVoidAsync("InitEditor", file.OriginalBody); await SelectedFileChanged.InvokeAsync(file); } protected async Task OnFileClick() { Files.ForEach(f => f.Deselect()); SelectedFile = null; } protected async Task OnAddDialog() { await AddFile.InvokeAsync(null); } protected async Task OnDeleteDialog() { await UpdateFile.InvokeAsync(SelectedFile); } } }