improve module/theme/translation upload user experience to be consistent with download
This commit is contained in:
		| @ -50,11 +50,10 @@ else | ||||
|                 <div class="row mb-1 align-items-center"> | ||||
|                     <Label Class="col-sm-3" HelpText="Upload one or more translations. Once they are uploaded click Install." ResourceKey="LanguageUpload">Translation: </Label> | ||||
|                     <div class="col-sm-9"> | ||||
|                         <FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" /> | ||||
|                         <FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" OnUpload="OnUpload" /> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <button type="button" class="btn btn-success" @onclick="InstallTranslations">@SharedLocalizer["Install"]</button> | ||||
|             <NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
|         </TabPanel> | ||||
|     </TabStrip> | ||||
| @ -125,18 +124,6 @@ else | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private async Task InstallTranslations() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			AddModuleMessage(string.Format(Localizer["Success.Language.Install"], NavigateUrl("admin/system")), MessageType.Success); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Installing Translations"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task SetCultureAsync(string culture) | ||||
|     { | ||||
|         if (culture != CultureInfo.CurrentUICulture.Name) | ||||
| @ -148,4 +135,9 @@ else | ||||
|             NavigationManager.NavigateTo(NavigationManager.Uri, true); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void OnUpload() | ||||
|     { | ||||
|         AddModuleMessage(string.Format(Localizer["Success.Language.Download"], NavigateUrl("admin/system")), MessageType.Success); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -65,13 +65,15 @@ | ||||
|                 </div> | ||||
|             } | ||||
|         } | ||||
|         <br /> | ||||
|         <ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" /> | ||||
|     </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" /> | ||||
|                     <FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" OnUpload="OnUpload" /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
| @ -112,137 +114,139 @@ | ||||
| } | ||||
|  | ||||
| <NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
| <br /> | ||||
| <br /> | ||||
| <ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" /> | ||||
|  | ||||
| @code { | ||||
| 	private List<Package> _packages; | ||||
| 	private string _price = "free"; | ||||
| 	private string _search = ""; | ||||
| 	private string _productname = ""; | ||||
| 	private string _packageid = ""; | ||||
| 	private string _packagelicense = ""; | ||||
| 	private string _packageversion = ""; | ||||
|     private List<Package> _packages; | ||||
|     private string _price = "free"; | ||||
|     private string _search = ""; | ||||
|     private string _productname = ""; | ||||
|     private string _packageid = ""; | ||||
|     private string _packagelicense = ""; | ||||
|     private string _packageversion = ""; | ||||
|  | ||||
| 	public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; | ||||
|     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); | ||||
| 		} | ||||
| 	} | ||||
|     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, ""); | ||||
|     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); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|         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 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 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 async Task Reset() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             _search = ""; | ||||
|             await LoadModuleDefinitions(); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error On Reset"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private void HideModal() | ||||
| 	{ | ||||
| 		_productname = ""; | ||||
| 		_packagelicense = ""; | ||||
| 		StateHasChanged(); | ||||
| 	} | ||||
|     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.Module.Download"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
|     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.Module.Download"], MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private async Task DownloadPackage() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			await PackageService.DownloadPackageAsync(_packageid, _packageversion, Constants.PackagesFolder); | ||||
| 			await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _packageversion); | ||||
| 			AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); | ||||
| 			_productname = ""; | ||||
| 			_packagelicense = ""; | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _packageversion); | ||||
| 			AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
|     private async Task DownloadPackage() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             await PackageService.DownloadPackageAsync(_packageid, _packageversion, Constants.PackagesFolder); | ||||
|             await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _packageversion); | ||||
|             AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); | ||||
|             _productname = ""; | ||||
|             _packagelicense = ""; | ||||
|             StateHasChanged(); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _packageversion); | ||||
|             AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void OnUpload() | ||||
|     { | ||||
|         AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -65,13 +65,15 @@ | ||||
|                 </div> | ||||
|             } | ||||
|         } | ||||
|         <br /> | ||||
|         <ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" /> | ||||
|     </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 theme packages. Once they are uploaded click Install to complete the installation." ResourceKey="Theme">Theme: </Label> | ||||
|                 <div class="col-sm-9"> | ||||
|                     <FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" /> | ||||
|                     <FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" OnUpload="OnUpload" /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
| @ -112,9 +114,6 @@ | ||||
| } | ||||
|  | ||||
| <NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink> | ||||
| <br /> | ||||
| <br /> | ||||
| <ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" /> | ||||
|  | ||||
| @code { | ||||
|     private List<Package> _packages; | ||||
| @ -245,4 +244,9 @@ | ||||
|             AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void OnUpload() | ||||
|     { | ||||
|         AddModuleMessage(string.Format(Localizer["Success.Theme.Download"], NavigateUrl("admin/system")), MessageType.Success); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -87,299 +87,306 @@ | ||||
| } | ||||
|  | ||||
| @code { | ||||
| 	private bool _initialized = false; | ||||
| 	private List<Folder> _folders; | ||||
| 	private List<File> _files = new List<File>(); | ||||
| 	private string _fileinputid = string.Empty; | ||||
| 	private string _progressinfoid = string.Empty; | ||||
| 	private string _progressbarid = string.Empty; | ||||
| 	private string _filter = "*"; | ||||
| 	private bool _haseditpermission = false; | ||||
| 	private string _image = string.Empty; | ||||
| 	private File _file = null; | ||||
| 	private string _guid; | ||||
| 	private string _message = string.Empty; | ||||
| 	private MessageType _messagetype; | ||||
|     private bool _initialized = false; | ||||
|     private List<Folder> _folders; | ||||
|     private List<File> _files = new List<File>(); | ||||
|     private string _fileinputid = string.Empty; | ||||
|     private string _progressinfoid = string.Empty; | ||||
|     private string _progressbarid = string.Empty; | ||||
|     private string _filter = "*"; | ||||
|     private bool _haseditpermission = false; | ||||
|     private string _image = string.Empty; | ||||
|     private File _file = null; | ||||
|     private string _guid; | ||||
|     private string _message = string.Empty; | ||||
|     private MessageType _messagetype; | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility | ||||
|     [Parameter] | ||||
|     public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public int FolderId { get; set; } = -1; // optional - for setting a specific default folder by folderid  | ||||
|     [Parameter] | ||||
|     public int FolderId { get; set; } = -1; // optional - for setting a specific default folder by folderid  | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public string Folder { get; set; } = ""; // optional - for setting a specific default folder by folder path  | ||||
|     [Parameter] | ||||
|     public string Folder { get; set; } = ""; // optional - for setting a specific default folder by folder path  | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public int FileId { get; set; } = -1; // optional - for selecting a specific file by default | ||||
|     [Parameter] | ||||
|     public int FileId { get; set; } = -1; // optional - for selecting a specific file by default | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" | ||||
|     [Parameter] | ||||
|     public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true | ||||
|     [Parameter] | ||||
|     public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true | ||||
|     [Parameter] | ||||
|     public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true | ||||
|     [Parameter] | ||||
|     public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true | ||||
|     [Parameter] | ||||
|     public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool ShowSuccess { get; set; } = false; // optional - for indicating whether a success message should be displayed upon successful upload - default is false | ||||
|     [Parameter] | ||||
|     public bool ShowSuccess { get; set; } = false; // optional - for indicating whether a success message should be displayed upon successful upload - default is false | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false | ||||
|     [Parameter] | ||||
|     public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public EventCallback<int> OnUpload { get; set; } // optional - executes a method in the calling component when a file is uploaded | ||||
|     [Parameter] | ||||
|     public EventCallback<int> OnUpload { get; set; } // optional - executes a method in the calling component when a file is uploaded | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public EventCallback<int> OnSelect { get; set; } // optional - executes a method in the calling component when a file is selected | ||||
|     [Parameter] | ||||
|     public EventCallback<int> OnSelect { get; set; } // optional - executes a method in the calling component when a file is selected | ||||
|  | ||||
| 	[Parameter] | ||||
| 	public EventCallback<int> OnDelete { get; set; } // optional - executes a method in the calling component when a file is deleted | ||||
|     [Parameter] | ||||
|     public EventCallback<int> OnDelete { get; set; } // optional - executes a method in the calling component when a file is deleted | ||||
|  | ||||
| 	protected override async Task OnInitializedAsync() | ||||
| 	{ | ||||
| 		// packages folder is a framework folder for uploading installable nuget packages | ||||
| 		if (Folder == Constants.PackagesFolder) | ||||
| 		{ | ||||
| 			ShowFiles = false; | ||||
| 			ShowFolders = false; | ||||
| 			Filter = "nupkg"; | ||||
| 			ShowSuccess = true; | ||||
| 		} | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         // packages folder is a framework folder for uploading installable nuget packages | ||||
|         if (Folder == Constants.PackagesFolder) | ||||
|         { | ||||
|             ShowFiles = false; | ||||
|             ShowFolders = false; | ||||
|             Filter = "nupkg"; | ||||
|             ShowSuccess = true; | ||||
|         } | ||||
|  | ||||
| 		if (!ShowFiles) | ||||
| 		{ | ||||
| 			ShowImage = false; | ||||
| 		} | ||||
|         if (!ShowFiles) | ||||
|         { | ||||
|             ShowImage = false; | ||||
|         } | ||||
|  | ||||
| 		_folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); | ||||
|         _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); | ||||
|  | ||||
| 		if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder) | ||||
| 		{ | ||||
| 			Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); | ||||
| 			if (folder != null) | ||||
| 			{ | ||||
| 				FolderId = folder.FolderId; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				FolderId = -1; | ||||
| 				_message = "Folder Path " + Folder + "Does Not Exist"; | ||||
| 				_messagetype = MessageType.Error; | ||||
| 			} | ||||
| 		} | ||||
|         if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder) | ||||
|         { | ||||
|             Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); | ||||
|             if (folder != null) | ||||
|             { | ||||
|                 FolderId = folder.FolderId; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 FolderId = -1; | ||||
|                 _message = "Folder Path " + Folder + "Does Not Exist"; | ||||
|                 _messagetype = MessageType.Error; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| 		if (FileId != -1) | ||||
| 		{ | ||||
| 			File file = await FileService.GetFileAsync(FileId); | ||||
| 			if (file != null) | ||||
| 			{ | ||||
| 				FolderId = file.FolderId; | ||||
| 				await OnSelect.InvokeAsync(FileId); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				FileId = -1; // file does not exist | ||||
| 				_message = "FileId " + FileId.ToString() + "Does Not Exist"; | ||||
| 				_messagetype = MessageType.Error; | ||||
| 			} | ||||
| 		} | ||||
|         if (FileId != -1) | ||||
|         { | ||||
|             File file = await FileService.GetFileAsync(FileId); | ||||
|             if (file != null) | ||||
|             { | ||||
|                 FolderId = file.FolderId; | ||||
|                 await OnSelect.InvokeAsync(FileId); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 FileId = -1; // file does not exist | ||||
|                 _message = "FileId " + FileId.ToString() + "Does Not Exist"; | ||||
|                 _messagetype = MessageType.Error; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| 		await SetImage(); | ||||
|         await SetImage(); | ||||
|  | ||||
| 		if (!string.IsNullOrEmpty(Filter)) | ||||
| 		{ | ||||
| 			_filter = "." + Filter.Replace(",", ",."); | ||||
| 		} | ||||
|         if (!string.IsNullOrEmpty(Filter)) | ||||
|         { | ||||
|             _filter = "." + Filter.Replace(",", ",."); | ||||
|         } | ||||
|  | ||||
| 		await GetFiles(); | ||||
|         await GetFiles(); | ||||
|  | ||||
| 		// create unique id for component | ||||
| 		_guid = Guid.NewGuid().ToString("N"); | ||||
| 		_fileinputid = "FileInput_" + _guid; | ||||
| 		_progressinfoid = "ProgressInfo_" + _guid; | ||||
| 		_progressbarid = "ProgressBar_" + _guid; | ||||
|         // create unique id for component | ||||
|         _guid = Guid.NewGuid().ToString("N"); | ||||
|         _fileinputid = "FileInput_" + _guid; | ||||
|         _progressinfoid = "ProgressInfo_" + _guid; | ||||
|         _progressbarid = "ProgressBar_" + _guid; | ||||
|  | ||||
| 		_initialized = true; | ||||
| 	} | ||||
|         _initialized = true; | ||||
|     } | ||||
|  | ||||
| 	private async Task GetFiles() | ||||
| 	{ | ||||
| 		_haseditpermission = false; | ||||
| 		if (Folder == Constants.PackagesFolder) | ||||
| 		{ | ||||
| 			_haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); | ||||
| 			_files = new List<File>(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId); | ||||
| 			if (folder != null) | ||||
| 			{ | ||||
| 				_haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList); | ||||
| 				_files = await FileService.GetFilesAsync(FolderId); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				_haseditpermission = false; | ||||
| 				_files = new List<File>(); | ||||
| 			} | ||||
| 		} | ||||
| 		if (_filter != "*") | ||||
| 		{ | ||||
| 			List<File> filtered = new List<File>(); | ||||
| 			foreach (File file in _files) | ||||
| 			{ | ||||
| 				if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1) | ||||
| 				{ | ||||
| 					filtered.Add(file); | ||||
| 				} | ||||
| 			} | ||||
| 			_files = filtered; | ||||
| 		} | ||||
| 	} | ||||
|     private async Task GetFiles() | ||||
|     { | ||||
|         _haseditpermission = false; | ||||
|         if (Folder == Constants.PackagesFolder) | ||||
|         { | ||||
|             _haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); | ||||
|             _files = new List<File>(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId); | ||||
|             if (folder != null) | ||||
|             { | ||||
|                 _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList); | ||||
|                 _files = await FileService.GetFilesAsync(FolderId); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 _haseditpermission = false; | ||||
|                 _files = new List<File>(); | ||||
|             } | ||||
|             if (_filter != "*") | ||||
|             { | ||||
|                 List<File> filtered = new List<File>(); | ||||
|                 foreach (File file in _files) | ||||
|                 { | ||||
|                     if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1) | ||||
|                     { | ||||
|                         filtered.Add(file); | ||||
|                     } | ||||
|                 } | ||||
|                 _files = filtered; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private async Task FolderChanged(ChangeEventArgs e) | ||||
| 	{ | ||||
| 		_message = string.Empty; | ||||
| 		try | ||||
| 		{ | ||||
| 			FolderId = int.Parse((string)e.Value); | ||||
| 			await GetFiles(); | ||||
| 			FileId = -1; | ||||
| 			_file = null; | ||||
| 			_image = string.Empty; | ||||
| 			StateHasChanged(); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); | ||||
| 			_message = Localizer["Error.File.Load"]; | ||||
| 			_messagetype = MessageType.Error; | ||||
| 		} | ||||
| 	} | ||||
|     private async Task FolderChanged(ChangeEventArgs e) | ||||
|     { | ||||
|         _message = string.Empty; | ||||
|         try | ||||
|         { | ||||
|             FolderId = int.Parse((string)e.Value); | ||||
|             await GetFiles(); | ||||
|             FileId = -1; | ||||
|             _file = null; | ||||
|             _image = string.Empty; | ||||
|             StateHasChanged(); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); | ||||
|             _message = Localizer["Error.File.Load"]; | ||||
|             _messagetype = MessageType.Error; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private async Task FileChanged(ChangeEventArgs e) | ||||
| 	{ | ||||
| 		_message = string.Empty; | ||||
| 		FileId = int.Parse((string)e.Value); | ||||
| 		if (FileId != -1) | ||||
| 		{ | ||||
| 			await OnSelect.InvokeAsync(FileId); | ||||
| 		} | ||||
|     private async Task FileChanged(ChangeEventArgs e) | ||||
|     { | ||||
|         _message = string.Empty; | ||||
|         FileId = int.Parse((string)e.Value); | ||||
|         if (FileId != -1) | ||||
|         { | ||||
|             await OnSelect.InvokeAsync(FileId); | ||||
|         } | ||||
|  | ||||
| 		await SetImage(); | ||||
| 		StateHasChanged(); | ||||
| 	} | ||||
|         await SetImage(); | ||||
|         StateHasChanged(); | ||||
|     } | ||||
|  | ||||
| 	private async Task SetImage() | ||||
| 	{ | ||||
| 		_image = string.Empty; | ||||
| 		_file = null; | ||||
| 		if (FileId != -1) | ||||
| 		{ | ||||
| 			_file = await FileService.GetFileAsync(FileId); | ||||
| 			if (_file != null && ShowImage && _file.ImageHeight != 0 && _file.ImageWidth != 0) | ||||
| 			{ | ||||
| 				var maxwidth = 200; | ||||
| 				var maxheight = 200; | ||||
|     private async Task SetImage() | ||||
|     { | ||||
|         _image = string.Empty; | ||||
|         _file = null; | ||||
|         if (FileId != -1) | ||||
|         { | ||||
|             _file = await FileService.GetFileAsync(FileId); | ||||
|             if (_file != null && ShowImage && _file.ImageHeight != 0 && _file.ImageWidth != 0) | ||||
|             { | ||||
|                 var maxwidth = 200; | ||||
|                 var maxheight = 200; | ||||
|  | ||||
| 				var ratioX = (double)maxwidth / (double)_file.ImageWidth; | ||||
| 				var ratioY = (double)maxheight / (double)_file.ImageHeight; | ||||
| 				var ratio = ratioX < ratioY ? ratioX : ratioY; | ||||
|                 var ratioX = (double)maxwidth / (double)_file.ImageWidth; | ||||
|                 var ratioY = (double)maxheight / (double)_file.ImageHeight; | ||||
|                 var ratio = ratioX < ratioY ? ratioX : ratioY; | ||||
|  | ||||
| 				_image = "<img src=\"" + _file.Url + "\" alt=\"" + _file.Name + | ||||
| 							"\" width=\"" + Convert.ToInt32(_file.ImageWidth * ratio).ToString() + | ||||
| 							"\" height=\"" + Convert.ToInt32(_file.ImageHeight * ratio).ToString() + "\" />"; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|                 _image = "<img src=\"" + _file.Url + "\" alt=\"" + _file.Name + | ||||
|                             "\" width=\"" + Convert.ToInt32(_file.ImageWidth * ratio).ToString() + | ||||
|                             "\" height=\"" + Convert.ToInt32(_file.ImageHeight * ratio).ToString() + "\" />"; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private async Task UploadFiles() | ||||
| 	{ | ||||
| 		_message = string.Empty; | ||||
| 		var interop = new Interop(JSRuntime); | ||||
| 		var uploads = await interop.GetFiles(_fileinputid); | ||||
| 		if (uploads.Length > 0) | ||||
| 		{ | ||||
| 			string restricted = ""; | ||||
| 			foreach (var upload in uploads) | ||||
| 			{ | ||||
| 				var extension = (upload.LastIndexOf(".") != -1) ? upload.Substring(upload.LastIndexOf(".") + 1) : ""; | ||||
| 				if (!Constants.UploadableFiles.Split(',').Contains(extension.ToLower())) | ||||
| 				{ | ||||
| 					restricted += (restricted == "" ? "" : ",") + extension; | ||||
| 				} | ||||
| 			} | ||||
| 			if (restricted == "") | ||||
| 			{ | ||||
| 				try | ||||
| 				{ | ||||
| 					// upload the files | ||||
| 					var posturl = Utilities.TenantUrl(PageState.Alias, "/api/file/upload"); | ||||
| 					var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString(); | ||||
| 					await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken); | ||||
|     private async Task UploadFiles() | ||||
|     { | ||||
|         _message = string.Empty; | ||||
|         var interop = new Interop(JSRuntime); | ||||
|         var uploads = await interop.GetFiles(_fileinputid); | ||||
|         if (uploads.Length > 0) | ||||
|         { | ||||
|             string restricted = ""; | ||||
|             foreach (var upload in uploads) | ||||
|             { | ||||
|                 var extension = (upload.LastIndexOf(".") != -1) ? upload.Substring(upload.LastIndexOf(".") + 1) : ""; | ||||
|                 if (!Constants.UploadableFiles.Split(',').Contains(extension.ToLower())) | ||||
|                 { | ||||
|                     restricted += (restricted == "" ? "" : ",") + extension; | ||||
|                 } | ||||
|             } | ||||
|             if (restricted == "") | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     // upload the files | ||||
|                     var posturl = Utilities.TenantUrl(PageState.Alias, "/api/file/upload"); | ||||
|                     var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString(); | ||||
|                     await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken); | ||||
|  | ||||
| 					// uploading is asynchronous so we need to wait for the uploads to complete | ||||
| 					// note that this will only wait a maximum of 15 seconds which may not be long enough for very large file uploads | ||||
| 					bool success = false; | ||||
| 					int attempts = 0; | ||||
| 					while (attempts < 5 && !success) | ||||
| 					{ | ||||
| 						attempts += 1; | ||||
| 						Thread.Sleep(1000 * attempts); // progressive retry  | ||||
|                     // uploading is asynchronous so we need to wait for the uploads to complete | ||||
|                     // note that this will only wait a maximum of 15 seconds which may not be long enough for very large file uploads | ||||
|                     bool success = false; | ||||
|                     int attempts = 0; | ||||
|                     while (attempts < 5 && !success) | ||||
|                     { | ||||
|                         attempts += 1; | ||||
|                         Thread.Sleep(1000 * attempts); // progressive retry  | ||||
|  | ||||
| 						success = true; | ||||
| 						List<File> files = await FileService.GetFilesAsync(folder); | ||||
| 						if (files.Count > 0) | ||||
| 						{ | ||||
| 							foreach (string upload in uploads) | ||||
| 							{ | ||||
| 								if (!files.Exists(item => item.Name == upload)) | ||||
| 								{ | ||||
| 									success = false; | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
|                         success = true; | ||||
|                         List<File> files = await FileService.GetFilesAsync(folder); | ||||
|                         if (files.Count > 0) | ||||
|                         { | ||||
|                             foreach (string upload in uploads) | ||||
|                             { | ||||
|                                 if (!files.Exists(item => item.Name == upload)) | ||||
|                                 { | ||||
|                                     success = false; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
| 					// reset progress indicators | ||||
| 					await interop.SetElementAttribute(_guid + "ProgressInfo", "style", "display: none;"); | ||||
| 					await interop.SetElementAttribute(_guid + "ProgressBar", "style", "display: none;"); | ||||
|                     // reset progress indicators | ||||
|                     await interop.SetElementAttribute(_guid + "ProgressInfo", "style", "display: none;"); | ||||
|                     await interop.SetElementAttribute(_guid + "ProgressBar", "style", "display: none;"); | ||||
|  | ||||
| 					if (success) | ||||
| 					{ | ||||
| 						await logger.LogInformation("File Upload Succeeded {Files}", uploads); | ||||
| 						if (ShowSuccess) | ||||
| 						{ | ||||
| 							_message = Localizer["Success.File.Upload"]; | ||||
| 							_messagetype = MessageType.Success; | ||||
| 						} | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						await logger.LogInformation("File Upload Failed Or Is Still In Progress {Files}", uploads); | ||||
| 						_message = Localizer["Error.File.Upload"]; | ||||
| 						_messagetype = MessageType.Error; | ||||
| 					} | ||||
|                     if (success) | ||||
|                     { | ||||
|                         await logger.LogInformation("File Upload Succeeded {Files}", uploads); | ||||
|                         if (ShowSuccess) | ||||
|                         { | ||||
|                             _message = Localizer["Success.File.Upload"]; | ||||
|                             _messagetype = MessageType.Success; | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         await logger.LogInformation("File Upload Failed Or Is Still In Progress {Files}", uploads); | ||||
|                         _message = Localizer["Error.File.Upload"]; | ||||
|                         _messagetype = MessageType.Error; | ||||
|                     } | ||||
|  | ||||
| 					// set FileId to first file in upload collection | ||||
| 					await GetFiles(); | ||||
| 					var file = _files.Where(item => item.Name == uploads[0]).FirstOrDefault(); | ||||
| 					if (file != null) | ||||
| 					{ | ||||
| 						FileId = file.FileId; | ||||
| 						await SetImage(); | ||||
| 						await OnUpload.InvokeAsync(FileId); | ||||
| 					} | ||||
| 					StateHasChanged(); | ||||
|                     if (Folder == Constants.PackagesFolder) | ||||
|                     { | ||||
|                         await OnUpload.InvokeAsync(-1); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // set FileId to first file in upload collection | ||||
|                         await GetFiles(); | ||||
|                         var file = _files.Where(item => item.Name == uploads[0]).FirstOrDefault(); | ||||
|                         if (file != null) | ||||
|                         { | ||||
|                             FileId = file.FileId; | ||||
|                             await SetImage(); | ||||
|                             await OnUpload.InvokeAsync(FileId); | ||||
|                         } | ||||
|                         StateHasChanged(); | ||||
|                     } | ||||
| 				} | ||||
| 				catch (Exception ex) | ||||
| 				{ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 sbwalker
					sbwalker