260 lines
9.5 KiB
Plaintext
260 lines
9.5 KiB
Plaintext
@namespace Oqtane.Modules.Admin.ModuleDefinitions
|
|
@inherits ModuleBase
|
|
@inject NavigationManager NavigationManager
|
|
@inject IFileService FileService
|
|
@inject IModuleDefinitionService ModuleDefinitionService
|
|
@inject IPackageService PackageService
|
|
@inject IStringLocalizer<Add> Localizer
|
|
@inject IStringLocalizer<SharedResources> SharedLocalizer
|
|
|
|
<TabStrip>
|
|
<TabPanel Name="Download" ResourceKey="Download">
|
|
<div class="row justify-content-center mb-3">
|
|
<div class="col-sm-6">
|
|
<div class="input-group">
|
|
<select id="price" class="form-select custom-select" @onchange="(e => PriceChanged(e))">
|
|
<option value="free">@SharedLocalizer["Free"]</option>
|
|
<option value="paid">@SharedLocalizer["Paid"]</option>
|
|
</select>
|
|
<input id="search" class="form-control" placeholder="@SharedLocalizer["Search.Hint"]" @bind="@_search" />
|
|
<button type="button" class="btn btn-primary" @onclick="Search">@SharedLocalizer["Search"]</button>
|
|
<button type="button" class="btn btn-secondary" @onclick="Reset">@SharedLocalizer["Reset"]</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@if (_packages != null)
|
|
{
|
|
if (_packages.Count > 0)
|
|
{
|
|
<Pager Items="@_packages">
|
|
<Row>
|
|
<td>
|
|
<h3 style="display: inline;"><a href="@context.ProductUrl" target="_new">@context.Name</a></h3> by: <strong><a href="@context.OwnerUrl" target="new">@context.Owner</a></strong><br />
|
|
@(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)<br />
|
|
<strong>@(String.Format("{0:n0}", context.Downloads))</strong> @SharedLocalizer["Search.Downloads"] |
|
|
@SharedLocalizer["Search.Released"]: <strong>@context.ReleaseDate.ToString("MMM dd, yyyy")</strong> |
|
|
@SharedLocalizer["Search.Version"]: <strong>@context.Version</strong>
|
|
@((MarkupString)(!string.IsNullOrEmpty(context.PackageUrl) ? " | " + SharedLocalizer["Search.Source"] + ": <strong>" + new Uri(context.PackageUrl).Host + "</strong>" : ""))
|
|
@((MarkupString)(context.TrialPeriod > 0 ? " | <strong>" + context.TrialPeriod + " " + @SharedLocalizer["Trial"] + "</strong>" : ""))
|
|
</td>
|
|
<td style="width: 1px; vertical-align: middle;">
|
|
@if (context.Price != null && !string.IsNullOrEmpty(context.PackageUrl))
|
|
{
|
|
<button type="button" class="btn btn-primary" @onclick=@(async () => await GetPackage(context.PackageId, context.Version))>@SharedLocalizer["Download"]</button>
|
|
}
|
|
</td>
|
|
<td style="width: 1px; vertical-align: middle;">
|
|
@if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl))
|
|
{
|
|
<a class="btn btn-primary" style="text-decoration: none !important" href="@context.PaymentUrl" target="_new">@context.Price.Value.ToString("$#,##0.00")</a>
|
|
}
|
|
else
|
|
{
|
|
<button type="button" class="btn btn-primary" @onclick=@(async () => await GetPackage(context.PackageId, context.Version))>@SharedLocalizer["Download"]</button>
|
|
}
|
|
</td>
|
|
</Row>
|
|
</Pager>
|
|
}
|
|
else
|
|
{
|
|
<br />
|
|
<div class="mx-auto text-center">
|
|
@Localizer["Search.NoResults"]
|
|
</div>
|
|
}
|
|
}
|
|
</TabPanel>
|
|
<TabPanel Name="Upload" ResourceKey="Upload">
|
|
<div class="container">
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" HelpText="Upload one or more module packages. Once they are uploaded click Install to complete the installation." ResourceKey="Module">Module: </Label>
|
|
<div class="col-sm-9">
|
|
<FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</TabPanel>
|
|
</TabStrip>
|
|
|
|
@if (_productname != "")
|
|
{
|
|
<div class="app-actiondialog">
|
|
<div class="modal" tabindex="-1" role="dialog">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">@SharedLocalizer["Review License Terms"]</h5>
|
|
<button type="button" class="btn-close" aria-label="Close" @onclick="HideModal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p style="height: 200px; overflow-y: scroll;">
|
|
<h3>@_productname</h3>
|
|
@if (!string.IsNullOrEmpty(_license))
|
|
{
|
|
@((MarkupString)_license)
|
|
}
|
|
else
|
|
{
|
|
@SharedLocalizer["License Not Specified"]
|
|
}
|
|
</p>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-success" @onclick="DownloadPackage">@SharedLocalizer["Accept"]</button>
|
|
<button type="button" class="btn btn-secondary" @onclick="HideModal">@SharedLocalizer["Cancel"]</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
<button type="button" class="btn btn-success" @onclick="InstallModules">@SharedLocalizer["Install"]</button>
|
|
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
|
|
|
|
@code {
|
|
private List<Package> _packages;
|
|
private string _price = "free";
|
|
private string _search = "";
|
|
private string _productname = "";
|
|
private string _license = "";
|
|
private string _packageid = "";
|
|
private string _version = "";
|
|
|
|
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
try
|
|
{
|
|
await LoadModuleDefinitions();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message);
|
|
AddModuleMessage(Localizer["Error.Package.Load"], MessageType.Error);
|
|
}
|
|
}
|
|
|
|
private async Task LoadModuleDefinitions()
|
|
{
|
|
var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
|
|
_packages = await PackageService.GetPackagesAsync("module", _search, _price, "");
|
|
|
|
if (_packages != null)
|
|
{
|
|
foreach (Package package in _packages.ToArray())
|
|
{
|
|
if (moduledefinitions.Exists(item => item.PackageName == package.PackageId))
|
|
{
|
|
_packages.Remove(package);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private async void PriceChanged(ChangeEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
_price = (string)e.Value;
|
|
_search = "";
|
|
await LoadModuleDefinitions();
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error On PriceChanged");
|
|
}
|
|
}
|
|
|
|
private async Task Search()
|
|
{
|
|
try
|
|
{
|
|
await LoadModuleDefinitions();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error On Search");
|
|
}
|
|
}
|
|
|
|
private async Task Reset()
|
|
{
|
|
try
|
|
{
|
|
_search = "";
|
|
await LoadModuleDefinitions();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error On Reset");
|
|
}
|
|
}
|
|
|
|
private void HideModal()
|
|
{
|
|
_productname = "";
|
|
_license = "";
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task GetPackage(string packageid, string version)
|
|
{
|
|
try
|
|
{
|
|
var package = await PackageService.GetPackageAsync(packageid, version);
|
|
if (package != null)
|
|
{
|
|
_productname = package.Name;
|
|
if (!string.IsNullOrEmpty(package.License))
|
|
{
|
|
_license = package.License.Replace("\n", "<br />");
|
|
}
|
|
_packageid = package.PackageId;
|
|
_version = package.Version;
|
|
}
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version);
|
|
AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error);
|
|
}
|
|
}
|
|
|
|
private async Task DownloadPackage()
|
|
{
|
|
try
|
|
{
|
|
await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder);
|
|
await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version);
|
|
AddModuleMessage(Localizer["Success.Module.Download"], MessageType.Success);
|
|
_productname = "";
|
|
_license = "";
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _version);
|
|
AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error);
|
|
}
|
|
}
|
|
|
|
private async Task InstallModules()
|
|
{
|
|
try
|
|
{
|
|
await ModuleDefinitionService.InstallModuleDefinitionsAsync();
|
|
AddModuleMessage(string.Format(Localizer["Success.Module.Install"], NavigateUrl("admin/system")), MessageType.Success);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Installing Module");
|
|
}
|
|
}
|
|
}
|