diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor
index 57380333..ff7a7c0e 100644
--- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor
+++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor
@@ -80,7 +80,7 @@ else
}
- @((MarkupString)SupportLink(context.PackageName))
+ @((MarkupString)SupportLink(context.PackageName, context.Version))
|
@((MarkupString)PurchaseLink(context.PackageName))
@@ -145,7 +145,7 @@ else
return link;
}
- private string SupportLink(string packagename)
+ private string SupportLink(string packagename, string version)
{
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
@@ -153,7 +153,7 @@ else
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && !string.IsNullOrEmpty(package.SupportUrl))
{
- link += "" + SharedLocalizer["Help"] + "";
+ link += "" + SharedLocalizer["Help"] + "";
}
}
return link;
diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor
index 4113ded9..2eea0b5b 100644
--- a/Oqtane.Client/Modules/Admin/Themes/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor
@@ -49,7 +49,7 @@ else
}
|
- @((MarkupString)SupportLink(context.PackageName))
+ @((MarkupString)SupportLink(context.PackageName, context.Version))
|
@((MarkupString)PurchaseLink(context.PackageName))
@@ -112,7 +112,7 @@ else
return link;
}
- private string SupportLink(string packagename)
+ private string SupportLink(string packagename, string version)
{
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
@@ -120,7 +120,7 @@ else
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && !string.IsNullOrEmpty(package.SupportUrl))
{
- link += "" + SharedLocalizer["Help"] + "";
+ link += "" + SharedLocalizer["Help"] + "";
}
}
return link;
diff --git a/Oqtane.Client/Modules/Controls/AutoComplete.razor b/Oqtane.Client/Modules/Controls/AutoComplete.razor
index b464fd20..89e74124 100644
--- a/Oqtane.Client/Modules/Controls/AutoComplete.razor
+++ b/Oqtane.Client/Modules/Controls/AutoComplete.razor
@@ -2,7 +2,7 @@
@inherits LocalizableComponent
-
+
@if (_results != null)
{
@code {
- Dictionary _results;
+ Dictionary _results;
+ Dictionary InputAttributes { get; set; } = new();
- [Parameter]
- public Func>> OnSearch { get; set; } // required - an async delegate method which accepts a filter string parameter and returns a dictionary
+ [Parameter]
+ public Func>> OnSearch { get; set; } // required - an async delegate method which accepts a filter string parameter and returns a dictionary
- [Parameter]
- public int Characters { get; set; } = 3; // optional - number of characters before search is initiated
+ [Parameter]
+ public int Characters { get; set; } = 3; // optional - number of characters before search is initiated
- [Parameter]
- public int Rows { get; set; } = 3; // optional - number of result rows to display
+ [Parameter]
+ public int Rows { get; set; } = 3; // optional - number of result rows to display
- [Parameter]
- public string Placeholder { get; set; } // optional - placeholder input text
+ [Parameter]
+ public string Placeholder { get; set; } // optional - placeholder input text
- [Parameter]
- public string Value { get; set; } // value of item selected
+ [Parameter]
+ public string Value { get; set; } // value of item selected
- [Parameter]
- public string Key { get; set; } // key of item selected
+ [Parameter]
+ public string Key { get; set; } // key of item selected
- private async Task OnInput(ChangeEventArgs e)
+ [Parameter]
+ public bool Required { get; set; } // optional - if the item is required
+
+ protected override void OnParametersSet()
+ {
+ if (Required)
+ {
+ if (!InputAttributes.ContainsKey(nameof(Required)))
+ {
+ InputAttributes.Add(nameof(Required), true);
+ }
+ }
+ else
+ {
+ if (InputAttributes.ContainsKey(nameof(Required)))
+ {
+ InputAttributes.Remove(nameof(Required));
+ }
+ }
+ }
+ private async Task OnInput(ChangeEventArgs e)
{
Value = e.Value?.ToString();
if (Value?.Length >= Characters)
diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor
index a4984a5f..17ed8f81 100644
--- a/Oqtane.Client/Modules/Controls/FileManager.razor
+++ b/Oqtane.Client/Modules/Controls/FileManager.razor
@@ -168,6 +168,21 @@
ShowSuccess = true;
}
+ 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 (ShowFolders)
{
_folders = await FolderService.GetFoldersAsync(ModuleState.SiteId);
@@ -184,21 +199,6 @@
}
}
- 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);
diff --git a/Oqtane.Maui/MauiProgram.cs b/Oqtane.Maui/MauiProgram.cs
index c76cb732..3ff3b5bb 100644
--- a/Oqtane.Maui/MauiProgram.cs
+++ b/Oqtane.Maui/MauiProgram.cs
@@ -7,15 +7,17 @@ using Oqtane.Services;
using System.Globalization;
using System.Text.Json;
using Windows.Storage.Provider;
+using System.Text.Json.Nodes;
namespace Oqtane.Maui;
public static class MauiProgram
{
- // the API service url
- //static string apiurl = "https://www.dnfprojects.com/"; // for testing remote site
+ // the API service url - can be overridden in an appsettings.json in AppDataDirectory
+
static string apiurl = "http://localhost:44357/"; // for local development (Oqtane.Server must be already running for MAUI client to connect)
//static string apiurl = "http://localhost:44357/sitename/"; // local microsite example
+ //static string apiurl = "https://www.dnfprojects.com/"; // for testing remote site
public static MauiApp CreateMauiApp()
{
@@ -29,7 +31,9 @@ public static class MauiProgram
builder.Services.AddMauiBlazorWebView();
#if DEBUG
builder.Services.AddBlazorWebViewDeveloperTools();
- #endif
+#endif
+
+ LoadAppSettings();
var httpClient = new HttpClient { BaseAddress = new Uri(GetBaseUrl(apiurl)) };
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(Shared.Constants.MauiUserAgent);
@@ -62,6 +66,28 @@ public static class MauiProgram
return builder.Build();
}
+
+ private static void LoadAppSettings()
+ {
+ // appsettings.json file format
+ // {
+ // "Url": "http://localhost:44357/"
+ // }
+
+ string file = Path.Combine(FileSystem.Current.AppDataDirectory, "appsettings.json");
+ if (File.Exists(file))
+ {
+ using FileStream stream = File.OpenRead(file);
+ using StreamReader reader = new StreamReader(stream);
+ var content = reader.ReadToEnd();
+ var obj = JsonSerializer.Deserialize(content)!;
+ if (!string.IsNullOrEmpty((string)obj["Url"]))
+ {
+ apiurl = (string)obj["Url"];
+ }
+ }
+ }
+
private static void LoadClientAssemblies(HttpClient http)
{
try
diff --git a/Oqtane.Maui/Oqtane.Maui.csproj b/Oqtane.Maui/Oqtane.Maui.csproj
index 8974e6bb..6f77ed6c 100644
--- a/Oqtane.Maui/Oqtane.Maui.csproj
+++ b/Oqtane.Maui/Oqtane.Maui.csproj
@@ -44,7 +44,7 @@
-
+
diff --git a/Oqtane.Maui/Resources/AppIcon/appicon.svg b/Oqtane.Maui/Resources/AppIcon/appicon.svg
index 9d63b651..5def3c42 100644
--- a/Oqtane.Maui/Resources/AppIcon/appicon.svg
+++ b/Oqtane.Maui/Resources/AppIcon/appicon.svg
@@ -1,4 +1,19 @@
-
-
\ No newline at end of file
+
+
+
diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs
index 3f2c6de5..99c1e6bf 100644
--- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs
+++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs
@@ -214,9 +214,9 @@ namespace Oqtane.Repository
{
foreach (var assembly in moduledefinition.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse())
{
- if (!serverState.Assemblies.Contains(assembly))
+ if (!serverState.Assemblies.Contains(assembly.Trim()))
{
- serverState.Assemblies.Insert(0, assembly);
+ serverState.Assemblies.Insert(0, assembly.Trim());
}
}
}
diff --git a/Oqtane.Server/Repository/ThemeRepository.cs b/Oqtane.Server/Repository/ThemeRepository.cs
index 5a92e413..c555580b 100644
--- a/Oqtane.Server/Repository/ThemeRepository.cs
+++ b/Oqtane.Server/Repository/ThemeRepository.cs
@@ -189,9 +189,9 @@ namespace Oqtane.Repository
{
foreach (var assembly in theme.Dependencies.Replace(".dll", "").Split(',', StringSplitOptions.RemoveEmptyEntries).Reverse())
{
- if (!serverState.Assemblies.Contains(assembly))
+ if (!serverState.Assemblies.Contains(assembly.Trim()))
{
- serverState.Assemblies.Insert(0, assembly);
+ serverState.Assemblies.Insert(0, assembly.Trim());
}
}
}
|