Merge pull request #2313 from sbwalker/dev
support for module translation download/install
This commit is contained in:
		| @ -91,9 +91,9 @@ | ||||
|                     <div class="modal-body"> | ||||
|                         <p style="height: 200px; overflow-y: scroll;"> | ||||
|                             <h3>@_productname</h3> | ||||
|                             @if (!string.IsNullOrEmpty(_license)) | ||||
|                             @if (!string.IsNullOrEmpty(_packagelicense)) | ||||
|                             { | ||||
|                                 @((MarkupString)_license) | ||||
| 								@((MarkupString)_packagelicense) | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
| @ -119,9 +119,9 @@ | ||||
| 	private string _price = "free"; | ||||
| 	private string _search = ""; | ||||
| 	private string _productname = ""; | ||||
| 	private string _license = ""; | ||||
| 	private string _packageid = ""; | ||||
| 	private string _version = ""; | ||||
| 	private string _packagelicense = ""; | ||||
| 	private string _packageversion = ""; | ||||
|  | ||||
| 	public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; | ||||
|  | ||||
| @ -198,7 +198,7 @@ | ||||
| 	private void HideModal() | ||||
| 	{ | ||||
| 		_productname = ""; | ||||
| 		_license = ""; | ||||
| 		_packagelicense = ""; | ||||
| 		StateHasChanged(); | ||||
| 	} | ||||
|  | ||||
| @ -210,12 +210,12 @@ | ||||
| 			if (package != null) | ||||
| 			{ | ||||
| 				_productname = package.Name; | ||||
| 				_packageid = package.PackageId; | ||||
| 				if (!string.IsNullOrEmpty(package.License)) | ||||
| 				{ | ||||
| 					_license = package.License.Replace("\n", "<br />"); | ||||
| 					_packagelicense = package.License.Replace("\n", "<br />"); | ||||
| 				} | ||||
| 				_packageid = package.PackageId; | ||||
| 				_version = package.Version; | ||||
| 				_packageversion = package.Version; | ||||
| 			} | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| @ -230,16 +230,16 @@ | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); | ||||
| 			await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version); | ||||
| 			await PackageService.DownloadPackageAsync(_packageid, _packageversion, Constants.PackagesFolder); | ||||
| 			await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _packageversion); | ||||
| 			AddModuleMessage(Localizer["Success.Module.Download"], MessageType.Success); | ||||
| 			_productname = ""; | ||||
| 			_license = ""; | ||||
| 			_packagelicense = ""; | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _version); | ||||
| 			await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _packageversion); | ||||
| 			AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
| @ -253,7 +253,7 @@ | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Installing Module"); | ||||
| 			await logger.LogError(ex, "Error Installing Modules"); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| @namespace Oqtane.Modules.Admin.ModuleDefinitions | ||||
| @inherits ModuleBase | ||||
| @inject IModuleDefinitionService ModuleDefinitionService | ||||
| @inject IPackageService PackageService | ||||
| @inject NavigationManager NavigationManager | ||||
| @inject IStringLocalizer<Edit> Localizer | ||||
| @inject IStringLocalizer<SharedResources> SharedLocalizer | ||||
| @ -80,7 +81,13 @@ | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </Section> | ||||
| 		</Section> | ||||
| 		<br /> | ||||
| 		<button type="button" class="btn btn-success" @onclick="SaveModuleDefinition">@SharedLocalizer["Save"]</button> | ||||
| 		<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
| 		<br /> | ||||
| 		<br /> | ||||
| 		<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo> | ||||
|     </TabPanel> | ||||
|     <TabPanel Name="Permissions" ResourceKey="Permissions"> | ||||
|         <div class="container"> | ||||
| @ -88,13 +95,88 @@ | ||||
|                 <PermissionGrid EntityName="@EntityNames.ModuleDefinition" PermissionNames="@PermissionNames.Utilize" Permissions="@_permissions" @ref="_permissionGrid" /> | ||||
|             </div> | ||||
|         </div> | ||||
| 		<button type="button" class="btn btn-success" @onclick="SaveModuleDefinition">@SharedLocalizer["Save"]</button> | ||||
| 		<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
|     </TabPanel> | ||||
| 	<TabPanel Name="Translations" ResourceKey="Translations"> | ||||
| 		@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> | ||||
| 				<button type="button" class="btn btn-success" @onclick="InstallTranslations">@SharedLocalizer["Install"]</button> | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				<br /> | ||||
| 				<div class="mx-auto text-center"> | ||||
| 					@Localizer["Search.NoResults"] | ||||
| 				</div> | ||||
| 			} | ||||
| 		} | ||||
| 	</TabPanel> | ||||
| </TabStrip> | ||||
| <button type="button" class="btn btn-success" @onclick="SaveModuleDefinition">@SharedLocalizer["Save"]</button> | ||||
| <NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
| <br /> | ||||
| <br /> | ||||
| <AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo> | ||||
|  | ||||
| @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(_packagelicense)) | ||||
| 							{ | ||||
| 								@((MarkupString)_packagelicense) | ||||
| 							} | ||||
| 							else | ||||
| 							{ | ||||
| 								@SharedLocalizer["License Not Specified"] | ||||
| 							} | ||||
| 						</p> | ||||
| 					</div> | ||||
| 					<div class="modal-footer"> | ||||
| 						<button type="button" class="btn btn-success" @onclick="DownloadTranslation">@SharedLocalizer["Accept"]</button> | ||||
| 						<button type="button" class="btn btn-secondary" @onclick="HideModal">@SharedLocalizer["Cancel"]</button> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| } | ||||
|  | ||||
| @code { | ||||
|     private ElementReference form; | ||||
| @ -121,6 +203,12 @@ | ||||
|     private PermissionGrid _permissionGrid; | ||||
| #pragma warning restore 649 | ||||
|  | ||||
| 	private List<Package> _packages; | ||||
| 	private string _productname = ""; | ||||
| 	private string _packageid = ""; | ||||
| 	private string _packagelicense = ""; | ||||
| 	private string _packageversion = ""; | ||||
|  | ||||
|     public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; | ||||
|  | ||||
|     protected override async Task OnInitializedAsync() | ||||
| @ -147,7 +235,9 @@ | ||||
|                 _createdon = moduleDefinition.CreatedOn; | ||||
|                 _modifiedby = moduleDefinition.ModifiedBy; | ||||
|                 _modifiedon = moduleDefinition.ModifiedOn; | ||||
|             } | ||||
|  | ||||
| 				_packages = await PackageService.GetPackagesAsync("translation", "", "", moduleDefinition.PackageName); | ||||
| 			} | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
| @ -193,4 +283,66 @@ | ||||
|             AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private void HideModal() | ||||
| 	{ | ||||
| 		_productname = ""; | ||||
| 		_packagelicense = ""; | ||||
| 		StateHasChanged(); | ||||
| 	} | ||||
| 	 | ||||
| 	private async Task GetPackage(string packageid, string version) | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			var package = await PackageService.GetPackageAsync(packageid, version); | ||||
| 			if (package != null) | ||||
| 			{ | ||||
| 				_productname = package.Name; | ||||
| 				_packageid = package.PackageId; | ||||
| 				if (!string.IsNullOrEmpty(package.License)) | ||||
| 				{ | ||||
| 					_packagelicense = package.License.Replace("\n", "<br />"); | ||||
| 				} | ||||
| 				_packageversion = package.Version; | ||||
| 			} | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version); | ||||
| 			AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private async Task DownloadTranslation() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); | ||||
| 			await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version); | ||||
| 			AddModuleMessage(Localizer["Success.Translation.Download"], MessageType.Success); | ||||
| 			_productname = ""; | ||||
| 			_packagelicense = ""; | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _version); | ||||
| 			AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private async Task InstallTranslations() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			await PackageService.InstallPackagesAsync(); | ||||
| 			AddModuleMessage(string.Format(Localizer["Success.Translation.Install"], NavigateUrl("admin/system")), MessageType.Success); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Installing Translations"); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -201,4 +201,19 @@ | ||||
|   <data name="PackageName.Text" xml:space="preserve"> | ||||
|     <value>Package Name:</value> | ||||
|   </data> | ||||
|   <data name="Error.Translation.Download" xml:space="preserve"> | ||||
|     <value>Error Downloading Translation</value> | ||||
|   </data> | ||||
|   <data name="Search.NoResults" xml:space="preserve"> | ||||
|     <value>No Translations Exist For This Module Or Package Service Is Disabled</value> | ||||
|   </data> | ||||
|   <data name="Success.Translation.Download" xml:space="preserve"> | ||||
|     <value>Translation Downloaded Successfully. Click Install To Complete Installation.</value> | ||||
|   </data> | ||||
|   <data name="Success.Translation.Install" xml:space="preserve"> | ||||
|     <value>Translation Installed Successfully. You Must <a href={0}>Restart</a> Your Application To Apply These Changes.</value> | ||||
|   </data> | ||||
|   <data name="Translations.Heading" xml:space="preserve"> | ||||
|     <value>Translations</value> | ||||
|   </data> | ||||
| </root> | ||||
		Reference in New Issue
	
	Block a user
	 Shaun Walker
					Shaun Walker