Compare commits

...

5556 Commits

Author SHA1 Message Date
b3b39f583a Merge mirror with local history. 2025-05-30 11:51:43 +02:00
92c554e854 New: Register Component that Renders a Link (secondary) to the register URL including the redirect property. 2025-05-30 11:45:26 +02:00
Shaun Walker
29fe3dfd0b Merge pull request #5344 from sbwalker/dev
update Azure ARM template to 6.1.3
2025-05-29 17:05:04 -04:00
sbwalker
985e50d415 update Azure ARM template to 6.1.3 2025-05-29 17:04:45 -04:00
Shaun Walker
11150b6a10 Update README.md 2025-05-29 17:03:20 -04:00
Shaun Walker
c499acdc4a Merge pull request #5342 from oqtane/master
Merge pull request #5341 from oqtane/dev
2025-05-29 15:59:32 -04:00
Shaun Walker
b24e3252d9 Merge pull request #5341 from oqtane/dev
6.1.3 Release
2025-05-29 15:58:55 -04:00
Shaun Walker
e15787b1e4 Merge pull request #5340 from sbwalker/dev
change id for header/footer
2025-05-29 15:04:28 -04:00
sbwalker
d5f19d97e2 change id for header/footer 2025-05-29 15:04:12 -04:00
Shaun Walker
5543a4aeed Merge pull request #5339 from sbwalker/dev
fix #5329 - clear Options after updating User Settings
2025-05-29 11:53:29 -04:00
sbwalker
9c333232e2 fix #5329 - clear Options after updating User Settings 2025-05-29 11:53:14 -04:00
Shaun Walker
d52b95ea23 Merge pull request #5333 from leigh-pointer/TokenReplace
Fix for ModuleBase ReplaceTokens #5332
2025-05-28 13:11:28 -04:00
Leigh Pointer
ef4fbcbb8a Update ModuleBase.cs
This method replaces all tokens in the format [Object:Property] or [Object:SubObject:Property] within a string.
Efficient string parsing and reflection ensure flexibility with performance.
It supports deeply nested properties, optional default fallback values (e.g. [PageState:User:Email|default@email.com]), and uses caching to optimize repeated token resolution without regex.
2025-05-28 17:30:19 +02:00
Shaun Walker
aa454b411f Merge pull request #5335 from thabaum/Update-Swashbuckle.AspNetCore-Package-Dependency-to-8.1.2
Fixes #5331: Updates Swashbuckle.AspNetCore Package Dependency to 8.1.2
2025-05-28 08:23:39 -04:00
Cody
543e9339c7 Update Swashbuckle.AspNetCore Package Dependency to 8.1.2 2025-05-25 09:34:09 -07:00
Leigh Pointer
7fff5c0d18 Fix for ModuleBase ReplaceTokens #5332
Replaced the ReplaceTokens logic to replace all tokens in the string
2025-05-25 10:55:49 +02:00
Shaun Walker
fa79f3f6fa Merge pull request #5326 from sbwalker/dev
fix #5205 add support for inheritance when loading Resources from ModuleBase or ThemeBase
2025-05-19 21:01:02 -07:00
sbwalker
c098839881 fix #5205 add support for inheritance when loading Resources from ModuleBase or ThemeBase 2025-05-19 21:00:35 -07:00
Shaun Walker
8d0d88c1b9 Merge pull request #5325 from sbwalker/dev
ensure Content folder is empty when packaging
2025-05-19 18:32:42 -04:00
sbwalker
2b6ba0f410 ensure Content folder is empty when packaging 2025-05-19 15:32:27 -07:00
Shaun Walker
11235009c0 Merge pull request #5324 from sbwalker/dev
imprvoe help text
2025-05-19 18:15:03 -04:00
sbwalker
4b05f7fdad imprvoe help text 2025-05-19 15:14:49 -07:00
Shaun Walker
338b0ae509 Merge pull request #5320 from sbwalker/dev
use consistent authorization method
2025-05-16 12:11:16 -04:00
sbwalker
a437082952 use consistent authorization method 2025-05-16 12:11:03 -04:00
Shaun Walker
ca9aba7b3b Merge pull request #5319 from sbwalker/dev
improve comment
2025-05-16 11:53:17 -04:00
sbwalker
fe9f189734 improve comment 2025-05-16 11:53:04 -04:00
Shaun Walker
018ac612f4 Merge pull request #5318 from sbwalker/dev
improve messaging
2025-05-16 11:47:06 -04:00
sbwalker
5bde40ec2b improve messaging 2025-05-16 11:46:53 -04:00
Shaun Walker
4d5780c192 Merge pull request #5317 from sbwalker/dev
Fix #4789 - allow user email verification to be managed by administrator
2025-05-16 11:13:20 -04:00
sbwalker
ff6a810ad5 Fix #4789 - allow user email verification to be managed by administrator 2025-05-16 11:13:03 -04:00
Shaun Walker
feec01ba00 Merge pull request #5316 from sbwalker/dev
fix spelling mistake
2025-05-16 09:40:10 -04:00
sbwalker
1f05d12ef5 fix spelling mistake 2025-05-16 09:39:57 -04:00
Shaun Walker
31aba14507 Merge pull request #5315 from sbwalker/dev
fix initialization issue related to time zones
2025-05-16 09:09:21 -04:00
sbwalker
bbd6f13f36 fix initialization issue related to time zones 2025-05-16 09:09:07 -04:00
Shaun Walker
68edbbbdb9 Merge pull request #5314 from sbwalker/dev
improve filename validation in module content export
2025-05-16 08:26:04 -04:00
sbwalker
eb5a0dc1c9 improve filename validation in module content export 2025-05-16 08:25:50 -04:00
Shaun Walker
7cea4f1792 Merge pull request #5312 from sbwalker/dev
update module export resource info
2025-05-15 11:06:20 -04:00
sbwalker
c57c6abb1b update module export resource info 2025-05-15 11:06:04 -04:00
Shaun Walker
a25b706c7b Merge pull request #5311 from sbwalker/dev
allow filename to be provided during module export
2025-05-15 10:59:10 -04:00
sbwalker
5d077e843d allow filename to be provided during module export 2025-05-15 10:58:55 -04:00
Shaun Walker
65bf3e9899 Merge pull request #5310 from sbwalker/dev
allow module import from a file
2025-05-15 09:34:37 -04:00
sbwalker
51ba3a01f5 allow module import from a file 2025-05-15 09:34:19 -04:00
Shaun Walker
f9ca611b8b Merge pull request #5309 from sbwalker/dev
improve module export so that content can be saved to a file
2025-05-15 08:56:37 -04:00
sbwalker
a49b8728fd improve module export so that content can be saved to a file 2025-05-15 08:56:21 -04:00
Shaun Walker
9234b91089 Merge pull request #5306 from sbwalker/dev
fix #5200 - sort folders alphabetically, display folders hierarchically
2025-05-14 15:52:04 -04:00
sbwalker
f3fcef52dd fix #5200 - sort folders alphabetically, display folders hierarchically 2025-05-14 15:51:51 -04:00
Shaun Walker
7f8b741981 Merge pull request #5305 from sbwalker/dev
fix issue with module header/footer
2025-05-14 14:20:54 -04:00
sbwalker
f1791a709c fix issue with module header/footer 2025-05-14 14:20:44 -04:00
Shaun Walker
30307fb05e Merge pull request #5304 from sbwalker/dev
support for module header and footer content
2025-05-14 12:18:51 -04:00
sbwalker
57d443be8d support for module header and footer content 2025-05-14 12:18:37 -04:00
Shaun Walker
84844c5043 Merge pull request #5303 from sbwalker/dev
move ConfigureOqtaneAssemblies to occur before UseEndpoints
2025-05-14 11:13:12 -04:00
sbwalker
9000f05961 move ConfigureOqtaneAssemblies to occur before UseEndpoints 2025-05-14 11:12:58 -04:00
Shaun Walker
6bef9b5c6e Merge pull request #5302 from sbwalker/dev
update default templates to .NET SDK 9.0.5
2025-05-13 16:52:51 -04:00
sbwalker
ffef1f4820 update default templates to .NET SDK 9.0.5 2025-05-13 16:52:39 -04:00
Shaun Walker
10c7bdbcaa Merge pull request #5301 from sbwalker/dev
upgrade to .NET SDK 9.0.5
2025-05-13 16:49:59 -04:00
sbwalker
e8f9888a41 upgrade to .NET SDK 9.0.5 2025-05-13 16:49:46 -04:00
Shaun Walker
8bac702be6 Merge pull request #5300 from sbwalker/dev
rollback change which moved ConfigureOqtaneAssemblies
2025-05-13 16:39:08 -04:00
sbwalker
128bcecfe3 rollback change which moved ConfigureOqtaneAssemblies(env); 2025-05-13 16:38:48 -04:00
Shaun Walker
1390b3c489 Merge pull request #5299 from sbwalker/dev
fix #5398 - editing page permissions
2025-05-13 15:49:30 -04:00
sbwalker
a0f41341ac fix #5398 - editing page permissions 2025-05-13 15:49:16 -04:00
Shaun Walker
8ffa7ef7ff Merge pull request #5297 from sbwalker/dev
adding time zone support to admin modules
2025-05-13 13:55:15 -04:00
sbwalker
deb4607081 adding time zone support to admin modules 2025-05-13 13:55:01 -04:00
Shaun Walker
49c62f80e8 Merge pull request #5296 from sbwalker/dev
display local datetimes in the Job Scheduler (using time zones)
2025-05-13 11:29:40 -04:00
sbwalker
139793f3c0 display local datetimes in the Job Scheduler (using time zones) 2025-05-13 11:29:26 -04:00
Shaun Walker
f237cb9655 Merge pull request #5295 from sbwalker/dev
add time zone support for sites and users
2025-05-13 09:24:33 -04:00
sbwalker
9f18c460d8 add time zone support for sites and users 2025-05-13 09:24:17 -04:00
Shaun Walker
306a41b442 Merge pull request #5293 from sbwalker/dev
fix #5292 - fix External Login Provider Info link
2025-05-12 11:32:42 -04:00
sbwalker
b53f54295d fix #5292 - fix External Login Provider Info link 2025-05-12 11:32:27 -04:00
Shaun Walker
7e4f066694 Merge pull request #5291 from sbwalker/dev
fix #5287 - allow deletion of folder which contains files
2025-05-12 08:42:12 -04:00
sbwalker
90d72489d9 fix #5287 - allow deletion of folder which contains files 2025-05-12 08:41:57 -04:00
Shaun Walker
045c455324 Merge pull request #5286 from sbwalker/dev
update version to 6.1.3
2025-05-08 16:09:12 -04:00
sbwalker
60da903360 update version to 6.1.3 2025-05-08 16:09:00 -04:00
Shaun Walker
6d2a71f37e Merge pull request #5283 from thabaum/update-6.1.3
Fixes #5267: Updates Project Dependencies and Version to 6.1.3
2025-05-08 16:07:48 -04:00
Shaun Walker
c8f60a12a4 Merge pull request #5277 from ohba-ikuo/dev
Modify the module's server-side resource path.
2025-05-07 17:27:15 -04:00
Shaun Walker
11b2d3aa43 Merge pull request #5284 from sbwalker/dev
change Synchronize button to Check For Updates to improve clarity
2025-05-07 17:12:26 -04:00
sbwalker
3d9c81d850 change Synchronize button to Check For Updates to improve clarity 2025-05-07 17:12:14 -04:00
Cody
8ccb1a24f8 Update Version to 6.1.3 2025-05-07 10:25:27 -07:00
Cody
48c6796128 Update Version to 6.1.3 2025-05-07 10:24:36 -07:00
Cody
fc403f920b Update Version to 6.1.3 2025-05-07 10:24:13 -07:00
Cody
ca19496b5c Update Version to 6.1.3 2025-05-07 10:23:32 -07:00
Cody
0ae38f8a40 Update Version to 6.1.3 2025-05-07 10:23:11 -07:00
Cody
ad868ba841 Update Version to 6.1.3 2025-05-07 10:22:47 -07:00
Cody
f2aa39aa85 Update Version to 6.1.3 2025-05-07 10:22:04 -07:00
Cody
e76e0fc351 Update Version to 6.1.3 2025-05-07 10:20:52 -07:00
Cody
a348913888 Update Version to 6.1.3 2025-05-07 10:20:15 -07:00
Cody
5507006c53 Update Version to 6.1.3 2025-05-07 10:19:05 -07:00
Cody
994429f098 Update Version to 6.1.3 2025-05-07 10:18:40 -07:00
Cody
8efdcb9c49 Update Version to 6.1.3 2025-05-07 10:17:54 -07:00
Cody
db9a40db2b Update Version to 6.1.3 2025-05-07 10:17:17 -07:00
Cody
25667499e6 Update Package Dependencies & Version to 6.1.3 2025-05-07 10:16:38 -07:00
Cody
a728cd2d91 Update Package Dependencies & Version to 6.1.3 2025-05-07 10:14:12 -07:00
Cody
3f5f3ef10b Update Version to 6.1.3 2025-05-07 10:10:58 -07:00
Ikuo Ohba
0d708124c2 Undo Oqtane.Server.csproj 2025-05-07 08:31:34 +09:00
Ikuo Ohba
d31f73df14 Merge branch 'oqtane:dev' into dev 2025-05-07 06:20:48 +09:00
Shaun Walker
3fed45438b Merge pull request #5281 from thabaum/HtmlText.cs-Unused-Namespaces
Fixes #5280: Remove Unused Namespaces from HtmlText.cs in HtmlText Module
2025-05-06 16:50:10 -04:00
Cody
8aa967fa1b Remove Unnecessary Namespaces
Removes Unnecessary Namespaces 'System' and 'System.ComponentModel.DataAnnotations.Schema;'.
2025-05-06 13:29:26 -07:00
Ikuo Ohba
6eaa3e342c Merge branch 'dev' of https://github.com/ohba-ikuo/oqtane.framework into dev 2025-05-02 23:45:18 +09:00
Ikuo Ohba
6fc9e60f62 fixed serverside resource path 2025-05-02 23:45:13 +09:00
Shaun Walker
c39ffcf51c Merge pull request #5275 from sbwalker/dev
add new Register Url and Profile Url options to User Management / Settings
2025-05-01 23:33:10 -04:00
sbwalker
6f60a91f4c add new Register Url and Profile Url options to User Management / Settings 2025-05-01 23:32:37 -04:00
Shaun Walker
8031df6f28 Merge pull request #5274 from sbwalker/dev
use new GetSettingValue() method
2025-04-30 14:35:11 -04:00
sbwalker
da1e859fda use new GetSettingValue() method 2025-04-30 14:34:54 -04:00
Shaun Walker
8d4d25f1d1 Merge pull request #5273 from sbwalker/dev
use new GetSettingValue() method
2025-04-30 14:18:44 -04:00
sbwalker
6aff27778d use new GetSettingValue() method 2025-04-30 14:18:29 -04:00
Shaun Walker
ca2dcbfec0 Merge pull request #5272 from sbwalker/dev
remove unecessary using statment
2025-04-30 13:55:24 -04:00
sbwalker
24b666a382 remove unecessary using statment 2025-04-30 13:55:11 -04:00
Shaun Walker
9e34295529 Merge pull request #5270 from leigh-pointer/ModBase
GetUrlParameters crash
2025-04-30 13:47:21 -04:00
Shaun Walker
10c55d056b Merge pull request #5271 from sbwalker/dev
resolve issue with host setting overrides
2025-04-30 13:47:06 -04:00
sbwalker
753ab3bdd7 resolve issue with host setting overrides 2025-04-30 13:46:52 -04:00
Leigh Pointer
feee8def6f GetUrlParameters crash
The _urlparametersstate variable is not initialized so in GetUrlParameters it causes a crash
2025-04-29 09:50:15 +02:00
Shaun Walker
c208f12f8c Merge pull request #5266 from sbwalker/dev
add a convenience method to get a setting value server-side
2025-04-28 12:43:04 -04:00
sbwalker
dc926bf838 add a convenience method to get a setting value server-side 2025-04-28 12:42:50 -04:00
Shaun Walker
55a76b5204 Merge pull request #5265 from sbwalker/dev
fix #5229 - move IServerStartup.Configure execution until later so that it is possible to register custom endpoints
2025-04-28 12:35:49 -04:00
sbwalker
53b837e763 fix #5229 - move IServerStartup.Configure execution until later so that it is possible to register custom endpoints 2025-04-28 12:34:48 -04:00
Shaun Walker
3a551cdf25 Merge pull request #5257 from leigh-pointer/AddMDfiles
Updated UploadableFiles constant
2025-04-22 17:00:03 -04:00
Shaun Walker
c0c7f87dc9 Merge pull request #5256 from leigh-pointer/Packages
Packages updated
2025-04-22 16:59:49 -04:00
Leigh Pointer
ac77fd138b Updated UploadableFiles constant
Updated UploadableFiles constant to allow for Markdown files to be uploaded.
2025-04-22 10:08:20 +02:00
Leigh Pointer
30d6e9d67c Merge branch 'dev' into Packages 2025-04-22 09:13:15 +02:00
Leigh Pointer
47db4334a1 Packages updated
MySql.Data to 9.3.0
HtmlAgilityPack to 1.12.1
washbuckle.AspNetCore to 8.1.1
2025-04-22 09:11:53 +02:00
Shaun Walker
fce97179e1 Merge pull request #5255 from sbwalker/dev
url mapping improvements
2025-04-21 15:14:52 -04:00
sbwalker
4f16cd2d01 url mapping improvements 2025-04-21 15:14:39 -04:00
Shaun Walker
fa587691b1 Merge pull request #5254 from sbwalker/dev
improve validation in Url Mapping
2025-04-21 14:14:03 -04:00
sbwalker
e0044658f9 improve validation in Url Mapping 2025-04-21 14:13:49 -04:00
Shaun Walker
53de1ddb36 Merge pull request #5253 from mdmontesinos/files-optimization
Files server optimization
2025-04-21 13:57:41 -04:00
David Montesinos
da7b046092 Remove extra using 2025-04-21 18:47:34 +02:00
David Montesinos
d888d83a98 Simplify files etag calculation 2025-04-21 18:44:16 +02:00
David Montesinos
430f83e8e9 Only compute hash when file has query string 2025-04-21 16:46:55 +02:00
David Montesinos
e7acd14faa Replace MD5 hash with a longer simple hash 2025-04-21 15:51:25 +02:00
David Montesinos
1b00fa74bc Compute file server etag with MD5 and always include ModifiedOn 2025-04-21 11:14:24 +02:00
David Montesinos
4d572d8173 Allow earlier return in files server 2025-04-21 10:48:48 +02:00
Shaun Walker
dbda85d8d9 Merge pull request #5248 from sbwalker/dev
UX improvements for System Update
2025-04-15 09:20:35 -04:00
sbwalker
95cb5dd66c UX improvements for System Update 2025-04-15 09:20:18 -04:00
Shaun Walker
f64e1c3a6a Merge pull request #5245 from sbwalker/dev
.NET MAUI client was changed from 0.0.0.0 to 0.0.0.1 in .NET 9
2025-04-11 15:54:17 -04:00
sbwalker
26a686c412 .NET MAUI client was changed from 0.0.0.0 to 0.0.0.1 in .NET 9 2025-04-11 15:54:02 -04:00
Shaun Walker
2505383f53 Merge pull request #5244 from leigh-pointer/Swash
Swagger Updated to latest
2025-04-11 09:03:29 -04:00
Leigh Pointer
1a1e9ac6be Swagger Updated to latest
Swashbuckle.AspNetCore update from 8.1.0 > 8.1.1
2025-04-11 09:24:18 +02:00
Shaun Walker
7f20a3179e Merge pull request #5241 from sbwalker/dev
fix issue with new UserProfile parameters
2025-04-10 14:36:57 -04:00
sbwalker
46431f0187 fix issue with new UserProfile parameters 2025-04-10 14:36:42 -04:00
Shaun Walker
1ff8ec78c9 Merge pull request #5240 from sbwalker/dev
backup parameter needs to be backward compatible
2025-04-10 12:27:39 -04:00
sbwalker
7840230c62 backup parameter needs to be backward compatible 2025-04-10 12:27:21 -04:00
Shaun Walker
523db0a005 Merge pull request #5239 from sbwalker/dev
update Deploy To Azure to the 6.1.2 release
2025-04-10 12:04:40 -04:00
sbwalker
cc906d49ba update Deploy To Azure to the 6.1.2 release 2025-04-10 12:04:26 -04:00
Shaun Walker
fc23af89d3 Update README.md 2025-04-10 11:54:58 -04:00
Shaun Walker
5d8829ba63 Merge pull request #5238 from oqtane/master
6.1.2 Release
2025-04-10 11:48:58 -04:00
Shaun Walker
31ccd80894 Merge pull request #5237 from oqtane/dev
6.1.2 Release
2025-04-10 11:48:36 -04:00
Shaun Walker
bac2234616 Delete Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg 2025-04-10 07:49:01 -04:00
Shaun Walker
bd61db76a3 Delete Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg 2025-04-10 07:48:52 -04:00
Shaun Walker
bc99e3b992 Delete Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg 2025-04-10 07:48:42 -04:00
Shaun Walker
b7314b0813 Delete Oqtane.Server/wwwroot/Packages/Oqtane.Database.PostgreSQL.nupkg 2025-04-10 07:48:31 -04:00
Shaun Walker
4759bd569f Merge pull request #5235 from sbwalker/dev
fix incorrect path in theme template
2025-04-09 17:21:36 -04:00
sbwalker
b88c28f864 fix incorrect path in theme template 2025-04-09 17:21:23 -04:00
Shaun Walker
774ccb05f8 Merge pull request #5234 from sbwalker/dev
removing ShutdownTimeout specification as it was changed in .NET 7 to 30 seconds (https://github.com/dotnet/runtime/pull/63712)
2025-04-09 14:58:56 -04:00
sbwalker
0ac48cba34 removing ShutdownTimeout specification as it was changed in .NET 7 to 30 seconds (https://github.com/dotnet/runtime/pull/63712) 2025-04-09 14:58:30 -04:00
Shaun Walker
e36880fe3a Merge pull request #5233 from sbwalker/dev
prepare for 6.1.2 release
2025-04-09 11:46:30 -04:00
sbwalker
713cf5de2c prepare for 6.1.2 release 2025-04-09 11:46:16 -04:00
Shaun Walker
0fa336411f Merge pull request #5232 from sbwalker/dev
update to .NET 9.0.4
2025-04-09 11:41:08 -04:00
sbwalker
8ebdb09d68 update to .NET 9.0.4 2025-04-09 11:40:54 -04:00
Shaun Walker
40bc53001e Merge pull request #5231 from sbwalker/dev
improve sitemap detection in robots.txt
2025-04-09 11:26:53 -04:00
sbwalker
b1656d1eea improve sitemap detection in robots.txt 2025-04-09 11:26:33 -04:00
Shaun Walker
7aa54bf979 Merge pull request #5230 from sbwalker/dev
resolve issue with host role support  in external login
2025-04-09 10:55:32 -04:00
sbwalker
231f9bca84 resolve issue with host role support in external login 2025-04-09 10:55:16 -04:00
Shaun Walker
e4f8596c19 Merge pull request #5227 from sbwalker/dev
fix #5223 - allow robots.txt to be customized for each site
2025-04-08 09:23:35 -04:00
sbwalker
020b7233d0 fix #5223 - allow robots.txt to be customized for each site 2025-04-08 09:23:22 -04:00
Shaun Walker
85fc0b3e2f Merge pull request #5226 from sbwalker/dev
optimize the System Update process
2025-04-07 13:19:07 -04:00
sbwalker
5dcc7c14f3 optimize the System Update process 2025-04-07 13:18:52 -04:00
Shaun Walker
7993d27b11 Merge pull request #5224 from sbwalker/dev
added new Azure SQL database provider
2025-04-07 10:48:20 -04:00
sbwalker
1f8c54ce74 added new Azure SQL database provider 2025-04-07 10:48:02 -04:00
Shaun Walker
73a414a34b Merge pull request #5221 from sbwalker/dev
improve help text
2025-04-02 09:47:31 -04:00
sbwalker
8fa19c4a51 improve help text 2025-04-02 09:47:16 -04:00
Shaun Walker
0667ae3e15 Merge pull request #5220 from sbwalker/dev
update help text
2025-04-02 09:36:49 -04:00
sbwalker
db1d00cd07 update help text 2025-04-02 09:36:32 -04:00
Shaun Walker
b27f092bef Merge pull request #5219 from sbwalker/dev
use dynamic .NET major version value
2025-04-01 15:29:26 -04:00
sbwalker
4eaea8e586 use dynamic .NET major version value 2025-04-01 15:29:10 -04:00
Shaun Walker
89cd7d3bbb Update README.md 2025-04-01 14:30:49 -04:00
Shaun Walker
2fff1d8d21 Merge pull request #5218 from sbwalker/dev
removing connection string section
2025-04-01 13:55:09 -04:00
sbwalker
850631f00e removing connection string section 2025-04-01 13:54:39 -04:00
Shaun Walker
1cea8846cf Merge pull request #5217 from sbwalker/dev
fix azuredeploy
2025-04-01 11:04:02 -04:00
sbwalker
af48a48559 fix azuredeploy 2025-04-01 11:03:46 -04:00
Shaun Walker
655c1762aa Merge pull request #5216 from sbwalker/dev
azuredeploy changes to use ZIP Deploy
2025-04-01 10:56:47 -04:00
sbwalker
f706ccfd87 new version using ZIP Deploy 2025-04-01 10:56:04 -04:00
Shaun Walker
71e4c7f117 Merge pull request #5214 from sbwalker/dev
remove .deployment file as we are deploying from a package rather than from source code
2025-03-31 16:22:08 -04:00
sbwalker
ad6182f4bd remove .deployment file as we are deploying from a package rather than from source code 2025-03-31 16:21:45 -04:00
Shaun Walker
86bf0f65b0 Merge pull request #5213 from sbwalker/dev
modifications to use WEBSITE_RUN_FROM_PACKAGE
2025-03-31 16:06:24 -04:00
sbwalker
7742f7747d modifications to use WEBSITE_RUN_FROM_PACKAGE 2025-03-31 16:06:08 -04:00
Shaun Walker
eb998c41f2 Merge pull request #5212 from sbwalker/dev
fix #4929 deploy to azure
2025-03-31 13:59:12 -04:00
sbwalker
657bd7c97c fix #4929 deploy to azure 2025-03-31 13:58:03 -04:00
Shaun Walker
c8286148c1 Merge pull request #5211 from sbwalker/dev
fix #5194 - improve performance of retrieving scheduled job logs
2025-03-31 13:16:52 -04:00
sbwalker
e6ba2cce62 fix #5194 - improve performance of retrieving scheduled job logs 2025-03-31 13:16:35 -04:00
Shaun Walker
6105ff44b4 Merge pull request #5210 from sbwalker/dev
fix #5207 add support for username and displayname in permissions grid
2025-03-31 10:04:43 -04:00
sbwalker
72da77be01 fix #5207 add support for username and displayname in permissions grid 2025-03-31 10:04:26 -04:00
Shaun Walker
4c29b31f1b Merge pull request #5209 from sbwalker/dev
delete files before deleting folder
2025-03-31 08:58:39 -04:00
sbwalker
6e640108ed delete files before deleting folder 2025-03-31 08:58:23 -04:00
Shaun Walker
157322441d Merge pull request #5206 from zyhfish/task/fix-5205
Fix #5205: specific the date time as UTC kind.
2025-03-31 08:40:28 -04:00
Shaun Walker
61d967e6af Merge pull request #5208 from sbwalker/dev
allow custom urls in UserProfile component
2025-03-31 08:38:46 -04:00
sbwalker
99f2158e55 allow custom urls in UserProfile component 2025-03-31 08:38:30 -04:00
Ben
1cba78cc4e Fix #5205: specific the date time as UTC kind. 2025-03-29 09:29:49 +08:00
Shaun Walker
1770c1ee11 Merge pull request #5201 from sbwalker/dev
include external login support for host role
2025-03-26 17:11:52 -04:00
sbwalker
a57fbea0cc include external login support for host role 2025-03-26 17:11:29 -04:00
Shaun Walker
f0c27c83f1 Merge pull request #5197 from zyhfish/task/clean-build
suppress build warnings.
2025-03-26 11:16:47 -04:00
Ben
7873ca564c supress build warnings. 2025-03-26 08:12:10 +08:00
Shaun Walker
5ebc1fec24 Merge pull request #5195 from zyhfish/task/fix-5191
Fix #5191: trigger event when folder changed.
2025-03-25 19:46:24 -04:00
Shaun Walker
f2559b7d4d Merge pull request #5196 from sbwalker/dev
fix #5193 - prevent scheduled jobs from blocking startup
2025-03-25 19:07:24 -04:00
sbwalker
1ee92a248e fix #5193 - prevent scheduled jobs from blocking startup 2025-03-25 19:07:01 -04:00
Ben
8376f98f21 Fix #5191: trigger event when folder changed. 2025-03-25 22:23:51 +08:00
Shaun Walker
810a3e0171 Merge pull request #5188 from sbwalker/dev
prevent stylesheet resources from being duplicated
2025-03-21 17:34:21 -04:00
sbwalker
2eac9c3795 prevent stylesheet resources from being duplicated 2025-03-21 17:34:07 -04:00
Shaun Walker
75f2425668 Merge pull request #5187 from sbwalker/dev
remove unnecessary using statements
2025-03-21 10:10:32 -04:00
sbwalker
2dd1d7e926 remove unnecessary using statements 2025-03-21 10:10:19 -04:00
Shaun Walker
5bb05a0a51 Merge pull request #5185 from sbwalker/dev
fix page order for new Privacy and Terms pages
2025-03-21 08:19:26 -04:00
sbwalker
bc2c5b00c6 fix page order for new Privacy and Terms pages 2025-03-21 08:19:09 -04:00
Shaun Walker
09f5e158dd Merge pull request #5181 from sbwalker/dev
add ability to Synchronize local modules and themes with Marketplace
2025-03-19 14:37:50 -04:00
sbwalker
4656471a0a add ability to Synchronize local modules and themes with Marketplace 2025-03-19 14:37:36 -04:00
Shaun Walker
69d58a4273 Merge pull request #5179 from leigh-pointer/SwashbuckleUpdate8
Swashbuckle Update
2025-03-19 08:42:40 -04:00
Leigh Pointer
53a27677d4 Swashbuckle Update
Update Swashbuckle  to version 8.0
2025-03-19 12:07:15 +01:00
Shaun Walker
f243ad0348 Merge pull request #5178 from sbwalker/dev
add caching support for ImageUrl
2025-03-18 14:29:23 -04:00
sbwalker
b4ce6bbb42 add caching support for ImageUrl 2025-03-18 14:29:09 -04:00
Shaun Walker
fa32937045 Merge pull request #5177 from sbwalker/dev
MySql.Data is still required for raw query operations
2025-03-18 09:24:53 -04:00
sbwalker
812e5f3c8e MySql.Data is still required for raw query operations 2025-03-18 09:24:39 -04:00
Shaun Walker
e2981e802c Merge pull request #5176 from sbwalker/dev
fix #5173 - MySQL Database Provider not incuding MySqlConnector dependency
2025-03-18 09:08:07 -04:00
sbwalker
4ae4705c73 fix #5173 - MySQL Database Provider not incuding MySqlConnector dependency 2025-03-18 09:07:23 -04:00
Shaun Walker
fbf4b12713 Merge pull request #5168 from zyhfish/task/fix-cookie-consent-layout
adjust the cookie consent layout in small screen.
2025-03-17 13:45:14 -04:00
Shaun Walker
e4ece3e0dc Merge pull request #5174 from sbwalker/dev
notifications should only convert line breaks to HTML for plain text messages
2025-03-17 13:45:02 -04:00
sbwalker
9f231421be notifications should only convert line breaks to HTML for plain text messages 2025-03-17 13:44:40 -04:00
391827222e Update README.md 2025-03-15 18:08:36 +00:00
c1721bd1a1 Update README.md 2025-03-15 18:08:00 +00:00
f6630ae241 Update README.md 2025-03-15 18:07:14 +00:00
424cab64a8 NEW: Docker builds 2025-03-15 18:59:18 +01:00
Ben
b4fdbb5e48 adjust the layout in small screen. 2025-03-13 21:54:43 +08:00
Ben
fbf62ca30d adjust the cookie consent layout in small screen. 2025-03-13 20:54:50 +08:00
Shaun Walker
05d2096fb8 Update README.md 2025-03-12 14:34:31 -04:00
Shaun Walker
7683af81bc Update README.md 2025-03-12 14:22:43 -04:00
Shaun Walker
bad10b3812 6.1.1 Release
6.1.1 Release
2025-03-12 14:21:41 -04:00
Shaun Walker
9f9522c2ed 6.1.1 Release
6.1.1 Release
2025-03-12 14:21:15 -04:00
Shaun Walker
62879c3e52 Merge pull request #5162 from sbwalker/dev
upgrade to .NET 9.0.3
2025-03-11 14:36:14 -04:00
sbwalker
45610f8dd7 upgrade to .NET 9.0.3 2025-03-11 14:35:59 -04:00
Shaun Walker
18102cbd78 Merge pull request #5160 from sbwalker/dev
sort endpoints by route
2025-03-11 13:11:34 -04:00
sbwalker
262d6a1529 sort endpoints by route 2025-03-11 13:11:19 -04:00
Shaun Walker
1124ddaf90 Merge pull request #5157 from zyhfish/task/fix-5156
Fix #5156: update the bind event to oninput.
2025-03-11 11:51:38 -04:00
Shaun Walker
981add3872 Merge pull request #5158 from sbwalker/dev
rename Cache service to OutputCache
2025-03-11 11:48:58 -04:00
sbwalker
8d4b30140e rename Cache service to OutputCache 2025-03-11 11:48:43 -04:00
Ben
b9c59137a8 Fix #5156: update the bind event to oninput. 2025-03-11 22:58:06 +08:00
Shaun Walker
0b1c7e06ca Update README.md 2025-03-10 10:56:41 -04:00
Shaun Walker
fcaf80cba6 Update README.md 2025-03-10 10:56:11 -04:00
Shaun Walker
6358b9eabb Merge pull request #5155 from sbwalker/dev
added Logout Everywhere option to User Settings
2025-03-10 10:53:25 -04:00
sbwalker
70a3fab1ff added Logout Everywhere option to User Settings 2025-03-10 10:53:05 -04:00
Shaun Walker
bdf86ace86 Merge pull request #5152 from sbwalker/dev
upgrade to ImageSharp 3.1.7 due to security vulnerability
2025-03-07 14:17:02 -05:00
sbwalker
d57132d1e4 upgrade to ImageSharp 3.1.7 due to security vulnerability 2025-03-07 14:16:47 -05:00
Shaun Walker
a6e87abf99 Merge pull request #5151 from sbwalker/dev
allow site settings to be overidden at host level
2025-03-07 14:15:31 -05:00
sbwalker
f1771610fe allow site settings to be overidden at host level 2025-03-07 14:15:16 -05:00
Shaun Walker
a88ea9780f Update README.md 2025-03-06 15:45:30 -05:00
Shaun Walker
bca0866d72 Update README.md 2025-03-06 15:43:59 -05:00
Shaun Walker
cebed93abf Update README.md 2025-03-06 15:42:48 -05:00
Shaun Walker
ee2b2e3569 Update README.md 2025-03-06 15:40:07 -05:00
Shaun Walker
cb8e9ee244 Update README.md 2025-03-06 15:38:18 -05:00
Shaun Walker
486184b16c Update README.md 2025-03-06 15:36:28 -05:00
Shaun Walker
9f9bd1988f Merge pull request #5149 from sbwalker/dev
update based on changes suggested by @adefwebserver
2025-03-06 15:25:37 -05:00
sbwalker
ba1bfd1bc0 update based on changes suggested by @adefwebserver 2025-03-06 15:25:25 -05:00
Shaun Walker
e12926e971 Merge pull request #5148 from sbwalker/dev
allow page and module settings to be included in site templates, improve terms and privacy default content, add Settings for HtmlText module
2025-03-06 14:46:38 -05:00
sbwalker
5b4db0de3b allow page and module settings to be included in site templates, improve terms and privacy default content, add Settings for HtmlText module 2025-03-06 14:46:17 -05:00
Shaun Walker
70ff55faa6 Merge pull request #5147 from sbwalker/dev
modify terminology
2025-03-06 09:43:55 -05:00
sbwalker
f2bd47d8bc modify terminology 2025-03-06 09:43:40 -05:00
Shaun Walker
e2b9c9e98e Merge pull request #5146 from sbwalker/dev
prepare for 6.1.1
2025-03-05 15:02:39 -05:00
sbwalker
b0791a594f prepare for 6.1.1 2025-03-05 15:02:12 -05:00
Shaun Walker
ea5eaa6ed2 Merge pull request #5145 from sbwalker/dev
update to .NET 9.0.2
2025-03-05 14:55:00 -05:00
sbwalker
ec3fd1d585 update to .NET 9.0.2 2025-03-05 14:54:46 -05:00
Shaun Walker
d76de22977 Merge pull request #5144 from sbwalker/dev
modify localization text
2025-03-05 10:45:17 -05:00
sbwalker
c0e3483cc7 modify localization text 2025-03-05 10:44:34 -05:00
Shaun Walker
0994cdf3b6 Merge pull request #5141 from sbwalker/dev
sync interop.js changes with .NET MAUI
2025-03-04 16:25:24 -05:00
sbwalker
a76fd82262 sync interop.js changes with .NET MAUI 2025-03-04 16:25:10 -05:00
Shaun Walker
2f919c7d69 Merge pull request #5140 from sbwalker/dev
fix regression issue with Search component
2025-03-04 15:45:16 -05:00
sbwalker
f12592731b fix regression issue with Search component 2025-03-04 15:45:02 -05:00
Shaun Walker
4a20e1a25d Merge pull request #5138 from zyhfish/task/improve-middle-screen-view
improve the styles in middle screen size.
2025-03-04 15:42:37 -05:00
Shaun Walker
cc7111c3ff Merge pull request #5139 from sbwalker/dev
change module title for Terms
2025-03-04 15:40:58 -05:00
sbwalker
81972aed62 change module title for Terms 2025-03-04 15:40:44 -05:00
Ben
5e2092c6d4 improve the styles in middle screen size. 2025-03-04 23:31:21 +08:00
Shaun Walker
d136f8ac91 Merge pull request #5137 from sbwalker/dev
add nonce support
2025-03-03 16:49:41 -05:00
sbwalker
5b23917940 add nonce support 2025-03-03 16:49:28 -05:00
Shaun Walker
2cda0a3798 Merge pull request #5136 from sbwalker/dev
modify cookie consent text
2025-03-03 15:37:46 -05:00
sbwalker
f315ad1ce9 modify cookie consent text 2025-03-03 15:37:31 -05:00
Shaun Walker
49f1c273c2 Merge pull request #5134 from sbwalker/dev
add terms to upgrademanager
2025-03-03 13:36:47 -05:00
sbwalker
8518476c87 add terms to upgrademanager 2025-03-03 13:36:32 -05:00
Shaun Walker
a34ed756db Merge pull request #5132 from mdmontesinos/sitemap-cache
resolves #4899: output cache for sitemap
2025-03-03 13:22:46 -05:00
Shaun Walker
a48232c4e3 Merge pull request #5133 from sbwalker/dev
add default privacy and terms
2025-03-03 13:22:33 -05:00
sbwalker
ac65e38390 add default privacy and terms 2025-03-03 13:22:17 -05:00
David Montesinos
eab3a753f5 resolves #4899: output cache for sitemap 2025-03-03 17:54:33 +01:00
Shaun Walker
9e5922e121 Merge pull request #5130 from zyhfish/task/fix-4936
Fix #4936: set the allow cookie value when refresh state.
2025-03-03 07:57:42 -05:00
Ben
bf57b23776 update the page state after policy changed. 2025-03-01 15:05:23 +08:00
Ben
8f4a20fd46 Fix #4936: set the allow cookie value when refresh state. 2025-03-01 14:16:42 +08:00
Shaun Walker
b3716da5ac Merge pull request #5128 from zyhfish/task/fix-4936-new
move the styles to app.css.
2025-02-28 13:36:58 -05:00
Shaun Walker
2c129fd800 Merge pull request #5129 from sbwalker/dev
localization text change
2025-02-28 13:36:49 -05:00
sbwalker
6fb18e7a25 localization text change 2025-02-28 13:36:34 -05:00
Ben
38d28d6944 move the styles to app.css. 2025-02-28 23:53:53 +08:00
Shaun Walker
a187e1a7a2 Merge pull request #5127 from sbwalker/dev
fix RESX issue
2025-02-28 10:52:18 -05:00
sbwalker
7d7a19c7c2 fix RESX issue 2025-02-28 10:52:06 -05:00
Shaun Walker
6a2ae2153a Merge pull request #5119 from zyhfish/task/fix-4936
update the cookie consent control.
2025-02-28 10:48:21 -05:00
Shaun Walker
f50ba1a91e Merge branch 'dev' into task/fix-4936 2025-02-28 10:47:24 -05:00
Shaun Walker
b09575dbd6 Merge pull request #5126 from sbwalker/dev
provide option to assign a theme to a site
2025-02-28 10:45:40 -05:00
sbwalker
c52ee3d91d provide option to assign a theme to a site 2025-02-28 10:45:25 -05:00
Ben
1ced5c0425 update the cookie consent control. 2025-02-28 23:32:17 +08:00
Shaun Walker
e399a5c9b1 Merge pull request #5124 from sbwalker/dev
add missing maxlength attributes
2025-02-27 10:51:37 -05:00
sbwalker
08dff5fb67 add missing maxlength attributes 2025-02-27 10:51:22 -05:00
Shaun Walker
912760f2a7 Update SECURITY.md 2025-02-26 15:29:49 -05:00
Shaun Walker
4b62fdbf93 Update SECURITY.md 2025-02-26 15:27:33 -05:00
Shaun Walker
df593d43a7 Update SECURITY.md 2025-02-26 15:25:25 -05:00
Shaun Walker
89b1fba771 Merge pull request #5123 from sbwalker/dev
remove package validation logic
2025-02-26 12:54:06 -05:00
sbwalker
5505c91ae0 remove package validation logic 2025-02-26 12:53:53 -05:00
Shaun Walker
cc720ff399 Merge pull request #5122 from sbwalker/dev
remove unnecessary log message
2025-02-26 12:12:14 -05:00
sbwalker
29f07f6c56 remove unnecessary log message 2025-02-26 12:11:56 -05:00
Shaun Walker
a69e197a1f Merge pull request #5121 from zyhfish/task/fix-5116
Fix #5116: parse the value as UTC time.
2025-02-26 07:45:55 -05:00
Ben
6dddd8eff8 only allow essential cookies when cookie consent not granted. 2025-02-26 19:41:58 +08:00
Ben
51aada8922 Fix #5116: parse the value as UTC time. 2025-02-26 18:25:24 +08:00
Ben
b47bf40e8f update the cookie consent control. 2025-02-25 11:36:47 +08:00
Shaun Walker
48151bf365 Merge pull request #5118 from sbwalker/dev
remove IJSRuntime reference as it was causing a compilation warning
2025-02-24 16:15:51 -05:00
sbwalker
659950996d remove IJSRuntime reference as it was causing a compilation warning 2025-02-24 16:15:35 -05:00
Shaun Walker
6e656a4d0a Merge pull request #5114 from zyhfish/task/fix-4936
Fix #4936: add the cookie consent theme control.
2025-02-24 16:08:22 -05:00
Ben
bf308dd13d enable child component of cookie consent control. 2025-02-24 22:32:19 +08:00
Ben
982f3b1943 Fix #4936: add the cookie consent theme control. 2025-02-22 09:49:33 +08:00
Shaun Walker
7a4ea8cf1b Merge pull request #5094 from zyhfish/task/set-fa-ir-culture
Fix #5054: resolve the issue in fa-IR language.
2025-02-19 07:36:16 -05:00
Shaun Walker
7c0482a87c Merge pull request #5111 from sbwalker/dev
remove warning message related to no jobs being registered
2025-02-18 11:50:57 -05:00
sbwalker
101ededd89 remove warning message related to no jobs being registered 2025-02-18 11:50:36 -05:00
Shaun Walker
a8cbc0040e Merge pull request #5108 from zyhfish/task/fix-5103
Fix #5103: return a copy of the assembly list.
2025-02-18 11:40:30 -05:00
Shaun Walker
ed91bb445b Merge pull request #5110 from sbwalker/dev
improve HostedServiceBase so that scheduled jobs can be registered during installation
2025-02-18 11:36:00 -05:00
sbwalker
f158a222f4 improve HostedServiceBase so that scheduled jobs can be registered during installation 2025-02-18 11:35:38 -05:00
Shaun Walker
46bcad1fca Merge pull request #5109 from sbwalker/dev
clean up scheduled jobs which have been uninstalled
2025-02-18 09:12:48 -05:00
sbwalker
5e147afb9f clean up scheduled jobs which have been uninstalled 2025-02-18 09:12:26 -05:00
Ben
b061d4593f Fix #5103: return a copy of the assembly list. 2025-02-18 22:02:25 +08:00
Shaun Walker
3fa520b4ef Merge pull request #5107 from sbwalker/dev
make purge job output more readable
2025-02-18 08:53:38 -05:00
sbwalker
2df05b4afd make purge job output more readable 2025-02-18 08:53:23 -05:00
Shaun Walker
e0569a6748 Merge pull request #5104 from sbwalker/dev
fix visitor purge logic
2025-02-17 13:22:11 -05:00
sbwalker
2e6ab398d9 fix visitor purge logic 2025-02-17 13:21:58 -05:00
Ben
94b03d2a6b update settings for all RTL languages. 2025-02-16 10:25:43 +08:00
Shaun Walker
f84fe30bb6 Merge pull request #5097 from sbwalker/dev
synchronize BlazorScriptReload changes
2025-02-14 09:17:58 -05:00
sbwalker
049ddef531 synchronize BlazorScriptReload changes 2025-02-14 09:17:44 -05:00
Shaun Walker
a1a214c742 Merge pull request #5096 from sbwalker/dev
add another constructor for Script class
2025-02-14 09:09:14 -05:00
sbwalker
c40a483ffa add another constructor for Script class 2025-02-14 09:09:00 -05:00
Ben
aff99acfae Fix #5054: resolve the issue in fa-IR language. 2025-02-12 20:18:10 +08:00
Shaun Walker
628129c08d Update README.md 2025-02-11 12:00:41 -05:00
Shaun Walker
679d34dfdf Merge pull request #5093 from oqtane/master
6.1.0 Release
2025-02-11 11:49:29 -05:00
Shaun Walker
b2f65903ae Merge pull request #5092 from oqtane/dev
6.1.0 Release
2025-02-11 11:49:06 -05:00
Shaun Walker
2daefe0382 Merge pull request #5091 from tvatavuk/patch-1
Minor fix in ThemeController.cs
2025-02-11 11:41:52 -05:00
Tonći Vatavuk
1214a11704 Minor fix in ThemeController.cs
update `SharedReference` to use "Oqtane.Shared" for PackageReference code
2025-02-11 14:35:13 +01:00
Shaun Walker
e55e0118c2 Merge pull request #5090 from sbwalker/dev
fix #5089 - remove upgrade cleanup logic as .NET 9.0.1 moves assemblies back to /bin folder
2025-02-10 16:53:42 -05:00
sbwalker
a1ac81e907 fix #5089 - remove upgrade cleanup logic as .NET 9.0.1 moves assemblies back to /bin folder 2025-02-10 16:53:22 -05:00
Shaun Walker
14ad68bf69 Merge pull request #5088 from sbwalker/dev
modify RemoveAssemblies method so that it only runs once - not for every tenant
2025-02-10 16:27:24 -05:00
sbwalker
e3118c6e99 modify RemoveAssemblies method so that it only runs once - not for every tenant 2025-02-10 16:27:05 -05:00
Shaun Walker
b41aeab8f8 Merge pull request #5087 from sbwalker/dev
update Provider property to Pomelo
2025-02-10 10:47:07 -05:00
sbwalker
1a738b358e update Provider property to Pomelo 2025-02-10 10:46:44 -05:00
Shaun Walker
f4b1e8035b Merge pull request #5086 from sbwalker/dev
improve notification add and update methods
2025-02-10 09:50:35 -05:00
sbwalker
324e985247 improve notification add and update methods 2025-02-10 09:50:21 -05:00
Shaun Walker
60faacd7d0 Merge pull request #5085 from sbwalker/dev
fix comment
2025-02-10 08:21:13 -05:00
sbwalker
d4a4d7c346 fix comment 2025-02-10 08:20:58 -05:00
Shaun Walker
189f8f1d27 Merge pull request #5082 from sbwalker/dev
enhance purge job to trim broken urls based on retention policy
2025-02-09 13:02:21 -05:00
sbwalker
ed353461da enhance purge job to trim broken urls based on retention policy 2025-02-09 13:02:07 -05:00
Shaun Walker
e9330d6c62 Merge pull request #5080 from zyhfish/task/fix-5079
Fix #5079: Retrieve all Url Mapping records
2025-02-09 12:35:28 -05:00
Shaun Walker
f53e7cc3f6 Merge pull request #5081 from sbwalker/dev
fix #5072 - administrators should be allowed to send system notifications
2025-02-09 12:34:38 -05:00
sbwalker
4f4258d532 fix #5072 - administrators should be allowed to send system notifications 2025-02-09 12:34:17 -05:00
Ben
c80910f355 Fix #5079: remove the records limit. 2025-02-08 11:51:38 +08:00
Shaun Walker
12470ab178 Merge pull request #5075 from mdmontesinos/dev
fix #5074: generate cancellation token for file upload
2025-02-07 07:53:16 -05:00
Shaun Walker
704e091e9b Merge pull request #5076 from sbwalker/dev
synchronize interop script changes with .NET MAUI
2025-02-07 07:52:58 -05:00
sbwalker
f30f1e5c1f synchronize interop script changes with .NET MAUI 2025-02-07 07:52:43 -05:00
David Montesinos
0741ce2197 fix #5074: generate cancellation token for file upload 2025-02-07 09:11:52 +01:00
Shaun Walker
fc81bae9b7 Update README.md 2025-02-06 15:16:50 -05:00
Shaun Walker
3fa68e4f96 Merge pull request #5071 from sbwalker/dev
moved file setting to File Management and added Max Chunk Size
2025-02-06 15:10:29 -05:00
sbwalker
05a767c7be moved file setting to File Management and added Max Chunk Size 2025-02-06 15:10:14 -05:00
Shaun Walker
8c1e8f6377 Merge pull request #5070 from sbwalker/dev
fix #5067 - add support for Guid data types
2025-02-06 14:17:06 -05:00
sbwalker
0fbae8d7da fix #5067 - add support for Guid data types 2025-02-06 14:16:53 -05:00
Shaun Walker
cec4b339f5 Merge pull request #5069 from mdmontesinos/dev-test
fix #5058: ensure sequential file and chunk uploads to avoid overload
2025-02-06 13:56:35 -05:00
David Montesinos
1a7656d8ee fix #5058: ensure sequential file and chunk uploads to avoid overload 2025-02-06 19:21:51 +01:00
Shaun Walker
e173815810 Merge pull request #5068 from sbwalker/dev
fix LogLevel for file upload error
2025-02-06 12:21:51 -05:00
sbwalker
620c768e05 fix LogLevel for file upload error 2025-02-06 12:21:34 -05:00
Shaun Walker
7740679077 Merge pull request #5066 from sbwalker/dev
fix #5061 - configure Page Management for personalizable pages
2025-02-06 11:16:46 -05:00
sbwalker
1ebc8ebff3 fix #5061 - configure Page Management for personalizable pages 2025-02-06 11:16:30 -05:00
Shaun Walker
fa4fac70d5 Merge pull request #5065 from sbwalker/dev
improve file upload validation and error handling on server
2025-02-06 08:20:13 -05:00
sbwalker
8c83a18f93 improve file upload validation and error handling on server 2025-02-06 08:19:57 -05:00
Shaun Walker
a151ecfda0 Merge pull request #5064 from sbwalker/dev
modified file upload error message to reflect new behavior
2025-02-05 19:10:10 -05:00
sbwalker
dec0c0649c modified file upload error message to reflect new behavior 2025-02-05 19:09:55 -05:00
Shaun Walker
a356f893ac Merge pull request #5063 from sbwalker/dev
remove uploadFile() method as it is not used
2025-02-05 17:08:56 -05:00
sbwalker
e2af4f74c3 remove uploadFile() method as it is not used 2025-02-05 17:08:32 -05:00
Shaun Walker
99022b76e5 Merge pull request #5062 from sbwalker/dev
file upload improvements
2025-02-05 16:48:59 -05:00
sbwalker
9dd6dc7523 file upload improvements 2025-02-05 16:48:34 -05:00
Shaun Walker
6f588200d7 Merge pull request #5057 from sbwalker/dev
fix #5044 - improve file part removal logic
2025-02-03 11:00:37 -05:00
sbwalker
f3dbeae28e fix #5044 - improve file part removal logic 2025-02-03 11:00:22 -05:00
Shaun Walker
9f70361298 Merge pull request #5056 from sbwalker/dev
add additional Script class constructors
2025-02-03 10:35:32 -05:00
sbwalker
534353ce13 add additional Script class constructors 2025-02-03 10:35:17 -05:00
Shaun Walker
3f391a7354 Merge pull request #5052 from sbwalker/dev
modify button spacing
2025-01-31 14:51:06 -05:00
sbwalker
0dd0752710 modify button spacing 2025-01-31 14:50:54 -05:00
Shaun Walker
710fae4b0e Merge pull request #5051 from sbwalker/dev
add user impersonation
2025-01-31 11:14:28 -05:00
sbwalker
de6c57a7ee add user impersonation 2025-01-31 11:14:13 -05:00
Shaun Walker
7eee1fcd6a Merge pull request #5050 from sbwalker/dev
make Kestrel the default profile in launchjSettings.json
2025-01-31 09:18:59 -05:00
sbwalker
1fd2aedf96 make Kestrel the default profile in launchjSettings.json 2025-01-31 09:18:44 -05:00
Shaun Walker
ffdd7c063b Merge pull request #5049 from sbwalker/dev
added a ScriptsLoaded property in ModuleBase and ThemeBase for flow control in Interactive rendering scenarios
2025-01-31 08:42:56 -05:00
sbwalker
a87af264eb added a ScriptsLoaded property in ModuleBase and ThemeBase for flow control in Interactive rendering scenarios 2025-01-31 08:42:36 -05:00
Shaun Walker
3640cd2fdd Merge pull request #5046 from sbwalker/dev
fix upgrade issue which can occur in development environments
2025-01-30 08:40:08 -05:00
sbwalker
f7cf25c4bb fix upgrade issue which can occur in development environments 2025-01-30 08:39:49 -05:00
Shaun Walker
77dbd0d4c7 Merge pull request #5045 from sbwalker/dev
update version to 6.1.0
2025-01-30 08:08:34 -05:00
sbwalker
5a77c83e68 update version to 6.1.0 2025-01-30 08:08:16 -05:00
Shaun Walker
0a6763e08c Merge pull request #5043 from sbwalker/dev
change ResourceLoadBehavior Never to None
2025-01-29 19:05:20 -05:00
sbwalker
b5aa206670 change ResourceLoadBehavior Never to None 2025-01-29 19:05:05 -05:00
Shaun Walker
dbb4d9b64b Merge pull request #5042 from sbwalker/dev
fix logic to retrieve access token
2025-01-29 16:03:11 -05:00
sbwalker
6775edfd66 fix logic to retrieve access token 2025-01-29 16:02:55 -05:00
Shaun Walker
b06750ed65 Merge pull request #5040 from sbwalker/dev
remove method which was relocated to PageRepository
2025-01-29 13:12:59 -05:00
sbwalker
57879c1891 remove method which was relocated to PageRepository 2025-01-29 13:12:46 -05:00
Shaun Walker
65b55a76f2 Merge pull request #5039 from sbwalker/dev
improve asset caching help text
2025-01-29 12:40:02 -05:00
sbwalker
8562a68306 improve asset caching help text 2025-01-29 12:39:47 -05:00
Shaun Walker
160da46b5a Merge pull request #5038 from sbwalker/dev
remove Environment.IsDevelopment logic
2025-01-29 12:27:57 -05:00
sbwalker
ae5f70a739 remove Environment.IsDevelopment logic 2025-01-29 12:27:42 -05:00
Shaun Walker
4456e57466 Merge pull request #5036 from sbwalker/dev
use fingerprint term consistently
2025-01-29 10:42:34 -05:00
sbwalker
24cd090c61 use fingerprint term consistently 2025-01-29 10:42:19 -05:00
Shaun Walker
4f849f5d5f Merge pull request #5035 from sbwalker/dev
performance improvement when loading files within a folder
2025-01-29 10:23:11 -05:00
sbwalker
db2e86e84c performance improvement when loading files within a folder 2025-01-29 10:22:56 -05:00
Shaun Walker
14748ce2b3 Merge pull request #5034 from sbwalker/dev
use Configuration service as it already exists
2025-01-29 08:28:08 -05:00
sbwalker
527509732c use Configuration service as it already exists 2025-01-29 08:22:21 -05:00
Shaun Walker
aa9214477c Merge pull request #5033 from sbwalker/dev
fix #5018 - redirect file download to login page
2025-01-28 16:31:03 -05:00
sbwalker
db24ed8b55 fix #5018 - redirect file download to login page 2025-01-28 16:30:49 -05:00
Shaun Walker
349d1849d9 Merge pull request #5032 from sbwalker/dev
use deterministic hash in file server image generation
2025-01-28 15:55:56 -05:00
sbwalker
188be2fa8c use deterministic hash in file server image generation 2025-01-28 15:55:40 -05:00
Shaun Walker
5c4d7df734 Merge pull request #5031 from sbwalker/dev
remove Oqtane.Server.staticwebassets.endpoints.json from release packages
2025-01-28 14:39:48 -05:00
sbwalker
37de18c670 remove Oqtane.Server.staticwebassets.endpoints.json from release packages 2025-01-28 14:39:30 -05:00
Shaun Walker
0001e3844b Merge pull request #5030 from sbwalker/dev
provides options to control caching for static assets
2025-01-28 14:30:13 -05:00
sbwalker
65f171f701 provides options to control caching for static assets 2025-01-28 14:29:58 -05:00
Shaun Walker
c4308c239c Merge pull request #5007 from RahulKaushik007/fix-static-file-caching
Fixes #5005: Add Browser Caching for Static Assets
2025-01-28 13:21:29 -05:00
Shaun Walker
2b6af3cb37 Merge pull request #5029 from sbwalker/dev
fix localization text
2025-01-28 13:18:32 -05:00
sbwalker
c5a16fbbc1 fix localization text 2025-01-28 13:18:18 -05:00
Shaun Walker
1db83f509b Merge pull request #5028 from sbwalker/dev
add caching support for folders
2025-01-28 12:47:37 -05:00
sbwalker
2a06304a2c add caching support for folders 2025-01-28 12:47:23 -05:00
Shaun Walker
7bbe684135 Merge pull request #5027 from sbwalker/dev
improve terminology consistency
2025-01-28 08:56:19 -05:00
sbwalker
a996a88fc4 improve terminology consistency 2025-01-28 08:56:05 -05:00
Shaun Walker
8cf9e7db51 Merge pull request #5026 from sbwalker/dev
add Fingerprint property to ModuleBase and ThemeBase
2025-01-28 08:44:01 -05:00
sbwalker
ed981c67b7 add Fingerprint property to ModuleBase and ThemeBase 2025-01-28 08:43:48 -05:00
Shaun Walker
6a77a0a5b9 Merge pull request #5025 from sbwalker/dev
improve terminology
2025-01-28 08:34:31 -05:00
sbwalker
bfb4b4431b improve terminology 2025-01-28 08:34:15 -05:00
Shaun Walker
3de44c0335 Merge pull request #5024 from sbwalker/dev
add ThemeState property to ThemeBase
2025-01-28 08:27:25 -05:00
sbwalker
37afd1aec9 add ThemeState property to ThemeBase 2025-01-28 08:27:10 -05:00
Shaun Walker
b2ac561673 Merge pull request #5021 from thabaum/update-package-dependencies-9.0.1
Fixes #5020: Updates package dependencies 9.0.1 (Latest)
2025-01-27 16:44:33 -05:00
Shaun Walker
c9bf7d9138 Merge pull request #5022 from sbwalker/dev
fix #5005 - adds versioning (ie. fingerprinting) for static assets - core, modules, and themes.
2025-01-27 16:35:07 -05:00
sbwalker
153a689bdb fix #5005 - adds versioning (ie. fingerprinting) for static assets - core, modules, and themes. 2025-01-27 16:34:47 -05:00
Cody
26b88f1a22 Update Package Dependencies to 9.0.1 2025-01-27 05:13:31 -08:00
Cody
c66a5d028f Update Package Dependencies to 9.0.1 2025-01-27 05:13:01 -08:00
Cody
8441c95a5c Update Package Dependencies to 9.0.1 2025-01-27 05:11:49 -08:00
Cody
e0e32b0199 Update Package Dependencies to 9.0.1 and 9.0.30 2025-01-27 05:09:19 -08:00
Cody
2bb76564e9 Update Package Dependencies to 9.0.1 2025-01-27 05:06:46 -08:00
Cody
86ec25d4de Update Package Dependencies to 9.0.1 2025-01-27 05:05:42 -08:00
Cody
ed9929963c Update Package Dependencies to 9.0.1 2025-01-27 05:04:34 -08:00
Cody
36f50118ac Update Package Dependencies to 9.0.1 2025-01-27 05:03:46 -08:00
Cody
72ddf27504 Update Package Dependency to 9.2.0 2025-01-27 05:03:03 -08:00
Cody
9bd36931ff Update Package Dependencies to 9.0.1 2025-01-27 05:02:10 -08:00
Cody
056ef7a3d5 Update Package Dependencies to 9.0.1 2025-01-27 05:00:08 -08:00
Shaun Walker
e483945d05 Merge pull request #5017 from sbwalker/dev
fix #5014 - page content scripts not loading on initial page request in Interactive rendering
2025-01-24 14:29:42 -05:00
sbwalker
7a9c637e03 fix #5014 - page content scripts not loading on initial page request in Interactive rendering 2025-01-24 14:29:23 -05:00
Shaun Walker
09ce543ea6 Merge pull request #5013 from sbwalker/dev
allow packages to be managed across installations
2025-01-23 09:08:16 -05:00
sbwalker
0ef24ebc3f allow packages to be managed across installations 2025-01-23 09:08:02 -05:00
Shaun Walker
a4419d3af6 Merge pull request #5011 from sbwalker/dev
remove GetButtonSize method
2025-01-22 07:43:38 -05:00
sbwalker
935983c02a remove GetButtonSize method 2025-01-22 07:43:23 -05:00
Shaun Walker
bd54ce5017 Merge pull request #4998 from leigh-pointer/ActionDialogSize
Update ActionDialog Add method to ensure consistent button sizing
2025-01-22 07:42:04 -05:00
Leigh Pointer
af6ed78b8e Update ActionDialog.razor 2025-01-22 07:57:52 +01:00
Leigh Pointer
f72438996d Merge remote-tracking branch 'upstream/dev' into ActionDialogSize 2025-01-22 07:36:01 +01:00
Shaun Walker
9db2a55a5a Merge pull request #5010 from sbwalker/dev
fix #4964 - use bearer token if it already exists
2025-01-21 16:55:19 -05:00
sbwalker
950d90badb fix #4964 - use bearer token if it already exists 2025-01-21 16:55:02 -05:00
Shaun Walker
1864d180af Merge pull request #5003 from sdi2121/patch-1
Update Oqtane.Server.csproj - MySQL deploy to Azure error
2025-01-21 15:58:44 -05:00
Shaun Walker
0e82e98382 Merge pull request #5006 from mdmontesinos/patch-1
FIX: File server MimeType not updated after image conversion
2025-01-21 15:58:33 -05:00
Shaun Walker
46023d35dc Merge pull request #5009 from sbwalker/dev
fix #4976 - manage hierarchical path updates and page deletion
2025-01-21 15:58:08 -05:00
sbwalker
90d2e0a40b fix #4976 - manage hierarchical path updates and page deletion 2025-01-21 15:57:48 -05:00
Shaun Walker
5f884e0796 Merge pull request #5008 from sbwalker/dev
fix #4965 - improve user/site management
2025-01-21 12:21:50 -05:00
sbwalker
16477052e2 fix #4965 - improve user/site management 2025-01-21 12:21:27 -05:00
RahulKaushik007
66a05603f7 Fix static file caching headers 2025-01-21 17:42:08 +05:30
RahulKaushik007
fe2a883386 Fix static file caching headers 2025-01-21 17:26:47 +05:30
David Montesinos
ca7fdaa125 FIX: File server MimeType not updated after image conversion 2025-01-20 12:17:22 +01:00
sdi2121
1283ec2008 Update Oqtane.Server.csproj
Fixes Azure manual deployment build from local code build. May need an additional fix in MySQL library (Line 24 - MySQLDatabase.cs)
2025-01-18 13:53:04 -05:00
Shaun Walker
d1f78f9048 Update LICENSE 2025-01-17 12:57:32 -05:00
Shaun Walker
45f43bfade Merge pull request #5002 from sbwalker/dev
update copyright year
2025-01-17 12:57:14 -05:00
sbwalker
4793ab4bc9 update copyright year 2025-01-17 12:56:59 -05:00
Shaun Walker
88b174dea8 Merge pull request #5001 from sbwalker/dev
remove unused method
2025-01-17 12:50:42 -05:00
sbwalker
06ca382bd7 remove unused method 2025-01-17 12:50:26 -05:00
Shaun Walker
b09175a8db Merge pull request #5000 from sbwalker/dev
allow entry of name during installation
2025-01-17 11:14:49 -05:00
sbwalker
677f68b08d allow entry of name during installation 2025-01-17 11:14:35 -05:00
Shaun Walker
8058b8dba4 Merge pull request #4999 from sbwalker/dev
improve error messages
2025-01-17 07:54:49 -05:00
sbwalker
4bc26f13c1 improve error messages 2025-01-17 07:54:34 -05:00
Leigh Pointer
e6cf77e724 Update ActionDialog Add method to ensure consistent button sizing
This PR introduces a new private method GetButtonSize() to enhance the consistency of button sizing within our UI. The method specifically checks for the presence of the "btn-sm" class in the Action Button's class list and applies the same sizing to the Cancel Button if found.
2025-01-17 13:34:16 +01:00
Shaun Walker
f8737c112e Merge pull request #4997 from sbwalker/dev
reload the script if data-reload is "always" or if the script has not been loaded previously and data-reload is "once" or "true"
2025-01-16 15:06:36 -05:00
sbwalker
74b72ed9d4 reload the script if data-reload is "always" or if the script has not been loaded previously and data-reload is "once" or "true" 2025-01-16 15:06:15 -05:00
Shaun Walker
4950391201 Merge pull request #4996 from sbwalker/dev
allow data-reload to support true or always
2025-01-16 14:22:06 -05:00
sbwalker
64a38d6e45 allow data-reload to support true or always 2025-01-16 14:21:52 -05:00
Shaun Walker
e2d8ee53f8 Merge pull request #4995 from sbwalker/dev
script reload improvements
2025-01-16 14:06:28 -05:00
sbwalker
0204ff8dd5 script reload improvements 2025-01-16 14:06:13 -05:00
Shaun Walker
4630ee6e93 Merge pull request #4992 from beolafsen/dev
Trim ModuleOwner and ModuleName before create
2025-01-16 12:29:00 -05:00
Shaun Walker
c4f2abf143 Merge pull request #4994 from sbwalker/dev
fix #4986 - allow Resources which have Reload specified to be used in Interactive rendering
2025-01-16 12:26:30 -05:00
sbwalker
e7444a0194 fix #4986 - allow Resources which have Reload specified to be used in Interactive rendering 2025-01-16 12:26:10 -05:00
Shaun Walker
ffed7305ed Merge pull request #4993 from sbwalker/dev
fix #4984 - path mapping for personalized pages
2025-01-16 09:25:43 -05:00
sbwalker
334054bcd4 fix #4984 - path mapping for personalized pages 2025-01-16 09:25:27 -05:00
beolafsen
5bb98eb5b2 Trim ModuleOwner and ModuleName before create 2025-01-16 09:32:18 +01:00
Shaun Walker
e842bd882a Merge pull request #4991 from sbwalker/dev
fix #4984 - redirect not working for personalized pages
2025-01-15 11:57:00 -05:00
sbwalker
74bfb46f73 fix #4984 - redirect not working for personalized pages 2025-01-15 11:56:44 -05:00
Shaun Walker
cd45bf4b70 Merge pull request #4989 from sbwalker/dev
fix #4984 - ensure personalized page path does not contain illegal characters
2025-01-14 15:43:00 -05:00
sbwalker
51600bbcb0 fix #4984 - ensure personalized page path does not contain illegal characters 2025-01-14 15:42:40 -05:00
Shaun Walker
8811a9bcaa Merge pull request #4988 from sbwalker/dev
introduce RemoveAssemblies() method in UpgradeManager
2025-01-14 08:43:38 -05:00
sbwalker
4521f8a774 introduce RemoveAssemblies() method in UpgradeManager 2025-01-14 08:43:23 -05:00
Shaun Walker
5b427783f8 Merge pull request #4987 from zyhfish/task/fix-4954
Fix #4954: use Pomelo.EntityFrameworkCore.MySql package.
2025-01-14 08:34:34 -05:00
Ben
9508983b15 Fix #4954: use Pomelo.EntityFrameworkCore.MySql package. 2025-01-14 19:58:56 +08:00
Shaun Walker
fd09912cd7 Merge pull request #4978 from beolafsen/dev
Issue #4977
2025-01-13 16:00:06 -05:00
Shaun Walker
01cc8584b6 Merge pull request #4968 from leigh-pointer/unused
Removed unused Using statements from the SiteTemplates
2025-01-13 15:56:39 -05:00
Shaun Walker
c0b104e7c8 Merge pull request #4962 from thabaum/prepare-6.0.2-update-dependencies
Fixes #4961 - Updates Oqtane version to 6.0.2 and update related project dependencies to latest.
2025-01-13 15:55:13 -05:00
Shaun Walker
9a82021a82 Merge pull request #4983 from sbwalker/dev
include option for external login to save tokens
2025-01-13 15:14:27 -05:00
sbwalker
1fb54a0b0f include option for external login to save tokens 2025-01-13 15:14:13 -05:00
Shaun Walker
aa5ea61638 Merge pull request #4982 from sbwalker/dev
improve filtering logic in UserRole API
2025-01-13 14:42:36 -05:00
sbwalker
a59ec0258b improve filtering logic in UserRole API 2025-01-13 14:42:19 -05:00
Shaun Walker
b403f5cf71 Merge pull request #4980 from sbwalker/dev
fix comment spelling
2025-01-13 07:50:21 -05:00
sbwalker
0ac6a62b86 fix comment spelling 2025-01-13 07:50:05 -05:00
Shaun Walker
ed3743d3b6 Merge pull request #4979 from sbwalker/dev
fix #4969 - improve feedback and flow when connection string points to an invalid database
2025-01-13 07:48:50 -05:00
sbwalker
3468cba000 fix #4969 - improve feedback and flow when connection string points to an invalid database 2025-01-13 07:48:30 -05:00
beolafsen
5a4cdc5354 Issue #4977 2025-01-13 07:31:35 +01:00
Leigh Pointer
af4e19a57e Removed unused Using statements from the SiteTemplates 2025-01-07 04:14:31 +01:00
Cody
26bb743679 Prepare 6.0.2 2024-12-31 10:37:27 -08:00
Cody
96cc726e22 Prepare 6.0.2 2024-12-31 10:35:00 -08:00
Cody
f4b00b01d0 Prepare 6.0.2 2024-12-31 10:34:21 -08:00
Cody
127b2ca86d Prepare 6.0.2 2024-12-31 10:32:09 -08:00
Cody
4b8b93e1b8 Prepare 6.0.2 2024-12-31 10:31:47 -08:00
Cody
3aea412fe9 Prepare 6.0.2 2024-12-31 10:31:23 -08:00
Cody
2aef96ad4f Prepare 6.0.2 2024-12-31 10:29:52 -08:00
Cody
ec0a77230c Prepare 6.0.2 2024-12-31 10:29:32 -08:00
Cody
b35e4bddd0 Prepare 6.0.2 2024-12-31 10:28:48 -08:00
Cody
aa32beb341 Update Oqtane.Shared.csproj 2024-12-31 10:28:32 -08:00
Cody
efafe89b42 Prepare 6.0.2 2024-12-31 10:26:45 -08:00
Cody
5ef2e49d9c Prepare 6.0.2 2024-12-31 10:25:34 -08:00
Cody
1cfbf61a30 Prepare 6.0.2 2024-12-31 10:23:15 -08:00
Cody
2bb5494b84 Prepare 6.0.2 2024-12-31 10:22:10 -08:00
Cody
e8a41ccb47 Prepare 6.0.2 2024-12-31 10:21:10 -08:00
Cody
7184f7f635 Prepare 6.0.2 and update package dependencies 2024-12-31 10:20:13 -08:00
Cody
cc5727b7fa Prepare 6.0.2 and update package dependencies 2024-12-31 10:16:35 -08:00
Shaun Walker
7f3d6ef6a5 Merge pull request #4959 from sbwalker/dev
fix #4957 - unable to login after password reset
2024-12-31 08:18:14 -05:00
sbwalker
44ce68097b fix #4957 - unable to login after password reset 2024-12-31 08:17:58 -05:00
Shaun Walker
d976cc6c19 Update SECURITY.md 2024-12-25 10:04:25 -05:00
Shaun Walker
d19d7d2a43 Merge pull request #4948 from zyhfish/task/fix-4947
Fix #4947: check the 2FA settings.
2024-12-24 08:46:43 -05:00
Shaun Walker
9bfaa02f97 Merge pull request #4953 from sbwalker/dev
add back System.Text.Json to Shared project (#4929)
2024-12-23 14:48:10 -05:00
sbwalker
2d9396b245 add back System.Text.Json to Shared project (#4929) 2024-12-23 14:47:17 -05:00
Shaun Walker
56e0da64ee Merge pull request #4952 from sbwalker/dev
updated default module template to use Service consistently
2024-12-23 14:10:07 -05:00
sbwalker
997e9213f2 updated default module template to use Service consistently 2024-12-23 14:09:54 -05:00
Shaun Walker
366569a23b Merge pull request #4951 from sbwalker/dev
update package references
2024-12-23 11:24:38 -05:00
sbwalker
36d5747b4f update package references 2024-12-23 11:24:24 -05:00
Shaun Walker
ea026c726c Merge pull request #4950 from sbwalker/dev
remove unnecessary reference to System.Text.Json in Shared project
2024-12-23 11:16:49 -05:00
sbwalker
1e71e32c74 remove unnecessary reference to System.Text.Json in Shared project 2024-12-23 11:16:34 -05:00
Shaun Walker
ed729bbd4f Merge pull request #4949 from sbwalker/dev
fix #4946 - allow administrators to access user roles via API
2024-12-23 09:27:04 -05:00
sbwalker
1a925221b7 fix #4946 - allow administrators to access user roles via API 2024-12-23 09:26:50 -05:00
Ben
af7b4db062 Fix #4947: check the 2FA settings. 2024-12-23 22:10:51 +08:00
Shaun Walker
cfefe35e3f Update README.md 2024-12-20 16:56:05 -05:00
Shaun Walker
8d7845a44d Merge pull request #4944 from oqtane/master
6.0.1 Release
2024-12-20 16:52:31 -05:00
Shaun Walker
3a15e6e5e9 Merge pull request #4943 from oqtane/dev
6.0.1 Release
2024-12-20 16:52:10 -05:00
Shaun Walker
3b8a51e855 Merge pull request #4942 from sbwalker/dev
fix reload script to use static array rather than a live HtmlCollection
2024-12-20 15:39:50 -05:00
sbwalker
f2cb34cc35 fix reload script to use static array rather than a live HtmlCollection 2024-12-20 15:39:35 -05:00
Shaun Walker
723ce62a34 Merge pull request #4940 from sbwalker/dev
write upgrade errors to log rather than console
2024-12-20 14:38:34 -05:00
sbwalker
2c9a2ea021 write upgrade errors to log rather than console 2024-12-20 14:38:21 -05:00
Shaun Walker
2be008d6d1 Merge pull request #4939 from sbwalker/dev
fix compilation issues in PR #4782
2024-12-20 12:36:24 -05:00
sbwalker
7fb51bdd0a fix compilation issues in PR #4782 2024-12-20 12:36:10 -05:00
Shaun Walker
abdbe3694f Merge pull request #4782 from thabaum/edit-add-page-scrolltotoppage-error
Fixes #4781: Adds Edit + Add Page ScrollToTopPage() On Settings Tab Form Error Messages
2024-12-20 12:26:55 -05:00
Shaun Walker
bd87e5012f Merge pull request #4938 from sbwalker/dev
fix documentation
2024-12-20 11:55:50 -05:00
sbwalker
55e18f2364 fix documentation 2024-12-20 11:55:35 -05:00
Shaun Walker
655e84072d Merge pull request #4937 from sbwalker/dev
use CompressionEnabled switch to disable static asset compression during publish - eliminates need to cleanup files manually in release.cmd
2024-12-20 11:46:52 -05:00
sbwalker
ab5409d5b6 use CompressionEnabled switch to disable static asset compression during publish - eliminates need to cleanup files manually in release.cmd 2024-12-20 11:46:30 -05:00
Shaun Walker
5a5da6486c Merge pull request #4933 from sbwalker/dev
remove *.br, *.gz files from wwwroot content folders in published release (as MapStaticAssets is not enabled)
2024-12-19 19:56:36 -05:00
sbwalker
7e99252429 remove *.br, *.gz files from wwwroot content folders in published release (as MapStaticAssets is not enabled) 2024-12-19 19:56:13 -05:00
Shaun Walker
10e0dcef8b Merge pull request #4931 from sbwalker/dev
ensure Pages collection is always returned in the same order by moving GetPagesHierarchy method to the repository
2024-12-19 14:45:34 -05:00
sbwalker
80c8433aad ensure Pages collection is always returned in the same order by moving GetPagesHierarchy method to the repository. 2024-12-19 14:45:12 -05:00
Shaun Walker
5b0ae372f8 Merge pull request #4930 from sbwalker/dev
add support for data-reload=false attribute in Interactive rendering
2024-12-19 13:04:59 -05:00
sbwalker
b5a1b529ab add support for data-reload=false attribute in Interactive rendering 2024-12-19 13:04:43 -05:00
Shaun Walker
af821dcd9a Merge pull request #4914 from leigh-pointer/userSettings
User Profile Update: Utilizing User Settings Object
2024-12-18 15:27:34 -05:00
Shaun Walker
10d3c81520 Merge pull request #4918 from leigh-pointer/ProjectNameTemplates
Implement Dynamic ProjectName Parameter Across Build Process
2024-12-18 15:27:24 -05:00
Shaun Walker
e3811b453a Merge pull request #4927 from sbwalker/dev
Improvements to add support for script type and data-* attributes. Also added Script and Stylesheet classes to simplify Resource declarations.
2024-12-18 15:16:16 -05:00
sbwalker
ca0fb05baa Improvements to add support for script type and data-* attributes. Also added Script and Stylesheet classes to simplify Resource declarations. 2024-12-18 15:15:54 -05:00
Shaun Walker
2b4b01bf6e Merge pull request #4926 from sbwalker/dev
always render page-script elements in body
2024-12-18 11:56:18 -05:00
sbwalker
3a1244bddc always render page-script elements in body 2024-12-18 11:56:03 -05:00
Shaun Walker
b8fd922b19 Merge pull request #4925 from sbwalker/dev
improve reload script to replicate all attributes
2024-12-18 10:32:12 -05:00
sbwalker
03f856025e improve reload script to replicate all attributes 2024-12-18 10:31:59 -05:00
Shaun Walker
45f04d24c3 Merge pull request #4924 from sbwalker/dev
refactor Static Blazor script processing
2024-12-18 10:09:20 -05:00
sbwalker
2435d610c7 refactor Static Blazor script processing 2024-12-18 10:09:02 -05:00
Shaun Walker
06572bcd14 Merge pull request #4922 from sbwalker/dev
page-script optimization
2024-12-17 14:57:17 -05:00
sbwalker
3fab79afc0 page-script optimization 2024-12-17 14:57:01 -05:00
Shaun Walker
2b7dd3fed5 Merge pull request #4921 from sbwalker/dev
render page-script elements at end of head content
2024-12-17 12:31:40 -05:00
sbwalker
d65efed032 render page-script elements at end of head content 2024-12-17 12:31:26 -05:00
Shaun Walker
c6896ea936 Merge pull request #4920 from sbwalker/dev
fix page-script to support type attribute on inline scripts
2024-12-17 09:13:42 -05:00
sbwalker
b7a41bddec fix page-script to support type attribute on inline scripts 2024-12-17 09:13:26 -05:00
Shaun Walker
6fd80c3737 Merge pull request #4919 from sbwalker/dev
page-script improvements
2024-12-17 08:34:55 -05:00
sbwalker
0aa690b3b1 page-script improvements 2024-12-17 08:34:39 -05:00
Leigh Pointer
6d5bcfc6ed Implement Dynamic ProjectName Parameter Across Build Process
This pull request introduces a dynamic ProjectName parameter across our build process, enhancing flexibility and reducing hardcoding in our module and theme development workflow. The changes affect the project file, NuSpec file, command scripts.
2024-12-17 10:35:14 +01:00
Shaun Walker
b60de69fa5 Merge pull request #4917 from sbwalker/dev
improvements to page-script
2024-12-16 12:44:23 -05:00
sbwalker
d991b57d08 improvements to page-script 2024-12-16 12:44:07 -05:00
Leigh Pointer
1133d7fcba User Profile Update: Utilizing User Settings Object
This pull request updates the User Profile implementation to utilize the existing User Settings object on the user object. While the current implementation is functional, this change offers several benefits:
Improved code consistency
Better guidance for developers accessing User Settings
Alignment with the framework's best practices
2024-12-14 11:09:54 +01:00
Shaun Walker
6fbf0383bb Merge pull request #4911 from leigh-pointer/FixGlow
This is a cosmetic fix to the Oqtane Glow image
2024-12-13 16:46:49 -05:00
Shaun Walker
0296230219 Merge pull request #4913 from sbwalker/dev
page-script enhancements
2024-12-13 16:46:23 -05:00
sbwalker
dedfbba27a page-script enhancements 2024-12-13 16:46:08 -05:00
Leigh Pointer
dc5441da07 This is a cosmetic fix to the Oqtane Glow image
The glow on the original is cropped at the left by a few pixcels.  This update fixes that and sizes the image to a 600 x 150
2024-12-13 11:45:13 +01:00
Shaun Walker
585648b7f3 Merge pull request #4907 from leigh-pointer/ProfileMaxLength
FIX for #4906 Profile Field does not allow max length
2024-12-10 09:12:52 -05:00
Leigh Pointer
cd0ee1c26d FIX for #4906 Profile Field does not allow max length
This update applies the maxlength attribute fix to all input and textarea elements. The maxlength attribute will only be added if p.MaxLength is greater than 0, allowing unlimited characters when it's 0 or less.
2024-12-10 09:25:01 +01:00
Shaun Walker
d7a7be5af4 Merge pull request #4904 from sbwalker/dev
add sync events for user login/logout
2024-12-09 10:55:55 -05:00
sbwalker
13e4267c11 add sync events for user login/logout 2024-12-09 10:55:40 -05:00
Shaun Walker
15bc47e3e8 Merge pull request #4898 from leigh-pointer/TemplateParam
Implement Dynamic TargetFramework in Debug Scripts #4897
2024-12-09 07:36:00 -05:00
Leigh Pointer
1a4380dcd7 Variable update 2024-12-07 15:02:27 +01:00
Leigh Pointer
5ace34b5cd Add the $TargetFramework macro to the Release Builds
Add the $TargetFramework macro to the Release Builds
2024-12-06 13:37:37 +01:00
Leigh Pointer
f010c0f1fa Implement Dynamic TargetFramework in Debug Scripts #4897
This PR updates our debug scripts (both .cmd and .sh) to dynamically use the current TargetFramework passed from the build process. This change improves flexibility and future-proofs our build process for different .NET versions.
2024-12-05 12:43:38 +01:00
Shaun Walker
2c721ad5dd Merge pull request #4895 from tvatavuk/enh-4883-control-panel
Add ShowEditMode parameter to ControlPanel to allow hiding the Edit Mode toggle button
2024-12-04 08:25:17 -05:00
Shaun Walker
8a7c2ce2c2 Merge pull request #4894 from W6HBR/dev
Fix #4885 - Pass userid as int to GetUser for JWT authentication
2024-12-04 08:24:27 -05:00
Tonći Vatavuk
b2a7b813de Remove redundant IServiceProvider injection 2024-12-04 09:39:02 +01:00
Tonći Vatavuk
e85cf04b99 Fix #4883: Add ShowEditMode parameter to ControlPanel to allow hiding the Edit Mode toggle button 2024-12-04 09:37:21 +01:00
Jon Welfringer
ab6fa48172 Fix #4885 - Pass userid as int to GetUser for JWT authentication 2024-12-03 10:34:44 -08:00
Shaun Walker
c81905882f Merge pull request #4881 from sbwalker/dev
improve security of UserRole API
2024-11-27 14:59:41 -05:00
sbwalker
f0d31c1114 improve security of UserRole API 2024-11-27 14:59:25 -05:00
Shaun Walker
497b255216 Merge pull request #4880 from sbwalker/dev
User Settings should only be accessible to individual users or administrators
2024-11-27 13:16:04 -05:00
sbwalker
d96286d771 User Settings should only be accessible to individual users or administrators 2024-11-27 13:15:43 -05:00
Shaun Walker
2441647d75 Merge pull request #4879 from sbwalker/dev
update EFCore.NamingConventions to .NET 9 package version
2024-11-27 13:06:53 -05:00
sbwalker
77b780d631 update EFCore.NamingConventions to .NET 9 package version 2024-11-27 13:06:37 -05:00
Shaun Walker
cdd03bf3d4 Merge pull request #4878 from sbwalker/dev
User Settings should only be accessible to individual users or administrators
2024-11-27 13:04:27 -05:00
sbwalker
e786c35f7d User Settings should only be accessible to individual users or administrators 2024-11-27 13:04:06 -05:00
Shaun Walker
e83399acb1 Merge pull request #4876 from sbwalker/dev
prevent notifications from being accessed by other users
2024-11-26 14:30:55 -05:00
sbwalker
ffea9e3210 prevent notifications from being accessed by other users 2024-11-26 14:30:41 -05:00
Shaun Walker
f71a3a1ce3 Merge pull request #4875 from oqtane/revert-4828-TabChange
Revert "Fix for Tabpanel is not updating the UI. #4778"
2024-11-26 13:36:18 -05:00
Shaun Walker
a5ccc23604 Revert "Fix for Tabpanel is not updating the UI. #4778" 2024-11-26 13:36:05 -05:00
Shaun Walker
1ed4c8a094 Merge pull request #4874 from oqtane/revert-4871-HTMLTabError
Revert "Rework for Tabstrip regression issue"
2024-11-26 13:35:37 -05:00
Shaun Walker
4a74549c1b Revert "Rework for Tabstrip regression issue" 2024-11-26 13:35:21 -05:00
Shaun Walker
a499cfb98f Merge pull request #4871 from leigh-pointer/HTMLTabError
Rework for Tabstrip regression issue
2024-11-26 11:27:52 -05:00
Shaun Walker
01038c8296 Merge pull request #4873 from sbwalker/dev
include SECURITY.md
2024-11-26 11:25:35 -05:00
sbwalker
7407f79b3d include SECURITY.md 2024-11-26 11:25:23 -05:00
Leigh Pointer
a845dd1976 Rework for Tabstrip regression issue
Fix for Tabpanel is not updating the UI. #4778 #4828
2024-11-26 15:39:51 +01:00
Leigh Pointer
9d7549da70 Reverted TabStrip and Panel 2024-11-26 10:33:18 +01:00
Shaun Walker
f5cc61384f Merge pull request #4870 from sbwalker/dev
reference Quill CSS theme using BaseUrl so that it works in .NET MAUI as well as web
2024-11-25 14:20:15 -05:00
sbwalker
844778d36a reference Quill CSS theme using BaseUrl so that it works in .NET MAUI as well as web 2024-11-25 14:19:58 -05:00
Shaun Walker
871b0a274e Merge pull request #4869 from sbwalker/dev
improve message grammar
2024-11-25 13:48:41 -05:00
sbwalker
737740a3ca improve message grammar 2024-11-25 13:48:28 -05:00
Shaun Walker
ae8d600600 Update README.md 2024-11-25 09:11:12 -05:00
Shaun Walker
2f1691bfb0 Update README.md 2024-11-25 09:10:20 -05:00
Shaun Walker
a3d25f91c8 Update README.md 2024-11-25 09:09:52 -05:00
Shaun Walker
ff84b50817 Update README.md 2024-11-25 09:09:13 -05:00
Shaun Walker
0be8242284 Merge pull request #4862 from leigh-pointer/SettingsSetTabOnSave
Updated the Module Settings to use the new ActiveTab parameter
2024-11-25 08:39:45 -05:00
Shaun Walker
e25a6259ea Merge pull request #4861 from zyhfish/task/fix-4841
Fix #4841: force 2FA validation when it's required in site level.
2024-11-25 08:39:26 -05:00
Leigh Pointer
1578f82efb Updated the Module Settings to use the new ActiveTab parameter 2024-11-23 11:42:22 +01:00
Ben
b5f75f0c5e Fix #4841: force 2FA validation when it's required in site level. 2024-11-23 13:04:27 +08:00
Shaun Walker
601caab3b6 Merge pull request #4860 from sbwalker/dev
fix #4760 - display update confirmation message in Site Settings
2024-11-22 16:34:46 -05:00
sbwalker
6d3092f440 fix #4760 - display update confirmation message in Site Settings 2024-11-22 16:34:35 -05:00
Shaun Walker
ef27937c7a Merge pull request #4785 from thabaum/refactored-heading-ifelse
Fixes #4784: Refactor TabPanel Heading Assignment Logic
2024-11-22 15:34:51 -05:00
Shaun Walker
f4a7b79c4f Merge pull request #4828 from leigh-pointer/TabChange
Fix for Tabpanel is not updating the UI. #4778
2024-11-22 15:30:51 -05:00
Shaun Walker
2531776a48 Merge pull request #4859 from sbwalker/dev
prepare for 6.0.1
2024-11-22 12:29:56 -05:00
sbwalker
ced80419aa prepare for 6.0.1 2024-11-22 12:29:44 -05:00
Shaun Walker
ad2816f4e8 Merge pull request #4858 from sbwalker/dev
fix #4848 - remove assemblies from /bin which have been moved to /bin/refs in .NET 9
2024-11-22 12:14:04 -05:00
sbwalker
3528b8c674 fix #4848 - remove assemblies from /bin which have been moved to /bin/refs in .NET 9 2024-11-22 12:13:45 -05:00
Shaun Walker
80c83c626d Merge pull request #4853 from leigh-pointer/PagerAlignment
Fix for #4852 align the Page numbers container
2024-11-22 11:56:12 -05:00
Shaun Walker
6a355f2aea Merge pull request #4857 from sbwalker/dev
fix #4855 - dropping required column causes issue on SQLite
2024-11-22 11:55:56 -05:00
sbwalker
7d94e4a53a fix #4855 - dropping required column causes issue on SQLite 2024-11-22 11:55:43 -05:00
Shaun Walker
823c04742e Merge pull request #4854 from sbwalker/dev
resolve .NET version issue in nuspec files
2024-11-21 10:54:06 -05:00
sbwalker
043fb1abd1 resolve .NET version issue in nuspec files 2024-11-21 10:53:52 -05:00
Leigh Pointer
f01e85b690 Fix for #4852 align the Page numbers container 2024-11-21 16:05:32 +01:00
Shaun Walker
7eb1298847 Merge pull request #4847 from sbwalker/dev
do not include Oqtane.Server.staticwebassets.endpoints.json in release packages
2024-11-19 13:50:05 -05:00
sbwalker
a5480c9a96 do not include Oqtane.Server.staticwebassets.endpoints.json in release packages 2024-11-19 13:49:45 -05:00
Shaun Walker
f948600e86 Merge pull request #4845 from sbwalker/dev
fix 2 factor authentication email
2024-11-18 15:04:01 -05:00
sbwalker
420182b9bf fix 2 factor authentication email 2024-11-18 15:03:48 -05:00
Shaun Walker
8c430ce1a6 Merge pull request #4837 from Trifoia/4803-Add-a-CONTRIBUTING.md
4803 add a contributing.md
2024-11-15 15:02:28 -05:00
Mark Davis
d3717dbe19 Remove DefaultDBType value and InstallationId from appsettings.json
The commit removes the value for DefaultDBType and InstallationId from the appsettings.json file.
2024-11-15 10:31:49 -08:00
Mark Davis
caa83d769f Create CONTRIBUTING.md 2024-11-15 10:27:53 -08:00
Mark Davis
365f87828f Merge remote-tracking branch 'oqtane/dev' into dev 2024-11-15 09:52:50 -08:00
Shaun Walker
f780887866 Update README.md 2024-11-14 15:46:26 -05:00
Shaun Walker
43627d4bb8 Merge pull request #4832 from oqtane/master
6.0.0 release
2024-11-14 15:40:38 -05:00
Shaun Walker
5d7b276cd1 Merge pull request #4831 from oqtane/dev
6.0.0 release
2024-11-14 15:40:17 -05:00
Shaun Walker
23597eb997 Merge pull request #4827 from leigh-pointer/Search-4824
Fix: for Disabling search does not hide search icon #4824
2024-11-14 07:54:52 -05:00
Shaun Walker
b6948367f8 Merge pull request #4826 from leigh-pointer/swash
Swashbuckle.AspNetCore updated to 7.0
2024-11-14 07:52:49 -05:00
Leigh Pointer
db6dd5abee Fix for TabPanel is not updating the UI. #4778
Modified that TabStrip and TabPane, now when the ActiveTab is changed the TabPanel is selected
2024-11-14 10:35:15 +01:00
Leigh Pointer
702eb9e466 Revert "Fix for Page Management tab panel is not updating the UI. #4778"
This reverts commit 3c99006226.
2024-11-14 10:33:10 +01:00
Leigh Pointer
3c99006226 Fix for Page Management tab panel is not updating the UI. #4778 2024-11-14 10:31:53 +01:00
Leigh Pointer
aaaf5683a5 Fix: "Search_Enabled" was being saved as Private so unauthorized users can not access this value. 2024-11-14 09:50:05 +01:00
Leigh Pointer
92aa2236c0 Swashbuckle.AspNetCore updated to 7.0 2024-11-14 09:16:55 +01:00
Shaun Walker
d2592f72d6 Merge pull request #4825 from sbwalker/dev
modifications to get .NET MAUI working on .NET 9 official release
2024-11-13 20:37:24 -05:00
sbwalker
27120d6cc9 modifications to get .NET MAUI working on .NET 9 official release 2024-11-13 20:37:10 -05:00
Shaun Walker
a2669d35c3 Merge pull request #4823 from sbwalker/dev
exclude wwwroot/_content from official release build
2024-11-13 14:14:47 -05:00
sbwalker
574164081b exclude wwwroot/_content from official release build 2024-11-13 14:14:35 -05:00
Shaun Walker
00c2f8dcd8 Merge pull request #4822 from sbwalker/dev
adjust gitignore to exclude wwwroot/_content subfolders
2024-11-13 13:52:08 -05:00
sbwalker
0202bf60e5 adjust gitignore to exclude wwwroot/_content subfolders 2024-11-13 13:51:54 -05:00
Shaun Walker
16436a171b Merge pull request #4821 from zyhfish/task/fix-build-error
add reference to Microsoft.EntityFrameworkCore package.
2024-11-13 10:10:19 -05:00
Ben
4cf4e0eabd add reference to Microsoft.EntityFrameworkCore package. 2024-11-13 23:06:43 +08:00
Shaun Walker
5edb98dfb4 Merge pull request #4818 from sbwalker/dev
update PostgreSQL provider to official .NET 9 release
2024-11-12 15:50:27 -05:00
sbwalker
899bf22e15 update PostgreSQL provider to official .NET 9 release 2024-11-12 15:50:13 -05:00
Shaun Walker
9a33167a6c Merge pull request #4817 from sbwalker/dev
Update to official .NET 9 release
2024-11-12 15:43:42 -05:00
sbwalker
2dc068aa21 upgrade to official .NET 9 release 2024-11-12 15:42:57 -05:00
sbwalker
0f2aa4d2e1 update to official .NET 9 release 2024-11-12 15:40:54 -05:00
Shaun Walker
a699f5c7bc Merge pull request #4815 from mdmontesinos/dev
Fix: Accesibility issue for Search Button
2024-11-12 15:08:23 -05:00
David Montesinos
ab807de3c0 Fix: Accesibility issue for Search Button
The search button in Search component does not have the aria-label.
2024-11-12 17:15:56 +01:00
Shaun Walker
68514bcb36 Merge pull request #4813 from sbwalker/dev
use HttpClient rather than IHttpClientFactory as IHttpClientFactory does not pass cookies in .NET MAUI
2024-11-11 08:15:14 -05:00
sbwalker
422bf8da59 use HttpClient rather than IHttpClientFactory as IHttpClientFactory does not pass cookies in .NET MAUI 2024-11-11 08:14:53 -05:00
Shaun Walker
de92dc93dd Merge pull request #4811 from sbwalker/dev
resolved issue when setting initial culture cookie
2024-11-08 15:41:36 -05:00
sbwalker
5a91b143b6 resolved issue when setting initial culture cookie 2024-11-08 15:41:24 -05:00
Shaun Walker
c745e85706 Merge pull request #4810 from sbwalker/dev
make indexing of Files opt-in rather than opt-out
2024-11-08 15:16:45 -05:00
sbwalker
0f698e0c50 make indexing of Files opt-in rather than opt-out 2024-11-08 15:16:32 -05:00
Shaun Walker
cd16d77bf0 Merge pull request #4809 from sbwalker/dev
Added defensive logic to File Indexer for scenarios where file does not exist on disk. Added ability to reset the search index prior to reindexing.
2024-11-07 17:05:48 -05:00
sbwalker
fdbdd0ef4c Added defensive logic to File Indexer for scenarios where file does not exist on disk. Added ability to reset the search index prior to reindexing. 2024-11-07 17:05:28 -05:00
Shaun Walker
71485f4a82 Merge pull request #4808 from sbwalker/dev
fix compilation warning
2024-11-07 15:45:47 -05:00
sbwalker
013056a6e5 fix compilation warning 2024-11-07 15:45:34 -05:00
Shaun Walker
263498fbdc Merge pull request #4807 from sbwalker/dev
remove icrosoft.AspNetCore.Localization from .NET MAUI project
2024-11-07 12:38:31 -05:00
sbwalker
f46ac2c007 remove icrosoft.AspNetCore.Localization from .NET MAUI project 2024-11-07 12:38:16 -05:00
Shaun Walker
c23841b6db Merge pull request #4806 from sbwalker/dev
default Description to Module Name if not specified in Module Creator
2024-11-07 11:53:15 -05:00
sbwalker
18b1b5fca5 default Description to Module Name if not specified in Module Creator 2024-11-07 11:52:53 -05:00
Shaun Walker
6707ac2697 Merge pull request #4802 from sbwalker/dev
remove custom JavaScript reconnection script for SignalR
2024-11-05 11:30:32 -05:00
sbwalker
d85a2fc8ce remove custom JavaScript reconnection script for SignalR 2024-11-05 11:30:18 -05:00
Shaun Walker
a8997e8f17 Merge pull request #4800 from sbwalker/dev
fix #4795 - ensure deterministic ordering of file parts when merging files after upload (credit @HQuast)
2024-11-04 15:29:16 -05:00
sbwalker
c8a22d9537 fix #4795 - ensure deterministic ordering of file parts when merging files after upload (credit @HQuast) 2024-11-04 15:28:59 -05:00
Shaun Walker
910669f786 Merge pull request #4793 from thabaum/patch-12
Fixes #4792: Update Oqtane.Server.csproj Package Dependencies
2024-11-01 15:40:14 -04:00
Cody
89312c6796 Update Oqtane.Server.csproj Package Dependencies 2024-10-30 18:43:42 -07:00
Shaun Walker
a6aa96fdb0 Merge pull request #4786 from sbwalker/dev
fix #4770 - set a default value for PrincipalSchema to ensure backward compatibility
2024-10-24 17:08:42 -04:00
sbwalker
7deb0b06af fix #4770 - set a default value for PrincipalSchema to ensure backward compatibility 2024-10-24 17:08:25 -04:00
Cody
784f3771b3 Remove Blank Page Specific Error Message 2024-10-24 13:22:08 -07:00
Cody
80316824f7 Remove Blank Page Specific Error Message 2024-10-24 13:21:40 -07:00
Cody
cbaebb7b7c Remove Blank Page Specific Error Message 2024-10-24 13:21:15 -07:00
Cody
97d3764b6e Remove Blank Page Specific Error Message 2024-10-24 13:20:52 -07:00
Shaun Walker
002f8117cb Merge pull request #4783 from sbwalker/dev
get language using CookieRequestCultureProvider
2024-10-24 15:48:28 -04:00
sbwalker
0dfdb12431 get language using CookieRequestCultureProvider 2024-10-24 15:48:14 -04:00
Cody
d77e898929 Refactor TabPanel Heading Assignment Logic
- Simplified the logic for setting the Heading property in the TabPanel component.
- Replaced the if-else statement with a ternary operator for improved readability and maintainability.
- Ensured that the functionality remains unchanged and verified correct assignment of headings.
2024-10-24 12:43:20 -07:00
Cody
4c937be884 Clarify Page Name Required Message 2024-10-24 12:38:51 -07:00
Cody
c25cce4398 Clarify Page Name Required Message 2024-10-24 12:38:16 -07:00
Cody
58c422285a Adds Message.Required.PageName 2024-10-24 12:28:17 -07:00
Cody
f2f22f35e8 Adds Message.Required.PageName 2024-10-24 12:26:36 -07:00
Cody
15867a7807 Adds await ScrollToPageTop(); to error messages + Page Name Error Message 2024-10-24 12:23:29 -07:00
Shaun Walker
22e3161a9b Merge pull request #4780 from sbwalker/dev
remove Microsoft.AspNetCore.Localization from default module template
2024-10-24 15:20:20 -04:00
sbwalker
b0c8203b24 remove Microsoft.AspNetCore.Localization from default module template 2024-10-24 15:20:07 -04:00
Cody
e2c404d8bb Adds await ScrollToPageTop(); to error messages + Page Name Error Message
- Adds await ScrollToPageTop(); to error messages
- Adds Blank Page Name Error Message
2024-10-24 12:18:30 -07:00
Shaun Walker
5ee1731c92 Merge pull request #4777 from thabaum/update-html-agility-pack-1.11.69
Fixes #4776: Updates HtmlAgilityPack to 1.11.69
2024-10-24 15:12:17 -04:00
Shaun Walker
06e8d3b660 Merge pull request #4779 from sbwalker/dev
remove Microsoft.AspNetCore.Http
2024-10-24 15:11:07 -04:00
sbwalker
f09709aedb remove Microsoft.AspNetCore.Http 2024-10-24 15:10:52 -04:00
Cody
598d5decac Update HtmlAgilityPack to 1.11.69 2024-10-24 10:18:24 -07:00
Shaun Walker
7832a6053e Merge pull request #4775 from sbwalker/dev
remove some dependencies on Microsoft.AspNetCore.Http
2024-10-24 13:16:21 -04:00
sbwalker
588748230e remove some dependencies on Microsoft.AspNetCore.Http 2024-10-24 13:16:08 -04:00
Shaun Walker
8668165c72 Merge pull request #4774 from sbwalker/dev
remove Microsoft.AspNetCore.Localization
2024-10-24 12:25:04 -04:00
sbwalker
a967332f89 remove Microsoft.AspNetCore.Localization 2024-10-24 12:24:46 -04:00
Shaun Walker
6719d242bd Merge pull request #4756 from zyhfish/task/fix-4752
Fix #4752: validate the username and email.
2024-10-24 09:53:24 -04:00
Ben
3565185808 update the error message. 2024-10-24 20:13:43 +08:00
Ben
ce51262197 update the code to use simple validation. 2024-10-24 20:04:18 +08:00
Shaun Walker
992a786c2b Merge pull request #4763 from thabaum/ScrollTo-interop-modal
Fixes #4762: Adds logic ScrollTo interop.js method detecting if method is executed inside a modal
2024-10-22 16:28:45 -04:00
Shaun Walker
038df95aa0 Merge pull request #4759 from thabaum/scroll-to-top-user-settings
Scroll to top after saving settings - Fixes #4758
2024-10-22 16:28:33 -04:00
Shaun Walker
4ebd660de2 Merge pull request #4766 from sbwalker/dev
resolve compiler warning in .NET MAUI
2024-10-21 15:42:08 -04:00
sbwalker
a9ea41a488 resolve compiler warning in .NET MAUI 2024-10-21 15:41:57 -04:00
Shaun Walker
196594b490 Merge pull request #4765 from sbwalker/dev
update MAUI project to .NET 9 RC2
2024-10-21 15:34:34 -04:00
sbwalker
1516d5af10 update MAUI project to .NET 9 RC2 2024-10-21 15:34:22 -04:00
Shaun Walker
ffcd1595a9 Merge pull request #4764 from sbwalker/dev
update Updater to .NET 9
2024-10-21 15:25:27 -04:00
sbwalker
42e5c6e111 update Updater to .NET 9 2024-10-21 15:25:14 -04:00
Cody
8a9651dc50 Adds logic for .modal class ScrollTo function 2024-10-21 12:22:01 -07:00
Shaun Walker
4be2f4f2d9 Update README.md 2024-10-21 15:21:29 -04:00
Cody
369bf7a235 Adds logic for .modal class ScrollTo function
fixes #4762
2024-10-21 12:20:24 -07:00
Shaun Walker
136545b404 Merge pull request #4761 from sbwalker/dev
changes to migrate Oqtane to .NET 9 and version 6.0.0
2024-10-21 14:51:38 -04:00
sbwalker
73ea17ae0f changes to migrate Oqtane to .NET 9 and version 6.0.0 2024-10-21 14:51:20 -04:00
Cody
23010acef4 Scroll to top after saving settings - Fixes #4758 2024-10-21 10:36:12 -07:00
Ben
4f74962ce2 Fix #4752: validate the username and email. 2024-10-21 23:11:57 +08:00
Shaun Walker
7f978c7845 Update README.md 2024-10-17 13:52:21 -04:00
Shaun Walker
731fd46ea2 Merge pull request #4747 from oqtane/master
5.2.4 release
2024-10-17 13:46:40 -04:00
Shaun Walker
859759d691 Merge pull request #4746 from oqtane/dev
5.2.4 release
2024-10-17 13:46:22 -04:00
Shaun Walker
5e9567158f Merge pull request #4744 from sbwalker/dev
add additional external login providers
2024-10-16 08:35:14 -04:00
sbwalker
51d244f3aa add additional external login providers 2024-10-16 08:35:01 -04:00
Shaun Walker
4c5a07edd5 Merge pull request #4743 from sbwalker/dev
add missing localization keys
2024-10-16 07:52:49 -04:00
sbwalker
8113a754a1 add missing localization keys 2024-10-16 07:52:36 -04:00
Shaun Walker
3cd40c6195 Merge pull request #4742 from sbwalker/dev
fix sorting of Site.Languages property
2024-10-15 16:46:16 -04:00
sbwalker
56cfb2ce06 fix sorting of Site.Languages property 2024-10-15 16:46:05 -04:00
Shaun Walker
72087823ac Merge pull request #4741 from sbwalker/dev
fix #4733 - remove Name column from Language table and populate value dynamically
2024-10-15 16:44:44 -04:00
sbwalker
bcf7866fe2 fix #4733 - remove Name column from Language table and populate value dynamically 2024-10-15 15:58:17 -04:00
Shaun Walker
b64772e484 Merge pull request #4739 from thabaum/add-discord-community
Fixes #4738 - Add Discord community button to README.md
2024-10-15 15:26:32 -04:00
Cody
088d665942 Update Discord Community Link For Consistency 2024-10-15 10:27:59 -07:00
Cody
7d6c10befb Add Discord community button to README.md
- Added a button for joining the Oqtane Discord server
- Included a brief description encouraging community engagement
2024-10-15 10:17:01 -07:00
Shaun Walker
f88e3d04b8 Merge pull request #4736 from thabaum/mysql.data-9.1.0
Fixes #4735 - Update MySQL.Data to 9.1.0
2024-10-15 12:06:50 -04:00
Cody
f57676a22b Update MySQL.Data to 9.1.0 2024-10-15 08:15:52 -07:00
Shaun Walker
8618cb62e4 Merge pull request #4732 from sbwalker/dev
fix #4711 - full page refresh required to affect language changes
2024-10-15 08:32:08 -04:00
sbwalker
c31c88ed1f fix #4711 - full page refresh required to affect language changes 2024-10-15 08:31:54 -04:00
Shaun Walker
6022acd21f Merge pull request #4731 from sbwalker/dev
fix #4716 - sort recycle bin items by DeletedOn date descending
2024-10-15 07:56:07 -04:00
sbwalker
b3071b9272 fix #4716 - sort recycle bin items by DeletedOn date descending 2024-10-15 07:55:54 -04:00
Shaun Walker
ec6a6d6653 Merge pull request #4729 from sbwalker/dev
localize names of languages based on user's UI culture
2024-10-14 17:18:09 -04:00
sbwalker
52f552b4de localize names of languages based on user's UI culture 2024-10-14 17:17:54 -04:00
Shaun Walker
2643d3396b Merge pull request #4728 from sbwalker/dev
set HttpOnly to false for Localization cookie in static rendering
2024-10-14 16:49:27 -04:00
sbwalker
62d59a09cf set HttpOnly to false for Localization cookie in static rendering 2024-10-14 16:49:14 -04:00
Shaun Walker
a68ff8a4f0 Merge pull request #4727 from sbwalker/dev
When displaying Database Type use SQL Server rather than LocalDB to avoid confusion
2024-10-14 16:21:25 -04:00
sbwalker
93d4bfcd7a When displaying Database Type use SQL Server rather than LocalDB to avoid confusion 2024-10-14 16:21:03 -04:00
Shaun Walker
5fb80c1a7b Merge pull request #4726 from sbwalker/dev
fix #4722 - support PrincipalSchema when creating foreign keys (credit @Hypnodude)
2024-10-14 15:36:54 -04:00
sbwalker
04b38444ce fix #4722 - support PrincipalSchema when creating foreign keys (credit @Hypnodude) 2024-10-14 15:36:32 -04:00
Shaun Walker
ca3df02002 Merge pull request #4723 from mdmontesinos/dev
Image Resizing and Format via QueryString in Files Page (enhances #4692)
2024-10-14 15:20:37 -04:00
Shaun Walker
d952c33fab Merge pull request #4725 from sbwalker/dev
fix #4714 as well as breaking change in #4712
2024-10-14 15:05:59 -04:00
sbwalker
93bc1cd5af fix #4714 as well as breaking change in #4712 2024-10-14 15:05:46 -04:00
Shaun Walker
0e5b370ee8 Merge pull request #4712 from thabaum/language-switcher-cookie
Fix #4710 - Adds language switcher component cookie set options for secure, httpOnly, sameSite + interop.cs/interop.js methods samesite and secure options
2024-10-14 14:41:18 -04:00
Shaun Walker
f4fd4e28c9 Merge pull request #4724 from sbwalker/dev
update MAUI project to .NET 8.0.10
2024-10-14 13:12:09 -04:00
sbwalker
ec8433eb45 update MAUI project to .NET 8.0.10 2024-10-14 13:11:55 -04:00
Shaun Walker
0d4a40e9bb Merge pull request #4715 from leigh-pointer/CompUpdate-8.0.10
Updated Microsoft Components for 8.0.8 to 8.0.10
2024-10-14 13:04:54 -04:00
Shaun Walker
c3668f4179 Merge pull request #4708 from thabaum/patch-10
fix typo in startup.cs
2024-10-14 12:48:38 -04:00
David Montesinos
3adb7ecb1c Enhances image manipulation with format (webp encoder, defaults to png)
- computes etag with all manipulation parameters
2024-10-13 17:20:18 +02:00
David Montesinos
aa5b84a214 Implements Image Manipulation in Files Page via QueryString
- Extracts the image creation into a service
- Refactors Files Page GET action for better readability and cyclomatic complexity
2024-10-13 12:38:43 +02:00
Leigh Pointer
3d83fccbf1 remove appsettings 2024-10-09 15:07:57 +02:00
Leigh Pointer
4c4255be6b Updated Template files with new component version 8.0.10 2024-10-09 14:42:07 +02:00
Leigh Pointer
ed6054b082 Updated Microsoft Components for 8.0.8 to 8.0.10
Tested on upgrade and new Oqtane instance creation.
2024-10-09 14:35:27 +02:00
Cody
f60f7a4dc1 Remove httpOnly setting from setCookie 2024-10-05 14:17:20 -07:00
Cody
998dc95cb2 Removed extra attribute for interop.SetCookie 2024-10-05 14:08:16 -07:00
Cody
12f5d7b846 Remove extra attribute for SetCookie 2024-10-05 14:06:35 -07:00
Cody
906ae0a43e Remove extra attribute for SetCookie 2024-10-05 14:06:18 -07:00
Cody
485b774876 Remove httpOnly cooking attribute from SetCookie 2024-10-05 14:03:20 -07:00
Cody
3121cf5b75 Remove unnecessary httpOnly setCookie option 2024-10-05 14:00:18 -07:00
Cody
ce7570dae2 Remove Unnecessary httpOnly setting setCookie Option 2024-10-05 13:58:55 -07:00
Cody
b5ea0dfbc7 Update Cleanup "setCookie" function notes options: secure, httpOnly, Samesite 2024-10-05 13:57:36 -07:00
Cody
dd0f8f4772 Update SetCookie function to include secure, httpOnly and sameSite 2024-10-05 13:55:35 -07:00
Cody
9d0ab34274 Update 'SetCookie" option settings "secure, httpOnly, sameSite" 2024-10-05 13:28:33 -07:00
Cody
e6038be6f7 Update SetCookie Option Settings Secure, HttpOnly, SameSite 2024-10-05 13:27:14 -07:00
Cody
bd2153a0ed Update cookie options to set SameSite, HttpOnly, Secure settings 2024-10-05 13:23:09 -07:00
Cody
e526deac20 Update Cookie Settings Secure, httpOnly, sameSite 2024-10-05 13:19:52 -07:00
Cody
b65f165dcf Update adds SameSite, Secure and httpOnly SetCookie Settings 2024-10-05 13:17:31 -07:00
Cody
f9fbe5adc2 Update NavigateTo() to use "true" instead of "forceLoad: true" 2024-10-05 12:11:52 -07:00
Cody
d1e73571a1 fix typo 2024-10-05 11:12:01 -07:00
Shaun Walker
1047058676 Merge pull request #4705 from maurocavallin/dev
Hard deletion of page more robust use of entity framework contexts
2024-10-04 17:14:00 -04:00
mauroc
29a1e77da8 Hard deletion of page more robust use of contexts (fixes issue: presence of stale records of deleted page on db). 2024-10-04 22:46:40 +02:00
Shaun Walker
290547e482 Merge pull request #4702 from sbwalker/dev
add defensive logic if ModuleState is null  in ModuleMessage
2024-10-02 16:53:46 -04:00
sbwalker
3df45ca20f add defensive logic if ModuleState is null in ModuleMessage 2024-10-02 16:53:36 -04:00
Shaun Walker
cc06258484 Merge pull request #4701 from sbwalker/dev
updated version to 5.2.4
2024-10-02 16:39:45 -04:00
sbwalker
2c262d0655 updated version to 5.2.4 2024-10-02 16:39:31 -04:00
Shaun Walker
1875e1e158 Merge pull request #4696 from sbwalker/dev
fix #4695 - null reference exception deleting a setting which does not exist
2024-10-02 08:30:58 -04:00
sbwalker
1c95967b31 fix #4695 - null reference exception deleting a setting which does not exist 2024-10-02 08:30:34 -04:00
Shaun Walker
2ae98929de Merge pull request #4689 from thabaum/Update-Dependencies-and-Prepare-Release-5.2.4
Fixes #4688 - Update dependencies and prepare release 5.2.4
2024-10-01 11:21:35 -04:00
Shaun Walker
6a1dd38cbb Merge pull request #4691 from zyhfish/task/fix-4690
Fix #4690: prevent invalid parsing.
2024-10-01 11:20:01 -04:00
Ben
c458a77d27 Fix #4690: prevent invalid parsing. 2024-10-01 22:13:32 +08:00
Cody
352c23f389 Prepare Release 5.2.4 2024-10-01 06:15:46 -07:00
Cody
6c5a1dc2e1 Prepare Release 5.2.4 2024-10-01 06:14:57 -07:00
Cody
004ff1e91d Update Dependencies and Prepare Release 5.2.4 2024-10-01 06:14:07 -07:00
Cody
f7de4c567b Prepare Release 5.2.4 2024-10-01 06:12:07 -07:00
Cody
b2ad1010ac Prepare Release 5.2.4 2024-10-01 06:11:36 -07:00
Cody
660e164ff8 Prepare Release 5.2.4 2024-10-01 06:11:04 -07:00
Cody
eb6dc80b50 Prepare Release 5.2.4 - removed whitespace 2024-10-01 06:10:21 -07:00
Cody
a9882cc96a Update Oqtane.Shared.nuspec 2024-10-01 06:09:35 -07:00
Cody
fb5a2ce178 Prepare Release 5.2.4 2024-10-01 06:09:12 -07:00
Cody
d441b31dc7 Prepare Release 5.2.4 2024-10-01 06:08:46 -07:00
Cody
d4239fe7e0 Prepare Release 5.2.4 2024-10-01 06:07:55 -07:00
Cody
6a98999105 Prepare Release 5.2.4 2024-10-01 06:06:03 -07:00
Cody
5caa1fe7d4 Prepare Release 5.2.4 2024-10-01 06:05:07 -07:00
Cody
ef33bdb65e Prepare Release 5.2.4 2024-10-01 06:04:11 -07:00
Cody
14a463382b Prepare Release 5.2.4 2024-10-01 06:03:20 -07:00
Cody
1ad79874c8 Update Dependencies and Prepare Release 5.2.4 2024-10-01 06:02:40 -07:00
Cody
1a61a58d28 Prepare Release 5.2.4 2024-10-01 06:00:20 -07:00
Cody
3e3c973679 Prepare Release 5.2.4 2024-10-01 05:59:47 -07:00
Cody
9dede84d20 Update Dependencies and Prepare Release 5.2.4 2024-10-01 05:57:17 -07:00
Shaun Walker
e78b11cf62 Merge pull request #4687 from sbwalker/dev
add some clarity to the database fields help text
2024-09-30 13:32:08 -04:00
sbwalker
341ca5a330 add some clarity to the database fields help text 2024-09-30 13:31:57 -04:00
Shaun Walker
e5d8c02def Merge pull request #4686 from sbwalker/dev
add validation of recipient email address to Notification job
2024-09-30 11:27:59 -04:00
sbwalker
947aa08c42 add validation of recipient email address to Notification job 2024-09-30 11:27:47 -04:00
Shaun Walker
9a04d436bd Merge pull request #4683 from sbwalker/dev
simplify configuration of external login providers
2024-09-27 16:21:23 -04:00
sbwalker
be0754f568 simplify configuration of external login providers 2024-09-27 16:21:06 -04:00
Shaun Walker
93c4bbc0d1 Merge pull request #4682 from sbwalker/dev
fix #4654 - show progress indicator during download
2024-09-27 12:01:07 -04:00
sbwalker
b98535810b fix #4654 - show progress indicator during download 2024-09-27 12:00:49 -04:00
Shaun Walker
393cf8da1f Merge pull request #4681 from sbwalker/dev
add disclaimer to System Update feature
2024-09-27 09:00:15 -04:00
sbwalker
ea2846973a add disclaimer to System Update feature 2024-09-27 09:00:04 -04:00
Shaun Walker
3398c1cbfe Merge pull request #4678 from sbwalker/dev
remove unnecessary using statement
2024-09-26 15:54:35 -04:00
sbwalker
39c79ea68e remove unnecessary using statement 2024-09-26 15:54:22 -04:00
Shaun Walker
66900f4a32 Merge pull request #4677 from sbwalker/dev
sign out the principal when it is rejected due to security stamp changes
2024-09-26 15:53:55 -04:00
sbwalker
df71dd14f7 sign out the principal when it is rejected due to security stamp changes 2024-09-26 15:53:14 -04:00
Shaun Walker
8113ca3069 Merge pull request #4676 from sbwalker/dev
fix #4657 - Cannot add new site to existing installation using separate database On IIS
2024-09-26 14:07:11 -04:00
sbwalker
d468e675c2 fix #4657 - Cannot add new site to existing installation using separate database On IIS 2024-09-26 14:06:51 -04:00
Shaun Walker
1e84cedf82 Merge pull request #4674 from sbwalker/dev
fix localization spelling mistake
2024-09-26 13:46:41 -04:00
sbwalker
7f4087e3de fix localization spelling mistake 2024-09-26 13:46:29 -04:00
Shaun Walker
facd3c8956 Merge pull request #4673 from sbwalker/dev
fix remote login issue which could occut if multiple users have the same email address
2024-09-26 13:38:30 -04:00
sbwalker
3e50deecb7 fix remote login issue which could occut if multiple users have the same email address 2024-09-26 13:37:39 -04:00
Shaun Walker
628c504f84 Merge pull request #4672 from sbwalker/dev
fix #4667 - installation issues when running on IIS
2024-09-26 13:33:31 -04:00
sbwalker
e1ada78c1f fix #4667 - installation issues when running on IIS 2024-09-26 13:33:16 -04:00
Shaun Walker
09fa1e365c Merge pull request #4670 from thabaum/remove-unnecessary-usings
Fixes #4669 - Remove unnecessary usings in IMultiDatabase.cs
2024-09-26 13:32:33 -04:00
Cody
28b6b03d06 Remove unnecessary usings 2024-09-25 15:13:06 -07:00
Shaun Walker
a4395b62ff Merge pull request #4668 from sbwalker/dev
fix #4666 - scroll position in enhanced navigation
2024-09-25 17:06:03 -04:00
sbwalker
4511acf273 fix #4666 - scroll position in enhanced navigation 2024-09-25 17:05:53 -04:00
Shaun Walker
fde53a2d83 Update README.md 2024-09-23 16:33:41 -04:00
Shaun Walker
f6cd04fdb8 Merge pull request #4662 from oqtane/master
Merge pull request #4661 from oqtane/dev
2024-09-23 16:26:39 -04:00
Shaun Walker
a5eede6c7a Merge pull request #4661 from oqtane/dev
5.2.3 release
2024-09-23 16:26:24 -04:00
Shaun Walker
2e83817c83 Merge pull request #4660 from sbwalker/dev
prepare for 5.2.3
2024-09-23 16:18:10 -04:00
sbwalker
82aea40ae4 prepare for 5.2.3 2024-09-23 16:17:55 -04:00
Shaun Walker
1b289eae24 Merge pull request #4659 from sbwalker/dev
use RoleName rather than RoleId for consistency
2024-09-23 16:08:02 -04:00
sbwalker
81420b2c88 use RoleName rather than RoleId for consistency 2024-09-23 16:07:49 -04:00
Shaun Walker
775731b745 Merge pull request #4657 from thabaum/patch-9
FIX #4655 - autocomplete="off" for SMTP Username/Password
2024-09-23 15:44:06 -04:00
Shaun Walker
489e7d4a67 Merge pull request #4658 from sbwalker/dev
fix RoleId missing from Permission Clone method
2024-09-23 15:38:51 -04:00
sbwalker
b6508764d8 fix RoleId missing from Permission Clone method 2024-09-23 15:38:35 -04:00
Cody
6dedd87305 autocomplete="off" for SMTP Username/Password 2024-09-23 12:19:49 -07:00
Shaun Walker
89fa29b310 Merge pull request #4653 from sbwalker/dev
improve scroll position script
2024-09-23 09:55:59 -04:00
sbwalker
be5df9c22a improve scroll position script 2024-09-23 09:55:44 -04:00
Shaun Walker
db17739716 Update README.md 2024-09-23 07:48:14 -04:00
Shaun Walker
1439362a5e Merge pull request #4651 from oqtane/master
5.2.2 Release
2024-09-23 07:39:21 -04:00
Shaun Walker
65c1b04772 Merge pull request #4650 from oqtane/dev
5.2.2 Release
2024-09-23 07:39:02 -04:00
Shaun Walker
83d30ebdc4 Merge pull request #4645 from sbwalker/dev
fix #4638 - add Logout Everywhere option to User Profile
2024-09-20 15:18:38 -04:00
sbwalker
b7928a5255 fix #4638 - add Logout Everywhere option to User Profile 2024-09-20 15:18:25 -04:00
Shaun Walker
a83ff9253d Merge pull request #4644 from sbwalker/dev
fix code formatting
2024-09-20 12:54:44 -04:00
sbwalker
8cdcdaf6d9 fix code formatting 2024-09-20 12:54:34 -04:00
Shaun Walker
d208edf153 Merge pull request #4643 from sbwalker/dev
fix #4641 - highlight default site theme in list of themes in page management
2024-09-20 12:28:06 -04:00
sbwalker
8ada4765b1 fix #4641 - highlight default site theme in list of themes in page management 2024-09-20 12:27:49 -04:00
Shaun Walker
9d3a808c24 Merge pull request #4642 from sbwalker/dev
fix #4826 - improve url handling
2024-09-20 12:09:16 -04:00
sbwalker
828eb80266 fix #4826 - improve url handling 2024-09-20 12:09:04 -04:00
Shaun Walker
0639f6c1d1 Merge pull request #4640 from sbwalker/dev
fix #4628 - preserve Url for all ModuleActions
2024-09-19 14:09:55 -04:00
sbwalker
49b971280f fix #4628 - preserve Url for all ModuleActions 2024-09-19 14:09:45 -04:00
Shaun Walker
3682a1010d Merge pull request #4637 from sbwalker/dev
synchronize interop.js with .NET MAUI
2024-09-19 12:14:36 -04:00
sbwalker
f8b58866dc synchronize interop.js with .NET MAUI 2024-09-19 12:14:24 -04:00
Shaun Walker
5d8d815d84 Merge pull request #4636 from zyhfish/task/4610-loadjs-issue
Fix #4610: wait for js loaded.
2024-09-19 12:10:55 -04:00
Ben
67743c7597 Fix #4610: wait for js loaded. 2024-09-19 23:34:59 +08:00
Shaun Walker
b33cc90447 Merge pull request #4635 from sbwalker/dev
use deep cloning to not muttate cache
2024-09-19 09:41:24 -04:00
sbwalker
78177f7890 use deep cloning to not muttate cache 2024-09-19 09:41:11 -04:00
Shaun Walker
3c417bfa99 Merge pull request #4633 from sbwalker/dev
fix trimming of site, page, and module settings
2024-09-18 18:32:04 -04:00
sbwalker
f2c8d80ff8 fix trimming of site, page, and module settings 2024-09-18 18:31:40 -04:00
Shaun Walker
8c1eb1e19f Merge pull request #4632 from sbwalker/dev
fix #4257 - load settings resources
2024-09-18 15:22:58 -04:00
sbwalker
eb7188e81b fix #4257 - load settings resources 2024-09-18 15:22:44 -04:00
Shaun Walker
f352fc5c67 Merge pull request #4631 from sbwalker/dev
on .NET MAUI provide message to user if Security Token has not been configured
2024-09-18 11:28:30 -04:00
sbwalker
ac313722f9 on .NET MAUI provide message to user if Security Token has not been configured 2024-09-18 11:28:11 -04:00
Shaun Walker
64c7f1962c Merge pull request #4630 from zyhfish/task/sync-maui-resources
sync changes to maui resources.
2024-09-18 10:46:34 -04:00
Ben
c83f994b21 sync changes to maui resources. 2024-09-18 22:44:14 +08:00
Shaun Walker
10f38a72f7 Merge pull request #4629 from sbwalker/dev
fix #4628 - preserve ReturnUrl when navigating to Settings component
2024-09-18 09:43:11 -04:00
sbwalker
da35434f58 fix #4628 - preserve ReturnUrl when navigating to Settings component 2024-09-18 09:42:56 -04:00
Shaun Walker
c79409e094 Merge pull request #4627 from sbwalker/dev
use FileLogger as fallback in LogManager when site cannot be determined
2024-09-18 07:38:20 -04:00
sbwalker
355ce00968 use FileLogger as fallback in LogManager when site cannot be determined 2024-09-18 07:37:52 -04:00
Shaun Walker
56c832f3ba Merge pull request #4626 from sbwalker/dev
fix logic to force authenticated user to provide email address so it works in static rendering
2024-09-17 17:29:30 -04:00
sbwalker
40abb2720e fix logic to force authenticated user to provide email address so it works in static rendering 2024-09-17 17:29:11 -04:00
Shaun Walker
9b6051afee Merge pull request #4625 from sbwalker/dev
update nuget.exe to latest and fix nuspec specification of readme
2024-09-17 15:19:57 -04:00
sbwalker
dcf6f26792 update nuget.exe to latest and fix nuspec specification of readme 2024-09-17 15:19:40 -04:00
Shaun Walker
85734c1146 Merge pull request #4624 from sbwalker/dev
remove unecessary using
2024-09-17 11:54:33 -04:00
sbwalker
c3fb8fcb6e remove unecessary using 2024-09-17 11:54:21 -04:00
Shaun Walker
013bbc1638 Merge pull request #4623 from sbwalker/dev
fix external login
2024-09-17 11:53:47 -04:00
sbwalker
b0669a3b60 fix external login 2024-09-17 11:53:34 -04:00
Shaun Walker
6f5da1ce7c Merge pull request #4622 from sbwalker/dev
allow external login to support SecurityStamp
2024-09-17 09:28:47 -04:00
sbwalker
3351732a2f allow external login to support SecurityStamp 2024-09-17 09:28:35 -04:00
Shaun Walker
d4d4034ecd Merge pull request #4621 from sbwalker/dev
remove unecessary usings
2024-09-17 09:07:57 -04:00
sbwalker
b45e2742c3 remove unecessary usings 2024-09-17 09:07:45 -04:00
Shaun Walker
42eba290e4 Merge pull request #4620 from sbwalker/dev
allow JwtMiddleware to support SecurityStamp
2024-09-17 09:07:14 -04:00
sbwalker
32d1e08b57 allow JwtMiddleware to support SecurityStamp 2024-09-17 09:06:49 -04:00
Shaun Walker
7b7d19da7c Merge pull request #4619 from sbwalker/dev
fix commented logic
2024-09-17 08:55:09 -04:00
sbwalker
f78e400918 fix commented logic 2024-09-17 08:54:52 -04:00
Shaun Walker
be4e9bf7e9 Merge pull request #4618 from sbwalker/dev
fix #4580 - add logout everywhere support using SecurityStamp
2024-09-17 08:45:41 -04:00
sbwalker
48f2079f88 fix #4580 - add logout everywhere support using SecurityStamp 2024-09-17 08:45:27 -04:00
Shaun Walker
36ad1ceef2 Merge pull request #4617 from sbwalker/dev
fix #4607 - site level scripts added twice in static rendering
2024-09-16 13:22:10 -04:00
sbwalker
1f2e2148d5 fix #4607 - scripts added twice 2024-09-16 13:21:43 -04:00
Shaun Walker
76f3d345f9 Merge pull request #4616 from sbwalker/dev
include SecurityStamp in User object
2024-09-16 13:03:32 -04:00
sbwalker
f2c854b53a include SecurityStamp in User object 2024-09-16 13:03:21 -04:00
Shaun Walker
e2d336d90b Merge pull request #4613 from sbwalker/dev
further modifications for #4604 - support for site name in logo component
2024-09-15 09:30:24 -04:00
sbwalker
c74065ff26 further modifications for #4604 - support for site name in logo component 2024-09-15 09:30:04 -04:00
Shaun Walker
b6d97dc5d5 Merge pull request #4612 from sbwalker/dev
fix #4606 - allow logo to show site name as fallback (credit @JanOlsmar)
2024-09-13 16:13:14 -04:00
sbwalker
1c1c26948a fix #4606 - allow logo to show site name as fallback (credit @JanOlsmar) 2024-09-13 16:13:01 -04:00
Shaun Walker
d954e3ffb7 Merge pull request #4608 from hishamco/toggle-edit-mode
Fix issue in toggle edit mode
2024-09-13 15:54:37 -04:00
Shaun Walker
d9759a95eb Merge pull request #4611 from sbwalker/dev
fix #4607 - Site HeadContent scripts being added twice
2024-09-13 15:19:31 -04:00
sbwalker
d196402dd0 fix #4607 - Site HeadContent scripts being added twice 2024-09-13 15:18:12 -04:00
Shaun Walker
0f2b5531de Merge pull request #4601 from hishamco/module-settings
Add null operator in ModuleState.ModuleDefinition
2024-09-13 14:13:40 -04:00
Hisham Bin Ateya
26e4398905 Address feedback 2024-09-13 21:12:18 +03:00
Shaun Walker
06995f22fe Merge pull request #4609 from sbwalker/dev
improve support for external login roles
2024-09-13 07:35:10 -04:00
sbwalker
caa2073d48 improve support for external login roles 2024-09-13 07:34:57 -04:00
Hisham Bin Ateya
d9466fe4bc Fix issue in toggle edit mode 2024-09-13 14:15:34 +03:00
Shaun Walker
72e623a3a7 Merge pull request #4606 from sbwalker/dev
fix #4598 - user experience improvements for file upload
2024-09-12 14:04:48 -04:00
sbwalker
69bc06685f fix #4598 - user experience improvements for file upload 2024-09-12 14:04:35 -04:00
Mark Davis
bf175984f3 Merge remote-tracking branch 'origin/dev' into dev 2024-09-11 18:23:41 -07:00
Shaun Walker
4d4a7bfd0d Merge pull request #4605 from sbwalker/dev
fix #4600 - filter user settings in API layer
2024-09-11 17:21:24 -04:00
sbwalker
044cee30a5 fix #4600 - filter user settings in API layer 2024-09-11 17:21:12 -04:00
Hisham Bin Ateya
3c0c5aed60 Add null operator in ModuleState.ModuleDefinition 2024-09-11 02:09:02 +03:00
Shaun Walker
e194971727 Merge pull request #4597 from sbwalker/dev
fix #4503 - ensure all state is initialized before rendering
2024-09-09 09:17:40 -04:00
sbwalker
bbe85def23 fix #4503 - ensure all state is initialized before rendering 2024-09-09 09:17:27 -04:00
Shaun Walker
9c2d53f2ae Merge pull request #4596 from sbwalker/dev
fix #4575 - add support for DateOnly and TimeOnly columns in migrations
2024-09-08 11:43:50 -04:00
sbwalker
1cf36e2156 fix #4575 - add support for DateOnly and TimeOnly columns in migrations 2024-09-08 11:43:36 -04:00
Shaun Walker
ce96e309af Merge pull request #4594 from sbwalker/dev
reverting #4507 - permission grid
2024-09-06 11:57:38 -04:00
sbwalker
9ea7dc8b3c reverting #4507 2024-09-06 11:57:15 -04:00
Shaun Walker
282242efd2 Merge pull request #4593 from mdmontesinos/dev
Fix IconOnly not working
2024-09-06 10:47:45 -04:00
David Montesinos
351ba22d64 Fix IconOnly not working 2024-09-06 16:35:44 +02:00
Shaun Walker
2916625747 Merge pull request #4588 from thabaum/patch-8
Update MySQL Project File Version - Prepare for 5.2.2
2024-09-05 10:32:54 -04:00
Cody
744dbeb7a3 Prepare for 5.2.2 2024-09-04 17:43:20 -07:00
Shaun Walker
fbb3c309ee Merge pull request #4583 from sbwalker/dev
prepare for 5.2.2
2024-09-02 12:09:24 -04:00
sbwalker
473c265bac prepare for 5.2.2 2024-09-02 12:09:06 -04:00
Shaun Walker
01b06c2c3c Merge pull request #4582 from sbwalker/dev
remove reference to HttpContext as it is not used
2024-09-02 11:08:38 -04:00
sbwalker
8b1f95c743 remove reference to HttpContext as it is not used 2024-09-02 11:08:25 -04:00
Shaun Walker
ff5dbec579 Merge pull request #4578 from sbwalker/dev
fix issue adding existing user to a new site
2024-08-29 17:53:27 -04:00
sbwalker
9620c5a98f fix issue adding existing user to a new site 2024-08-29 17:53:11 -04:00
Shaun Walker
7e849a2e95 Merge pull request #4577 from zyhfish/task/update-bootstrap-reference 2024-08-29 09:35:32 -04:00
Ben
229aed306e update bootstrap reference. 2024-08-29 19:41:27 +08:00
Shaun Walker
d718969cbd Merge pull request #4574 from zyhfish/task/display-upgrade-progress
display the upgrade progress.
2024-08-28 21:22:08 -04:00
Shaun Walker
8593f4c3a9 Merge pull request #4576 from sbwalker/dev
improve developer experience for Url helper methods
2024-08-28 21:21:57 -04:00
sbwalker
d4f71d5026 improve developer experience for Url helper methods 2024-08-28 21:21:41 -04:00
Shaun Walker
a683a5f206 Merge pull request #4573 from leigh-pointer/AddExisitng
Fix for Deleted Modules showing in AddExisting & CopyExisting dropdow…
2024-08-28 21:17:54 -04:00
Ben
7917cc3eb5 display the upgrade progress. 2024-08-28 21:48:40 +08:00
Leigh Pointer
6cd7ca755e Fix for Deleted Modules showing in AddExisting & CopyExisting dropdown #4572 2024-08-28 10:57:42 +02:00
Shaun Walker
fb7dfdc800 Merge pull request #4571 from sbwalker/dev
provide better support for AllowTextInput on Search component
2024-08-27 12:16:50 -04:00
sbwalker
e096af320f provide better support for AllowTextInput on Search component 2024-08-27 12:16:36 -04:00
Shaun Walker
65bff8f511 Merge pull request #4570 from sbwalker/dev
allow progress indicator to be displayed in search results
2024-08-27 10:22:53 -04:00
sbwalker
ca19d8a842 allow progress indicator to be displayed in search results 2024-08-27 10:22:41 -04:00
Shaun Walker
cde08c64ce Update README.md 2024-08-26 17:00:07 -04:00
Shaun Walker
3d6d7b7cb9 Update README.md 2024-08-26 16:56:08 -04:00
Shaun Walker
a56ef6f398 Update README.md 2024-08-26 16:55:30 -04:00
Shaun Walker
5a38b6614d Update README.md 2024-08-26 16:54:45 -04:00
Shaun Walker
3d5c44e8aa Update README.md 2024-08-26 16:53:25 -04:00
Shaun Walker
46a68bd5e7 Update README.md 2024-08-26 16:51:53 -04:00
Shaun Walker
c77ded51a9 Merge pull request #4568 from sbwalker/dev
fix #4559 - prevednt Log fields from exceeding column length
2024-08-26 12:05:05 -04:00
sbwalker
59bd9fdc22 fix #4559 - prevednt Log fields from exceeding column length 2024-08-26 12:04:50 -04:00
Shaun Walker
b81941394c Merge pull request #4567 from sbwalker/dev
change parameter name to AllowTextInput for clarity
2024-08-26 10:47:29 -04:00
sbwalker
197d5ca1f2 change parameter name to AllowTextInput for clarity 2024-08-26 10:47:18 -04:00
Shaun Walker
97eb986fa6 Merge pull request #4566 from sbwalker/dev
fix Search theme control so that it checks if search is enabled for site, and include AllowInput parameter to control input textbox
2024-08-26 10:41:39 -04:00
sbwalker
aba3110e31 fix Search theme control so that it checks if search is enabled for site, and include AllowInput parameter to control input textbox 2024-08-26 10:41:22 -04:00
Shaun Walker
51c27be236 Merge pull request #4565 from sbwalker/dev
fix #4562 - module template issue caused by gitignore
2024-08-26 09:41:01 -04:00
sbwalker
592255284f fix #4562 - module template issue caused by gitignore 2024-08-26 09:38:10 -04:00
Shaun Walker
82fd41dd4c Merge pull request #4555 from sbwalker/dev
add readme.md to Oqtane nuget packages
2024-08-22 14:10:42 -04:00
sbwalker
4ae8df9652 add readme.md to Oqtane nuget packages 2024-08-22 14:09:59 -04:00
Shaun Walker
759b19e444 Update README.md 2024-08-22 12:23:21 -04:00
Shaun Walker
36f705e46f Update README.md 2024-08-22 12:23:09 -04:00
Shaun Walker
1f0347682e Merge pull request #4553 from oqtane/master
5.2.1 Release
2024-08-22 12:15:38 -04:00
Shaun Walker
1aee385679 Merge pull request #4552 from oqtane/dev
5.2.1 Release
2024-08-22 12:15:15 -04:00
Shaun Walker
5dd8191692 Merge pull request #4551 from sbwalker/dev
fixed required field validation in Search Results Settings
2024-08-22 12:10:34 -04:00
sbwalker
b6422f9b80 fixed required field validation in Search Results Settings 2024-08-22 12:10:15 -04:00
Shaun Walker
a6c2c9c92f Merge pull request #4550 from sbwalker/dev
use localized Yes/No values when displaying Site Urls Default? option
2024-08-22 10:53:43 -04:00
sbwalker
247c573a6e use localized Yes/No values when displaying Site Urls Default? option 2024-08-22 10:53:27 -04:00
Shaun Walker
aa435d6e94 Merge pull request #4548 from sbwalker/dev
fix #4546 - handle cache invalidation for site deletion
2024-08-22 08:26:44 -04:00
sbwalker
f6858c221b fix #4546 - handle cache invalidation for site deletion 2024-08-22 08:26:29 -04:00
Shaun Walker
437aa4510b Merge pull request #4547 from sbwalker/dev
fix #4545 - Site Settings - UI Component Settings changes not refreshed after saving
2024-08-22 08:09:18 -04:00
sbwalker
430572fb32 fix #4545 - Site Settings - UI Component Settings changes not refreshed after saving 2024-08-22 08:08:55 -04:00
Shaun Walker
9f0b755d6f Merge pull request #4543 from sbwalker/dev
fix login redirect issue in sub-site where user has navigated directly to login page
2024-08-21 15:17:47 -04:00
sbwalker
66acb55a57 fix login redirect issue in sub-site where user has navigated directly to login page 2024-08-21 15:17:29 -04:00
Shaun Walker
f936d4c36e Merge pull request #4542 from sbwalker/dev
fix #4536 - deleted modules appearing in Page Management - Modules panel
2024-08-20 16:18:45 -04:00
sbwalker
c3ddb8df56 fix #4536 - deleted modules appearing in Page Management - Modules panel 2024-08-20 16:18:31 -04:00
Shaun Walker
81ce920e69 Merge pull request #4541 from sbwalker/dev
fix issues in default template for Interactive Client (WebAssembly) scenarios
2024-08-20 15:34:05 -04:00
sbwalker
3cb875d139 fix issues in default template for Interactive Client (WebAssembly) scenarios 2024-08-20 15:33:46 -04:00
Shaun Walker
fdb217d5c6 Merge pull request #4540 from sbwalker/dev
set BaseAddress for IHttpClientFactory
2024-08-20 15:22:39 -04:00
sbwalker
085cae3b5f set BaseAddress for IHttpClientFactory 2024-08-20 15:22:27 -04:00
Shaun Walker
e2f99a1554 Merge pull request #4538 from sbwalker/dev
fix #4498 build ServerState Assemblies collection in a more thread safe manner
2024-08-20 14:03:02 -04:00
sbwalker
aee0c27da7 fix #4498 build ServerState Assemblies collection in a more thread safe manner 2024-08-20 14:02:37 -04:00
Shaun Walker
accbf4ad8b Merge pull request #4535 from sbwalker/dev
use existing SiteKey
2024-08-20 08:35:36 -04:00
sbwalker
0ac1901f6b use existing SiteKey 2024-08-20 08:35:23 -04:00
Shaun Walker
c0a0deea78 Merge pull request #4532 from sbwalker/dev
ensure form name is unique in ActionDialog
2024-08-19 16:58:48 -04:00
sbwalker
e3f099441c ensure form name is unique in ActionDialog 2024-08-19 16:58:33 -04:00
Shaun Walker
840dd25cd1 Merge pull request #4530 from sbwalker/dev
fix issues with ActionDialog in static rendering
2024-08-19 09:34:23 -04:00
sbwalker
a493969f9b fix issues with ActionDialog in static rendering 2024-08-19 09:34:08 -04:00
Shaun Walker
cca42a10a1 Merge pull request #4529 from sbwalker/dev
fix CSS
2024-08-19 09:05:00 -04:00
sbwalker
2f4aa98c3c fix CSS 2024-08-19 09:04:46 -04:00
Shaun Walker
175cb9588c Merge pull request #4524 from sbwalker/dev
prevent scroll position from resetting to top of page when querystring or hash changes
2024-08-16 15:01:43 -04:00
sbwalker
a8976e7559 prevent scroll position from resetting to top of page when querystring or hash changes 2024-08-16 15:01:25 -04:00
Shaun Walker
b663528fb0 Merge pull request #4521 from sbwalker/dev
add ability to extract zip file contents in File Management
2024-08-14 15:54:30 -04:00
sbwalker
1a2ad55677 add ability to extract zip file contents in File Management 2024-08-14 15:54:13 -04:00
Shaun Walker
513d2a88c0 Merge pull request #4520 from sbwalker/dev
move HtmlText caching from repository to service layer
2024-08-14 10:01:11 -04:00
sbwalker
57ef4c0396 move HtmlText caching from repository to service layer 2024-08-14 10:00:56 -04:00
Shaun Walker
e9599ca2f4 Merge pull request #4519 from sbwalker/dev
fix #4517 - index error due to duplicate records on upgrade
2024-08-14 08:19:28 -04:00
sbwalker
2fc6dbc222 fix #4517 - index error due to duplicate records on upgrade 2024-08-14 08:19:14 -04:00
Shaun Walker
225933c442 Merge pull request #4518 from sbwalker/dev
update nuspec files for 5.2.1
2024-08-14 08:12:46 -04:00
sbwalker
36e2f048d7 update nuspec files for 5.2.1 2024-08-14 08:12:31 -04:00
Shaun Walker
0e158bce59 Merge pull request #4515 from thabaum/update-version-5.2.1-and-dependencies
Fixes #4514 - Update version 5.2.1 and dependencies
2024-08-14 07:58:55 -04:00
Shaun Walker
202201fd31 Merge pull request #4516 from ijaz-saeed/dev
search settings translation entry
2024-08-14 07:55:11 -04:00
isaeed
4f8c928f44 search settings translation entry 2024-08-14 11:57:06 +05:00
Cody
ada062cf00 Update version to 5.2.1 and dependencies 2024-08-13 15:53:45 -07:00
Cody
32dc12912a Update dependencies 2024-08-13 15:51:49 -07:00
Cody
671d21adf4 Update dependencies 2024-08-13 15:50:56 -07:00
Cody
4e3f8e4b67 Update dependencies 2024-08-13 15:49:15 -07:00
Cody
586bb62073 Update version to 5.2.1 and dependencies 2024-08-13 15:48:32 -07:00
Cody
151bf83ab1 Update version to 5.2.1 and dependencies 2024-08-13 15:46:45 -07:00
Cody
8c618edb5a Update version to 5.2.1 2024-08-13 15:45:23 -07:00
Cody
6d6b0cf8c9 Update version to 5.2.1 and dependencies 2024-08-13 15:44:45 -07:00
Cody
c610608890 Update version to 5.2.1 and dependencies 2024-08-13 15:43:27 -07:00
Cody
28da61daab Update version 5.2.1 and dependencies 2024-08-13 15:39:15 -07:00
Cody
cbfc90f60b Update Version To 5.2.1 and Dependencies To Latest 2024-08-13 15:36:20 -07:00
Shaun Walker
fec92959d4 Merge pull request #4513 from sbwalker/dev
move folder permissions grid to dedicated tab for consistency
2024-08-13 16:48:34 -04:00
sbwalker
bb00d81eba move folder permissions grid to dedicated tab for consistency 2024-08-13 16:48:22 -04:00
Shaun Walker
bb55644c06 Merge pull request #4512 from sbwalker/dev
improve file name and extension validation
2024-08-12 17:02:22 -04:00
sbwalker
16215847cd improve file name and extension validation 2024-08-12 17:02:07 -04:00
Shaun Walker
8ee9aed817 Merge pull request #4509 from sbwalker/dev
improve SettingService
2024-08-12 10:20:56 -04:00
sbwalker
515c6402b9 improve SettingService 2024-08-12 10:20:44 -04:00
Shaun Walker
d1b94ec203 Merge pull request #4507 from leigh-pointer/Permissions-4503
Fix for #4503 Module Custom Permissions not being shown
2024-08-10 17:54:51 -04:00
Leigh Pointer
a037d9167e Fix for #4503 Module Custom Permissions not being shown 2024-08-10 21:25:32 +02:00
Shaun Walker
3054d33e62 Merge pull request #4493 from thabaum/set-samesite-lax-visitor-culture-cookies
Fix #4492: Updates Culture and Visitor cookies to use "Lax" SameSite and Secure Cookie Options
2024-08-10 14:08:01 -04:00
Shaun Walker
6651e641e1 Merge pull request #4505 from sbwalker/dev
add search reindex capability
2024-08-10 10:02:08 -04:00
sbwalker
35f873a342 add search reindex capability 2024-08-10 10:01:52 -04:00
Shaun Walker
2d03ff38a1 Merge pull request #4504 from sbwalker/dev
replace dynamic query with linq
2024-08-09 17:16:30 -04:00
sbwalker
44a3db417b replace dynamic query with linq 2024-08-09 17:16:17 -04:00
Shaun Walker
f9ca702a12 Merge pull request #4502 from sbwalker/dev
fix #4499 - page modules not loaded properly
2024-08-09 13:11:31 -04:00
sbwalker
4073ff38eb fix #4499 - page modules not loaded properly 2024-08-09 13:11:19 -04:00
Shaun Walker
f0e2c9f1b6 Merge pull request #4501 from sbwalker/dev
eliminate database call for authenticated users
2024-08-09 13:00:35 -04:00
sbwalker
cf040f51b5 eliminate database call for authenticated users 2024-08-09 13:00:20 -04:00
Cody
dcf919fb36 Adds AntiForgery Cookie setting options.Cookie.HttpOnly = true; 2024-08-08 12:24:42 -07:00
Shaun Walker
aa19b81a68 Merge pull request #4487 from leigh-pointer/TemplateUpdate
Update Theme Template to Bootstrap 5.3.3
2024-08-08 14:44:27 -04:00
Shaun Walker
db8d77365c Merge pull request #4479 from pollux/patch-1
Fix admin/pages not showing 404 for unauthorized users
2024-08-08 14:42:08 -04:00
Shaun Walker
280eaea84a Merge pull request #4497 from sbwalker/dev
improve search result performance and relevancy
2024-08-08 14:11:43 -04:00
sbwalker
340ef46469 improve search result performance and relevancy 2024-08-08 14:11:27 -04:00
Cody
a5f8651941 Revert previous cookie HttpOnly option 2024-08-07 16:24:18 -07:00
Shaun Walker
8a18ee548e Merge pull request #4494 from sbwalker/dev
add missing indexes
2024-08-07 16:55:48 -04:00
sbwalker
ef791aa22a add missing indexes 2024-08-07 16:55:35 -04:00
Cody
4bdf2e1cc0 Update AntiForgery Token Cookie Option to HTTPOnly = true; 2024-08-07 13:21:18 -07:00
Cody
ffa0ca9379 Updates Culture and Visitor cookies to use "Lax" SameSite and Secure cookie options 2024-08-07 11:52:53 -07:00
Leigh Pointer
d3b3d46fc1 Return to standard Bootstrap 2024-08-07 20:01:41 +02:00
Leigh Pointer
7e7dd8efa9 Update Theme Template to Bootstrap 5.3.3 2024-08-07 10:34:40 +02:00
Shaun Walker
b4506f1133 Merge pull request #4483 from sbwalker/dev
include "://" on default Alias Protocol for consistency
2024-08-05 07:51:07 -04:00
sbwalker
7350c79113 include "://" on default Alias Protocol for consistency 2024-08-05 07:50:54 -04:00
Shaun Walker
5f7b60d3f4 Merge pull request #4480 from leigh-pointer/Log2xHttp
Removed the extra "://" from the Log Manager
2024-08-05 07:50:06 -04:00
Leigh Pointer
266495a611 Removed the extra ";//" from the Log Manager
{alias.Protocol} return with ";//"
2024-08-03 12:26:33 +02:00
lara
f5b4a7e77b Fix admin/pages not showing 404 for unauthorized users 2024-08-02 11:49:55 +02:00
Shaun Walker
51ed0f6487 Merge pull request #4472 from sbwalker/dev
fix #4471 - search pages not being added on upgrade
2024-07-27 09:51:22 -04:00
sbwalker
bd70def18a fix #4471 - search pages not being added on upgrade 2024-07-27 09:51:02 -04:00
Shaun Walker
93a9cf3b31 Update README.md 2024-07-25 13:22:02 -04:00
Shaun Walker
751287999f Update README.md 2024-07-25 11:57:24 -04:00
Shaun Walker
d433850cbf Merge pull request #4469 from oqtane/master
5.2.0 release
2024-07-25 11:49:12 -04:00
Shaun Walker
c93e70e2dc Merge pull request #4468 from oqtane/dev
5.2.0 release
2024-07-25 11:48:50 -04:00
Shaun Walker
a129dd989a Merge pull request #4467 from sbwalker/dev
remove Settings button logic from QuillJS text editor interop
2024-07-25 11:13:19 -04:00
sbwalker
40999c3ff4 remove Settings button logic from QuillJS text editor interop 2024-07-25 11:12:58 -04:00
Shaun Walker
18a01d672c Merge pull request #4466 from sbwalker/dev
resolve localization issue in ActionDialog
2024-07-25 09:24:34 -04:00
sbwalker
3648f99920 resolve localization issue in ActionDialog 2024-07-25 09:24:21 -04:00
Shaun Walker
e823412f56 Merge pull request #4465 from leigh-pointer/NotifyLogging
Small Notification Job update
2024-07-25 08:47:00 -04:00
Leigh Pointer
d090f446c9 Small Notification Job update
This update adds the NotificationId to the log to help track down any errors.
2024-07-25 13:11:05 +02:00
Shaun Walker
19985d1742 Merge pull request #4464 from sbwalker/dev
resolve issue with default Blazor theme
2024-07-24 13:00:03 -04:00
sbwalker
ab52251116 resolve issue with default Blazor theme 2024-07-24 12:59:40 -04:00
Shaun Walker
acb6c0187c Merge pull request #4461 from sbwalker/dev
add missing localization for Search Results Settings
2024-07-23 14:44:30 -04:00
sbwalker
90f9c24720 add missing localization for Search Results Settings 2024-07-23 14:44:14 -04:00
Shaun Walker
415bec4646 Merge pull request #4460 from sbwalker/dev
prevent breaking change for interactive components referencing PageState.Pages
2024-07-23 12:48:13 -04:00
sbwalker
5559f20511 prevent breaking change for interactive components referencing PageState.Pages 2024-07-23 12:47:54 -04:00
Shaun Walker
6ea3399829 Merge pull request #4458 from sbwalker/dev
use PageState.Site.Settings rather than reloading settings from database
2024-07-23 07:45:32 -04:00
sbwalker
9e3df97737 use PageState.Site.Settings rather than reloading settings from database 2024-07-23 07:45:13 -04:00
Shaun Walker
0ac40a4d77 Merge pull request #4456 from leigh-pointer/SixLabors.ImageSharp
ENH update to 3.1.5 #4455 Vulnerabilities detected in 3.1.4
2024-07-23 07:13:45 -04:00
Shaun Walker
24bf5e8102 Merge pull request #4454 from mdmontesinos/dev
fix: set Rich active tab for Quill text editor
2024-07-23 07:13:24 -04:00
Shaun Walker
56eebb03c7 Merge pull request #4457 from sbwalker/dev
change IsEffectiiveOrExpired to IsEffectiveAndNotExpired
2024-07-23 07:11:31 -04:00
sbwalker
1cd4d6d0df change IsEffectiiveOrExpired to IsEffectiveAndNotExpired 2024-07-23 07:08:26 -04:00
Leigh Pointer
22d4a8232a ENH update to 3.1.5 #4455 Vulnerabilities detected in 3.1.4 2024-07-23 13:03:03 +02:00
David Montesinos
48076c25bf fix: set Rich active tab for Quill text editor 2024-07-23 09:18:58 +02:00
Shaun Walker
478a308e73 Merge pull request #4453 from sbwalker/dev
fix #4284 - handle user role effective and expiry date
2024-07-22 21:09:52 -04:00
sbwalker
8ca2f0a49f fix #4284 - handle user role effective and expiry date 2024-07-22 21:09:35 -04:00
Shaun Walker
4a35d7364b Merge pull request #4452 from sbwalker/dev
remove ITextEditorProvider interface
2024-07-22 13:31:39 -04:00
sbwalker
8b2e55a969 remove ITextEditorProvider interface 2024-07-22 13:31:24 -04:00
Shaun Walker
9b14b70687 Merge pull request #4451 from sbwalker/dev
fix #4450 QuillJSTextEditor settings
2024-07-22 08:11:24 -04:00
sbwalker
1c01087eda fix #4450 QuillJSTextEditor settings 2024-07-22 08:11:09 -04:00
Shaun Walker
5137e5a301 Merge pull request #4449 from sbwalker/dev
add documentation
2024-07-21 09:19:00 -04:00
sbwalker
0fea8365b8 add documentation 2024-07-21 09:18:41 -04:00
Shaun Walker
116a615b84 Merge pull request #4448 from sbwalker/dev
change Ignore Paths to Ignore Pages
2024-07-21 09:10:23 -04:00
sbwalker
ef272dd6a8 change Ignore Paths to Ignore Pages 2024-07-21 09:10:01 -04:00
Shaun Walker
4462ae9cae Merge pull request #4447 from sbwalker/dev
moved Search Provider setting to Search Settings
2024-07-21 08:59:41 -04:00
sbwalker
66ffad0b4e moved Search Provider setting to Search Settings 2024-07-21 08:59:23 -04:00
Shaun Walker
81e0fc940c Merge pull request #4446 from sbwalker/dev
add Search Provider to Site Settings
2024-07-21 08:49:38 -04:00
sbwalker
3e8794db1b add Search Provider to Site Settings 2024-07-21 08:49:18 -04:00
Shaun Walker
617622d4d8 Merge pull request #4445 from sbwalker/dev
add Functionality section to Site Settings
2024-07-21 08:16:10 -04:00
sbwalker
a4240f972b add Functionality section to Site Settings 2024-07-21 08:15:51 -04:00
Shaun Walker
42feff8882 Merge pull request #4443 from sbwalker/dev
more localization changes
2024-07-20 21:52:56 -04:00
sbwalker
70edd9686f more localization changes 2024-07-20 21:52:41 -04:00
Shaun Walker
d298cb2e1c Merge pull request #4442 from sbwalker/dev
fix localization for QuillJSTextEditor
2024-07-20 21:43:57 -04:00
sbwalker
3fef3f2dc3 fix localization for QuillJSTextEditor 2024-07-20 21:43:38 -04:00
Shaun Walker
c85f9d6ae4 Merge pull request #4440 from sbwalker/dev
remove unecessary using
2024-07-20 19:39:58 -04:00
sbwalker
85e7ac7cd7 remove unecessary using 2024-07-20 19:39:45 -04:00
Shaun Walker
5c7db61a7e Merge pull request #4439 from sbwalker/dev
improve validation of seach content
2024-07-20 19:18:06 -04:00
sbwalker
497f9ca0b1 improve validation of seach content 2024-07-20 19:17:47 -04:00
Shaun Walker
0c50f7a322 Merge pull request #4438 from sbwalker/dev
allow page-script to support exterrnal JavaScript
2024-07-19 15:42:35 -04:00
sbwalker
740bcbd12c allow page-script to support exterrnal JavaScript 2024-07-19 15:42:20 -04:00
Shaun Walker
c92be4f270 Merge pull request #4437 from sbwalker/dev
revert modification done for testing purposes only
2024-07-19 15:31:24 -04:00
sbwalker
e2a7271ab2 revert modification done for testing purposes only 2024-07-19 15:31:11 -04:00
Shaun Walker
64766713fa Merge pull request #4436 from sbwalker/dev
add ability to manage search results settings
2024-07-19 12:56:14 -04:00
sbwalker
59bba83b1d add ability to manage search results settings 2024-07-19 12:55:59 -04:00
Shaun Walker
8ac1217165 Merge pull request #4435 from sbwalker/dev
allow <style> tags to be injected using HeadContent
2024-07-18 15:01:43 -04:00
sbwalker
5443629ec5 allow <style> tags to be injected using HeadContent 2024-07-18 15:01:20 -04:00
Shaun Walker
8f9b41cb62 Merge pull request #4434 from sbwalker/dev
use JSInterop for loading QuillJSTextEditor stylesheet
2024-07-18 13:17:58 -04:00
sbwalker
7df5eba775 use JSInterop for loading QuillJSTextEditor stylesheet 2024-07-18 13:17:23 -04:00
Shaun Walker
e29c6ac593 Merge pull request #4433 from sbwalker/dev
improve search user experience
2024-07-18 11:50:07 -04:00
sbwalker
4f3190bf73 improve search user experience 2024-07-18 11:49:42 -04:00
Shaun Walker
f0878fccb5 Merge pull request #4432 from sbwalker/dev
fix ISearchable implementation in default module template
2024-07-18 11:10:39 -04:00
sbwalker
b0e121a53f fix ISearchable implementation in default module template 2024-07-18 11:10:24 -04:00
Shaun Walker
eda48ab0e6 Merge pull request #4431 from sbwalker/dev
QuillJSTextEditor setting improvements
2024-07-18 11:03:13 -04:00
sbwalker
6a1014d8c1 QuillJSTextEditor setting improvements 2024-07-18 11:01:01 -04:00
Shaun Walker
e0f87315bc Merge pull request #4430 from sbwalker/dev
set Prerender on Login component
2024-07-17 20:52:28 -04:00
sbwalker
f2c5dca5e7 set Prerender on Login component 2024-07-17 20:52:13 -04:00
Shaun Walker
3c435a804f Merge pull request #4429 from sbwalker/dev
remove hardcoded names when using GetInterface()
2024-07-17 19:53:06 -04:00
sbwalker
7ee6775251 remove hardcoded names when using GetInterface() 2024-07-17 19:52:44 -04:00
Shaun Walker
98adc2ecc1 Merge pull request #4428 from sbwalker/dev
allow search content permissions to support roles
2024-07-17 19:34:34 -04:00
sbwalker
45afbbdac6 allow search content permissions to support roles 2024-07-17 19:34:19 -04:00
Shaun Walker
a18260747b Merge pull request #4427 from sbwalker/dev
add Refresh option for Job Logs
2024-07-17 17:12:38 -04:00
sbwalker
0c80e28754 add Refresh option for Job Logs 2024-07-17 17:12:24 -04:00
Shaun Walker
719bc374ac Merge pull request #4426 from sbwalker/dev
add localization to search settings
2024-07-17 16:34:16 -04:00
sbwalker
d7a290c595 add localization to search settings 2024-07-17 16:34:02 -04:00
Shaun Walker
4b2bd33baa Merge pull request #4425 from sbwalker/dev
update theme template to .NET 8.0.7
2024-07-17 16:23:30 -04:00
sbwalker
efbe4d697c update theme template to .NET 8.0.7 2024-07-17 16:23:15 -04:00
Shaun Walker
a8662bdb8b Merge pull request #4424 from sbwalker/dev
use Task.FromResult()
2024-07-17 16:22:16 -04:00
sbwalker
d822225465 use Task.FromResult() 2024-07-17 16:22:01 -04:00
Shaun Walker
c6373ef582 Merge pull request #4423 from sbwalker/dev
update module template to .NET 8.0.7
2024-07-17 16:17:30 -04:00
sbwalker
5a2af6d0f9 update module template to .NET 8.0.7 2024-07-17 16:17:10 -04:00
Shaun Walker
52000d6a41 Merge pull request #4422 from sbwalker/dev
update to .NET 8.0.7
2024-07-17 15:10:54 -04:00
sbwalker
befa13eaf2 update to .NET 8.0.7 2024-07-17 15:10:40 -04:00
Shaun Walker
4ac68a81a3 Merge pull request #4421 from sbwalker/dev
search optimizations
2024-07-17 13:58:03 -04:00
sbwalker
71e472f330 search optimizations 2024-07-17 13:57:47 -04:00
Shaun Walker
ada8809ec0 Merge pull request #4420 from oqtane/revert-4417-dev
Revert "disable prerendering by default for static rendered sites"
2024-07-17 12:13:35 -04:00
Shaun Walker
25ea518266 Revert "revert #4250 which disabled prerendering by default for static rendered sites" 2024-07-17 12:12:58 -04:00
Shaun Walker
f3720c3b94 Merge pull request #4419 from sbwalker/dev
improve PageState trimming
2024-07-17 11:53:22 -04:00
sbwalker
b942a84b15 improve PageState trimming 2024-07-17 11:53:04 -04:00
Shaun Walker
574ca90229 Merge pull request #4418 from sbwalker/dev
add missing properties to Clone method
2024-07-17 11:34:15 -04:00
sbwalker
5610a14e49 add missing properties to Clone method 2024-07-17 11:34:01 -04:00
Shaun Walker
c5bc62e6df Merge pull request #4417 from sbwalker/dev
revert #4250 which disabled prerendering by default for static rendered sites
2024-07-17 11:22:18 -04:00
sbwalker
e9f6a85cad revert #4250 which disabled prerendering by default for static rendered sites 2024-07-17 11:20:27 -04:00
Shaun Walker
8921011b27 Merge pull request #4416 from sbwalker/dev
performance improvement in Control Panel to only load list of pages when necessary
2024-07-17 11:13:46 -04:00
sbwalker
90ef3f6c94 performance improvement in Control Panel to only load list of pages when necessary 2024-07-17 11:13:27 -04:00
Shaun Walker
e84c75f4a8 Merge pull request #4414 from pollux/patch-1
Update Oqtane.Shared.csproj
2024-07-17 11:09:59 -04:00
Shaun Walker
68e20cd860 Merge pull request #4415 from sbwalker/dev
include Search Settings
2024-07-17 11:09:00 -04:00
sbwalker
76bdcea4b1 include Search Settings 2024-07-17 11:08:43 -04:00
lara
f758cb7e6e Update Oqtane.Shared.csproj
Fixes CVE-2024-30105
2024-07-17 12:46:49 +02:00
Shaun Walker
1108477810 Merge pull request #4413 from sbwalker/dev
make SearchResults API consistent with other core APIs
2024-07-16 16:55:09 -04:00
sbwalker
deb6a9e51c make SearchResults API consistent with other core APIs 2024-07-16 16:54:55 -04:00
Shaun Walker
9660f20b87 Merge pull request #4412 from sbwalker/dev
performance optimization to mitigate page bloat caused by Blazor serializing/encrypting state when crossing render mode boundaries
2024-07-16 16:21:57 -04:00
sbwalker
4d26468ede performance optimization to mitigate page bloat caused by Blazor serializing/encrypting state when crossing render mode boundaries 2024-07-16 16:21:35 -04:00
Shaun Walker
125a0979d5 Merge pull request #4408 from sbwalker/dev
removed unused constants
2024-07-15 10:11:31 -04:00
sbwalker
98bdfd3dbe removed unused constants 2024-07-15 10:11:14 -04:00
Shaun Walker
ea72880e74 Merge pull request #4407 from sbwalker/dev
resolve security issue in Search
2024-07-15 10:08:04 -04:00
sbwalker
17fec7d6e1 resolve security issue in Search 2024-07-15 10:07:48 -04:00
Shaun Walker
d9de64604e Merge pull request #4406 from sbwalker/dev
fix #4401 - avoid mutating Site object in cache
2024-07-15 08:37:46 -04:00
sbwalker
6275ab23ff fix #4401 - avoid mutating Site object in cache 2024-07-15 08:37:23 -04:00
Shaun Walker
8c0271643d Merge pull request #4405 from sbwalker/dev
testing search indexing of files
2024-07-13 09:28:25 -04:00
sbwalker
c3f041dc87 testing search indexing of files 2024-07-13 09:28:02 -04:00
Shaun Walker
80e5e84341 Merge pull request #4404 from sbwalker/dev
only include pages in index if they do not have any modules
2024-07-12 10:53:25 -04:00
sbwalker
938eee80a9 only include pages in index if they do not have any modules 2024-07-12 10:52:58 -04:00
Shaun Walker
7abc2289de Merge pull request #4402 from sbwalker/dev
search modifications
2024-07-12 10:33:34 -04:00
sbwalker
bb79b9ed74 search modifications 2024-07-12 10:33:17 -04:00
Shaun Walker
1e89a8625c Merge pull request #4400 from sbwalker/dev
fix #4397 - remove incorrect help text
2024-07-11 13:39:19 -04:00
sbwalker
90b0f04b3c fix #4397 - remove incorrect help text 2024-07-11 13:39:05 -04:00
Shaun Walker
0f019cd9b6 Merge pull request #4399 from sbwalker/dev
fix #4398 - InputList component not handling scenario where input is reset to nothing
2024-07-11 13:36:14 -04:00
sbwalker
1209739398 fix #4398 - InputList component not handling scenario where input is reset to nothing 2024-07-11 13:35:46 -04:00
Shaun Walker
b99db2b353 Merge pull request #4394 from sbwalker/dev
more Site Settings for search configuration
2024-07-08 16:59:10 -04:00
sbwalker
f057688e7d more Site Settings for search configuration 2024-07-08 16:58:55 -04:00
Shaun Walker
12ae2d0c76 Merge pull request #4393 from sbwalker/dev
site settings to configure indexing
2024-07-08 14:33:54 -04:00
sbwalker
9d91d5a127 site settings to configure indexing 2024-07-08 14:33:16 -04:00
Shaun Walker
6015f0887a Merge pull request #4389 from sbwalker/dev
fix #4384 - app_offline https link
2024-07-06 08:38:52 -04:00
sbwalker
d4c473d7b3 fix #4384 - app_offline https link 2024-07-06 08:38:33 -04:00
Shaun Walker
2f3978deed Merge pull request #4374 from zyhfish/task/fix-issue-4358
Fix #4358: RichTextEditor Provider Abstraction.
2024-07-06 08:32:19 -04:00
Shaun Walker
34af53a15b Merge branch 'dev' into task/fix-issue-4358 2024-07-06 08:32:10 -04:00
Shaun Walker
a4eb3d7a0b Merge pull request #4388 from sbwalker/dev
search refactoring
2024-07-06 07:58:35 -04:00
sbwalker
5b46dd7293 search refactoring 2024-07-06 07:58:04 -04:00
Mark Davis
4b17847ea5 Merge remote-tracking branch 'oqtane/dev' into dev 2024-07-05 21:53:14 -07:00
Ben
acbe000f97 avoid race condition issue. 2024-07-03 17:59:40 +08:00
Ben
599071b68b avoid race condition issue. 2024-07-03 17:07:47 +08:00
Ben
2bacee919d update the settings UI. 2024-07-03 12:26:36 +08:00
Shaun Walker
50d35e4196 Merge pull request #4383 from sbwalker/dev
remove unnecessary using
2024-07-02 15:53:40 -04:00
sbwalker
e321998b85 remove unnecessary using 2024-07-02 15:53:26 -04:00
Shaun Walker
340c02b2af Merge pull request #4382 from sbwalker/dev
remove unnecessary database call to GetPage
2024-07-02 15:45:59 -04:00
sbwalker
69a295fe57 remove unnecessary database call to GetPage 2024-07-02 15:45:44 -04:00
Shaun Walker
64830aae9f Merge pull request #4381 from sbwalker/dev
use PageModule in ISearchable
2024-07-02 14:50:42 -04:00
sbwalker
8969b1273f use PageModule in ISearchable 2024-07-02 14:50:26 -04:00
Shaun Walker
475faf7943 Merge pull request #4380 from sbwalker/dev
fix #4375 - deleted pages not being filtered
2024-07-02 11:05:42 -04:00
sbwalker
45b1d405a6 fix #4375 - deleted pages not being filtered 2024-07-02 11:05:29 -04:00
Ben
f60c8078e4 cleanup the code. 2024-07-02 09:55:38 +08:00
Ben
6701e49f9a move the editor settings into editor self control. 2024-07-02 09:50:53 +08:00
Shaun Walker
0efb3c3284 Merge pull request #4376 from sbwalker/dev
ensure UniqueKey is unique by including TenantId and SiteId
2024-07-01 16:20:15 -04:00
sbwalker
aaf3cdfdac ensure UniqueKey is unique by including TenantId and SiteId 2024-07-01 16:19:58 -04:00
Ben
e00c261777 Fix #4358: RichTextEditor Provider Abstraction. 2024-07-01 17:11:26 +08:00
Shaun Walker
1eafed755d Merge pull request #4372 from sbwalker/dev
provide default Permissions value
2024-06-28 17:31:48 -04:00
sbwalker
7f6a08ae50 provide default Permissions value 2024-06-28 17:31:33 -04:00
Shaun Walker
9901816fb9 Merge pull request #4371 from sbwalker/dev
ensure ModuleDefinition exists
2024-06-28 17:26:58 -04:00
sbwalker
3cbe6c1e95 ensure ModuleDefinition exists 2024-06-28 17:26:46 -04:00
Shaun Walker
679c99274e Merge pull request #4370 from sbwalker/dev
change EntityId to string
2024-06-28 16:25:11 -04:00
sbwalker
b6fa0f1ff6 change EntityId to string 2024-06-28 16:24:56 -04:00
Shaun Walker
9ff64b95e1 Merge pull request #4369 from sbwalker/dev
modify query property names
2024-06-28 16:15:42 -04:00
sbwalker
3a9885abd8 modify query property names 2024-06-28 16:15:28 -04:00
Shaun Walker
503210942c Merge pull request #4368 from sbwalker/dev
breaking search modifications into smaller PRs
2024-06-28 15:44:11 -04:00
sbwalker
0178e015e3 breaking search modifications into smaller PRs 2024-06-28 15:43:54 -04:00
Shaun Walker
7604992c35 Merge pull request #4361 from 2sic-forks/bug/4360
fix docfx build issues #4360
2024-06-28 09:01:45 -04:00
Shaun Walker
ee9e551788 Merge pull request #4365 from sbwalker/dev
reposition Search input in themes
2024-06-27 17:18:54 -04:00
sbwalker
22063248ca reposition Search input in themes 2024-06-27 17:18:41 -04:00
Shaun Walker
e4ce18b35c Merge pull request #4364 from sbwalker/dev
eager load Page associated to PageModule
2024-06-27 17:05:35 -04:00
sbwalker
532890674e eager load Page associated to PageModule 2024-06-27 17:05:22 -04:00
iJungleboy
791a3b67e6 fix docfx build issues 2024-06-27 19:47:13 +02:00
Shaun Walker
84b560ef29 Merge pull request #4356 from sbwalker/dev
fix #4353 - add defensive logic when sending notifications and improve performance
2024-06-26 09:09:29 -04:00
sbwalker
03f081f3f4 fix #4353 - add defensive logic when sending notifications and improve performance 2024-06-26 09:09:06 -04:00
Shaun Walker
08213ae86e Merge pull request #4352 from sbwalker/dev
fix #4349 - adding module in subsite in Interactive render mode
2024-06-24 16:27:35 -04:00
sbwalker
73abc511a8 fix #4349 - adding module in subsite in Interactive render mode 2024-06-24 16:26:55 -04:00
Shaun Walker
1c943cc259 Merge pull request #4350 from sbwalker/dev
fix #4339 - add page not redirecting to correct url in subsite
2024-06-24 11:00:01 -04:00
sbwalker
af62a89a6b fix #4339 - add page not redirecting to correct url in subsite 2024-06-24 10:59:34 -04:00
Shaun Walker
af7ca5b897 Merge pull request #4338 from sbwalker/dev
use List instead of IList, remove "List" from method names. remove unnecessary using statements
2024-06-11 10:39:03 -04:00
sbwalker
27356ef747 use List instead of IList, remove "List" from method names. remove unnecessary using statements 2024-06-11 10:38:44 -04:00
Shaun Walker
b27f80ef87 Merge pull request #4337 from leigh-pointer/SearchResultsCat
Updated SearchResults Categories to Admin
2024-06-11 10:28:56 -04:00
Leigh Pointer
b4aa73fc64 Updated SearchResults Categories to Admin 2024-06-11 15:21:12 +02:00
Shaun Walker
bbf444572b Merge pull request #4336 from sbwalker/dev
removed IHttpContextAccessor as it shoudl not be used in Blazor,  fixed form handling, added Reset button to consistent with other framework search options, used SharedLocalizer, removed unused localization keys
2024-06-11 08:39:28 -04:00
sbwalker
b3706574de removed IHttpContextAccessor as it shoudl not be used in Blazor, fixed form handling, added Reset button to consistent with other framework search options, used SharedLocalizer, removed unused localization keys 2024-06-11 08:38:51 -04:00
Shaun Walker
83062f8bfb Merge pull request #4335 from sbwalker/dev
fix ISearchable method name in module template
2024-06-11 07:37:25 -04:00
sbwalker
1d7fcfdaa1 fix ISearchable method name in module template 2024-06-11 07:37:02 -04:00
Shaun Walker
58ab12b4cb Merge pull request #4328 from leigh-pointer/UpdateTemplates
Update Project Templates from 8.0.5 - 8.0.6
2024-06-11 07:35:02 -04:00
Shaun Walker
28c649629f Merge pull request #4334 from leigh-pointer/Bootstrap5.3.3
Upgrade to Bootstrap 5.3.3
2024-06-11 07:32:10 -04:00
Leigh Pointer
5ec190225d Upgrade to Bootstrap 5.3.3
Oqtane ThemeInfo updated
Blazor Default.razor updated
2024-06-11 09:51:48 +02:00
Leigh Pointer
0e0d404997 Update [Module]Manager.cs 2024-06-11 09:11:25 +02:00
Leigh Pointer
3f16b908ca Merge remote-tracking branch 'upstream/dev' into UpdateTemplates 2024-06-11 08:49:28 +02:00
Shaun Walker
54549b261c Merge pull request #4333 from sbwalker/dev
change IList to List for consistency with rest of framework
2024-06-10 17:17:33 -04:00
sbwalker
8ce07ced9e change IList to List for consistency with rest of framework 2024-06-10 17:17:20 -04:00
Shaun Walker
37a5144e8f Merge pull request #4332 from sbwalker/dev
update app constant to 5.2.0
2024-06-10 16:50:45 -04:00
sbwalker
59fed7dda8 update app constant to 5.2.0 2024-06-10 16:50:33 -04:00
Shaun Walker
0a85a2868c Merge pull request #4331 from sbwalker/dev
fix issue with primary key on SearchContentWord table
2024-06-10 16:47:45 -04:00
sbwalker
0d493b3250 fix issue with primary key on SearchContentWord table 2024-06-10 16:47:32 -04:00
Shaun Walker
74530d4b1e Merge pull request #4330 from sbwalker/dev
remove unnecessary using statements
2024-06-10 16:23:10 -04:00
sbwalker
7548c52e21 remove unnecessary using statements 2024-06-10 16:22:58 -04:00
Shaun Walker
fa49844c64 Merge pull request #4329 from sbwalker/dev
remove List from method name to conform to Oqtane naming conventions
2024-06-10 16:17:19 -04:00
sbwalker
3508ae1e0a remove List from method name to conform to Oqtane naming conventions 2024-06-10 16:17:05 -04:00
Leigh Pointer
f013ee64a2 Updated Module Template with ISearchable implementation 2024-06-10 22:10:39 +02:00
Leigh Pointer
af3da7ca6e update to template.json files to align with Oqtane version 2024-06-10 21:54:44 +02:00
Leigh Pointer
cb728f65b3 Update Project Templates from 8.0.5 - 8.0.6 2024-06-10 21:50:30 +02:00
Shaun Walker
af6af190cc Merge pull request #4325 from thabaum/update-package-dependences-v5.2.0
Fixes #4324: Updates package dependences and prepares v5.2.0 release
2024-06-10 15:06:08 -04:00
Shaun Walker
cbcc8455ca Merge pull request #4326 from sbwalker/dev
refactored to move AdminSiteTemplate out of SiteRepository
2024-06-10 14:55:21 -04:00
sbwalker
af35fb79fe refactored to move AdminSiteTemplate out of SiteRepository 2024-06-10 14:55:06 -04:00
Cody
0515aaa946 Prepare v5.2.0 Release 2024-06-10 10:48:46 -07:00
Cody
1d00330e7a Prepare v5.2.0 Release and Package Dependencies 2024-06-10 10:48:18 -07:00
Cody
3fa6dcea16 Prepare v5.2.0 Release and Package Dependencies 2024-06-10 10:47:03 -07:00
Cody
51425cac4a Prepare v5.2.0 Release 2024-06-10 10:44:40 -07:00
Cody
7ce61a5d2b Prepare v5.2.0 Release 2024-06-10 10:43:54 -07:00
Cody
5e5caa979b Prepare v5.2.0 Release 2024-06-10 10:43:19 -07:00
Cody
a719518f8f Prepare v5.2.0 Release 2024-06-10 10:42:57 -07:00
Cody
d0e5aef443 Prepare v5.2.0 Release 2024-06-10 10:42:32 -07:00
Cody
b82a811c33 Prepare v5.2.0 Release and Package Dependencies 2024-06-10 10:41:51 -07:00
Cody
3356dcf8f7 Prepare v5.2.0 Release 2024-06-10 10:41:10 -07:00
Cody
8f1cc26537 Prepare v5.2.0 Release 2024-06-10 10:40:50 -07:00
Cody
27dafa83ac Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:38:52 -07:00
Cody
c1be1f329f Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:37:51 -07:00
Cody
c757cef549 Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:37:21 -07:00
Cody
da9e4c026c Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:37:04 -07:00
Cody
5821d67e69 Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:36:47 -07:00
Cody
ed14f6d13f Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:35:43 -07:00
Cody
35bdd8b4ef Prepare Update v5.2.0 Package Dependencies 2024-06-10 10:35:16 -07:00
Cody
9cf2d30e77 Prepare Update v5.2.0 2024-06-10 10:32:30 -07:00
Cody
a2140a3b7b Update v5.2.0 Package Dependencies 2024-06-10 10:30:37 -07:00
Cody
900d026bcb Update v5.2.0 Package Dependencies 2024-06-10 10:29:58 -07:00
Cody
68604ec15a Update Oqtane.Database.PostgreSQL.csproj Package Dependencies 2024-06-10 10:28:51 -07:00
Cody
f7c0ebb8d3 Update Oqtane.Database.MySQL.csproj prepare 5.2.0 2024-06-10 10:27:53 -07:00
Cody
8be5d0c72d Update Oqtane.Database.MySQL.csproj Package Dependencies 2024-06-10 10:27:15 -07:00
Cody
15c8b724e6 Update Oqtane.Client.csproj Package Dependencies 2024-06-10 10:24:52 -07:00
Shaun Walker
d6949200f9 Merge pull request #4323 from sbwalker/dev
move Search page/module to Admin template so that it is always provisioned
2024-06-10 12:33:31 -04:00
sbwalker
1c2abe794a move Search page/module to Admin template so that it is always provisioned 2024-06-10 12:33:09 -04:00
Shaun Walker
0bcf393586 Merge pull request #4320 from sbwalker/dev
search refactoring
2024-06-08 16:24:32 -04:00
sbwalker
bc0573918f search refactoring 2024-06-08 16:14:56 -04:00
Shaun Walker
175675ad99 Merge pull request #4317 from zyhfish/task/fix-issue-4316
Fix #4316: add text editor interfaces.
2024-06-07 14:44:40 -04:00
Ben
b00c2afc46 Fix #4316: move the raw html editor into quill editor instance. 2024-06-07 08:35:42 +08:00
Ben
c125a7fe07 Fix #4316: add text editor interfaces. 2024-06-06 16:39:35 +08:00
Shaun Walker
a42ab32436 Merge pull request #4310 from zyhfish/task/fix-searchbox-responsive-issue
Fix #4309: make searchbox responsive.
2024-06-05 07:48:55 -04:00
Shaun Walker
797a64976e Merge pull request #4311 from fonsecaf/fix-cookie-date-culture-format
Fix Cookie Date Conversion to Respect Culture and Format
2024-06-05 07:48:43 -04:00
fonsecaf
ac377a8b68 Modified date parsing and formatting to use invariant culture, ensuring consistency and preventing non-ASCII characters in HTTP headers. 2024-06-05 13:39:31 +10:00
Ben
842b7b1402 Fix #4309: make searchbox responsive. 2024-06-05 10:27:38 +08:00
Shaun Walker
d449396ad5 Merge pull request #4304 from zyhfish/task/add-search-function
#4303: add search function.
2024-06-04 16:52:10 -04:00
Shaun Walker
532a87d064 Merge pull request #4307 from leigh-pointer/OqtaneControls
Oqtane controls updates
2024-06-04 16:50:53 -04:00
Ben
e1cdc7b387 return the words count to calculate the ranking. 2024-06-04 21:57:50 +08:00
Ben
d9d917e267 set search result page path to be parameter. 2024-06-04 21:09:25 +08:00
Leigh Pointer
8048788042 Oqtane controls updates
ActionDialog and ActionLink now allow other icon sets whilst still adhering to the legacy "oi oi-" icon set.
Pager added SearchBoxClass Class parameter to the Search div.
TabStrip added a TabContentClass Class parameter to the tab content div.
2024-06-04 12:21:59 +02:00
Ben
790fc88e47 using correct module id value. 2024-06-04 17:50:29 +08:00
Ben
7f970d489f refactoring the code. 2024-06-04 17:32:31 +08:00
Ben
9d85ca07f4 #4303: add search function. 2024-06-03 21:19:42 +08:00
Shaun Walker
d75e3acdf3 Merge pull request #4302 from sbwalker/dev
changes as a result of #4299 related to  PageState.Modules
2024-06-03 07:42:46 -04:00
sbwalker
694cda0e99 changes as a result of #4299 related to PageState.Modules 2024-06-03 07:42:22 -04:00
Shaun Walker
94f134c6a7 Merge pull request #4301 from zyhfish/task/fix-add-page-issue
Fix Add Page Issue
2024-06-01 09:04:28 -04:00
Ben
83f329d93c Fix Add Page Issue 2024-06-01 09:08:43 +08:00
Shaun Walker
de49387fca Merge pull request #4300 from sbwalker/dev
remove LoadTestingSiteTemplate
2024-05-31 16:51:45 -04:00
sbwalker
e5567f2f46 remove LoadTestingSiteTemplate 2024-05-31 16:51:27 -04:00
Shaun Walker
80f545f3d5 Merge pull request #4299 from sbwalker/dev
scalability improvements
2024-05-31 16:23:50 -04:00
sbwalker
06f0cc70b8 scalability improvements 2024-05-31 16:23:36 -04:00
Shaun Walker
cf6b7544b0 Update README.md 2024-05-28 15:20:37 -04:00
Shaun Walker
d511c6334a Update README.md 2024-05-28 15:20:15 -04:00
Shaun Walker
0224fd6d54 Update README.md 2024-05-28 15:17:27 -04:00
Shaun Walker
e95ae8dbcf Merge pull request #4295 from oqtane/master
5.1.2 release
2024-05-28 15:12:02 -04:00
Shaun Walker
5fbd64da71 Merge pull request #4294 from oqtane/dev
5.1.2 release
2024-05-28 15:11:34 -04:00
Shaun Walker
b282a2a621 Merge pull request #4291 from sbwalker/dev
introduce Clone method in Permission model
2024-05-28 07:56:01 -04:00
sbwalker
9a7a534051 introduce Clone method in Permission model 2024-05-28 07:55:45 -04:00
Shaun Walker
52fd030b6e Merge pull request #4286 from sbwalker/dev
fix issues when importing SiteTemplates
2024-05-24 22:51:57 -04:00
sbwalker
dfe530a764 fix issues when importing SiteTemplates 2024-05-24 22:51:34 -04:00
Shaun Walker
b079956075 Merge pull request #4283 from sbwalker/dev
add ability to specify session duration for visitor tracking
2024-05-23 09:44:59 -04:00
sbwalker
e30037c4d1 add ability to specify session duration for visitor tracking 2024-05-23 09:44:42 -04:00
Shaun Walker
eda7be627c Merge pull request #4281 from sbwalker/dev
fix #4279 - remove Theme Settings tab from Add Page UI
2024-05-21 11:06:55 -04:00
sbwalker
af0a649656 fix #4279 - remove Theme Settings tab from Add Page UI 2024-05-21 11:06:42 -04:00
Shaun Walker
8b6a3c4236 Merge pull request #4278 from sbwalker/dev
changed terminology from Library to Headless
2024-05-20 22:12:14 -04:00
sbwalker
0988a92d8a changed terminology from Library to Headless 2024-05-20 22:12:01 -04:00
Shaun Walker
9cf67764b7 Merge pull request #4277 from sbwalker/dev
update theme and module templates to .NET SDK 8.0.5
2024-05-20 16:59:56 -04:00
sbwalker
6c4e1d1c41 update theme and module templates to .NET SDK 8.0.5 2024-05-20 16:59:44 -04:00
Shaun Walker
b1cd1ea8b3 Merge pull request #4276 from sbwalker/dev
upgrade to .NET 8.0.5
2024-05-20 16:54:24 -04:00
sbwalker
5169ed494c upgrade to .NET 8.0.5 2024-05-20 16:54:11 -04:00
Shaun Walker
824211c31b Merge pull request #4275 from sbwalker/dev
prepare for 5.1.2 release
2024-05-20 16:42:48 -04:00
sbwalker
be3dd83bc7 prepare for 5.1.2 release 2024-05-20 16:42:35 -04:00
Shaun Walker
c2911c1e48 Merge pull request #4274 from sbwalker/dev
script formatting
2024-05-20 16:36:30 -04:00
sbwalker
9a66c5c07d script formatting 2024-05-20 16:36:17 -04:00
Shaun Walker
34d393b986 Merge pull request #4273 from sbwalker/dev
optimize scripts
2024-05-20 16:29:28 -04:00
sbwalker
d4da02318d optimize scripts 2024-05-20 16:29:12 -04:00
Shaun Walker
47162af6d5 Merge pull request #4272 from sbwalker/dev
improve validation in package extraction
2024-05-20 09:34:23 -04:00
sbwalker
8cd6a72dd3 improve validation in package extraction 2024-05-20 09:33:46 -04:00
Shaun Walker
ba0a183b6f Merge pull request #4271 from sbwalker/dev
fix #4249 - allow EmailConfirmed property to be updated
2024-05-20 08:54:33 -04:00
sbwalker
73781c7edb fix #4249 - allow EmailConfirmed property to be updated 2024-05-20 08:54:19 -04:00
Shaun Walker
6d99852c81 Merge pull request #4269 from sbwalker/dev
refactor #4268 to support static render mode
2024-05-19 09:05:56 -04:00
sbwalker
9325c726fd refactor #4268 to support static render mode 2024-05-19 09:05:35 -04:00
Shaun Walker
947bb8530e Merge pull request #4268 from zyhfish/task/fix-issue-3885
Fix #3885: only re-render the component when message changed.
2024-05-19 08:48:36 -04:00
Ben
2b32f316ee Fix #3885: only re-render the component when message changed. 2024-05-18 21:55:37 +08:00
Shaun Walker
4b1f23a189 Merge pull request #4266 from sbwalker/dev
improve scroll position navigation behavior
2024-05-17 15:42:26 -04:00
sbwalker
71d220e7a4 improve scroll position navigation behavior 2024-05-17 15:42:13 -04:00
Shaun Walker
747d0d0d17 Merge pull request #4265 from sbwalker/dev
fix #4246 - module message form exception when clicking close button
2024-05-17 14:12:02 -04:00
sbwalker
5c72e6d335 fix #4246 - module message form exception when clicking close button 2024-05-17 14:11:48 -04:00
Shaun Walker
e1ac2b0e10 Merge pull request #4264 from sbwalker/dev
set browser scroll position on navigation in Static Rendering
2024-05-17 13:01:20 -04:00
sbwalker
0ba94f3bc9 set browser scroll position on navigation in Static Rendering 2024-05-17 13:01:03 -04:00
Shaun Walker
ba0bfafcd5 Merge pull request #4263 from sbwalker/dev
fix redirect logic when adding a new page
2024-05-17 08:51:42 -04:00
sbwalker
81adb80b7e fix redirect logic when adding a new page 2024-05-17 08:51:28 -04:00
Shaun Walker
cb238ef170 Merge pull request #4262 from sbwalker/dev
fix #4224 - reload page after adding module in Static Rendering
2024-05-17 08:38:33 -04:00
sbwalker
b9b921de82 fix #4224 - reload page after adding module in Static Rendering 2024-05-17 08:38:22 -04:00
Shaun Walker
d10e31c278 Merge pull request #4261 from sbwalker/dev
fix #4232 - Html/Text module not initializing content
2024-05-16 15:39:30 -04:00
sbwalker
fd641d77c7 fix #4232 - Html/Text module not initializing content 2024-05-16 15:39:17 -04:00
Shaun Walker
2aa9710dd1 Merge pull request #4260 from leigh-pointer/Bug4259
Fix for #4259 Localizer Null in Module Settings
2024-05-16 15:14:28 -04:00
Leigh Pointer
4afb2ef2b8 Fix for #4259 Localizer Null
removed the override string Title as it will be set Localized in the OnInitialized using SetModuleTitle base method.
2024-05-16 10:22:37 +02:00
Shaun Walker
a54e6e7c4b Merge pull request #4253 from zyhfish/task/fix-issue-4252
Fix #4252: do not reset the user photo setting when edit the user.
2024-05-13 08:51:33 -04:00
Shaun Walker
7af26a356f Merge pull request #4255 from zyhfish/task/fix-issue-4254
Fix #4254: remove the redundant space.
2024-05-13 08:49:22 -04:00
Shaun Walker
2f66165f8c Merge pull request #4256 from sbwalker/dev
add defensive logic to route parsing
2024-05-13 08:45:15 -04:00
sbwalker
e86ce8fc38 add defensive logic to route parsing 2024-05-13 08:45:03 -04:00
Ben
9b48c65129 Fix #4254: remove the redundant space. 2024-05-13 16:35:23 +08:00
Ben
434cd133df Fix #4252: do not reset the user photo setting when edit the user. 2024-05-13 16:08:43 +08:00
Shaun Walker
aa91e4cdee Merge pull request #4250 from sbwalker/dev
revert prerender changes and change default
2024-05-10 16:28:32 -04:00
sbwalker
d57c1e7ff0 revert prerender changes and change default 2024-05-10 16:28:19 -04:00
Shaun Walker
13e97703e5 Merge pull request #4244 from sbwalker/dev
modify prerendering UI options
2024-05-09 15:09:07 -04:00
sbwalker
c597b293b8 modify prerendering UI options 2024-05-09 15:08:52 -04:00
Shaun Walker
6620d64ce7 Merge pull request #4243 from sbwalker/dev
add support for Auto Prerendering
2024-05-09 14:43:07 -04:00
sbwalker
2ae120c878 add support for Auto Prerendering 2024-05-09 14:42:54 -04:00
Shaun Walker
7a25035fb1 Merge pull request #4239 from sbwalker/dev
require AntiForgery on Static Rendered components
2024-05-08 14:42:59 -04:00
sbwalker
bf4052b550 require AntiForgery on Static Rendered components 2024-05-08 14:42:39 -04:00
Shaun Walker
5ca5ad2cee Merge pull request #4226 from ohba-ikuo/oqtane-#4223
Fix #4223 In the Ubuntu environment, an error occurs when trying to upload a file.
2024-05-07 13:49:25 -04:00
Shaun Walker
2848f1e13c Merge pull request #4237 from sbwalker/dev
fix #4235 - add space above Logout button in Control Panel
2024-05-07 13:49:14 -04:00
sbwalker
f7895823cb fix #4235 - add space above Logout button in Control Panel 2024-05-07 13:48:58 -04:00
Shaun Walker
b841c5c5e5 Merge pull request #4234 from sbwalker/dev
add shadow-none to page links in pager
2024-05-06 15:56:20 -04:00
sbwalker
a7952a4633 add shadow-none to page links in pager 2024-05-06 15:56:05 -04:00
Ikuo Ohba
d047d26dbf Reverted and fixed the source code. 2024-05-05 12:12:40 +09:00
Shaun Walker
ddedc1640f Merge pull request #4227 from sbwalker/dev
fix #4221 - exception in Module Management when a module has been uninstalled (credit @marceloatoledo)
2024-05-03 13:37:29 -04:00
sbwalker
021d7e5efc fix #4221 - exception in Module Management when a module has been uninstalled (credit @marceloatoledo) 2024-05-03 13:37:10 -04:00
Ikuo Ohba
332e528012 Fix #4223 2024-05-03 21:18:28 +09:00
Shaun Walker
a0155da06b Merge pull request #4219 from mdmontesinos/dev
[ENH] Support for IconOnly in ActionDialog open button
2024-05-02 07:45:06 -04:00
Shaun Walker
d58d22adbe Merge pull request #4218 from leigh-pointer/CheckNullString
Null or empty check for FormatContent
2024-05-02 07:43:39 -04:00
David Montesinos
653352bff0 Support for IconOnly in ActionDialog open button 2024-05-02 10:36:29 +02:00
Leigh Pointer
4f5b33d8df Null or empty check for FormatContent
Added null or empty check for the content and alias parameters at the beginning of the method.
2024-05-02 09:03:26 +02:00
Shaun Walker
7e7d83ac36 Merge pull request #4217 from sbwalker/dev
fix support for Site-level Scripts in Resources
2024-05-01 15:18:51 -04:00
sbwalker
0de5c043bb fix support for Site-level Scripts in Resources 2024-05-01 15:18:36 -04:00
Shaun Walker
ec2769ea3c Merge pull request #4215 from sbwalker/dev
fix RESX file (add missing element)
2024-05-01 11:52:22 -04:00
sbwalker
3f742f5f8e fix RESX file (add missing element) 2024-05-01 11:52:07 -04:00
Shaun Walker
50849101d4 Merge pull request #4208 from iJungleboy/patch-1
Update README.md, move history to docs
2024-05-01 11:49:23 -04:00
Shaun Walker
1ccf4a74c9 Merge pull request #4214 from leigh-pointer/TranslateModuleSettingsTitle
ModuleSettings Title Localized
2024-05-01 11:49:08 -04:00
Shaun Walker
7cd4967963 Merge pull request #4205 from leigh-pointer/MissingParams
Fix for missing parameters and Resx values Issue #4202 #4203 #4210 and part #4209
2024-05-01 11:47:11 -04:00
Leigh Pointer
21e2700da5 ModuleSettings Title Localized 2024-05-01 08:33:51 +02:00
Leigh Pointer
395a68ad80 Merge branch 'dev' into MissingParams 2024-05-01 08:20:29 +02:00
Shaun Walker
b7f0132675 Merge pull request #4213 from sbwalker/dev
fix #4206 - validate folder name for duplicates
2024-04-30 16:41:37 -04:00
sbwalker
4ac827b9e8 fix #4206 - validate folder name for duplicates 2024-04-30 16:41:24 -04:00
Shaun Walker
d96963862e Merge pull request #4212 from leigh-pointer/ModuleContainerSettingsTrans
ModuleSettings ContainerSettings #4211
2024-04-30 16:19:28 -04:00
Leigh Pointer
53217b061d ModuleSettings ContainerSettings #4211
ModuleSettings ContainerSettings #4211
2024-04-30 20:07:34 +02:00
Leigh Pointer
4770daa7c6 Fix for Issue #4210 and part #4209
This I will work on on a  different Issue
2024-04-30 19:46:10 +02:00
iJungleboy
2b709ad094 Update README.md, move history to docs
moved release history and old announcements to the docs
2024-04-30 13:14:58 +02:00
Leigh Pointer
378b81b13b Fix for missing parameters and Resx values
Issue #4202 Issue #4203
2024-04-30 08:17:53 +02:00
Shaun Walker
56ee72214f Merge pull request #4204 from sbwalker/dev
refactor #4198 - copy existing module
2024-04-29 15:01:12 -04:00
sbwalker
2e7c3167f5 refactor #4198 - copy existing module 2024-04-29 14:58:30 -04:00
Shaun Walker
a2fb728d3b Merge pull request #4198 from zyhfish/task/fix-issue-4030
Fix #4030: add copy module option for add existing module function.
2024-04-29 13:38:34 -04:00
Ben
be1c936e90 Fix #4030: move copy option to the add module dropdown. 2024-04-29 22:04:01 +08:00
Shaun Walker
af8037ab03 Merge pull request #4201 from sbwalker/dev
allow hidden pages to be included in SiteMap
2024-04-29 08:58:38 -04:00
sbwalker
3b8dc98226 allow hidden pages to be included in SiteMap 2024-04-29 08:58:20 -04:00
Ben
b411b4e61b display error message for different action. 2024-04-27 19:32:07 +08:00
Ben
436eb30490 Fix #4030: add copy module option for add existing module function. 2024-04-27 12:32:31 +08:00
Shaun Walker
09b8087787 Merge pull request #4194 from ijaz-saeed/dev
Format Exception in int.Parse(route.ModuleId)
2024-04-26 13:26:02 -04:00
Shaun Walker
4ac4c69820 Merge pull request #4195 from zyhfish/task/fix-language-switch-redirect-issue
avoid redirect to home page when switching language.
2024-04-26 13:25:48 -04:00
Shaun Walker
3ebc5c0865 Merge pull request #4197 from sbwalker/dev
add support for Library modules and optimize usage of reflection during startup
2024-04-26 13:23:17 -04:00
sbwalker
7b94f8f105 add support for Library modules and optimize usage of reflection during startup 2024-04-26 13:22:56 -04:00
Ben
ec994b3e97 avoid redirect to home page when switching language. 2024-04-25 23:18:17 +08:00
isaeed
86ae0182fd Format Exception in int.Parse(route.ModuleId)
int.Parse("-1") throws  FormatException for cultures other than
 English (en-US)
2024-04-25 19:30:24 +05:00
Shaun Walker
bfa891f0ca Merge pull request #4193 from leigh-pointer/LangButtStyle
LanguageSwitcher to use the ButtonClass parameter
2024-04-25 08:22:19 -04:00
Leigh Pointer
ef843cac63 LanguageSwitcher to use the ButtonClass parameter
This change allows the buttons to be uniform.
2024-04-25 12:33:52 +02:00
Shaun Walker
78d68d0a4f Merge pull request #4190 from sbwalker/dev
fix #4186 - enable language switcher in static render mode
2024-04-24 15:55:16 -04:00
sbwalker
4bceba777d fix #4186 - enable language switcher in static render mode 2024-04-24 15:55:00 -04:00
Shaun Walker
2e537b1e5e Merge pull request #4189 from sbwalker/dev
fix HTML comment to indicate actual RenderMode for component (including Interactivity)
2024-04-24 13:23:54 -04:00
sbwalker
df8463b625 fix HTML comment to indicate actual RenderMode for component (including Interactivity) 2024-04-24 13:22:28 -04:00
Shaun Walker
f40371e0cf Update README.md 2024-04-24 10:04:10 -04:00
Shaun Walker
a565e7aed6 Merge pull request #4188 from sbwalker/dev
minor refactoring of #4179
2024-04-24 09:49:08 -04:00
sbwalker
c948361090 minor refactoring of #4179 2024-04-24 09:48:51 -04:00
Shaun Walker
4cf2b74a01 Merge pull request #4179 from LearnOqtane/dev
[ENH] - Add Prerender IModuleControl property (similar to RenderMode)…
2024-04-24 09:32:11 -04:00
vnetonline
de9c8362ac [ENH] - #4178 simplified version with null-coalescing operator ?? 2024-04-24 10:13:46 +10:00
vnetonline
b5bb5d35e7 [ENH] - #4178 correcting logic error 2024-04-24 09:49:07 +10:00
vnetonline
d910cfa919 [ENH] - #4178 modifications after review 2024-04-24 09:46:07 +10:00
vnetonline
5857e3d5c6 Merge branch 'oqtane:dev' into dev 2024-04-24 06:36:47 +10:00
Shaun Walker
25daa343c6 Merge pull request #4184 from leigh-pointer/ParamsLang
Parameters Missing fix for #4180 #4182
2024-04-23 14:10:43 -04:00
Shaun Walker
85224c8f0c Merge pull request #4185 from sbwalker/dev
fix #4160 - content entered being overidden by original content
2024-04-23 14:05:02 -04:00
sbwalker
5f8583e3eb fix #4160 - content entered being overidden by original content 2024-04-23 14:04:52 -04:00
Leigh Pointer
062821d267 Parameters Missing fix for #4180 #4182 2024-04-23 19:45:13 +02:00
Shaun Walker
1fdaaf82d2 Merge pull request #4169 from leigh-pointer/Bug4168
Fix for #4168 #4170 missing Translations
2024-04-23 13:19:24 -04:00
Shaun Walker
e4c1b17810 Merge pull request #4183 from sbwalker/dev
fix path issue for root page
2024-04-23 13:15:55 -04:00
sbwalker
70057542c1 fix path issue for root page 2024-04-23 13:15:44 -04:00
Shaun Walker
f2255ee707 Merge pull request #4181 from sbwalker/dev
replace form with link in AdminContainer
2024-04-23 12:54:56 -04:00
sbwalker
791cc70b09 replace form with link in AdminContainer 2024-04-23 12:54:44 -04:00
Shaun Walker
24dcb9973b Merge pull request #4164 from ohba-ikuo/add-ohba-ikuo
Datetime formatting issue
2024-04-23 08:45:58 -04:00
Ikuo Ohba
adfd0d5c18 Fix MicroService And Controller 2024-04-23 21:27:13 +09:00
vnetonline
cfb128acb8 [ENH] - Add Prerender IModuleControl property (similar to RenderMode) #4178 2024-04-23 15:22:02 +10:00
Shaun Walker
1e8e246ffb Merge pull request #4177 from sbwalker/dev
fix #4165 - missing slash in subfolder sites
2024-04-22 17:09:31 -04:00
sbwalker
6162244730 fix #4165 - missing slash in subfolder sites 2024-04-22 17:09:18 -04:00
Shaun Walker
86cbdf2442 Merge pull request #4161 from zyhfish/task/fix-issue-4158
Fix #4158: insert image into correct position.
2024-04-22 16:28:47 -04:00
Shaun Walker
5334626efb Merge pull request #4167 from leigh-pointer/ExtraTDinTheme
Rogue TD in table
2024-04-22 16:16:30 -04:00
Leigh Pointer
708d473b47 Missing Parameter
#4176
2024-04-22 20:19:33 +02:00
Leigh Pointer
ead954ddaa Missing Parameters
#4174 #4175
2024-04-22 19:18:02 +02:00
Leigh Pointer
294f511b9a Missing parameters
#4172 #4173
2024-04-22 18:27:01 +02:00
Leigh Pointer
b5ebcc3e07 Update Index.razor 2024-04-22 17:46:13 +02:00
Leigh Pointer
7b8e7ac5c2 Fix for #4168
Resx entry for Module Settings Permissions tab
2024-04-22 17:14:09 +02:00
Leigh Pointer
904d39beac Rouge TD in table
Deleted a rouge TD in the themes index table
2024-04-22 14:08:09 +02:00
Ikuo Ohba
8958b61fdd Datetime formatting issue 2024-04-21 20:44:41 +09:00
Ben
09293f7d9a Fix #4158: insert image into correct position. 2024-04-20 16:56:32 +08:00
Shaun Walker
d520c3d674 Merge pull request #4157 from sbwalker/dev
fix #4150 - remove Add Existing Module option when managing personalized pages
2024-04-18 18:43:43 -04:00
sbwalker
430e616328 fix #4150 - remove Add Existing Module option when managing personalized pages 2024-04-18 18:43:14 -04:00
Shaun Walker
976ad5fcee Update README.md 2024-04-16 13:47:24 -04:00
Shaun Walker
4d58ee2162 Update README.md 2024-04-16 13:46:55 -04:00
Shaun Walker
03b6abe5ec Merge pull request #4149 from oqtane/master
5.1.1 release
2024-04-16 13:34:15 -04:00
Shaun Walker
4479304f3f Merge pull request #4148 from oqtane/dev
5.1.1 release
2024-04-16 13:33:51 -04:00
Shaun Walker
ed83405254 Merge pull request #4147 from sbwalker/dev
fix SiteMap path issue
2024-04-16 13:04:39 -04:00
sbwalker
b815d945d9 fix SiteMap path issue 2024-04-16 13:04:25 -04:00
Shaun Walker
2b8e024f48 Merge pull request #4146 from sbwalker/dev
include .NET MAUI CORS policy for static files
2024-04-16 12:36:53 -04:00
sbwalker
2a0399b98d include .NET MAUI CORS policy for static files, add support for [wwwroot] in content 2024-04-16 12:36:31 -04:00
Shaun Walker
4e333e2d75 Merge pull request #4145 from sbwalker/dev
fix SiteRouter issue when running on .NET MAUI
2024-04-16 08:03:16 -04:00
sbwalker
4f25b7bbbe fix SiteRouter issue when running on .NET MAUI 2024-04-16 08:02:59 -04:00
Shaun Walker
3678db649b Merge pull request #4144 from sbwalker/dev
fixes for #4134 - Rich Text Editor
2024-04-15 08:54:30 -04:00
sbwalker
9d8b1fd99b fixes for #4134 - Rich Text Editor 2024-04-15 08:54:23 -04:00
Shaun Walker
7b62c06be3 Merge pull request #4140 from sbwalker/dev
convert Quill's empty content to empty string
2024-04-12 15:11:01 -04:00
sbwalker
bc978a91e3 convert Quill's empty content to empty string 2024-04-12 15:10:47 -04:00
Shaun Walker
611ba97b60 Merge pull request #4139 from sbwalker/dev
more changes for #4134 - ensure HTML content is preserved
2024-04-12 14:58:27 -04:00
sbwalker
39dff1ea7c more changes for #4134 - ensure HTML content is preserved 2024-04-12 14:58:14 -04:00
Shaun Walker
bcf7bcba1d Merge pull request #4137 from sbwalker/dev
fix #4134 - RichTextEditor scenarios
2024-04-12 13:25:59 -04:00
sbwalker
8f00730189 fix #4134 - RichTextEditor scenarios 2024-04-12 13:25:44 -04:00
Shaun Walker
1dde79ace2 Merge pull request #4136 from zyhfish/bug/fix-issue-4121
Fix #4121: avoid nested square bracket issue.
2024-04-12 11:04:25 -04:00
Ben
5954fb91be Fix #4121: avoid nested square bracket issue. 2024-04-12 21:56:49 +08:00
Shaun Walker
e192383662 Merge pull request #4135 from leigh-pointer/TokenRep
InitializeTokenReplace not setting the correct PackageReference
2024-04-12 07:41:40 -04:00
Leigh Pointer
4a20fad4e5 InitializeTokenReplace not setting the correct PackageReference
For completeness.
2024-04-12 12:21:44 +02:00
Shaun Walker
a469e0864e Merge pull request #4132 from sbwalker/dev
move RichTextEditor script registration to Body
2024-04-11 15:27:09 -04:00
sbwalker
cfce2bdbd9 move RichTextEditor script registration to Body 2024-04-11 15:26:55 -04:00
Shaun Walker
529b5c0a00 Merge pull request #4130 from sbwalker/dev
prepare for 5.1.1 release
2024-04-11 14:28:12 -04:00
sbwalker
7cc5787779 prepare for 5.1.1 release 2024-04-11 14:27:59 -04:00
Shaun Walker
48eeb279e2 Merge pull request #4129 from sbwalker/dev
add Process info to System Info to indicate if process is 32 bit or 64 bit
2024-04-11 13:34:25 -04:00
sbwalker
d67566252a add Process info to System Info to indicate if process is 32 bit or 64 bit 2024-04-11 13:34:06 -04:00
Shaun Walker
8a2d79e17d Merge pull request #4127 from sbwalker/dev
fix issue where active tab not set correctly when rich text editor disabled
2024-04-11 09:16:57 -04:00
sbwalker
17370dff54 fix issue where active tab not set correctly when rich text editor disabled 2024-04-11 09:16:39 -04:00
Shaun Walker
f08a8e7634 Merge pull request #4126 from sbwalker/dev
fix https://github.com/oqtane/oqtane.blogs/issues/44 - rich text editor throwing exception in specific scenario
2024-04-11 09:04:00 -04:00
sbwalker
83543bbddc fix https://github.com/oqtane/oqtane.blogs/issues/44 - rich text editor throwing exception in specific scenario 2024-04-11 09:03:41 -04:00
Shaun Walker
b898c90f41 Merge pull request #4125 from leigh-pointer/ImageSharpUpdate
ImageSharp update from 3.1.3 to 3.1.4
2024-04-11 07:44:51 -04:00
Leigh Pointer
1ec927cf4f ImageSharp update from 3.1.3 to 3.1.4 2024-04-11 11:11:05 +02:00
Shaun Walker
aef21ba9d5 Merge pull request #4124 from sbwalker/dev
update theme and module templates to .NET SDK 8.0.4
2024-04-10 16:29:35 -04:00
sbwalker
0b31709aee update theme and module templates to .NEt SDK 8.0.4 2024-04-10 16:29:16 -04:00
Shaun Walker
7c3433256a Merge pull request #4123 from sbwalker/dev
update to .NET SDK 8.0.4
2024-04-10 16:24:40 -04:00
sbwalker
c79c638f35 update to .NET SDK 8.0.4 2024-04-10 16:24:23 -04:00
Shaun Walker
a148941a39 Merge pull request #4119 from sbwalker/dev
fix #4109 - fix resx key in SqlServerConfig (credit @mmisu)
2024-04-09 08:06:31 -04:00
sbwalker
23abe26b0b fix #4109 - fix resx key in SqlServerConfig (credit @mmisu) 2024-04-09 08:06:12 -04:00
Shaun Walker
8f21d6dde0 Merge pull request #4112 from mdmontesinos/dev
fix #4103 - Visual Studio build acceleration breaks Oqtane Module build process
2024-04-08 14:32:09 -04:00
Shaun Walker
b74a6c9e03 Merge pull request #4118 from sbwalker/dev
removing StreamRendering attribute as recent SDK seems to have resolved earlier rendering issues
2024-04-08 14:31:52 -04:00
sbwalker
b63f73ef93 removing StreamRendering attribute as recent SDK seems to have resolved earlier rendering issues 2024-04-08 14:31:12 -04:00
David Montesinos
1f0b369a15 Disable Accelerate Builds for Package project in Module template 2024-04-06 08:37:48 +02:00
David Montesinos
7a43473513 Disable Accelerate Builds for Package project in Theme template 2024-04-06 08:36:13 +02:00
Shaun Walker
07f367a2a5 Merge pull request #4111 from sbwalker/dev
fix #4108 - content lost when adding image to RichTextEditor
2024-04-05 16:07:15 -04:00
sbwalker
c52ad68d92 fix #4108 - content lost when adding image to RichTextEditor 2024-04-05 16:07:01 -04:00
Shaun Walker
85467dbd2a Merge pull request #4106 from sbwalker/dev
update text in component to be consistent with resx
2024-04-04 12:01:01 -04:00
sbwalker
aa767846f0 update text in component to be consistent with resx 2024-04-04 12:00:52 -04:00
Shaun Walker
6d3ad15d20 Merge pull request #4105 from sbwalker/dev
modify #4099 - fix localization and use Delete rather than Clear in API methods for consistency with rest of framework
2024-04-04 11:58:22 -04:00
sbwalker
7b95db4d13 modify #4099 - fix localization and use Delete rather than Clear in API methods for consistency with rest of framework 2024-04-04 11:58:05 -04:00
Shaun Walker
160b3ff655 Merge pull request #4099 from zyhfish/task/fix-3625
Fix #3625: add the clear logs function.
2024-04-04 08:26:41 -04:00
Ben
757a39a75e update code by review result. 2024-04-03 22:27:39 +08:00
Ben
4c08a527be Fix #3625: add the clear logs function. 2024-04-03 09:21:13 +08:00
Shaun Walker
578b7b0512 Update issue templates 2024-04-02 16:43:43 -04:00
Shaun Walker
45e0259099 Update issue templates 2024-04-02 16:41:52 -04:00
Shaun Walker
1ac1933ec1 Update issue templates 2024-04-02 16:37:54 -04:00
Shaun Walker
43353e89bb Merge pull request #4098 from sbwalker/dev
fix ThemeSettings SetSetting() references to not specify IsPrivate property
2024-04-02 10:53:24 -04:00
sbwalker
010e4610f7 fix ThemeSettings SetSetting() references to not specify IsPrivate property 2024-04-02 10:53:07 -04:00
Shaun Walker
ba38853406 Merge pull request #4097 from sbwalker/dev
fix SiteMap so that it supports page Urls
2024-04-02 08:45:03 -04:00
sbwalker
4944a9e51e fix SiteMap so that it supports page Urls 2024-04-02 08:44:51 -04:00
Shaun Walker
73ad97859c Merge pull request #4093 from sbwalker/dev
fix #4091 - double slash generated for home page path ("/") and urlparameters
2024-04-01 15:11:38 -04:00
sbwalker
e600da229c fix #4091 - double slash generated for home page path ("/") and urlparameters 2024-04-01 15:11:20 -04:00
Shaun Walker
273b4f20db Merge pull request #4090 from sbwalker/dev
fix #4088 - redirect to login if not authenticated
2024-04-01 12:01:04 -04:00
sbwalker
9843dccdf0 fix #4088 - redirect to login if not authenticated 2024-04-01 12:00:53 -04:00
Shaun Walker
60ae1ec1e8 Merge pull request #4089 from W6HBR/dev
Fix incorrect parameter passed from ProfileService to ProfileController
2024-04-01 09:53:48 -04:00
Jon Welfringer
650c6670f2 Fix incorrect parameter passed from ProfileService.cs to ProfileController.cs
ProfileService was passing SiteId instead of ProfileId which was causing updates to profile entries to fail with "Unauthorized Profile Put Attempt".
2024-03-31 10:08:19 -07:00
Shaun Walker
d6dcba7a60 Merge pull request #4083 from sbwalker/dev
use Constants.RequestVerificationToken rather than magic string
2024-03-29 11:19:33 -04:00
sbwalker
5b3849082f use Constants.RequestVerificationToken rather than magic string 2024-03-29 11:19:21 -04:00
Shaun Walker
5de988a2e6 Merge pull request #4082 from sbwalker/dev
remove changes to allow path to support urls - urls should be specified as redirects
2024-03-29 10:15:42 -04:00
sbwalker
26220b2f54 remove changes to allow path to support urls - urls should be specified as redirects 2024-03-29 10:15:24 -04:00
Shaun Walker
8d8436f1f1 Merge pull request #4081 from sbwalker/dev
set active tab correctly in RichTextEditor for scenarios where rich text editor is disabled
2024-03-29 07:50:27 -04:00
sbwalker
93057d9449 set active tab correctly in RichTextEditor for scenarios where rich text editor is disabled 2024-03-29 07:50:03 -04:00
Mark Davis
2addcc3ab5 Merge branch 'dev' of https://github.com/Trifoia/oqtane.framework into dev 2024-03-28 13:47:43 -07:00
Shaun Walker
b2419abdc8 Merge pull request #4079 from sbwalker/dev
fix #4073 - OIDC/OAuth2 flow with static rendering
2024-03-28 16:12:15 -04:00
sbwalker
9f654918ae fix #4073 - OIDC/OAuth2 flow with static rendering 2024-03-28 16:12:02 -04:00
Shaun Walker
cb086fe08d Merge pull request #4077 from zyhfish/task/fix-issue-4074
Fix #4074: use the correct property value.
2024-03-28 14:23:46 -04:00
Shaun Walker
1482166ba3 Merge pull request #4078 from sbwalker/dev
fix #4075 - auth cookie being rejected under some scenarios - change from Strict to Lax to match latest .NET Identity configuration
2024-03-28 14:23:31 -04:00
sbwalker
6b8dd9bf03 fix #4075 - auth cookie being rejected under some scenarios - change from Strict to Lax to match latest .NET Identity configuration 2024-03-28 14:23:13 -04:00
Ben
a8af9da249 Fix #4074: use the correct property value. 2024-03-28 22:18:30 +08:00
Shaun Walker
e410f82fdb Update README.md 2024-03-27 15:01:47 -04:00
Shaun Walker
4f70f228f1 Update README.md 2024-03-27 10:43:55 -04:00
Shaun Walker
ddc97b99fa Update README.md 2024-03-27 10:37:03 -04:00
Shaun Walker
5f42918cc9 Update README.md 2024-03-27 10:09:39 -04:00
Shaun Walker
e6dfe6fe89 Update README.md 2024-03-27 08:57:52 -04:00
Shaun Walker
fdbe693139 Merge pull request #4070 from oqtane/master
5.1.0 release
2024-03-27 08:44:22 -04:00
Shaun Walker
0633b2876c Merge pull request #4069 from oqtane/dev
5.1.0 release
2024-03-27 08:43:57 -04:00
Shaun Walker
ee45ed8ec2 Merge pull request #4068 from sbwalker/dev
fix upgrade issue by removing legacy Views assembly
2024-03-26 14:27:06 -04:00
sbwalker
0c6726e3f7 fix upgrade issue by removing legacy Views assembly 2024-03-26 14:26:55 -04:00
Shaun Walker
2a75995189 Merge pull request #4067 from zyhfish/task/fix-issue-4066
Fix #4066: set the RenderModeBoundary instance.
2024-03-26 13:39:11 -04:00
Ben
9f074c1ab7 Fix #4066: set the RenderModeBoundary instance. 2024-03-26 22:48:55 +08:00
Shaun Walker
2917ee3b9d Merge pull request #4065 from leigh-pointer/UpdateTemplateJson
Updated Template Module and Theme json from 5.0.0 to 5.1.0
2024-03-26 07:21:03 -04:00
Leigh Pointer
03f631f537 Updated Template Module and Theme json from 5.0.0 to 5.1.0 2024-03-26 11:53:49 +01:00
Shaun Walker
fb4171ae6f Merge pull request #4064 from thabaum/Fixes-#4062-move-app-body-resources
Fixes #4062: App.razor - moves loading body resources above blazor.web.js
2024-03-25 14:27:38 -04:00
Cody
aec7d5aff7 moves loading body resources above blazor.web.js 2024-03-25 11:04:14 -07:00
Shaun Walker
045c225c8c Merge pull request #4063 from sbwalker/dev
fix #4061 - invalid type for favicon
2024-03-25 13:05:32 -04:00
sbwalker
c49ef49371 fix #4061 - invalid type for favicon 2024-03-25 13:05:20 -04:00
Shaun Walker
9fd012229b Merge pull request #4060 from sbwalker/dev
increase minimum characters to view Edit button at bottom
2024-03-25 07:41:02 -04:00
sbwalker
bb27099f9e increase minimum characters to view Edit button at bottom 2024-03-25 07:40:48 -04:00
Shaun Walker
411634ecda Merge pull request #4056 from sbwalker/dev
set active tab in RichTextEditor based on content
2024-03-23 11:55:56 -04:00
sbwalker
bb59f66008 set active tab in RichTextEditor based on content 2024-03-23 11:55:44 -04:00
Shaun Walker
b8a0f34c33 Merge pull request #4055 from sbwalker/dev
fix regression issue caused by #3985 related to ActionLink
2024-03-23 11:39:24 -04:00
sbwalker
784955cdbd fix regression issue caused by #3985 related to ActionLink 2024-03-23 11:39:11 -04:00
Shaun Walker
83764ce3d5 Merge pull request #4054 from sbwalker/dev
move Html/Text Edit button to top of content
2024-03-23 11:12:24 -04:00
sbwalker
438cf271c0 move Html/Text Edit button to top of content 2024-03-23 11:12:05 -04:00
Shaun Walker
8631eacdf3 Merge pull request #4052 from zyhfish/task/fix-issue-4051
Fix #4051: set the return url correctly.
2024-03-23 11:00:24 -04:00
Shaun Walker
6e7ce10585 Merge pull request #4053 from sbwalker/dev
optimize SiteRouter to only call SyncService for Interactive render mode
2024-03-23 10:57:55 -04:00
sbwalker
3d4a58cb96 optimize SiteRouter to only call SyncService for Interactive render mode 2024-03-23 10:57:43 -04:00
Ben
6fde3f8453 Fix #4051: set the return url correctly. 2024-03-23 21:47:27 +08:00
Shaun Walker
016d2f7ab1 Merge pull request #4049 from sbwalker/dev
fix theme template release.,cmd to copy package to /Packages folder
2024-03-22 15:32:09 -04:00
sbwalker
a8ffc414fe fix theme template release.,cmd to copy package to /Packages folder 2024-03-22 15:31:55 -04:00
Shaun Walker
b0c1c6e880 Merge pull request #4047 from sbwalker/dev
refactoring of #4027
2024-03-21 18:44:28 -04:00
sbwalker
d3e6177a2b refactoring of #4027 2024-03-21 18:44:16 -04:00
Shaun Walker
8adbdcc675 Merge pull request #4027 from zyhfish/task/fix-issue-4025
Fix #4025: add user setting to keep the view mode.
2024-03-21 15:35:10 -04:00
Shaun Walker
d1d7ff0d0a Merge pull request #4046 from sbwalker/dev
use consistent naming in SiteRepository
2024-03-21 15:32:39 -04:00
sbwalker
4b05a49b46 use consistent naming in SiteRepository 2024-03-21 15:32:25 -04:00
Shaun Walker
0309a866c8 Merge pull request #4045 from sbwalker/dev
use DbContextFactory in all Html/Text methods
2024-03-21 15:25:30 -04:00
sbwalker
bbc77f81ca use DbContextFactory in all Html/Text methods 2024-03-21 15:25:17 -04:00
Shaun Walker
483f6f2188 Merge pull request #4044 from sbwalker/dev
move logging from Html/Text controller to Server Service class so that is captured in all render modes
2024-03-21 15:19:47 -04:00
sbwalker
e0ef3ca39a move logging from Html/Text controller to Server Service class so that is captured in all render modes 2024-03-21 15:19:30 -04:00
Shaun Walker
aef29ff6c5 Merge pull request #4043 from sbwalker/dev
ignore Antiforgerytoken in logout as it can sometimes prevent a user from logging out unless they refresh their browser, due to the Antiforgerytoken being expired.
2024-03-21 15:03:10 -04:00
sbwalker
ec7bd8c1c8 ignore Antiforgerytoken in logout as it can sometimes prevent a user from logging out unless they refresh their browser, due to the Antiforgerytoken being expired. 2024-03-21 15:02:50 -04:00
Shaun Walker
fe0d69739d Merge pull request #4042 from sbwalker/dev
updates to module template for static rendering (ActionDialog Id property, Service interface moved to Shared, Client Service using IHttpClientFactory, Async methods added to Repository, Server Service implementation added, Controller uses Server Service implementation, Server Service registered in Startup)
2024-03-21 14:55:31 -04:00
sbwalker
448e3a4639 updates to module template for static rendering (ActionDialog Id property, Service interface moved to Shared, Client Service using IHttpClientFactory, Async methods added to Repository, Server Service implementation added, Controller uses Server Service implementation, Server Service registered in Startup) 2024-03-21 14:55:07 -04:00
Shaun Walker
2e74d6f652 Merge pull request #4041 from sbwalker/dev
update Theme template tp .NET 8.0.3
2024-03-21 11:45:39 -04:00
sbwalker
237108a6d1 update Theme template tp .NET 8.0.3 2024-03-21 11:45:26 -04:00
Shaun Walker
ed3a222ed4 Merge pull request #4040 from sbwalker/dev
additional documentation
2024-03-21 10:51:15 -04:00
sbwalker
8a696f6c52 additional documentation 2024-03-21 10:51:03 -04:00
Shaun Walker
184aa4fd20 Merge pull request #4039 from sbwalker/dev
add HttpClientFactory support
2024-03-21 10:43:59 -04:00
sbwalker
ce14b9e43e add HttpClientFactory support 2024-03-21 10:43:46 -04:00
Shaun Walker
1cdedb89f1 Merge pull request #4029 from zyhfish/task/fix-issue-4028
Fix #4028: check whether the user info is null.
2024-03-21 07:56:49 -04:00
Ben
18efb098f9 remove unused variables. 2024-03-21 08:39:55 +08:00
Ben
fb3a27c02f update the code by following the review suggestions. 2024-03-21 08:38:59 +08:00
Ben
6d41bcd511 update the if condition. 2024-03-21 08:17:45 +08:00
Shaun Walker
e6b981fc38 Merge pull request #4034 from thabaum/module-creator-package-803
Fixes #4033: Updates Module creator template package references to 8.0.3
2024-03-20 14:54:22 -04:00
Cody
74a3ea2a01 Update package references to 8.0.3 2024-03-20 11:31:19 -07:00
Cody
4bfb7a5d29 Updates package dependencies to 8.0.3 2024-03-20 11:29:45 -07:00
Shaun Walker
55ba040e3d Merge pull request #4032 from sbwalker/dev
fix #4031 - add static rendering support to ActionDialog
2024-03-20 13:26:02 -04:00
sbwalker
e4e78e2083 fix #4031 - add static rendering support to ActionDialog 2024-03-20 13:25:51 -04:00
Ben
82f25cc2e5 Fix #4028: check whether the user info is null. 2024-03-20 16:32:51 +08:00
Ben
7b67c9aa8d Fix #4025: add user setting to keep the view mode. 2024-03-20 15:46:32 +08:00
Shaun Walker
854f3b5257 Merge pull request #4021 from sbwalker/dev
fix #4020 - EditUrl contains extra slash on child sites
2024-03-19 14:16:50 -04:00
sbwalker
e37bc99c36 fix #4020 - EditUrl contains extra slash on child sites 2024-03-19 14:16:37 -04:00
Shaun Walker
52121b90ff Merge pull request #4019 from sbwalker/dev
fix #4017 - SiteState being lost in server rendered scenarios
2024-03-19 13:53:26 -04:00
sbwalker
3eb9de57ef fix #4017 - SiteState being lost in server rendered scenarios 2024-03-19 13:53:05 -04:00
Shaun Walker
4ed501f4d4 Merge pull request #4018 from sbwalker/dev
pass RenderModeBoundary parameter when dynamically creating Module Settings component
2024-03-19 10:19:55 -04:00
sbwalker
0bb8ae540d pass RenderModeBoundary parameter when dynamically creating Module Settings component 2024-03-19 10:19:31 -04:00
Shaun Walker
963957f7a6 Merge pull request #4016 from sbwalker/dev
fix #4015 - handle redirect for subfolder aliases
2024-03-19 07:40:25 -04:00
sbwalker
93a152068d fix #4015 - handle redirect for subfolder aliases 2024-03-19 07:40:08 -04:00
Shaun Walker
bb318aefd2 Merge pull request #4011 from zyhfish/task/update-tenant-db-context
Fix #4010: update repositories to using db context factory.
2024-03-18 22:29:27 -04:00
Ben
0cafef7ab4 update to load the data in scope. 2024-03-19 09:19:56 +08:00
Ben
055e54966d upate the code lines. 2024-03-18 21:41:59 +08:00
Ben
c58254f951 Fix #4010: update repositories to using db context factory. 2024-03-18 15:32:19 +08:00
Shaun Walker
ce710134ac Merge pull request #4009 from sbwalker/dev
Remove Synchronize Content option from RichTextEditor
2024-03-17 19:30:55 -04:00
sbwalker
fa68bdc82b Remove Synchronize Content option from RichTextEditor 2024-03-17 19:30:42 -04:00
Shaun Walker
cd9f2ab232 Merge pull request #4006 from zyhfish/task/fix-issue-3977-new 2024-03-17 14:08:23 -04:00
Ben
91136fe48f Fix #3977: missed readonly attribute. 2024-03-17 22:01:27 +08:00
Ben
40cc0f721d Fix #3977: use db context factory. 2024-03-17 21:29:32 +08:00
Shaun Walker
72567c43e6 Merge pull request #4003 from zyhfish/task/fix-issue-4002
Fix #4002: add the quill editor js map file.
2024-03-16 16:25:31 -04:00
Shaun Walker
db82d7a6b3 Merge pull request #4004 from sbwalker/dev
optimize to remove IsInstalled API call on every Web UI request (MAUI clients still require this logic)
2024-03-16 16:24:38 -04:00
sbwalker
c469a61908 optimize to remove IsInstalled API call on every Web UI request (MAUI clients still require this logic) 2024-03-16 16:24:12 -04:00
Ben
1c4bcc5697 Fix #4002: add the quill editor js map file. 2024-03-16 20:24:52 +08:00
Shaun Walker
0f3b0309e8 Merge pull request #4001 from sbwalker/dev
fix #3998 - personalized page display issue
2024-03-15 19:49:49 -07:00
sbwalker
5a393de1cb fix #3998 - personalized page display issue 2024-03-15 22:49:28 -04:00
Shaun Walker
1617a61b33 Merge pull request #4000 from sbwalker/dev
made Pager capable of functioning in Static or Intreractive render modes
2024-03-15 19:48:02 -07:00
sbwalker
ccd18c4f10 made Pager capable of functioning in Static or Intreractive render modes 2024-03-15 22:47:42 -04:00
Shaun Walker
e287f5774a Merge pull request #3996 from sbwalker/dev
fix issue referencing ClaimsPrincipal UserId extension method
2024-03-14 20:55:11 -07:00
sbwalker
2dec3195ac fix issue referencing ClaimsPrincipal UserId extension method 2024-03-14 23:55:01 -04:00
Shaun Walker
2bea6694c7 Merge pull request #3995 from sbwalker/dev
fix #3993 - personalized page throwing 404 on static render mode
2024-03-14 20:15:47 -07:00
sbwalker
38c468a204 fix #3993 - personalized page throwing 404 on static render mode 2024-03-14 23:15:37 -04:00
Shaun Walker
6a80258163 Merge pull request #3994 from sbwalker/dev
add static pager
2024-03-14 20:13:50 -07:00
sbwalker
55fe2600b7 add static pager 2024-03-14 23:13:40 -04:00
Shaun Walker
cad4e183c5 Merge pull request #3992 from thabaum/package-dependencies-803
Fix #3991: Updates Package Dependencies In Project Files To Relating Current Versions For 8.0.3 Release
2024-03-14 19:36:52 -07:00
Cody
ba447d2b00 Update package references to version 8.0.3 release 2024-03-14 15:02:06 -07:00
Cody
fa5e32c46b Update Package References To Version 8.0.3 2024-03-14 14:49:41 -07:00
Cody
e51b7c22a6 Update Package Reference Microsoft.EntityFrameworkCore.Relational To Version 8.0.3 2024-03-14 14:47:22 -07:00
Cody
0473cdc5e1 Update Microsoft.EntityFrameworkCore.Sqlite package reference version to 8.0.3 2024-03-14 14:45:57 -07:00
Cody
36c65e8b5f Update Microsoft.EntityFrameworkCore.SqlServer to version 8.0.3 2024-03-14 14:44:24 -07:00
Cody
d0e81b7778 Update Oqtane.Server.csproj package references to 8.0.3 2024-03-14 14:42:37 -07:00
Cody
7df63c87c9 Update Oqtane.Shared.csproj package references. 2024-03-14 14:38:53 -07:00
Shaun Walker
0021f7b4ba Merge pull request #3985 from leigh-pointer/ActionLink
_text being set and resetting other options
2024-03-13 14:57:20 -07:00
Shaun Walker
540283970a Merge pull request #3986 from sbwalker/dev
fix #3984 - error when file path not specified
2024-03-13 14:54:43 -07:00
sbwalker
5a2b9b60e6 fix #3984 - error when file path not specified 2024-03-13 17:54:25 -04:00
Leigh Pointer
12e09269d3 _text being set and resetting other options
if (IconOnly && !string.IsNullOrEmpty(IconName)) was not having an impact as the _text variable was being reset.

This fix allows the ActionLink to display just the Icon
2024-03-13 14:39:04 +01:00
Shaun Walker
bcad5eda81 Merge pull request #3981 from mdmontesinos/dev
Update Module Template IServerStartup to be ServerStartup instead of DbContextFactory
2024-03-12 10:29:47 -04:00
Shaun Walker
09ad56056e Merge pull request #3982 from sbwalker/dev
improve caching for sites with many registered users
2024-03-12 10:27:55 -04:00
sbwalker
0c8dc63085 improve caching for sites with many registered users 2024-03-12 10:27:32 -04:00
David Montesinos
68e3bcba05 Remove previous [Module]DbContextFactory.cs 2024-03-12 11:40:21 +01:00
David Montesinos
75a6111a9b Add [Module]ServerStartup.cs to Module Template 2024-03-12 11:39:45 +01:00
Shaun Walker
1d9f970169 Merge pull request #3979 from sbwalker/dev
stay in Edit Mode when editing Module Settings
2024-03-11 13:10:35 -04:00
sbwalker
7cc328ed3b stay in Edit Mode when editing Module Settings 2024-03-11 13:10:21 -04:00
Shaun Walker
9a1c88c80d Merge pull request #3978 from sbwalker/dev
fix #3947 - module deletion
2024-03-11 12:37:03 -04:00
sbwalker
b1446438fb fix #3947 - module deletion 2024-03-11 12:36:51 -04:00
Shaun Walker
6ba1d71a81 Merge pull request #3973 from sbwalker/dev
site router optimization
2024-03-10 13:37:30 -04:00
sbwalker
a4f885a2c5 site router optimization 2024-03-10 13:37:05 -04:00
Shaun Walker
a8a3c63f64 Merge pull request #3972 from sbwalker/dev
fix resource processing issue
2024-03-10 09:18:28 -04:00
sbwalker
ace7b4e2af fix resource processing issue 2024-03-10 09:17:54 -04:00
Shaun Walker
a2885a90b7 Merge pull request #3971 from sbwalker/dev
use IServerStartup rather than class naming convention to register server service class
2024-03-09 07:54:27 -05:00
sbwalker
4457487e2a use IServerStartup rather than class naming convention to register server service class 2024-03-09 07:53:58 -05:00
Shaun Walker
830bb5f70d Merge pull request #3970 from sbwalker/dev
remove commented code
2024-03-08 19:34:28 -05:00
sbwalker
9106f9676c remove commented code 2024-03-08 19:34:15 -05:00
Shaun Walker
df1690515c Merge pull request #3969 from sbwalker/dev
consolidate Clone logic for Resource objects
2024-03-08 19:33:23 -05:00
sbwalker
8e287da7b5 consolidate Clone logic for Resource objects 2024-03-08 19:33:09 -05:00
Shaun Walker
128ebe2cb2 Merge pull request #3967 from zyhfish/task/update-template-db-factory
add db factory class into the module template.
2024-03-08 14:04:25 -05:00
Shaun Walker
404964dfde Merge pull request #3968 from sbwalker/dev
add ability to reload JavaScript on page transitions with enhanced navigation
2024-03-08 14:03:40 -05:00
sbwalker
7f74e79253 add ability to reload JavaScript on page transitions with enhanced navigation 2024-03-08 14:03:22 -05:00
Ben
11b5cc83dc add db factory class into the module template. 2024-03-08 22:44:31 +08:00
Shaun Walker
bda9d1f8e2 Merge pull request #3966 from sbwalker/dev
updating ImageSharp to latest
2024-03-08 08:20:39 -05:00
sbwalker
32efeee4c7 updating ImageSharp to latest 2024-03-08 08:15:44 -05:00
Shaun Walker
8adbd90cc3 Merge pull request #3965 from sbwalker/dev
use IServerStartup for registering DbContextFactory
2024-03-08 07:39:47 -05:00
sbwalker
074fcaaa73 use IServerStartup for registering DbContextFactory 2024-03-08 07:39:34 -05:00
Shaun Walker
d2209c8ead Merge pull request #3964 from sbwalker/dev
fix #3962 - ensure Resource management logic is consistent in App and SiteRouter
2024-03-07 13:02:05 -05:00
sbwalker
31f1079dfa fix #3962 - ensure Resource management logic is consistent in App and SiteRouter 2024-03-07 13:01:46 -05:00
Shaun Walker
2b87c83fa7 Merge pull request #3961 from sbwalker/dev
use DbContextFactory in SiteRepository
2024-03-06 16:56:38 -05:00
sbwalker
1c31c1947c use DbContextFactory in SiteRepository 2024-03-06 16:56:27 -05:00
Shaun Walker
50a8a83408 Merge pull request #3960 from sbwalker/dev
stay in edit mode when choosing module action
2024-03-06 14:40:39 -05:00
sbwalker
020fa4eefa stay in edit mode when choosing module action 2024-03-06 14:40:27 -05:00
Shaun Walker
64cf02bc45 Merge pull request #3959 from sbwalker/dev
use DBContextFactory
2024-03-06 11:37:10 -05:00
sbwalker
06bd964adc use DBContextFactory 2024-03-06 11:36:56 -05:00
Shaun Walker
2218b7b853 Merge pull request #3958 from sbwalker/dev
register ServerSiteService as Transient
2024-03-05 12:35:28 -05:00
sbwalker
f6c45cd85a register ServerSiteService as Transient 2024-03-05 12:35:17 -05:00
Shaun Walker
cf4907011b Merge pull request #3957 from sbwalker/dev
fix issue when running .NET MAUI
2024-03-05 12:00:34 -05:00
sbwalker
dea85add5d fix issue when running .NET MAUI 2024-03-05 12:00:23 -05:00
Shaun Walker
aa3325ef35 Merge pull request #3956 from sbwalker/dev
add IClientService support to .NET MAUI
2024-03-05 11:52:40 -05:00
sbwalker
8059ba7306 add IClientService support to .NET MAUI 2024-03-05 11:52:27 -05:00
Shaun Walker
c346c4178d Merge pull request #3954 from sbwalker/dev
optimize to use ITransientService rather than introducing a new IServerService interface which needs to be scanned
2024-03-05 10:59:57 -05:00
sbwalker
f2555563a8 optimize to use ITransientService rather than introducing a new IServerService interface which needs to be scanned 2024-03-05 10:59:39 -05:00
Shaun Walker
b948961d52 Merge pull request #3953 from sbwalker/dev
change IServerService to use Transient rather than Scoped
2024-03-05 10:50:19 -05:00
sbwalker
43987d844f change IServerService to use Transient rather than Scoped 2024-03-05 10:49:50 -05:00
Shaun Walker
cc3b14dbf8 Merge pull request #3952 from zyhfish/task/fix-pr-3948
Fix #3948: re-render correctly when change progress indicator status.
2024-03-05 10:46:49 -05:00
Ben
3cc2d3260e Fix #3948: re-render correctly when change progress indicator status. 2024-03-05 22:59:55 +08:00
Shaun Walker
be155f8c6c Merge pull request #3950 from sbwalker/dev
implement client and server service implementations in Html/Text module
2024-03-05 08:44:21 -05:00
sbwalker
74952cf62d implement client and server service implementations in Html/Text module 2024-03-05 08:44:09 -05:00
Shaun Walker
4a71df7859 Merge pull request #3944 from sbwalker/dev
remove div wrapper in body in Static render mode
2024-03-04 10:30:27 -05:00
sbwalker
7d7ea4c34b remove div wrapper in body in Static render mode 2024-03-04 10:30:09 -05:00
Shaun Walker
026d22f7f9 Merge pull request #3943 from sbwalker/dev
add data-enhance to edit mode transition
2024-03-04 09:30:28 -05:00
sbwalker
babd351151 add data-enhance to edit mode transition 2024-03-04 09:30:14 -05:00
Shaun Walker
d11894fd74 Merge pull request #3942 from sbwalker/dev
allow Admin to navigate to login page when signed in
2024-03-04 08:34:29 -05:00
sbwalker
6072eab01d allow Admin to navigate to login page 2024-03-04 08:34:10 -05:00
Shaun Walker
64e4c77428 Merge pull request #3941 from sbwalker/dev
fix 3937 - url decode before converting to friendly url
2024-03-04 08:24:41 -05:00
sbwalker
48b70d0254 fix 3937 - url decode before converting to friendly url 2024-03-04 08:24:26 -05:00
Shaun Walker
db2015f826 Merge pull request #3940 from sbwalker/dev
fix #3936 - parent page default when adding new pages
2024-03-04 08:12:57 -05:00
sbwalker
f893cf268b fix #3936 - parent page default when adding new pages 2024-03-04 08:12:40 -05:00
Shaun Walker
ad12d42b35 Merge pull request #3939 from oqtane/revert-3938-task/fix-pr-3927
Revert "Fix #3927: change to async method to avoid the exception."
2024-03-04 08:11:35 -05:00
Shaun Walker
63a0c7c10b Revert "Fix #3927: change to async method to avoid the exception." 2024-03-04 08:11:25 -05:00
Shaun Walker
99d4d5ed9a Merge pull request #3938 from zyhfish/task/fix-pr-3927
Fix #3927: change to async method to avoid the exception.
2024-03-04 07:49:11 -05:00
Ben
7910c28be7 Fix #3927: change to async method to avoid the exception. 2024-03-03 20:09:42 +08:00
Shaun Walker
32e1ade388 Merge pull request #3931 from leigh-pointer/autocomplete 2024-03-02 11:50:49 -05:00
Leigh Pointer
a8aac7e1b4 Update Pager.razor
Changing the ID had no effect and on further investigation the best way to achieve this is to use the form tag which is a lot stronger implementation.
2024-03-02 17:28:33 +01:00
Shaun Walker
7404aaf4d2 Merge pull request #3935 from sbwalker/dev
fix #3932 - creating child pages
2024-03-02 09:27:41 -05:00
sbwalker
2f25bd476c fix #3932 - creating child pages 2024-03-02 09:27:24 -05:00
Shaun Walker
681e4ae7fc Merge pull request #3934 from sbwalker/dev
change resource term
2024-03-02 09:07:24 -05:00
sbwalker
e1ed0d2b09 change resource term 2024-03-02 09:07:04 -05:00
Shaun Walker
32567a1c66 Merge pull request #3933 from sbwalker/dev
add support specifying RenderMode for Resources
2024-03-02 08:34:43 -05:00
sbwalker
25753af331 add support specifying RenderMode for Resources 2024-03-02 08:34:24 -05:00
Leigh Pointer
6babcf9536 Improved Search Input Text Field Autocomplete Behavior
This pull request enhances the behavior of the search input text field by disabling the browser’s autocomplete feature.
2024-03-02 11:35:26 +01:00
Shaun Walker
9a05f659f1 Merge pull request #3929 from sbwalker/dev
modifications to ExceptionMiddleware
2024-03-01 16:14:44 -05:00
sbwalker
ca58bf661d modifications to ExceptionMiddleware 2024-03-01 16:14:33 -05:00
Shaun Walker
62695d4d9a Merge pull request #3925 from pyramidsbuilder/add-exception-middleware
added exception middleware to server for logging
2024-03-01 15:05:35 -05:00
Shaun Walker
d723ef0a13 Merge pull request #3928 from sbwalker/dev
improvements to IdentityRevalidatingAuthenticationStateProvider
2024-03-01 12:16:39 -05:00
sbwalker
18160818d5 improvements to IdentityRevalidatingAuthenticationStateProvider 2024-03-01 12:16:24 -05:00
mostafametwally
83bfaabd95 added exception middleware to server for logging 2024-02-29 23:38:36 +01:00
Shaun Walker
e23ac8496e Merge pull request #3924 from sbwalker/dev
call JS Interop in Interactive render mode, use PageState.Site.Themes rather than calling ThemeService from Control Panel
2024-02-29 15:38:23 -05:00
sbwalker
2b7d05df6b call JS Interop in Interactive render mode, use PageState.Site.Themes rather than calling ThemeService from Control Panel 2024-02-29 15:38:04 -05:00
Shaun Walker
606cb249e8 Merge pull request #3923 from sbwalker/dev
set RevalidationInterval to same as default Blazor Web template
2024-02-29 14:48:27 -05:00
sbwalker
0ae739b437 set RevalidationInterval to same as default Blazor Web template 2024-02-29 14:48:14 -05:00
Shaun Walker
f18e57b50e Merge pull request #3922 from sbwalker/dev
add IdentityRevalidatingAuthenticationStateProvider
2024-02-29 14:47:03 -05:00
sbwalker
4c92c582d7 add IdentityRevalidatingAuthenticationStateProvider 2024-02-29 14:46:50 -05:00
Shaun Walker
7b1bfeaca1 Merge pull request #3921 from sbwalker/dev
optimize ParseParameters to use native Uri class
2024-02-29 10:09:32 -05:00
sbwalker
dd1d0d1cb8 optimize ParseParameters to use native Uri class 2024-02-29 10:09:19 -05:00
Shaun Walker
995bd4953b Merge pull request #3920 from thabaum/updates-Microsoft.Data.SqlClient-5.2.0 2024-02-28 23:35:54 -05:00
Cody
32b61ac730 Updates Microsoft.Data.SqlClient package reference version to 5.2.0 2024-02-28 20:06:26 -08:00
Shaun Walker
19bd54f425 Merge pull request #3918 from sbwalker/dev
fix theme fallback to use Oqtane themeinfo resources
2024-02-28 15:53:45 -05:00
sbwalker
76680777ff fix theme fallback to use Oqtane themeinfo resources 2024-02-28 15:53:31 -05:00
Shaun Walker
75b9a8a826 Merge pull request #3917 from sbwalker/dev
fix page Path so it supports the specification of external Urls, querystrings, and anchors
2024-02-28 13:10:32 -05:00
sbwalker
f439541844 fix page Path so it supports the specification of external Urls, querystrings, and anchors 2024-02-28 13:10:14 -05:00
Shaun Walker
65fb21a062 Merge pull request #3916 from sbwalker/dev
change Admin Dashboard to use static rendering and fix invalid markup (H2 within P element)
2024-02-28 09:28:23 -05:00
sbwalker
aa5df3c309 change Admin Dashboard to use static rendering and fix invalid markup (H2 within P element) 2024-02-28 09:28:03 -05:00
Shaun Walker
788394a1c8 Merge pull request #3915 from sbwalker/dev
clean up the data-enhance-nav commented logic in menu components
2024-02-27 17:05:42 -05:00
sbwalker
7286c2f603 remove the data-enhance-nav commented logic in menu components 2024-02-27 17:05:21 -05:00
Shaun Walker
aff230ec7e Merge pull request #3914 from sbwalker/dev
fix #3868 - multiple themes within a site
2024-02-27 17:02:10 -05:00
sbwalker
3d538d0566 fix #3868 - multiple themes within a site 2024-02-27 17:01:57 -05:00
Shaun Walker
a1b287bd9d Merge pull request #3912 from sbwalker/dev
reorganize SiteRepository methods
2024-02-27 15:19:38 -05:00
sbwalker
1d187f525d reorganize SiteRepository methods 2024-02-27 15:19:25 -05:00
Shaun Walker
6c9ab0c019 Merge pull request #3911 from sbwalker/dev
replace Task.Run() logic in SiteService with async SiteRepository methods
2024-02-27 15:13:05 -05:00
sbwalker
e7157a8528 replace Task.Run() logic in SiteService with async SiteRepository methods 2024-02-27 15:12:48 -05:00
Shaun Walker
e2182344a2 Merge pull request #3910 from zyhfish/task/update-pr-3885
remove the visible parameter in module message component.
2024-02-27 10:24:48 -05:00
Ben
9ebd882c3f remove the visible parameter in module message component. 2024-02-27 23:08:27 +08:00
Shaun Walker
f017b6b92f Merge pull request #3908 from sbwalker/dev
remove unecessary using
2024-02-27 08:50:01 -05:00
sbwalker
1c24c4e776 remove unecessary using 2024-02-27 08:49:51 -05:00
Shaun Walker
758e94a8ec Merge pull request #3906 from sbwalker/dev
fix #3885 - do not display modal if message is blank
2024-02-26 16:53:31 -05:00
sbwalker
9a7199bf7f fix #3885 - do not display modal if message is blank 2024-02-26 16:53:17 -05:00
Shaun Walker
1c691fa2c2 Merge pull request #3905 from sbwalker/dev
fix #3889 - move JavaScript references to end of body
2024-02-26 16:40:12 -05:00
sbwalker
b435f49611 fix #3889 - move JavaScript references to end of body 2024-02-26 16:39:59 -05:00
Shaun Walker
bcd7b2552e Merge pull request #3904 from sbwalker/dev
Site Setting terminology changes
2024-02-26 16:28:10 -05:00
sbwalker
e76126fdd9 Site Setting terminology changes 2024-02-26 16:27:58 -05:00
Shaun Walker
3fe55e7395 Merge pull request #3903 from sbwalker/dev
fix prerender helptext
2024-02-26 16:13:50 -05:00
sbwalker
98e11c16fa fix prerender helptext 2024-02-26 16:13:36 -05:00
Shaun Walker
0c5b2d302b Merge pull request #3902 from sbwalker/dev
improve help text for interactivity
2024-02-26 16:08:58 -05:00
sbwalker
0d526a2c4f improve help text for interactivity 2024-02-26 16:08:44 -05:00
Shaun Walker
0a8d49c233 Merge pull request #3901 from sbwalker/dev
change default so that new sites use Static rendering by default
2024-02-26 15:59:17 -05:00
sbwalker
4618d3e38a change default so that new sites use Static rendering by default 2024-02-26 15:59:04 -05:00
Shaun Walker
5521785b87 Merge pull request #3900 from sbwalker/dev
clone Platform property in SiteStte
2024-02-26 14:58:14 -05:00
sbwalker
f12b404d58 clone Platform property in SiteStte 2024-02-26 14:58:01 -05:00
Shaun Walker
6924e3a7d7 Merge pull request #3899 from sbwalker/dev
refresh cache if user is updated
2024-02-26 14:55:12 -05:00
sbwalker
6fbe459903 refresh cache if user is updated 2024-02-26 14:54:59 -05:00
Shaun Walker
0a245e5d65 Merge pull request #3898 from sbwalker/dev
include SiteId in SyncEvent
2024-02-26 14:48:39 -05:00
sbwalker
2ed593c5e0 include SiteId in SyncEvent 2024-02-26 14:48:26 -05:00
Shaun Walker
ce934b8998 Merge pull request #3897 from sbwalker/dev
improve caching for static rendering
2024-02-26 14:28:52 -05:00
sbwalker
aac4d3eefb improve caching for static rendering 2024-02-26 14:28:38 -05:00
Shaun Walker
176dc17c70 Merge pull request #3896 from sbwalker/dev
add Platform property to SiteState and populate on both Web and .NET MAUI
2024-02-26 14:13:13 -05:00
sbwalker
553bbda769 add Platform property to SiteState and populate on both Web and .NET MAUI 2024-02-26 14:12:52 -05:00
Shaun Walker
d4fd2d9ae0 Merge pull request #3895 from sbwalker/dev
admin pages url mappings and visitor management isnavigation property should be false for consistency
2024-02-26 11:51:59 -05:00
sbwalker
c20138c9fc admin pages url mappings and visitor management isnavigation property should be false for consistency 2024-02-26 11:51:35 -05:00
Shaun Walker
7f1ff11a4c Merge pull request #3894 from sbwalker/dev
remove data-enhance from Edit Mode button as it prevents the module actions menu from functioning
2024-02-26 10:57:10 -05:00
sbwalker
ed9121a06f remove data-enhance from Edit Mode button as it prevents the module actions menu from functioning 2024-02-26 10:56:51 -05:00
Shaun Walker
c110611d82 Merge pull request #3892 from zyhfish/task/revert-pr-3875
Revert "removed AddModuleMessage from OnParametersSetAsync methods to mitigate risk of infinite loops"
2024-02-25 09:33:27 -05:00
Ben
cc222a6f4a Revert "removed AddModuleMessage from OnParametersSetAsync methods to mitigate risk of infinite loops"
This reverts commit 92719d095a.
2024-02-25 08:52:55 +08:00
Shaun Walker
8293709f34 Merge pull request #3888 from sbwalker/dev
removing fix for #3868 as it causes other performance issues
2024-02-24 10:56:07 -05:00
sbwalker
707740b7f1 removing fix for #3868 as it causes other performance issues 2024-02-24 10:55:44 -05:00
Shaun Walker
98de661868 Merge pull request #3885 from zyhfish/task/fix-infinite-loop-of-module-message
avoid the infinite loop issue of calling AddModuleMessage method.
2024-02-24 09:56:03 -05:00
Shaun Walker
64df057e2f Merge pull request #3887 from sbwalker/dev
add data-enhance to AdminContainer to prevent flash when closing modal
2024-02-24 09:32:47 -05:00
sbwalker
9d9c5cff75 add data-enhance to AdminContainer to prevent flash when closing modal 2024-02-24 09:32:29 -05:00
Shaun Walker
3ed6f360da Merge pull request #3886 from sbwalker/dev
fix #3868 - add data-enhance.nav attribute
2024-02-24 09:09:40 -05:00
sbwalker
9f07f6441a fix #3868 - add data-enhance.nav attribute 2024-02-24 09:09:15 -05:00
Ben
fc0b326443 set the visible default to true. 2024-02-24 22:02:07 +08:00
Ben
4ac0483ec6 Merge branch 'dev' into task/fix-infinite-loop-of-module-message 2024-02-24 20:48:09 +08:00
Ben
724e78d4d5 avoid the infinite loop issue of calling AddModuleMessage method. 2024-02-24 20:45:22 +08:00
Shaun Walker
6efa0490ea Merge pull request #3883 from sbwalker/dev
organize server RESX files in folders to be consistent with client project
2024-02-23 15:55:47 -05:00
sbwalker
99e032eeb7 organize server RESX files in folders to be consistent with client project 2024-02-23 15:55:31 -05:00
Shaun Walker
c80c212a54 Merge pull request #3869 from pyramidsbuilder/fix-loginpage-focus-for-ws
handle focus error on blazor web assembly when verifying email address
2024-02-23 15:53:18 -05:00
Shaun Walker
95460038cf Merge pull request #3821 from pyramidsbuilder/3794-registration-emails-localization
localized usermanager email messages and message formatting to includ…
2024-02-23 15:53:08 -05:00
Shaun Walker
586e3b891c Merge pull request #3882 from sbwalker/dev
change name of form class to reflect purpose
2024-02-23 14:05:51 -05:00
sbwalker
4402645b37 change name of form class to reflect purpose 2024-02-23 14:05:40 -05:00
Shaun Walker
42624246bd Merge pull request #3881 from sbwalker/dev
fix #3868 - static rendering support for page themes within site
2024-02-23 09:28:48 -05:00
sbwalker
ddd39ea0c9 fix #3868 - static rendering support for page themes within site 2024-02-23 09:28:33 -05:00
Shaun Walker
a95cde372c Merge pull request #3880 from leigh-pointer/ThemeRes
Added Resource Files to Theme Templates
2024-02-23 08:00:05 -05:00
Leigh Pointer
dcbf03c355 Added Resource Files to Theme Templates
Currently the template uses the Localization Resource functionality but it will always default to the hardcoded text.  Leaving it to the developer to add the resources could result in a hit and miss scenario. This PR removes the "mis" side.
2024-02-23 13:46:22 +01:00
Shaun Walker
ce44fb29c9 Merge pull request #3879 from sbwalker/dev
improve UX by adding data-enhance to Edit Mode button
2024-02-23 07:31:24 -05:00
sbwalker
35f5df63e2 improve UX by adding data-enhance to Edit Mode button 2024-02-23 07:31:12 -05:00
Shaun Walker
60c9200c06 Merge pull request #3877 from sbwalker/dev
remove Microsoft.AspNetCore.Components.WebAssembly.DevServer from default module and theme template as it is no longer needed
2024-02-22 16:41:15 -05:00
sbwalker
25dacccb3b remove Microsoft.AspNetCore.Components.WebAssembly.DevServer from default module and theme template as it is no longer needed 2024-02-22 16:40:55 -05:00
Shaun Walker
c0d08d966a Merge pull request #3876 from sbwalker/dev
modify ActionLink to use a link rather than button for disabled scenario
2024-02-22 16:35:04 -05:00
sbwalker
cdfae2e8cb modify ActionLink to use a link rather than button for disabled scenario 2024-02-22 16:34:52 -05:00
Shaun Walker
a3b0c351d0 Merge pull request #3875 from sbwalker/dev
removed AddModuleMessage from OnParametersSetAsync methods to mitigate risk of infinite loops
2024-02-22 14:22:08 -05:00
sbwalker
92719d095a removed AddModuleMessage from OnParametersSetAsync methods to mitigate risk of infinite loops 2024-02-22 14:21:49 -05:00
Shaun Walker
b2dc397fb0 Merge pull request #3813 from pyramidsbuilder/3805-stop-registration-redirect-without-verification
display verification message instead of redirecting new user before e…
2024-02-22 12:34:21 -05:00
Shaun Walker
55e09529c1 Merge pull request #3872 from thabaum/update-Oqtane.Server-dependencies
Updates Microsoft.AspNetCore.Authentication.OpenIdConnect To Version 8.0.2
2024-02-22 12:05:30 -05:00
Shaun Walker
aed91d42bf Merge pull request #3873 from sbwalker/dev
update documentation
2024-02-22 11:02:04 -05:00
sbwalker
eef58f4da0 update documentation 2024-02-22 11:01:49 -05:00
Cody
4c427116a8 Update Microsoft.AspNetCore.Authentication.OpenIdConnect To Version 8.0.2 2024-02-22 07:48:58 -08:00
Shaun Walker
00e9624670 Merge pull request #3870 from thabaum/update-blazor-theme-bootstrap
Updates Blazor Theme Bootstrap to Version 5.3.2
2024-02-22 08:01:15 -05:00
Shaun Walker
b52878fc97 Merge pull request #3871 from sbwalker/dev
include render mode html comment
2024-02-22 08:00:24 -05:00
sbwalker
68d9984d64 include render mode html comment 2024-02-22 08:00:08 -05:00
Cody
c4d293143d Updates Bootstrap to version 5.3.2 2024-02-21 21:23:27 -08:00
mostafametwally
b08d91a218 handle focus error on blazor web assembly when verifying email address 2024-02-22 00:33:45 +01:00
Mostafa
1c586d8811 Merge branch 'dev' into 3805-stop-registration-redirect-without-verification 2024-02-22 00:22:21 +01:00
Shaun Walker
f5e13c25a7 Merge pull request #3822 from pyramidsbuilder/fix-account-lockout-4
fix account lockout to read from correct setting, consider timezone o…
2024-02-21 16:34:54 -05:00
Shaun Walker
6e267b8825 Merge pull request #3867 from thabaum/site-settings-savesite-reload
Fixes #3863 - Site Settings: Always reload the page on SaveSite()
2024-02-21 15:55:07 -05:00
Shaun Walker
6cdfe70ac9 Merge pull request #3829 from thabaum/pages-edit-saving-reload
Admin\Pages\Edit.razor: Adds reload "true" boolean to the SavePage, NavigateTo() method - Fixes #3828
2024-02-21 15:49:54 -05:00
Cody
e8a0c693c9 Always reload the page on PageSave() 2024-02-21 12:04:04 -08:00
Shaun Walker
ac7db87592 Merge pull request #3778 from thabaum/update-theme-bootstrap
Updates theme bootstrap and bootswatch to version 5.3.2 - closes #3772
2024-02-21 13:55:33 -05:00
Shaun Walker
3d37a9eb8b Merge pull request #3866 from sbwalker/dev
update module and theme default templates to use ModuleBase methods rather than ModuleInstance methods
2024-02-21 13:42:32 -05:00
sbwalker
8c5613b182 update module and theme default templates to use ModuleBase methods rather than ModuleInstance methods 2024-02-21 13:42:15 -05:00
Shaun Walker
9e068335b6 Merge pull request #3862 from sbwalker/dev
update default site template with latest Blazor messaging
2024-02-21 10:50:25 -05:00
sbwalker
19ed98f265 update default site template with latest Blazor messaging 2024-02-21 10:50:10 -05:00
Shaun Walker
2aff36a1c0 Merge pull request #3861 from sbwalker/dev
fix #3827 - Cancel button should redirect to RedirectUrl (using PageState.ReturnUrl)
2024-02-21 10:20:14 -05:00
sbwalker
eac7fccbb4 fix #3827 - Cancel button should redirect to RedirectUrl (using PageState.ReturnUrl) 2024-02-21 10:19:55 -05:00
Shaun Walker
7562eaeb5f Merge pull request #3860 from sbwalker/dev
remove Delete option from Scheduled Jobs - they are automatically created at startup
2024-02-21 09:39:27 -05:00
sbwalker
7b38683985 remove Delete option from Scheduled Jobs - they are automatically created at startup 2024-02-21 09:39:06 -05:00
Shaun Walker
27763afbbe Merge pull request #3765 from thabaum/bootstrap-md-responsive-breakpoint
Sets responsive breakpoint match 767.98px = Bootstrap md - Fixes #3762
2024-02-21 09:33:21 -05:00
Shaun Walker
7a2b6f63c9 Merge pull request #3859 from sbwalker/dev
modified resx
2024-02-21 09:32:45 -05:00
sbwalker
2ad8413c6d modified resx 2024-02-21 09:32:31 -05:00
Shaun Walker
956c9000b8 Merge pull request #3823 from pyramidsbuilder/links-login-register-pages
added links from login to register and vice versa
2024-02-21 09:30:38 -05:00
Shaun Walker
838c2994a9 Merge pull request #3810 from zyhfish/task/fix-bug-3807
Fix #3807: parsing the data attributes.
2024-02-21 09:29:42 -05:00
Shaun Walker
9974095659 Merge pull request #3834 from zyhfish/task/token-replace-service
Fix #3833: introduce token replace class.
2024-02-21 09:29:29 -05:00
Shaun Walker
85e289fd4e Merge pull request #3858 from sbwalker/dev
add variability for StreamRendering based on render mode
2024-02-21 08:04:41 -05:00
sbwalker
fa17e7019a add variability for StreamRendering based on render mode 2024-02-21 08:04:24 -05:00
Shaun Walker
edcb24068a Merge pull request #3857 from sbwalker/dev
fix ModuleMessage - form name must be a constant value in static rendering or else it will not post correctly
2024-02-21 07:29:59 -05:00
sbwalker
38ead4909e fix ModuleMessage - form name must be a constant value in static rendering or else it will not post correctly 2024-02-21 07:29:39 -05:00
Shaun Walker
06b2eb7662 Merge pull request #3856 from sbwalker/dev
fix #3838 - Schedule Jobs looping after new install
2024-02-20 15:26:28 -05:00
sbwalker
5685f2699b fix #3838 - Schedule Jobs looping after new install 2024-02-20 15:26:15 -05:00
Shaun Walker
c6916fd71e Merge pull request #3855 from sbwalker/dev
fix #3839 - changing theme in Page Add/Edit throwing exception
2024-02-20 14:54:58 -05:00
sbwalker
df64abaf9c fix #3839 - changing theme in Page Add/Edit throwing exception 2024-02-20 14:54:48 -05:00
Shaun Walker
6ed717556a Merge pull request #3854 from sbwalker/dev
fix ModuleMessage so that it is not dependent on ModuleState
2024-02-20 14:31:33 -05:00
sbwalker
e8c64074f3 fix ModuleMessage so that it is not dependent on ModuleState 2024-02-20 14:31:22 -05:00
Shaun Walker
4af13058f0 Merge pull request #3853 from sbwalker/dev
fix route constructor
2024-02-20 14:15:49 -05:00
sbwalker
f3f223fa22 fix route constructor 2024-02-20 14:15:38 -05:00
Shaun Walker
e244b4b263 Merge pull request #3852 from sbwalker/dev
handle site level scripts in App component
2024-02-20 13:50:25 -05:00
sbwalker
ab09810bef handle site level scripts in App component 2024-02-20 13:50:09 -05:00
Shaun Walker
fbcde465ad Merge pull request #3850 from sbwalker/dev
move stylesheet injection to App component to eliminate flash on static rendering
2024-02-20 10:16:44 -05:00
sbwalker
0f0d168976 move stylesheet injection to App component to eliminate FOUC on static rendering 2024-02-20 10:16:19 -05:00
Shaun Walker
33d15ca66d Merge pull request #3848 from sbwalker/dev
Pass RenderMode and Runtime to Head component
2024-02-19 18:30:12 -05:00
sbwalker
4fad97e8b1 Pass RenderMode and Runtime to Head component 2024-02-19 18:30:01 -05:00
Shaun Walker
81071771d9 Merge pull request #3847 from sbwalker/dev
in static render mode do not filter scripts from head content
2024-02-19 16:46:07 -05:00
sbwalker
4db3bafeda in static render mode do not filter scripts from head content 2024-02-19 16:45:54 -05:00
Shaun Walker
29aff298b8 Merge pull request #3846 from sbwalker/dev
further refactoring of ManageStyleSheets
2024-02-19 16:24:54 -05:00
sbwalker
4271289db0 further refactoring of ManageStyleSheets 2024-02-19 16:24:43 -05:00
Shaun Walker
9818e7c101 Merge pull request #3845 from sbwalker/dev
refactor App to eliminate 2 database calls
2024-02-19 16:16:23 -05:00
sbwalker
121a865bb8 refactor App to eliminate 2 database calls 2024-02-19 16:16:08 -05:00
Shaun Walker
7af340de85 Merge pull request #3844 from sbwalker/dev
remove commented code
2024-02-19 15:47:35 -05:00
sbwalker
cdc0dee6f5 remove commented code 2024-02-19 15:47:23 -05:00
Shaun Walker
4cbefff8b4 Merge pull request #3843 from sbwalker/dev
inject CSS and JS on static rendering
2024-02-19 15:26:00 -05:00
sbwalker
acc562bd7f inject CSS and JS on static rendering 2024-02-19 15:25:48 -05:00
Shaun Walker
44b87dca2a Merge pull request #3842 from sbwalker/dev
add [StreamRendering] to Head component for static rendering
2024-02-19 14:30:29 -05:00
sbwalker
be98f786b3 add [StreamRendering] to Head component for static rendering 2024-02-19 14:30:09 -05:00
Shaun Walker
6f215cbff9 Merge pull request #3826 from thabaum/profile-registration-button-return-url-fix
Fix handling of returnurl parameter in UserProfile component - Fixes #3825
2024-02-18 10:46:53 -05:00
Shaun Walker
96a29e91e8 Merge pull request #3824 from thabaum/fixes-login-button-url
Ensure "login" route is included in login URL construction. Fixes #3766
2024-02-18 10:45:55 -05:00
Shaun Walker
e01a1a456c Merge pull request #3831 from thabaum/IPageService-spelling-correction
Corrects documentation spelling error for the word "Returns" in IPageService.cs
2024-02-18 10:44:42 -05:00
Shaun Walker
2561a6e00e Merge pull request #3832 from thabaum/Cleanup-ModuleDefinititionService-Namespaces
Cleanup module definitition service namespaces
2024-02-18 10:44:24 -05:00
Shaun Walker
e0bee0e0db Merge pull request #3837 from sbwalker/dev
document the mandatory StreamRendering attribute
2024-02-18 10:31:47 -05:00
sbwalker
7910d006ca document the mandatory StreamRendering attribute 2024-02-18 10:31:27 -05:00
Shaun Walker
778a651f7b Merge pull request #3836 from sbwalker/dev
ensure PageState and ModuleState are passed to ModuleMessage if an unhandled module exception occurs
2024-02-18 10:27:49 -05:00
sbwalker
2267dcb768 ensure PageState and ModuleState are passed to ModuleMessage in the event of an unhandled module exception 2024-02-18 10:27:12 -05:00
Shaun Walker
21e7c78744 Merge pull request #3835 from sbwalker/dev
update Npgsql.EntityFrameworkCore.PostgreSQL to version 8.0.2
2024-02-18 10:21:58 -05:00
sbwalker
54418957b6 update Npgsql.EntityFrameworkCore.PostgreSQL to version 8.0.2 2024-02-18 10:21:36 -05:00
Ben
77ce31128c Fix #3833: introduce token replace class. 2024-02-18 21:38:43 +08:00
Cody
79ce990644 cleanup unused namespaces 2024-02-17 18:22:01 -08:00
Cody
2262d44638 Removes unnecessary Oqtane.UI namespace 2024-02-17 18:17:13 -08:00
Cody
972601caf6 correct documentation spelling error 2024-02-17 17:55:38 -08:00
Cody
114ebac21b adds reload "true" boolean to the Save NavigateTo() method 2024-02-17 12:12:57 -08:00
Cody
57a86cd836 Fix handling of returnurl parameter in UserProfile component 2024-02-17 09:11:56 -08:00
Cody
a741b1b9ac Fix Login Button Control Url While On Login Page 2024-02-17 07:22:32 -08:00
mostafametwally
5d64ea48ba added links from login to register and vice versa 2024-02-17 12:28:55 +01:00
mostafametwally
db6c65c7e8 fix account lockout to read from correct setting, consider timezone offset and enable lockout 2024-02-16 23:17:56 +01:00
mostafametwally
b68fc6187f localized usermanager email messages and message formatting to include site name and link #3794 2024-02-16 22:04:12 +01:00
Shaun Walker
766a190015 Merge pull request #3820 from sbwalker/dev
remove PageRepository reference in App
2024-02-16 15:36:36 -05:00
sbwalker
2c17551d50 remove PageRepository reference in App 2024-02-16 15:36:23 -05:00
Shaun Walker
739bc361bd Merge pull request #3819 from sbwalker/dev
ensure script resources are loaded before rendering ThemeBuilder
2024-02-16 15:15:13 -05:00
sbwalker
100fc20928 ensure script resources are loaded before rendering ThemeBuilder 2024-02-16 15:15:02 -05:00
Shaun Walker
f42e79f5cf Merge pull request #3818 from sbwalker/dev
get title and headcontent working again on interactive render mode
2024-02-16 15:08:15 -05:00
sbwalker
04da989108 get title and headcontent working again on interactive render mode 2024-02-16 15:08:04 -05:00
Shaun Walker
11017dd8dc Merge pull request #3815 from sbwalker/dev
fix #3811 - add PreserveCompilationContext back to server project
2024-02-16 11:17:26 -05:00
sbwalker
8d0aa65ab2 fix #3811 - add PreserveCompilationContext back to server project 2024-02-16 11:17:14 -05:00
Shaun Walker
8ffb9e6f11 Merge pull request #3814 from sbwalker/dev
fix issues with installer
2024-02-16 11:13:47 -05:00
sbwalker
b0487798c2 fix issues with installer 2024-02-16 11:13:31 -05:00
Ben
740b89258d Fix #3807: parsing the data attributes. 2024-02-16 19:26:01 +08:00
mostafametwally
9026921214 display verification message instead of redirecting new user before email verification 2024-02-16 11:54:15 +01:00
Shaun Walker
df2aac3946 Merge pull request #3809 from sbwalker/dev
bump version to 5.1.0
2024-02-15 21:27:05 -05:00
sbwalker
829e004ee5 bump version to 5.1.0 2024-02-15 21:26:44 -05:00
Shaun Walker
072384eede Merge pull request #3808 from sbwalker/dev
load PageState in App component and pass to SiteRouter to optimize data loading
2024-02-15 21:17:49 -05:00
sbwalker
dcc8043cf6 load PageState in App component and pass to SiteRouter to optimize data loading 2024-02-15 21:17:23 -05:00
Shaun Walker
62c9484208 Merge pull request #3804 from sbwalker/dev
remove unnecessary using
2024-02-15 16:05:39 -05:00
sbwalker
ebadccbe25 remove unnecessary using 2024-02-15 16:05:27 -05:00
Shaun Walker
8013716158 Merge pull request #3803 from sbwalker/dev
create server-side SiteService
2024-02-15 15:48:33 -05:00
sbwalker
ed7904b673 create server-side SiteService 2024-02-15 15:48:18 -05:00
Shaun Walker
b2e3d33c80 Merge pull request #3797 from sbwalker/dev
fix #3793 - render issues on .NET MAUI
2024-02-15 10:22:37 -05:00
sbwalker
7d1b4d916e fix #3793 - render issues on .NET MAUI 2024-02-15 10:22:14 -05:00
Shaun Walker
0fb45d4584 Merge pull request #3791 from thabaum/update-project-dependencies-802
Update project to reference latest package dependency versions released with 8.0.2 - Closes #3790
2024-02-15 07:30:34 -05:00
Shaun Walker
0008919631 Merge pull request #3792 from thabaum/maui-connectivity-issue
Oqtane.Maui - Updates To New Namespace For DynamicComponent Type Oqtane.UI.Head - Fixes #3753
2024-02-15 07:29:42 -05:00
Shaun Walker
6bf8d19775 Merge pull request #3796 from thabaum/maui-app-css-app-form-button
adds app-form-button styles to sync with Oqtane.Server App.css - Fixes #3795
2024-02-15 07:29:21 -05:00
Cody
2e3ef87c42 adds app-form-button styles to sync with Oqtane.Server App.css 2024-02-14 14:55:21 -08:00
Cody
abdd5cf19b Updates To New Namespace For DynamicComponent Type - Fixes #3753 2024-02-14 13:30:41 -08:00
Cody
8a636736b4 Update project dependecies to 8.0.2 2024-02-14 12:53:14 -08:00
Cody
8fe2529306 Update project dependecies to 8.0.2 2024-02-14 12:52:26 -08:00
Cody
6db217387f Update project dependecies to 8.0.2 2024-02-14 12:51:10 -08:00
Cody
d33172df11 Update to latest project dependencies 2024-02-14 12:05:35 -08:00
Cody
206a83c935 Update to latest package dependencies 2024-02-14 11:59:02 -08:00
Cody
6a0935960b Update to latest package dependencies 2024-02-14 11:58:21 -08:00
Cody
3665a792d8 Update to latest package dependencies 2024-02-14 11:57:26 -08:00
Cody
90a58a1f37 Update to latest package dependencies 2024-02-14 11:55:51 -08:00
Cody
f81eaf62ff Update to latest package dependecies 2024-02-14 11:54:20 -08:00
Cody
8567f9b19f Updates package dependences to latest versions. 2024-02-14 11:52:25 -08:00
Shaun Walker
e33fc1a89b Merge pull request #3788 from sbwalker/dev
force ModuleActions to interactive render mode
2024-02-14 13:49:10 -05:00
sbwalker
872ec90654 force ModuleActions to interactive render mode 2024-02-14 13:48:56 -05:00
Shaun Walker
921f5524e7 Merge pull request #3787 from sbwalker/dev
fix #3781 - ModuleBase breaking change
2024-02-14 11:54:17 -05:00
sbwalker
a65959de3f fix #3781 - ModuleBase breaking change 2024-02-14 11:54:04 -05:00
Shaun Walker
bc095d087c Merge pull request #3786 from sbwalker/dev
force control panel to interactive render mode
2024-02-14 11:06:12 -05:00
sbwalker
3db744269e force control panel to interactive render mode 2024-02-14 11:05:49 -05:00
Shaun Walker
701e2f819b Merge pull request #3785 from sbwalker/dev
more Control Panel use cases supported on static rendering
2024-02-13 21:26:13 -05:00
sbwalker
88bf569752 more Control Panel use cases supported on static rendering 2024-02-13 21:25:53 -05:00
Shaun Walker
7283f48b36 Merge pull request #3784 from sbwalker/dev
changes to allow adding modules via control panel in static rendering  (note that onchange events have not been changed to an alternative approach yet)
2024-02-13 13:09:25 -05:00
sbwalker
f677b63c5c changes to allow adding modules via control panel in static rendering (note that onchange events have not been changed to an alternative approach yet) 2024-02-13 13:08:46 -05:00
Shaun Walker
b2e4172c12 Merge pull request #3783 from sbwalker/dev
enable close of modal admin container on static rendering
2024-02-13 11:58:15 -05:00
sbwalker
e0bec82a1c enable close of modal admin container on static rendering 2024-02-13 11:58:00 -05:00
Shaun Walker
6cf117b3d0 Merge pull request #3782 from sbwalker/dev
enable Edit Mode in static rendering
2024-02-12 16:00:16 -05:00
sbwalker
6bcf47fc4b enable Edit Mode in static rendering 2024-02-12 16:00:01 -05:00
Shaun Walker
6d968bbbd8 Merge pull request #3780 from sbwalker/dev
remove unused Action form field
2024-02-12 15:45:48 -05:00
sbwalker
8b803faf72 remove unused Action form field 2024-02-12 15:45:35 -05:00
Shaun Walker
d9bcb16d9e Merge pull request #3779 from sbwalker/dev
enable Admin Dashboard in static rendering
2024-02-12 15:43:36 -05:00
sbwalker
ead9f0b3c6 enable Admin Dashboard in static rendering 2024-02-12 15:43:24 -05:00
Cody
6168621a36 Update ThemeInfo.cs 2024-02-12 11:58:08 -08:00
Cody
d48c257b19 Update Bootstrap 5.3.2 Integrity 2024-02-12 11:53:42 -08:00
Cody
d723bbe3b7 Updates to bootstrap 5.3.2 2024-02-12 11:44:27 -08:00
Cody
f68e9c7681 updates bootstrap to latest 2024-02-12 11:41:33 -08:00
Shaun Walker
f7a59edf19 Merge pull request #3773 from sbwalker/dev
include script resources during static rendering
2024-02-12 12:40:26 -05:00
sbwalker
a4741e28c5 include script resources during static rendering 2024-02-12 12:40:11 -05:00
Shaun Walker
c48ca99817 Merge pull request #3770 from sbwalker/dev
allow prerender selection in all scenarios
2024-02-12 09:14:23 -05:00
sbwalker
2b6965f801 allow prerender selection in all scenarios 2024-02-12 09:14:05 -05:00
Shaun Walker
caec4f80bb Merge pull request #3769 from sbwalker/dev
remove debugging info from UI
2024-02-12 09:06:06 -05:00
sbwalker
9aa7672b17 remove debugging info from UI 2024-02-12 09:05:47 -05:00
Shaun Walker
8e03cf9fc8 Merge pull request #3768 from sbwalker/dev
Resolve issue where components are not being rendered interactively
2024-02-12 08:52:07 -05:00
sbwalker
8d9a050ad6 Resolve issue where components are not being rendered interactively 2024-02-12 08:51:41 -05:00
Cody
266e08817e sets responsive breakpoint to bootstrap md 767.98px 2024-02-10 09:43:18 -08:00
Cody
6c3526d47e sets responsive breakpoint to 767.98 bootstrap md 2024-02-10 09:42:40 -08:00
Cody
19adfd5116 sets responsive breakpoint to bootstrap md 767.98px 2024-02-10 09:40:46 -08:00
Shaun Walker
485f7fdcef Merge pull request #3764 from sbwalker/dev
updates to make identical to POC - still not working
2024-02-10 11:46:32 -05:00
sbwalker
856afcf3bf updates to make identical to POC - still not working 2024-02-10 11:46:07 -05:00
Shaun Walker
934b5e344f Merge pull request #3759 from thabaum/update-maui-packages
Fixes #3758 Updates Referenced Maui Packages To Latest
2024-02-10 11:27:34 -05:00
Shaun Walker
82eb8f14aa Merge pull request #3763 from sbwalker/dev
fix #3760 include form button wrapper CSS class for inline-block
2024-02-10 11:26:14 -05:00
sbwalker
caa9cc213d fix #3760 include form button wrapper CSS class for inline-block 2024-02-10 11:25:54 -05:00
Cody
403325d9dd Updates Maui Project Package References
includes     <PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="8.0.6" /> which will otherwise be requested as an update from 8.0.3 in package manager.
2024-02-09 15:18:09 -08:00
Cody
62b3ca2fb9 Updates Referenced Maui Packages To Latest 2024-02-09 14:19:25 -08:00
Shaun Walker
e6034223f8 Merge pull request #3757 from sbwalker/dev
change RESX values for Runtime
2024-02-09 16:35:43 -05:00
sbwalker
da02bea945 change RESX values for Runtime 2024-02-09 16:35:27 -05:00
Shaun Walker
dd308d9276 Merge pull request #3756 from sbwalker/dev
Interactivity needs to be selectable regardless of the default render mode
2024-02-09 16:24:49 -05:00
sbwalker
fce72cad55 Interactivity needs to be selectable regardless of the default render mode 2024-02-09 16:24:30 -05:00
Shaun Walker
901b23e5ae Merge pull request #3755 from sbwalker/dev
create component using RenderTreeBuilder
2024-02-09 15:46:59 -05:00
sbwalker
df4d4d36bc create component using RenderTreeBuilder 2024-02-09 15:46:44 -05:00
Shaun Walker
408c56bfcf Merge pull request #3752 from sbwalker/dev
rename RenderMode class and adding usings
2024-02-09 14:34:48 -05:00
sbwalker
ea75ddfa85 rename RenderMode class and adding usings 2024-02-09 14:34:33 -05:00
Shaun Walker
bda5619b97 Merge pull request #3751 from sbwalker/dev
specify default interactive render mode
2024-02-09 11:00:08 -05:00
sbwalker
f6fb3cc766 specify default interactive render mode 2024-02-09 10:59:51 -05:00
Shaun Walker
7c3cb118a4 Merge pull request #3750 from sbwalker/dev
improve debug message
2024-02-09 09:10:23 -05:00
sbwalker
d03565ad95 improve debug message 2024-02-09 09:10:03 -05:00
Shaun Walker
c0f5746d1d Merge pull request #3749 from sbwalker/dev
add text to display render mode
2024-02-09 08:56:41 -05:00
sbwalker
a686bec025 add text to display render mode 2024-02-09 08:56:25 -05:00
Shaun Walker
c0d36bb85e Merge pull request #3748 from sbwalker/dev
preserve backward compatibility but flag methods as obsolete
2024-02-09 08:47:41 -05:00
sbwalker
e6df8dcd2e preserve backward compatibility but flag methods as obsolete 2024-02-09 08:47:20 -05:00
Shaun Walker
6f3fd99130 Merge pull request #3746 from sbwalker/dev
render mode optimization
2024-02-08 15:58:44 -05:00
sbwalker
b5f7106780 render mode optimization 2024-02-08 15:58:31 -05:00
Shaun Walker
e2f6dcab01 Merge pull request #3745 from sbwalker/dev
set Html/Text module to Static rendering
2024-02-08 15:53:47 -05:00
sbwalker
ff2f218bf0 set Html/Text module to Static rendering 2024-02-08 15:53:24 -05:00
Shaun Walker
902ed6e287 Merge pull request #3744 from sbwalker/dev
implement RenderModeBoundary
2024-02-08 15:47:51 -05:00
sbwalker
a40b49f2ed implement RenderModeBoundary 2024-02-08 15:47:25 -05:00
Shaun Walker
fc3b55b135 Merge pull request #3743 from sbwalker/dev
add @attribute [StreamRendering] attribute to Routes.razor and rollback #3739
2024-02-08 09:26:06 -05:00
sbwalker
07bd5c633e add @attribute [StreamRendering] attribute to Routes.razor and remove #3739 2024-02-08 09:25:31 -05:00
Shaun Walker
f70dc14340 Merge pull request #3741 from sbwalker/dev
remove UseBlazorFrameworkFiles as no longer needed
2024-02-06 12:43:25 -05:00
sbwalker
3d49ab2ae0 remove UseBlazorFrameworkFiles as no longer needed 2024-02-06 12:42:31 -05:00
Shaun Walker
a133c39167 Merge pull request #3740 from sbwalker/dev
update project files to make consistent with Blazor template
2024-02-06 11:41:04 -05:00
sbwalker
c9c8e20511 update project files to make consistent with Blazor template 2024-02-06 11:40:44 -05:00
Shaun Walker
509ff7e833 Merge pull request #3739 from sbwalker/dev
temporary hack to allow Static rendering to (sort of) work - this will need to be removed later
2024-02-06 11:28:59 -05:00
sbwalker
a7a5fdb7f5 temporary hack to allow Static rendering to (sort of) work - this will need to be removed later 2024-02-06 11:28:37 -05:00
Shaun Walker
cf9ef281ce Merge pull request #3738 from sbwalker/dev
optrimization to eliminate file lookup in Logo control
2024-02-06 11:26:47 -05:00
sbwalker
6345335be2 optrimization to eliminate file lookup in Logo control 2024-02-06 11:26:31 -05:00
Shaun Walker
a008ec3729 Merge pull request #3732 from sbwalker/dev
use Runtimes constant
2024-02-02 14:38:49 -05:00
sbwalker
e7a48f3909 use Runtimes constant 2024-02-02 14:38:37 -05:00
Shaun Walker
718553373f Merge pull request #3731 from sbwalker/dev
changes for static rendering
2024-02-02 13:08:18 -05:00
sbwalker
310772d7fe changes for static rendering 2024-02-02 13:08:05 -05:00
Shaun Walker
213e6fab57 Merge pull request #3730 from sbwalker/dev
update .NET MAUI client to reflect changes
2024-02-02 10:56:35 -05:00
sbwalker
b7dbed5cd4 update .NET MAUI client to reflect changes 2024-02-02 10:56:24 -05:00
Shaun Walker
b621f2c24d Merge pull request #3729 from sbwalker/dev
move root UI components to UI namespace
2024-02-02 10:38:29 -05:00
sbwalker
21b9b090f9 move root UI components to UI namespace 2024-02-02 10:38:16 -05:00
Shaun Walker
709121b07f Merge pull request #3728 from sbwalker/dev
Fix #3723 - cancel from login not redirecting properly
2024-02-02 09:07:03 -05:00
sbwalker
bb02a17e44 Fix #3723 - cancel from login not redirecting properly 2024-02-02 09:06:51 -05:00
Shaun Walker
fd40c58b9c Merge pull request #3724 from thabaum/login-cancel-null-exception
Fixes: #3723 - Fix refresh() unnecessary conditional check for page values
2024-02-02 09:06:08 -05:00
Shaun Walker
b7a6f1249d Merge pull request #3727 from sbwalker/dev
change extension method name to reflect actual purpose
2024-02-02 08:54:16 -05:00
sbwalker
71125f07cc change extension method name to reflect actual purpose 2024-02-02 08:54:01 -05:00
Cody
8500f5b437 Fix refresh() conditional check for page 2024-02-01 14:36:14 -08:00
Shaun Walker
eb25d9d7af Merge pull request #3722 from sbwalker/dev
add support for Razor Pages
2024-02-01 16:49:42 -05:00
sbwalker
033c85fc4b add support for Razor Pages 2024-02-01 16:49:29 -05:00
Shaun Walker
1663731489 Merge pull request #3721 from sbwalker/dev
use new Cascading Authentication State Services
2024-02-01 15:47:16 -05:00
sbwalker
1f65d47811 use new Cascading Authentication State Services 2024-02-01 15:47:03 -05:00
Shaun Walker
897cba3d07 Merge pull request #3720 from sbwalker/dev
remove unused NavigationManager reference
2024-02-01 15:19:29 -05:00
sbwalker
f0e2247f06 remove unused NavigationManager reference 2024-02-01 15:19:15 -05:00
Shaun Walker
1470ec60db Merge pull request #3719 from sbwalker/dev
remove unnecessary constants
2024-02-01 10:46:06 -05:00
sbwalker
7c04792777 remove unnecessary constants 2024-02-01 10:45:52 -05:00
Shaun Walker
6e750a2af0 Merge pull request #3718 from sbwalker/dev
fix Runtimes property behavior
2024-02-01 10:08:55 -05:00
sbwalker
7640dab380 fix Runtimes property behavior 2024-02-01 10:08:41 -05:00
Shaun Walker
6c10908cb7 Merge pull request #3717 from sbwalker/dev
add RenderMode to IModuleControl
2024-02-01 09:59:43 -05:00
sbwalker
abd235f332 add RenderMode to IModuleControl 2024-02-01 09:59:28 -05:00
Shaun Walker
4a638e82cc Merge pull request #3716 from sbwalker/dev
use new contants in .NET MAUI
2024-02-01 09:48:00 -05:00
sbwalker
156d39490e use new contants in .NET MAUI 2024-02-01 09:47:46 -05:00
Shaun Walker
a39968868f Update appsettings.release.json 2024-02-01 09:10:13 -05:00
Shaun Walker
e0587ad17b Update appsettings.json 2024-02-01 09:09:58 -05:00
Shaun Walker
06106f3831 Merge pull request #3715 from sbwalker/dev
split RenderMode and Runtime configuration
2024-02-01 09:08:57 -05:00
sbwalker
1e332ed075 split RenderMode and Runtime configuration 2024-02-01 09:08:39 -05:00
Shaun Walker
cef56cb5f1 Merge pull request #3714 from sbwalker/dev
fix site Hybrid behavior
2024-01-31 16:40:09 -05:00
sbwalker
97762712e6 fix site Hybrid behavior 2024-01-31 16:39:46 -05:00
Shaun Walker
4575996995 Merge pull request #3713 from sbwalker/dev
use new RenderModes constant
2024-01-31 16:26:47 -05:00
sbwalker
9a4594227e use new RenderModes constant 2024-01-31 16:26:35 -05:00
Shaun Walker
399bec62c2 Merge pull request #3712 from sbwalker/dev
remove app.UseAntiForgery as it is handled by the IAntiforgery service
2024-01-31 16:21:37 -05:00
sbwalker
177d015fc6 remove app.UseAntiForgery as it is handled by the IAntiforgery service 2024-01-31 16:21:23 -05:00
Shaun Walker
afd62ceeeb Merge pull request #3711 from sbwalker/dev
document CORS policy
2024-01-31 16:16:08 -05:00
sbwalker
44c088c96d document CORS policy 2024-01-31 16:15:57 -05:00
Shaun Walker
cf65347cd8 Merge pull request #3710 from sbwalker/dev
remove commented code and add SignalR options
2024-01-31 16:13:04 -05:00
sbwalker
9fe54c5d21 remove commented code and add SignalR options 2024-01-31 16:12:53 -05:00
Shaun Walker
0210ef2764 Merge pull request #3709 from sbwalker/dev
fix .NET MAUI integration
2024-01-31 15:43:28 -05:00
sbwalker
c66982c9bc fix .NET MAUI integration 2024-01-31 15:43:17 -05:00
Shaun Walker
a88be30c3f Update appsettings.release.json 2024-01-31 15:31:12 -05:00
Shaun Walker
155cd31ced Update appsettings.json 2024-01-31 15:30:48 -05:00
Shaun Walker
52dc77a00f Merge pull request #3708 from sbwalker/dev
remove Runtime from System Info
2024-01-31 15:30:18 -05:00
sbwalker
c5de56790a remove Runtime from System Info 2024-01-31 15:30:07 -05:00
Shaun Walker
d97cb4c360 Merge pull request #3707 from sbwalker/dev
render mode integration
2024-01-31 15:22:39 -05:00
sbwalker
8e499d164a render mode integration 2024-01-31 15:22:21 -05:00
Shaun Walker
764e1ac35f Merge pull request #3706 from sbwalker/dev
add support for Jwt Token creation
2024-01-31 11:11:51 -05:00
sbwalker
69e4fcfc76 add support for Jwt Token creation 2024-01-31 11:11:40 -05:00
Shaun Walker
951071e7ba Merge pull request #3705 from sbwalker/dev
remove unnecessary database call to GetSettings()
2024-01-31 10:58:40 -05:00
sbwalker
5e82700871 remove unnecessary database call to GetSettings() 2024-01-31 10:58:28 -05:00
Shaun Walker
4c706a213a Merge pull request #3704 from sbwalker/dev
add support for visitor tracking
2024-01-31 10:49:38 -05:00
sbwalker
d0da1f43a9 add support for visitor tracking 2024-01-31 10:49:26 -05:00
Shaun Walker
4afc439169 Merge pull request #3703 from sbwalker/dev
add support for page not found functionality
2024-01-31 10:03:40 -05:00
sbwalker
e47690dd52 add support for page not found functionality 2024-01-31 10:03:25 -05:00
Shaun Walker
7859aa0ce8 Merge pull request #3699 from thabaum/patch-7
Removed unintended space added from PR #3692.
2024-01-31 09:41:28 -05:00
Shaun Walker
710c192e39 Merge pull request #3702 from sbwalker/dev
add support for Render Modes and Prerendering
2024-01-31 09:41:00 -05:00
sbwalker
50e179f7a8 add support for Render Modes and Prerendering 2024-01-31 09:40:47 -05:00
Shaun Walker
980a9d0640 Merge pull request #3701 from sbwalker/dev
implement non-default alias redirect
2024-01-31 08:19:16 -05:00
sbwalker
fdfbf54808 implement non-default alias redirect 2024-01-31 08:18:56 -05:00
Shaun Walker
fe8b0d99e5 Merge pull request #3700 from sbwalker/dev
resolve antiforgery issue
2024-01-31 07:34:06 -05:00
sbwalker
7e817a5808 resolve antiforgery issue 2024-01-31 07:33:52 -05:00
Cody
23b68bd9f9 Removed unnecessary space. 2024-01-30 15:48:40 -08:00
Shaun Walker
0a8bbc7d3a Merge pull request #3692 from leigh-pointer/MenuWhiteSpace
Menu theme fix #3680
2024-01-30 16:39:00 -05:00
Shaun Walker
0f5200aaf8 Merge pull request #3697 from sbwalker/dev
initial changes to migrate to new Blazor approach in .NET 8
2024-01-30 16:04:04 -05:00
sbwalker
82d7b9cf05 initial changes to migrate to new Blazor approach in .NET 8 2024-01-30 16:03:50 -05:00
Shaun Walker
0f5fafac8d Merge pull request #3696 from sbwalker/dev
add IDisposable declaration to accompany existing Dispose() method
2024-01-30 13:14:01 -05:00
sbwalker
7fcfffba6f add IDisposable declaration to accompany existing Dispose() method 2024-01-30 13:13:49 -05:00
Shaun Walker
13e9ef4c34 Merge pull request #3693 from sbwalker/dev
bump version to 5.0.3
2024-01-29 12:55:53 -05:00
sbwalker
ea04c7d5eb bump version to 5.0.3 2024-01-29 12:55:39 -05:00
Leigh Pointer
8bf29528e3 Updated Theme Template
Template updated with white-space: nowrap; and corrected the app-menu class
2024-01-29 07:19:30 +01:00
Leigh Pointer
c6f65debcf Menu theme fix #3680
Added white-space: nowrap; to the .app-menu .nav-item
2024-01-28 11:56:55 +01:00
markdav-is
370b39a139 Merge branch 'release/v5.0.1' into dev 2024-01-27 21:18:58 -08:00
Mark Davis
7b7e64576f Update appsettings.json 2024-01-27 20:30:20 -08:00
Shaun Walker
d8b717a879 Update README.md 2024-01-25 15:08:56 -05:00
Shaun Walker
3967017ebb Merge pull request #3687 from oqtane/master
5.0.2 release
2024-01-25 14:56:55 -05:00
Shaun Walker
d93862043a Merge pull request #3686 from oqtane/dev
5.0.2 release
2024-01-25 14:56:33 -05:00
Shaun Walker
719276b32a Merge pull request #3685 from sbwalker/dev
fix incorrect migration id
2024-01-25 14:40:48 -05:00
sbwalker
bf13f06e68 fix incorrect migration id 2024-01-25 14:40:32 -05:00
Shaun Walker
9f770d08f5 Merge pull request #3684 from sbwalker/dev
update default Module and Theme template to .NET 8.0.1 to match framework
2024-01-25 13:50:32 -05:00
sbwalker
e62c529c1f update default Module and Theme template to .NET 8.0.1 to match framework 2024-01-25 13:50:13 -05:00
Shaun Walker
4e1fc9b031 Merge pull request #3681 from zyhfish/task/fix-bug-3648
fix #3648: update the template to correct the entity table name.
2024-01-25 13:41:13 -05:00
Shaun Walker
7d175ad38d Merge pull request #3683 from sbwalker/dev
resolve regression installation issue with PostgreSQL
2024-01-25 13:39:35 -05:00
sbwalker
de2c56560e resolve regression installation issue with PostgreSQL 2024-01-25 13:39:23 -05:00
Shaun Walker
0db413cb18 Merge pull request #3682 from sbwalker/dev
fix #3653 - mySQL installation failing on Rows reserved word
2024-01-25 10:59:32 -05:00
sbwalker
7c6424e05c fix #3653 - mySQL installation failing on Rows reserved word 2024-01-25 10:59:18 -05:00
Ben
3c328a00b5 fix #3648: update the template to correct the entity table name. 2024-01-25 23:00:45 +08:00
Shaun Walker
e36f13c595 Merge pull request #3679 from sbwalker/dev
upgrade to MySQL dependencies
2024-01-24 16:49:23 -05:00
sbwalker
38a5cc33e8 upgrade to MySQL dependencies 2024-01-24 16:49:02 -05:00
Shaun Walker
245a3a73d8 Merge pull request #3677 from sbwalker/dev
improvements to .NET MAUI file upload based on #3674 (credit @thabaum)
2024-01-24 09:37:45 -05:00
sbwalker
d57d7ec4d8 improvements to .NET MAUI file upload based on #3674 (credit @thabaum) 2024-01-24 09:37:27 -05:00
Shaun Walker
09a4e4a6a5 Merge pull request #3673 from sbwalker/dev
remove unnecessary service and usings
2024-01-23 13:14:40 -05:00
sbwalker
d9beb4b660 remove unnecessary service and usings 2024-01-23 13:14:28 -05:00
Shaun Walker
63507a5567 Update README.md 2024-01-23 11:07:37 -05:00
Shaun Walker
e42dc259d8 Merge pull request #3672 from sbwalker/dev
prepare for 5.0.2 release
2024-01-23 11:06:30 -05:00
sbwalker
f59f8d1937 prepare for 5.0.2 release 2024-01-23 11:06:15 -05:00
Shaun Walker
0387bde81b Merge pull request #3671 from sbwalker/dev
fix #3669 add CORS policy and use Jwt with XHR to allow file uploads to work in .NET MAUI
2024-01-23 10:34:39 -05:00
sbwalker
b8fe95b945 fix #3669 add CORS policy and use Jwt with XHR to allow file uploads to work in .NET MAUI 2024-01-23 10:34:18 -05:00
Shaun Walker
792a1652e3 Merge pull request #3668 from sbwalker/dev
fix typo
2024-01-22 08:38:46 -05:00
sbwalker
4816bfa26d fix typo 2024-01-22 08:38:31 -05:00
Shaun Walker
95d1680ac3 Merge pull request #3667 from sbwalker/dev
fix #3656 - UploadableFiles and ImageFiles settings not loaded properly to handle empty string value resulting in upload issues
2024-01-22 08:24:20 -05:00
sbwalker
5e1e6aea16 fix #3656 - UploadableFiles and ImageFiles settings not loaded properly to handle empty string value resulting in upload issues 2024-01-22 08:24:01 -05:00
Shaun Walker
00696943d1 Merge pull request #3660 from sbwalker/dev
update license
2024-01-19 16:44:17 -05:00
sbwalker
c1d293f9f9 update license 2024-01-19 16:44:06 -05:00
Shaun Walker
d4d61d10bc Merge pull request #3659 from sbwalker/dev
improve help text for autocomplete
2024-01-19 15:36:01 -05:00
sbwalker
c09e5e6552 improve help text for autocomplete 2024-01-19 15:35:48 -05:00
Shaun Walker
ab08732ba8 Merge pull request #3652 from thabaum/ENH-Adds-Profile-Autocomplete-Setting
Enh: Autocomplete Attribute Enhancement
2024-01-19 15:25:13 -05:00
Shaun Walker
584a7eb9e2 Merge pull request #3598 from thabaum/module-creator-notification-tool-tips
Module Creator Owner/Name + Notification Help Text Includes Warning Not To Use The Word "Oqtane".  Fixes #3597
2024-01-19 15:18:42 -05:00
Shaun Walker
d44b04f425 Merge pull request #3658 from sbwalker/dev
update copyright year
2024-01-19 14:54:05 -05:00
sbwalker
eeec04b21a update copyright year 2024-01-19 14:53:54 -05:00
Shaun Walker
0642bc28bc Merge pull request #3657 from sbwalker/dev
do not include Licensing assembly with framework but prevent uninstall
2024-01-19 13:22:52 -05:00
sbwalker
2b12b67582 do not include Licensing assembly with framework but prevent uninstall 2024-01-19 13:22:38 -05:00
Cody
d9b575b051 undo changes to autocomplete. 2024-01-19 08:15:48 -08:00
Cody
c6dbb41724 removes recently added autocomplete attributes 2024-01-18 14:41:02 -08:00
Cody
ea4c1bf5e5 removes hardcoded autocomplete attributes last added 2024-01-18 14:38:31 -08:00
Cody
67afc050b8 Adds to form autocomplete="on" attribute and setting. 2024-01-18 14:23:10 -08:00
Cody
6e90da90f1 adds autocomplete to email and username + fixes a typo 2024-01-18 14:08:05 -08:00
Cody
26872c829b adds autocomplete attribute to username, email and display name input elements. 2024-01-18 14:06:10 -08:00
Shaun Walker
34f32c8ba5 Merge pull request #3649 from thabaum/clean-protocal-save-alias
Cleans protocol to check for duplicate alias prior to saving.  Fixes #3647
2024-01-18 07:57:53 -05:00
Shaun Walker
b0d847dc18 Merge pull request #3654 from thabaum/XMLHttpRequest-statusText
Updates request.status to request.statusText in Interop.js
2024-01-18 07:57:31 -05:00
Shaun Walker
adabef9706 Merge pull request #3655 from sbwalker/dev
fix issue when inserting images into RichTextEditor
2024-01-17 13:36:05 -05:00
sbwalker
474adf2d53 fix issue when inserting images into RichTextEditor 2024-01-17 13:35:52 -05:00
Cody
4f23ad37f5 Sets Profile Autocomplete Property 50 Character Limit 2024-01-17 09:07:03 -08:00
Cody
eb6b160377 updates autocomplete default tooltip and limits characters to 30. 2024-01-16 17:56:32 -08:00
Cody
0770e00d8d Updates Autocomplete.HelpText 2024-01-16 17:46:30 -08:00
Cody
ab0e95177e Updates request.status to request.statusText 2024-01-16 17:30:41 -08:00
Cody
cfd9e4b256 Updates request.status to request.statusText 2024-01-16 17:29:54 -08:00
Cody
bfed0ed791 Refactor SaveAlias method and add URL protocol check
Restructured the SaveAlias method for improved readability and added a check to handle cases where the _aliasname contains a URL protocol (e.g., "://"). This ensures proper handling of different URL formats.
2024-01-16 10:43:24 -08:00
Cody
3cec9f7ee0 fix formatting 2024-01-15 09:59:22 -08:00
Cody
3a5dc62908 Sanitize _aliasname by removing protocols 2024-01-15 09:56:11 -08:00
Cody
e0cdfcf403 adds Autocomplete property 2024-01-15 09:30:37 -08:00
Cody
439866216c adds autocomplete attribute to select element 2024-01-15 09:10:12 -08:00
Cody
a1b0731665 profile autocomplete migration 2024-01-15 08:24:06 -08:00
Shaun Walker
bcc216fd2e Merge pull request #3645 from thabaum/file-controller-upload-null
Handle null or empty formfile in UploadFile Method - Fixes #3646
2024-01-15 08:55:04 -05:00
Shaun Walker
574d848828 Merge pull request #3644 from thabaum/interop-xrs-status-update
Interop.js xrs status update Fixes #3643
2024-01-15 08:54:24 -05:00
Cody
22acc2307c remove extra line 2024-01-13 21:09:41 -08:00
Cody
d01a3c327e remove space 2024-01-13 21:09:00 -08:00
Cody
7c52b6ab23 remove name from password input 2024-01-13 21:07:08 -08:00
Cody
23d27aee6b ENH: Adds Profile Properties Autocomplete 2024-01-13 21:04:15 -08:00
Cody
9315358fa6 adds autocomplete 2024-01-13 20:59:42 -08:00
Cody
83aaa94cfe ENH: Profile Properties Autocomplete Setting 2024-01-13 20:54:31 -08:00
Cody
7744099ee5 cleans protocol to check for duplicate alias prior to saving 2024-01-13 13:09:17 -08:00
Cody
35bb6b62d8 Handle null or empty formfile in UploadFile Method 2024-01-12 14:08:15 -08:00
Cody
99844931f4 XRS status error update Fixes #3643 2024-01-12 13:43:02 -08:00
Cody
d8c34a7cdf XRS status error update Fixes #3643
Resolved an issue with XRS status not updating correctly. This commit addresses the problem and ensures the status is now accurately reflected.

Fixes #3643
2024-01-12 13:38:15 -08:00
Shaun Walker
c284edcd81 Merge pull request #3630 from thabaum/upgrade-nuget-packages
Upgrade NuGet Packages for Oqtane Framework
2024-01-12 16:37:42 -05:00
Shaun Walker
f5d4b352b3 Merge pull request #3632 from leigh-pointer/SchedStartEndDateCheck
Start end End date Range check on Job Items
2024-01-12 16:28:22 -05:00
Shaun Walker
e44b31d755 Merge pull request #3641 from sbwalker/dev
fix issue where rich text was not being refreshed in the editor when content changed, and original rich text was not always preserved
2024-01-12 15:49:53 -05:00
sbwalker
3a28068b48 fix issue where rich text was not being refreshed in the editor when content changed, and original rich text was not always preserved 2024-01-12 15:49:34 -05:00
Shaun Walker
03433b00d2 Merge pull request #3639 from sbwalker/dev
fix #3637 - ensure ServerState Scripts only contains site level script resources
2024-01-12 08:20:17 -05:00
sbwalker
6f39ebf48f fix #3637 - ensure ServerState Scripts only contains site level script resources 2024-01-12 08:19:58 -05:00
Shaun Walker
949ca00dbb Merge pull request #3638 from sbwalker/dev
add defensive null check
2024-01-12 08:15:44 -05:00
sbwalker
bfdf1ee8f5 add defensive null check 2024-01-12 08:15:30 -05:00
Leigh Pointer
e047d4e8a6 Start end End date Range check
Checks that the Start date starts before the End date.
Message added to Resx
2024-01-10 14:49:47 +01:00
Cody
15cf2069b6 Update NuGet Packages to New Versions
This commit updates the versions of several NuGet packages used in the project. The following packages have been upgraded:

- Microsoft.EntityFrameworkCore from 8.0.0 to 8.0.1
- Microsoft.EntityFrameworkCore.Relational from 8.0.0 to 8.0.1
- System.Text.Json from 8.0.0 to 8.0.1

The versions of Microsoft.Extensions.DependencyInjection.Abstractions and System.ComponentModel.Annotations remain unchanged.
2024-01-09 14:09:56 -08:00
Cody
564b0ee0c4 Upgrade NuGet Packages to Latest Versions
This commit updates the versions of several NuGet packages used in the project. The following packages have been upgraded:

- Microsoft.AspNetCore.Components.WebAssembly.Server from 8.0.0 to 8.0.1
- Microsoft.AspNetCore.Identity.EntityFrameworkCore from 8.0.0 to 8.0.1
- Microsoft.Data.SqlClient from 5.2.0-preview3.23201.1 to 5.2.0-preview4.23342.2
- Microsoft.EntityFrameworkCore from 8.0.0 to 8.0.1
- Microsoft.EntityFrameworkCore.Design from 8.0.0 to 8.0.1
- Microsoft.Extensions.Localization from 8.0.0 to 8.0.1
- Microsoft.AspNetCore.Authentication.OpenIdConnect from 8.0.0 to 8.0.1
- Microsoft.Data.Sqlite.Core from 8.0.0 to 8.0.1

The versions of SixLabors.ImageSharp, Swashbuckle.AspNetCore, SQLitePCLRaw.bundle_e_sqlite3, and Oqtane.Licensing remain unchanged.
2024-01-09 14:08:09 -08:00
Cody
b454932ff5 Upgrade multiple NuGet packages
Upgraded the following NuGet packages:
- Microsoft.EntityFrameworkCore.Sqlite from v8.0.0 to v8.0.1
2024-01-09 14:03:24 -08:00
Cody
191c07b6a1 Upgrade multiple NuGet packages
Upgraded the following NuGet packages:
- Microsoft.EntityFrameworkCore.SqlServer from v8.0.0 to v8.0.1
2024-01-09 13:58:28 -08:00
Cody
5b0deb9fc2 Upgrade multiple NuGet packages
Upgraded the following NuGet packages:
- EFCore.NamingConventions from v8.0.0-rc.2 to v8.0.2
- Microsoft.EntityFrameworkCore.Relational from v8.0.0 to v8.0.1
2024-01-09 13:55:56 -08:00
Cody
297ec64bde Upgrade multiple NuGet packages 2024-01-09 13:53:39 -08:00
Cody
a9b85caeb7 Upgrade multiple NuGet packages
Upgraded the following NuGet packages:
- Microsoft.AspNetCore.Components.Authorization from v8.0.0 to v8.0.1
- Microsoft.AspNetCore.Components.WebAssembly from v8.0.0 to v8.0.1
- Microsoft.Extensions.Localization from v8.0.0 to v8.0.1
2024-01-09 13:44:47 -08:00
Shaun Walker
e30b883148 Merge pull request #3628 from thabaum/update-getting-started-readme
Clarify Getting Started Instructions. Fixes #3627
2024-01-09 14:53:53 -05:00
Shaun Walker
cd6be0d755 Merge pull request #3624 from thabaum/documentation-spelling-correction
Documentation spelling correction.  Fixes #3623
2024-01-09 14:52:55 -05:00
Cody
95b74c5f2f Fix capitalization in list items. 2024-01-08 14:46:37 -08:00
Cody
45f26bb22e Clarify Getting Started Instructions. 2024-01-08 14:10:03 -08:00
Cody
09b0e09932 Documentation Spelling Correction 2024-01-07 11:10:53 -08:00
Cody
ea9d88009f Documentation Spelling Correction 2024-01-07 11:09:06 -08:00
Cody
e5013c918e Documentation Spelling Correction 2024-01-07 11:08:08 -08:00
Cody
4b45103a4e Documentation Spelling Correction 2024-01-07 11:07:35 -08:00
Cody
1ea28411da Documentation Spelling Correction 2024-01-07 11:07:08 -08:00
Cody
e27fce1227 Documentation Spelling Correction 2024-01-07 11:06:32 -08:00
Cody
cf3b8378bd Documentation Spelling Correction 2024-01-07 11:05:46 -08:00
Cody
9f07532140 documentation spelling correction 2024-01-07 10:59:11 -08:00
Shaun Walker
f1aedc619e Merge pull request #3622 from sbwalker/dev
fix #3584 - browse/edit using relative path for current site
2024-01-06 15:29:45 -05:00
sbwalker
5f778e706f fix #3584 - browse/edit using relative path for current site 2024-01-06 15:29:28 -05:00
Shaun Walker
ee15663679 Merge pull request #3620 from sbwalker/dev
improve ShouldRender logic
2024-01-06 08:52:26 -05:00
sbwalker
c271d4bfe4 improve ShouldRender logic 2024-01-06 08:52:05 -05:00
Shaun Walker
99188f7427 Merge pull request #3619 from sbwalker/dev
more rendering optimizations
2024-01-06 08:42:28 -05:00
sbwalker
88a07ecf63 more rendering optimizations 2024-01-06 08:42:07 -05:00
Shaun Walker
f1af2e35cd Merge pull request #3616 from sbwalker/dev
remove commented code
2024-01-05 12:14:57 -05:00
sbwalker
352e20f01b remove commented code 2024-01-05 12:14:43 -05:00
Shaun Walker
f7d10a6cf1 Merge pull request #3602 from leigh-pointer/ENH#3538-PgModDateActive
Start Date and Expiry Date for Module instances and Pages #3538
2024-01-05 12:09:19 -05:00
Shaun Walker
6a5808077c Merge pull request #3608 from thabaum/readme-add-marketplace-button
README - adds marketplace information for issue #3607
2024-01-05 12:08:20 -05:00
Shaun Walker
09be11b5a8 Merge pull request #3615 from sbwalker/dev
changed max profiel field rows to 10
2024-01-05 12:06:52 -05:00
sbwalker
5117c1a528 changed max profiel field rows to 10 2024-01-05 12:06:36 -05:00
Shaun Walker
ead9857203 Merge pull request #3610 from W6HBR/dev
Update Oqtane.Client\Modules\Admin\Profiles\Edit.razor to fix breaking changes
2024-01-05 12:04:30 -05:00
Shaun Walker
cd3493e040 Merge pull request #3614 from sbwalker/dev
improved rendering optimization
2024-01-05 11:53:57 -05:00
sbwalker
02c22c1894 improved rendering optimization 2024-01-05 11:49:57 -05:00
Leigh Pointer
8b41a03080 Modified Logic from || to &&
UserSecurity.IsAuthorized && Utilities.IsPageModuleVisible fixed
2024-01-05 10:15:51 +01:00
Shaun Walker
306f4f119b Merge pull request #3613 from sbwalker/dev
Fix #3604 - display message if user is attempting to run the application prior to performing a full compilation
2024-01-04 16:40:36 -05:00
sbwalker
3dc28c7291 Fix #3604 - display message if user is attempting to run the application prior to performing a full compilation 2024-01-04 16:40:15 -05:00
Shaun Walker
f2f2215059 Merge pull request #3611 from sbwalker/dev
component rendering optimizations
2024-01-04 13:48:06 -05:00
sbwalker
f75179b2f6 component rendering optimizations 2024-01-04 13:47:51 -05:00
Jon Welfringer
3ead35c984 Update (Profiles) Edit.razor to fix breaking changes
Prior functionality allowed 4 characters for "order" which now causes validation errors for any order value > 99.  This change allows a value of up to 9999 which is consistent with the prior 4 character length value.

Prior functionality allowed 2 characters for "rows" which now causes validattion error for any row count > 10.  This change allows a value up to 99 which is consistent with the prior 2 character length value.
2024-01-04 10:12:17 -08:00
Cody
efe20a1fe8 Adds Marketplace Section 2024-01-03 10:59:14 -08:00
Cody
ab1e56a14e Updates Marketplace Message 2024-01-03 10:49:14 -08:00
Cody
055d6bf601 Adjust Marketplace Placement 2024-01-03 10:48:24 -08:00
Cody
683c3e96d6 Update Marketplace Message 2024-01-03 10:47:13 -08:00
Cody
d8e414a4a2 Icon and Link for Oqtane Marketplace 2024-01-03 10:45:43 -08:00
Cody
9237d68b79 Update Marketplace Icon 2024-01-03 10:35:24 -08:00
Cody
12a14fbe29 Adds Marketplace Button 2024-01-03 10:25:13 -08:00
Leigh Pointer
22e4e4efc1 Updates
Loops tighter
Updated Logout base
SiteController corrected.
2024-01-03 12:12:27 +01:00
Shaun Walker
588327fd68 Merge pull request #3605 from sbwalker/dev
synchronize static assets with .NET MAUI project
2024-01-02 15:25:21 -05:00
sbwalker
d35ef2d360 synchronize static assets with .NET MAUI project 2024-01-02 15:25:07 -05:00
Leigh Pointer
5ce5193430 Modifications 2024-01-02 16:09:54 +01:00
Shaun Walker
6e74215b2e Merge pull request #3600 from thabaum/clear-module-message
Clear Module Message Prior To Adding A Message To UI. Fixes #3599
2024-01-02 08:21:06 -05:00
Shaun Walker
884a9835c4 Merge pull request #3586 from thabaum/patch-6
Refreshes Admin Settings Page When User Updates Logo.  Fixes #3582
2024-01-02 08:19:37 -05:00
Leigh Pointer
233f40f3e9 Start Date and Expiry Date for Module instances and Pages #3538
This is complete excluding Reporting and Notifications which can be added at a later date.  I just really wanted to get the schema and the functionality into place.
2023-12-31 12:21:38 +01:00
Cody
9b24e61033 Clear Module Message Proir To Adding A Message To UI 2023-12-29 12:49:49 -08:00
Mark Davis
286928d59e Merge tag 'v5.0.1' into dev 2023-12-29 11:54:39 -08:00
Cody
47cee5f6a1 Updates Module Owner/Name HelpText 2023-12-29 11:39:35 -08:00
Cody
6820b748f7 Updates Module Name/Owner and Notification Text 2023-12-29 11:37:31 -08:00
Cody
42422845b0 Updates Owner/Module Name Tooltip/Notification 2023-12-29 11:00:29 -08:00
Cody
8ed11cdc07 Adds the comment for client logo refresh boolean 2023-12-23 12:02:58 -08:00
Cody
006cd1ee89 Refresh Page On Client After Saving Changed Logo 2023-12-23 11:26:57 -08:00
Cody
49f7ee6042 change to reload from refresh to update site logo 2023-12-23 09:25:02 -08:00
Cody
9612e4d4e9 Removes unnecessary logo refresh logic. 2023-12-22 10:30:28 -08:00
Cody
4b938db0c1 refresh = true when logo is updated 2023-12-22 10:28:14 -08:00
Shaun Walker
b0a079dce9 Merge pull request #3592 from sbwalker/dev
refactor logic related to domain filtering for emails during external login
2023-12-21 15:55:07 -05:00
sbwalker
52069f35c5 refactor logic related to domain filtering for emails during external login 2023-12-21 15:54:46 -05:00
Shaun Walker
140535d875 Update README.md 2023-12-21 12:50:13 -05:00
Shaun Walker
611084d00c Merge pull request #3590 from oqtane/master
5.0.1 Release
2023-12-21 12:38:37 -05:00
Shaun Walker
1b7c810eeb Merge pull request #3589 from oqtane/dev
5.0.1 Release
2023-12-21 12:38:08 -05:00
Cody
dd2a698147 Refreshes settings page if logo changes. 2023-12-20 14:17:23 -08:00
Shaun Walker
e99df58bce Merge pull request #3585 from sbwalker/dev
add an AllowRichText parameter to the RichTextEditor component and add logic to handle JS Interop failures
2023-12-20 16:59:06 -05:00
sbwalker
70139221ab add an AllowRichText parameter to the RichTextEditor component and add logic to handle JS Interop failures 2023-12-20 16:58:46 -05:00
Shaun Walker
5d8d2b4a34 Merge pull request #3579 from sbwalker/dev
ensure database provider assemblies are included in Publish folder
2023-12-19 16:54:25 -05:00
sbwalker
f59f322226 ensure database provider assemblies are included in Publish folder 2023-12-19 16:54:11 -05:00
Shaun Walker
acca3f37b5 Merge pull request #3577 from sbwalker/dev
remove spaces from file extensions
2023-12-19 14:30:30 -05:00
sbwalker
0de62f620d remove spaces from file extensions 2023-12-19 14:30:18 -05:00
Shaun Walker
351c4a00e9 Merge pull request #3576 from sbwalker/dev
prepare for 5.0.1 release
2023-12-19 12:51:58 -05:00
sbwalker
b048d81ac0 prepare for 5.0.1 release 2023-12-19 12:51:44 -05:00
Shaun Walker
b9c9a2b75f Merge pull request #3575 from sbwalker/dev
add defensive logic to Alias.Path, improve new GetAlias method
2023-12-19 08:41:49 -05:00
sbwalker
4cea22d813 add defensive logic to Alias.Path, improve new GetAlias method 2023-12-19 08:41:36 -05:00
Shaun Walker
edad4e7d35 Merge pull request #3572 from thabaum/patch-5
Sets Logo max height to 90px plus padding 5px right and left.
2023-12-19 08:02:09 -05:00
Shaun Walker
e28acd8d2d Merge pull request #3574 from sbwalker/dev
handle loading/saving of File Extensions
2023-12-19 07:40:01 -05:00
sbwalker
86feaff82f handle loading/saving of File Extensions 2023-12-19 07:39:48 -05:00
Cody
5f747db224 Logo max-height and padding 2023-12-18 14:12:26 -08:00
Cody
ccda41e18e Logo max-height 90px, Padding 5px L/R 2023-12-18 14:11:29 -08:00
Cody
2bb83c6532 Revert app logo css changes 2023-12-18 14:10:23 -08:00
Shaun Walker
ec59faba8c Merge pull request #3573 from sbwalker/dev
add database provider projects to Oqtane.sln
2023-12-18 16:31:06 -05:00
sbwalker
c5d8c44b81 add database provider projects to Oqtane.sln 2023-12-18 16:30:49 -05:00
Cody
7a4e4629e5 Logo max height 90px 2023-12-18 13:03:19 -08:00
Shaun Walker
4d3dd95a60 Merge pull request #3568 from sbwalker/dev
add additional SetAlias overload
2023-12-18 15:07:20 -05:00
sbwalker
713021359e add additional SetAlias overload 2023-12-18 15:07:07 -05:00
Shaun Walker
927d2c36e8 Merge pull request #3566 from sbwalker/dev
abstract padding logic - don't repeat
2023-12-18 09:58:44 -05:00
sbwalker
afc6368915 abstract padding logic - don't repeat 2023-12-18 09:58:30 -05:00
Shaun Walker
3f604ad7b5 Merge pull request #3565 from sbwalker/dev
fix #3556 - pad token secret to 32 characters to resolve IDX1-720, change id of "secret" input to reduce chance of form autocomplete causing issues
2023-12-18 09:51:43 -05:00
sbwalker
c5d4e237ad fix #3556 - pad token secret to 32 characters to resolve IDX1-720, change id of "secret" input to reduce chance of form autocomplete causing issues 2023-12-18 09:51:18 -05:00
Shaun Walker
0b50b21779 Merge pull request #3559 from thabaum/patch-3
Correct formatting of _pagesWithModules declaration
2023-12-18 08:01:44 -05:00
Cody
cafc70f1c9 Correct formatting of _pagesWithModules declaration 2023-12-15 10:47:41 -08:00
Shaun Walker
b4377c346f Merge pull request #3558 from sbwalker/dev
modify module and theme template release.cmd to remove old nupkg files before packaging
2023-12-15 11:08:24 -05:00
sbwalker
7c206af757 modify module and theme template release.cmd to remove old nupkg files before packaging 2023-12-15 11:08:05 -05:00
Shaun Walker
6212d0a052 Merge pull request #3557 from sbwalker/dev
a simple dependency manager for assemblies
2023-12-15 11:06:01 -05:00
sbwalker
8909822aea a simple dependency manager for assemblies 2023-12-15 11:05:48 -05:00
Shaun Walker
5fc0964f73 Merge pull request #3555 from sbwalker/dev
suppress compiler warnings for internal Entity Framework Core API usage and Analyzer 'Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.WebApplicationBuilderAnalyzer' (.NET8)
2023-12-14 15:23:04 -05:00
sbwalker
7725559a44 suppress compiler warnings for internal Entity Framework Core API usage and Analyzer 'Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.WebApplicationBuilderAnalyzer' (.NET8) 2023-12-14 15:22:43 -05:00
Shaun Walker
03414a58e9 Merge pull request #3553 from sbwalker/dev
eliminate database provider nuget packages
2023-12-14 14:32:32 -05:00
sbwalker
ade0419bf6 eliminate database provider nuget packages 2023-12-14 14:32:19 -05:00
Shaun Walker
9d646b2eed Merge pull request #3552 from sbwalker/dev
ignore Blazor framework requests
2023-12-13 18:25:34 -05:00
sbwalker
0d718a5ca2 ignore Blazor framework requests 2023-12-13 18:25:21 -05:00
Shaun Walker
78c8b36dfa Merge pull request #3551 from sbwalker/dev
remove unecessary resource key
2023-12-13 13:34:24 -05:00
sbwalker
b5ca0874fa remove unecessary resource key 2023-12-13 13:34:08 -05:00
Shaun Walker
e209becff9 Merge pull request #3548 from leigh-pointer/ModuleMangPages
Module Management Ehancement - show where modules are used.
2023-12-13 11:22:22 -05:00
Leigh Pointer
652d42aa6b Rework
Not to display the number of instances of the module on those pages.
Name the tab "Pages".
2023-12-13 17:19:19 +01:00
Shaun Walker
058a11597f Merge pull request #3550 from sbwalker/dev
fix regression issue
2023-12-13 11:18:44 -05:00
sbwalker
dd73d6e19a fix regression issue 2023-12-13 11:18:32 -05:00
Shaun Walker
3793f618a8 Merge pull request #3549 from sbwalker/dev
HTML encode notifications sent by non-admins to prevent HTML injection
2023-12-13 10:07:43 -05:00
sbwalker
6621983a9c HTML encode notifications sent by non-admins to prevent HTML injection 2023-12-13 10:07:21 -05:00
Leigh Pointer
e0b0302f5a Check for Deleted Pageds 2023-12-12 22:56:02 +01:00
Leigh Pointer
b02584bec6 Enhancment to the Module Managment to show where module is used.
Added a new tab that lists all the pages where there is a module instance with the count of the number of instances.
This helps when making a decision to delete the module from the framework.
2023-12-12 22:28:18 +01:00
Shaun Walker
c832d61409 Merge pull request #3547 from sbwalker/dev
set authentication cookie to HttpOnly
2023-12-12 15:56:30 -05:00
sbwalker
ac701f28b5 set authentication cookie to HttpOnly 2023-12-12 15:56:16 -05:00
Shaun Walker
53032140e7 Merge pull request #3546 from sbwalker/dev
security improvement - ensure returnurl is a relativre path
2023-12-12 15:55:03 -05:00
sbwalker
3c7633564f security improvement - ensure returnurl is a relativre path 2023-12-12 15:54:52 -05:00
Shaun Walker
43eae40404 Merge pull request #3545 from sbwalker/dev
add support for root sitemap.xml and robots.txt
2023-12-12 14:50:21 -05:00
sbwalker
e34b1b54d5 add support for root sitemap.xml and robots.txt 2023-12-12 14:50:08 -05:00
Shaun Walker
0658a7de0d Merge pull request #3544 from sbwalker/dev
comsider name and email claim values as optional
2023-12-12 14:04:08 -05:00
sbwalker
9e0a4dfac8 comsider name and email claim values as optional 2023-12-12 14:03:47 -05:00
Shaun Walker
82034ade90 Merge pull request #3543 from sbwalker/dev
modify #3528 so that it only saves the ImagesFiles and UploadableFiles if they are different than the default - otherwise it sets them to blank. This provides forward compatibility if the default values are updated in future framework versions.
2023-12-12 13:52:03 -05:00
sbwalker
b979203e12 modify #3528 so that it only saves the ImagesFiles and UploadableFiles if they are different than the default - otherwise it sets them to blank. This provides forward compatibility if the default values are updated in future framework versions. 2023-12-12 13:51:41 -05:00
Shaun Walker
c9a368f13a Merge pull request #3542 from sbwalker/dev
move message into file upload region
2023-12-12 13:39:52 -05:00
sbwalker
cfabf22fef move message into file upload region 2023-12-12 13:39:37 -05:00
Shaun Walker
61aef77916 Merge pull request #3541 from sbwalker/dev
refactor fix for #3539 to avoid string comparison
2023-12-12 13:32:45 -05:00
sbwalker
8b6c6beceb refactor fix for #3539 to avoid string comparison 2023-12-12 13:32:33 -05:00
Shaun Walker
4688e49454 Merge pull request #3540 from leigh-pointer/LoginURL
Fix #3539 for Multiple click on login button
2023-12-12 13:16:16 -05:00
Shaun Walker
76cc28b215 Merge pull request #3535 from rcpacheco/rcp_manage_language
Edit languages to set default.
2023-12-12 13:02:17 -05:00
Leigh Pointer
467e5423d2 Fix #3539 for Multiple click on login button
Updated the LoginBase, if the URI doesn't contain the login URL then the NavigationManager is updated.
2023-12-12 07:25:35 +01:00
Ricardo Pacheco
422bf7b689 Edit languages to set default. 2023-12-07 18:12:49 -06:00
Shaun Walker
1d230bd4aa Merge pull request #3533 from sbwalker/dev
fix issue where the list of containers was not being refreshed when the theme was changed
2023-12-05 16:57:42 -05:00
sbwalker
029850842b fix issue where the list of containers was not being refreshed when the theme was changed 2023-12-05 16:57:22 -05:00
Mark Davis
cc65555c3d minor fix to routing 2023-12-05 12:17:02 -08:00
Shaun Walker
3b090396a4 Merge pull request #3532 from sbwalker/dev
added HybridEnabled field to Site table to indicate if .NET MAUI hybrid applications can be integrated
2023-12-04 16:35:24 -05:00
sbwalker
2e4656ae8b added HybridEnabled field to Site table to indicate if .NET MAUI hybrid applications can be integrated 2023-12-04 16:35:03 -05:00
Shaun Walker
ebce63baa4 Merge pull request #3531 from sbwalker/dev
add generic Result model for leveraging Result pattern
2023-12-04 15:41:19 -05:00
sbwalker
08f691ee0d add generic Result model for leveraging Result pattern 2023-12-04 15:41:00 -05:00
Shaun Walker
7550a19951 Merge pull request #3528 from leigh-pointer/FileExtentions
File Extension management - site wide. Fix for #3493
2023-12-04 15:16:42 -05:00
Leigh Pointer
daeb76df11 Corrected the IsPrivate 2023-12-04 17:26:37 +01:00
Shaun Walker
31315e5ba6 Merge pull request #3530 from sbwalker/dev
allow AddModuleMessage to support displaying the message at the bottom of the module instance
2023-12-04 09:57:10 -05:00
sbwalker
e4e1fa6a4c allow AddModuleMessage to support displaying the message at the bottom of the module instance 2023-12-04 09:55:53 -05:00
Leigh Pointer
6e36312be8 Update Site with ImageFiles and UploadableFiles 2023-12-04 09:07:11 +01:00
Leigh Pointer
9cc7ba1d82 Merge branch 'oqtane:dev' into FileExtentions 2023-12-04 08:15:49 +01:00
Shaun Walker
9182001147 Merge pull request #3529 from sbwalker/dev
invalidate client assemblies cache when site is updated
2023-12-03 10:27:53 -05:00
sbwalker
5d1510083e invalidate client assemblies cache when site is updated 2023-12-03 10:27:33 -05:00
Leigh Pointer
7035f4cc1f File Extension management - site wide.
I have added to the site settings file extension management.
The Constants remain for backward compatibility.
If the extensions are not updated then the Constant will be used.
2023-12-01 21:09:33 +01:00
Shaun Walker
da826b2a22 Merge pull request #3527 from sbwalker/dev
optimize assembly loading performance
2023-12-01 14:54:56 -05:00
sbwalker
a152d8664d optimize assembly loading performance 2023-12-01 14:54:44 -05:00
Shaun Walker
6ad75d963a Merge pull request #3526 from sbwalker/dev
only allow download of assemblies when using WebAssembly
2023-12-01 14:38:32 -05:00
sbwalker
e92d34a9e3 only allow download of assemblies when using WebAssembly 2023-12-01 14:38:16 -05:00
Shaun Walker
768066db58 Merge pull request #3525 from leigh-pointer/Retention
Retention controls and data should be number / int not string
2023-12-01 12:19:48 -05:00
Leigh Pointer
886b63e55b Retention controls and data should be number / int not string
The Retention input controls in Log, Visitors and Notifications allowed text to be saved.  Modified all controls to accept only number.
2023-12-01 18:05:52 +01:00
Shaun Walker
3c7ee65b7d Merge pull request #3523 from beolafsen/dev
Extend the Section component  with "IsVisible" parameter
2023-12-01 08:50:19 -05:00
beolafsen
0e060c4564 Extend the Section component with "Visible" parameter 2023-12-01 07:34:17 +01:00
Shaun Walker
3e127dbd9c Merge pull request #3522 from sbwalker/dev
remove Blazor Hybrid from Hosting Models selection as it is not actually a hosting model
2023-11-30 17:19:18 -05:00
sbwalker
ad66d14a1b remove Blazor Hybrid from Hosting Models selection as it is not actually a hosting model 2023-11-30 17:18:37 -05:00
Shaun Walker
5db61b78ea Merge pull request #3518 from sbwalker/dev
add defensive logic to handle scenario where a tenant connection string does not exist in appsettings.json
2023-11-29 17:32:08 -05:00
sbwalker
85f9597f2c add defensive logic to handle scenario where a tenant connection string does not exist in appsettings.json 2023-11-29 17:31:51 -05:00
Shaun Walker
73aca22605 Merge pull request #3517 from sbwalker/dev
suppress logging for resized image files which no longer exist
2023-11-29 13:59:06 -05:00
sbwalker
077343ca20 suppress logging for resized image files which no longer exist 2023-11-29 13:58:52 -05:00
Shaun Walker
c76946c770 Merge pull request #3516 from sbwalker/dev
update SQLite and PostgreSQL to latest packages
2023-11-29 13:29:17 -05:00
sbwalker
2344a49260 update SQLite and PostgreSQL to latest packages 2023-11-29 13:28:53 -05:00
Shaun Walker
65f463dbbd Merge pull request #3471 from PfaffIC/dev-loginauthcookie
Added auth cookie expiration for external login via OAuth2.
2023-11-29 13:22:39 -05:00
Shaun Walker
6e100a70b9 Merge pull request #3510 from markdav-is/patch-4
Update _Host.cshtml.cs to account for fully qualified type names in theme resources
2023-11-29 13:21:39 -05:00
Shaun Walker
77650ebe09 Merge pull request #3515 from sbwalker/dev
refactor alwaysremember logic for consistency
2023-11-29 13:19:59 -05:00
sbwalker
cdba2bd9e2 refactor alwaysremember logic for consistency 2023-11-29 13:19:45 -05:00
Shaun Walker
e84cc92fcd Merge pull request #3514 from sbwalker/dev
add ClaimsPrincipal extension methods
2023-11-29 13:02:10 -05:00
sbwalker
a2890948bb add ClaimsPrincipal extension methods 2023-11-29 13:01:54 -05:00
Shaun Walker
f2e1ebef45 Merge pull request #3513 from sbwalker/dev
user identity improvements
2023-11-29 10:42:50 -05:00
sbwalker
3c33614115 user identity improvements 2023-11-29 10:42:23 -05:00
Shaun Walker
fcc4b1e8ee Merge pull request #3511 from sbwalker/dev
include Review Claims option in External Login for troubleshooting settings
2023-11-27 15:37:51 -05:00
sbwalker
c8ac4ec1e8 include a more detailed error message for tenant database migration issues 2023-11-27 15:35:58 -05:00
sbwalker
93ab8b88d4 include Review Claims option in External Login for troubleshooting settings 2023-11-27 15:07:48 -05:00
Mark Davis
cc12c302e3 Update _Host.cshtml.cs
Noticed some spaces showing up in theme resources and tracked it down to this line.  Wrapping the name in a call to Utilities.GetTypeName cleared things up.
2023-11-26 18:13:41 -08:00
Shaun Walker
73941ca30e Merge pull request #3506 from sbwalker/dev
remove InstallDatabase method as it is no longer required now that all database providers are installed automatically
2023-11-22 16:10:03 -05:00
sbwalker
f963711820 remove InstallDatabase method as it is no longer required now that all database providers are installed automatically 2023-11-22 15:53:25 -05:00
Shaun Walker
1a0a301fb6 Merge pull request #3505 from sbwalker/dev
change terminology to Uninstall rather than Delete in Module Definitions and Themes - to better describe the action
2023-11-22 15:44:25 -05:00
sbwalker
f87a9b7aae change terminology to Uninstall rather than Delete in Module Definitions and Themes - to better describe the action 2023-11-22 15:44:07 -05:00
Shaun Walker
f18f0bc762 Merge pull request #3504 from sbwalker/dev
only display Authorization Response Type option for OpenIDConnect and fix missing localization
2023-11-22 15:37:08 -05:00
sbwalker
c3b1bc6674 only display Authorization Response Type option for OpenIDConnect and fix missing localization 2023-11-22 15:36:49 -05:00
Shaun Walker
e9bb228528 Merge pull request #3503 from sbwalker/dev
prevent localized Microsoft.CodeAnalysis.*.resources.dll files from being included in release
2023-11-22 15:04:19 -05:00
sbwalker
a906957454 prevent localized Microsoft.CodeAnalysis.*.resources.dll files from being included in release 2023-11-22 15:04:01 -05:00
Shaun Walker
49d10337a1 Merge pull request #3502 from sbwalker/dev
add Update API validation to default module template
2023-11-22 14:55:07 -05:00
sbwalker
87c6c31f1f add Update API validation to default module template 2023-11-22 14:54:06 -05:00
Shaun Walker
5f3639e396 Merge pull request #3501 from sbwalker/dev
add additional validation logic to Update API methods to ensure model ID matches ID parameter
2023-11-22 14:47:53 -05:00
sbwalker
14d36ef8dc add additional validation logic to Update API methods to ensure model ID matches ID parameter 2023-11-22 14:47:28 -05:00
Shaun Walker
fc186f1718 Merge pull request #3496 from sbwalker/dev
ignore nuget packages
2023-11-21 15:41:23 -05:00
sbwalker
70aa93fe8d ignore nuget packages 2023-11-21 15:41:13 -05:00
Shaun Walker
901df22d39 Merge pull request #3495 from sbwalker/dev
add database provider packages back to wwwroot/Packages as they are needed when cloning a fresh instance of source from Github
2023-11-21 15:22:05 -05:00
sbwalker
cd0fe3d6d4 add database provider packages back to wwwroot/Packages as they are needed when cloning a fresh instance of source from Github 2023-11-21 15:21:44 -05:00
Shaun Walker
09f2c3f645 Merge pull request #3494 from sbwalker/dev
fix .NET upgrade issue related to database provider packages
2023-11-21 15:15:17 -05:00
sbwalker
116542d8e4 fix .NET upgrade issue related to database provider packages 2023-11-21 15:09:14 -05:00
Shaun Walker
ffae6e269b Merge pull request #3487 from sbwalker/dev
increase size of MaximumReceiveMessageSize for Blazor Server
2023-11-17 16:06:24 -05:00
sbwalker
2194dc0463 increase size of MaximumReceiveMessageSize for Blazor Server 2023-11-17 16:06:11 -05:00
Mark Davis
63e3923349 Merge remote-tracking branch 'oqtane/dev' into dev 2023-11-17 12:55:40 -08:00
Shaun Walker
da2d426137 Update README.md 2023-11-16 15:49:22 -05:00
Shaun Walker
8df7672624 Update README.md 2023-11-16 15:15:34 -05:00
Shaun Walker
b9dba61c97 Update README.md 2023-11-16 15:07:53 -05:00
Shaun Walker
1872a1a77c Merge pull request #3483 from oqtane/master
Merge pull request #3482 from oqtane/dev
2023-11-16 15:00:22 -05:00
Shaun Walker
cf57bad7fa Merge pull request #3482 from oqtane/dev
8.0.0 Release
2023-11-16 15:00:04 -05:00
Shaun Walker
7e956894ee Merge pull request #3477 from sbwalker/dev
fix warning in MySQL provider, update Database provider packages to official .NET 8 release, add Oqtane.Licensing
2023-11-15 20:49:33 -05:00
sbwalker
f78046d4c1 fix warning in MySQL provider, update Database provider packages to official .NET 8 release, add Oqtane.Licensing 2023-11-15 20:49:07 -05:00
Shaun Walker
beb09cbf4a Merge pull request #3476 from sbwalker/dev
add SiteState.IsPrerendering property back to avoid breaking change. New implementation relies on .NET 8 HttpContext CascadingParameter
2023-11-15 15:01:04 -05:00
sbwalker
6b2a5d7777 add SiteState.IsPrerendering property back to avoid breaking change. New implementation relies on .NET 8 HttpContext CascadingParameter 2023-11-15 15:00:34 -05:00
Shaun Walker
4b0d368222 Merge pull request #3475 from sbwalker/dev
migration to official .NET 8 release
2023-11-14 14:48:35 -05:00
sbwalker
5ab2f6ea3a migration to official .NET 8 release 2023-11-14 14:48:12 -05:00
Shaun Walker
f845bf5b25 Merge pull request #3472 from sbwalker/dev
fix #3454 - do not remove Oqtane.lLicensing assemblies during package uninstall
2023-11-13 13:16:56 -05:00
sbwalker
bb10d64d58 fix #3454 - do not remove Oqtane.lLicensing assemblies during package uninstall 2023-11-13 13:16:35 -05:00
PfaffIC
96e8e9736f Added auth cookie expiration for external login via OAuth2.
Auth cookie expiration time ist set to value provided in Setting "LoginOptions:CookieExpiration" (if provided).
2023-11-13 11:28:58 +01:00
Shaun Walker
62472b97e6 Merge pull request #3469 from sbwalker/dev
update email address in AspNetUsers table when user email is modified
2023-11-10 16:13:37 -05:00
sbwalker
10b89ff00b update email address in AspNetUsers table when user email is modified 2023-11-10 16:13:24 -05:00
Shaun Walker
2d8339343f Merge pull request #3468 from sbwalker/dev
removed photo from Edit User as files cannot be written to other users folders
2023-11-10 15:59:02 -05:00
sbwalker
9ddd88b5d0 removed photo from Edit User as files cannot be written to other users folders 2023-11-10 15:58:43 -05:00
Shaun Walker
614ec645c6 Merge pull request #3467 from sbwalker/dev
use appropriate bootstrap classes
2023-11-10 15:40:32 -05:00
sbwalker
893ffc48dc use appropriate bootstrap classes 2023-11-10 15:40:20 -05:00
Shaun Walker
7bddb70f11 Merge pull request #3466 from sbwalker/dev
add new user settings to RESX file
2023-11-10 15:19:13 -05:00
sbwalker
9d4a38e560 add new user settings to RESX file 2023-11-10 15:18:59 -05:00
Shaun Walker
9d20b31585 Merge pull request #3465 from sbwalker/dev
fix #3399 - set defaults for all dropdowns in Add Site
2023-11-10 15:05:51 -05:00
sbwalker
fb8838375f fix #3399 - set defaults for all dropdowns in Add Site 2023-11-10 15:05:39 -05:00
Shaun Walker
dead4e3f85 Merge pull request #3464 from sbwalker/dev
fix #3420 - auto create user folder for Host user if it does not exist for site
2023-11-10 13:49:31 -05:00
sbwalker
9c833a8a95 fix #3420 - auto create user folder for Host user if it does not exist for site 2023-11-10 13:49:11 -05:00
Shaun Walker
0b90794bca Merge pull request #3463 from sbwalker/dev
move visitor tracking after url mapping and 404 handling
2023-11-10 13:11:30 -05:00
sbwalker
fd89757814 move visitor tracking after url mapping and 404 handling 2023-11-10 13:00:57 -05:00
Shaun Walker
5eedc312c8 Merge pull request #3462 from PfaffIC/dev-loginauthcookie
Added login cookie expiration time functionality.
2023-11-10 07:48:47 -05:00
Nico Pfaff
36c1cc5e0c Added functinality to always remember user login.
Added functinality to always remember user login. Provides the option to force login cookie expiration and dont fallback on the session timespan that is used as default when users dont choose the option 'Remember me'.
2023-11-09 16:29:09 +01:00
Nico Pfaff
0b4cdea9dd Added functinality to declare custom login cookie expiration time.
Added login cookie expiration time. Added setting in user settings to declare custom cookie expiration time. Cookie expiration time overwrites default expiration time of 14 days (if not session timespan is used).
2023-11-09 16:15:53 +01:00
Shaun Walker
12172168f6 Merge pull request #3460 from sbwalker/dev
improve upload time estimate calculations and limit polling attempts
2023-11-07 15:14:13 -05:00
sbwalker
c79aa49252 improve upload time estimate calculations and limit polling attempts 2023-11-07 15:13:33 -05:00
Shaun Walker
b869308bf4 Merge pull request #3459 from sbwalker/dev
fix #3438 - remove IsPrerendering property as it is not used, and remove reference to HttpContext
2023-11-07 13:52:30 -05:00
sbwalker
7a748bd142 fix #3438 - remove IsPrerendering property as it is not used, and remove reference to HttpContext 2023-11-07 13:49:54 -05:00
Shaun Walker
d11669e613 Merge pull request #3457 from oqtane/net8
Merging net8 branch into dev in preparation for Oqtane 5.0 release next week
2023-11-06 15:04:53 -05:00
Shaun Walker
b5108b938c Merge pull request #3447 from thabaum/net8-Admin-Profile-Edit-Validation
Admin\Profiles\Edit.razor: Form Validation For Rows, Length and Order - Adds Rows Resource Data - Issues #3426,  #3446
2023-10-30 09:12:27 -04:00
Cody
049d510536 Updates Order/Rows/Length min/max values 2023-10-26 14:01:27 -07:00
Cody
113f7b18a6 Replaces maxLength with max for input type number 2023-10-25 09:01:41 -07:00
Cody
65b248c3cf min="1" for "Rows" 2023-10-25 06:18:00 -07:00
Cody
1698996ac3 Adds "Rows" Resource Data 2023-10-24 16:12:19 -07:00
Cody
2ae47f2375 Adds type="number" Form Input Validation 2023-10-24 16:10:12 -07:00
Shaun Walker
6733d12e81 Merge pull request #3445 from sbwalker/net8
added Verify Existing Users? option to User Management - External Login Setting
2023-10-24 14:31:59 -04:00
sbwalker
8b5109e32f added Verify Existing Users? option to User Management - External Login Setting 2023-10-24 14:28:14 -04:00
Shaun Walker
7b651d56b1 Merge pull request #3444 from sbwalker/net8
if site login is disabled redirect Login to external identity provider
2023-10-24 13:49:09 -04:00
sbwalker
23b9b8aaf6 if site login is disabled redirect Login to external identity provider 2023-10-24 13:46:25 -04:00
Shaun Walker
8d9fb43828 Merge pull request #3443 from sbwalker/net8
fixes to notifications UI in user profile
2023-10-24 08:41:20 -04:00
sbwalker
0d1be72fdb fixes to notifications UI in user profile 2023-10-24 08:40:26 -04:00
Shaun Walker
ce102a2af6 Merge pull request #3436 from sbwalker/net8
complete fix for #3427 in User Profile component
2023-10-23 12:17:21 -04:00
sbwalker
dda6071bbc complete fix for #3427 in User Profile component 2023-10-23 12:16:52 -04:00
Shaun Walker
0c4809bb16 Merge pull request #3435 from sbwalker/net8
Fix spelling mistake "notififications"
2023-10-23 11:36:37 -04:00
sbwalker
4b87c5e80e Fix spelling mistake "notififications" 2023-10-23 11:36:03 -04:00
Shaun Walker
b8fe9b9074 Merge pull request #3425 from thabaum/net8-UserProfile-Index-Fix
UserProfile/Index.razor: Notifications Formatting and No Notifications Message - Fixes #3413, #3415
2023-10-23 11:33:31 -04:00
Shaun Walker
bc8b18cea8 Merge pull request #3434 from sbwalker/net8
fix #3427 - profile validation for User Management (Add/Edit)
2023-10-23 11:25:40 -04:00
sbwalker
20fdd3e891 fix #3427 - profile validation for User Management (Add/Edit) 2023-10-23 11:24:22 -04:00
Shaun Walker
ff9147487f Merge pull request #3424 from thabaum/net8-UserProfile-View-Fix
UserProfile/View.razor: Sets Input Classes to col-sm-9, Disables Reply When Notification From is System or Blank (empty)
2023-10-23 11:22:15 -04:00
Shaun Walker
af494f3b5e Merge pull request #3423 from thabaum/net8-Models-Profile-Fix
Oqtane.Server\Repository\SiteRepository.cs: Sets Rows Default Value Equal To 1.
2023-10-23 11:20:58 -04:00
Cody
f68d26317d Removes Biography 2023-10-21 15:12:15 -07:00
Cody
5b881f7c77 Disable Reply Button When From is System or Emtpy 2023-10-21 13:11:02 -07:00
Cody
fe5efff255 Adds Biography and Rows Profile Settings to Create Site 2023-10-21 10:36:09 -07:00
Cody
46d18a642c Rows property set to no default 2023-10-21 10:32:01 -07:00
Cody
c00012f28b class= 2023-10-20 21:57:42 -07:00
Cody
d0050f7d59 Updates Localization of No Notifications Messages 2023-10-20 21:39:19 -07:00
Cody
f3a4881261 No notification messages. 2023-10-20 21:38:06 -07:00
Cody
1728909964 Adds Localization To No Notification Messages 2023-10-20 21:34:43 -07:00
Cody
f6e7460b24 Fix Formatting + Add No Notifictions Message 2023-10-20 21:31:23 -07:00
Cody
351829888f Fix Columns Format 2023-10-20 21:25:27 -07:00
Cody
e520c30ade Rows Property Default Equals 1 2023-10-20 21:18:36 -07:00
Shaun Walker
99267ac2f0 Merge pull request #3409 from thabaum/thabaum-NET8-Development-Module-Theme-Templates
development module theme templates
2023-10-18 19:37:47 -04:00
Cody
6f1f7ef7fc Revert back to previous bootstrap version 2023-10-18 16:20:36 -07:00
Cody
d647e947e2 Removes unnecessary space 2023-10-18 15:52:22 -07:00
Cody
adef45c30f Removes unnecessary space 2023-10-18 15:51:58 -07:00
Cody
8b80859023 .NET 8 Update 2023-10-18 15:45:47 -07:00
Cody
907fff89c8 .NET 8 Update 2023-10-18 15:43:55 -07:00
Cody
ca532ffdaf .NET 8 Update 2023-10-18 15:43:13 -07:00
Cody
64ee842dc4 .NET 8 Update 2023-10-18 15:42:36 -07:00
Cody
9c0754a88d .NET 8 Update 2023-10-18 15:40:51 -07:00
Cody
3dac9e3dae .NET 8.0 Update 2023-10-18 15:38:51 -07:00
Cody
6963e667aa Update to version 5.0.0 2023-10-18 15:37:38 -07:00
Cody
af292b291b Updates to Bootstrap 5.3.2 2023-10-18 15:33:34 -07:00
Cody
918f75704e .NET 8 Update 2023-10-18 15:26:42 -07:00
Cody
6e258e5d0c .NET 8 Update 2023-10-18 15:23:06 -07:00
Cody
a8ea4ec085 .NET 8 Update 2023-10-18 15:22:22 -07:00
Cody
2f894af028 .NET 8 Update 2023-10-18 15:21:53 -07:00
Cody
dd400e1214 Version 5 2023-10-18 15:20:56 -07:00
Cody
f8a183bfdf .NET 8 Update 2023-10-18 15:06:44 -07:00
Cody
2404193b61 .NET 8 Ready 2023-10-18 15:04:07 -07:00
Shaun Walker
3ef11f5b26 Merge pull request #3408 from sbwalker/net8
fix compiler warning ASP0019: Use IHeaderDictionary.Append or the indexer to append or set headers.
2023-10-18 17:14:04 -04:00
sbwalker
30419cec12 fix compiler warning ASP0019: Use IHeaderDictionary.Append or the indexer to append or set headers. 2023-10-18 17:09:19 -04:00
Shaun Walker
162841feb8 Merge pull request #3405 from thabaum/net8
Removes unnecessary added space from upgrade to .NET 8
2023-10-18 16:18:32 -04:00
Cody
f910f63f8d Remove space 2023-10-18 13:14:52 -07:00
Shaun Walker
860cb75f8f Merge pull request #3404 from thabaum/net8
Remove default connection data
2023-10-18 16:14:27 -04:00
Cody
293be93b93 Remove default connection data 2023-10-18 12:55:39 -07:00
Shaun Walker
976e77b31e Merge pull request #3402 from sbwalker/net8
.NET 8 initial migration
2023-10-18 15:25:05 -04:00
sbwalker
9f28ee2982 .NET 8 initial migration 2023-10-18 15:22:53 -04:00
Shaun Walker
e6c1e48b86 Merge pull request #3396 from sbwalker/net8
test commit
2023-10-18 11:51:03 -04:00
sbwalker
2c2880199d test commit 2023-10-18 11:50:32 -04:00
Shaun Walker
c7f8737eeb Merge pull request #3392 from sbwalker/dev
resolve null reference exception in FileManager when ShowFiles = false
2023-10-17 15:12:06 -04:00
sbwalker
f3aea3108d resolve null reference exception in FileManager when ShowFiles = false 2023-10-17 15:11:51 -04:00
Shaun Walker
e4f8ad0f05 Update README.md 2023-10-16 15:05:12 -04:00
Shaun Walker
8b80f72313 Merge pull request #3386 from oqtane/master
4.0.6 Release
2023-10-16 15:00:27 -04:00
Shaun Walker
06ebce31ca Merge pull request #3385 from oqtane/dev
4.0.6 Release
2023-10-16 14:59:59 -04:00
Shaun Walker
59db8ba997 Merge pull request #3383 from sbwalker/dev
4.0.6 data provider packages
2023-10-16 09:08:17 -04:00
sbwalker
df37d4aa7f 4.0.6 data provider packages 2023-10-16 09:08:03 -04:00
Shaun Walker
fd9935c800 Merge pull request #3382 from sbwalker/dev
prepare for 4.0.6 release
2023-10-16 08:43:42 -04:00
sbwalker
c057430488 prepare for 4.0.6 release 2023-10-16 08:43:31 -04:00
Shaun Walker
767fa78e22 Merge pull request #3380 from sbwalker/dev
resolve issue in making Pager search work with sorting
2023-10-16 08:03:42 -04:00
sbwalker
a0e289dcd6 resolve issue in making Pager search work with sorting 2023-10-16 08:03:31 -04:00
Shaun Walker
c62d147254 Merge pull request #3375 from leigh-pointer/AllowPunctuation
Module Creator allow punctuation in Description field
2023-10-13 08:46:15 -04:00
Shaun Walker
f739bee353 Merge pull request #3376 from leigh-pointer/BootswatchThemeIssue
Fix for #3374 Backward compatability
2023-10-13 08:46:03 -04:00
Shaun Walker
db4dfb69fb Merge pull request #3377 from sbwalker/dev
improve Pager search to support properties on child objects
2023-10-13 08:39:23 -04:00
sbwalker
9729a5ef16 improve Pager search to support properties on child objects 2023-10-13 08:39:02 -04:00
Leigh Pointer
6f12818352 Fix for #3374 Backward compatability
Fixes the issue in the Language selector.
2023-10-13 14:06:21 +02:00
Leigh Pointer
75fc318da0 Module Creator all punctuation in description
Modified the Regex to all punctuation in the description.
2023-10-13 11:50:00 +02:00
Shaun Walker
acf71cc2c2 Merge pull request #3370 from leigh-pointer/LanguageAlignment
Language Selector Alignment fix  #3368
2023-10-12 11:10:47 -04:00
Shaun Walker
42efe10473 Merge pull request #3372 from sbwalker/dev
optimize Pager search to remove redundant AllowSearch parameter and avoid consuming memory when not in use
2023-10-12 11:10:35 -04:00
sbwalker
b77e72880b optimize Pager search to remove redundant AllowSearch parameter and avoid consuming memory when not in use 2023-10-12 11:10:14 -04:00
Leigh Pointer
297c1524b4 Language Selector Alignment fix #3368
Themes fixed also
2023-10-11 15:48:05 +02:00
Shaun Walker
6140743769 Merge pull request #3352 from Rodien/dev
Introduce a dropdown menu for authorization response types
2023-10-11 09:08:48 -04:00
Shaun Walker
d5ca700828 Merge pull request #3366 from sbwalker/dev
change name of RESX key and value to reflect purpose
2023-10-10 10:33:39 -04:00
sbwalker
a7e1fe76c3 change name of RESX key and value to reflect purpose 2023-10-10 10:33:11 -04:00
Shaun Walker
f6c55279d1 Merge pull request #3364 from leigh-pointer/PagerSearch
Pager Search Localization
2023-10-10 10:25:47 -04:00
Shaun Walker
826f4835bb Merge branch 'dev' into PagerSearch 2023-10-10 10:25:37 -04:00
Leigh Pointer
119a28def1 Pager Search Localization
Localization is now referencing the Shared Resources
2023-10-10 14:33:16 +02:00
Shaun Walker
c1ffb8bc33 Merge pull request #3365 from sbwalker/dev
use SharedLocalizer in Pager
2023-10-10 08:07:21 -04:00
sbwalker
60cc9d14af use SharedLocalizer in Pager 2023-10-10 08:07:07 -04:00
Leigh Pointer
7cf4f8fdaa Pager Search Localization
Localized the new Search Buttons
Added a Localized Placeholder that will display what columns are being searched.
2023-10-10 11:28:57 +02:00
Shaun Walker
1b84e83061 Merge pull request #3363 from sbwalker/dev
add Search capability to Pager and include in management UIs
2023-10-09 16:59:54 -04:00
sbwalker
b0d2ee8760 add Search capability to Pager and include in management UIs 2023-10-09 16:59:36 -04:00
Shaun Walker
2022432d35 Merge pull request #3362 from sbwalker/dev
Add Rows option to Profile Management. Improve Profile validation feedback. Fix Add User so that profile Options are supported.
2023-10-09 14:27:24 -04:00
sbwalker
c0ed335d84 Add Rows option to Profile Management. Improve Profile validation feedback. Fix Add User so that profile Options are supported. 2023-10-09 14:26:56 -04:00
Shaun Walker
4964562866 Merge pull request #3361 from sbwalker/dev
include Pane in Module Settings
2023-10-09 13:19:00 -04:00
sbwalker
f78dc443ad include Pane in Module Settings 2023-10-09 13:18:43 -04:00
Shaun Walker
56b47db778 Merge pull request #3360 from sbwalker/dev
allow module to be inserted at top of pane
2023-10-09 12:58:15 -04:00
sbwalker
2d4bf17b28 allow module to be inserted at top of pane 2023-10-09 12:58:01 -04:00
Shaun Walker
3b1819c68d Merge pull request #3359 from sbwalker/dev
optimize UrlCombine method
2023-10-09 12:00:51 -04:00
sbwalker
575bbdb53b optimize UrlCombine method 2023-10-09 12:00:34 -04:00
Rodien_Bond004
2fa7482028 Introduce a dropdown menu in the 'External Login' settings area for authentication flow response types. 2023-10-03 09:00:53 +02:00
Shaun Walker
e5062317e2 Merge pull request #3347 from sbwalker/dev
do not show uploaded file name or delete button when multiple uploads are enabled
2023-09-29 11:49:05 -04:00
sbwalker
543f4fa3c2 do not show uploaded file name or delete button when multiple uploads are enabled 2023-09-29 11:48:45 -04:00
Shaun Walker
49cdf69815 Merge pull request #3344 from Mostafa-Moafi/dev
Fixed issue #3282
2023-09-28 15:36:00 -04:00
Shaun Walker
04196a1a19 Merge pull request #3346 from sbwalker/dev
display uploaded file name in FileManager when ShowFiles = false
2023-09-28 15:35:26 -04:00
sbwalker
b8622b8708 display uploaded file name in FileManager when ShowFiles = false 2023-09-28 15:35:13 -04:00
Mostafa Moafi
a2feca0ba3 Fixed Bug #3282 2023-09-28 19:23:31 +03:30
Shaun Walker
ae6c6a75b2 Merge pull request #3342 from sbwalker/dev
style page names in Admin Dashboard so that they are always visible in Bootstrap themes
2023-09-28 07:51:05 -04:00
sbwalker
bd987e9531 style page names in Admin Dashboard so that they are always visible in Bootstrap themes 2023-09-27 16:26:59 -04:00
Shaun Walker
24d69fd820 Merge pull request #3341 from sbwalker/dev
include CopyLocalLockFileAssemblies property in Client project in Default Module Template
2023-09-27 16:11:46 -04:00
sbwalker
9e2fa8d7f1 include CopyLocalLockFileAssemblies property in Client project in Default Module Template 2023-09-27 16:11:29 -04:00
Shaun Walker
74ba2f7283 Merge pull request #3340 from sbwalker/dev
add hyperlinks to product logos
2023-09-27 16:09:30 -04:00
sbwalker
7603b5c63f add hyperlinks to product logos 2023-09-27 16:09:19 -04:00
Shaun Walker
03566afe66 Merge pull request #3339 from sbwalker/dev
fix UrlCombine so that it handles leading and trailing path delimiters and returns proper paths
2023-09-27 16:07:32 -04:00
sbwalker
3c2e314e2d fix UrlCombine so that it handles leading and trailing path delimiters and returns proper paths 2023-09-27 16:07:13 -04:00
Shaun Walker
1fcf08b5cd Update README.md 2023-09-26 14:06:18 -04:00
Shaun Walker
c13db89ed4 Merge pull request #3330 from sbwalker/dev
4.0.5 data provider packages
2023-09-26 14:03:19 -04:00
sbwalker
e68ae9e8a6 4.0.5 data provider packages 2023-09-26 14:03:06 -04:00
Shaun Walker
fb252d6db3 Merge pull request #3329 from oqtane/master
4.0.5 release
2023-09-26 13:59:55 -04:00
Shaun Walker
df959353d6 Merge pull request #3328 from oqtane/dev
4.0.5 release
2023-09-26 13:59:29 -04:00
Shaun Walker
fbc443483d Merge pull request #3327 from sbwalker/dev
prepare for 4.0.5
2023-09-26 11:35:05 -04:00
sbwalker
00f1dbc3dd prepare for 4.0.5 2023-09-26 11:34:52 -04:00
Shaun Walker
c6021ff012 Merge pull request #3326 from ijaz-saeed/dev
Empty _themetype check to avoid page crash
2023-09-26 10:23:02 -04:00
isaeed
7a8cfcee35 Empty _themetype check to avoid page crash
without this check, admin dashboard -> Page Management -> Edit page
is crashing
2023-09-26 18:23:29 +05:00
Shaun Walker
c15586a1c4 Update README.md 2023-09-25 16:00:23 -04:00
Shaun Walker
be1d124e78 Merge pull request #3322 from oqtane/master
Merge pull request #3321 from oqtane/dev
2023-09-25 15:55:54 -04:00
Shaun Walker
6fabf84d05 Merge pull request #3321 from oqtane/dev
4.0.4 release
2023-09-25 15:55:37 -04:00
Shaun Walker
3299275da2 Merge pull request #3320 from sbwalker/dev
resolve cookie configuration
2023-09-25 15:10:50 -04:00
sbwalker
5539243bf3 resolve cookie configuration 2023-09-25 15:10:36 -04:00
Shaun Walker
c3d330f500 Merge pull request #3319 from sbwalker/dev
refactor logic to redirect to external login provider when local site login is disabled
2023-09-25 13:53:26 -04:00
sbwalker
8c9e886136 refactor logic to redirect to external login provider when local site login is disabled 2023-09-25 13:53:05 -04:00
Shaun Walker
cfde9944f8 Merge pull request #3318 from sbwalker/dev
include Logout link in Control Panel for scenarios where a theme does not include a Login/Logout component
2023-09-25 12:42:59 -04:00
sbwalker
b35d778abe include Logout link in Control Panel for scenarios where a theme does not include a Login/Logout component 2023-09-25 12:42:39 -04:00
Shaun Walker
1e9ee81df3 Merge pull request #3317 from sbwalker/dev
updated database provider packages for 4.0.4
2023-09-25 10:01:59 -04:00
sbwalker
545d5730b6 database provider packages for 4.0.4 2023-09-25 09:59:07 -04:00
sbwalker
28e645f9ca Merge branch 'dev' of https://github.com/sbwalker/oqtane.framework into dev 2023-09-25 09:54:38 -04:00
sbwalker
5b5c8a4beb database provider packages for 4.0.4 2023-09-25 09:54:27 -04:00
Shaun Walker
6178be974a Merge pull request #3310 from leigh-pointer/LangSwitchPadding
upated LanguageSwitcher with end padding
2023-09-25 07:42:24 -04:00
Leigh Pointer
7771c3159b upated LanguageSwitcher with end padding
When the LanguageSwitcher is dsiplayed the wsa no end padding on the button so it appeared flush with the following button.  Adding "pe-1" to the class corrects the issue
2023-09-24 18:49:50 +02:00
Shaun Walker
fc1e9c5d71 Merge pull request #3308 from sbwalker/dev
revert remaining logic which forced page themes to be a member of a site theme (4.0.0)
2023-09-23 11:47:08 -04:00
sbwalker
359de5b85e revert remaining logic which forced page themes to be a member of a site theme 2023-09-23 11:46:35 -04:00
Shaun Walker
68dc4904cf Merge pull request #3307 from sbwalker/dev
improve user import API
2023-09-23 11:37:43 -04:00
sbwalker
057fd02e26 improve user import API 2023-09-23 11:37:29 -04:00
Shaun Walker
5c86ef6682 Merge pull request #3303 from leigh-pointer/Retention-resx
Fix for  Site 'SMTP retention' is not in resource file (Issue #3301) and #3304 Users 'Import Users' resource
2023-09-23 09:12:33 -04:00
Shaun Walker
7c14bd799f Merge pull request #3305 from sbwalker/dev
improvements based on user import testing
2023-09-23 09:04:35 -04:00
sbwalker
edac046fcd improvements based on user import testing 2023-09-23 09:04:18 -04:00
Leigh Pointer
8b23b386f7 ImportUsers Added to Resx and Razor resource key 2023-09-23 10:56:17 +02:00
Leigh Pointer
e9bed59032 Fix for Site 'SMTP retention' is not in resource file (Issue #3301)
Fix for  Site 'SMTP retention' is not in resource file (Issue #3301)
2023-09-23 10:42:39 +02:00
Shaun Walker
54077be32c Merge pull request #3299 from sbwalker/dev
fix reference to DisplayName
2023-09-22 15:03:57 -04:00
sbwalker
30ad442dd1 fix reference to DisplayName 2023-09-22 15:03:45 -04:00
Shaun Walker
b0c677d5a7 Merge pull request #3298 from sbwalker/dev
removing href link from DisplayName as Email is now included
2023-09-22 14:44:36 -04:00
sbwalker
abe1b93e3c removing href link from DisplayName as Email is now included 2023-09-22 14:44:25 -04:00
Shaun Walker
fd699cbb73 Merge pull request #3293 from W6HBR/dev
Add Email column to User Manager screen
2023-09-22 14:31:56 -04:00
Shaun Walker
6f93ca11de Merge pull request #3297 from sbwalker/dev
fix issue where module migrations were not being executed on upgrade due to version not being overridden
2023-09-22 14:12:36 -04:00
sbwalker
916663b493 fix issue where module migrations were not being executed on upgrade due to version not being overridden 2023-09-22 14:12:18 -04:00
Jon Welfringer
dbf2cddd87 Update Index.razor to include Email column. 2023-09-21 16:58:48 -07:00
Jon Welfringer
d3c248cf5c Update Index.resx for Email text. 2023-09-21 16:57:01 -07:00
Shaun Walker
bd93a94bb7 Merge pull request #3292 from thabaum/patch-6
Fix typo in app.css
2023-09-21 19:42:02 -04:00
Cody
a46836e2a6 Fix typo in app.css 2023-09-21 16:34:57 -07:00
Shaun Walker
a1d88b4faa Merge pull request #3290 from sbwalker/dev
add named site option support to factory
2023-09-21 17:17:59 -04:00
sbwalker
29741c0ec8 add named site option support to factory 2023-09-21 17:17:46 -04:00
Shaun Walker
0b5fb92452 Merge pull request #3289 from sbwalker/dev
add support for named site options
2023-09-21 16:54:04 -04:00
sbwalker
65782e87c1 add support for named site options 2023-09-21 16:53:52 -04:00
Shaun Walker
6403df3330 Merge pull request #3288 from sbwalker/dev
set DefaultScheme for authentication
2023-09-21 14:45:09 -04:00
sbwalker
c6a8f5305a set DefaultScheme for authentication 2023-09-21 14:44:57 -04:00
Shaun Walker
d354e63267 Merge pull request #3285 from sbwalker/dev
fix localization in Profile Management
2023-09-21 10:02:36 -04:00
sbwalker
836b174d15 fix localization in Profile Management 2023-09-21 10:02:21 -04:00
Shaun Walker
4435f25ee6 Merge pull request #3275 from W6HBR/dev
Update to Profiles field list to include Title, Category and ViewOrder
2023-09-21 09:57:55 -04:00
Shaun Walker
4ab4bf4a3a Merge pull request #3279 from thabaum/patch-5
Updates Child Page Link Color in Theme Creator Template - Theme.css - Fixes #3278
2023-09-21 09:57:30 -04:00
Shaun Walker
d2f1d3c86c Merge pull request #3283 from sbwalker/dev
user import improvements
2023-09-21 09:37:44 -04:00
sbwalker
98257de005 user import improvements 2023-09-21 09:37:29 -04:00
Cody
5ea5c6ff7d Updates Child Page Link Color in Theme.css 2023-09-20 17:12:04 -07:00
Jon Welfringer
441324d354 Update to Profiles field list to include Title, Category and ViewOrder
When adding additional profile fields, this enhancement makes it easier to see details of the profile fields for the purpose of field organization.
2023-09-20 14:59:44 -07:00
Shaun Walker
44f093b2fa Merge pull request #3266 from W6HBR/W6HBR-patch-1
Add password complexity requirements message to password Reset module.
2023-09-20 15:19:03 -04:00
Shaun Walker
38a16d1ae2 Merge pull request #3273 from sbwalker/dev
prepare for 4.0.4 release
2023-09-20 14:59:10 -04:00
sbwalker
6b9de40442 prepare for 4.0.4 release 2023-09-20 14:58:54 -04:00
Shaun Walker
d9c9eb9799 Merge pull request #3258 from leigh-pointer/ViewNotification
Removed the ReadOnly attribute in the Notifications Reply TextArea
2023-09-20 14:32:41 -04:00
Shaun Walker
e88c8eee0f Merge pull request #3271 from sbwalker/dev
fix #3231 - validate module description
2023-09-20 14:29:21 -04:00
sbwalker
a6ca843ced fix #3231 - validate module description 2023-09-20 14:29:06 -04:00
Shaun Walker
6967a5cc14 Merge pull request #3270 from sbwalker/dev
if site login is disabled redirect Login to external identity provider
2023-09-20 13:45:34 -04:00
sbwalker
e0ebf70907 if site login is disabled redirect Login to external identity provider 2023-09-20 13:45:19 -04:00
Shaun Walker
53d0202f3b Merge pull request #3268 from sbwalker/dev
prevent System Update in development environment
2023-09-20 12:34:20 -04:00
sbwalker
8daf38654d prevent System Update in development environment 2023-09-20 12:33:43 -04:00
Shaun Walker
17337440f2 Merge pull request #3267 from sbwalker/dev
add ability to import users
2023-09-20 10:44:05 -04:00
sbwalker
8e5e79a799 add ability to import users 2023-09-20 10:43:49 -04:00
Jon Welfringer
5c1cf14303 Add password complexity requirements message to password Reset module.
This adds the same functionality that already exists in the UserProfile module.
2023-09-19 18:59:38 -07:00
Shaun Walker
f2ad796104 Merge pull request #3263 from sbwalker/dev
adjust error message text when adding users with duplicate email addresses
2023-09-19 09:00:11 -04:00
sbwalker
886df69058 adjust error message text when adding users with duplicate email addresses 2023-09-19 08:59:53 -04:00
Shaun Walker
703aa95e60 Merge pull request #3262 from sbwalker/dev
fix error when Allow User Login is set to false (ElementReference has not been configured correctly)
2023-09-19 08:49:21 -04:00
sbwalker
7919e14d90 fix error when Allow User Login is set to false (ElementReference has not been configured correctly) 2023-09-19 08:49:03 -04:00
Shaun Walker
c8ef191660 Merge pull request #3261 from sbwalker/dev
remove using statements added by Visual Studio
2023-09-18 09:47:52 -04:00
sbwalker
840b656d1c remove using statements added by Visual Studio 2023-09-18 09:47:38 -04:00
Shaun Walker
d28516b6b1 Merge pull request #3260 from sbwalker/dev
fix issue with module order in panes caused by transition from Admin to Default pane naming
2023-09-18 09:46:40 -04:00
sbwalker
5797bf549c fix issue with module order in panes caused by transition from Admin to Default pane naming 2023-09-18 09:46:16 -04:00
Leigh Pointer
e1ea721ea9 Removed the ReadOnly attribute
The replay textarea can now be used to enter a reply to the notification.
2023-09-16 18:35:22 +02:00
Shaun Walker
5ed1284baf Merge pull request #3257 from sbwalker/dev
fix #3255 - behavior when moving pages to other parents
2023-09-15 16:23:28 -04:00
sbwalker
e507023a03 fix #3255 - behavior when moving pages to other parents 2023-09-15 16:23:14 -04:00
Shaun Walker
2b328b9bb2 Merge pull request #3254 from sbwalker/dev
fix #3253 - login needs to validate User.IsDeleted property
2023-09-13 10:02:27 -04:00
sbwalker
d155e13399 fix #3253 - login needs to validate User.IsDeleted property 2023-09-13 10:02:11 -04:00
Shaun Walker
6993d4782d Merge pull request #3244 from sbwalker/dev
improve polling in file upload to use actual file sizes to calculate duration
2023-09-08 17:16:28 -04:00
sbwalker
9267efce01 improve polling in file upload to use actual file sizes to calculate duration 2023-09-08 17:16:09 -04:00
Shaun Walker
8c88cec863 Merge pull request #3242 from sbwalker/dev
retain querystring parameters on url mapping redirect
2023-09-08 12:05:35 -04:00
sbwalker
b4b9976567 retain querystring parameters on url mapping redirect 2023-09-08 12:05:20 -04:00
Shaun Walker
3cbd820d9c Merge pull request #3240 from sbwalker/dev
fix #3236 - script injection issue
2023-09-08 11:25:40 -04:00
sbwalker
edd77b0222 fix #3236 - script injection issue 2023-09-08 11:25:27 -04:00
Shaun Walker
c0991df9a2 Merge pull request #3239 from sbwalker/dev
fix #3235 - </script> not being removed from Head Content
2023-09-08 11:09:46 -04:00
sbwalker
26921c899e fix #3235 - </script> not being removed from Head Content 2023-09-08 11:09:07 -04:00
Shaun Walker
a1e5912d37 Merge pull request #3238 from sbwalker/dev
fix #3229 - changing page path in Edot Page when invoked from Control Panel results in 404 when redirecting
2023-09-08 10:35:52 -04:00
sbwalker
037f1ec887 fix #3229 - changing page path in Edot Page when invoked from Control Panel results in 404 when redirecting 2023-09-08 10:35:22 -04:00
Shaun Walker
89ab44590b Merge pull request #3224 from sbwalker/dev
capitalize
2023-09-05 11:28:52 -04:00
sbwalker
4a20be8b34 capitalize 2023-09-05 11:28:36 -04:00
Shaun Walker
32a401ba67 Merge pull request #3223 from sbwalker/dev
display Site Guid in Site Settings
2023-09-05 11:27:30 -04:00
sbwalker
138c01aef8 display Site Guid in Site Settings 2023-09-05 11:27:17 -04:00
Shaun Walker
3e54bc9c77 Merge pull request #3221 from sbwalker/dev
add ability to validate and download packages
2023-09-02 14:08:34 -04:00
sbwalker
9966fc4651 add ability to validate and download packages 2023-09-02 14:08:21 -04:00
Shaun Walker
c9ed5ec98f Merge pull request #3220 from sbwalker/dev
improve help text for paclage name
2023-09-01 14:04:38 -04:00
sbwalker
1f4ae5dbfb improve help text for paclage name 2023-09-01 14:04:27 -04:00
Shaun Walker
d0d3cc8faa Merge pull request #3219 from sbwalker/dev
fix paths in Edit Page / Modules tab / Edit option
2023-09-01 13:57:26 -04:00
sbwalker
7513ae28f0 fix paths in Edit Page / Modules tab / Edit option 2023-09-01 13:57:14 -04:00
Shaun Walker
c151c6f55a Merge pull request #3218 from sbwalker/dev
include User Settings when calling UserService
2023-09-01 13:16:51 -04:00
sbwalker
d491aeeba6 include User Settings when calling UserService 2023-09-01 13:16:39 -04:00
Shaun Walker
ab93d0acea Merge pull request #3217 from sbwalker/dev
Fix #3215 - module creator creates incorrect ServerManagerType value
2023-09-01 13:03:01 -04:00
sbwalker
f40f3f934f Fix #3215 - module creator creates incorrect ServerManagerType value 2023-09-01 13:02:44 -04:00
Shaun Walker
4d57adb393 Merge pull request #3216 from sbwalker/dev
allow an administratot to browse to the SiteMap, handle default module panes and ordering for PageTemplates, allow trial products to be purchased
2023-09-01 12:14:24 -04:00
sbwalker
e91db18677 allow an administratot to browse to the SiteMap, handle default module panes and ordering for PageTemplates, allow trial products to be purchased 2023-09-01 12:14:04 -04:00
Shaun Walker
9a88d65ff7 Merge pull request #3212 from sbwalker/dev
need to use context rather than filter
2023-08-31 14:18:31 -04:00
sbwalker
211d8c7f19 need to use context rather than filter 2023-08-31 14:18:19 -04:00
Shaun Walker
763cdca114 Merge pull request #3211 from sbwalker/dev
Marketplace UI consistency
2023-08-31 13:55:08 -04:00
sbwalker
0d56d35646 Marketplace UI consistency 2023-08-31 13:54:56 -04:00
Shaun Walker
d1e80cb86a Update README.md 2023-08-29 14:01:00 -04:00
Shaun Walker
2e116489c8 Merge pull request #3208 from oqtane/master
Merge pull request #3207 from oqtane/dev
2023-08-29 13:54:50 -04:00
Shaun Walker
a94daa1216 Merge pull request #3207 from oqtane/dev
4.0.3 Release
2023-08-29 13:54:31 -04:00
Shaun Walker
ad57d665cc Merge pull request #3205 from sbwalker/dev
filter deleted pages and modules on the server
2023-08-28 17:15:45 -04:00
sbwalker
db2c42f0f4 filter deleted pages and modules on the server 2023-08-28 17:15:31 -04:00
Shaun Walker
b713cf86c7 Merge pull request #3204 from sbwalker/dev
fix page template update logic
2023-08-28 16:12:47 -04:00
sbwalker
11d02ccf44 fix page template update logic 2023-08-28 16:12:32 -04:00
Shaun Walker
54f3c8beac Merge pull request #3203 from sbwalker/dev
documentation for ReleaseVersions property
2023-08-28 15:27:47 -04:00
sbwalker
2ed51bf1f3 documentation for ReleaseVersions property 2023-08-28 15:27:33 -04:00
Shaun Walker
9f859f024c Merge pull request #3202 from sbwalker/dev
improve solution related to module installation issue where ModuleDefinition Version property was not being populated correctly (#3175)
2023-08-28 15:20:29 -04:00
sbwalker
d47175df8a improve solution related to module installation issue where ModuleDefinition Version property was not being populated correctly (#3175) 2023-08-28 15:20:09 -04:00
Shaun Walker
d6a80d36b1 Merge pull request #3200 from sbwalker/dev
abstract namespace specification to template.json so that module and theme templates can use their own naming conventions
2023-08-28 09:03:26 -04:00
sbwalker
a857e3f31e abstract namespace specification to template.json so that module and theme templates can use their own naming conventions 2023-08-28 09:03:05 -04:00
Shaun Walker
918dfb05cd Merge pull request #3199 from sbwalker/dev
prepare for 4.0.3 release
2023-08-28 07:58:49 -04:00
sbwalker
f22e0c4384 prepare for 4.0.3 release 2023-08-28 07:58:33 -04:00
Shaun Walker
daa08626ae Merge pull request #3198 from sbwalker/dev
support ~ notation for license urls
2023-08-28 07:49:22 -04:00
sbwalker
45592e6acd support ~ notation for license urls 2023-08-28 07:49:06 -04:00
Shaun Walker
6944eb3392 Merge pull request #3197 from sbwalker/dev
allow module or theme License property to be a Url
2023-08-27 08:57:50 -04:00
sbwalker
85f20aca58 allow module or theme License property to be a Url 2023-08-27 08:57:30 -04:00
Shaun Walker
ca8d8b3587 Merge pull request #3196 from sbwalker/dev
move password requirement localization back to Client project
2023-08-27 08:43:43 -04:00
sbwalker
74921a0686 move password requirement localization back to Client project 2023-08-27 08:43:23 -04:00
Shaun Walker
be4296f288 Merge pull request #3195 from sbwalker/dev
include only distinct items which have package names
2023-08-25 17:44:39 -04:00
sbwalker
836de56276 include only distinct items which have package names 2023-08-25 17:44:27 -04:00
Shaun Walker
ef60ac3836 Merge pull request #3194 from sbwalker/dev
optimize package update queries
2023-08-25 15:42:58 -04:00
sbwalker
bdd1ba05e8 optimize package update queries 2023-08-25 15:42:45 -04:00
Shaun Walker
f0a22d5517 Merge pull request #3193 from sbwalker/dev
remove Module Creator in favor of using Create Module in Module Management
2023-08-25 13:49:08 -04:00
sbwalker
417c8d7874 remove Module Creator in favor of using Create Module in Module Management 2023-08-25 13:48:51 -04:00
Shaun Walker
5a111cdb2a Merge pull request #3192 from sbwalker/dev
fix #3174 - display accurate password complexity requirements (this is now implemented in registration, user profiles, and user management - add/edit)
2023-08-25 13:31:22 -04:00
sbwalker
ef2f779f71 fix #3174 - display accurate password complexity requirements (this is now implemented in registration, user profiles, and user management - add/edit) 2023-08-25 13:31:02 -04:00
Shaun Walker
f0fd0db7bb Merge pull request #3191 from sbwalker/dev
simplified method names
2023-08-25 12:30:01 -04:00
sbwalker
b4ab45d2e7 simplified method names 2023-08-25 12:29:46 -04:00
Shaun Walker
73c4bcee30 Merge pull request #3185 from leigh-pointer/SchedularTimeControls
Fix for Schedular Allows incorrect Time format #3184
2023-08-25 10:54:13 -04:00
Shaun Walker
d4daf098e1 Merge pull request #3190 from sbwalker/dev
resolve #3189 - make path a querystring parameter
2023-08-25 09:49:22 -04:00
sbwalker
95de1fff69 resolve #3189 - make path a querystring parameter 2023-08-25 09:49:07 -04:00
Leigh Pointer
96480b4382 Override and 2 new functions 2023-08-25 12:09:16 +02:00
Shaun Walker
14ae553557 Merge pull request #3188 from sbwalker/dev
remove unecessary NotMapped attribute
2023-08-24 16:42:30 -04:00
sbwalker
4de809e275 remove unecessary NotMapped attribute 2023-08-24 16:41:58 -04:00
Shaun Walker
a383382529 Merge pull request #3187 from sbwalker/dev
include PackageRegistryUrl in System Info
2023-08-24 16:39:51 -04:00
sbwalker
d2b3061ed9 include PackageRegistryUrl in System Info 2023-08-24 16:39:38 -04:00
Leigh Pointer
073b10929a Fix for Schedular Allows incorrect Time format #3184
Modified code to accept correct time types.
2023-08-24 18:37:33 +02:00
Shaun Walker
6a2cfcab34 Merge pull request #3183 from leigh-pointer/IconResources
Update IconRescources
2023-08-24 11:38:09 -04:00
Leigh Pointer
00c85ae7d3 Update IconResources.resx 2023-08-24 17:03:24 +02:00
Leigh Pointer
d1b1e88389 Update IconRescources 2023-08-24 15:46:24 +02:00
Shaun Walker
5679ff5df9 Merge pull request #3182 from sbwalker/dev
add refresh button to module and theme installation page
2023-08-24 09:33:46 -04:00
sbwalker
3f28b39da0 add refresh button to module and theme installation page 2023-08-24 09:33:32 -04:00
Shaun Walker
ee21536742 Merge pull request #3181 from sbwalker/dev
reverse InputList Dictionary usage
2023-08-24 08:50:45 -04:00
sbwalker
6fafeedeb9 reverse InputList Dictionary usage 2023-08-24 08:50:33 -04:00
Shaun Walker
d86c53858e Merge pull request #3180 from sbwalker/dev
added defensive logic to resolve regression issue caused by #3175
2023-08-24 08:10:06 -04:00
sbwalker
0a22f80942 added defensive logic to resolve regression issue caused by #3175 2023-08-24 08:09:53 -04:00
Shaun Walker
fb247197e8 Merge pull request #3179 from sbwalker/dev
Allow InputList component to be localizable and support multiple instances on a page. Implement icon localization in Page Add/Edit using IconResources.resx
2023-08-23 16:43:36 -04:00
sbwalker
261ed05fa3 Allow InputList component to be localizable and support multiple instances on a page. Implement icon localization in Page Add/Edit using IconResources.resx 2023-08-23 16:43:14 -04:00
Shaun Walker
f5ce48a7c2 Merge pull request #3178 from sbwalker/dev
move icon loading reflection logic to server
2023-08-23 15:25:54 -04:00
sbwalker
82d128974c move icon loading reflection logic to server 2023-08-23 15:25:39 -04:00
Shaun Walker
34ae731959 Merge pull request #3169 from leigh-pointer/InputList
Add InputList control to select values from a dictionary of string
2023-08-23 14:29:38 -04:00
Shaun Walker
030a92d048 Merge pull request #3171 from vnetonline/fix-3163
[FIX] Added the ability to clear the Message in control panel
2023-08-23 14:29:28 -04:00
Shaun Walker
a327358b7a Merge pull request #3177 from sbwalker/dev
add support for background color padding during image resizing
2023-08-23 10:05:46 -04:00
sbwalker
9bd078d3e9 add support for background color padding during image resizing 2023-08-23 10:05:27 -04:00
Shaun Walker
412405e22c Merge pull request #3176 from sbwalker/dev
improve UX for Extend license option
2023-08-23 09:39:04 -04:00
sbwalker
2b20b34a74 improve UX for Extend license option 2023-08-23 09:38:48 -04:00
Shaun Walker
f269a07463 Merge pull request #3175 from sbwalker/dev
resolve module installation issue where ModuleDefinition Version property was not being populated correctly
2023-08-23 09:24:56 -04:00
sbwalker
d9948e8ee0 resolve module installation issue where ModuleDefinition Version property was not being populated correctly 2023-08-23 09:24:36 -04:00
Leigh Pointer
ddb2fe4b03 Update Edit.razor
Moved Icon to the end of control
2023-08-23 07:49:50 +02:00
Leigh Pointer
471f7184fb Added Icon Preview
Added an icon preview to the icon selecting control
2023-08-23 07:47:35 +02:00
vnetonline
92ea5da358 [FIX] Added the ability to clear the Message in control panel on open or close
This fix is related to issue #3163
2023-08-23 10:13:16 +10:00
Leigh Pointer
09f1d3ca15 Add InputList control to select values from a dictionary of string
The control accepts a dictionary of string that can be searched using an input control.
Pages Add and Edit have implemented the control to render the list of Icons found in the Oqtane Shared namespace.
2023-08-22 09:50:59 +02:00
Shaun Walker
3729b8eac2 Merge pull request #3161 from rcpacheco/rcp_show_passwd_dbs
Update database installers to show/hide passwd
2023-08-21 11:02:29 -04:00
Ricardo Pacheco
ca5f345414 Update database installers to show/hide passwd 2023-08-18 13:25:32 -06:00
Shaun Walker
15cf1e8a53 Merge pull request #3160 from sbwalker/dev
fix #3157 - provide support for asynchronous scheduled jobs
2023-08-18 13:34:52 -04:00
sbwalker
da74b0ece1 fix #3157 - provide support for asynchronous scheduled jobs 2023-08-18 13:34:38 -04:00
Shaun Walker
f50fe6f22f Merge pull request #3158 from sbwalker/dev
add support for * ImageSizes for folders
2023-08-18 10:55:25 -04:00
sbwalker
542eec2a9e add support for * ImageSizes for folders 2023-08-18 10:55:10 -04:00
Shaun Walker
4c5460fc9e Merge pull request #3156 from sbwalker/dev
migrate LocalizerFactory logic from SiteRouter to ModuleTitle component
2023-08-17 08:23:30 -04:00
sbwalker
394b8f1ce6 migrate LocalizerFactory logic from SiteRouter to ModuleTitle component 2023-08-17 08:23:17 -04:00
Shaun Walker
abeeda1a2b Merge pull request #3155 from sbwalker/dev
rollback #3125 and localize module component Title using LocalizerFactory
2023-08-17 07:56:58 -04:00
sbwalker
9e6ea3f486 rollback #3125 and localize module component Title using LocalizerFactory 2023-08-17 07:56:39 -04:00
Shaun Walker
2777a0946c Merge pull request #3154 from vnetonline/enhance-expando-object
[ENHANCE] - Change to ExpandoObject instead of an Anonymous Object
2023-08-17 07:47:57 -04:00
Shaun Walker
7f43c2659a Merge pull request #3153 from leigh-pointer/UserSort
Update the TH with link-primary Decoration classes
2023-08-17 07:46:39 -04:00
vnetonline
a4fa11c881 [ENHANCE] - Change to ExpandoObject instead of an Anonymous Object
Anonymous Object are not able to be used across assemblies however ExpandoObject is refer to #3145
2023-08-17 10:45:38 +10:00
Leigh Pointer
8230e51c05 Update the TH with link-primary Decoration classes
This emphasizes that the header is clickable.
2023-08-16 19:09:12 +02:00
Leigh Pointer
6e62d4791c Update the TH with link-primary Decoration classes
This emphasizes that the header is clickable.
2023-08-16 19:06:59 +02:00
Shaun Walker
ce8abdb8cd Merge pull request #3152 from sbwalker/dev
modify column size to prevent text wrapping
2023-08-16 12:25:53 -04:00
sbwalker
941bb7edaa modify column size to prevent text wrapping 2023-08-16 12:25:39 -04:00
Shaun Walker
1acbdf8b9e Merge pull request #3150 from alikoli/dev
Fix missing translations part 3
2023-08-15 15:51:58 -04:00
Shaun Walker
530804c847 Merge pull request #3151 from sbwalker/dev
In FileManager fix the id handling for the progressinfo and progressbar and include OnSelect events on Upload and Delete. Add missing backend implementation for AddFileAsync
2023-08-15 15:51:32 -04:00
sbwalker
b00b426e9c fix the id handling for the progressinfo and progressbar, include OnSelect events on Upload and Delete, add missing backend implementation for AddFileAsync 2023-08-15 15:50:35 -04:00
alikoli
128f1753c0 Remove resx backups 2023-08-15 16:17:23 +02:00
alikoli
1922629d27 Merge branch 'oqtane:dev' into dev 2023-08-15 16:12:21 +02:00
alikoli
283a03a7cc Fix missing translations part 3 2023-08-15 16:09:59 +02:00
Shaun Walker
cdab26a97b Merge pull request #3146 from HonesDK/dev
Fixed localization in AuditInfo
2023-08-15 08:03:29 -04:00
Shaun Walker
5d3311c46b Merge pull request #3147 from sbwalker/dev
Notification job must convert \n to <br /> now that IsNodyHtml is set to True
2023-08-14 17:03:43 -04:00
sbwalker
7cbc21671b Notification job must convert \n to <br /> now that IsNodyHtml is set to True 2023-08-14 17:03:21 -04:00
HonesDK
d14d820e25 Merge branch 'dev' of https://github.com/HonesDK/oqtane.framework into dev 2023-08-14 16:54:41 +02:00
HonesDK
b567d02df2 Fixed localization in AuditInfo 2023-08-14 16:52:30 +02:00
HonesDK
dbb58541f2 Revert "Fixed modified by localization, and added DateTimeFormat to localization"
This reverts commit 4a8bcc6f71.
2023-08-14 16:51:21 +02:00
Shaun Walker
5a42caf4f8 Merge pull request #3143 from sbwalker/dev
add ability to get user based on username or email address
2023-08-13 08:35:24 -04:00
sbwalker
c2acd010ce add ability to get user based on username or email address 2023-08-13 08:35:03 -04:00
HonesDK
4a8bcc6f71 Fixed modified by localization, and added DateTimeFormat to localization 2023-08-13 10:11:29 +02:00
Shaun Walker
89e4dc7a08 Merge pull request #3141 from sbwalker/dev
change "price" to "from" to reflect multiple options
2023-08-12 10:31:56 -04:00
sbwalker
c344eedb12 change "price" to "from" to reflect multiple options 2023-08-12 10:31:44 -04:00
Shaun Walker
0aeb1a62b9 Merge pull request #3137 from sbwalker/dev
fix #3134 improve parsing of headcontent to handle space delimiters
2023-08-11 15:53:43 -04:00
sbwalker
316e0f5a68 fix #3134 improve parsing of headcontent to handle space delimiters 2023-08-11 15:53:32 -04:00
Shaun Walker
6f9314f76f Merge pull request #3133 from alikoli/dev
Fix missing translations part 2
2023-08-11 15:33:21 -04:00
alikoli
6ef21795ba fix heading 2023-08-10 02:13:31 +02:00
alikoli
e44855493e fix heading 2023-08-10 02:12:36 +02:00
alikoli
101a3c8af5 Revert launchSettings 2023-08-10 02:03:46 +02:00
alikoli
8fbbbce4ec Fix missing translations part 2 2023-08-10 01:52:46 +02:00
Shaun Walker
1de8bb850f Update README.md 2023-08-09 08:54:45 -04:00
Shaun Walker
25d09186fe Update README.md 2023-08-09 08:34:35 -04:00
Shaun Walker
9552b7c6f9 Update README.md 2023-08-09 08:34:13 -04:00
Shaun Walker
3d692e4198 Merge pull request #3132 from oqtane/master
Merge pull request #3131 from oqtane/dev
2023-08-09 08:22:44 -04:00
Shaun Walker
215ca9f755 Merge pull request #3131 from oqtane/dev
4.0.2 Release
2023-08-09 08:22:24 -04:00
Shaun Walker
7dbcb24f3d Merge pull request #3129 from alikoli/fix-missing-translations
Fix missing translations
2023-08-09 08:16:06 -04:00
alikoli
18b4bd62f7 Update appsettings.json 2023-08-09 04:06:14 +02:00
alikoli
20f3cf5327 Add empty appsettings 2023-08-09 03:58:34 +02:00
alikoli
c1d35e8af5 Fix missing translations 2023-08-09 03:06:15 +02:00
Shaun Walker
e1cd318f61 Merge pull request #3128 from sbwalker/dev
fix installed cultures logic to recognize all satellite resources
2023-08-08 13:22:10 -04:00
sbwalker
4da0952091 fix installed cultures logic to recognize all satellite resources 2023-08-08 13:21:56 -04:00
Shaun Walker
a60f75f0a9 Merge pull request #3127 from sbwalker/dev
fix refresh logic in router
2023-08-08 13:07:43 -04:00
sbwalker
3814009ad9 fix refresh logic in router 2023-08-08 13:07:29 -04:00
Shaun Walker
fe7bb00112 Merge pull request #3125 from leigh-pointer/ModuleTitleLoc
Updated Module Title using SetModuleTitle on ModuleBase
2023-08-08 12:23:36 -04:00
Leigh Pointer
2356753dfc Updated Module Title using SetModuleTitle on ModuleBase 2023-08-08 16:37:40 +02:00
Leigh Pointer
bd23ec268b Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-08 15:34:25 +02:00
Shaun Walker
1d5f23c3c7 Merge pull request #3123 from leigh-pointer/TransKeys
Trans keys
2023-08-08 09:33:43 -04:00
Leigh Pointer
f424bf53b3 Revert Title to "Folder Management"
This is due to the public virtual string Title can not use the Localize instance as it not yet created so error with null reference.
2023-08-08 15:30:39 +02:00
Leigh Pointer
efbdf0006e Merge remote-tracking branch 'oqtane/dev' into TransKeys 2023-08-08 15:22:03 +02:00
Shaun Walker
625b173ee4 Merge pull request #3122 from leigh-pointer/TransKeys
Updated the Settings Heading
2023-08-08 08:05:21 -04:00
Leigh Pointer
0a8d9bc3d3 Updated the Settings Heading 2023-08-08 14:01:45 +02:00
Shaun Walker
0d0909a461 Merge pull request #3120 from leigh-pointer/TransKeys
Translation for thread #3094
2023-08-08 07:55:35 -04:00
Shaun Walker
ebb0a538f8 Merge pull request #3121 from sbwalker/dev
improve sync service to always rely on server dates
2023-08-08 07:51:26 -04:00
sbwalker
337a566617 improve sync service to always rely on server dates 2023-08-08 07:51:07 -04:00
Leigh Pointer
fecee7a12b Translation for thread #3094
Updated the Missing or incorrect keys
2023-08-08 13:30:10 +02:00
Leigh Pointer
282ec99ce8 Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-08 12:14:18 +02:00
Shaun Walker
17a4985ebe Merge pull request #3119 from sbwalker/dev
fix Section component localization
2023-08-07 17:11:36 -04:00
sbwalker
13b17d91a9 fix Section component localizatioon 2023-08-07 17:11:17 -04:00
Shaun Walker
5782005007 Merge pull request #3118 from sbwalker/dev
improve reload in router to prevent looping
2023-08-07 15:40:00 -04:00
sbwalker
258f2dbe8f improve reload in router to prevent looping 2023-08-07 15:39:44 -04:00
Shaun Walker
e7b35bd0c2 Merge pull request #3117 from sbwalker/dev
fix #3094 - localization of admin module titles
2023-08-07 12:14:11 -04:00
sbwalker
176bd229e6 fix #3094 - localization of admin module titles 2023-08-07 12:13:53 -04:00
Leigh Pointer
c12f1251b0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-07 18:07:11 +02:00
Shaun Walker
0710736661 Merge pull request #3116 from sbwalker/dev
improve code documentation
2023-08-07 10:39:40 -04:00
sbwalker
51ebe520f4 improve code documentation 2023-08-07 10:39:24 -04:00
Shaun Walker
1ef566c824 Merge pull request #3115 from sbwalker/dev
fix issue where user could not be shared across multiple sites
2023-08-07 09:58:41 -04:00
sbwalker
96cf06fe8d fix issue where user could not be shared across multiple sites 2023-08-07 09:58:24 -04:00
Shaun Walker
38ebfdcd0c Merge pull request #3114 from sbwalker/dev
fix #3108 - raise reload event after user logs out
2023-08-07 09:34:37 -04:00
sbwalker
b5649e2a6f fix #3108 - raise reload event after user logs out 2023-08-07 09:34:20 -04:00
Shaun Walker
5fc6dadeae Merge pull request #3113 from sbwalker/dev
prepare for 4.0.2 release
2023-08-06 08:34:05 -04:00
sbwalker
22cfec9276 prepare for 4.0.2 release 2023-08-06 08:33:36 -04:00
Shaun Walker
0a82ec5f0a Update README.md 2023-08-06 08:32:05 -04:00
Shaun Walker
3bdd1f6c4f Merge pull request #3112 from sbwalker/dev
use new GetJsonAsync method in external module template
2023-08-06 08:19:16 -04:00
sbwalker
1e466dc1fe use new GetJsonAsync method in external module template 2023-08-06 08:17:56 -04:00
Shaun Walker
3b302d2f86 Merge pull request #3111 from sbwalker/dev
change Help button style
2023-08-06 07:58:50 -04:00
sbwalker
7f108eebf9 change Help button style 2023-08-06 07:58:27 -04:00
Leigh Pointer
9d41fee2fe Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-06 09:39:41 +02:00
Shaun Walker
bef686f95a Merge pull request #3110 from sbwalker/dev
change defaultvalue parameter to defaultResult to make more intuitive
2023-08-05 16:35:04 -04:00
sbwalker
4bdcb974bd change defaultvalue parameter to defaultResult to make more intuitive 2023-08-05 16:34:41 -04:00
Shaun Walker
af042bd23c Merge pull request #3109 from sbwalker/dev
introduce new GetJsonAsync method with default value parameter
2023-08-05 09:01:03 -04:00
sbwalker
19e3cef7dd introduce new GetJsonAsync method with default value parameter 2023-08-05 09:00:38 -04:00
Shaun Walker
085ab4bfb4 Merge pull request #3107 from sbwalker/dev
add transparency support on image resizing
2023-08-04 16:07:50 -04:00
sbwalker
f7bd03d051 add transparency support on image resizing 2023-08-04 16:07:37 -04:00
Shaun Walker
b48d751717 Merge pull request #3106 from sbwalker/dev
update Module and Theme Install UI to match Marketplace - including logos and support for sorting
2023-08-04 15:17:36 -04:00
sbwalker
92a4a1b210 update Module and Theme Install UI to match Marketplace - including logos and support for sorting 2023-08-04 15:17:17 -04:00
Shaun Walker
6a57fcc04a Merge pull request #3103 from sbwalker/dev
fix GetFolderByPath to support root folder path
2023-08-03 17:29:26 -04:00
sbwalker
749e11762f fix GetFolderByPath to support root folder path 2023-08-03 17:29:02 -04:00
Shaun Walker
61817726c3 Merge pull request #3102 from sbwalker/dev
fix issue where meta name="description" tags were being excluded from output
2023-08-03 16:02:49 -04:00
sbwalker
808354e969 fix issue where meta name="description" tags were being excluded from output 2023-08-03 16:02:34 -04:00
Shaun Walker
d2f594ff4a Merge pull request #3101 from sbwalker/dev
fix #3069 - exclude templates from release packages
2023-08-03 15:27:05 -04:00
sbwalker
fa18467cdd fix #3069 - exclude templates from release packages 2023-08-03 15:26:23 -04:00
Shaun Walker
4c940d02ef Merge pull request #3100 from sbwalker/dev
add error handling and logging to folder creation logic
2023-08-03 14:48:58 -04:00
sbwalker
04202a6b70 Merge branch 'dev' of https://github.com/sbwalker/oqtane.framework into dev 2023-08-03 14:45:39 -04:00
sbwalker
4483901270 fix #3072 - add error handling and logging to folder creation logic 2023-08-03 14:45:27 -04:00
Leigh Pointer
f02d894697 Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-03 20:25:17 +02:00
Shaun Walker
2bc130856a Merge pull request #3047 from leigh-pointer/FixTemplateNULL
Fixes Module Creator problem  #3041
2023-08-03 14:23:55 -04:00
Leigh Pointer
aa3a4dca65 Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-03 18:53:56 +02:00
Shaun Walker
4f65931f51 Merge pull request #3099 from sbwalker/dev
fix #3065 - redirect user if they are logged in and navigating to Login page
2023-08-03 12:47:02 -04:00
sbwalker
93be61e483 fix #3065 - redirect user if they are logged in and navigating to Login page 2023-08-03 12:46:42 -04:00
Shaun Walker
cb7fe364bc Merge pull request #3098 from sbwalker/dev
remove unecessary using statement added by Visual Studio
2023-08-03 11:51:38 -04:00
sbwalker
9cdcb4b22c remove unecessary using statement added by Visual Studio 2023-08-03 11:51:26 -04:00
Shaun Walker
c49072f9b6 Merge pull request #3097 from sbwalker/dev
fix #3082 - handle username claim as "unique_name" with "name" as fallback, improve validation logic and logging
2023-08-03 11:49:24 -04:00
sbwalker
61df26b667 fix #3082 - handle username claim as "unique_name" with "name" as fallback, improve validation logic and logging 2023-08-03 11:48:59 -04:00
Shaun Walker
25c935f1db Merge pull request #3096 from sbwalker/dev
fix #3093 - user email links include extra "://"
2023-08-03 11:11:31 -04:00
sbwalker
6b982bc0c7 fix #3093 - user email links include extra "://" 2023-08-03 11:11:14 -04:00
Shaun Walker
caccc803d3 Merge pull request #3095 from sbwalker/dev
improve appsettings.json in Maui client
2023-08-03 10:15:26 -04:00
sbwalker
5be640632b improve appsettings.json in Maui client 2023-08-03 10:15:12 -04:00
Shaun Walker
40912f0ffd Merge pull request #3092 from sbwalker/dev
fix WebAssembly startup alias handling
2023-08-03 08:25:59 -04:00
sbwalker
d518860a34 fix WebAssembly startup alias handling 2023-08-03 08:25:44 -04:00
Leigh Pointer
185617ed9e Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-03 05:39:32 +02:00
Shaun Walker
5ba96b627e Merge pull request #3090 from sbwalker/dev
support for appsettings.json in Maui app
2023-08-02 17:23:41 -04:00
sbwalker
edf955f4cd support for appsettings.json in Maui app 2023-08-02 17:23:27 -04:00
Shaun Walker
8d0b04668e Merge pull request #3089 from sbwalker/dev
add appicon to Maui client project
2023-08-02 17:11:47 -04:00
sbwalker
a72e5e02da add appicon to Maui client project 2023-08-02 17:11:33 -04:00
Shaun Walker
4740404c2e Merge pull request #3088 from sbwalker/dev
add version to support url
2023-08-02 16:46:11 -04:00
sbwalker
34253916ea add version to support url 2023-08-02 16:45:59 -04:00
Shaun Walker
1d77ba2694 Merge pull request #3055 from leigh-pointer/AutoCompleteRequired
Extended AutoComplete control to allow the Required attribute
2023-08-02 14:53:14 -04:00
Shaun Walker
765041c587 Merge pull request #3058 from vnetonline/fix-file-manager-show-folders
[ENHANCE] - #3057 FileManager when ShowFolders = False however a Folder is set by path
2023-08-02 14:52:04 -04:00
Shaun Walker
8c6bca7666 Merge pull request #3087 from sbwalker/dev
trim dependencies for Themes (related to #3079)
2023-08-02 14:49:06 -04:00
sbwalker
c1b1cef590 trim dependencies for Themes (related to #3079) 2023-08-02 14:48:51 -04:00
Shaun Walker
507f7804c3 Merge pull request #3079 from vnetonline/fix-3078
[FIX] - #3078 - ModuleInfo Dependency needs to be trimmed so there is no white space (credit @maxmontgmx))
2023-08-02 14:45:23 -04:00
Leigh Pointer
453bacf9bd Merge remote-tracking branch 'oqtane/dev' into dev 2023-08-02 20:13:17 +02:00
Shaun Walker
25778458c6 Merge pull request #3086 from sbwalker/dev
Fix #3068 - support microsites in .NET MAUI
2023-08-02 13:55:23 -04:00
sbwalker
7a42646bed Fix #3068 - support microsites in .NET MAUI 2023-08-02 13:55:01 -04:00
Shaun Walker
755b7034d2 Merge pull request #3085 from sbwalker/dev
Fix #3068 - support microsites in .NET MAUI
2023-08-02 13:54:47 -04:00
sbwalker
122fcfd701 Fix #3068 - support microsites in .NET MAUI 2023-08-02 13:53:55 -04:00
vnetonline
2c905eddc2 Merge branch 'fix-file-manager-show-folders' of https://github.com/vnetonline/oqtane.framework into fix-file-manager-show-folders 2023-08-01 21:12:02 +10:00
vnetonline
3e8eb9abb5 [ENHANCE] - #3057 FileManager when ShowFolders = false however a Folder is set by path 2023-08-01 21:11:54 +10:00
vnetonline
d2df3b2d9a ModuleInfo Dependency needs to be trimmed so there is no white space at the end (credit @maxmontgmx)) 2023-08-01 21:02:19 +10:00
Leigh Pointer
2a0c983c2e Handle if Parameter is set dynamically 2023-07-26 11:28:14 +02:00
vnetonline
1319432fde [Fix] - #3057 FileManager when ShowFolders = false however a Folder is set by path 2023-07-24 08:19:06 +10:00
Leigh Pointer
02e2aeb6d1 Extended control to set the Required attribute
The control now allow the required attribute to be set.  This will now give better UX feedback.
2023-07-20 13:56:29 +02:00
Leigh Pointer
5e35edd976 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-20 13:34:27 +02:00
Shaun Walker
4d63c6266c Merge pull request #3053 from sbwalker/dev
disable ServiceBase logic which does not work with legacy ControllerRoutes.Default routes (modules created prior to 2.1)
2023-07-19 20:07:46 -04:00
sbwalker
48f8d41993 disable ServiceBase logic which does not work with legacy ControllerRoutes.Default routes (modules created prior to 2.1) 2023-07-19 20:07:27 -04:00
Leigh Pointer
0b41ccad83 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-19 22:39:24 +02:00
Shaun Walker
f994afbc11 Merge pull request #3051 from sbwalker/dev
fix #3048 - uploading to Packages folder showing unsuccessful message
2023-07-19 16:27:39 -04:00
sbwalker
5dea783677 fix #3048 - uploading to Packages folder showing unsuccessful message 2023-07-19 16:27:26 -04:00
Leigh Pointer
347ef9a1d0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-19 22:16:18 +02:00
Shaun Walker
739aa5311c Merge pull request #3050 from sbwalker/dev
fix #3046 - user folders displayed in folder lists
2023-07-19 16:15:04 -04:00
sbwalker
805018286c fix #3046 - user folders displayed in folder lists 2023-07-19 16:14:48 -04:00
Leigh Pointer
45f2a47ba5 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-19 21:53:10 +02:00
Shaun Walker
fe503b7bee Merge pull request #3049 from sbwalker/dev
FileManager modification to support ShowFolders = False
2023-07-19 15:45:25 -04:00
sbwalker
6736570ee7 FileManager modification to support ShowFolders = False 2023-07-19 15:45:12 -04:00
Leigh Pointer
88c06eea6e Fixes Module Creator problem #3041
This fix is to handle a returned null from the database.  This issue came to light while using Postgresql
2023-07-19 09:58:36 +02:00
Leigh Pointer
13693ef9e5 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-19 09:53:29 +02:00
Shaun Walker
3a54326e73 Update README.md 2023-07-18 12:42:49 -04:00
Shaun Walker
941c1c8a45 Update README.md 2023-07-18 12:35:27 -04:00
Shaun Walker
f56e102f20 Merge pull request #3045 from oqtane/master
Merge pull request #3044 from oqtane/dev
2023-07-18 12:25:59 -04:00
Shaun Walker
010c669ce2 Merge pull request #3044 from oqtane/dev
4.0.1 Release
2023-07-18 12:25:41 -04:00
Leigh Pointer
d328058075 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-18 17:40:29 +02:00
Shaun Walker
9609e7b297 Merge pull request #3042 from leigh-pointer/ControlPanelPadding
Fixed up margins in Control Panel
2023-07-18 11:08:57 -04:00
Leigh Pointer
92718372b8 Fixed up margins in Control Panel
Added top margin to the Module Management
2023-07-18 12:47:48 +02:00
Leigh Pointer
9108eb5616 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-18 12:37:53 +02:00
Shaun Walker
354ad9d0d5 Merge pull request #3040 from sbwalker/dev
use html line breaks in error log notifications
2023-07-17 16:59:54 -04:00
sbwalker
100b92036b use html line breaks in error log notifications 2023-07-17 16:59:40 -04:00
Shaun Walker
e9ed1ecc8c Merge pull request #3039 from sbwalker/dev
prevent client looping if server is down
2023-07-17 11:49:16 -04:00
sbwalker
92595ccc35 prevent client looping if server is down 2023-07-17 11:49:06 -04:00
Leigh Pointer
ea45044dc7 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-17 16:48:24 +02:00
Shaun Walker
1ef28494b3 Merge pull request #3038 from sbwalker/dev
use discretion with LogLevel.Error messages
2023-07-17 09:29:00 -04:00
sbwalker
985d324593 use discretion with LogLevel.Error messages 2023-07-17 09:28:29 -04:00
Shaun Walker
96e7178cd2 Merge pull request #3036 from sbwalker/dev
Added logic to ensure assembly version being installed is equal to or greater than existing assembly
2023-07-17 08:16:16 -04:00
sbwalker
f41e2358a9 Added logic to ensure assembly version being installed is equal to or greater than existing assembly 2023-07-17 08:15:56 -04:00
Shaun Walker
0f146ff355 Merge pull request #3035 from sbwalker/dev
Added a ShowProgress parameter to FileManager (enabled by default). Disabling will display a simple spinner rather than detailed progress information during upload.
2023-07-17 07:43:18 -04:00
sbwalker
465f241e89 Added a ShowProgress parameter to FileManager (enabled by default). Disabling will display a simple spinner rather than detailed progress information during upload. 2023-07-17 07:42:48 -04:00
Shaun Walker
2bdb011240 Merge pull request #3026 from vnetonline/enhance-filemanager
[ENHANCE] - Moved `SetImage()` before the OnSelect fires so that the …
2023-07-17 07:11:41 -04:00
Shaun Walker
dd55725f9b Merge pull request #3034 from vnetonline/fix-publish-module
[FIX] - Page disappears if you unpublish and publish a module
2023-07-17 07:10:55 -04:00
Leigh Pointer
6b16808207 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-17 11:01:10 +02:00
vnetonline
411111fa55 [FIX] - Page disappears if you unpublish and publish a module on the page 2023-07-17 09:33:04 +10:00
vnetonline
5345a12aca [ENHANCE] - Moved SetImage() before the OnSelect fires so that the Parent can retrieve the Image from fileManager rather then calling FileService to retrieve again 2023-07-17 07:58:39 +10:00
Shaun Walker
39adcde16d Merge pull request #3030 from sbwalker/dev
display message if package service does not return package requested
2023-07-15 15:27:01 -04:00
sbwalker
3c37ee60af display message if package service does not return package requested 2023-07-15 15:26:48 -04:00
Shaun Walker
4effc4dd60 Merge pull request #3028 from sbwalker/dev
marketplace changes
2023-07-15 10:01:41 -04:00
sbwalker
fec9fa17e8 marketplace changes 2023-07-15 10:01:27 -04:00
Leigh Pointer
4071b285ce Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-15 12:34:10 +02:00
Shaun Walker
fca306ffa6 Merge pull request #3025 from sbwalker/dev
SupportUrl integration
2023-07-14 15:19:04 -04:00
sbwalker
0e042925f2 SupportUrl integration 2023-07-14 15:18:52 -04:00
Shaun Walker
99421846c7 Merge pull request #3024 from sbwalker/dev
remove OnSelect call from OnParametersSet() which was causing infinite loop
2023-07-14 12:15:34 -04:00
sbwalker
592885ff6c remove OnSelect call from OnParametersSet() which was causing infinite loop 2023-07-14 12:15:16 -04:00
Shaun Walker
a95306c317 Merge pull request #3022 from sbwalker/dev
moved UserManager to Managers namespace
2023-07-13 17:05:21 -04:00
sbwalker
8bdbf7b994 moved UserManager to Managers namespace 2023-07-13 17:05:01 -04:00
Leigh Pointer
7bc80f0814 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-13 17:21:55 +02:00
Shaun Walker
aed65d2594 Merge pull request #3020 from sbwalker/dev
add handling for DisplayName
2023-07-13 11:17:04 -04:00
sbwalker
63b3e4d90d add handling for DisplayName 2023-07-13 11:16:49 -04:00
Shaun Walker
f9c459eab2 Merge pull request #3019 from sbwalker/dev
fix bash script line endings and preserve using gitattributes (credit @rcpacheco in #2958)
2023-07-13 10:19:14 -04:00
sbwalker
a6d83149a4 fix bash script line endings and preserve using gitattributes (credit @rcpacheco in #2958) 2023-07-13 10:18:52 -04:00
Shaun Walker
387b477034 Merge pull request #3018 from sbwalker/dev
allow page themes to be different from site theme - display warning message
2023-07-13 09:09:00 -04:00
sbwalker
68cdcd193c allow page themes to be different from site theme - display warning message 2023-07-13 08:58:43 -04:00
Shaun Walker
08438c7725 Merge pull request #2964 from OpenEugene/release/v4.0.0
Show all themes on page add/edit
2023-07-13 07:52:34 -04:00
Shaun Walker
1894b46d3a Merge pull request #3016 from leigh-pointer/UserSort
User management sort
2023-07-13 07:41:40 -04:00
Shaun Walker
367a825955 Merge pull request #3017 from sbwalker/dev
added logging to ServiceBase to capture HTTP errors
2023-07-13 07:40:55 -04:00
sbwalker
be799eb254 added logging to ServiceBase to capture HTTP errors 2023-07-13 07:39:24 -04:00
Leigh Pointer
4820a27016 User management sort
Added Sorting to User management component.
2023-07-13 12:54:08 +02:00
Leigh Pointer
6b57202421 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-13 11:40:58 +02:00
Shaun Walker
4e82212956 Merge pull request #3015 from sbwalker/dev
fix issue for site folders
2023-07-12 19:49:56 -04:00
sbwalker
6b0f5ed12d fix issue for site folders 2023-07-12 19:49:38 -04:00
Shaun Walker
0a258caf48 Merge pull request #3013 from sbwalker/dev
remove unnecessary using statement
2023-07-12 17:59:34 -04:00
sbwalker
f546a68f7c remove unnecessary using statement 2023-07-12 17:59:21 -04:00
Shaun Walker
1e5bab09db Merge pull request #3012 from sbwalker/dev
migrate remaining methods to UserManager
2023-07-12 17:52:29 -04:00
sbwalker
35fa18a852 migrate remaining methods to UserManager 2023-07-12 17:52:16 -04:00
Shaun Walker
90c1eeb312 Merge pull request #3009 from ajahangard/dev
Using DynamicComponent Instead of RenderFragment in ContainerBuilder
2023-07-12 16:40:09 -04:00
Shaun Walker
404c32b49b Merge pull request #3011 from sbwalker/dev
add a UserManager to simplify user creation, improve response validation in ServiceBase, allow Section component to support parameter changes
2023-07-12 16:37:54 -04:00
sbwalker
c0f4cd2097 add a UserManager to simplify user creation, improve response validation in ServiceBase, allow Section component to support parameter changes 2023-07-12 16:37:18 -04:00
Amir Jahangard
fa98908dea Merge branch 'oqtane:dev' into dev 2023-07-12 12:43:40 +03:30
PALIZ-DEVOPS\ajr
23e8567e86 Using DynamicComponent Instead of RenderFragment in ContainerBuilder 2023-07-12 12:43:00 +03:30
Leigh Pointer
ca3edb6687 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-11 15:22:30 +02:00
Shaun Walker
a02e28f493 Merge pull request #3005 from leigh-pointer/DropIsPublic
The Down path is incorrect
2023-07-11 08:59:39 -04:00
Leigh Pointer
7428f87899 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-11 14:47:53 +02:00
Shaun Walker
d6a7e32ca9 Merge pull request #3006 from sbwalker/dev
support both 404 and 403 status codes in GET API response (404 should not log)
2023-07-11 08:14:52 -04:00
sbwalker
df0f562817 support both 404 andf 403 status codes in API response (404 should not log) 2023-07-11 08:14:00 -04:00
Leigh Pointer
0dea2bc79e The Down path is incorrect
The Down Path drops the wrong column
2023-07-11 08:37:23 +02:00
Leigh Pointer
02481560a9 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-11 08:29:05 +02:00
Shaun Walker
dc1d1015ed Merge pull request #2999 from sbwalker/dev
prepare for 4.0.1 release
2023-07-10 16:51:20 -04:00
sbwalker
59fffbd3ee prepare for 4.0.1 release 2023-07-10 16:51:03 -04:00
Shaun Walker
655cbca574 Merge pull request #2998 from sbwalker/dev
add module name to the Module Settings UI
2023-07-10 16:36:57 -04:00
sbwalker
e22c28a3c9 add module name to the Module Settings UI 2023-07-10 16:36:37 -04:00
Shaun Walker
e823e371f6 Merge pull request #2997 from sbwalker/dev
fix #2976 - add logging methods to ThemeBase
2023-07-10 16:26:49 -04:00
sbwalker
feae7d6269 fix #2976 - add logging methods to ThemeBase 2023-07-10 16:26:30 -04:00
Shaun Walker
e1c0ea0720 Merge pull request #2996 from sbwalker/dev
fix #2977 - margin between edit and cog
2023-07-10 16:20:33 -04:00
sbwalker
4e1a389c8b fix #2977 - margin between edit and cog 2023-07-10 16:20:16 -04:00
Shaun Walker
0362a6a3dc Merge pull request #2995 from sbwalker/dev
fix #2978 - allow host users and admins to have personalized pages
2023-07-10 16:14:14 -04:00
sbwalker
3891dea009 fix #2978 - allow host users and admins to have personalized pages 2023-07-10 16:13:56 -04:00
Leigh Pointer
2d66063763 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-10 21:19:27 +02:00
Shaun Walker
1ccb7e2092 Merge pull request #2994 from sbwalker/dev
prevent logging of error for personalized pages
2023-07-10 14:51:58 -04:00
sbwalker
62ad99d0b6 prevent logging of error for personalized pages 2023-07-10 14:51:32 -04:00
Shaun Walker
66d07fbed3 Merge pull request #2980 from vnetonline/fix-ispersonalised
Fixing personalized page created to be UserName if DisplayName is null
2023-07-10 14:28:55 -04:00
Shaun Walker
ec117adb2d Merge pull request #2993 from sbwalker/dev
make GetHttpClient() public
2023-07-10 14:16:35 -04:00
sbwalker
3aff31b826 make GetHttpClient() public 2023-07-10 14:16:17 -04:00
Shaun Walker
1621944105 Merge pull request #2992 from sbwalker/dev
refactored upload so that it is not dependent on Folder Browse permission
2023-07-10 11:44:28 -04:00
sbwalker
16d0d11e0b refactored upload so that it is not dependent on Folder Browse permission 2023-07-10 11:44:05 -04:00
Leigh Pointer
9158e24295 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-10 17:41:35 +02:00
Shaun Walker
0b81f28e99 Merge pull request #2991 from sbwalker/dev
fix validation issue in FileManager related to Browse permissions
2023-07-10 10:10:16 -04:00
sbwalker
2ccb814223 fix validation issue in FileManager related to Browse permissions 2023-07-10 10:09:57 -04:00
Shaun Walker
f213abd70a Merge pull request #2990 from sbwalker/dev
fix migration error caused by new IsRead field in Notifications. Microsoft.Data.SqlClient.SqlException: 'ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified.'
2023-07-10 08:59:37 -04:00
sbwalker
b87eddeeda fix migration error caused by new IsRead field in Notifications. Microsoft.Data.SqlClient.SqlException: 'ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified.' 2023-07-10 08:59:09 -04:00
Shaun Walker
92fc56e70d Merge pull request #2988 from leigh-pointer/TemplateConfig
Remove Build for Oqtane Server in ConfigManger
2023-07-10 08:45:16 -04:00
Shaun Walker
e22f3238fb Merge pull request #2989 from sbwalker/dev
add API method to get File based on name, and fix permission validation for Folder
2023-07-10 08:44:41 -04:00
sbwalker
c597c4c234 add API method to get File based on name, and fix permission validation for Folder 2023-07-10 08:44:14 -04:00
Leigh Pointer
5973c3d1a0 Remove Build for Oqtane Server in ConfigManger
Remove Build for Oqtane Server in ConfigManger
2023-07-10 14:40:00 +02:00
Leigh Pointer
118e177756 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-10 14:37:16 +02:00
Shaun Walker
d50472cd7b Merge pull request #2984 from leigh-pointer/ConfigExtern
Fix for #2983 Oqtane. Server selected in for build in configmanager
2023-07-10 07:44:46 -04:00
Shaun Walker
11604bbcfd Merge pull request #2985 from vnetonline/fix-modulesettings-resource-type-name
[FIX] - Fixed the ResourceType in Module Settings with correct NameSpace
2023-07-10 07:41:34 -04:00
vnetonline
cf428598d5 [FIX] - Fixed the Resource Type in Module Settings with correct Namespace 2023-07-10 12:52:02 +10:00
Leigh Pointer
a45fc0c4df Fix for #2983 Oqtane. Server selected in for build in configmanager
Removed Oqtane. Server build from configuration manager debug and release
2023-07-09 21:30:45 +02:00
Leigh Pointer
88ac82a013 Merge remote-tracking branch 'oqtane/dev' into dev 2023-07-09 21:12:47 +02:00
Shaun Walker
5abf0df154 Merge pull request #2982 from sbwalker/dev
Package enhancements for Marketplace
2023-07-09 08:36:34 -04:00
sbwalker
9a3b458c45 Package enhancements for Marketplace 2023-07-09 08:36:14 -04:00
Shaun Walker
1b2de37c4e Merge pull request #2975 from vnetonline/enhance-notifications-isread
[ENHANCE] - Added IsRead property to Notifications
2023-07-08 10:07:44 -04:00
vnetonline
f7338bf00e Update GetNotifications (read) to retrieve descending oder by CreatedOn at repository level 2023-07-07 10:21:22 +10:00
vnetonline
bad7be39a6 Fixing personalized page created to be UserName if DisplayName is null 2023-07-07 09:21:49 +10:00
vnetonline
40459defa4 Cosmetic change to more the filter drop down to top of the notifications tab 2023-07-06 15:28:11 +10:00
vnetonline
b7de4b81a6 [ENHANCE] - Added IsRead property to Notifications
Fixed Version to Tenant.04.00.01.01 and reverted the Program.cs back to the way it was

This reverts commit 82fef82c4f.

[ENHANCE] - Added API to get Count of New Notifications based on IsRead

Fixed Typo in Notification Controller

[ENHANCE] - Added API to get Notifications by Count and IsRead
2023-07-06 01:02:05 +10:00
Shaun Walker
563695cdfa Merge pull request #2967 from leigh-pointer/RemoveRazorLangVersion 2023-07-01 16:03:48 -04:00
Leigh Pointer
fd30112ee8 Removed RazorLangVersion tag from Client project files
as to discussion #2965
2023-07-01 14:41:03 +02:00
Mark Davis
a36794b98b Merge pull request #1 from OpenEugene/markdav-is-patch-theme-dropdown
Show all themes when editing
2023-06-30 17:18:30 -07:00
Mark Davis
e52653469d Merge pull request #2 from OpenEugene/markdav-is-patch-add-themes
show all themes when adding
2023-06-30 17:18:14 -07:00
Mark Davis
b61035a3a3 show all themes when adding 2023-06-30 17:12:14 -07:00
Mark Davis
b3039e71be Show all themes when editing 2023-06-30 17:07:46 -07:00
Leigh Pointer
c025013ca8 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-30 22:04:18 +02:00
Shaun Walker
2c614f3bb6 Merge pull request #2961 from leigh-pointer/UnPubPage
Fixes #2960 - cant unpublish page.
2023-06-30 15:43:52 -04:00
Shaun Walker
07a27b25e0 Merge pull request #2959 from leigh-pointer/ModActRoleButt
ModuleActions not displaying the correct mouse pointer
2023-06-30 15:43:34 -04:00
Shaun Walker
4c080572ac Merge pull request #2940 from vnetonline/dev
Added ThemeSettings and ContainerSettings to Default Theme Template
2023-06-30 15:43:22 -04:00
Leigh Pointer
95cd6ea48e Fixes #2960 - cant unpublish page.
Added the reverse code to change a published page to unpublished.
2023-06-30 08:53:09 +02:00
Leigh Pointer
2e3c57226f ModuleActions not displaying the correct mouse pointer
Upated the <ul> tag with a role attribute button.
2023-06-30 08:20:57 +02:00
Leigh Pointer
69f7367a18 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-30 08:17:33 +02:00
vnetonline
8ff7f0bf5e Merge branch 'dev' of https://github.com/vnetonline/oqtane.framework into dev 2023-06-30 08:04:26 +10:00
vnetonline
e2a9470f31 Adding Solution file back to Default Theme Template
Added ThemeSettings and ContainerSettings to Default Theme Template

Added ThemeSettings and ContainerSettings to Default Theme Template to Demonstrate how these features could be added to developers designing a theme as requested and discussed in Issue #2633

Includeda few setting options as per suggestion by @sbwalker  intended to provide a simple demonstration of how to use Theme and Container settings
2023-06-30 08:04:13 +10:00
vnetonline
a2a64e73bc Merge branch 'oqtane:dev' into dev 2023-06-30 07:41:49 +10:00
Shaun Walker
15305e3a0b Merge pull request #2956 from leigh-pointer/RoleDates
Closes #2955 User Roles Effective and Expiry date Rendering as Text
2023-06-29 14:42:17 -04:00
Leigh Pointer
bcb484ba62 Closes #2955 User Roles Effective and Expiry date Rendering as Text
Updated the User Roles to use Date control and fixed the code to accept DateTime values
2023-06-29 19:17:38 +02:00
Leigh Pointer
278fd8023b Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-29 18:37:15 +02:00
Shaun Walker
ba7efb45e7 Merge pull request #2954 from sbwalker/dev
handle paths during Folder add/update
2023-06-29 12:24:37 -04:00
sbwalker
8d3d218067 handle paths during Folder add/update 2023-06-29 12:24:20 -04:00
Shaun Walker
5185934f25 Merge pull request #2953 from sbwalker/dev
fix progress bar styling in FileManager
2023-06-29 11:54:20 -04:00
sbwalker
0a9cbfd0e5 fix progress bar styling in FileManager 2023-06-29 11:54:05 -04:00
Shaun Walker
35e237b5b3 Merge pull request #2952 from sbwalker/dev
allow FileManager to support changes in parameters
2023-06-29 11:21:02 -04:00
sbwalker
ba18cd505b allow FileManager to support changes in parameters 2023-06-29 11:20:45 -04:00
vnetonline
662df53a10 Fixed Indenting in ThemeSettings.cs 2023-06-29 13:22:51 +10:00
vnetonline
eadf2e89a8 Fix HasChildren property not considering if page is not in navigation (i.e. hidden) 2023-06-29 11:56:19 +10:00
vnetonline
a3b54b9891 Merge branch 'oqtane:dev' into dev 2023-06-29 11:05:12 +10:00
Shaun Walker
18cab2c759 Merge pull request #2950 from sbwalker/dev
allow admin to navigate to site settings for deleted site
2023-06-28 13:11:29 -04:00
sbwalker
8edc4fd67a allow admin to navigate to site settings for deleted site 2023-06-28 13:11:15 -04:00
Shaun Walker
b914163499 Merge pull request #2949 from sbwalker/dev
fix #2941 - HasChildren property not considering deleted pages
2023-06-28 13:05:46 -04:00
sbwalker
c55c8bff6e fix #2941 - HasChildren property not considering deleted pages 2023-06-28 13:05:34 -04:00
Shaun Walker
e669bb1f82 Merge pull request #2948 from sbwalker/dev
fix #2942 - reverse ordering of page name and site name for page title
2023-06-28 12:51:11 -04:00
sbwalker
452c3fd355 fix #2942 - reverse ordering of page name and site name for page title 2023-06-28 12:50:58 -04:00
Shaun Walker
60be0c92da Merge pull request #2947 from sbwalker/dev
improve helptext for Aliases
2023-06-28 12:44:16 -04:00
sbwalker
03bd88a2d5 improve helptext for Aliases 2023-06-28 12:44:00 -04:00
Shaun Walker
7f355698bc Merge pull request #2946 from sbwalker/dev
use case insensitive comparison for activetab name
2023-06-28 12:27:34 -04:00
sbwalker
22ec675cec use case insensitive comparison for activetab name 2023-06-28 12:27:21 -04:00
Shaun Walker
3954c482ce Merge pull request #2945 from sbwalker/dev
set Expanded to lowercase if specified
2023-06-28 12:25:13 -04:00
sbwalker
d06feec37b set Expanded to lowercase if specified 2023-06-28 12:24:59 -04:00
Shaun Walker
536af96ccc Merge pull request #2944 from sbwalker/dev
fix #2938 - path not updated correctly when parent page changed
2023-06-28 12:17:42 -04:00
sbwalker
e1a8d3db54 fix #2938 - path not updated correctly when parent page changed 2023-06-28 12:17:27 -04:00
vnetonline
83d51a85ce Adding Solution file back to Default Theme Template 2023-06-28 22:32:42 +10:00
vnetonline
4400744f35 Added ThemeSettings and ContainerSettings to Default Theme Template
Added ThemeSettings and ContainerSettings to Default Theme Template to Demonstrate how these features could be added to developers designing a theme as requested and discussed in Issue #2633
2023-06-28 22:25:07 +10:00
Shaun Walker
ea4b85ad54 Merge pull request #2939 from sbwalker/dev
filter deleted sites in notification job
2023-06-27 11:42:36 -04:00
sbwalker
60b6a9ce47 filter deleted sites in notification job 2023-06-27 11:42:15 -04:00
Leigh Pointer
927e00bd66 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-27 09:31:07 +02:00
Shaun Walker
cd8d2dd8f3 Update README.md 2023-06-26 14:36:53 -04:00
Leigh Pointer
6861965779 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-26 20:14:07 +02:00
Shaun Walker
8a9a1d7df7 Merge pull request #2937 from sbwalker/dev
cosmetic fix for input elements within a table intoduced with Bootstrap 5.3
2023-06-26 14:00:03 -04:00
sbwalker
e7e66699b1 cosmetic fix for input elements within a table intoduced with Bootstrap 5.3 2023-06-26 13:59:44 -04:00
Shaun Walker
681321feeb Merge pull request #2936 from oqtane/master
Merge pull request #2935 from oqtane/dev
2023-06-26 11:31:16 -04:00
Shaun Walker
a637b6d4d0 Merge pull request #2935 from oqtane/dev
4.0.0 Release
2023-06-26 11:30:59 -04:00
Leigh Pointer
97026746f8 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-26 14:57:48 +02:00
Shaun Walker
5161ade786 Merge pull request #2932 from sbwalker/dev
added deprecation message for IHostResources
2023-06-26 08:12:01 -04:00
sbwalker
6dd62a164e added deprecation message for IHostResources 2023-06-26 08:11:46 -04:00
Shaun Walker
3bece7599c Merge pull request #2931 from sbwalker/dev
fix validation message behavior in installer
2023-06-25 09:10:07 -04:00
sbwalker
b2f3a53980 fix validation message behavior in installer 2023-06-25 09:09:53 -04:00
Shaun Walker
cea31a8573 Merge pull request #2930 from sbwalker/dev
remove A/B testing logic for stylesheets - discard root component approach in favor of legacy JS Interop approach to eliminate FOUC issues
2023-06-25 08:39:41 -04:00
sbwalker
ce6647a84a remove A/B testing logic for stylesheets - discard root component approach in favor of legacy JS Interop approach to eliminate FOUC issues 2023-06-25 08:39:12 -04:00
Shaun Walker
d54ba9a5c6 Merge pull request #2929 from sbwalker/dev
added logging to HostedServiceBase
2023-06-23 15:19:33 -04:00
sbwalker
1e18d913e0 added logging to HostedServiceBase 2023-06-23 15:19:18 -04:00
Leigh Pointer
ef8c47a49f Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-23 14:32:00 +02:00
Shaun Walker
0041c7d3b3 Merge pull request #2928 from sbwalker/dev
allow for testing CSS page transitions
2023-06-23 08:16:56 -04:00
sbwalker
f6cca5cb35 allow for testing CSS page transitions 2023-06-23 08:16:39 -04:00
Shaun Walker
fa5abbf96f Merge pull request #2927 from sbwalker/dev
fix ordering of stylesheets
2023-06-23 08:07:22 -04:00
sbwalker
2ff365765d fix ordering of stylesheets 2023-06-23 08:07:06 -04:00
Shaun Walker
ee31e4a411 Merge pull request #2926 from sbwalker/dev
clarify documentation and parameter names
2023-06-23 07:44:31 -04:00
sbwalker
ee4068d671 clarify documentation and parameter names 2023-06-23 07:44:15 -04:00
Shaun Walker
5e86c95db6 Merge pull request #2925 from sbwalker/dev
add validation logic to ensure page theme martches site theme
2023-06-23 07:38:52 -04:00
sbwalker
6126624631 add validation logic to ensure page theme martches site theme 2023-06-23 07:38:33 -04:00
Leigh Pointer
a320e4d48d Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-22 21:59:51 +02:00
Shaun Walker
a7c5841e76 Merge pull request #2924 from sbwalker/dev
external template changes to support non-Windows environments
2023-06-22 15:24:43 -04:00
sbwalker
0f242a94b4 external template changes to support non-Windows environments 2023-06-22 15:24:27 -04:00
Shaun Walker
8f8a0897e4 Add files via upload 2023-06-22 15:23:10 -04:00
Shaun Walker
7c6b64123c Add files via upload 2023-06-22 15:22:10 -04:00
Shaun Walker
55642093ed Merge pull request #2923 from sbwalker/dev
allow CSS testing using old and new method
2023-06-22 14:05:25 -04:00
sbwalker
5660f40512 allow CSS testing using old and new method 2023-06-22 14:05:08 -04:00
Leigh Pointer
3259b7183b Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-22 17:43:30 +02:00
Shaun Walker
df7cd648ac Merge pull request #2921 from sbwalker/dev
restrict to a single theme per site
2023-06-22 11:32:21 -04:00
sbwalker
2a5713ed67 restrict to a single theme per site 2023-06-22 11:32:03 -04:00
Leigh Pointer
b7c36c07c6 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-22 06:03:04 +02:00
Shaun Walker
de93281f3e Merge pull request #2920 from sbwalker/dev
cleanup and ensure site level scripts work properly
2023-06-21 15:49:13 -04:00
sbwalker
86fbdced1b cleanup and ensure site level scripts work properly 2023-06-21 15:49:00 -04:00
Shaun Walker
43bcfb9a4e Merge pull request #2910 from vnetonline/dev
[ENHANCE] - Added Module to NameSpace [Owner].Module.[Module]
2023-06-21 09:57:36 -04:00
Shaun Walker
0daf6af3b8 Merge pull request #2918 from sbwalker/dev
fix #2387 - improve container selection in Edit Page
2023-06-21 09:20:23 -04:00
sbwalker
c3bccbade8 fix #2387 - improve container selection in Edit Page 2023-06-21 09:20:05 -04:00
Leigh Pointer
3261628da4 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-21 14:59:49 +02:00
Shaun Walker
1e39f48235 Merge pull request #2917 from sbwalker/dev
fix null handling in stylesheet logic
2023-06-21 08:47:39 -04:00
sbwalker
05b5d9da9b fix null handling in stylesheet logic 2023-06-21 08:47:25 -04:00
Leigh Pointer
3491dde94a Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-21 14:46:44 +02:00
Shaun Walker
db2aa920e2 Merge pull request #2916 from sbwalker/dev
fix #2912 - move JavaScript handling from ThemeBuilder to component OnAfterRenderAsync
2023-06-21 08:32:11 -04:00
sbwalker
8067b2e634 fix #2912 - move JavaScript handling from ThemeBuilder to component OnAfterRenderAsync 2023-06-21 08:31:51 -04:00
vnetonline
273c6d7dee Merge branch 'oqtane:dev' into dev 2023-06-21 10:21:30 +10:00
Leigh Pointer
4d0149a4a0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-20 14:53:57 +02:00
Shaun Walker
d9f3db5bf3 Merge pull request #2914 from sbwalker/dev
integrate old logic for managing stylesheets using JS Interop
2023-06-20 08:52:18 -04:00
sbwalker
c8a679ecce integrate old logic for managing stylesheets using JS Interop 2023-06-20 08:52:02 -04:00
vnetonline
3abe47ae9e [ENHANCE] - Added Module to NameSpace [Owner].Module.[Module]
[ENHANCE] - Added Module to NameSpace [Owner].Module.[Module]
2023-06-20 16:58:30 +10:00
Leigh Pointer
725a8dc237 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-20 07:50:00 +02:00
Shaun Walker
fcb05a7834 Merge pull request #2908 from sbwalker/dev
fix parent page selection in add page and fix navigation on save/cancel
2023-06-19 16:22:57 -04:00
sbwalker
02e22df4d5 fix parent page selection in add page and fix navigation on save/cancel 2023-06-19 16:22:49 -04:00
Leigh Pointer
694c0af146 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-19 21:52:12 +02:00
Shaun Walker
8bfca2f10a Merge pull request #2905 from sbwalker/dev
more optimizations of Head component
2023-06-19 15:11:07 -04:00
sbwalker
6bea9a087c more optimizations of Head component 2023-06-19 15:10:58 -04:00
Shaun Walker
3f4218f75f Merge pull request #2904 from sbwalker/dev
fix #2900 - theme deletion and fallback
2023-06-19 12:29:51 -04:00
sbwalker
3849f59126 fix #2900 - theme deletion and fallback 2023-06-19 12:29:43 -04:00
Leigh Pointer
239b12cbb0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-19 17:03:37 +02:00
Shaun Walker
8ccee87378 Merge pull request #2898 from vnetonline/dev
[ENHANCE] - Added Theme to Name Space [Owner].Theme.[Theme]
2023-06-19 10:25:01 -04:00
Shaun Walker
9e518ffc4c Merge pull request #2903 from sbwalker/dev
add defensive logic
2023-06-19 10:11:32 -04:00
sbwalker
e3233fd19f add defensive logic 2023-06-19 10:11:24 -04:00
Shaun Walker
d3af9b0f14 Merge pull request #2902 from sbwalker/dev
optimize head component rendering
2023-06-19 09:01:53 -04:00
sbwalker
08daca848b optimize head component rendering 2023-06-19 09:01:40 -04:00
Leigh Pointer
c5da8e3b10 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-19 10:32:47 +02:00
vnetonline
3b0ffde1fb [ENHANCE] - Added Theme to Name Space [Owner].Theme.[Theme]
changes all template files to conform to  [Owner].Theme.[Theme]
2023-06-16 14:52:13 +10:00
Shaun Walker
6ca97e8d5d Merge pull request #2897 from sbwalker/dev
allow selection of site template during installation
2023-06-15 19:10:52 -04:00
sbwalker
34a727b435 allow selection of site template during installation 2023-06-15 19:10:37 -04:00
Leigh Pointer
6a9c865fec Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-14 15:52:56 +02:00
Shaun Walker
b1b9100600 Merge pull request #2896 from sbwalker/dev
create AppendHeadContent method to consolidate logic
2023-06-14 09:37:48 -04:00
sbwalker
bda0943d58 create AppendHeadContent method to consolidate logic 2023-06-14 09:37:34 -04:00
Leigh Pointer
ad6db71f7e Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-14 15:11:40 +02:00
Shaun Walker
b21d202c7f Merge pull request #2895 from vnetonline/dev 2023-06-14 07:32:11 -04:00
vnetonline
3ea8ea1e3b Fixing the Library needed for declaring new way of theme resources 2023-06-14 19:13:04 +10:00
vnetonline
ee897a9973 Fixed targeting .NET 7.0 in ThemeController and ModuleDefinitionController missed in #2888 and #2890 2023-06-14 16:51:23 +10:00
Leigh Pointer
bb9ea3f60f Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-14 06:35:28 +02:00
Shaun Walker
5f8cfb9977 Merge pull request #2893 from sbwalker/dev
update Installer to use new method for including CSS
2023-06-13 17:26:23 -04:00
sbwalker
d7928a70bf update Installer to use new method for including CSS 2023-06-13 17:26:07 -04:00
Shaun Walker
93568af5a9 Merge pull request #2892 from sbwalker/dev
upgrade external theme template to Bootstrap 5.3
2023-06-13 17:14:13 -04:00
sbwalker
9e86d97253 upgrade external theme template to Bootstrap 5.3 2023-06-13 17:13:59 -04:00
Shaun Walker
84bac0c462 Merge pull request #2891 from sbwalker/dev
upgrade to Bootstrap 5.3
2023-06-13 17:10:03 -04:00
sbwalker
3c18a258ff upgrade to Bootstrap 5.3 2023-06-13 17:09:49 -04:00
Shaun Walker
9759c68d58 Merge pull request #2890 from sbwalker/dev
upgrade external theme template to .NET 7
2023-06-13 14:16:58 -04:00
sbwalker
f57a190405 upgrade external theme template to .NET 7 2023-06-13 14:16:43 -04:00
Shaun Walker
d2eb203aa1 Merge pull request #2889 from sbwalker/dev
fix regression issue from #2852
2023-06-13 14:00:24 -04:00
sbwalker
dd2c2dbe61 fix regression issue from #2852 2023-06-13 14:00:09 -04:00
Shaun Walker
2529592b66 Merge pull request #2888 from sbwalker/dev
upgraded external module template to .NET 7
2023-06-13 13:10:41 -04:00
sbwalker
f248d2fe4e upgraded external module template to .NET 7 2023-06-13 13:10:20 -04:00
Shaun Walker
875bcd8ce2 Merge pull request #2885 from sbwalker/dev
handle type for favicon and improve helptext
2023-06-12 12:31:09 -04:00
sbwalker
726f9375e1 handle type for favicon and improve helptext 2023-06-12 12:30:56 -04:00
Shaun Walker
0c2e200245 Merge pull request #2884 from sbwalker/dev
allow PNG and GIF for favicon specification
2023-06-12 12:00:42 -04:00
sbwalker
a10db462eb allow PNG and GIF for favicon specification 2023-06-12 12:00:25 -04:00
Shaun Walker
6df28d8171 Merge pull request #2883 from vnetonline/dev
Made the default SQL Server and App Service provisioned Basic Tier
2023-06-12 09:56:34 -04:00
vnetonline
8367f15638 Made the default SQL Server and App Service provisioned Basic Tier 2023-06-12 23:51:36 +10:00
Shaun Walker
69456d3569 Merge pull request #2881 from sbwalker/dev
move logic for populating theme control names
2023-06-10 13:35:44 -04:00
sbwalker
3b644338bc move logic for populating theme control names 2023-06-10 13:35:22 -04:00
Shaun Walker
02e29aa22f Merge pull request #2880 from sbwalker/dev
fix for child pages in templates
2023-06-10 10:10:59 -04:00
sbwalker
88c489a585 fix for child pages in templates 2023-06-10 10:10:34 -04:00
Shaun Walker
706e73210d Merge pull request #2879 from sbwalker/dev
fix page template logic on install
2023-06-10 09:18:13 -04:00
sbwalker
d52809c914 fix page template logic on install 2023-06-10 09:17:52 -04:00
Shaun Walker
6058286577 Update README.md 2023-06-09 12:37:28 -04:00
Shaun Walker
a271f24157 Merge pull request #2878 from sbwalker/dev
change project tagline
2023-06-09 12:36:27 -04:00
sbwalker
2299375aaa change project tagline 2023-06-09 12:36:15 -04:00
Shaun Walker
c3290526a4 Merge pull request #2877 from sbwalker/dev
improvements to page template processing in cases where a page parent and name is specified without a path
2023-06-09 12:33:27 -04:00
sbwalker
a9d871e9af improvements to page template processing in cases where a page parent and name is specified without a path 2023-06-09 12:33:07 -04:00
Shaun Walker
5eb25796ca Merge pull request #2876 from sbwalker/dev
order theme controls and container comtrols in alphabetical order based on name
2023-06-09 08:50:03 -04:00
sbwalker
5d650bd276 order theme controls and container comtrols in alphabetical order based on name 2023-06-09 08:49:41 -04:00
Shaun Walker
b6be519537 Merge pull request #2875 from sbwalker/dev
add ScrollToPageTop method to ThemeBase
2023-06-08 08:39:33 -04:00
sbwalker
160477d612 add ScrollToPageTop method to ThemeBase 2023-06-08 08:39:20 -04:00
Leigh Pointer
4a89403c37 Merge remote-tracking branch 'origin/dev' into dev 2023-06-08 08:32:54 +02:00
Leigh Pointer
e54cfa629e Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-08 08:32:33 +02:00
Shaun Walker
b2bc09be16 Merge pull request #2873 from sbwalker/dev
fix to allow Theme Settings to be supported in Page Management
2023-06-07 10:50:39 -04:00
sbwalker
2f5d1cebb0 fix to allow Theme Settings to be supported in Page Management 2023-06-07 10:50:25 -04:00
Shaun Walker
e4d144651e Merge pull request #2872 from sbwalker/dev
fixed page setting cleanup on delete and centralized module delete logic within PageModuleRepository
2023-06-06 09:11:28 -04:00
sbwalker
ce56dfc239 fixed page setting cleanup on delete and centralized module delete logic within PageModuleRepository 2023-06-06 09:11:08 -04:00
Shaun Walker
ad4f8fd7a0 Merge pull request #2871 from leigh-pointer/ExtModDescription
Fix for External Module Description not updated
2023-06-06 08:20:48 -04:00
Leigh Pointer
c4070cb603 External Module Description not updated
Fix for External Module Description not updated #2870
2023-06-06 12:26:39 +02:00
Leigh Pointer
75c9322f75 Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-06 07:28:06 +02:00
Shaun Walker
602fd7d658 Merge pull request #2869 from sbwalker/dev
fix JavaScript injection issue on first render for Resources defined in IModule and ITheme
2023-06-05 22:00:27 -04:00
sbwalker
818fd2fb43 fix JavaScript injection issue on first render for Resources defined in IModule and ITheme 2023-06-05 22:00:02 -04:00
Shaun Walker
e4912fcb09 Merge pull request #2868 from sbwalker/dev
Head root component integration in .NET MAUI
2023-06-05 14:51:06 -04:00
sbwalker
3692ec49c1 Head root component integration in .NET MAUI 2023-06-05 14:50:54 -04:00
Shaun Walker
9a1ea3f375 Merge pull request #2867 from sbwalker/dev
ability for non-administrators to edit page settings
2023-06-05 14:33:17 -04:00
sbwalker
10a754642a ability for non-administrators to edit page settings 2023-06-05 14:33:05 -04:00
Shaun Walker
bc9de5d094 Merge pull request #2865 from sbwalker/dev
use ReturnUrl for Page Management invoked by Control Panel
2023-06-05 09:42:54 -04:00
sbwalker
9f93476167 use ReturnUrl for Page Management invoked by Control Panel 2023-06-05 09:42:33 -04:00
Shaun Walker
f61492d353 Merge pull request #2864 from sbwalker/dev
fix personalization redirect
2023-06-05 09:30:29 -04:00
sbwalker
50cf67546b fix personalization redirect 2023-06-05 09:30:17 -04:00
Shaun Walker
41d83ec421 Merge pull request #2863 from sbwalker/dev
improvements for personalized pages
2023-06-05 08:22:47 -04:00
sbwalker
cc9377b37d improvements for personalized pages 2023-06-05 08:22:29 -04:00
Shaun Walker
7f986d5f60 Merge pull request #2862 from sbwalker/dev
fix page add/edit path
2023-06-02 15:24:31 -04:00
sbwalker
d272bf8a29 fix page add/edit path 2023-06-02 15:24:14 -04:00
Shaun Walker
ba5260f5b1 Merge pull request #2861 from sbwalker/dev
include methods for dynamic scenarios
2023-06-02 08:34:23 -04:00
sbwalker
40c788fc33 include methods for dynamic scenarios 2023-06-02 08:34:05 -04:00
Leigh Pointer
7eca15d50f Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-02 10:42:16 +02:00
Shaun Walker
8f147e7de2 Merge pull request #2859 from sbwalker/dev
make page path and moduile title lookups case insensitive
2023-06-01 14:41:32 -04:00
sbwalker
85358c7dd4 make page path and moduile title lookups case insensitive 2023-06-01 14:40:59 -04:00
Shaun Walker
87c7eafb87 Merge pull request #2858 from sbwalker/dev
use constant rather than magic string
2023-06-01 12:41:14 -04:00
sbwalker
613f4848da use constant rather than magic string 2023-06-01 12:41:03 -04:00
Shaun Walker
3cb06e4819 Update README.md 2023-06-01 12:22:42 -04:00
Shaun Walker
811701ef7f Merge pull request #2856 from sbwalker/dev
fix log message spelling
2023-06-01 12:16:53 -04:00
sbwalker
c14dc67d8a fix log message spelling 2023-06-01 12:16:41 -04:00
Shaun Walker
867767f009 Merge pull request #2855 from sbwalker/dev
ensure PageModule Order is updated
2023-06-01 11:29:43 -04:00
sbwalker
640216d076 ensure PageModule Order is updated 2023-06-01 11:29:31 -04:00
Leigh Pointer
3a1f378e2d Merge remote-tracking branch 'oqtane/dev' into dev 2023-06-01 16:58:00 +02:00
Shaun Walker
6b7c61f228 Merge pull request #2853 from sbwalker/dev
make AliasName explicit
2023-06-01 10:37:53 -04:00
sbwalker
28ba2c00fc make AliasName explicit 2023-06-01 10:37:39 -04:00
Shaun Walker
b56daae321 Merge pull request #2852 from sbwalker/dev
optimize pane rendering, preserve querystring parameters in edit mode , relocate anchor tags to ensure they are always injected, add ability to determine if navigation is internal
2023-06-01 08:44:30 -04:00
sbwalker
b57450398c optimize pane rendering, preserve querystring parameters in edit mode, relocate anchor tags to ensure they are always injected, add ability to determine if navigation is internal 2023-06-01 08:44:07 -04:00
Leigh Pointer
0c25cf0ec5 Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-31 15:42:33 +02:00
Shaun Walker
c3d884e895 Merge pull request #2851 from sbwalker/dev
added IEventSubscriber amd EventDistributorHostedService to optimize event processing
2023-05-31 09:36:56 -04:00
sbwalker
7a21f96552 added IEventSubscriber amd EventDistributorHostedService to optimize event processing 2023-05-31 09:36:32 -04:00
Leigh Pointer
55cfbb721b Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-31 08:25:26 +02:00
Shaun Walker
4ccb4c636f Merge pull request #2849 from sbwalker/dev
ability to specify PageTemplates for modules
2023-05-30 15:52:42 -04:00
sbwalker
0d5c3a3a0c ability to specify PageTemplates for modules 2023-05-30 15:52:27 -04:00
Leigh Pointer
6bc1507114 Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-26 16:32:21 +02:00
Shaun Walker
b093cbff15 Merge pull request #2847 from sbwalker/dev
ensure consistent admin dashboard styling
2023-05-26 08:54:58 -04:00
sbwalker
30cb8ec9c3 ensure consistent admin dashboard styling 2023-05-26 08:54:47 -04:00
Shaun Walker
d5e51d6c38 Merge pull request #2846 from sbwalker/dev
clarify scroll method name
2023-05-26 07:41:59 -04:00
sbwalker
6f0a6c7f69 clarify scroll method name 2023-05-26 07:41:49 -04:00
Shaun Walker
549d71073e Merge pull request #2845 from sbwalker/dev
add module base class method for ScrollToTop
2023-05-26 07:39:22 -04:00
sbwalker
4ad5522f9e add module base class method for ScrollToTop 2023-05-26 07:39:06 -04:00
Shaun Walker
2145c1a48c Merge pull request #2844 from sbwalker/dev
utilize new Resources capability in default module/theme
2023-05-25 17:14:14 -04:00
sbwalker
0f093b1238 utilize new Resources capability in default module/theme 2023-05-25 17:14:00 -04:00
Shaun Walker
1aa3fd7056 Merge pull request #2843 from sbwalker/dev
added validation support for user profile fields
2023-05-25 16:16:28 -04:00
sbwalker
cc4c47c3ee added validation support for user profile fields 2023-05-25 16:16:16 -04:00
Shaun Walker
6e3f3fac9d Merge pull request #2842 from sbwalker/dev
added ability to disable SMTP and set IsBodyHtml by default
2023-05-25 15:19:20 -04:00
sbwalker
261adefbc7 added ability to disable SMTP and set IsBodyHtml by default 2023-05-25 15:19:05 -04:00
Shaun Walker
7eafcfd7ad Merge pull request #2841 from sbwalker/dev
add support for Job and Theme settings in API
2023-05-25 15:00:44 -04:00
sbwalker
6183d6a22e add support for Job and Theme settings in API 2023-05-25 15:00:30 -04:00
Shaun Walker
51d42692ba Merge pull request #2840 from sbwalker/dev
fix site provisioning issue for host module definitions
2023-05-25 14:56:04 -04:00
sbwalker
18a9c059f4 fix site provisioning issue for host module definitions 2023-05-25 14:55:46 -04:00
Shaun Walker
50a13ffd6d Update README.md 2023-05-25 13:02:03 -04:00
Shaun Walker
b360944742 Merge pull request #2839 from sbwalker/dev
add ability to modify Theme Name
2023-05-25 12:57:02 -04:00
sbwalker
59d1a47846 add ability to modify Theme Name 2023-05-25 12:56:49 -04:00
Shaun Walker
22969d8daa Merge pull request #2838 from sbwalker/dev
optimize client assembly download service, add support for site level scripts
2023-05-25 12:32:39 -04:00
sbwalker
95ba87945b optimize client assembly download service, add support for site level scripts 2023-05-25 12:32:21 -04:00
Leigh Pointer
63aeee8b22 Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-25 13:14:52 +02:00
Shaun Walker
da11a86f99 Merge pull request #2837 from sbwalker/dev
ability to specify if a theme is enabled for a site
2023-05-24 13:09:28 -04:00
sbwalker
98c2f012ee ability to specify if a theme is enabled for a site 2023-05-24 13:09:10 -04:00
Shaun Walker
386c6144f8 Merge pull request #2835 from sbwalker/dev
use SiteKey as a cache key for multi-tenancy
2023-05-24 10:29:57 -04:00
sbwalker
666f9c2db9 use SiteKey as a cache key for multi-tenancy 2023-05-24 10:29:45 -04:00
Shaun Walker
f7c49588fb Merge pull request #2834 from sbwalker/dev
ability to specify if a module definition is enabled for a site
2023-05-24 09:40:20 -04:00
sbwalker
c0e6f06a5c ability to specify if a module definition is enabled for a site 2023-05-24 09:40:05 -04:00
Leigh Pointer
6668c8ff66 Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-23 17:19:25 +02:00
Shaun Walker
31907f2d16 Merge pull request #2833 from sbwalker/dev
add null check
2023-05-23 11:16:21 -04:00
sbwalker
452d0af8c9 add null check 2023-05-23 11:16:07 -04:00
Leigh Pointer
c5a28f3601 Merge remote-tracking branch 'origin/dev' into dev 2023-05-23 15:55:00 +02:00
Shaun Walker
d13f26dc7e Merge pull request #2832 from sbwalker/dev
format head content, remove scripts, and filter duplicate elements
2023-05-23 09:12:21 -04:00
sbwalker
03374483e4 format head content, remove scripts, and filter duplicate elements 2023-05-23 09:12:03 -04:00
Shaun Walker
b1c0a865a0 Merge pull request #2831 from sbwalker/dev
utilize ResourceLocation consistently
2023-05-23 08:08:31 -04:00
sbwalker
7b0799a6f6 utilize ResourceLocation consistently 2023-05-23 08:08:16 -04:00
Shaun Walker
0de2976933 Merge pull request #2830 from sbwalker/dev
add support for body content
2023-05-22 15:02:49 -04:00
sbwalker
20c7bf3c48 add support for body content 2023-05-22 15:02:36 -04:00
Shaun Walker
55e090ba2a Merge pull request #2829 from sbwalker/dev
changes to support page level scripts, ability to detect prerendering
2023-05-22 13:57:06 -04:00
sbwalker
ded326c822 changes to support page level scripts, ability to detect prerendering 2023-05-22 13:56:48 -04:00
Shaun Walker
1ee9c2cf0e Merge pull request #2828 from sbwalker/dev
ability to specify Resources in IModule and ITheme interfaces,, fixed module settings error for personalized pages
2023-05-19 18:08:40 -04:00
sbwalker
e41d9008b3 ability to specify Resources in IModule and ITheme interfaces,, fixed module settings for personalized pages 2023-05-19 18:08:15 -04:00
Shaun Walker
1ec24251a2 Merge pull request #2827 from sbwalker/dev
remove unused local reference to ThemeType
2023-05-19 11:59:06 -04:00
sbwalker
2be48c3847 remove unused local reference to ThemeType 2023-05-19 11:58:52 -04:00
Shaun Walker
2137b79f6d Merge pull request #2824 from sbwalker/dev
optimize JavaScript handling
2023-05-18 14:36:19 -04:00
sbwalker
0b8086bd36 optimize JavaScript handling 2023-05-18 14:36:06 -04:00
Shaun Walker
d16659890c Merge pull request #2823 from sbwalker/dev
add support for type attribute in JSInterop IncludeScript
2023-05-18 09:36:23 -04:00
sbwalker
076d150f72 add support for type attribute in JSInterop IncludeScript 2023-05-18 09:36:09 -04:00
Shaun Walker
62deffd017 Merge pull request #2822 from sbwalker/dev
move PWA elements back to _Host
2023-05-18 08:37:36 -04:00
sbwalker
f1ec70ff14 move PWA elements back to _Host 2023-05-18 08:37:21 -04:00
Shaun Walker
af27c763e0 Merge pull request #2821 from sbwalker/dev
handle id attribute automatically for headcontent inline scripts
2023-05-18 08:27:07 -04:00
sbwalker
7336417634 handle id attribute automatically for headcontent inline scripts 2023-05-18 08:26:51 -04:00
Shaun Walker
cde46c0889 Merge pull request #2820 from sbwalker/dev
allow HeadContent to support script tags
2023-05-17 17:13:25 -04:00
sbwalker
5da4dadc31 allow HeadContent to support script tags 2023-05-17 17:13:08 -04:00
Shaun Walker
e32ca089ec Merge pull request #2817 from sbwalker/dev
added HeadContent property to Site and replaced Meta property on Page with HeadContent property.
2023-05-16 16:23:34 -04:00
sbwalker
8d2f644177 added HeadContent property to Site and replaced Meta property on Page with HeadContent property. 2023-05-16 16:23:07 -04:00
Shaun Walker
a003010be5 Merge pull request #2815 from sbwalker/dev
migrate CSS references and remove JS Interop methods
2023-05-16 09:09:32 -04:00
sbwalker
89ada83012 migrate CSS references and remove JS Interop methods 2023-05-16 09:09:18 -04:00
Shaun Walker
65fbf6926c Merge pull request #2814 from sbwalker/dev
migrate PWA script injection
2023-05-16 08:01:00 -04:00
sbwalker
5e652364c9 migrate PWA script injection 2023-05-16 08:00:48 -04:00
Shaun Walker
8b7c3d6cfa Merge pull request #2813 from sbwalker/dev
relocate favicon rendering
2023-05-16 07:42:06 -04:00
sbwalker
3b214a0105 relocate favicon rendering 2023-05-16 07:41:50 -04:00
Shaun Walker
c0c4073bc4 Merge pull request #2811 from sbwalker/dev
ability to add arbitrary content to head and body during client and server rendering
2023-05-15 16:43:40 -04:00
sbwalker
dbe7324c7f ability to add arbitrary content to head and body during client and server rendering 2023-05-15 16:43:22 -04:00
Shaun Walker
9316255e87 Merge pull request #2809 from sbwalker/dev
added AboutAssets.txt to Maui project and changed assembly references to Oqtane 4.0.0
2023-05-15 13:21:59 -04:00
sbwalker
7f7dff7019 added AboutAssets.txt to Maui project and changed assembly references to Oqtane 4.0.0 2023-05-15 13:21:30 -04:00
Shaun Walker
961e004a49 Merge pull request #2808 from sbwalker/dev
remove unneccesary package reference to Microsoft.AspNetCore.Mvc.ViewFeatures (not used and deprecated)
2023-05-15 12:58:43 -04:00
sbwalker
02c1e4fb65 remove unneccesary package reference to Microsoft.AspNetCore.Mvc.ViewFeatures (not used and deprecated) 2023-05-15 12:58:14 -04:00
Shaun Walker
bcbc2a6e95 Merge pull request #2807 from sbwalker/dev
initial changes to upgrade to .NET 7
2023-05-15 12:01:53 -04:00
sbwalker
0c749a126c initial changes to upgrade to .NET 7 2023-05-15 12:01:29 -04:00
Shaun Walker
3698ebad7c Merge pull request #2804 from sbwalker/dev
Modify the FilterModuleDefinition() method to return null if the object passed to the method is null instead of returning an initialized object
2023-05-11 17:11:02 -04:00
sbwalker
f59a5c90a5 Modify the FilterModuleDefinition() method to return null if the object passed to the method is null instead of returning an initialized object 2023-05-11 17:10:39 -04:00
Shaun Walker
36e4a69891 Merge pull request #2802 from chlupac/Backslash_fix
FileService backslash fix
2023-05-11 16:58:17 -04:00
Shaun Walker
19b560f7c1 Update README.md 2023-05-11 11:58:15 -04:00
Pavel Veselý
0bec92e87e FileService backslash fix 2023-05-10 17:08:56 +02:00
Shaun Walker
a0d02f16cd Update README.md 2023-05-10 08:44:08 -04:00
Shaun Walker
4a0f655e1c Update README.md 2023-05-09 08:56:42 -04:00
Shaun Walker
91bf65292d Update README.md 2023-05-09 08:55:07 -04:00
Shaun Walker
a69d52d688 Merge pull request #2799 from sbwalker/dev
fix #2795 - remove protocol from alias names during add/update
2023-05-08 11:44:18 -04:00
sbwalker
79fe224cea fix #2795 - remove protocol from alias names during add/update 2023-05-08 11:43:59 -04:00
Shaun Walker
757d8e59a2 Merge pull request #2797 from thabaum/patch-25
Add missing settings excluded from Fix #2727
2023-05-08 07:29:38 -04:00
Cody
53ec1416b4 Add missing settings excluded from Fix #2727 2023-05-05 08:44:29 -07:00
Leigh Pointer
e5add21612 Merge remote-tracking branch 'oqtane/dev' into dev 2023-05-04 09:15:58 +02:00
Shaun Walker
d1b52534de Update README.md 2023-05-03 15:46:38 -04:00
Shaun Walker
35edc053b5 Update README.md 2023-05-03 15:31:34 -04:00
Shaun Walker
2aa8d3be0f Update README.md 2023-05-03 15:20:55 -04:00
Shaun Walker
ec0a5377b3 Merge pull request #2784 from oqtane/master
Merge pull request #2783 from oqtane/dev
2023-05-03 14:59:27 -04:00
Shaun Walker
b876da069d Merge pull request #2783 from oqtane/dev
3.4.3 release
2023-05-03 14:59:09 -04:00
Shaun Walker
f06063d7eb Merge pull request #2782 from sbwalker/dev
fix #2763 - prevent module definitions from having duplicate names
2023-05-03 12:46:44 -04:00
sbwalker
c6ba4f4bee fix #2763 - prevent module definitions from having duplicate names 2023-05-03 12:46:29 -04:00
Shaun Walker
89da4ab2a1 Merge pull request #2781 from sbwalker/dev
add defensive logic in case list of pages is empty
2023-05-03 12:32:44 -04:00
sbwalker
99ac0a3cab add defensive logic in case list of pages is empty 2023-05-03 12:32:28 -04:00
Shaun Walker
a964c30705 Merge pull request #2776 from thabaum/patch-24
Updated Dashboard Index
2023-05-03 12:27:32 -04:00
Shaun Walker
2334d0297d Merge pull request #2780 from sbwalker/dev
fix #2777 - module rendering order within pane - moved default module ordering logic to server API for consistency and better performance
2023-05-03 12:26:17 -04:00
sbwalker
e444c6bcf0 fix #2777 - module rendering order within pane - moved default module ordering logic to server API for consistency and better performance 2023-05-03 12:25:52 -04:00
Cody
601582fc98 Update Index.razor 2023-05-03 08:19:24 -07:00
Cody
e939dbe24e Updated SecurityAccessLevel.Admin 2023-05-02 17:14:46 -07:00
Shaun Walker
143ad85fd5 Update README.md 2023-05-02 16:00:23 -04:00
Shaun Walker
20377e9789 Merge pull request #2775 from sbwalker/dev
prepare for 3.4.3 release
2023-05-02 15:54:49 -04:00
sbwalker
e4a24df7b4 prepare for 3.4.3 release 2023-05-02 15:54:36 -04:00
Shaun Walker
e88ca00658 Merge pull request #2770 from thabaum/patch-23
Remove Admin Page/Module Registered User View
2023-05-02 15:41:27 -04:00
Shaun Walker
2312c612d7 Merge pull request #2774 from sbwalker/dev
remove message items as these are handled by MessageType enum and UX styles
2023-05-02 15:14:34 -04:00
sbwalker
3aee52482d remove message items as these are handled by MessageType enum and UX styles 2023-05-02 15:14:17 -04:00
Shaun Walker
32248e0be6 Merge pull request #2745 from thabaum/patch-18
Add support for new language translation values for #2732.
2023-05-02 15:05:36 -04:00
Shaun Walker
6c18c320bd Merge pull request #2773 from sbwalker/dev
fixed compilation error and improved UTF8 support
2023-05-02 15:03:43 -04:00
sbwalker
e31f32e5aa fixed compilation error and improved UTF8 support 2023-05-02 15:03:26 -04:00
Shaun Walker
a856390566 Merge pull request #2772 from sbwalker/dev
improve module/theme/translation upload user experience to be consistent with download
2023-05-02 14:22:56 -04:00
sbwalker
64b8291487 improve module/theme/translation upload user experience to be consistent with download 2023-05-02 14:22:34 -04:00
Shaun Walker
2ebd1310c9 Merge pull request #2747 from thabaum/patch-19
Add content-type to sitemap: Fixes issues 2749 2764
2023-05-02 14:20:39 -04:00
Cody
09118fcb42 Updates lastmod date 2023-05-02 07:15:22 -07:00
Shaun Walker
5d5167abbc Merge pull request #2771 from vnetonline/dev
Invalid template when I try and use the Deploy to Azure button
2023-05-02 09:01:41 -04:00
vnetonline
bf43dea060 Merge branch 'oqtane:dev' into dev 2023-05-02 15:53:56 +10:00
vnetonline
6ebab830c5 Invalid template when I try and use the Deploy to Azure button
1. removed depends on connection strings
2. Moved sku outside properties for type Microsoft.Web/serverfarms and added various app plans
3. Removed worker size and replaced with instance capacity
4. Replaced database and sqlserver to use various editions
5. Updated ApiVersions for various types
2023-05-02 15:47:31 +10:00
Cody
9a9a78e0bd Remove Admin Page/Module Registered User View 2023-05-01 20:01:49 -07:00
Shaun Walker
418eff7d21 Merge pull request #2754 from pepsinio/dev
Add ability to use environment variables in order to set them as app settings in Azure
2023-05-01 16:14:47 -04:00
Shaun Walker
d39869ca8e Merge pull request #2759 from leigh-pointer/MenuHorizontal#2757
Fix for MenuHorizontal #2757
2023-05-01 16:14:16 -04:00
Shaun Walker
7829168ea7 Merge pull request #2768 from sbwalker/dev
fix #2761 - updating Module Definition name, description, category not invalidating cache
2023-05-01 15:38:46 -04:00
sbwalker
dd83e3ee67 fix #2761 - updating Module Definition name, description, category not invalidating cache 2023-05-01 15:38:18 -04:00
Cody
c3ac0e365d Removed PR comments 2023-04-27 16:32:48 -07:00
Cody
2986625605 Update content type to XML and include UTF-8 2023-04-27 16:22:35 -07:00
Cody
8beaeabf09 Include utf-8 encoding. 2023-04-27 16:21:14 -07:00
Leigh Pointer
fa9b4b6112 Fix for MenuHorizontal #2757
Add the css class to MenuHorizontal to handle scrolling when hamburger Menu is in use.
2023-04-26 09:43:11 +02:00
Leigh Pointer
a20c2aa996 Merge remote-tracking branch 'oqtane/dev' into dev 2023-04-26 09:29:31 +02:00
Cody
d81fbe4585 Fixed missing logic from PR 2023-04-19 10:18:27 -07:00
Petar Dimitrov
536c044139 Add environment settings needed for Azure deployment 2023-04-19 19:18:19 +02:00
Petar Dimitrov
376531195e Add environment settings needed for Azure deployment 2023-04-19 19:17:33 +02:00
Cody
abf4ff71d7 re-add missing settings 2023-04-19 10:13:31 -07:00
Cody
d25debcea3 cleanup using 2023-04-19 10:11:16 -07:00
Cody
948c186cb5 fixed formatting 2023-04-19 10:09:00 -07:00
Cody
ba27e70fe3 Removed unnecessary cache comments. 2023-04-19 10:05:43 -07:00
Cody
c93d2576af Updates content-type to "application/xml"
removes sitemap cache from previous commits.
2023-04-19 10:00:33 -07:00
Shaun Walker
e0b0156640 allow module and theme dependencies setting to include .dll file extension, added testmode config setting for validating list of assemblies sent to client 2023-04-19 08:48:52 -07:00
Shaun Walker
a3ca6a3071 Merge pull request #2753 from sbwalker/dev
allow module and theme dependencies setting to include .dll file extension, added testmode config setting for validating list of assemblies sent to client
2023-04-19 08:46:12 -07:00
Cody
b20157450b Add caching and content-type 2023-04-14 18:08:39 -07:00
Cody
7e4f0923d7 Add support for new language translation values. 2023-04-13 07:42:04 -07:00
Leigh Pointer
f8c1fde358 Merge remote-tracking branch 'oqtane/dev' into dev 2023-04-13 13:27:33 +02:00
Shaun Walker
e0c2b2982f improvements to #2736 to support scenarios where module is not explicitly assigned to a page 2023-04-11 13:01:34 -04:00
Shaun Walker
9a231c28af Merge pull request #2742 from sbwalker/dev
improvements to #2736 to support scenarios where module is not explicitly assigned to a page
2023-04-11 12:59:33 -04:00
Shaun Walker
94a02b7bf9 add filter to exclude orphaned permissions 2023-04-11 10:35:23 -04:00
Shaun Walker
22c8fb411a Merge pull request #2741 from sbwalker/dev
add filter to exclude orphaned permissions
2023-04-11 10:33:09 -04:00
Shaun Walker
cf46210ff8 Merge pull request #2725 from thabaum/patch-17
Fixes null reference permissions issue: Fixes #2724
2023-04-11 10:22:08 -04:00
Shaun Walker
f32d988297 Merge pull request #2740 from sbwalker/dev
Routes with Module ID and no Action can be displayed on any page regardless of whether a PageModule record exists (ie. Admin Dashboard)
2023-04-11 10:19:28 -04:00
Shaun Walker
7fe4577158 Routes with Module ID and no Action can be displayed on any page regardless of whether a PageModule record exists (ie. Admin Dashboard) 2023-04-11 10:21:37 -04:00
Shaun Walker
8985dcb4c0 fix #2736 - UI not loading correct module instance in scenarios where a module exists on multiple pages 2023-04-10 08:37:35 -04:00
Shaun Walker
d346444c51 Merge pull request #2739 from sbwalker/dev
fix #2736 - UI not loading correct module instance in scenarios where a module exists on multiple pages
2023-04-10 08:35:42 -04:00
Leigh Pointer
113658f3f7 Merge remote-tracking branch 'oqtane/dev' into dev 2023-04-05 18:32:26 +02:00
Shaun Walker
ef27a0d6b0 Merge pull request #2727 from leigh-pointer/ModulePassSettings
Fix for #2718 SiteMap functionality missing Settings
2023-04-05 10:53:09 -04:00
Shaun Walker
627158cb5d Merge pull request #2729 from leigh-pointer/PwdControlCancelFocus
Fix for #2728 Toggle Password button focus
2023-04-05 10:51:27 -04:00
Shaun Walker
648edcabba Merge pull request #2731 from sbwalker/dev
fix #2720 - module definition permissions not being created properly for new sites
2023-04-05 10:27:44 -04:00
Shaun Walker
0f34c6efc5 fix #2720 - module definition permissions not being created properly for new sites 2023-04-05 10:29:51 -04:00
Shaun Walker
cc3cc55269 consolidated package installation so that it always occurs during startup and added logging in case of errors 2023-04-05 10:26:21 -04:00
Shaun Walker
a503a9d5bc Merge pull request #2730 from sbwalker/dev
consolidated package installation so that it always occurs during startup and added logging in case of errors
2023-04-05 10:24:15 -04:00
Leigh Pointer
789baf99ff Fix for #2728 Toggle Password button focus
Added  tabindex="-1" to the Button control so that focus is not received and passed the the following control.
2023-04-05 07:51:32 +02:00
Leigh Pointer
036279a54c Fix for #2718 SiteMap functionality missing Settings
Added the Module Settings to the Module parameter passed in the GetUrls interface call,
2023-04-05 07:31:57 +02:00
Cody
481f18cf1c Fixes null reference permissions issue 2023-04-04 11:19:25 -07:00
Leigh Pointer
c54a48865b Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-31 12:42:51 +02:00
Shaun Walker
2f1e386554 Update README.md 2023-03-29 14:13:27 -04:00
Shaun Walker
1e0c7cf43d Merge pull request #2706 from oqtane/master
Merge pull request #2705 from oqtane/dev
2023-03-29 14:06:22 -04:00
Shaun Walker
7978c89731 Merge pull request #2705 from oqtane/dev
3.4.2 release
2023-03-29 14:05:57 -04:00
Shaun Walker
82221f54c5 add defensive logic to package installer 2023-03-29 08:47:54 -04:00
Shaun Walker
2e23e6e4d5 Merge pull request #2704 from sbwalker/dev
add defensive logic to package installer
2023-03-29 08:45:46 -04:00
Leigh Pointer
4c4e94dba0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-29 08:38:41 +02:00
Shaun Walker
3a79fa074a fix #2700 - translation installation 2023-03-28 15:52:07 -04:00
Shaun Walker
696c63c6d2 Merge pull request #2703 from sbwalker/dev
fix #2700 - translation installation
2023-03-28 15:49:54 -04:00
Shaun Walker
8f6dc52430 prepare for 3.4.2 release 2023-03-28 14:29:57 -04:00
Shaun Walker
c8a9ad9807 Merge pull request #2702 from sbwalker/dev
prepare for 3.4.2 release
2023-03-28 14:27:45 -04:00
Shaun Walker
a0933d07d8 made word casing consistent with other module messages and reduced length of message 2023-03-28 08:53:26 -04:00
Shaun Walker
6bf61e2008 Merge pull request #2701 from sbwalker/dev
made word casing consistent with other module messages and reduced length of message
2023-03-28 08:51:24 -04:00
Shaun Walker
36ecc55578 Merge pull request #2697 from leigh-pointer/PwdConstra
Modified Registration to display the Password requirments
2023-03-28 08:17:00 -04:00
Shaun Walker
47065299ca Merge pull request #2691 from Behnam-Emamian/dev
Code Cleanups
2023-03-28 08:14:09 -04:00
Leigh Pointer
0f707a7607 Moved message to the notification.
To be honest, the message about the password should be visible at all times.
2023-03-25 11:47:15 +01:00
Shaun Walker
7590c5550f Merge pull request #2698 from sbwalker/dev
Fix #2696 - PermissionNames not appearing in PermissionGrid
2023-03-24 12:52:35 -04:00
Shaun Walker
3d23a5c79a Fix #2696 - PermissionNames not appearing in PermissionGrid 2023-03-24 12:54:46 -04:00
Leigh Pointer
9aa0374dc2 Removed unused Using 2023-03-24 12:41:27 +01:00
Leigh Pointer
058a191673 Modified Registration to display the Password requirments 2023-03-24 12:38:27 +01:00
Leigh Pointer
ec142cbbe1 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-24 10:42:07 +01:00
Ben Emamian
5fbb9160f1 Code Cleanups 2023-03-21 00:45:17 +11:00
Shaun Walker
2c3dad0592 Merge pull request #2689 from sbwalker/dev
Fix #2687 - add Setters to Permissions property to provide improved backward compatibility
2023-03-16 13:24:27 -04:00
Shaun Walker
00f039d31e Fix #2687 - add Setters to Permissions property to provide improved backward compatibility 2023-03-16 13:26:18 -04:00
Shaun Walker
497ef1750b add defensive logic to Oqtane.Client for loading modules on which have not declared all dependencies on WebAssembly 2023-03-14 20:40:49 -04:00
Shaun Walker
7d4cd04ce9 Merge pull request #2684 from sbwalker/dev
add defensive logic to Oqtane.Client for loading modules on which have not declared all dependencies on WebAssembly
2023-03-14 20:39:23 -04:00
Shaun Walker
04c0b9d37d add defensive logic to Oqtane.Maui for loading modules which have not declared all dependencies 2023-03-14 20:37:42 -04:00
Shaun Walker
b9c16c0727 Merge pull request #2683 from sbwalker/dev
add defensive logic to Oqtane.Maui for loading modules which have not declared all dependencies
2023-03-14 20:35:55 -04:00
Leigh Pointer
702ff964fe Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-14 16:52:08 +01:00
Shaun Walker
0a30f2b7e8 fix #2679 - fixed issue where ModuleDefinition cache properties were being overwritten (same issue as #2674 however implemented in ModuleController) 2023-03-14 11:49:38 -04:00
Shaun Walker
dbb1d53202 Merge pull request #2682 from sbwalker/dev
fix #2679 - fixed issue where ModuleDefinition cache properties were being overwritten (same issue as #2674 however implemented in ModuleController)
2023-03-14 11:48:01 -04:00
Shaun Walker
2c88f36e3d fix #2680 - issue when adding new site to existing installation 2023-03-14 10:26:51 -04:00
Shaun Walker
d91dcad774 Merge pull request #2681 from sbwalker/dev
fix #2680 - issue when adding new site to existing installation
2023-03-14 10:24:53 -04:00
Leigh Pointer
919439977c Merge remote-tracking branch 'origin/dev' into dev 2023-03-14 09:44:04 +01:00
Shaun Walker
6eb4ea2a2d Update README.md 2023-03-13 22:41:30 -04:00
Shaun Walker
ff6187c336 Merge pull request #2678 from oqtane/master
Merge pull request #2677 from oqtane/dev
2023-03-13 22:35:52 -04:00
Shaun Walker
1253dfe0c8 Merge pull request #2677 from oqtane/dev
3.4.1 release
2023-03-13 22:35:34 -04:00
Shaun Walker
c1f2f9a970 prepare for 3.4.1 2023-03-13 22:21:04 -04:00
Shaun Walker
8d5e7ed69f Merge pull request #2676 from sbwalker/dev
prepare for 3.4.1
2023-03-13 22:19:07 -04:00
Shaun Walker
3d3540f090 fixed issue where ModuleDefinition cache properties were being overwritten 2023-03-13 10:04:37 -04:00
Shaun Walker
61f1fcb99c Merge pull request #2674 from sbwalker/dev
fixed issue where ModuleDefinition cache properties were being overwritten
2023-03-13 10:02:53 -04:00
Leigh Pointer
a6478c5146 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-13 08:11:31 +01:00
Shaun Walker
c7b576d6d3 Update README.md 2023-03-12 10:44:17 -04:00
Shaun Walker
ab3b1d5e46 Update README.md 2023-03-12 10:42:23 -04:00
Shaun Walker
ddff3faba9 Update README.md 2023-03-12 10:37:42 -04:00
Shaun Walker
f7bb8444da Merge pull request #2670 from oqtane/master
Merge pull request #2669 from oqtane/dev
2023-03-12 10:12:26 -04:00
Shaun Walker
92128974bb Merge pull request #2669 from oqtane/dev
3.4.0 release
2023-03-12 10:11:44 -04:00
Leigh Pointer
524c4ab5a1 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-12 11:04:23 +01:00
Shaun Walker
4eb15d4806 include Site Map field in Site Settings 2023-03-11 17:42:37 -05:00
Shaun Walker
39cb3780c8 Merge pull request #2668 from sbwalker/dev
include Site Map field in Site Settings
2023-03-11 17:40:44 -05:00
Leigh Pointer
3c795eec7c Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-11 22:41:21 +01:00
Shaun Walker
81030f468b improve user profile error logging for external login 2023-03-11 14:03:24 -05:00
Shaun Walker
2032cb1ace Merge pull request #2667 from sbwalker/dev
improve user profile error logging for external login
2023-03-11 14:01:38 -05:00
Shaun Walker
5e4c91440e modify editmode parameter value in url to be more intuitive 2023-03-11 11:56:43 -05:00
Shaun Walker
13bbad863f Merge pull request #2666 from sbwalker/dev
modify editmode parameter value in url to be more intuitive
2023-03-11 11:54:48 -05:00
Shaun Walker
3065ed5094 fix issue with capturing user profile information during external login 2023-03-11 11:50:02 -05:00
Shaun Walker
9eb75cfff0 Merge pull request #2665 from sbwalker/dev
fix issue with capturing user profile information during external login
2023-03-11 11:48:07 -05:00
Shaun Walker
9305c99577 exclude hidden pages by default 2023-03-10 17:22:18 -05:00
Shaun Walker
9078da6937 Merge pull request #2663 from sbwalker/dev
exclude hidden pages by default
2023-03-10 17:20:25 -05:00
Shaun Walker
4c579639b9 avoid null reference error if list is null 2023-03-10 13:57:13 -05:00
Shaun Walker
b86472ab52 Merge pull request #2662 from sbwalker/dev
avoid null reference error if list is null
2023-03-10 13:55:28 -05:00
Leigh Pointer
b9e352cbcb Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-10 16:42:44 +01:00
Shaun Walker
5e1ac485a0 #2655 - add support for capturing user profile infrmation from claims during external login 2023-03-10 10:14:57 -05:00
Shaun Walker
527c1a12f4 Merge pull request #2661 from sbwalker/dev
#2655 - add support for capturing user profile infrmation from claims during external login
2023-03-10 10:13:09 -05:00
Shaun Walker
ef4e99b3a7 further optimization of permissions - removed reference to Role to reduce API payload and minimize information disclosure 2023-03-10 08:28:37 -05:00
Shaun Walker
12a9635309 Merge pull request #2660 from sbwalker/dev
further optimization of permissions - removed reference to Role to reduce API payload and minimize information disclosure
2023-03-10 08:26:53 -05:00
Shaun Walker
78adb24a75 fix new installation issue 2023-03-09 16:54:44 -05:00
Shaun Walker
49955cf642 Merge pull request #2658 from sbwalker/dev
fix new installation issue
2023-03-09 16:52:51 -05:00
Shaun Walker
af3b289331 exclude legacy Permissions properties from serialization/API payload 2023-03-09 15:51:16 -05:00
Shaun Walker
d11591e5aa Merge pull request #2657 from sbwalker/dev
exclude legacy Permissions properties from serialization/API payload
2023-03-09 15:49:29 -05:00
Leigh Pointer
e23744a0d0 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-09 19:04:26 +01:00
Shaun Walker
9c6174e3f2 rolling back CSS changes so that it remains consistent with the Oqtane theme 2023-03-09 09:46:58 -05:00
Shaun Walker
09c2f74d52 Merge pull request #2654 from sbwalker/dev
rolling back CSS changes so that it remains consistent with the Oqtane theme
2023-03-09 09:45:15 -05:00
Shaun Walker
7d7e0254cb Merge pull request #2642 from leigh-pointer/RecycleBinDelete
Fix Clearing modules from the Recycle Bin
2023-03-09 08:08:58 -05:00
Leigh Pointer
fe767afe9c Merge branch 'dev' into RecycleBinDelete 2023-03-09 11:49:22 +01:00
Leigh Pointer
3378f0e4ee Procedures now checks on PageModuleId 2023-03-09 11:47:19 +01:00
Leigh Pointer
626528fa5e Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-08 19:08:55 +01:00
Shaun Walker
c0341798ea Merge pull request #2653 from sbwalker/dev
include documentation to explain logic
2023-03-08 12:09:25 -05:00
Shaun Walker
fc114dc5db include documentation to explain logic 2023-03-08 12:11:11 -05:00
Shaun Walker
7107d844e1 fix #2640 - system should remain in edit mode when editing a page 2023-03-08 11:50:30 -05:00
Shaun Walker
59af0a817e Merge pull request #2652 from sbwalker/dev
fix #2640 - system should remain in edit mode when editing a page
2023-03-08 11:48:34 -05:00
Shaun Walker
9615eded85 Merge pull request #2644 from leigh-pointer/HideDeleteAllButtons
Hide the ActionDialog Button for  "Clear Notifications"
2023-03-08 10:50:13 -05:00
Shaun Walker
c51fa23fcb Merge pull request #2649 from leigh-pointer/PageChangeRecBin
Add OnPageChangePage to the Page and the Module Pagers in Recycle Bin
2023-03-08 10:50:04 -05:00
Shaun Walker
8737fd6f1e Merge pull request #2651 from sbwalker/dev
fx #2647 - error when creating new site in existing installation
2023-03-08 10:49:43 -05:00
Shaun Walker
0f109ab93a fx #2647 - error when creating new site in existing installation 2023-03-08 10:51:38 -05:00
Shaun Walker
63df2742db initialize SiteId in Permission constructor 2023-03-08 08:43:45 -05:00
Shaun Walker
7b7811f8ad Merge pull request #2650 from sbwalker/dev
initialize SiteId in Permission constructor
2023-03-08 08:42:13 -05:00
Leigh Pointer
80f74b9939 Add OnPageChangePage to the Page and the Module Pagers
Now when deleting Pages or Modules the current page is shown and not reset to the first page.
2023-03-08 13:55:27 +01:00
Leigh Pointer
274cde1c21 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-06 18:55:42 +01:00
Shaun Walker
1f29f77f66 fix #2624 - permission grid behavior issues 2023-03-06 12:20:20 -05:00
Shaun Walker
dd7da5f354 Merge pull request #2645 from sbwalker/dev
fix #2624 - permission grid behavior issues
2023-03-06 12:19:01 -05:00
Leigh Pointer
49b30da697 Hide the ActionDialog Button for "Clear Notifications"
If there are no Notifications then the buttons is not displayed.
2023-03-06 09:13:25 +01:00
Leigh Pointer
90ed767d75 Fix Clearing modules from the Recycle Bin
Modules and all related records now correctly deleted from the database.
2023-03-06 06:26:01 +01:00
Leigh Pointer
4c8cb31a6f Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-06 05:54:29 +01:00
Shaun Walker
7871f0f3ce Merge pull request #2628 from thabaum/dev
Fixes #2627 #2631 #2630 #2629 #2632  #2635 - Dev Branch Module and Theme Template Issues
2023-03-05 17:53:20 -05:00
Cody
a60cf40a3c inverts color of text within "main" <div> 2023-03-05 09:50:56 -08:00
Shaun Walker
f4eb2f6726 Merge pull request #2637 from sbwalker/dev
fix localization issue in Scheduled Jobs
2023-03-05 08:55:06 -05:00
Shaun Walker
cfe87a802e fix localization issue in Scheduled Jobs 2023-03-05 08:56:35 -05:00
Cody
6c90ec812f Fix - unable to see module actions dropdown toggle 2023-03-04 15:24:43 -08:00
Cody
196d611c1c Fix issue with navbar 2023-03-04 13:13:49 -08:00
Cody
ff41cb2735 Missing using directive Oqtane.Repository 2023-03-04 10:45:32 -08:00
Cody
fb11674301 Missing - Using Oqtane.Repository 2023-03-04 10:44:19 -08:00
Cody
b9e7f4530c Update Theme Project to use [RootFolder] 2023-03-04 10:35:45 -08:00
Cody
27049687bf Use [RootFolder] for Oqtane.Server Project 2023-03-04 10:34:12 -08:00
Cody
13503edc63 Removed extra { } 2023-03-04 09:50:49 -08:00
Leigh Pointer
bea89be67b Merge remote-tracking branch 'origin/dev' into dev 2023-03-04 08:07:48 +01:00
Shaun Walker
d33f82d969 prepare for 3.4.0 release 2023-03-03 15:45:56 -05:00
Shaun Walker
177632eee0 Merge pull request #2622 from sbwalker/dev
prepare for 3.4.0 release
2023-03-03 15:44:08 -05:00
Shaun Walker
ca0de5258e Merge pull request #2620 from leigh-pointer/DeletePermissionModDef
Fix Correct Permission Delete when ModuleDef is deleted #2619
2023-03-02 15:33:25 -05:00
Shaun Walker
1de788bc26 Merge pull request #2621 from sbwalker/dev
#2618 - add backward compatibility for permissions optimizations
2023-03-02 15:33:11 -05:00
Shaun Walker
2b41909d47 #2618 - add backward compatibility for permissions optimizations 2023-03-02 15:34:42 -05:00
Leigh Pointer
e23a9f22dd Fix Correct Permission Delete when ModuleDef is deleted #2619
Added PermissionsRepository to delete the Module permissions when the Module Definition is deleted.
2023-03-02 06:58:19 +01:00
Leigh Pointer
4cb17de82a Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-02 06:40:17 +01:00
Shaun Walker
465b7850b7 Fix #2614 - ability to add module to page 2023-03-01 10:05:14 -05:00
Shaun Walker
a0f2eedd7f Merge pull request #2615 from sbwalker/dev
Fix #2614 - ability to add module to page
2023-03-01 10:03:30 -05:00
Leigh Pointer
da3a4d5855 Merge remote-tracking branch 'oqtane/dev' into dev 2023-03-01 10:34:47 +01:00
Shaun Walker
8605e3ca5a Major refactoring replacing permission strings with permission collections. These changes will require extensive regression testing. These changes may include breaking changes which will need to be identified and resolved to provide backward compatibility. 2023-02-28 17:59:21 -05:00
Shaun Walker
dd893e6d48 Merge pull request #2612 from sbwalker/dev
Major refactoring replacing permission strings with permission collections. These changes will require extensive regression testing. These changes may include breaking changes which will need to be identified and resolved to provide backward compatibility.
2023-02-28 17:57:54 -05:00
Shaun Walker
c4cd1a5a54 Merge pull request #2610 from leigh-pointer/DeleteModDefPageMod
Fix for deleting a ModuleDefinition and related records  #2602
2023-02-24 14:21:22 -05:00
Shaun Walker
94152651fc Merge pull request #2609 from Behnam-Emamian/dev
extends watching *.dll files
2023-02-24 14:20:44 -05:00
Shaun Walker
563ea76192 Merge pull request #2611 from sbwalker/dev
explicity specify optional and reload parameters
2023-02-24 14:19:27 -05:00
Shaun Walker
4913fab0b3 explicity specify optional and reload parameters 2023-02-24 14:21:03 -05:00
Leigh Pointer
b49d011edf Fix for deleting a ModuleDefinition and related records #2602
We then find all Module items that have a ModuleDefinitionName property that matches the ModuleDefinitionName of the item to be removed, and remove them one by one. For each Module item to be removed, we find the PageModule items associated with it, remove them from the pageModules list, and then remove the Module item itself from the modules list.
2023-02-24 11:44:12 +01:00
Leigh Pointer
b0c5d1e991 Merge remote-tracking branch 'oqtane/dev' into dev 2023-02-24 10:33:52 +01:00
Ben Emamian
6e04281b03 extends watching dll files
extends watching group to include *.dll files and exclude the ones cause an infinite loop.
2023-02-24 11:20:05 +11:00
Shaun Walker
f2df8e96db fix #2567 - migrate tenant connection string details from database to appsettings.json 2023-02-23 16:29:15 -05:00
Shaun Walker
c6dd7605b2 Merge pull request #2608 from sbwalker/dev
fix #2567 - migrate tenant connection string details from database to appsettings.json
2023-02-23 16:28:16 -05:00
Shaun Walker
71dd00da0f Merge pull request #2605 from Behnam-Emamian/dev
add AddByteColumn to add tinyint to the database table.
2023-02-21 07:54:20 -05:00
Leigh Pointer
231fb80c2c Merge remote-tracking branch 'oqtane/dev' into dev 2023-02-20 16:14:42 +01:00
Shaun Walker
da48ca884d Merge pull request #2606 from sbwalker/dev
add sitemap generator which outputs all public pages and also includes an ISitemap interface for modules
2023-02-20 08:34:15 -05:00
Shaun Walker
8c6c66fb11 add sitemap generator which outputs all public pages and also includes an ISitemap interface for modules 2023-02-20 08:35:46 -05:00
Ben Emamian
f333b57310 add AddByteColumn to add tinyint to the database table 2023-02-20 00:20:19 +11:00
Shaun Walker
d1d00e6c98 Merge pull request #2601 from leigh-pointer/ModDefSettingsDelete
Fix for Missing Delete ModuleDefinition settings #1966
2023-02-17 09:15:44 -05:00
Leigh Pointer
52300e680a Fix for Missing Delete ModuleDefinition settings #1966
Added ISettingRepository _settings  to the public ModuleDefinitionRepository method and updated the DeleteModuleDefinition with _settings.DeleteSettings(EntityNames.ModuleDefinition, moduleDefinitionId);
2023-02-16 13:38:42 +01:00
Leigh Pointer
c49af06e57 Merge remote-tracking branch 'oqtane/dev' into dev 2023-02-16 12:05:02 +01:00
Shaun Walker
b3f7353582 Merge pull request #2599 from sbwalker/dev
add defensive logic to querystring parser to handle duplicate parameters
2023-02-15 15:20:12 -05:00
Shaun Walker
7db6b82a1a add defensive logic to querystring parser to handle duplicate parameters 2023-02-15 15:21:50 -05:00
Shaun Walker
a50a13374f improve initialization logic in FileManager which could sometimes result in Upload button not being displayed when the component was initially loaded 2023-02-15 15:06:50 -05:00
Shaun Walker
3952fe5a72 Merge pull request #2598 from sbwalker/dev
improve initialization logic in FileManager which could sometimes result in Upload button not being displayed when the component was initially loaded
2023-02-15 15:05:17 -05:00
Shaun Walker
2e61a43e4f fix #2596 - fix EF Core tracking error when updating a file in a folder which has a Capacity specified 2023-02-15 12:43:18 -05:00
Shaun Walker
ebe03e9310 Merge pull request #2597 from sbwalker/dev
fix #2596 - fix EF Core tracking error when updating a file in a folder which has a Capacity specified
2023-02-15 12:42:00 -05:00
Shaun Walker
11dd3ce110 adding Oqtane.Server project back to module and theme external template solutions 2023-02-09 17:45:45 -05:00
Shaun Walker
1919c24959 Merge pull request #2593 from sbwalker/dev
adding Oqtane.Server project back to module and theme external template solutions
2023-02-09 17:44:27 -05:00
Shaun Walker
aa80f31e52 fix #2570 - do not allow the term "oqtane" to be used as an organization or module/theme name (to avoid namespace issues). 2023-02-09 16:26:20 -05:00
Shaun Walker
6d8400e72f Merge pull request #2592 from sbwalker/dev
fix #2570 - do not allow the term "oqtane" to be used as an organization or module/theme name (to avoid namespace issues).
2023-02-09 16:25:08 -05:00
Shaun Walker
fa8d0c91fc added new methods for managing visitor settings (for personalization) 2023-02-08 17:43:55 -05:00
Shaun Walker
e91ff95712 Merge pull request #2591 from sbwalker/dev
added new methods for managing visitor settings (for personalization)
2023-02-08 17:42:35 -05:00
Shaun Walker
0883a8dbff optimize Split() statements for consistency 2023-02-08 16:51:45 -05:00
Shaun Walker
0db297d1cd Merge pull request #2590 from sbwalker/dev
optimize Split() statements for consistency
2023-02-08 16:50:23 -05:00
Shaun Walker
db73052ee5 allow system log to be cleared 2023-02-08 14:45:20 -05:00
Shaun Walker
8b95069610 Merge pull request #2589 from sbwalker/dev
allow system log to be cleared
2023-02-08 14:43:58 -05:00
Shaun Walker
2a12744cd5 added toggle to show/hide connection string in Site Settings 2023-02-08 08:29:50 -05:00
Shaun Walker
1df4059284 Merge pull request #2588 from sbwalker/dev
added toggle to show/hide connection string in Site Settings
2023-02-08 08:28:34 -05:00
Shaun Walker
475894b680 fix #2584 - added IsDeleted columns back to Folder and File tables to preserve compatibility for SQLite 2023-02-08 08:05:25 -05:00
Shaun Walker
1663bf8e52 Merge pull request #2587 from sbwalker/dev
fix #2584 - added IsDeleted columns back to Folder and File tables to preserve compatibility for SQLite
2023-02-08 08:04:58 -05:00
Shaun Walker
ffca1d2486 refactor visitor cookie name into a shared constant 2023-02-07 16:26:23 -05:00
Shaun Walker
eb876845ff Merge pull request #2585 from sbwalker/dev
refactor visitor cookie name into a shared constant
2023-02-07 16:25:05 -05:00
Shaun Walker
02c134bf4b Merge pull request #2580 from markdav-is/patch-3
Make ActiveDatabase setter public
2023-02-06 16:50:55 -05:00
Shaun Walker
af55c11aa0 Merge pull request #2582 from sbwalker/dev
fix #2574 - check for null ModuleDefinition reference  when loding permissions in PageModuleRepository (credit @beolafsen)
2023-02-06 16:48:40 -05:00
Shaun Walker
33bc6adcb5 fix #2574 - check for null ModuleDefinition reference when loding permissions in PageModuleRepository (credit @beolafsen) 2023-02-06 16:49:45 -05:00
Shaun Walker
56e4dcc11e fix #2578 - error notification sent via email includes direct link to specific log item, however redirect was causing an infinite loop. This resolves the problem and also preserves url querystring parameters during login/logout. 2023-02-06 16:44:25 -05:00
Shaun Walker
467cf7620e Merge pull request #2581 from sbwalker/dev
fix #2578 - error notification sent via email includes direct link to specific log item, however redirect was causing an infinite loop. This resolves the problem and also preserves url querystring parameters during login/logout.
2023-02-06 16:43:23 -05:00
Mark Davis
85ac8dd701 Make ActiveDatabase setter public
We have two cases where we need to override the active database:  Unit Testing and added GraphQL.  In both of these cases, we have a database context that is in a different scope than the automatically assigned active database during normal Oqtane startup.  Our work-around has been to make this setter public.  Unless there is a better solution to our cases, I feel this change would be useful for others as well.
2023-02-04 09:04:54 -08:00
Shaun Walker
1f2ad4e884 Suppress unauthorized visitor logging as it is usually caused by clients that do not support cookies 2023-02-03 16:12:13 -05:00
Shaun Walker
cf2d9af664 Merge pull request #2579 from sbwalker/dev
Suppress unauthorized visitor logging as it is usually caused by clients that do not support cookies
2023-02-03 16:10:57 -05:00
Shaun Walker
7a105047e9 Fixed issue where TenantMiddleware was not rewriting the Url path for the new File Server when running on an Alias Path which resulted in a 404 when serving files 2023-01-23 15:16:08 -05:00
Shaun Walker
bc8bdef37d Merge pull request #2571 from sbwalker/dev
Fixed issue where TenantMiddleware was not rewriting the Url path for the new File Server when running on an Alias Path which resulted in a 404 when serving files
2023-01-23 15:15:05 -05:00
Shaun Walker
fd0519b955 Update README.md 2023-01-14 15:17:38 -05:00
Shaun Walker
d5ffb56fa8 Update README.md 2023-01-14 15:15:33 -05:00
Shaun Walker
d6cce9e2d8 Update README.md 2023-01-14 15:08:20 -05:00
Shaun Walker
08ec46637f Update README.md 2023-01-14 15:04:31 -05:00
Shaun Walker
f596795792 Update README.md 2023-01-14 15:03:46 -05:00
Shaun Walker
2c56bfd4aa Merge pull request #2565 from oqtane/master
Merge pull request #2564 from oqtane/dev
2023-01-14 14:54:37 -05:00
Shaun Walker
755615da30 Merge pull request #2564 from oqtane/dev
3.3.1 release
2023-01-14 14:54:18 -05:00
Shaun Walker
4cc0060c67 prepare for 3.3.1 patch 2023-01-14 14:45:30 -05:00
Shaun Walker
52af015c2f Merge pull request #2563 from sbwalker/dev
prepare for 3.3.1 patch
2023-01-14 14:44:32 -05:00
Shaun Walker
eae6d13284 Fix #2561 - set Permission EntityName explicitly to Module when adding module to page from Control Panel 2023-01-14 12:39:34 -05:00
Shaun Walker
2a20a7cf21 Merge pull request #2562 from sbwalker/dev
Fix #2561 - set Permission EntityName explicitly to Module when adding module to page from Control Panel
2023-01-14 12:38:55 -05:00
Shaun Walker
27251005ec incorrect url in framework nusepc 2023-01-13 07:50:58 -05:00
Shaun Walker
90a9b2e5a1 Merge pull request #2560 from sbwalker/dev
incorrect url in framework nusepc
2023-01-13 07:50:04 -05:00
Shaun Walker
cd1f12e9b4 Merge pull request #2557 from oqtane/master
Merge pull request #2556 from oqtane/dev
2023-01-12 12:50:09 -05:00
Shaun Walker
734b9b6458 Merge pull request #2556 from oqtane/dev
3.3.0 Release
2023-01-12 12:49:49 -05:00
Shaun Walker
a120449c8d Update README.md 2023-01-12 12:48:54 -05:00
Shaun Walker
b005a1da56 Merge pull request #2555 from sbwalker/dev
remove extra info from Body as the From display name is now always set to the user's name
2023-01-12 11:47:32 -05:00
Shaun Walker
afc75a09d9 remove extra info from Body as the From display name is now always set to the user's name 2023-01-12 11:48:25 -05:00
Shaun Walker
c6e6c98875 improve notification job 2023-01-12 09:13:13 -05:00
Shaun Walker
fa1a5ab913 Merge pull request #2554 from sbwalker/dev
improve notification job
2023-01-12 09:12:11 -05:00
Shaun Walker
b671b590ad change Sql Manager logging level 2023-01-12 08:18:36 -05:00
Shaun Walker
a46c98eed3 Merge pull request #2553 from sbwalker/dev
change Sql Manager logging level
2023-01-12 08:17:42 -05:00
Shaun Walker
7ab5ed5bcb copyright year update 2023-01-11 14:40:16 -05:00
Shaun Walker
5e609edc31 Merge pull request #2551 from sbwalker/dev
copyright year update
2023-01-11 14:39:15 -05:00
Shaun Walker
ac466429f8 improve release batch file 2023-01-11 10:24:50 -05:00
Shaun Walker
2804c50c8a Merge pull request #2550 from sbwalker/dev
improve release batch file
2023-01-11 10:24:18 -05:00
Shaun Walker
c4315c25bc prepare for 3.3.0 release 2023-01-10 14:02:23 -05:00
Shaun Walker
e2d5fa48cf Merge pull request #2548 from sbwalker/dev
prepare for 3.3.0 release
2023-01-10 14:01:48 -05:00
Shaun Walker
c2375c897d permission updates 2023-01-10 08:20:32 -05:00
Shaun Walker
49f181583b Merge pull request #2546 from sbwalker/dev
permission updates
2023-01-10 08:20:27 -05:00
Shaun Walker
ea463a6548 fix #2534 - added Relay Configured site setting to enable sending from users email address 2023-01-09 16:37:06 -05:00
Shaun Walker
1a567dbdc1 Merge pull request #2545 from sbwalker/dev
fix #2534 - added Relay Configured site setting to enable sending from users email address
2023-01-09 16:36:30 -05:00
Shaun Walker
e4ec10ef49 format PermissionNames to be more readable 2023-01-09 15:36:41 -05:00
Shaun Walker
3db4fc687a Merge pull request #2544 from sbwalker/dev
format PermissionNames to be more readable
2023-01-09 15:35:59 -05:00
Shaun Walker
e136972cd7 add support for API permissions at the UI layer - including ability to delegate user, role, profile management 2023-01-09 11:38:25 -05:00
Shaun Walker
7b1b32e16f Merge pull request #2543 from sbwalker/dev
add support for API permissions at the UI layer - including ability to delegate user, role, profile management
2023-01-09 11:37:54 -05:00
Shaun Walker
1616f94b86 add ability to view error.log in System Info 2023-01-05 10:18:55 -05:00
Shaun Walker
7043d1f3bf Merge pull request #2542 from sbwalker/dev
add ability to view error.log in System Info
2023-01-05 10:18:10 -05:00
Shaun Walker
7bebfe1919 fix typo and help text 2023-01-05 09:55:06 -05:00
Shaun Walker
d33ded0426 Merge pull request #2541 from sbwalker/dev
fix typo and help text
2023-01-05 09:54:23 -05:00
Shaun Walker
66aa67581f improve dynamic policy registration to handle possible race conditions 2023-01-05 09:43:59 -05:00
Shaun Walker
3a95c05db9 Merge pull request #2540 from sbwalker/dev
improve dynamic policy registration to handle possible race conditions
2023-01-05 09:43:15 -05:00
Leigh Pointer
79fc03bb0f Merge remote-tracking branch 'oqtane/dev' into dev 2023-01-04 21:27:31 +01:00
Shaun Walker
67046e9d36 Merge pull request #2535 from thabaum/Readme-Glow-Logo
Update framework root to use the new dark/light theme glow logo
2023-01-04 14:51:39 -05:00
Shaun Walker
6f2965a5b0 Merge pull request #2537 from leigh-pointer/Pager-Pointer
A change to the Pager bar to set the mouse pointer to pointer
2023-01-04 14:51:29 -05:00
Shaun Walker
197db449a1 Merge pull request #2539 from sbwalker/dev
include owner in migration tag name in external module template
2023-01-04 14:51:11 -05:00
Shaun Walker
f4800bb7f0 include owner in migration tag name in external module template 2023-01-04 14:51:55 -05:00
Shaun Walker
6a213561f6 added an autocomplete component and implemented in permission grid 2023-01-04 14:50:05 -05:00
Shaun Walker
8f8d31f0c9 Merge pull request #2538 from sbwalker/dev
added an autocomplete component and implemented in permission grid
2023-01-04 14:49:23 -05:00
Leigh Pointer
f8cfdacc26 A change to the Pager bar to set the mouse pointer to pointer
Currently the mouse pointer shows the Selector icon when hoovered over the page number buttons. This is an update changing the icon to the Pointer icon.

Updated the CSS class name to 'app-pager-pointer' in app.css and the Component.
2023-01-03 14:24:17 +01:00
Cody
07223e27a4 Add Oqtane Glow Logo for Dark/Light Themes 2022-12-27 10:30:00 -08:00
Cody
4c6f46ad17 Remove Dark Logo from Framework Root 2022-12-27 10:28:37 -08:00
Shaun Walker
39dc288f9c Merge pull request #2533 from sbwalker/dev
fix #2526 - support multiple TabStrip components on a page
2022-12-19 15:57:30 -05:00
Shaun Walker
467e88ef55 fix #2526 - support multiple TabStrip components on a page 2022-12-19 15:58:04 -05:00
Shaun Walker
0965db5d57 fix skip pages logic in pager where screen was not being refreshed 2022-12-19 15:11:04 -05:00
Shaun Walker
c30339d9b8 Merge pull request #2532 from sbwalker/dev
fix skip pages logic in pager where screen was not being refreshed
2022-12-19 15:10:27 -05:00
Shaun Walker
369adcb173 allow profile management to be delegated 2022-12-19 15:07:38 -05:00
Shaun Walker
d837b981d4 Merge pull request #2531 from sbwalker/dev
allow profile management to be delegated
2022-12-19 15:07:03 -05:00
Shaun Walker
f455461c1e Update README.md 2022-12-14 14:54:23 -05:00
Shaun Walker
0087b188a1 improve null handling 2022-12-07 10:33:25 -05:00
Shaun Walker
98602f49d8 Merge pull request #2522 from sbwalker/dev
improve null handling
2022-12-07 10:33:21 -05:00
Shaun Walker
70466e5626 Merge pull request #2521 from sbwalker/dev
fix #2513 - add new methods for deleting a setting and retrieving a list of settings
2022-12-07 08:59:07 -05:00
Shaun Walker
cc7f98a6fe fix #2513 - add new methods for deleting a setting and retrieving a list of settings 2022-12-07 08:59:03 -05:00
Shaun Walker
fd13ad1fca initialize API permissions based on default roles 2022-12-06 17:16:51 -05:00
Shaun Walker
5077f6fbca Merge pull request #2520 from sbwalker/dev
initialize API permissions based on default roles
2022-12-06 17:16:47 -05:00
Shaun Walker
9b15ce6d29 Merge pull request #2519 from sbwalker/dev
make casing consistent in route template definition and method parameter declation or else Swagger will not be able to resolve
2022-12-06 10:48:57 -05:00
Shaun Walker
5a8ca24566 make casing consistent in route template definition and method parameter declation or else Swagger will not be able to resolve 2022-12-06 10:48:56 -05:00
Shaun Walker
d3f982cae1 Merge pull request #2518 from sbwalker/dev
add ModuleControllerBase helper method for validating EntityId
2022-12-05 14:21:15 -05:00
Shaun Walker
28b58b9048 add ModuleControllerBase helper method for validating EntityId 2022-12-05 14:21:12 -05:00
Shaun Walker
cb10dde97d added API Management for managing site level entity permissions 2022-12-02 16:42:43 -05:00
Shaun Walker
2c179867e8 Merge pull request #2517 from sbwalker/dev
added API Management for managing site level entity permissions
2022-12-02 16:42:41 -05:00
Shaun Walker
44fc6de82b hide connection string by default in SQL Management and provide toggle for display 2022-12-02 08:16:18 -05:00
Shaun Walker
f671af43cd Merge pull request #2516 from sbwalker/dev
hide connection string by default in SQL Management and provide toggle for display
2022-12-02 08:16:18 -05:00
Shaun Walker
8c0dc6422e Merge pull request #2515 from sbwalker/dev
fix #2512 - provide guidance about password complexity policy during install, and ensure modified passwords meet complexity policy
2022-12-02 07:42:55 -05:00
Shaun Walker
c91e285475 fix #2512 - provide guidance about password complexity policy during install, and ensure modified passwords meet complexity policy 2022-12-02 07:42:49 -05:00
Shaun Walker
642e41530e Merge pull request #2514 from sbwalker/dev
enhance dynamic authorization policies to support default role specification
2022-12-02 07:34:08 -05:00
Shaun Walker
b09a3ccdae enhance dynamic authorization policies to support default role specification 2022-12-02 07:34:06 -05:00
Shaun Walker
a1aab62cea Merge pull request #2504 from leigh-pointer/PagerPointer
A change to the Pager bar to set the mouse pointer to pointer
2022-11-23 11:26:57 -05:00
Shaun Walker
e8b1aca45c Merge pull request #2507 from sbwalker/dev
fix #2502 - invalid logic checking querystring parameter
2022-11-23 11:26:21 -05:00
Shaun Walker
3de98873d6 fix #2502 - invalid logic checking querystring parameter 2022-11-23 11:26:23 -05:00
Shaun Walker
c030ede12c Merge pull request #2506 from sbwalker/dev
fix #2503 - generate password using CultureInfo.InvariantCulture to ensure it satisfies password complexity criteria
2022-11-23 11:11:05 -05:00
Shaun Walker
67f740c264 fix #2503 - generate password using CultureInfo.InvariantCulture to ensure it satisfies password complexity criteria 2022-11-23 11:10:59 -05:00
Shaun Walker
9b68337047 Merge pull request #2505 from sbwalker/dev
fix #2501 - set default Visibility to Same As Page when adding module to a page
2022-11-23 10:51:50 -05:00
Shaun Walker
2bae971b92 fix #2501 - set default Visibility to Same As Page when adding modules to a page 2022-11-23 10:51:37 -05:00
Leigh Pointer
c5c5fd859f A change to the Pager bar to set the mouse pointer to pointer
Currently the mouse pointer shows the Selector icon when hoovered over the page number buttons.  This is an update changing the icon to the Pointer icon.
2022-11-21 09:44:30 +01:00
Shaun Walker
15c46fd157 Merge pull request #2496 from sbwalker/dev
Fix #2488 - add ability to include inline script resource definitions in modules and themes
2022-11-12 10:59:25 -05:00
Shaun Walker
424950bd3e Fix #2488 - add ability to include inline script resource definitions in modules and themes 2022-11-12 10:58:58 -05:00
Shaun Walker
39a9968971 Merge pull request #2493 from sbwalker/dev
fix JS Interop methods for includeScript and includeMeta
2022-11-10 14:19:52 -05:00
Shaun Walker
075a09f0df fix JS Interop methods for includeScript and includeMeta 2022-11-10 14:19:31 -05:00
Shaun Walker
26e628e189 Merge pull request #2492 from sbwalker/dev
move UI logic from FileService to FileManager, add progressive retry logic, update file attributes if uploading a new version of a file, clean up temporary artifacts on failure, improve upload efficiency
2022-11-09 21:11:42 -05:00
Shaun Walker
7489d9d186 move UI logic from FileService to FileManager, add progressive retry logic, update file attributes if uploading a new version of a file, clean up temporary artifacts on failure, improve upload efficiency 2022-11-09 21:11:02 -05:00
Shaun Walker
7db5b6c7f3 Update README.md 2022-11-08 08:59:49 -05:00
Shaun Walker
9b7fa8cac2 Update README.md 2022-11-08 08:53:33 -05:00
Shaun Walker
5028051a34 Update README.md 2022-11-08 08:52:51 -05:00
Shaun Walker
83b3767df6 Merge pull request #2490 from sbwalker/dev
Scope permissions by SiteId to support entity level authorization as well as improve caching and performance. Optimize GetTenant to use existing cache.
2022-11-07 18:17:04 -05:00
Shaun Walker
6182b96d16 Scope permissions by SiteId to support entity level authorization as well as improve caching and performance. Optimize GetTenant to use existing cache. 2022-11-07 18:16:32 -05:00
Shaun Walker
a719382563 Merge pull request #2482 from sbwalker/dev
add support for dynamic authorization policies
2022-11-04 08:08:33 -04:00
Shaun Walker
2aa6eb90e2 add support for dynamic authorization policies 2022-11-04 08:08:10 -04:00
Shaun Walker
d2495455cd Merge pull request #2477 from sbwalker/dev
added ETag / 304 Not Modified logic to File server for performance optimization
2022-10-29 10:23:58 -04:00
Shaun Walker
23d1dd23d1 added ETag / 304 Not Modified logic to File server for performance optimization 2022-10-29 10:23:04 -04:00
Shaun Walker
573acd6a5d Merge pull request #2476 from sbwalker/dev
fix File Update API to update the file size and image dimensions
2022-10-27 09:39:05 -04:00
Shaun Walker
40ddbbfbb7 fix File Update API to update the file size and image dimensions 2022-10-27 09:38:26 -04:00
Shaun Walker
1b488b298b Merge pull request #2475 from sbwalker/dev
remove IDeletable fields from Folder and File entities as they are never set and not used
2022-10-26 17:43:09 -04:00
Shaun Walker
54b45943db remove IDeletable fields from Folder and File entities as they are never set and not used 2022-10-26 17:42:26 -04:00
Shaun Walker
89b3ae4c74 Merge pull request #2474 from sbwalker/dev
fix IDeletable code documentation
2022-10-26 17:33:52 -04:00
Shaun Walker
fe97a76d00 fix IDeletable code documentation 2022-10-26 17:33:17 -04:00
Shaun Walker
78094f69d7 Merge pull request #2473 from sbwalker/dev
update models to use new ModelBase
2022-10-26 17:27:22 -04:00
Shaun Walker
4499d55464 update models to use new ModelBase 2022-10-26 17:26:46 -04:00
Shaun Walker
4c12ca0607 Merge pull request #2472 from sbwalker/dev
introduced a ModelBase to move the IAuditable properties to a base class
2022-10-26 17:12:38 -04:00
Shaun Walker
1daa9575db introduced a ModelBase to move the IAuditable properties to a base class 2022-10-26 17:12:03 -04:00
Shaun Walker
f7c9961f8c Merge pull request #2471 from sbwalker/dev
add loading icon to Maui project
2022-10-26 10:06:57 -04:00
Shaun Walker
e27a625069 add loading icon to Maui project 2022-10-26 09:04:04 -04:00
Shaun Walker
42b1669cce Merge pull request #2469 from sbwalker/dev
remove Oqtane.Server from external templates as they cause random compilation issues
2022-10-20 14:05:45 -04:00
Shaun Walker
74571afc9e remove Oqtane.Server from external templates as they cause random compilation issues 2022-10-20 14:04:53 -04:00
Shaun Walker
f678f11c59 Merge pull request #2468 from sbwalker/dev
add validation message for missing package name
2022-10-20 14:00:56 -04:00
Shaun Walker
e685252b1d add validation message for missing package name 2022-10-20 14:00:17 -04:00
Shaun Walker
bb75fcb5a3 Merge pull request #2467 from sbwalker/dev
fix language delete refresh
2022-10-20 13:43:36 -04:00
Shaun Walker
7653f36f31 fix language delete refresh 2022-10-20 13:42:54 -04:00
Shaun Walker
0670148064 Merge pull request #2466 from sbwalker/dev
fix #2464 - translation install/upgrade experience
2022-10-20 13:17:06 -04:00
Shaun Walker
368b900a6e fix #2464 - translation install/upgrade experience 2022-10-20 13:16:18 -04:00
Shaun Walker
6378a78cbd Update README.md 2022-10-18 08:10:48 -04:00
Shaun Walker
d3bcdec0f2 Update README.md 2022-10-18 08:10:02 -04:00
Shaun Walker
82c074ce2e Merge pull request #2463 from sbwalker/dev
replace assembly references with package references
2022-10-18 07:52:33 -04:00
Shaun Walker
a313e2d386 replace assembly references with package references 2022-10-18 07:51:50 -04:00
Shaun Walker
578cb2f7e3 Update README.md 2022-10-18 07:43:18 -04:00
Shaun Walker
c8f56e1659 Merge pull request #2461 from oqtane/master
Merge pull request #2460 from oqtane/dev
2022-10-17 16:46:03 -04:00
Shaun Walker
56631a3e6b Merge pull request #2460 from oqtane/dev
3.2.1 release
2022-10-17 16:45:47 -04:00
Shaun Walker
84ee9de18c Merge pull request #2459 from sbwalker/dev
Changed default service url in MAUI so users can immediately run client app
2022-10-17 08:12:53 -04:00
Shaun Walker
0aeb4e9173 Changed default service url in MAUI so users can immediately run client app 2022-10-17 08:12:04 -04:00
Shaun Walker
bb65e5c373 Merge pull request #2455 from sbwalker/dev
prepare for 3.2.1 release
2022-10-13 13:35:36 -04:00
Shaun Walker
45e2027c56 prepare for 3.2.1 release 2022-10-13 13:34:43 -04:00
Shaun Walker
6dc5ef44b7 Merge pull request #2454 from sbwalker/dev
Resolve deserialization issue with System.Text.Json when accessing remote services
2022-10-12 12:38:08 -04:00
Shaun Walker
e88d3cca07 Resolve deserialization issue with System.Text.Json when accessing remote services 2022-10-12 12:37:03 -04:00
Shaun Walker
a4b7381141 Merge pull request #2451 from sbwalker/dev
fix #2435 - remove NewtonSoft.Json dependency
2022-10-11 08:35:44 -04:00
Shaun Walker
2ea054dc72 fix #2435 - remove NewtonSoft.Json dependency 2022-10-11 08:34:33 -04:00
Shaun Walker
13ec726ab2 Merge pull request #2450 from sbwalker/dev
add file download event
2022-10-05 08:02:22 -04:00
Shaun Walker
2e32b65421 add file download event 2022-10-05 08:00:45 -04:00
Shaun Walker
f48ca53cdb Merge pull request #2449 from sbwalker/dev
Enhance SyncManager to raise events which can be handled on the server within hosted services. Raise create, update, delete events for all major entities. Include support for refresh and reload events to synchronize client state. Move client state cache invalidation to a hosted service to separate concerns and demonstrate events.
2022-10-04 19:21:35 -04:00
Shaun Walker
c5b632cb24 Enhance SyncManager to raise events which can be handled on the server within hosted services. Raise create, update, delete events for all major entities. Include support for refresh and reload events to synchronize client state. Move client state cache invalidation to a hosted service to separate concerns and demonstrate events. 2022-10-04 19:20:02 -04:00
Shaun Walker
422e9ae99e Update README.md 2022-09-30 15:24:15 -04:00
Shaun Walker
68ada8fbe4 Merge pull request #2431 from chlupac/InstallFix
Unattended installation fix
2022-09-30 11:49:06 -04:00
Shaun Walker
e40bf08691 Merge pull request #2446 from sbwalker/dev
add upgrade logic for sites using remapped identifier and email claim…
2022-09-30 09:54:59 -04:00
Shaun Walker
a04c7222b2 add upgrade logic for sites using remapped identifier and email claim types 2022-09-30 09:53:37 -04:00
Shaun Walker
172faec5a0 Merge pull request #2445 from sbwalker/dev
log any user creation errors from .NET Identity
2022-09-29 17:18:48 -04:00
Shaun Walker
e01c3e7e4a log any user creation errors from .NET Identity 2022-09-29 17:16:29 -04:00
Shaun Walker
7a3d5d0429 Merge pull request #2444 from sbwalker/dev
fix #2432 - add support for roles as part of external login via OIDC
2022-09-29 16:34:18 -04:00
Shaun Walker
ddf1caaaaa fix #2432 - add support for roles as part of external login via OIDC 2022-09-29 16:32:50 -04:00
Shaun Walker
021293cbb0 Merge pull request #2443 from sbwalker/dev
fix #2427 - issue with upgrade available in Language Management
2022-09-28 16:18:08 -04:00
Shaun Walker
1438e61f1b fix #2427 - issue with upgrade available in Language Management 2022-09-28 16:16:46 -04:00
Shaun Walker
182f4dbae7 Merge pull request #2442 from sbwalker/dev
fix #2426 - error in recycle bin
2022-09-28 13:56:46 -04:00
Shaun Walker
26ec3fc7cf fix #2426 - error in recycle bin 2022-09-28 13:55:12 -04:00
Shaun Walker
225c758795 Merge pull request #2440 from leigh-pointer/PagerFooter
Add footer to the Pager control
2022-09-28 09:45:48 -04:00
Shaun Walker
5e653250f3 Merge pull request #2441 from sbwalker/dev
Fix #2439 - ensure resource urls are constructed consistently on client and server
2022-09-28 09:44:32 -04:00
Shaun Walker
b7a3713946 Fix #2439 - ensure resource urls are constructed consistently on client and server 2022-09-28 09:43:02 -04:00
Leigh Pointer
44242fdb4a Add footer to the Pager control
Mirrored the Head functionality for <tfoot> tag
2022-09-28 14:00:53 +02:00
Pavel Veselý
45515b2c06 Unattented instalation fix 2022-09-24 15:44:20 +02:00
Shaun Walker
2d95fe294c Merge pull request #2430 from sbwalker/dev
Add Blazor Server reconnect script, fix event log direct link from notification email, add more validation to Pager, improve browser refresh script to wait for server availability
2022-09-24 08:38:54 -04:00
Shaun Walker
72cc44641b Add Blazor Server reconnect script, fix event log direct link from notification email, add more validation to Pager, improve browser refresh script to wait for server availability 2022-09-24 08:37:18 -04:00
Shaun Walker
9ac3fa5269 Merge pull request #2425 from sbwalker/dev
fix new id convention in file server
2022-09-21 15:39:20 -04:00
Shaun Walker
d1ea141165 fix new id convention in file server 2022-09-21 15:37:52 -04:00
Shaun Walker
dca21fbb8c Merge pull request #2424 from sbwalker/dev
improve BaseUrl handling for MAUI, replace ContentUrl with FileUrl and improve file server
2022-09-21 13:39:51 -04:00
Shaun Walker
06812d5df8 improve BaseUrl handling for MAUI, replace ContentUrl with FileUrl and improve file server 2022-09-21 13:38:21 -04:00
Shaun Walker
564410d3cd Update README.md 2022-09-19 17:10:11 -04:00
Shaun Walker
4b1cec979a Merge pull request #2422 from sbwalker/dev
rename list name to match intent
2022-09-14 22:30:05 -04:00
Shaun Walker
a5f1bc3895 rename list name to match intent 2022-09-14 22:28:31 -04:00
Shaun Walker
b097d031b5 Merge pull request #2421 from sbwalker/dev
clean up pdb files on client, hash assembly file names
2022-09-14 10:11:22 -04:00
Shaun Walker
45df729711 clean up pdb files on client, hash assembly file names 2022-09-14 10:09:50 -04:00
Shaun Walker
802ee8a1ff Merge pull request #2419 from oqtane/master
Merge pull request #2418 from oqtane/dev
2022-09-13 09:18:35 -04:00
Shaun Walker
e312970212 Merge pull request #2418 from oqtane/dev
3.2.0 release
2022-09-13 09:18:16 -04:00
Shaun Walker
c0f4069a9b Merge pull request #2417 from sbwalker/dev
refactor IndexedDB interop functions
2022-09-13 07:44:10 -04:00
Shaun Walker
654352827e refactor IndexedDB interop functions 2022-09-13 07:42:27 -04:00
Shaun Walker
7dd210976d Merge pull request #2416 from sbwalker/dev
optimize assembly list retrieval
2022-09-12 16:21:11 -04:00
Shaun Walker
5302be8bc1 optimize assembly list retrieval 2022-09-12 16:19:32 -04:00
Shaun Walker
9ed7181e28 Merge pull request #2415 from sbwalker/dev
remove unnecessary using statements
2022-09-12 14:56:35 -04:00
Shaun Walker
23ae4b01cb remove unnecessary using statements 2022-09-12 14:54:31 -04:00
Shaun Walker
59764d3378 Merge pull request #2414 from sbwalker/dev
cache assemblies in IndexedDB on WebAssembly
2022-09-12 14:48:17 -04:00
Shaun Walker
b8e2c729c1 cache assemblies in IndexedDB on WebAssembly 2022-09-12 14:46:46 -04:00
Shaun Walker
530d80a011 Merge pull request #2412 from sbwalker/dev
optimize assembly loading for MAUI to use client storage
2022-09-11 10:50:20 -04:00
Shaun Walker
2d306e8fda optimize assembly loading for MAUI to use client storage 2022-09-11 10:48:40 -04:00
Shaun Walker
b3d9a70fd1 Merge pull request #2410 from sbwalker/dev
remove Oqtane.Server from Oqtane.Maui solution
2022-09-09 11:40:06 -04:00
Shaun Walker
b880207f61 remove Oqtane.Server from Oqtane.Maui solution 2022-09-09 11:37:33 -04:00
Shaun Walker
ee76d02999 Merge pull request #2409 from sbwalker/dev
improvements to run in Android Emulator
2022-09-09 10:27:45 -04:00
Shaun Walker
804c33a375 improvements to run in Android Emulator 2022-09-09 10:26:13 -04:00
Shaun Walker
de784714d9 Merge pull request #2408 from sbwalker/dev
fix issue in upgrade logic for making folder paths cross platform
2022-09-08 15:44:34 -04:00
Shaun Walker
2404e26b61 fix issue in upgrade logic for making folder paths cross platform 2022-09-08 15:43:03 -04:00
Shaun Walker
b191fdda2c Merge pull request #2407 from sbwalker/dev
prepare for 3.2.0
2022-09-08 15:30:05 -04:00
Shaun Walker
e8adfd45d2 prepare for 3.2.0 2022-09-08 15:28:25 -04:00
Shaun Walker
7158595801 Merge pull request #2406 from orionlaw/dev
Make sure Job date times are stored in the database as UTC.
2022-09-08 09:14:31 -04:00
Darryl Koehn
ba97f63338 Make sure Job date times are stored in the database as UTC. This is required if using Postgres or you will get an exception with a message of “Cannot write DateTime with Kind=Unspecified to PostgreSQL type 'timestamp with time zone', only UTC is supported.”. 2022-09-07 12:46:24 -06:00
Shaun Walker
62eca2aedc Merge pull request #2401 from chlupac/BackslashFix
Backslash fix.
2022-09-06 10:53:48 -04:00
Shaun Walker
b15f6b1fa7 Merge pull request #2402 from chlupac/GitignoreUpdate
Gitignore update
2022-09-06 10:53:05 -04:00
Shaun Walker
5b22de589c Merge pull request #2403 from sbwalker/dev
Fix #2399 - page paths not being validated for deleted pages
2022-09-06 10:52:34 -04:00
Shaun Walker
d1f50f12af Fix #2399 - page paths not being validated for deleted pages 2022-09-06 10:50:53 -04:00
Pavel Veselý
d40c1d9b31 Backslash fix. 2022-09-06 09:14:58 +02:00
Pavel Veselý
b69041d4af Gitignore update 2022-09-06 09:14:42 +02:00
Shaun Walker
64c5d9a09f Merge pull request #2400 from sbwalker/dev
more changes to support Default pane
2022-09-05 15:51:22 -04:00
Shaun Walker
dd170bb41a more changes to support Default pane 2022-09-05 15:49:38 -04:00
Shaun Walker
1e6e4033f8 Merge pull request #2398 from sbwalker/dev
changed UrlParameterTemplate name for consistency
2022-09-04 09:48:48 -04:00
Shaun Walker
01fabc8d9e changed UrlParameterTemplate name for consistency 2022-09-04 09:47:03 -04:00
Shaun Walker
2ca2539b53 Merge pull request #2397 from sbwalker/dev
fix #2366 - populate new UrlParameters property
2022-09-04 09:37:09 -04:00
Shaun Walker
51e2e2966f fix #2366 - populate new UrlParameters property 2022-09-04 09:35:18 -04:00
Shaun Walker
55d02d2db5 Merge pull request #2396 from sbwalker/dev
Fix #2382 - Admin pane improvements
2022-09-02 18:11:51 -04:00
Shaun Walker
282a0b0c44 Fix #2382 - Admin pane improvements 2022-09-02 18:10:13 -04:00
Shaun Walker
8432779b23 Merge pull request #2395 from sbwalker/dev
added public Refresh method to FileManager
2022-09-02 09:12:41 -04:00
Shaun Walker
13b9982461 added public Refresh method to FileManager 2022-09-02 09:11:00 -04:00
Shaun Walker
d76b8cebdc Merge pull request #2389 from sbwalker/dev
Changes for .NET MAUI on Android
2022-08-31 16:35:53 -04:00
Shaun Walker
80315ae6d4 Changes for .NET MAUI on Android 2022-08-31 16:34:14 -04:00
Shaun Walker
95e7344286 Merge pull request #2385 from sbwalker/dev
moved hierarchical ordering logic to server for pages and folders
2022-08-30 07:33:46 -04:00
Shaun Walker
28f73727b5 moved hierarchical ordering logic to server for pages and folders 2022-08-30 07:31:56 -04:00
Shaun Walker
68f5bf5759 Merge pull request #2384 from sbwalker/dev
made folder paths cross platform, introduced file handler for abstracting the serving of files, enabled url mapping for broken file links, resolved public folder deletion issue
2022-08-30 07:23:50 -04:00
Shaun Walker
075748d697 made folder paths cross platform, introduced file handler for abstracting the serving of files, enabled url mapping for broken file links, resolved public folder deletion issue 2022-08-30 07:21:52 -04:00
Shaun Walker
e8d86f94f2 Merge pull request #2376 from sbwalker/dev
fix rootnamespace
2022-08-19 16:12:32 -04:00
Shaun Walker
d6bb802892 fix rootnamespace 2022-08-19 16:10:27 -04:00
Shaun Walker
52680e9002 Merge pull request #2375 from sbwalker/dev
prepare for 3.2.0
2022-08-19 15:59:35 -04:00
Shaun Walker
d6385d82ae prepare for 3.2.0 2022-08-19 15:57:31 -04:00
Shaun Walker
d058de067c Merge pull request #2374 from sbwalker/dev
Prepare for 3.2.0 release
2022-08-19 15:56:39 -04:00
Shaun Walker
32d6d143dd Prepare for 3.2.0 release 2022-08-19 15:54:33 -04:00
Shaun Walker
b49432802b Merge pull request #2373 from sbwalker/dev
Improvements to richtexteditor to allow file management in raw html editor. Also allow disabling of raw html editor which can be utilized via new setting in Html/Text module.
2022-08-19 15:34:43 -04:00
Shaun Walker
99d4d75d8e Improvements to richtexteditor to allow file management in raw html editor. Also allow disabling of raw html editor which can be utilized via new setting in Html/Text module. 2022-08-19 15:32:30 -04:00
Shaun Walker
1f584d57ac Merge pull request #2372 from sbwalker/dev
optimize Url Parameters and implement in Event Log
2022-08-18 16:06:34 -04:00
Shaun Walker
2c1543aa82 optimize Url Parameters and implement in Event Log 2022-08-18 16:04:30 -04:00
Shaun Walker
4390cbbfae Update README.md 2022-08-18 08:35:49 -04:00
Shaun Walker
bbf9e5717e Merge pull request #2370 from sbwalker/dev
improve support for module content editors
2022-08-16 17:27:54 -04:00
Shaun Walker
c7edc28bd9 improve support for module content editors 2022-08-16 17:25:46 -04:00
Shaun Walker
6e0de6f7bf Merge pull request #2369 from sbwalker/dev
check for existence of appsettings.json on Maui
2022-08-16 09:42:14 -04:00
Shaun Walker
3659422165 check for existence of appsettings.json on Maui 2022-08-16 09:40:03 -04:00
Shaun Walker
1af30da44e Merge pull request #2368 from sbwalker/dev
trim list of pages allowed to be Home Page
2022-08-16 08:44:53 -04:00
Shaun Walker
56c082cb26 trim list of pages allowed to be Home Page 2022-08-16 08:42:47 -04:00
Shaun Walker
e8eca582de Merge pull request #2363 from sbwalker/dev
added ability to specify a site home page, updated default template content to include .NET MAUI
2022-08-15 17:03:34 -04:00
Shaun Walker
4084b352de added ability to specify a site home page, updated default template content to include .NET MAUI 2022-08-15 17:01:20 -04:00
Shaun Walker
633e4acf0e Merge pull request #2362 from sbwalker/dev
add Site option for specifying a Hosting Model of Blazor Hybrid
2022-08-15 09:32:42 -04:00
Shaun Walker
468df15d80 add Site option for specifying a Hosting Model of Blazor Hybrid 2022-08-15 09:30:36 -04:00
Shaun Walker
f4537b4fcb Merge pull request #2361 from sbwalker/dev
optimize site router
2022-08-14 11:24:43 -04:00
Shaun Walker
8bca345b45 optimize site router 2022-08-14 11:22:39 -04:00
Shaun Walker
ee80712c77 Merge pull request #2360 from sbwalker/dev
resolve issue with deleted pages and modules caused by refactoring
2022-08-12 18:04:51 -04:00
Shaun Walker
3cf7153f44 resolve issue with deleted pages and modules caused by refactoring 2022-08-12 18:02:45 -04:00
Shaun Walker
8e2fc75e48 Update README.md 2022-08-12 17:09:15 -04:00
Shaun Walker
4aa51c8583 Merge pull request #2359 from sbwalker/dev
performance improvements to reduce http and database interactions
2022-08-12 16:49:59 -04:00
Shaun Walker
3c6ebd7742 performance improvements to reduce http and database interactions 2022-08-12 16:47:51 -04:00
Shaun Walker
b85539dc17 Merge pull request #2358 from sbwalker/dev
add ability to dynamically set module title and visible from components
2022-08-12 13:08:14 -04:00
Shaun Walker
4cae3f02ed add ability to dynamically set module title and visible from components 2022-08-12 13:05:48 -04:00
Shaun Walker
469b436f10 Merge pull request #2356 from dkoeder/dev
Some methods failing in BaseEntityBuilder if Schema is not null.
2022-08-12 10:45:14 -04:00
Shaun Walker
66e3e6729b Merge pull request #2357 from sbwalker/dev
add support for preserving state when loading admin components
2022-08-12 10:45:05 -04:00
Shaun Walker
fc6a794714 add support for preserving state when loading admin components 2022-08-12 10:43:00 -04:00
Darryl Koehn
d75ed3d5ac Update BaseEntityBuilder.cs
Some methods failing in BaseEntityBuilder if Schema is not null.
2022-08-11 16:15:09 -06:00
Shaun Walker
bd0a218214 Merge pull request #2355 from sbwalker/dev
Blazor Hybrid / .NET MAUI support
2022-08-11 17:11:45 -04:00
Shaun Walker
f96129fa37 Blazor Hybrid / .NET MAUI support 2022-08-11 17:09:32 -04:00
Shaun Walker
920418618a Update README.md 2022-08-10 08:30:38 -04:00
Shaun Walker
29247481a6 Merge pull request #2351 from ajahangard/patch-1
#Bug in passing Lifetime property to GenerateToken
2022-08-09 10:47:28 -04:00
Amir Jahangard
773710aeef #Bug in passing Lifetime property to GenerateToken
Audience is passed to GenerateToken instead of Lifetime.
2022-08-09 15:32:52 +04:30
Shaun Walker
d0c8ee57e6 Merge pull request #2348 from sbwalker/dev
Fix satellite assembly loading issue when running on WebAssembly
2022-08-08 10:49:42 -04:00
Shaun Walker
cf2adc7f6a Fix satellite assembly loading issue when running on WebAssembly 2022-08-08 10:47:33 -04:00
Shaun Walker
b621f24540 Merge pull request #2342 from sbwalker/dev
Fix #2336 - error.png path incorrect
2022-08-06 16:27:45 -04:00
Shaun Walker
99be638525 Fix #2336 - error.png path incorrect 2022-08-06 16:27:24 -04:00
Shaun Walker
d35c204e07 Merge pull request #2341 from sbwalker/dev
Fix #2339 - refactor module upgrade logic to  remove requirement on ServerManagerType for modules which have no backend
2022-08-06 16:13:53 -04:00
Shaun Walker
d8b4267668 Fix #2339 - refactor module upgrade logic to remove requirement on ServerManagerType for modules which have no backend 2022-08-06 16:13:28 -04:00
Shaun Walker
3c2f3be451 Merge pull request #2338 from chlupac/TruncateAgent
Truncate UserAgent for save to Visitors table #2337
2022-08-05 09:16:54 -04:00
Pavel Veselý
e846cf8672 Truncate UserAgent for save to Visitors table 2022-08-04 16:14:39 +02:00
Shaun Walker
8804bce6c0 Merge pull request #2331 from sbwalker/dev
add proper translation keys for ActionLink and ActionDialog into RESX for Module Creator template
2022-08-03 08:50:12 -04:00
Shaun Walker
83acda6d05 add proper translation keys for ActionLink and ActionDialog into RESX for Module Creator template 2022-08-03 08:49:47 -04:00
Shaun Walker
063719532f Merge pull request #2328 from sbwalker/dev
include ResourceType attribute in Settings component for external module template
2022-08-02 07:55:38 -04:00
Shaun Walker
7b1b061355 include ResourceType attribute in Settings component for external module template 2022-08-02 07:55:11 -04:00
Shaun Walker
ed4540887e Merge pull request #2326 from leigh-pointer/Bootstrap5.2
Formating issues with Bootstrap 5.2
2022-08-02 07:51:33 -04:00
Shaun Walker
6968476ed0 Merge pull request #2327 from leigh-pointer/ScreenProgess
Added Progress Indicator
2022-08-02 07:50:59 -04:00
Leigh Pointer
5d2c7c3058 Added Progress Indicator
When deleting large blocks of Pages, Modules or Notifications there was currently no visual feedback so added the ModuleInstance.ShowProgressIndicator() and ModuleInstance.HideProgressIndicator() calls to these processes.
2022-08-02 10:37:04 +02:00
Leigh Pointer
e6cb90e545 Formating issues with Bootstrap 5.2 2022-08-02 08:55:42 +02:00
Shaun Walker
ec73f4dbea Merge pull request #2322 from leigh-pointer/Bootstrap5.2
Updated Bootstrap to 5.2
2022-08-01 17:36:10 -04:00
Shaun Walker
4f41a52ee7 Merge pull request #2325 from sbwalker/dev
fix upgrade issue for framework translations, improvements for managing module translations
2022-08-01 17:05:57 -04:00
Shaun Walker
c097956fcb fix upgrade issue for framework translations, improvements for managing module translations 2022-08-01 17:05:18 -04:00
Leigh Pointer
8cbc17ed98 Theme Creator updated to Bootstrap 5.2.0 2022-07-28 20:59:52 +02:00
Leigh Pointer
50d89d0f13 Updated Bootstrap to 5.2
Replaced Bootstrap cloudflare versions and Integrity keys to match 5.2.0
2022-07-28 20:52:11 +02:00
Shaun Walker
7b4d13b73e Merge pull request #2318 from oqtane/master
Merge pull request #2317 from oqtane/dev
2022-07-27 16:16:01 -04:00
Shaun Walker
2909aa1656 Merge pull request #2317 from oqtane/dev
3.1.4 release
2022-07-27 16:15:43 -04:00
Shaun Walker
64131b6764 Update README.md 2022-07-27 08:54:48 -04:00
Shaun Walker
0b78d75a21 Merge pull request #2314 from sbwalker/dev
prepare for 3.1.4 release
2022-07-26 17:22:27 -04:00
Shaun Walker
b35c342960 prepare for 3.1.4 release 2022-07-26 17:22:06 -04:00
Shaun Walker
24c858d379 Merge pull request #2313 from sbwalker/dev
support for module translation download/install
2022-07-26 14:44:25 -04:00
Shaun Walker
b8a31a8be9 support for module translation download/install 2022-07-26 14:44:06 -04:00
Shaun Walker
02c30d6454 Merge pull request #2312 from sbwalker/dev
add ability to supply connection string in Add Site
2022-07-26 10:13:14 -04:00
Shaun Walker
985f003e6d add ability to supply connection string in Add Site 2022-07-26 10:12:54 -04:00
Shaun Walker
98045e1e2e Merge pull request #2311 from sbwalker/dev
introduce ITransientService interface for auto registration of transient services (for DBContexts and Repositories)
2022-07-26 09:42:12 -04:00
Shaun Walker
5762ce58a4 introduce ITransientService interface for auto registration of transient services (for DBContexts and Repositories) 2022-07-26 09:41:42 -04:00
Shaun Walker
2787ee71fc Merge pull request #2310 from sbwalker/dev
Allow for entry of raw connection string during installation
2022-07-26 07:48:29 -04:00
Shaun Walker
e61a6df4d7 Allow for entry of raw connection string during installation 2022-07-26 07:48:04 -04:00
Shaun Walker
0a5c2ecbf5 Merge pull request #2304 from sbwalker/dev
optimize satellite assembly loading based on the new model where all cultures are available
2022-07-21 16:02:48 -04:00
Shaun Walker
6bfab696ad optimize satellite assembly loading based on the new model where all cultures are available 2022-07-21 16:02:23 -04:00
Shaun Walker
928f2dd496 Merge pull request #2302 from chlupac/FileServiceFix
FileService fix
2022-07-20 08:23:41 -04:00
Pavel Veselý
bcf75892f7 FileService fix 2022-07-20 10:39:13 +02:00
Shaun Walker
594761385f Merge pull request #2301 from sbwalker/dev
add Environment to System Info
2022-07-19 14:34:10 -04:00
Shaun Walker
d05fba06ec add Environment to System Info 2022-07-19 14:33:51 -04:00
Shaun Walker
25155b1b38 Merge pull request #2295 from chlupac/AppSettingsFix
Fixed loading of alternative appsettings "appsettings.{env.EnvironmentName}.json"
2022-07-19 14:20:08 -04:00
Shaun Walker
ded6c9c199 Merge pull request #2299 from chlupac/InstallManFix
Fix - InstallationManager crash when package folders are missing
2022-07-19 13:12:43 -04:00
Shaun Walker
c62e6c0045 Merge pull request #2300 from sbwalker/dev
performance optimization for permissions
2022-07-19 10:49:52 -04:00
Shaun Walker
b3feda9fd1 performance optimization for permissions 2022-07-19 10:49:33 -04:00
Pavel Veselý
7ef8e2c8b8 Fix - InstallationManager crash when package folders are missing 2022-07-19 09:42:12 +02:00
Pavel Veselý
d5ff211871 Fixed loading of alternative appsettings "appsettings.{env.EnvironmentName}.json" 2022-07-18 21:34:59 +02:00
Shaun Walker
51c23e3842 Merge pull request #2294 from sbwalker/dev
use package name as a convention for identifying satellite assemblies
2022-07-18 13:14:53 -04:00
Shaun Walker
557b30815e use package name as a convention for identifying satellite assemblies 2022-07-18 13:14:34 -04:00
Shaun Walker
145459bfc3 Merge pull request #2292 from sbwalker/dev
Added version to Language Management, improved framework performance by loading languages into PageState, include all supported cultures and allow Administrator to add any language to a site regardless of translation availability, fix translation upgrade issue
2022-07-16 10:00:20 -04:00
Shaun Walker
f97a6a2bee Added version to Language Management, improved framework performance by loading languages into PageState, include all supported cultures and allow Administrator to add any language to a site regardless of translation availability, fix translation upgrade issue 2022-07-16 09:59:47 -04:00
Shaun Walker
1134422891 Merge pull request #2291 from sbwalker/dev
Fix #2282 - dynamically determine framework path when scaffolding project references
2022-07-15 16:00:23 -04:00
Shaun Walker
6012275c7b Fix #2282 - dynamically determine framework path when scaffolding project references 2022-07-15 15:59:55 -04:00
Shaun Walker
2f07063375 Merge pull request #2288 from sbwalker/dev
Fix #2285 - handle scenario where the module definition associated to a module instance does not exist
2022-07-14 16:58:43 -04:00
Shaun Walker
310d1ed485 Fix #2285 - handle scenario where the module definition associated to a module instance does not exist 2022-07-14 16:58:16 -04:00
Shaun Walker
a48edbb16e Merge pull request #2287 from sbwalker/dev
fixed issue in default site template where MIT License module was being created in invalid pane
2022-07-14 09:11:16 -04:00
Shaun Walker
d6258409fc fixed issue in default site template where MIT License module was being created in invalid pane 2022-07-14 09:10:51 -04:00
Shaun Walker
1b94b1247b Merge pull request #2284 from sbwalker/dev
Fix #2280 - add 404 page on upgrade, Fix #2279 add message indicating a restart is required to activate scheduled jobs after installation, add Package Name to Module and Theme management
2022-07-13 15:19:07 -04:00
Shaun Walker
9ef63ae60e Fix #2280 - add 404 page on upgrade, Fix #2279 add message indicating a restart is required to activate scheduled jobs after installation, add Package Name to Module and Theme management 2022-07-13 15:18:41 -04:00
Shaun Walker
f99de4be48 Merge pull request #2272 from sbwalker/dev
Support for module editors by exposing Edit Mode in the Control Panel
2022-07-06 17:25:43 -04:00
Shaun Walker
80fd1820c2 Support for module editors by exposing Edit Mode in the Control Panel 2022-07-06 17:25:08 -04:00
Shaun Walker
0a4a983d20 Merge pull request #2269 from leigh-pointer/Resx
Added Missing Resource from Oqtane Theme Settings
2022-07-06 08:37:25 -04:00
Leigh Pointer
c2cc830691 Added Missing Resource from Oqtane Theme Settings
Missing Resource string added
2022-07-04 21:37:42 +02:00
Shaun Walker
4d0490d1c6 Merge pull request #2260 from sbwalker/dev
FIx issue with redirect after site delete and remove tenant if it is empty
2022-06-28 08:17:39 -04:00
Shaun Walker
02d1838547 FIx issue with redirect after site delete and remove tenant if it is empty 2022-06-28 08:17:06 -04:00
Shaun Walker
5c6edff778 Update README.md 2022-06-27 16:35:50 -04:00
Shaun Walker
7cbca32ddd Update README.md 2022-06-27 16:16:58 -04:00
Shaun Walker
8950e315f8 Merge pull request #2258 from oqtane/master
Merge pull request #2257 from oqtane/dev
2022-06-27 16:12:27 -04:00
Shaun Walker
a703df40c0 Merge pull request #2257 from oqtane/dev
3.1.3 release
2022-06-27 16:12:05 -04:00
Shaun Walker
225fce8810 Merge pull request #2256 from sbwalker/dev
3.1.3 data provider packages
2022-06-27 15:43:42 -04:00
Shaun Walker
bdc0f0fcdd 3.1.3 data provider packages 2022-06-27 15:43:24 -04:00
Shaun Walker
5bbb8c4858 Merge pull request #2255 from sbwalker/dev
Add schema support to BaseEntityBuilder
2022-06-27 13:55:08 -04:00
Shaun Walker
35b9551bfb Add schema support to BaseEntityBuilder 2022-06-27 13:54:52 -04:00
Shaun Walker
c8c5a05b39 Merge pull request #2254 from sbwalker/dev
Fix #2249 Fix #2250 - issues with site deletion
2022-06-27 13:46:02 -04:00
Shaun Walker
2771f0301a Fix #2249 Fix #2250 - issues with site deletion 2022-06-27 13:45:42 -04:00
Shaun Walker
c4f04edc59 Merge pull request #2253 from sbwalker/dev
Fix #2252 - unable to insert images into rich text editor
2022-06-27 12:24:16 -04:00
Shaun Walker
5530422846 Fix #2252 - unable to insert images into rich text editor 2022-06-27 12:23:55 -04:00
Shaun Walker
ce77c81fb5 Merge pull request #2248 from sbwalker/dev
prepare for 3.1.3
2022-06-21 09:25:33 -04:00
Shaun Walker
bc488d4ac2 prepare for 3.1.3 2022-06-21 09:25:14 -04:00
Shaun Walker
fe72a10346 Merge pull request #2247 from sbwalker/dev
fix #2239 - email notification encoding to support all cultures
2022-06-20 19:42:50 -04:00
Shaun Walker
0da88398b4 fix #2239 - email notification encoding to support all cultures 2022-06-20 19:42:32 -04:00
Shaun Walker
c42de3da20 Merge pull request #2246 from sbwalker/dev
fix #2245 - default database type not set correctly when adding new site for any DB other than LocalDB, added Source: info to all extension installation scenarios now that the Registry supports both Nuget and GitHub locations
2022-06-20 17:45:10 -04:00
Shaun Walker
4bf9f36baa fix #2245 - default database type not set correctly when adding new site for any DB other than LocalDB, added Source: info to all extension installation scenarios now that the Registry supports both Nuget and GitHub locations 2022-06-20 17:44:49 -04:00
Shaun Walker
380cb192c7 Merge pull request #2244 from sbwalker/dev
allow multiple aliases to be defined as default
2022-06-18 09:18:47 -04:00
Shaun Walker
8882e19ec5 allow multiple aliases to be defined as default 2022-06-18 09:18:23 -04:00
Shaun Walker
7f52059b98 Merge pull request #2243 from sbwalker/dev
added extension method for creating a LocalizerFactory using a type name, refactored Pager and LocalizableComponent to use LocalizerFactory
2022-06-15 16:19:51 -04:00
Shaun Walker
1ce3cc4d7c added extension method for creating a LocalizerFactory using a type name, refactored Pager and LocalizableComponent to use LocalizerFactory 2022-06-15 16:19:22 -04:00
Shaun Walker
657c71e94d Merge pull request #2242 from leigh-pointer/Issue#2234
Fix for Recycle bin not showing Deleted Date (Issue #2234)
2022-06-14 10:26:50 -04:00
Leigh Pointer
c8cfb3c7b7 Fix for Recycle bin not showing Deleted Date (Issue #2234)
Added the Deleted data to Module from the PageModule
2022-06-14 09:22:12 +02:00
Shaun Walker
6e7e90acf4 Merge pull request #2241 from sbwalker/dev
additional changes for #2228
2022-06-13 09:10:20 -04:00
Shaun Walker
6d3a556d34 additional changes for #2228 2022-06-13 09:10:01 -04:00
Shaun Walker
7d9188b659 Merge pull request #2238 from chlupac/LogExceptions
Exception is not saved to log
2022-06-09 15:13:10 -04:00
Pavel Vesely
4f0a805c79 Exception is not saved to log 2022-06-09 10:24:13 +02:00
Shaun Walker
53f3320492 Merge pull request #2228 from chlupac/Log_notification_improvement
Log notification improvement
2022-06-08 15:48:17 -04:00
Shaun Walker
f9ce51b4a5 Merge pull request #2222 from hishamco/pager
Pager should inherits from LocalizableComponent
2022-06-08 15:47:25 -04:00
Shaun Walker
f8bf432c0d Merge pull request #2237 from sbwalker/dev
Improvements for #2229 - relax userrole restrictions
2022-06-08 15:47:12 -04:00
Shaun Walker
a822482172 Improvements for #2229 - relax userrole restrictions 2022-06-08 15:46:36 -04:00
Hisham Bin Ateya
b22f8a0b02 Remove generic type suffix properly 2022-06-08 00:12:10 +03:00
Hisham Bin Ateya
227331bf24 Merge branch 'dev' into pager 2022-06-07 23:37:08 +03:00
Shaun Walker
744688cbe1 Merge pull request #2235 from sbwalker/dev
Fix #2230 - add support for an Unauthenticated User global role
2022-06-07 15:26:05 -04:00
Shaun Walker
79c8126c4a Fix #2230 - add support for an Unauthenticated User global role 2022-06-07 15:25:44 -04:00
Shaun Walker
0b7c8e4ef7 Merge pull request #2232 from ijaz-saeed/dev
missing translation keys for module names
2022-06-07 15:23:08 -04:00
Shaun Walker
35e00f61d8 Update README.md 2022-06-07 09:38:42 -04:00
isaeed
aba3d58df8 missing translation keys for module names 2022-06-06 10:12:00 +05:00
Shaun Walker
45984a8166 Merge pull request #2231 from sbwalker/dev
Improvements for #2221 - validate file extensions client-side before initiating upload, validate file extension server-side before writing part to disk, optimize part cleanup logic, add error handling to JavaScript XMLHttpRequest, ensure FileInput gets initialized after upload
2022-06-04 15:41:38 -04:00
Shaun Walker
ea5655ae42 Improvements for #2221 - validate file extensions client-side before initiating upload, valid file extension server-side before writing part to disk, optimize cleanup logic, add error handling to JavaScript XMLHttpRequest, ensure FileInput gets initialized after upload 2022-06-04 15:40:26 -04:00
Pavel Vesely
f06cb0dfbb Log notification improvement 2022-05-31 11:33:42 +02:00
Hisham Bin Ateya
1abae55976 Remove magic string 2022-05-31 11:59:17 +03:00
Hisham Bin Ateya
a83ed40ec4 Avoid breaking changes 2022-05-31 10:40:42 +03:00
Shaun Walker
75ecae4672 Merge pull request #2223 from hishamco/toggle-password
Avoid toggle password & confirm password as same time when one button is clicked
2022-05-28 21:59:40 -04:00
Hisham Bin Ateya
16a6f942c5 Avoid toggle password & confirm password as same time when one button is clicked 2022-05-27 16:20:35 +03:00
Hisham Bin Ateya
aa98508e57 Remove the entry from SharedResources 2022-05-27 15:37:13 +03:00
Hisham Bin Ateya
583383aee1 Pager should inherits from LocalizableComponent 2022-05-27 15:33:48 +03:00
Shaun Walker
13f69f81d7 Merge pull request #2219 from sbwalker/dev
fix #2213 - disabling show on all pages
2022-05-26 01:19:35 -04:00
Shaun Walker
43c34fcd64 fix #2213 - disabling show on all pages 2022-05-26 01:19:14 -04:00
Shaun Walker
c272238539 Merge pull request #2217 from leigh-pointer/MissingRes2215
Fix for missing Resx entries #2215
2022-05-25 07:23:01 -04:00
Leigh Pointer
6e0d2706a8 Fix for missing Resx entries #2215
Updated the Resx File with the missing entries.  

However the UserProfile\Add cant be Localized at present as the IStringLocalizer is not loaded when that property assignment is executed.
2022-05-25 11:13:38 +02:00
Shaun Walker
25a7289ce8 Merge pull request #2210 from leigh-pointer/PageOf
Fix for #2209 Localization Pager component (Page @_page of @_pages)
2022-05-24 21:47:12 -04:00
Shaun Walker
1ba7d045e4 Merge pull request #2211 from elgransan/dev
* Collapse menu after click on a page (mobile version)
2022-05-24 21:46:11 -04:00
Santiago Cattaneo
a4d75befe7 * Collapse menu after click on a page (mobile version) 2022-05-22 20:05:01 -03:00
Leigh Pointer
88377529bc Fix for #2209 Localization Pager component (Page @_page of @_pages)
Added fixe for issue.  Added the resource "PageOfPages" to SharedResources as trying to inject IStringLocalizer<Pager<TableItem>> and adding Pager.resx the resource failed to load.
2022-05-22 20:23:17 +02:00
Shaun Walker
91b9a0280f Merge pull request #2207 from sbwalker/dev
Add filtering by Category to Module Management - default to Common
2022-05-21 10:11:24 -04:00
Shaun Walker
25173ae85c Ddd filtering by Category to Module Management - default to Common 2022-05-21 10:10:57 -04:00
Shaun Walker
ad3350705e Update README.md 2022-05-19 11:44:38 -04:00
Shaun Walker
a16bc5db28 Merge pull request #2200 from oqtane/master
Merge pull request #2199 from oqtane/dev
2022-05-14 09:49:24 -04:00
Shaun Walker
51657338f5 Merge pull request #2199 from oqtane/dev
3.1.2 release
2022-05-14 09:48:59 -04:00
Shaun Walker
0fe3ea25af Merge pull request #2198 from sbwalker/dev
remove columns from main user management view  and migrate them to edit view
2022-05-13 17:00:32 -04:00
Shaun Walker
806daaf7c9 remove columns from main user management view and migrate them to edit view 2022-05-13 17:00:10 -04:00
Shaun Walker
21ff4a83b5 Merge pull request #2197 from sbwalker/dev
resolve login issue related to 'LoginOptions:TwoFactor' and order list of files alphabetically
2022-05-13 12:03:57 -04:00
Shaun Walker
ecc9aa40d7 resolve login issue related to 'LoginOptions:TwoFactor' and order list of files alphabetically 2022-05-13 12:03:34 -04:00
Shaun Walker
c34ca2a59b Merge pull request #2196 from sbwalker/dev
prepare for 3.1.2
2022-05-12 20:55:26 -04:00
Shaun Walker
dde7094fe3 prepare for 3.1.2 2022-05-12 20:55:11 -04:00
Shaun Walker
105afdfefc Merge pull request #2195 from sbwalker/dev
fix #2192 - Adding a new site fails
2022-05-12 20:42:20 -04:00
Shaun Walker
4c254a8686 fix #2192 - Adding a new site fails 2022-05-12 20:42:05 -04:00
Shaun Walker
33ca203e57 Merge pull request #2194 from sbwalker/dev
updated resource file
2022-05-12 13:56:01 -04:00
Shaun Walker
2ff4133cd4 updated resource file 2022-05-12 13:55:47 -04:00
Shaun Walker
49ad85713e Merge pull request #2193 from sbwalker/dev
add support for external login parameters and improve diagnostic messages related to claims
2022-05-12 13:52:06 -04:00
Shaun Walker
1978bf151f add support for external login parameters and improve diagnostic messages related to claims 2022-05-12 13:51:46 -04:00
Shaun Walker
506378de82 Merge pull request #2191 from sbwalker/dev
fix #2185 - alias auto registration including trailing slash
2022-05-10 08:03:55 -04:00
Shaun Walker
53ead7a03f fix #2185 - alias auto registration including trailing slash 2022-05-10 08:03:38 -04:00
Shaun Walker
ab979fd63c Merge pull request #2189 from sbwalker/dev
fix #2180 - Error in Module Creator if the template is not set
2022-05-09 11:35:17 -04:00
Shaun Walker
1e84a2238b fix #2180 - Error in Module Creator if the template is not set 2022-05-09 11:35:01 -04:00
Shaun Walker
5618adf86c Merge pull request #2187 from sbwalker/dev
fix #2182 - modifications to address MySQL compatibility issues
2022-05-08 22:14:54 -04:00
Shaun Walker
345b0bc95f fix #2182 - modifications to address MySQL compatibility issues 2022-05-08 22:14:26 -04:00
Shaun Walker
b1d6c35e99 Merge pull request #2183 from leigh-pointer/UserEmail
Args not in sink
2022-05-06 11:43:59 -04:00
Leigh Pointer
d767f1a101 Args not in sink
The Display name and email address  not is the correct order!
2022-05-06 12:43:40 +02:00
Shaun Walker
c15f2b9a12 Merge pull request #2178 from leigh-pointer/UserEmail
Added the User Email field to the List
2022-05-05 17:14:08 -04:00
Leigh Pointer
a21a53662b Update for real-estate
Removed Name
Removed Seconds from DateTime fields
Added Name to the Email link
2022-05-05 16:35:43 +02:00
Shaun Walker
ebb5340019 Merge pull request #2177 from leigh-pointer/NotIficationDateFormat
Updated the CreatedOn date format
2022-05-05 10:13:24 -04:00
Shaun Walker
6108bd214e Merge pull request #2179 from sbwalker/dev
fix #2176 - update LastIPAddress correctly during login
2022-05-05 09:57:26 -04:00
Shaun Walker
eed27e101a fix #2176 - update LastIPAddress correctly during login 2022-05-05 09:57:09 -04:00
Leigh Pointer
2767680bed Added the User Email field to the List
Added the formatted email address of the user to the list view.
2022-05-05 13:25:35 +02:00
Leigh Pointer
4080e30b6f Updated the CreatedOn date format
Updated the format to a more readable format of dd-MMM-yyyy
2022-05-05 13:07:09 +02:00
Shaun Walker
e89257be62 Merge pull request #2174 from sbwalker/dev
fix #2172 - File Upload issue caused by JS Interop not passing AntiForgery token in POST method
2022-05-04 17:15:10 -04:00
Shaun Walker
d3c40a7e8b fix #2172 - File Upload issue caused by JS Interop not passing AntiForgery token in POST methid 2022-05-04 17:14:45 -04:00
Shaun Walker
60657d5d25 Update README.md 2022-05-03 08:13:34 -04:00
Shaun Walker
71d5ae0e68 Merge pull request #2169 from oqtane/master
Merge pull request #2168 from oqtane/dev
2022-05-03 08:08:51 -04:00
Shaun Walker
46b8d202c7 Merge pull request #2168 from oqtane/dev
3.1.1 release
2022-05-03 08:08:34 -04:00
Shaun Walker
bc193a6470 Merge pull request #2167 from sbwalker/dev
remove custom module assets not part of framework
2022-05-03 07:54:30 -04:00
Shaun Walker
577528fa0a remove custom module assets not part of framework 2022-05-03 07:54:14 -04:00
Shaun Walker
35e78ea633 Merge pull request #2166 from sbwalker/dev
3.1.1 database providers, default module creator version to local install version
2022-05-02 17:08:56 -04:00
Shaun Walker
d5d4f85003 3.1.1 database providers, default module creator version to local install version 2022-05-02 17:08:29 -04:00
Shaun Walker
c6a49a6f5d Merge pull request #2164 from sbwalker/dev
enhance UserRole service with filtering and moved workload to server for better performance, improve error message details during installation
2022-04-29 21:39:36 -04:00
Shaun Walker
a3ff9373a2 enhance UserRole service with filtering and moved workload to server for better performance, improve error message details during installation 2022-04-29 21:39:11 -04:00
Shaun Walker
e6d2e74b17 Merge pull request #2162 from sbwalker/dev
refactor module upgrade logic, implement for themes and translations
2022-04-27 19:29:49 -04:00
Shaun Walker
e8464206e7 refactor module upgrade logic, implement for themes and translations 2022-04-27 19:29:29 -04:00
Shaun Walker
b6c4934123 Merge pull request #2161 from 2sic-forks/dev
Fix #2160 - upgrade module option
2022-04-27 15:03:46 -04:00
Tonći Vatavuk
8ee83f738b fix# https://github.com/oqtane/oqtane.framework/issues/2160 2022-04-27 17:44:54 +02:00
Shaun Walker
c359300375 Merge pull request #2158 from sbwalker/dev
fix path on app-stylesheets
2022-04-26 16:34:08 -04:00
Shaun Walker
eb3361fa07 fix path on app-stylesheets 2022-04-26 16:33:50 -04:00
Shaun Walker
1b53da6749 Merge pull request #2155 from sbwalker/dev
external login improvements
2022-04-25 20:05:03 -04:00
Shaun Walker
c701895e29 external login improvements 2022-04-25 20:04:43 -04:00
Shaun Walker
e81222821e Merge pull request #2153 from sbwalker/dev
prepare for 3.1.1 release
2022-04-24 20:20:02 -04:00
Shaun Walker
cbca8c9e93 prepare for 3.1.1 release 2022-04-24 20:19:44 -04:00
Shaun Walker
92c4edacf2 Merge pull request #2152 from sbwalker/dev
completed antiforgery implementation, improved external login claim mapping, principal construction, and user experience
2022-04-22 17:54:49 -04:00
Shaun Walker
e4c648ee92 completed antiforgery implementation, improved external login claim mapping, principal construction, and user experience 2022-04-22 17:54:20 -04:00
Shaun Walker
69f6586aa9 Merge pull request #2149 from sbwalker/dev
Fix #2144 - install issue, Fix #2146 - move file issue, require verification of external login account linkage
2022-04-20 16:01:21 -04:00
Shaun Walker
391713b84d Fix #2144 - install issue, Fix #2146 - move file issue, require verification of external login account linkage 2022-04-20 16:00:58 -04:00
Shaun Walker
8c6a25e4b4 Merge pull request #2140 from sbwalker/dev
remove web.release.config as it causes installation issues in pure .net core environments (see #1957)
2022-04-15 09:23:14 -04:00
Shaun Walker
250701aff0 remove web.release.config as it causes installation issues in pure .net core environments (see #1957) 2022-04-15 09:22:51 -04:00
Shaun Walker
2dfd1bd5a2 Merge pull request #2139 from sbwalker/dev
removed method-level [ValidateAntiForgeryToken] attribute as it is now handled by global AutoValidateAntiforgeryTokenFilter, adjusted gitignore to improve filtering of Module and Theme folders in wwwroot and exclude all files in Oqtane.Server/Data
2022-04-15 08:02:04 -04:00
Shaun Walker
1c7380d4cf removed method-level [ValidateAntiForgeryToken] attribute as it is now handled by global AutoValidateAntiforgeryTokenFilter, adjusted gitignore to improve filtering of Module and Theme folders in wwwroot and exclude all files in Oqtane.Server/Data 2022-04-15 08:01:32 -04:00
Shaun Walker
68d9ac88b3 Merge pull request #2138 from sbwalker/dev
create separate API methods for tokens (short-lived) and personal access tokens (long-lived), include global antiforgery filter to mitigate XSRF when using cookie auth (ignored when using Jwt)
2022-04-14 19:42:24 -04:00
Shaun Walker
f6b3874668 create separate API methods for tokens (short-lived) and personal access tokens (long-lived), include global antiforgery filter to mitigate XSRF when using cookie auth (ignored when using Jwt) 2022-04-14 19:41:43 -04:00
Shaun Walker
c616878a64 Merge pull request #2134 from leigh-pointer/TogglePassword
User Areas to use the Toggle Password method
2022-04-14 08:58:59 -04:00
Shaun Walker
ad485a68ce Merge pull request #2136 from leigh-pointer/UsersCreatedOn
Added CreatedOn class "align-middle" to RowClass
2022-04-14 08:58:49 -04:00
Leigh Pointer
2ebba3b8e7 Added CreatedOn class "align-middle" to RowClass 2022-04-14 14:52:34 +02:00
Shaun Walker
4117e6e1c5 Merge pull request #2135 from sbwalker/dev
Fix #2128 - site settings validation issue when logged in as Administrator (not Host)
2022-04-14 08:31:29 -04:00
Shaun Walker
423ee04879 Fix #2128 - site settings validation issue when logged in as Administrator (not Host) 2022-04-14 08:30:55 -04:00
Leigh Pointer
1625e3ba6c User Areas to use the Toggle Password method
Updated the Components where the Password is required to allow toggle show / hide
2022-04-14 13:47:27 +02:00
Shaun Walker
5a71ab3c20 Merge pull request #2130 from leigh-pointer/LastLoggedIn
Update to User Management
2022-04-13 19:31:10 -04:00
Shaun Walker
b5833bf556 Merge pull request #2129 from leigh-pointer/NotificationDelAll
Allow the deletion of all Notifications
2022-04-13 19:28:37 -04:00
Shaun Walker
6c31765965 Merge pull request #2132 from sbwalker/dev
fix #2125 - cannot login using WebAssembly, remove granular 404 logging as it is already managed by url mapping, make IModule ReleaseVersions optional when using EF Core migrations
2022-04-13 19:27:35 -04:00
Shaun Walker
6dc1d42d90 fix #2125 - cannot login using WebAssembly, remove granular 404 logging as it is already managed by url mapping, make IModule ReleaseVersions optional when using EF Core migrations 2022-04-13 19:27:12 -04:00
Leigh Pointer
e273a954e6 Update to User Management
Updated user management to display more of the User ; Last Login Last IP and Is Authenticated.
2022-04-13 15:24:28 +02:00
Leigh Pointer
a602a942c4 Allow the deletion of all Notifications
Added button to delete all the notifications for the selected filter.
2022-04-13 14:33:30 +02:00
Shaun Walker
dd32b33621 Merge pull request #2124 from sbwalker/dev
minor improvements to security features, use ActivatorUtilities.CreateInstance with SiteMigration to enable simpler DI
2022-04-12 07:47:10 -04:00
Shaun Walker
355d0405f4 minor improvements to security features, use ActivatorUtilities.CreateInstance with SiteMigration to enable simpler DI 2022-04-12 07:46:43 -04:00
Shaun Walker
c1e1595d58 Update README.md 2022-04-11 08:30:24 -04:00
Shaun Walker
ef476ac9b3 Update README.md 2022-04-11 07:56:10 -04:00
Shaun Walker
a7aaa7b18b Merge pull request #2116 from sbwalker/dev
Fix #2111 - Adding user to Host role removes all other users roles
2022-04-05 17:11:29 -04:00
Shaun Walker
3abfbab5d1 Fix #2111 - Adding user to Host role removes all other users roles 2022-04-05 17:11:13 -04:00
Shaun Walker
b158474e21 Merge pull request #2113 from oqtane/master
Merge pull request #2112 from oqtane/dev
2022-04-05 08:51:40 -04:00
Shaun Walker
cfbcc41543 Merge pull request #2112 from oqtane/dev
3.1.0 release
2022-04-05 08:51:10 -04:00
Shaun Walker
fec0a02b1c Update README.md 2022-04-04 17:17:12 -04:00
Shaun Walker
3d93ba1215 Merge pull request #2110 from sbwalker/dev
fix logic issue in url mapping, improve 404 handling, add property change component notifications
2022-04-04 17:16:37 -04:00
Shaun Walker
042083c0e7 fix logic issue in url mapping, improve 404 handling, add property change component notifications 2022-04-04 17:16:12 -04:00
Shaun Walker
e0bb7b7faf Merge pull request #2108 from alperenbelgic/patch-1
Broken link fixed in Readme
2022-04-04 15:35:44 -04:00
Shaun Walker
acc4099ac8 Merge pull request #2109 from sbwalker/dev
dogfooding fixes
2022-04-04 10:54:50 -04:00
Shaun Walker
683ad8959a dogfooding fixes 2022-04-04 10:53:40 -04:00
Alperen Belgic
a559c771cf Broken link fixed in Readme 2022-04-04 14:37:58 +01:00
Shaun Walker
8ba0ebf955 Update README.md 2022-04-04 09:08:32 -04:00
Shaun Walker
d83ec1827a Update README.md 2022-04-02 11:28:04 -04:00
Shaun Walker
314e49f5e1 Merge pull request #2106 from sbwalker/dev
adopt more of the migrations conventions
2022-04-02 11:25:03 -04:00
Shaun Walker
412b139796 adopt more of the migrations conventions 2022-04-02 11:24:41 -04:00
Shaun Walker
9b29487934 Update README.md 2022-04-02 11:12:03 -04:00
Shaun Walker
95213e41c4 Merge pull request #2105 from sbwalker/dev
replace startswith with equality to handle site subfolders
2022-04-02 11:09:01 -04:00
Shaun Walker
644ddfd5e1 replace startswith with equality to handle site subfolders 2022-04-02 11:08:38 -04:00
Shaun Walker
68dd9900c4 Merge pull request #2104 from sbwalker/dev
fix installation CSS issue
2022-04-02 09:29:38 -04:00
Shaun Walker
6b100cf70b fix installation CSS issue 2022-04-02 09:29:12 -04:00
Shaun Walker
6f33e5e8a0 Merge pull request #2103 from sbwalker/dev
refactored IUpgradeable to use the migration attribute approach
2022-04-02 09:19:50 -04:00
Shaun Walker
268e0e72a3 refactored IUpgradeable to use the migration attribute approach 2022-04-02 09:19:30 -04:00
Shaun Walker
5380b12294 Merge pull request #2102 from sbwalker/dev
allow for multiple upgrade classes
2022-04-01 18:07:13 -04:00
Shaun Walker
2ba1a95c8d allow for multiple upgrade classes 2022-04-01 18:06:59 -04:00
Shaun Walker
1ad0ee4a71 Merge pull request #2101 from sbwalker/dev
include theme resources on server page load, add IUpgradeable interface to provide site-based versioning support
2022-04-01 17:57:52 -04:00
Shaun Walker
fc12903cfd include theme resources on server page load, add IUpgradeable interface to provide site-based versioning support 2022-04-01 17:57:30 -04:00
Shaun Walker
640d22484d Merge pull request #2099 from leigh-pointer/ExternalMod
Updated Package reference to align with 3.1.0
2022-04-01 08:58:04 -04:00
Shaun Walker
34dc4d64e6 Merge pull request #2100 from sbwalker/dev
fix issue with the disabled link tags
2022-04-01 08:51:28 -04:00
Shaun Walker
bbb547efb6 fix issue with the disabled link tags 2022-04-01 08:51:08 -04:00
Leigh Pointer
5b3640e23d Theme Template updated to 3.1.0 2022-04-01 12:56:28 +02:00
Leigh Pointer
0fbbe244d8 Updated Package reference to align with 3.1.0 2022-04-01 12:53:55 +02:00
Shaun Walker
57def7da0c Merge pull request #2098 from sbwalker/dev
filter deleted pages and modules in the router, provide support for cascading aspect of style sheets, replace ResourceDeclaration concept with ResourceLevel
2022-03-31 21:06:25 -04:00
Shaun Walker
0fcf1c2732 filter deleted pages and modules in the router, provide support for cascading aspect of style sheets, replace ResourceDeclaration concept with ResourceLevel 2022-03-31 21:05:58 -04:00
Shaun Walker
c15b6cdf79 Merge pull request #2096 from sbwalker/dev
hide/show secure fields
2022-03-31 09:00:28 -04:00
Shaun Walker
06e25e04f8 hide/show secure fields 2022-03-31 09:00:13 -04:00
Shaun Walker
f8e04656cd Merge pull request #2095 from sbwalker/dev
better seperation of concerns
2022-03-31 08:35:29 -04:00
Shaun Walker
1c8debd894 better seperation of concerns 2022-03-31 08:35:11 -04:00
Shaun Walker
58d8fcd074 Merge pull request #2094 from sbwalker/dev
cleanup
2022-03-30 22:08:48 -04:00
Shaun Walker
a70f1ee1e0 cleanup 2022-03-30 22:08:32 -04:00
Shaun Walker
271ed3cbe2 Merge pull request #2093 from sbwalker/dev
fix registration
2022-03-30 08:10:56 -04:00
Shaun Walker
8ddaf57e17 fix registration 2022-03-30 08:10:42 -04:00
Shaun Walker
4f1ead116f Merge pull request #2092 from sbwalker/dev
remote service support via Jwt
2022-03-30 08:07:18 -04:00
Shaun Walker
3194c5b600 remote service support via Jwt 2022-03-30 08:07:03 -04:00
Shaun Walker
717f1a9b76 Merge pull request #2089 from sbwalker/dev
jwt changes
2022-03-29 08:39:01 -04:00
Shaun Walker
b7675a21eb jwt changes 2022-03-29 08:38:46 -04:00
Shaun Walker
b0d4c0d578 Merge pull request #2088 from sbwalker/dev
jwt improvements
2022-03-29 08:15:27 -04:00
Shaun Walker
b7a1d2df75 jwt improvements 2022-03-29 08:15:13 -04:00
Shaun Walker
5d31d33804 Merge pull request #2087 from sbwalker/dev
add Jwt authorization support for for API
2022-03-28 21:52:14 -04:00
Shaun Walker
a97af42e4b add Jwt authorization support for for API 2022-03-28 21:51:55 -04:00
Shaun Walker
17c6797afb Merge pull request #2086 from sbwalker/dev
cleanly separate SiteState service for client and server use cases
2022-03-27 21:06:08 -04:00
Shaun Walker
c8129607e8 cleanly separate SiteState service for client and server use cases 2022-03-27 21:05:44 -04:00
Shaun Walker
c2dce38bb1 Merge pull request #2085 from sbwalker/dev
fix #2082 - missing SiteId causing password reset notifications to not be created
2022-03-27 20:02:47 -04:00
Shaun Walker
8b0b7492f5 fix #2082 - missing SiteId causing password reset notifications to not be created 2022-03-27 20:02:19 -04:00
Shaun Walker
a25cfd87cc Merge pull request #2084 from sbwalker/dev
remove SiteSettings from Alias for better separation of concerns
2022-03-27 19:48:14 -04:00
Shaun Walker
f9432acf1b remove SiteSettings from Alias for better separation of concerns 2022-03-27 19:47:52 -04:00
Shaun Walker
c6c468c986 Merge pull request #2081 from sbwalker/dev
factor out auth constants, remove TAlias is Alias is not an extensible type, improve SiteOptions cache clearing, improve principal validation, localization improvements
2022-03-26 17:30:32 -04:00
Shaun Walker
b92a888583 factor out auth constants, remove TAlias is Alias is not an extensible type, improve SiteOptions cache clearing, improve principal validation, localization improvements 2022-03-26 17:30:06 -04:00
Shaun Walker
692b4b33fb Merge pull request #2079 from sbwalker/dev
consolidate user creation
2022-03-24 12:33:02 -04:00
Shaun Walker
79f427e10a consolidate user creation 2022-03-24 12:32:41 -04:00
Shaun Walker
340b3e7fe8 Merge pull request #2077 from sbwalker/dev
login localization
2022-03-23 17:19:18 -04:00
Shaun Walker
50a44c9416 login localization 2022-03-23 17:19:02 -04:00
Shaun Walker
3c41493d8e Merge pull request #2076 from sbwalker/dev
prepare for 3.1 release
2022-03-23 15:04:26 -04:00
Shaun Walker
4566ea436c prepare for 3.1 release 2022-03-23 15:04:03 -04:00
Shaun Walker
499bf3bc28 Update README.md 2022-03-23 10:58:44 -04:00
Shaun Walker
489a321763 Merge pull request #2075 from sbwalker/dev
Add OAuth2 support
2022-03-23 10:52:20 -04:00
Shaun Walker
9d86d923aa Add OAuth2 support 2022-03-23 10:51:52 -04:00
Shaun Walker
454529bd6a Merge pull request #2074 from sbwalker/dev
Allow Email Claim Type to be configurable
2022-03-21 16:29:45 -04:00
Shaun Walker
ca17dd3ca3 Allow Email Claim Type to be configurable 2022-03-21 16:29:28 -04:00
Shaun Walker
71c7a3de69 Merge pull request #2073 from sbwalker/dev
Add scheme to Redirect Url
2022-03-21 10:50:19 -04:00
Shaun Walker
76fc689337 Add scheme to Redirect Url 2022-03-21 10:50:01 -04:00
Shaun Walker
af5d25490a Merge pull request #2072 from sbwalker/dev
OIDC improvements
2022-03-21 10:39:51 -04:00
Shaun Walker
fb161ae783 OIDC improvements 2022-03-21 10:39:35 -04:00
Shaun Walker
b92b20e8d2 Merge pull request #2071 from sbwalker/dev
OIDC improvements
2022-03-21 09:12:40 -04:00
Shaun Walker
4b19059df1 OIDC improvements 2022-03-21 09:12:18 -04:00
Shaun Walker
baa6ec5cba Merge pull request #2069 from sbwalker/dev
More improvements to OIDC support
2022-03-19 13:42:37 -04:00
Shaun Walker
1a86b80c61 More improvements to OIDC support 2022-03-19 13:42:19 -04:00
Shaun Walker
3783da3647 Merge pull request #2067 from sbwalker/dev
OIDC improvements
2022-03-16 17:28:51 -04:00
Shaun Walker
39dfc00693 OIDC improvements 2022-03-16 17:28:32 -04:00
Shaun Walker
c7cad20aa7 Merge pull request #2065 from sbwalker/dev
Resolved issue in TenantManager resulting in "No database provider has been configured for this DbContext" error being logged during startup. Added logic to update email address in AspNetUsers when updating a User.
2022-03-16 09:54:39 -04:00
Shaun Walker
5901365e0e Resolved issue in TenantManager resulting in "No database provider has been configured for this DbContext" error being logged during startup. Added logic to update email address in AspNetUsers when updating a User. 2022-03-16 09:53:59 -04:00
Shaun Walker
6324aacba1 Merge pull request #2064 from sbwalker/dev
Improve Principal handling for OIDC and resolve Logout issue (caused by AntiForgeryToken)
2022-03-14 22:29:19 -04:00
Shaun Walker
d51ba8f6dd Improve Principal handling for OIDC and resolve Logout issue (caused by AntiForgeryToken) 2022-03-14 22:28:41 -04:00
Shaun Walker
9b69e135d9 Merge pull request #2053 from leigh-pointer/FileConstants
Fix for File Upload Failed {Error} .json file #2052
2022-03-13 22:56:50 -04:00
Shaun Walker
c3218b2f5a Merge pull request #2060 from sbwalker/dev
Added support for per site options and OpenID Connect
2022-03-13 22:56:29 -04:00
Shaun Walker
9bbbff31f8 Added support for per site options and OpenID Connect 2022-03-13 22:55:52 -04:00
Leigh Pointer
432429026b Fix for File Upload Failed {Error} .json file #2052
Udate to FileUpload Constant 
added extensions json, xml, xslt, rss, html, htm, css
This is an interim fix with plans to make the upload extensions a soft implementation.
2022-03-09 14:27:14 +01:00
Shaun Walker
a47ecbdea9 Merge pull request #2048 from sbwalker/dev
Added password policy validation in install wizard
2022-03-08 08:20:15 -05:00
Shaun Walker
f250aff99b Added password policy validation in install wizard 2022-03-08 08:31:18 -05:00
Shaun Walker
003f14003e Fixed issue with IHostResources not being registered properly 2022-03-07 16:52:40 -05:00
Shaun Walker
fe4e245cda Merge pull request #2045 from sbwalker/dev
Fixed issue with IHostResources not being registered properly
2022-03-07 16:41:37 -05:00
Shaun Walker
668da62519 Fix #2032 - Fresh install with Postgres failed with "42703: column "settingname" does not exist POSITION: 43 2022-03-07 12:23:35 -05:00
Shaun Walker
fd89254d5a fix #2041 - Server restart post module install fails with null exception 2022-03-07 12:19:00 -05:00
Shaun Walker
b4338c1761 Merge pull request #2043 from sbwalker/dev
Fix #2032 - Fresh install with Postgres failed with "42703: column "settingname" does not exist POSITION: 43
2022-03-07 12:12:44 -05:00
Shaun Walker
fb3c79617f Merge pull request #2042 from sbwalker/dev
fix #2041 - Server restart post module install fails with null exception
2022-03-07 12:07:58 -05:00
Shaun Walker
b80fe428ac add show/hide password toggle on Login form 2022-03-04 11:43:54 -05:00
Shaun Walker
5806563ba4 Merge pull request #2040 from sbwalker/dev
add show/hide password toggle on Login form
2022-03-04 11:32:56 -05:00
Shaun Walker
5adecc307f Allow user identity password and lockout configuration to be customized. Included additional environment information in System Info. 2022-03-04 10:41:45 -05:00
Shaun Walker
12d1b5e849 Update README.md 2022-03-04 10:35:07 -05:00
Shaun Walker
3f2095870d Merge pull request #2039 from sbwalker/dev
Allow user identity password and lockout configuration to be customized. Included additional environment information in System Info.
2022-03-04 10:31:18 -05:00
Shaun Walker
1481c76a0d Update README.md 2022-03-03 09:19:57 -05:00
Shaun Walker
1cdc80e09b 2 factor authentication and user account lockout completed 2022-03-03 09:12:37 -05:00
Shaun Walker
e568aa8320 Merge pull request #2037 from sbwalker/dev
2 factor authentication and user account lockout completed
2022-03-03 09:01:54 -05:00
Shaun Walker
28629aa836 Adding 2 factor authentication 2022-02-28 16:00:52 -05:00
Shaun Walker
19f180331b Adding 2 factor authentication 2022-02-28 15:58:49 -05:00
Shaun Walker
3292f0b545 Merge pull request #2034 from sbwalker/dev
Adding 2 factor authentication
2022-02-28 15:50:04 -05:00
Shaun Walker
3333bfeeff Merge pull request #2033 from sbwalker/dev
Adding 2 factor authentication
2022-02-28 15:48:02 -05:00
Shaun Walker
eb1ac3bc9b Added support for User Account Lockout 2022-02-25 16:17:54 -05:00
Shaun Walker
65ae1a6177 Merge pull request #2031 from sbwalker/dev
Added support for User Account Lockout
2022-02-25 16:07:09 -05:00
Shaun Walker
0fba385b9e Enhanced Purge Job to include retention policy for Notifications 2022-02-24 12:37:06 -05:00
Shaun Walker
ee65a54684 Merge pull request #2028 from sbwalker/dev
Enhanced Purge Job to include retention policy for Notifications
2022-02-24 12:26:24 -05:00
Shaun Walker
82fef82c4f use consistent naming convention for System Update log file 2022-02-24 11:11:15 -05:00
Shaun Walker
70383a9b9d Merge pull request #2027 from sbwalker/dev
use consistent naming convention for System Update log file
2022-02-24 11:00:33 -05:00
Shaun Walker
15fdba060c Improvements to System Upgrade to preserve the processing details in a log file in the /Packages folder to improve troubleshooting abilities 2022-02-24 09:55:34 -05:00
Shaun Walker
c1065dab2d Merge pull request #2026 from sbwalker/dev
Improvements to System Upgrade to preserve the processing details in a log file in the /Packages folder to improve troubleshooting abilities
2022-02-24 09:44:55 -05:00
Shaun Walker
dfb4afc698 Merge pull request #2020 from leigh-pointer/ImportExportSettings
Fix for Module Settings Import and Export #2019
2022-02-24 08:51:20 -05:00
Shaun Walker
893b09e7e4 Merge pull request #2025 from sbwalker/dev
Added more constructors for convenience in creating  Notification objects. Refactored to use the new constructors where applicable. Fixed localization key issue in Site Settings and added scroll to top when testing SMTP.
2022-02-24 08:51:10 -05:00
Shaun Walker
938bcb2b62 Added more constructors for convenience in creating Notification objects. Refactored to use the new constructors where applicable. Fixed localization key issue in Site Settings and added scroll to top when testing SMTP. 2022-02-24 09:01:44 -05:00
Shaun Walker
ac45f67a21 enhancement to send log notifications to host users 2022-02-23 16:10:24 -05:00
Shaun Walker
36cd9664b1 Merge pull request #2022 from sbwalker/dev
enhancement to send log notifications to host users
2022-02-23 15:59:41 -05:00
Leigh Pointer
073d330db4 Fix for Module Settings Import and Export #2019
Added the module Settings so they are available for the Import and Export Interface.
2022-02-23 14:33:24 +01:00
Shaun Walker
9ba356c47e moved AlterStringColumn to IDatabase interface so that it can be overridden in the Sqlite provider rather than requiring conditional logic in the migrations 2022-02-22 14:47:31 -05:00
Shaun Walker
f2bec9b478 Merge pull request #2017 from sbwalker/dev
moved AlterStringColumn to IDatabase interface so that it can be overridden in the Sqlite provider rather than requiring conditional logic in the migrations
2022-02-22 14:36:58 -05:00
Shaun Walker
3d0cbdd1a7 expand Url column in Visitor and UrlMapping to accomodate maximum url size of 2048 characters 2022-02-22 10:01:52 -05:00
Shaun Walker
c5f5bf0287 Merge pull request #2015 from sbwalker/dev
expand Url column in Visitor and UrlMapping to accomodate maximum url size of 2048 characters
2022-02-22 09:51:14 -05:00
Shaun Walker
99986c1b94 changed IsModule property name to ES6Module for clarity 2022-02-20 08:53:04 -05:00
Shaun Walker
7d669caa3c Merge pull request #2011 from sbwalker/dev
changed IsModule property name to ES6Module for clarity
2022-02-20 08:42:34 -05:00
Shaun Walker
b68e3cb10f Add support for ES6 module JavaScript resources 2022-02-19 17:24:41 -05:00
Shaun Walker
e305c488d4 Merge pull request #2010 from sbwalker/dev
Add support for ES6 module JavaScript resources
2022-02-19 17:14:21 -05:00
Shaun Walker
a2417bbe56 Merge pull request #2005 from leigh-pointer/BootstrapUpdate
Theme Template Updated
2022-02-18 11:00:58 -05:00
Leigh Pointer
b3967b36c0 Corrected incorrect CDN 2022-02-18 14:52:51 +01:00
Leigh Pointer
5fb33dfee9 Bootstrap reference updated to 5.1.3 2022-02-18 08:38:53 +01:00
Shaun Walker
c002768e5b Merge pull request #2001 from oqtane/master
Merge pull request #2000 from oqtane/dev
2022-02-15 14:31:40 -05:00
Shaun Walker
aff33c6a5d Merge pull request #2000 from oqtane/dev
3.0.3 release
2022-02-15 14:31:21 -05:00
Shaun Walker
a84b497fae Merge pull request #1999 from artmedia/patch-1
typo correction for closing tag
2022-02-15 09:37:39 -05:00
Artmedia by Luca Bongioanni
c33d1bcd3c typo correction for closing label
typo correction for closing label
2022-02-15 10:19:58 +01:00
Shaun Walker
4071e14a7e Update README.md 2022-02-14 16:25:58 -05:00
Shaun Walker
b5b3f190b7 Merge pull request #1998 from leigh-pointer/ModuleCount
null reference exception still occurring
2022-02-14 13:07:29 -05:00
Leigh Pointer
d43a3e132c null reference exception still occurring
added a '?' operator after the m.ModuleDefinition
2022-02-14 19:06:00 +01:00
Shaun Walker
a90c21f80a Merge pull request #1997 from sbwalker/dev
prepare for 3.0.3 release
2022-02-11 16:49:21 -05:00
Shaun Walker
2b768165e5 prepare for 3.0.3 release 2022-02-11 16:59:48 -05:00
Shaun Walker
e8425ba03a improve performance by reducing database calls in initial client request scenarios 2022-02-11 15:42:34 -05:00
Shaun Walker
b0a6f402e9 Merge pull request #1996 from sbwalker/dev
improve performance by reducing database calls in initial client request scenarios
2022-02-11 15:32:16 -05:00
Shaun Walker
02e86a940b Merge pull request #1973 from 2sic-forks/refs
fix #1972 Missing Preprocessor Directives during Runtime Compile
2022-02-10 07:56:52 -05:00
Shaun Walker
79d03eb43e Merge pull request #1988 from 2sic-forks/content
fix #1987 Nuspec to include 'content'
2022-02-10 07:56:08 -05:00
Shaun Walker
b564955f85 Merge pull request #1994 from sbwalker/dev
fixed #1989 - installation on SQLite failing due to DropColumn, fixed #1986 - IClientStartup not getting called for External Modules, added ability to correlate new visitors by IP address
2022-02-10 07:55:51 -05:00
Shaun Walker
5aed64f614 fixed #1989 - installation on SQLite failing due to DropColumn, fixed #1986 - IClientStartup not getting called for External Modules, added ability to correlate new visitors by IP address 2022-02-10 08:05:55 -05:00
Tonći Vatavuk
a823a4d9b7 remove precompile symbol OQTANE3_0_OR_GREATER as it have the same effect as simple OQTANE 2022-02-08 20:15:50 +01:00
Tonći Vatavuk
4eed2193f4 Merge branch 'oqtane:dev' into refs 2022-02-08 19:55:34 +01:00
Tonći Vatavuk
48e7a41af6 fix #1987 Nuspec to include 'content' 2022-02-08 19:38:31 +01:00
Tonći Vatavuk
bba5caecf7 Merge branch 'oqtane:dev' into content 2022-02-08 19:34:15 +01:00
Shaun Walker
ede6a45f15 more RichTextEditor refactoring 2022-02-08 07:42:47 -05:00
Shaun Walker
9c65d23229 Merge pull request #1992 from sbwalker/dev
more RichTextEditor refactoring
2022-02-08 07:32:21 -05:00
Tonći Vatavuk
5dedfe9295 fix oqtane#1987 Nuspec to include 'content' ('contentFiles') 2022-02-07 14:09:14 +01:00
Shaun Walker
95d8c368c8 Meta tags should not be HTML encoded 2022-02-06 18:54:09 -05:00
Shaun Walker
49fbfb8bbc Merge pull request #1985 from sbwalker/dev
Meta tags should not be HTML encoded
2022-02-06 18:43:52 -05:00
Shaun Walker
aa3d2a5289 Merge pull request #1969 from 2sic-forks/dev
fix #1272 - add support for refs folder in package installation
2022-02-06 12:11:29 -05:00
Shaun Walker
48ae6df4b7 Merge pull request #1984 from sbwalker/dev
resolved UI error when closing Event Log and Visitor Management, made button class consistent in Recycle Bin, refactored RichTextEditor, made use of ConfigManager consistently throughout framework, added support for deleted Sites, removed reference to Runtime in Startup as it is now set per Site, added versioning to Html/Text, added Meta tag support to Page Management
2022-02-06 12:09:40 -05:00
Shaun Walker
c635351a12 resolved UI error when closing Event Log and Visitor Management, made button class consistent in Recycle Bin, refactored RichTextEditor, made use of ConfigManager consistently throughout framework, added support for deleted Sites, removed reference to Runtime in Startup as it is now set per Site, added versioning to Html/Text, added Meta tag support to Page Management 2022-02-06 12:19:42 -05:00
Tonći Vatavuk
d9ff77fd9a fix #1972 Missing Preprocessor Directives during Runtime Compile 2022-01-31 18:27:56 +01:00
Tonći Vatavuk
e1a7954307 fix #1272 - add support for refs folder in package installation 2022-01-29 06:45:51 +01:00
Shaun Walker
efe6421133 Merge pull request #1957 from Rodien/dev
Added web.Release.config to include remove WebDAV during the publish stage of a release
2022-01-28 13:00:56 -05:00
Shaun Walker
79b62f4407 Merge pull request #1968 from sbwalker/dev
improved UX in Event Log by preserving criteria when viewing Details, added RowClass and ColumnClass parameters to Pager component, added initial-scale=1.0 to viewport specification in _host, added default visitor tracking filter, fixed "The given key 'level' was not present in the dictionary" issue in Visitor Management - Details by ensuring data was fully loaded
2022-01-27 18:02:20 -05:00
Shaun Walker
9d17804ac7 improved UX in Event Log by preserving criteria when viewing Details, added RowClass and ColumnClass parameters to Pager component, added initial-scale=1.0 to viewport specification in _host, added default visitor tracking filter, fixed "The given key 'level' was not present in the dictionary" issue in Visitor Management - Details by ensuring data was fully loaded 2022-01-27 18:12:04 -05:00
Shaun Walker
5986355504 Merge pull request #1965 from leigh-pointer/ModuleCount#1963
Fix for Version 3 module definitions error #1963
2022-01-25 13:38:58 -05:00
Leigh Pointer
192e6fde92 Fix for Version 3 module definitions error #1963
The code was assuming that the ModuleDefinitionId exists in the PageState.Modules collection. Instead of using .Count()  code now uses .FirstOrDefault() != null
2022-01-25 06:23:07 +01:00
Shaun Walker
ad090e62cc enhance Pager to support pure responsive Grid format (Columns = 0) 2022-01-23 10:40:41 -05:00
Shaun Walker
5c072fea62 Merge pull request #1960 from sbwalker/dev
enhance Pager to support pure responsive Grid format (Columns = 0)
2022-01-23 10:30:54 -05:00
Shaun Walker
fd01a40810 Merge pull request #1958 from leigh-pointer/AddUserId
Add the Username to the User And Roles display.
2022-01-22 19:25:20 -05:00
Shaun Walker
7b9a83a273 Merge pull request #1959 from sbwalker/dev
added router support for url fragments, added language attribute to HTML document tag to improve validation, fixed Theme Settings so they can only be invoked via the Control Panel, added support for webp image files
2022-01-22 19:24:51 -05:00
Shaun Walker
f964e0e502 added router support for url fragments, added language attribute to HTML document tag to improve validation, fixed Theme Settings so they can only be invoked via the Control Panel, added support for webp image files 2022-01-22 19:34:30 -05:00
Rodien_Bond004
22acb7c74b Comments cleanup
Code cleanup. I removed the unnecessary comments.

This code will remove WebDAV during the publish stage of a release.
2022-01-21 11:58:24 +01:00
Leigh Pointer
6a99e81e75 Add the Username to the display.
When looking through Users and Roles it would seem ideal to also show the username.
2022-01-21 09:36:32 +01:00
Rodien Blindeling
93b6de1caf Added web.Release.config to include remove WebDAV during the publish stage of a release 2022-01-21 02:32:48 +01:00
Shaun Walker
1fbab5db2b Merge pull request #1954 from sbwalker/dev
enhance Pager component with OnPageChanged event and implement in Visitor Management, allow PermissionGrid component to support Host role, fix unhandled exception in RichTextEditor component related to rerendering, make Quill resource declarations forward compatible, update Blazor theme to Boostrap 5.1.3, add missing RemoteIPAddress parameter in _Host app component, include logic to enable bypass of non-default alias redirection
2022-01-19 17:40:01 -05:00
Shaun Walker
950e852dee Merge branch 'dev' of https://github.com/sbwalker/oqtane.framework into dev 2022-01-19 17:47:39 -05:00
Shaun Walker
826898e3fe enhance Pager component with OnPageChanged event and implement in Visitor Management, allow PermissionGrid component to support Host role, fix unhandled exception in RichTextEditor component related to rerendering, make Quill resource declarations forward compatible, update Blazor theme to Boostrap 5.1.3, add missing RemoteIPAddress parameter in _Host app component, include logic to enable bypass of non-default alias redirection 2022-01-19 17:47:27 -05:00
Shaun Walker
1268149d83 Merge pull request #1944 from oqtane/master
Merge pull request #1943 from oqtane/dev
2022-01-16 11:06:34 -05:00
Shaun Walker
908299970f Merge pull request #1943 from oqtane/dev
3.0.2 release
2022-01-16 11:05:56 -05:00
Shaun Walker
861dde8627 Update README.md 2022-01-15 12:59:50 -05:00
Shaun Walker
cc9802a0d8 use PageState.Uri rather than creating a new Uri object 2022-01-15 12:58:47 -05:00
Shaun Walker
69d1f3aa53 Merge pull request #1940 from sbwalker/dev
use PageState.Uri rather than creating a new Uri object
2022-01-15 12:49:00 -05:00
Shaun Walker
ea4587d842 Update README.md 2022-01-15 12:38:23 -05:00
Shaun Walker
fb4c95f945 Update README.md 2022-01-15 12:37:52 -05:00
Shaun Walker
95a27af5f2 Update README.md 2022-01-15 12:34:34 -05:00
Shaun Walker
9d7b25ade6 Merge pull request #1939 from sbwalker/dev
improvement for updating private/public Settings
2022-01-15 09:34:56 -05:00
Shaun Walker
3a8f4199cd improvement for updating private/public Settings 2022-01-15 09:44:36 -05:00
Shaun Walker
11002efc02 hide deleted pages in Admin Dashboard, impove Settings API by replacing IsPublic with IsPrivate, isolate Setting updates to not affect PageState, make Pager horizintally scrollable on narrow viewports, improve LocalizableComponent to support embedded controls 2022-01-14 13:26:24 -05:00
Shaun Walker
367c1c3568 Merge pull request #1938 from sbwalker/dev
hide deleted pages in Admin Dashboard, impove Settings API by replacing IsPublic with IsPrivate, isolate Setting updates to not affect PageState, make Pager horizintally scrollable on narrow viewports, improve LocalizableComponent to support embedded controls
2022-01-14 13:16:42 -05:00
Shaun Walker
9e04230d99 added interop method for setting scroll position, persisted RemoteIPAddress in PageState so it is available on Blazor Server, added support for forwarded headers from load balancers and proxy servers, replaced DateTime.Now references DateTimeUtcNow for consistency, fixed issue where upgrade logic was being executed for prior version 2022-01-13 07:18:37 -05:00
Shaun Walker
21304db7c9 Merge pull request #1936 from sbwalker/dev
added interop method for setting scroll position, persisted RemoteIPAddress in PageState so it is available on Blazor Server, added support for forwarded headers from load balancers and proxy servers, replaced DateTime.Now references DateTimeUtcNow for consistency, fixed issue where upgrade logic was being executed for prior version
2022-01-13 07:10:15 -05:00
Shaun Walker
f4f6e98045 Merge pull request #1935 from leigh-pointer/DeadResxKey
Empty Resx Value on Page Edit
2022-01-12 16:13:00 -05:00
Leigh Pointer
ad41eff38a Empty Resx Value on Page Edit 2022-01-12 20:42:59 +01:00
Shaun Walker
dbd6cc4148 Merge pull request #1934 from oqtane/revert-1931-dev
Revert "Fixed first render js bug"
2022-01-12 14:09:08 -05:00
Shaun Walker
dda71e5ccd Revert "Fixed first render js bug" 2022-01-12 14:07:50 -05:00
Shaun Walker
cfe8059176 Merge pull request #1931 from zzmzaizai/dev
Fixed first render js bug
2022-01-12 13:57:13 -05:00
Shaun Walker
8b00784ecc Merge pull request #1933 from sbwalker/dev
fix z-index for Blazor theme on mobile
2022-01-12 07:50:44 -05:00
Shaun Walker
9bcc6bbad0 fix z-index for Blazor theme on mobile 2022-01-12 08:00:25 -05:00
痞子再
ce7995966d Fixed first render js bug
Solve the problem that when the page is rendered for the first time and JS is executed, the reference to the JS file has not been successful, and the page is abnormally wrong
2022-01-12 10:36:10 +08:00
Shaun Walker
cea5f86df4 prepare for 3.0.2 release 2022-01-11 17:46:36 -05:00
Shaun Walker
0912253b1b Merge pull request #1930 from sbwalker/dev
prepare for 3.0.2 release
2022-01-11 17:36:54 -05:00
Shaun Walker
5aecc4be03 remove invalid app tag, fix page title not being set on first render 2022-01-11 15:07:54 -05:00
Shaun Walker
e09178c14c Merge pull request #1927 from sbwalker/dev
remove invalid app tag, fix page title not being set on first render
2022-01-11 14:58:13 -05:00
Shaun Walker
477ded6a4a Merge pull request #1921 from zzmzaizai/dev
Fixed first render css bug
2022-01-11 14:49:57 -05:00
Shaun Walker
311c48becb Merge pull request #1926 from sbwalker/dev
improve UX of password reset
2022-01-11 10:48:18 -05:00
Shaun Walker
ec924a7ddf improve UX of password reset 2022-01-11 10:57:58 -05:00
Shaun Walker
e39416a786 Update README.md 2022-01-11 09:14:43 -05:00
Shaun Walker
51b356cc0e enhanced scheduler to support one-time jobs, fixed pager component so that top/bottom have consistent UX, fixed Blazor theme z-index issues caused by input-group in Bootstrap 5, improved password reset instructions in email notification 2022-01-10 19:58:58 -05:00
Shaun Walker
66b13bdb8b Merge pull request #1925 from sbwalker/dev
enhanced scheduler to support one-time jobs, fixed pager component so that top/bottom have consistent UX, fixed Blazor theme z-index issues caused by input-group in Bootstrap 5, improved password reset instructions in email notification
2022-01-10 19:49:25 -05:00
痞子再
4ade58da01 Fixed first render css bug
Fixed the bug that CSS could not be render when the module was loaded for the first
2022-01-10 16:06:48 +08:00
Shaun Walker
efcfc0783c Merge pull request #1917 from leigh-pointer/LabelCSS
Fix for  #1914 Label Control appending Class to LabelClass
2022-01-08 14:03:28 -05:00
Shaun Walker
aa22db7fe5 Merge pull request #1916 from sbwalker/dev
add error handling in purge job
2022-01-08 10:12:27 -05:00
Shaun Walker
5e0f008b65 add error handling in purge job 2022-01-08 10:22:05 -05:00
Shaun Walker
eaf840e1da improvements to purge job 2022-01-08 10:17:10 -05:00
Leigh Pointer
fc9e47778b Fix for #1914 Label Control appending Class to LabelClass
Modified so that the Class parameter is not constantly appended when a new Class is applied.
2022-01-08 16:12:27 +01:00
Shaun Walker
35edf78aed Merge pull request #1915 from sbwalker/dev
improvements to purge job
2022-01-08 10:07:36 -05:00
Shaun Walker
07718f0449 add option to Control Panel to specify module visibility 2022-01-08 08:44:18 -05:00
Shaun Walker
6759156519 Merge pull request #1913 from sbwalker/dev
add option to Control Panel to specify module visibility
2022-01-08 08:34:45 -05:00
Shaun Walker
e2688e6feb include purge job for maintaining event logs and visitor logs 2022-01-07 23:30:29 -05:00
Shaun Walker
65ba6423b1 Merge pull request #1912 from sbwalker/dev
include purge job for maintaining event logs and visitor logs
2022-01-07 23:21:06 -05:00
Shaun Walker
a2f8fe3694 convention shortcut to suppress title in container 2022-01-06 17:24:18 -05:00
Shaun Walker
5273a17ab6 Merge pull request #1911 from sbwalker/dev
convention shortcut to suppress title in container
2022-01-06 17:14:45 -05:00
Shaun Walker
f7c1e7b706 alias management improvements 2022-01-06 13:37:29 -05:00
Shaun Walker
45bbc4c681 Merge pull request #1910 from sbwalker/dev
alias management improvements
2022-01-06 13:27:51 -05:00
Shaun Walker
6af5682548 increment copyright date to 2022, allow scheduled jobs to support weekly interval, improve dynamic image generation, add defensive logic to router 2022-01-05 14:28:42 -05:00
Shaun Walker
24ed06626d Merge pull request #1909 from sbwalker/dev
increment copyright date to 2022, allow scheduled jobs to support weekly interval, improve dynamic image generation, add defensive logic to router
2022-01-05 14:19:16 -05:00
Shaun Walker
eeff4af167 make Url Mappings relative rather than absolute 2022-01-03 10:56:13 -05:00
Shaun Walker
17f46afe14 Merge pull request #1903 from sbwalker/dev
make Url Mappings relative rather than absolute
2022-01-03 10:46:42 -05:00
Shaun Walker
224618cf21 improve Scheduled Job start/stop user experience, utilize start time when setting next job execution 2022-01-02 21:01:55 -05:00
Shaun Walker
ea93ab2a83 Merge pull request #1902 from sbwalker/dev
improve Scheduled Job start/stop user experience, utilize start time when setting next job execution
2022-01-02 20:53:00 -05:00
Shaun Walker
b9f7c39550 improve capture of request attributes 2021-12-30 14:13:58 -05:00
Shaun Walker
86b4b8e43a Merge pull request #1901 from sbwalker/dev
improve capture of request attributes
2021-12-30 14:04:27 -05:00
Shaun Walker
f54d07548e separate PWA service worker script from manifest script 2021-12-23 09:46:03 -05:00
Shaun Walker
037db8a3e4 Merge pull request #1898 from sbwalker/dev
separate PWA service worker script from manifest script
2021-12-23 09:36:43 -05:00
Shaun Walker
8f00e85abd Merge pull request #1897 from leigh-pointer/MissingResx
Missing Resx Keys
2021-12-23 07:50:35 -05:00
Leigh Pointer
9ccc4c4059 Missing Resx Keys
Added missing Keys for Login and Visitor
2021-12-23 11:36:20 +01:00
Shaun Walker
8408f98693 Merge pull request #1896 from sbwalker/dev
encode PWA Script
2021-12-22 15:43:13 -05:00
Shaun Walker
cde271fd5b encode PWA Script 2021-12-22 15:52:31 -05:00
Shaun Walker
c21a097fd2 added support for default alias specification, alias auto registration, alias redirect, alias line break delimiters 2021-12-22 15:43:59 -05:00
Shaun Walker
83c32d4963 Merge pull request #1895 from sbwalker/dev
added support for default alias specification, alias auto registration, alias redirect, alias line break delimiters
2021-12-22 15:34:49 -05:00
Shaun Walker
22c2d56da0 imrove custom entity support in settings 2021-12-20 07:58:15 -05:00
Shaun Walker
bd8d6e0480 Merge pull request #1886 from sbwalker/dev
imrove custom entity support in settings
2021-12-20 07:49:10 -05:00
Shaun Walker
825eb700b1 Merge pull request #1885 from chlupac/SearchUserFix
Search user work again
2021-12-20 07:46:06 -05:00
Pavel Vesely
e59ee70f88 Search user work again 2021-12-20 13:06:33 +01:00
Shaun Walker
1173a29ed5 Merge pull request #1884 from sbwalker/dev
Add support for IsPublic to all Setting types, enable Url Mapping for internal links
2021-12-18 10:26:26 -05:00
Shaun Walker
6a2ff369ea Add support for IsPublic to all Setting types, enable Url Mapping for internal links 2021-12-18 10:35:22 -05:00
Shaun Walker
e22606ae79 Merge pull request #1882 from leigh-pointer/#1880GetModuleDefinitionSettings
#1880 Issue with new SettingService
2021-12-16 15:37:22 -05:00
Shaun Walker
bf56c2a9fa Merge pull request #1883 from leigh-pointer/RichTextContent
Rework to #1848 RawHTML not being saved
2021-12-16 15:37:14 -05:00
Leigh
6567b55ea3 Removed RichTextEditor OnInitialized
Redundant procedure call.
2021-12-16 20:11:07 +01:00
Leigh
20e90c0de4 Rework to #1848 RawHTML not being saved
Restructured the execution of code.
RawHTML now works as it did in previous versions as well as the new functionality.
2021-12-16 20:07:40 +01:00
Shaun Walker
2892d5ec6f Update README.md 2021-12-16 09:38:10 -05:00
Leigh
e034811e92 #1880 Issue with new SettingService
Needed to update the SettingService to apply the IsPublic field when updating settings for the ModuleDefinition.
2021-12-15 18:54:26 +01:00
Shaun Walker
ee18bbd145 Merge pull request #1881 from sbwalker/dev
add logging for the logout event to the UI component, relocate module setting deletion to repository
2021-12-15 10:24:17 -05:00
Shaun Walker
e3ebbde767 add logging for the logout event to the UI component, relocate module setting deletion to repository 2021-12-15 10:33:12 -05:00
Shaun Walker
6a57980439 Merge pull request #1879 from leigh-pointer/#1877#1878-ModuleDelete
1877 Module data not being delete when recycle bin is purged
2021-12-15 10:14:38 -05:00
Leigh
765760f3a5 Fix for #1877 #1878 Module data not being deleted
Fixed the permissions validation and added functionality to remove all the settings for the deleted module.
2021-12-15 08:26:00 +01:00
Shaun Walker
ab1ac7c995 Merge pull request #1875 from oqtane/master
Merge pull request #1874 from oqtane/dev
2021-12-12 20:46:54 -05:00
Shaun Walker
99b0c9c079 Merge pull request #1874 from oqtane/dev
3.0.1 release
2021-12-12 20:46:28 -05:00
Shaun Walker
e99ab431e1 Merge pull request #1872 from sbwalker/dev
create url mapping when page path changes
2021-12-12 09:50:33 -05:00
Shaun Walker
1e1aaaccca create url mapping when page path changes 2021-12-12 09:59:33 -05:00
Shaun Walker
318d6afb0e fix url mapping resx issue 2021-12-11 09:39:03 -05:00
Shaun Walker
ba353857eb Merge pull request #1869 from sbwalker/dev
fix url mapping resx issue
2021-12-11 09:30:19 -05:00
Shaun Walker
1fd42f343d Merge pull request #1867 from leigh-pointer/MissingRes-3.0.1
Missing resource Keys for URL mapping and Visitors
2021-12-11 09:25:45 -05:00
Shaun Walker
ec9686cfb8 Merge branch 'dev' into MissingRes-3.0.1 2021-12-11 09:25:03 -05:00
Shaun Walker
a1bff809f3 Merge pull request #1868 from sbwalker/dev
visitor improvements
2021-12-11 09:21:26 -05:00
Shaun Walker
76fe155c0a visitor improvements 2021-12-11 09:30:05 -05:00
Leigh
0b0254aed9 Updated Resx file 2021-12-11 14:24:08 +01:00
Leigh
9258c3849b Went through each Framework module updating Resources
New English resources added
2021-12-11 13:43:22 +01:00
Leigh
d530f30bc9 Missing Res Keys
Added missing resource keys
2021-12-11 11:54:25 +01:00
Shaun Walker
7d8bbac04f remove quill 1.3.6 assets 2021-12-10 14:19:32 -05:00
Shaun Walker
7b0c0c3e17 prepare for 3.0.1 2021-12-10 14:16:16 -05:00
Shaun Walker
298c3097f7 Merge pull request #1866 from sbwalker/dev
remove quill 1.3.6 assets
2021-12-10 14:10:59 -05:00
Shaun Walker
3a3f221418 Merge pull request #1865 from sbwalker/dev
prepare for 3.0.1
2021-12-10 14:07:30 -05:00
Shaun Walker
78110791e1 Merge pull request #1863 from leigh-pointer/InstallManagerDelete
Fix for Installed packages not being removed correctly
2021-12-10 10:11:31 -05:00
Shaun Walker
95d4c3d0d5 Merge pull request #1864 from sbwalker/dev
adjust permissions for new settings
2021-12-10 10:11:16 -05:00
Shaun Walker
e95b49ba8f adjust permissions for new settings 2021-12-10 10:20:03 -05:00
Leigh
92ccb7e463 Fix for Installed packages not being removed correctly
When a package is remove in some instance the system complains that a file still exists in the deleting directory but there is not file.
Added true parameter to the Directory delete for force the removal. 
Directory.Delete(Path.GetDirectoryName(filepath), true);
2021-12-10 16:06:12 +01:00
Shaun Walker
2f34bf69e3 moduledefinition settings and host settings 2021-12-09 15:50:00 -05:00
Shaun Walker
d093c03d92 Merge pull request #1862 from sbwalker/dev
moduledefinition settings and host settings
2021-12-09 15:41:19 -05:00
Shaun Walker
d1ade8789b Merge pull request #1832 from leigh-pointer/ModuleDefinitionSettings
Settings for ModuleDefinitions #1829
2021-12-09 13:35:54 -05:00
Shaun Walker
1291eb5b7c Merge pull request #1861 from sbwalker/dev
added support for url mapping and viitors
2021-12-09 08:40:15 -05:00
Shaun Walker
9c32937c83 added support for url mapping and viitors 2021-12-09 08:48:56 -05:00
Shaun Walker
1ec28e9825 Merge pull request #1855 from svendu/fix_postgres_installation
Make IsPublic of type bool to make PostgreSQL happy
2021-12-08 12:54:30 -05:00
Shaun Walker
86fce898e5 Merge pull request #1853 from leigh-pointer/PagerBoth
Update the ToolBar position on the Pager Component
2021-12-08 12:54:10 -05:00
Sven Dummis
bbee87f7df Make IsPublic of type bool 2021-12-07 12:07:26 +01:00
Leigh
811ddb9b44 Update the ToolBar position on the Pager Component
Add the option "Both" to display the toolbar at the top and bottom of the pager.  Nice if the Pager is displaying large sets of data.
2021-12-06 19:18:07 +01:00
Shaun Walker
de798da074 Merge pull request #1848 from leigh-pointer/RichTextContentRefresh
Fix #1837 RichTextEditor Content not re-Rendering
2021-12-03 09:45:59 -05:00
Leigh
65d468be33 Fix #1837 RichTextEditor Content not re-Rendering
Change to the OnAfterRenderAsync method and changed OnInitialized to OnParametersSet
2021-12-03 06:31:45 +01:00
Shaun Walker
9664ff67f3 Merge pull request #1842 from leigh-pointer/QuillEditor1.3.7-SecurityUpdate
Quill Security related bug fixes.
2021-12-02 16:24:49 -05:00
Shaun Walker
99f73cf31e Merge pull request #1846 from sbwalker/dev
Additional properties added to Route model to improve abstraction, modified Site Settings to support settings moved to the server.
2021-12-02 16:24:39 -05:00
Shaun Walker
a216e2b92e Additional properties added to Route model to improve abstraction, modified Site Settings to support settings moved to the server. 2021-12-02 16:33:16 -05:00
Leigh
9dfd9ad519 Quill Security related bug fixes.
Upgraded Quill references to 1.3.7
Tabnabbing vulnerability in snow theme #2438
https://github.com/quilljs/quill/issues/2438

https://github.com/quilljs/quill/releases/tag/v1.3.7
2021-12-02 09:56:55 +01:00
Shaun Walker
97133510a7 Update README.md 2021-12-01 09:11:21 -05:00
Shaun Walker
43d166fb7d Route parsing abstraction and optimization, site router performance improvements, migrate site-based concepts (favicon, PWA support) to server for performance and prerendering benefits, move ThemeBuilder interop logic to OnAfterRenderAsync, upgrade SqlClient to release version, update installer to Bootstrap 5.1.3 2021-12-01 08:22:59 -05:00
Shaun Walker
2f8a580854 Merge pull request #1840 from sbwalker/dev
Route parsing abstraction and optimization, site router performance improvements, migrate site-based concepts (favicon, PWA support) to server for performance and prerendering benefits, move ThemeBuilder interop logic to OnAfterRenderAsync, upgrade SqlClient to release version, update installer to Bootstrap 5.1.3
2021-12-01 08:14:46 -05:00
Leigh
a21a2ab3bb Settings for ModuleDefinitions #1829
Add Update settings for the ModuleDefinition
2021-11-24 16:06:52 +01:00
Shaun Walker
03106526e9 Enhance the default site template with a Develop page that makes the Module Creator more discoverable for new users 2021-11-24 09:07:43 -05:00
Shaun Walker
a9ac3917b3 Merge pull request #1831 from sbwalker/dev
Enhance the default site template with a Develop page that makes the Module Creator more discoverable for new users
2021-11-24 08:59:54 -05:00
Shaun Walker
53ff491efd Assorted enhancements 2021-11-24 08:08:39 -05:00
Shaun Walker
1feb6ec452 Merge pull request #1830 from sbwalker/dev
Assorted enhancements
2021-11-24 08:00:49 -05:00
Shaun Walker
df00f53e54 Merge pull request #1823 from hishamco/tab-panel-localizer
Fix heading localization in TabPanel
2021-11-22 16:03:50 -05:00
Shaun Walker
be32af7588 Merge pull request #1827 from sbwalker/dev
refactored ErrorBoundary implementation to support logging
2021-11-22 16:03:17 -05:00
Shaun Walker
19be77ed49 refactored ErrorBoundary implementation to support logging 2021-11-22 16:11:44 -05:00
Hisham Bin Ateya
1c43c095bc Fix heading localization in TabPanel 2021-11-20 09:47:49 +03:00
Shaun Walker
59850f4869 Merge pull request #1815 from chlupac/ErrorBoundary
Implementing ErrorBoundary in ModuleInstance component
2021-11-18 16:14:35 -05:00
Shaun Walker
804b61ff95 Merge pull request #1820 from hishamco/swagger
Handle SchemaId in Swagger
2021-11-18 08:54:57 -05:00
Hisham Bin Ateya
d431c607ba Handle SchemaId in Swagger 2021-11-18 14:50:17 +03:00
Shaun Walker
b87b0489e9 Merge pull request #1812 from leigh-pointer/PageModules
Modification to Page Management component
2021-11-17 08:52:31 -05:00
Shaun Walker
2e593d44ee Merge pull request #1813 from leigh-pointer/ModuleDefinitionsInUse
Modification to Module Management
2021-11-17 08:49:00 -05:00
Shaun Walker
71354464e3 Merge pull request #1810 from leigh-pointer/ControlPanel
Page management buttons resizing
2021-11-17 08:44:39 -05:00
Shaun Walker
c48b4788c6 Merge pull request #1805 from chlupac/AliasFix
Fix - site with default alias (*) edit fail
2021-11-17 08:44:05 -05:00
Shaun Walker
fe9a7333ed Merge pull request #1798 from leigh-pointer/BreadCrumbs
Fix for #1797 Breadcrumbs render clickable
2021-11-17 08:43:55 -05:00
Shaun Walker
16d9e06db2 Merge pull request #1793 from 2sic-forks/dev
Add many PrivateApi attributes to hide unimportant stuff in docs
2021-11-17 08:43:35 -05:00
Pavel Vesely
b40ee19735 ErrorBoundary 2021-11-17 11:22:24 +01:00
Leigh
d5b0356625 Modification to Module Management
The component now reports back if the module is in use.  This will assist in housekeeping and removal of unused modules.
2021-11-16 00:37:57 +01:00
Leigh
5ca77c3f64 Modification to Page Management component
Add a new tabpane that lists all the module on that page.  From here you are able to modify the module settings and or delete the module from a page.  Delete will send the module to the recycle bin.
2021-11-15 23:26:20 +01:00
Leigh
54e9307795 Page management buttons resizing
When the language is changed, in this instance Dutch the buttons are not resized to fit the caption.  This small fix rectifies this.
2021-11-15 21:14:40 +01:00
Pavel Vesely
60d7e45048 Fix - site with default alias (*) edit fail 2021-11-14 10:22:01 +01:00
Shaun Walker
931559cca8 Update README.md 2021-11-12 09:42:34 -05:00
Leigh
2567c2937d Fix for #1797 Breadcrumbs render clickable
This fixes the issue when the page property IsClickable is set to false the breadcrum for the page is not clickable.
2021-11-12 07:07:15 +01:00
ijungleboy
5b8e6d4df6 Add many PrivateApi attributes to hide unimportant stuff in docs 2021-11-11 20:01:55 +01:00
Shaun Walker
087c053bd5 Merge pull request #1791 from oqtane/master
Merge pull request #1790 from oqtane/dev
2021-11-11 10:13:49 -05:00
Shaun Walker
7e699136d7 Merge pull request #1790 from oqtane/dev
version 3.0.0 release
2021-11-11 10:13:00 -05:00
Shaun Walker
b7bbfe2a46 Merge pull request #1789 from sbwalker/dev
updated database provider references
2021-11-11 09:12:49 -05:00
Shaun Walker
69783b0709 updated database provider references 2021-11-11 09:21:01 -05:00
Shaun Walker
614041d55e update Blazor theme with bootstrap bundle js 2021-11-11 07:50:24 -05:00
Shaun Walker
856f61c2ee Merge pull request #1787 from sbwalker/dev
update Blazor theme with bootstrap bundle js
2021-11-11 07:42:10 -05:00
Shaun Walker
b0b196a522 Merge pull request #1786 from leigh-pointer/ActionMenu
Fix for Action Menus not displaying. #1785
2021-11-11 07:38:25 -05:00
Leigh
62f04d239f Fix for Action Menus not displaying. #1785
Dropdowns are built on a third party library, Popper, which provides dynamic positioning and viewport detection.  / bootstrap.bundle.js which contains Popper. Popper isn’t used to position dropdowns in navbars though as dynamic positioning isn’t required.

updated the Bootstrap to reference the ../5.1.3/js/bootstrap.bundle.min.js
2021-11-11 10:27:09 +01:00
Shaun Walker
4210d10fca Merge pull request #1782 from leigh-pointer/Bootstrap
Upgrade to 5.1.3 Bootstrap and Bootswatch Cyborg
2021-11-10 17:25:27 -05:00
Shaun Walker
d02842f0ea Merge branch 'dev' into Bootstrap 2021-11-10 17:25:16 -05:00
Leigh
2543b7db79 Upgrade to 5.1.3 Bootstrap and Bootswatch Cyborg
Fixed issue with OffCanvas not rendering properly.
2021-11-10 22:34:19 +01:00
Shaun Walker
41f430429b Merge pull request #1781 from sbwalker/dev
fix UX in module/theme creators
2021-11-10 15:48:36 -05:00
Shaun Walker
4ed4f8d942 fix UX in module/theme creators 2021-11-10 15:56:51 -05:00
Shaun Walker
cc5396801b update Test project dependencies 2021-11-10 13:12:38 -05:00
Shaun Walker
a72dc36d67 Merge pull request #1780 from sbwalker/dev
update Test project dependencies
2021-11-10 13:04:23 -05:00
Shaun Walker
50989e4e1e Merge pull request #1778 from sbwalker/dev
use Cloudflare CDN for static resources
2021-11-10 08:52:38 -05:00
Shaun Walker
41487440e3 use Cloudflare CDN for static resources 2021-11-10 09:00:48 -05:00
Shaun Walker
af72750354 Merge pull request #1776 from leigh-pointer/ReplaceRoot
[RootFolder] was missing from Release.cmd
2021-11-10 08:44:15 -05:00
Leigh
a58dc49acc [RootFolder] was missing from Release.cmd
One of the replace tokens was not added to the second command line.
2021-11-10 14:26:26 +01:00
Shaun Walker
6dbb493d10 updating module and theme templates 2021-11-08 15:12:41 -05:00
Shaun Walker
b8c37ff5d7 Merge pull request #1772 from sbwalker/dev
updating module and theme templates
2021-11-08 15:04:29 -05:00
Shaun Walker
04319195c6 update to official .NET 6 release 2021-11-08 14:55:24 -05:00
Shaun Walker
aadd78b7ac Merge pull request #1771 from sbwalker/dev
update to official .NET 6 release
2021-11-08 14:47:12 -05:00
Shaun Walker
e23da1f5fb Update README.md 2021-11-06 07:53:54 -04:00
Shaun Walker
50eeaf8497 add support for TrustServerCertificate connection string option for SQL Server 2021-11-05 16:01:00 -04:00
Shaun Walker
039202559f Merge pull request #1764 from sbwalker/dev
add support for TrustServerCertificate connection string option for SQL Server
2021-11-05 15:53:00 -04:00
Shaun Walker
5419032e8d upgrade module and theme templates to .NET6 2021-11-05 12:53:13 -04:00
Shaun Walker
017a92c4bc Merge pull request #1763 from sbwalker/dev
upgrade module and theme templates to .NET6
2021-11-05 12:45:10 -04:00
Shaun Walker
a16040a595 remove unnecessary cascading parameter to improve efficiency 2021-11-05 09:03:12 -04:00
Shaun Walker
3f6936a999 Merge pull request #1762 from sbwalker/dev
remove unnecessary cascading parameter to improve efficiency
2021-11-05 08:55:03 -04:00
Shaun Walker
d3f3359f66 fix #1745 - error on WebAssembly when logging out 2021-11-04 08:06:28 -04:00
Shaun Walker
3f110aaabd Merge pull request #1761 from sbwalker/dev
fix #1745 - error on WebAssembly when logging out
2021-11-04 07:58:22 -04:00
Shaun Walker
4e884d57ca Merge pull request #1760 from leigh-pointer/Navigation
Navigation
2021-11-04 07:34:10 -04:00
Leigh
efbe0562f9 Navigation was not completed 2021-11-04 06:09:19 +01:00
Leigh
096dfea1a6 Merge remote-tracking branch 'oqtane/dev' into dev 2021-11-04 05:53:42 +01:00
Shaun Walker
bd5a827593 fix #1746 - SQL Server installation needs to allow configuration of encryption setting on .NET 6 2021-11-03 16:37:37 -04:00
Shaun Walker
404bcaddd4 Merge pull request #1759 from sbwalker/dev
fix #1746 - SQL Server installation needs to allow configuration of encryption setting on .NET 6
2021-11-03 16:29:45 -04:00
Shaun Walker
d2d52a7eb3 update SqlClient to latest preview version 2021-11-03 14:42:24 -04:00
Shaun Walker
1761c47713 Merge pull request #1758 from sbwalker/dev
update SqlClient to latest preview version
2021-11-03 14:34:28 -04:00
Shaun Walker
82e97aa4fa Merge pull request #1750 from leigh-pointer/BlazorTheme
Fix for #1736 Blazor theme not rendering correctly
2021-11-03 12:32:45 -04:00
Shaun Walker
e598178869 Merge pull request #1752 from leigh-pointer/PView
Fix for #1749 navigate to sub sub pages
2021-11-03 12:32:34 -04:00
Shaun Walker
b6f89195ab Merge pull request #1754 from leigh-pointer/1753
Update for #1753 Date format for the Audit
2021-11-03 12:31:43 -04:00
Leigh
7aa92c039a Merge remote-tracking branch 'oqtane/dev' into dev 2021-11-02 20:06:37 +01:00
Leigh
fff36949b7 Fix for #1749 navigate to sub sub pages
Also added missing "Browse" localization from site/index,resx
2021-11-02 19:59:59 +01:00
Shaun Walker
c524f17978 Merge pull request #1757 from sbwalker/dev
Fix #1751 - error when creating site with new tenant
2021-11-02 14:41:21 -04:00
Shaun Walker
e0a0497dd2 Fix #1751 - error when creating site with new tenant 2021-11-02 14:49:06 -04:00
Leigh
fce9220dcb Update for #1753 Date format for the Audit
Added Parameter DateTimeFormat with default value of  "MMM dd yyyy HH:mm:ss"
2021-11-02 07:01:24 +01:00
Leigh
a8ddb64b49 Fix for #1749 navigate to sub sub pages
Added Open button that will navigate to sub pages
2021-11-02 05:57:05 +01:00
Leigh
6d8df2661c modification for responsive theme
small modification to ensure theme is responsive
2021-10-31 07:08:19 +01:00
Leigh
1659de3a2b Fix for #1736 Server Css
Update to the Server file Theme.css
2021-10-28 20:35:48 +02:00
Leigh
9752c72998 Fix for #1736 Blazor theme not rendering correctly
Fix to the Default theme and container
2021-10-28 19:43:51 +02:00
Shaun Walker
db2e3a518d Update README.md 2021-10-27 10:04:00 -04:00
Shaun Walker
94b20662a4 Update README.md 2021-10-26 08:37:09 -04:00
Shaun Walker
7bfc0998fd fix #1713 - link to home path displays login page 2021-10-26 08:30:50 -04:00
Shaun Walker
6707f0efdf Update README.md 2021-10-26 08:27:18 -04:00
Shaun Walker
c7fe5a538f Merge pull request #1735 from sbwalker/dev
fix #1713 - link to home path displays login page
2021-10-26 08:23:12 -04:00
Shaun Walker
9b20006938 removed hidden form fields which are unnecessary as a result of recent changes 2021-10-22 10:33:09 -04:00
Shaun Walker
0b258bd384 Merge pull request #1730 from sbwalker/dev
removed hidden form fields which are unnecessary as a result of recent changes
2021-10-22 10:25:41 -04:00
Shaun Walker
2302c17273 Update README.md 2021-10-19 16:21:13 -04:00
Shaun Walker
b619699637 Update README.md 2021-10-19 16:19:43 -04:00
Shaun Walker
34434e03fe Merge pull request #1725 from sbwalker/dev
upgrade to .NET 6 and increment version to 3.0.0
2021-10-19 15:27:19 -04:00
Shaun Walker
29bd31f609 upgrade to .NET 6 and increment version to 3.0.0 2021-10-19 15:33:03 -04:00
Shaun Walker
cf69f9e4c4 Add proper help text to aliases field in default resource file for Site Settings. Set default value for new ShowLogin parameter in Login theme component. 2021-10-17 13:27:12 -04:00
Shaun Walker
028c9bf0a8 Merge pull request #1720 from sbwalker/dev
Add proper help text to aliases field in default resource file for Site Settings. Set default value for new ShowLogin parameter in Login theme component.
2021-10-17 13:20:24 -04:00
Shaun Walker
3e9a4f2c1a Fixed validation issue in Role Managment - Users. Modified FileManager component to allow Folder parameter to contain a folder path which is translated to a FolderId internally and refactored Packages folder logic. 2021-10-06 17:20:44 -04:00
Shaun Walker
960543d14d Merge pull request #1709 from sbwalker/dev
Fixed validation issue in Role Managment - Users. Modified FileManager component to allow Folder parameter to contain a folder path which is translated to a FolderId internally and refactored Packages folder logic.
2021-10-06 17:14:45 -04:00
Shaun Walker
299674f53b Update README.md 2021-10-06 09:55:47 -04:00
Shaun Walker
306b78b526 Added ability for Runtime and RenderMode to be set per Site - enabling the framework to support multiple hosting models concurrently in the same installation. Fixed WebAssembly Prerendering issue (this also resolved the issue where the component taghelper was not passing parameters correctly to the app when running on WebAssembly). Fix #1702 - remove web,config from upgrade package. 2021-10-05 14:32:05 -04:00
Shaun Walker
f369382a54 Merge pull request #1708 from sbwalker/dev
Added ability for Runtime and RenderMode to be set per Site - enabling the framework to support multiple hosting models concurrently in the same installation. Fixed WebAssembly Prerendering issue (this also resolved the issue where the component taghelper was not passing parameters correctly to the app when running on WebAssembly). Fix #1702 - remove web,config from upgrade package.
2021-10-05 14:25:12 -04:00
Shaun Walker
ac67d88e74 fix logic which sometimes results in System.InvalidOperationException: The value of IsFixed cannot be changed dynamically 2021-10-01 15:58:17 -04:00
Shaun Walker
1f4f70009c Merge pull request #1704 from sbwalker/dev
fix logic which sometimes results in  System.InvalidOperationException: The value of IsFixed cannot be changed dynamically
2021-10-01 15:51:26 -04:00
Shaun Walker
838d918451 Merge pull request #1701 from leigh-pointer/1690-1
1690 User Management Tab needs clicking to render UI when language is not default.
2021-10-01 11:23:01 -04:00
Shaun Walker
8e6c73d2bc Merge pull request #1703 from sbwalker/dev
Allow root page paths (rather than specifying a magic "home" string). More UX improvements to FileManager and Pager.
2021-10-01 11:22:02 -04:00
Shaun Walker
aeb599867c Allow root page paths (rather than specifying a magic "home" string). More UX improvements to FileManager and Pager. 2021-10-01 11:28:48 -04:00
Leigh
2fe93d4e64 Fix for #1690 Tab needs clicking to render UI
User Management Tab needs clicking to render UI when language is not default.  Modification to the TabPanel fixes the issue without  forcing the Heading property to be populated.
2021-09-29 18:05:59 +02:00
Shaun Walker
3e789e0642 UX improvements to FileManager and Pager components 2021-09-29 10:46:23 -04:00
Shaun Walker
a762f206a1 Merge pull request #1699 from sbwalker/dev
UX improvements to FileManager and Pager components
2021-09-29 10:39:43 -04:00
Shaun Walker
c0b13a1f09 2.3.1 database provider packages 2021-09-27 14:22:23 -04:00
Shaun Walker
070ddff1b4 Merge pull request #1697 from sbwalker/dev
2.3.1 database provider packages
2021-09-27 14:15:37 -04:00
Shaun Walker
9d0770e360 Merge pull request #1696 from oqtane/master
Merge pull request #1695 from oqtane/dev
2021-09-27 14:04:23 -04:00
Shaun Walker
088cb2a30e Merge pull request #1695 from oqtane/dev
2.3.1 release
2021-09-27 14:03:55 -04:00
Shaun Walker
c2be84a367 increment version to 2.3.1 2021-09-27 11:43:57 -04:00
Shaun Walker
4f61dd7bb3 Merge pull request #1694 from sbwalker/dev
increment version to 2.3.1
2021-09-27 11:37:34 -04:00
Shaun Walker
30fb6fd8e2 Merge pull request #1693 from sbwalker/dev
fix #1691 - AntiForgeryToken header not being set during startup
2021-09-27 08:37:27 -04:00
Shaun Walker
4bfb5d9f34 fix #1691 - AntiForgeryToken header not being set during startup 2021-09-27 08:44:16 -04:00
Shaun Walker
023f29491d Update README.md 2021-09-25 09:08:20 -04:00
Shaun Walker
5166fe2b41 Update README.md 2021-09-25 09:04:36 -04:00
Shaun Walker
71aa41d55e Update README.md 2021-09-25 09:03:44 -04:00
Shaun Walker
f6fd50f449 Update README.md 2021-09-25 09:02:06 -04:00
Shaun Walker
81e2f7c288 Update README.md 2021-09-25 09:01:40 -04:00
Shaun Walker
895d5e50de Merge pull request #1689 from oqtane/master
Merge pull request #1688 from oqtane/dev
2021-09-24 17:12:22 -04:00
Shaun Walker
6cd1b1ceaa Merge pull request #1688 from oqtane/dev
2.3.0 release
2021-09-24 17:11:32 -04:00
Shaun Walker
82ae9409f1 Merge branch 'dev' of https://github.com/sbwalker/oqtane.framework into dev 2021-09-24 17:07:04 -04:00
Shaun Walker
764b879a77 changes to build/publish params for WebAssembly 2021-09-24 17:06:45 -04:00
Shaun Walker
d3e71b6a7e Merge pull request #1687 from sbwalker/dev
changes to build/publish params for WebAssembly
2021-09-24 17:00:39 -04:00
Shaun Walker
80d23d1c95 Add paging to SQL Manager results 2021-09-23 18:02:15 -04:00
Shaun Walker
531e89346e Merge pull request #1685 from sbwalker/dev
Add paging to SQL Manager results
2021-09-23 17:55:44 -04:00
Shaun Walker
f220cb52bb Merge pull request #1682 from gjwalk/dev
Sites Validation
2021-09-23 17:12:36 -04:00
Shaun Walker
58ff42f813 Merge pull request #1683 from nicpitsch/pr_user-management-profile
Profile properties as dropdown in User Management
2021-09-23 17:10:33 -04:00
Shaun Walker
6b82b03bf1 Merge pull request #1684 from sbwalker/dev
Use ComponentTagHelper parameters on Blazor Server for passing state to allow pre-rendering to function properly ( ComponentTagHelper parameters do not work on Blazor WebAssembly - likely a .NET 5 bug )
2021-09-23 17:10:24 -04:00
Shaun Walker
005843ef2d Use ComponentTagHelper parameters on Blazor Server for passing state to allow pre-rendering to function properly ( ComponentTagHelper parameters do not work on Blazor WebAssembly - likely a .NET 5 bug ) 2021-09-23 17:16:51 -04:00
nicpitsch
10917644ab Profile properties as dropdown in User Management (same as User Profile). 2021-09-23 10:05:24 +02:00
Grayson Walker
9fa3ade832 Sites Validation 2021-09-22 18:22:30 -04:00
Shaun Walker
e10135271d Update README.md 2021-09-22 16:37:57 -04:00
Shaun Walker
c1b482e0c0 check in latest database provider packages 2021-09-22 14:47:14 -04:00
Shaun Walker
a3d7760a09 Merge pull request #1681 from sbwalker/dev
check in latest database provider packages
2021-09-22 14:40:54 -04:00
Shaun Walker
57db7c1efc update version to 2.3.0 in preparation for release 2021-09-22 11:55:01 -04:00
Shaun Walker
586c9b6db6 Merge pull request #1680 from sbwalker/dev
update version to 2.3.0 in preparation for release
2021-09-22 11:48:23 -04:00
Shaun Walker
58a86b67ee fix #1672 - releases need to be published with IL trimming disabled or else dynamic methods will be stripped. Unfortunately compression needs to be disabled as well as if it is not, a "None of the “sha256” hashes in the integrity attribute match the content of the subresource." error is thrown. This seems to be a bug - which I will pursue with Microsoft. 2021-09-22 10:24:13 -04:00
Shaun Walker
43ebf50b61 Merge pull request #1679 from sbwalker/dev
fix #1672 - releases need to be published with IL trimming disabled or else dynamic methods will be stripped. Unfortunately compression needs to be disabled as well as if it is not, a "None of the “sha256” hashes in the integrity attribute match the content of the subresource." error is thrown. This seems to be a bug - which I will pursue with Microsoft.
2021-09-22 10:17:48 -04:00
Shaun Walker
5071cf4752 modify method for determining Runtime in SiteRouter as ComponentTagHelper "param-" appears to only work on Blazor Server - not on WebAssembly 2021-09-21 12:48:15 -04:00
Shaun Walker
00e2e79fc5 Merge pull request #1676 from sbwalker/dev
modify method for determining Runtime in SiteRouter as ComponentTagHelper "param-" appears to only work on Blazor Server - not on WebAssembly
2021-09-21 12:41:31 -04:00
Shaun Walker
8d37444755 improve validation for public site settings 2021-09-21 07:45:43 -04:00
Shaun Walker
20d81bee00 Merge pull request #1675 from sbwalker/dev
improve validation for public site settings
2021-09-21 07:39:35 -04:00
Shaun Walker
ca387d7b26 fix Oqtane theme settings for page scope 2021-09-20 17:23:56 -04:00
Shaun Walker
a0580f6861 Merge pull request #1674 from sbwalker/dev
fix Oqtane theme settings for page scope
2021-09-20 17:17:09 -04:00
Shaun Walker
f739db1e42 Enhance Settings API for public Site Settings. Added Settings to Site model by default. Added new parameters to Login and UserProfile components. Enhanced Oqtane Theme settings to use new component parameters. Enhanced image download and resizing logic. 2021-09-20 17:15:52 -04:00
Shaun Walker
d5bfe7cfbd Merge pull request #1673 from sbwalker/dev
Enhance Settings API for public Site Settings. Added Settings to Site model by default. Added new parameters to Login and UserProfile components. Enhanced Oqtane Theme settings to use new component parameters. Enhanced image download and resizing logic.
2021-09-20 17:09:52 -04:00
Shaun Walker
db85e088bf fix #1659 installation issue on PostgreSQL by ntroducing a new RewriteValue method which can be overridden in a database provider to provide custom behavior. Updated PostgreSQL provide to utilize new method. Also added an Oqtane.Server project reference to the module and theme external templates to streamline the development experience (credit @leighpointer). 2021-09-17 13:56:19 -04:00
Shaun Walker
d053901b32 Merge pull request #1670 from 2sic-forks/dev
Documentation only
2021-09-17 13:50:02 -04:00
Shaun Walker
2957c7d6a9 Merge pull request #1671 from sbwalker/dev
fix #1659 installation issue on PostgreSQL by ntroducing a new RewriteValue method which can be overridden in a database provider to provide custom behavior. Updated PostgreSQL provide to utilize new method. Also added an Oqtane.Server project reference to the module and theme external templates to streamline the development experience (credit @leighpointer).
2021-09-17 13:49:52 -04:00
ijungleboy
a69d52a389 undo accidental / internal commit 2021-09-17 15:40:05 +02:00
ijungleboy
7b5dbbd7ed undo change by 2sic 2021-09-17 15:36:23 +02:00
ijungleboy
6d0fb6ca80 undo change by 2sxc 2021-09-17 15:35:43 +02:00
Shaun Walker
b4f7344ae4 removed unnecessary message from top of module, theme, language installation pages 2021-09-17 09:28:27 -04:00
Shaun Walker
a5cecb7354 Merge pull request #1669 from sbwalker/dev
removed unnecessary message from top of module, theme, language installation pages
2021-09-17 09:21:57 -04:00
Shaun Walker
406a15c5bd constrain file logger size 2021-09-17 09:17:42 -04:00
Shaun Walker
ed0408de95 Merge pull request #1668 from sbwalker/dev
constrain file logger size
2021-09-17 09:11:15 -04:00
Shaun Walker
b5bba1fd11 improved method for determining Runtime in SiteRouter 2021-09-17 09:06:27 -04:00
Shaun Walker
9065bad2bb Merge pull request #1667 from sbwalker/dev
improved method for determining Runtime in SiteRouter
2021-09-17 09:00:06 -04:00
Shaun Walker
289034fd4f fix #1640 - prevent UX "flicker" which was caused by pre-rendering 2021-09-17 08:48:01 -04:00
Shaun Walker
f052f6696f Merge pull request #1666 from sbwalker/dev
fix #1640 - prevent UX "flicker" which was caused by pre-rendering
2021-09-17 08:41:44 -04:00
Marc Drexel
267ca178ed added basic xml comments to all Oqtane.Services interfaces 2021-09-17 10:13:26 +02:00
Shaun Walker
c01c16c7bc Merge pull request #1660 from gjwalk/dev
site validation
2021-09-16 18:00:50 -04:00
Shaun Walker
2ac069082d Merge pull request #1663 from sbwalker/dev
file manager component improvements
2021-09-16 17:58:20 -04:00
Shaun Walker
f00ea09b6e file manager component improvements 2021-09-16 18:04:50 -04:00
Shaun Walker
b9259ce6ca added optional event callback delegates to FileManager component to allow calling components to be notified on upload, change, or delete 2021-09-16 07:59:36 -04:00
Shaun Walker
0490638657 Merge pull request #1662 from sbwalker/dev
added optional event callback delegates to FileManager component to allow calling components to be notified on upload, change, or delete
2021-09-16 07:53:31 -04:00
Grayson Walker
467b6ba9da site validation 2021-09-15 19:10:14 -04:00
Marc Drexel
423a42d25b fixed invalid XML comment 2021-09-15 17:07:40 +02:00
Marc Drexel
b496dc488c Merge branch 'oqtane-dev' into dev 2021-09-15 15:23:28 +02:00
Marc Drexel
9750723035 Merge branch 'dev' of https://github.com/oqtane/oqtane.framework into oqtane-dev
# Conflicts:
#	Oqtane.Client/App.razor
2021-09-15 15:23:16 +02:00
Shaun Walker
a4f147b547 Merge pull request #1655 from gjwalk/dev
roles validation
2021-09-15 07:58:21 -04:00
Shaun Walker
0827fedb74 Merge pull request #1658 from sbwalker/dev
Added support for File descriptions, Folder capacity and image sizes. Added image resizing capability using ImageSharp - implemented in user profile. Added parameter to disable image preview in FileManager component. Overhauled Pager component and added Columns parameter for Grid mode. Populated PageState.User.IsAuthenticated in SiteRouter. Added support for zero price commercial extentions.
2021-09-15 07:57:06 -04:00
Shaun Walker
898b908c1b Added support for File descriptions, Folder capacity and image sizes. Added image resizing capability using ImageSharp - implemented in user profile. Added parameter to disable image preview in FileManager component. Overhauled Pager component and added Columns parameter for Grid mode. Populated PageState.User.IsAuthenticated in SiteRouter. Added support for zero price commercial extentions. 2021-09-15 08:02:55 -04:00
Grayson Walker
f21b70a51e roles validation 2021-09-11 18:18:23 -04:00
Shaun Walker
ba7524b754 Merge pull request #1651 from leigh-pointer/RecycleCheck
Validate if Page in Recycle Bin During Creation
2021-09-10 13:06:59 -04:00
Shaun Walker
eb068a8d53 Merge pull request #1652 from sbwalker/dev
fix #1647 - module reordering on page issue
2021-09-10 13:05:35 -04:00
Shaun Walker
14fbc3a5b4 fix #1647 - module reordering on page issue 2021-09-10 13:12:00 -04:00
Leigh
d2fa8902f9 Auto stash before rebase of "origin/RecycleCheck"
correction
2021-09-10 18:59:23 +02:00
Shaun Walker
53e5728ad2 fix #1640 to resolve issue with server prerendering, upgrade Installer to Bootstrap5, add more defensive logic and logging to DatabaseManager, fix file logger issue, update Pager to use Bootstrap5 pagination, add expiry date support for commercial extensions 2021-09-10 08:24:05 -04:00
Shaun Walker
dd7de055f6 Merge pull request #1650 from sbwalker/dev
fix #1640 to resolve issue with server prerendering,  upgrade Installer to Bootstrap5, add more defensive logic and logging to DatabaseManager, fix file logger issue, update Pager to use Bootstrap5 pagination, add expiry date support for commercial extensions
2021-09-10 08:17:52 -04:00
Leigh
3cd7249750 Page create - Recycle Bin Check
After Delete Page, Cant create page of same name #1645 issue. Added check and message if the page is in the recycle bin.
2021-09-08 08:08:24 +02:00
Shaun Walker
07165ce68d add support for trial periods 2021-09-03 15:24:51 -04:00
Shaun Walker
2c0fe71f14 Merge pull request #1642 from sbwalker/dev
add support for trial periods
2021-09-03 15:18:58 -04:00
Tonći Vatavuk
c74a53b301 update fix https://github.com/oqtane/oqtane.framework/issues/1640 2021-09-02 20:50:16 +02:00
Tonći Vatavuk
3663f723e7 fix https://github.com/oqtane/oqtane.framework/issues/1640 2021-09-02 20:32:04 +02:00
Shaun Walker
233da1508b Replacing dependency on System.Drawing with SixLabors.ImageSharp based on cross platform guidance from Microsoft 9b4520703c/accepted/2021/system-drawing-win-only/system-drawing-win-only.md 2021-09-02 11:58:31 -04:00
Shaun Walker
ad34e9aeb8 Merge pull request #1639 from sbwalker/dev
Replacing dependency on System.Drawing with SixLabors.ImageSharp based on cross platform guidance from Microsoft 9b4520703c/accepted/2021/system-drawing-win-only/system-drawing-win-only.md
2021-09-02 11:54:40 -04:00
Shaun Walker
d29dc9d036 make containing class overridable in Control Panel ( header and body are already overridable ) 2021-09-01 09:13:09 -04:00
Shaun Walker
d71030fdef Merge pull request #1638 from sbwalker/dev
make containing class overridable in Control Panel ( header and body are already overridable )
2021-09-01 09:07:02 -04:00
Shaun Walker
bb5ca475d3 fix #1628 - make DBContext Transient, modify Control Panel to use standard Bootstrap 5 offcanvas classes, add auto trimming to file logger, fix issue in File Repository related to populating Url on Add/Update. 2021-09-01 09:01:11 -04:00
Shaun Walker
01c7a8fcdb Merge pull request #1637 from sbwalker/dev
fix #1628 - make DBContext Transient, modify Control Panel to use standard Bootstrap 5 offcanvas classes, add auto trimming to file logger, fix issue in File Repository related to populating Url on Add/Update.
2021-09-01 08:55:06 -04:00
Shaun Walker
f6c46878c6 add new overloads to client-side logging methods to include LogFunction enum parameter so that it can be specified explicitly rather than only being inferred from the page action 2021-08-30 08:46:53 -04:00
Shaun Walker
acda6bba74 Merge pull request #1634 from gjwalk/dev
reset validation
2021-08-30 08:42:23 -04:00
Shaun Walker
c8ee066608 Merge pull request #1635 from sbwalker/dev
add new overloads to client-side logging methods to include LogFunction enum parameter so that it can be specified explicitly rather than only being inferred from the page action
2021-08-30 08:40:55 -04:00
Grayson Walker
ca9fffaa71 reset validation 2021-08-29 21:03:35 -04:00
Shaun Walker
e00b7c9be9 add some missing localization keys 2021-08-27 17:29:45 -04:00
Shaun Walker
ee1a2b1810 Merge pull request #1631 from sbwalker/dev
add some missing localization keys
2021-08-27 17:23:37 -04:00
Shaun Walker
14266a99b3 Merge pull request #1614 from gjwalk/dev
register validation
2021-08-27 12:57:09 -04:00
Shaun Walker
7b105107cc Merge pull request #1630 from sbwalker/dev
fix #1617 convert line break to comma when saving aliases, improve license acceptance user experience
2021-08-27 08:11:54 -04:00
Shaun Walker
bb75242a4f fix #1617 convert line break to comma when saving aliases, improve license acceptance user experience 2021-08-27 08:17:48 -04:00
Shaun Walker
39ccc30680 fix Type label in Add Folder UI, make Profile description required, fix misc Bootstrap 5 cosmetic issues, fix #1618 Alias case sensitivity in router, fix File add and update methods so they return Url, fix UrlCombine helper method to use proper slash, enhance package installation to support commercial options 2021-08-26 18:20:58 -04:00
Shaun Walker
41651075e6 Merge pull request #1627 from horacioj/typo-Message.Required.Smtp
Fix typo for RESX message Message.Required.Smtp
2021-08-26 18:15:08 -04:00
Shaun Walker
e3af463e65 Merge pull request #1629 from sbwalker/dev
fix Type label in Add Folder UI, make Profile description required, fix misc Bootstrap 5 cosmetic issues, fix #1618 Alias case sensitivity in router, fix File add and update methods so they return Url, fix UrlCombine helper method to use proper slash, enhance package installation to support commercial options
2021-08-26 18:14:59 -04:00
horacioj
5cbb8b1fa3 Fix typo for RESX message Message.Required.Smtp 2021-08-24 17:05:08 -03:00
Shaun Walker
2a7b74a0e1 Merge pull request #1622 from oqtane/revert-1603-dev
Revert "EntityBuilder UpdateColumn to dynamic type of value"
2021-08-20 16:32:18 -04:00
Shaun Walker
21fc493322 Revert "EntityBuilder UpdateColumn to dynamic type of value" 2021-08-20 16:32:04 -04:00
Grayson Walker
ea85eae4ce register validation 2021-08-18 10:55:34 -04:00
Shaun Walker
35ee97c145 Update LICENSE 2021-08-17 10:02:00 -04:00
Shaun Walker
097318cf9e make profile category optional 2021-08-17 08:13:17 -04:00
Shaun Walker
31d4f3d1b3 Merge pull request #1613 from sbwalker/dev
make profile category optional
2021-08-17 08:07:29 -04:00
Shaun Walker
83b3235a6b Merge pull request #1611 from gjwalk/dev
profiles validation
2021-08-17 08:02:57 -04:00
Grayson Walker
e47fc64c33 profiles validation 2021-08-16 14:37:11 -04:00
Shaun Walker
151a49f1ec Merge pull request #1610 from sbwalker/dev
fix #1607 - issue with setting Site Root when adding/editing a page
2021-08-16 11:33:05 -04:00
Shaun Walker
b78644f7e2 fix #1607 - issue with setting Site Root when adding/editing a page 2021-08-16 11:39:00 -04:00
Shaun Walker
d744e36dde Merge pull request #1603 from tomsync/dev
EntityBuilder UpdateColumn to dynamic type of value
2021-08-16 09:42:04 -04:00
Shaun Walker
90f4bd5120 Merge pull request #1605 from gjwalk/dev
pages validation
2021-08-16 09:41:09 -04:00
Shaun Walker
b436fcf749 Merge pull request #1609 from sbwalker/dev
support for commercial modules, themes, translations
2021-08-16 09:40:58 -04:00
Shaun Walker
ffcc229c78 support for commercial modules, themes, translations 2021-08-16 09:46:02 -04:00
Shaun Walker
ffe724b32d add support for free/paid in module, theme, translation installation 2021-08-13 15:56:22 -04:00
Shaun Walker
154d32cd31 Merge pull request #1606 from sbwalker/dev
add support for free/paid in module, theme, translation installation
2021-08-13 15:50:39 -04:00
Grayson Walker
7f056277ae pages validation 2021-08-12 14:48:23 -04:00
Shaun Walker
b19cbf54e0 add error handling to module export 2021-08-12 14:47:51 -04:00
Shaun Walker
aef0e363d8 Merge pull request #1604 from sbwalker/dev
add error handling to module export
2021-08-12 14:42:35 -04:00
Shaun Walker
6324034259 Merge pull request #1600 from gjwalk/dev
modules validation
2021-08-12 14:21:20 -04:00
Tom.Sornarin
5a1bada10c EntityBuilder UpdateColumn to dynamic type of value 2021-08-12 16:59:15 +07:00
Grayson Walker
ef90305bd7 modules validation 2021-08-09 12:38:12 -04:00
Shaun Walker
fe06a29ad2 Merge pull request #1594 from gjwalk/dev
moduleDefinitions validation
2021-08-09 11:24:00 -04:00
Shaun Walker
f6ae9822f3 Merge pull request #1599 from sbwalker/dev
fix #1593 - remove duplicate form tag from edit.razor
2021-08-09 11:21:56 -04:00
Shaun Walker
eb3e4916a8 fix #1593 - remove duplicate form tag from edit.razor 2021-08-09 11:27:39 -04:00
Shaun Walker
5a5535ea98 format license terms 2021-08-06 15:28:48 -04:00
Shaun Walker
4f8d0b1e7a Merge pull request #1596 from sbwalker/dev
format license terms
2021-08-06 15:23:22 -04:00
Grayson Walker
b1d64eac88 moduleDefinitions validation 2021-08-06 13:32:40 -04:00
Shaun Walker
04673a4804 Merge pull request #1591 from gjwalk/dev
moduleCreator validation
2021-08-06 12:55:17 -04:00
Shaun Walker
4d2f9d038a Merge pull request #1592 from sbwalker/dev
allow host username to be specified during installation, allow user to be added to host role, refresh user list after delete, improve date/time entry in scheduled jobs, require license acceptance during module and theme install
2021-08-06 12:54:39 -04:00
Shaun Walker
e4201c1a4d allow host username to be specified during installation, allow user to be added to host role, refresh user list after delete, improve date/time entry in scheduled jobs, require license acceptance during module and theme install 2021-08-06 12:59:56 -04:00
Grayson Walker
030c001371 moduleCreator validation 2021-08-06 11:44:52 -04:00
Shaun Walker
bd351f770b Merge pull request #1588 from gjwalk/dev
langauges validation
2021-08-06 08:56:47 -04:00
Grayson Walker
63093cca3b langauges validation 2021-08-05 12:24:11 -04:00
Shaun Walker
5c42e8e5bc Merge pull request #1587 from gjwalk/dev
jobs validation
2021-08-05 08:38:18 -04:00
Shaun Walker
153934b311 Merge pull request #1582 from leigh-pointer/1579
Fixes #1579 Exception when browsing to /login when you are already logged in
2021-08-05 08:38:05 -04:00
Grayson Walker
4b1ead1a36 jobs validation 2021-08-04 19:15:52 -04:00
Leigh
ddafd21706 Fixes #1579 Exception when browsing to /login when you are already logged in
Added PageState.User check
2021-08-04 19:33:54 +02:00
Shaun Walker
6059a944bf Merge pull request #1577 from gjwalk/dev
files validation
2021-08-03 08:45:48 -04:00
Grayson Walker
1cc26c3902 files validation 2021-07-31 16:59:03 -04:00
Grayson Walker
00ca3d856b reset admin 2021-07-31 15:09:14 -04:00
Grayson Walker
9af8ab92c9 themes - users validation changes 2021-07-29 16:54:32 -04:00
Grayson Walker
46fcfcc321 reset - systemInfo validation changes 2021-07-29 16:52:27 -04:00
Grayson Walker
cf40462531 moduleDefintions - profiles validation changes 2021-07-29 16:46:58 -04:00
Grayson Walker
2dbf9671d9 dashboard - moduleCretaor changes 2021-07-29 16:38:36 -04:00
Grayson Walker
e42a687c9b fixing spacing 2021-07-29 15:28:15 -04:00
Grayson Walker
72c154b048 fix appsettings 2021-07-27 21:17:13 -04:00
Grayson Walker
b0921513c1 fix to theme 2021-07-27 21:12:18 -04:00
Grayson Walker
33a76c61ca updated modules for input requirements 2021-07-27 16:24:01 -04:00
Shaun Walker
c0254d0b92 Merge pull request #1567 from ADefWebserver/dev
Removes writing database connection string to appsettings.json in AzureDeploy.json
2021-07-22 09:21:19 -04:00
ADefWebserver
99d05fe4f9 Update README.md 2021-07-21 06:56:10 -07:00
ADefWebserver
f8ba6a0c5f Update README.md
Temporarily pointing to my Dev version of azuredeploy (do not merge)
2021-07-21 06:18:34 -07:00
ADefWebserver
3a58ed63e9 Update azuredeploy.json
https://github.com/oqtane/oqtane.framework/issues/1547
2021-07-21 06:14:42 -07:00
Shaun Walker
8aac801af2 Merge pull request #1566 from sbwalker/dev
update install wizard to Bootstrap 5
2021-07-19 16:44:43 -04:00
Shaun Walker
1cc16a7ed4 update install wizard to Bootstrap 5 2021-07-19 16:49:31 -04:00
Shaun Walker
7fe04d9651 Merge pull request #1564 from nicpitsch/dev
Copy external Theme to Oqtane.Server.
2021-07-19 16:44:34 -04:00
Shaun Walker
01a9dc4d2d Merge pull request #1562 from leigh-pointer/OffCanvas
user experience updates
2021-07-19 16:44:25 -04:00
nicpitsch
1456462ca8 Copy external Theme to Oqtane.Server. 2021-07-19 20:53:45 +02:00
Leigh
77415dc0e0 user experience updates 2021-07-18 17:30:32 +02:00
Shaun Walker
696b1970fc Update README.md 2021-07-18 11:15:03 -04:00
Shaun Walker
0e6baae366 Merge pull request #1554 from leigh-pointer/OffCanvas
ConltolPanel to use Bootstrap Offcanvas component
2021-07-18 10:42:09 -04:00
Leigh
437e9ee43b Modifcations for ControlPanel BS5
current styles in app.css and theme.css for app-controlpanel removed as no longer needed.

Removed the _display var as that is no longer beign used.
2021-07-15 16:28:12 +02:00
Shaun Walker
6546f47bb2 Merge pull request #1556 from leigh-pointer/UsernameReadOnly 2021-07-15 09:47:51 -04:00
Leigh
88c866057f Fix for #1555 Username readonly on Register form
Removed the readonly attribute from the username field.
2021-07-15 15:41:20 +02:00
Leigh
3521dd41cd ConltolPanel to use Bootstrap Offcanvas component 2021-07-14 10:18:39 +02:00
Shaun Walker
dff3e6aaca Merge pull request #1550 from leigh-pointer/ModificationsBS5 2021-07-12 10:24:42 -04:00
Shaun Walker
4b04e6c8dc Merge pull request #1551 from leigh-pointer/ExtModDiv 2021-07-12 10:23:57 -04:00
Leigh
37672ea632 Modified External Module Template
replace tables in markup with responsive approach.
2021-07-11 14:27:18 +02:00
Leigh
31f35ad902 Modifications for Bootstrap 5
replace tables in markup with responsive approach
2021-07-11 14:16:33 +02:00
Shaun Walker
0b7b34f336 Merge pull request #1549 from leigh-pointer/Bootstrap5
modifications for Bootstrap 5
2021-07-10 19:35:41 -04:00
Leigh
fca290f8f5 Modifications for Bootstrap 5
Admin section now finished.  All Tables now replaced with div
2021-07-10 13:37:05 +02:00
Leigh
9da3b77f7d modifications for Bootstrap 5
Updated Admin areas Users and Roles
2021-07-10 09:00:34 +02:00
Shaun Walker
7b796f4a5f Merge pull request #1548 from sbwalker/dev
modifications for Bootstrap 5
2021-07-09 11:38:42 -04:00
Shaun Walker
0ce81169a6 modifications for Bootstrap 5 2021-07-09 11:43:37 -04:00
Shaun Walker
d1c2abf7e3 Merge pull request #1545 from hishamco/fix
Fix loading satellite assemblies
2021-07-08 10:34:02 -04:00
Shaun Walker
010872ef35 Merge pull request #1546 from sbwalker/dev
bootstrap5 fix to theme creator template, modifications to updater app
2021-07-08 10:31:19 -04:00
Shaun Walker
f536033087 framework updater UX improvements 2021-07-08 10:36:08 -04:00
Shaun Walker
9083888686 bootstrap5 fix to theme creator template, modifications to updater app 2021-07-07 16:15:38 -04:00
hishamco
cf2d8531a3 Fix loading satellite assemblies 2021-07-07 20:38:53 +03:00
Shaun Walker
48b9e2f97b Merge pull request #1538 from oqtane/master
Merge pull request #1537 from oqtane/dev
2021-07-06 15:31:55 -04:00
Shaun Walker
57ac20519a Merge pull request #1537 from oqtane/dev
2.2.0 release
2021-07-06 15:31:18 -04:00
Shaun Walker
792086140b fix horizontal menu highlighting issue 2021-07-06 14:21:54 -04:00
Shaun Walker
ddeb05dfe2 Merge pull request #1535 from sbwalker/dev
fix horizontal menu highlighting issue
2021-07-06 14:17:12 -04:00
Shaun Walker
276431b62d update theme creator template to Bootstrap5 2021-07-06 11:00:45 -04:00
Shaun Walker
a89e7c06d4 Merge pull request #1534 from sbwalker/dev
update theme creator template to Bootstrap5
2021-07-06 10:56:02 -04:00
Shaun Walker
a79535d7d1 prepare for 2.2.0 release 2021-07-05 15:22:24 -04:00
Shaun Walker
649a134214 Merge pull request #1533 from sbwalker/dev
prepare for 2.2.0 release
2021-07-05 15:17:43 -04:00
Shaun Walker
910630cd26 Merge pull request #1531 from leigh-pointer/ModuleTemplates
Fix for #1530 Error in Module templates
2021-07-05 14:56:18 -04:00
Leigh
a1baf70524 fix #1530 for Error in Module templates
The Get public Models.[Module] Get(int id) method in the [Module]Controller has an incorrect IF statement which in turn returns nothing and logs an error
2021-07-05 08:25:16 +02:00
Shaun Walker
7348540c4d Update README.md 2021-07-02 20:07:41 -04:00
Shaun Walker
534c6794f2 Merge pull request #1529 from sbwalker/dev
upgrade to Boostrap 5
2021-07-02 19:59:10 -04:00
Shaun Walker
cb7d9a0371 upgrade to Boostrap 5 2021-07-02 20:03:51 -04:00
Shaun Walker
525cbb87b0 allow disabling of swagger and package service 2021-07-01 09:11:29 -04:00
Shaun Walker
7f420e8a8f Merge pull request #1528 from sbwalker/dev
allow disabling of swagger and package service
2021-07-01 09:06:44 -04:00
Shaun Walker
eea417ff44 added logging for startup issues 2021-07-01 07:37:03 -04:00
Shaun Walker
070e00b735 Merge pull request #1527 from sbwalker/dev
added logging for startup issues
2021-07-01 07:32:34 -04:00
Shaun Walker
5268c326a1 suppress Internal EF Core API usage warning messages on build 2021-06-28 10:27:29 -04:00
Shaun Walker
49b2c323d0 Merge pull request #1523 from sbwalker/dev
suppress Internal EF Core API usage warning messages on build
2021-06-28 10:22:49 -04:00
Shaun Walker
bf6edceb36 Fix issue where module definition version was not being loaded correctly on startup. Also user customizable module definition properties were being overwritten on upgrade. 2021-06-28 10:21:48 -04:00
Shaun Walker
91eeeaf064 Merge pull request #1522 from sbwalker/dev
Fix issue where module definition version was not being loaded correctly on startup. Also user customizable module definition properties were being overwritten on upgrade.
2021-06-28 10:17:40 -04:00
Shaun Walker
17c0aec1fb show friendly message when no packages match criteria 2021-06-27 20:20:01 -04:00
Shaun Walker
e4c98ba24f Merge pull request #1519 from sbwalker/dev
show friendly message when no packages match criteria
2021-06-27 20:15:23 -04:00
Shaun Walker
8ef83b2de8 improve register for updates 2021-06-27 18:33:41 -04:00
Shaun Walker
376482e66e Merge pull request #1518 from sbwalker/dev
improve register for updates
2021-06-27 18:29:05 -04:00
Shaun Walker
2433958a0f fixed issue in SharedResource file 2021-06-27 08:59:04 -04:00
Shaun Walker
50bddd072b Merge pull request #1517 from sbwalker/dev
fixed issue in SharedResource file
2021-06-27 08:54:35 -04:00
Shaun Walker
b77d313715 Merge pull request #1515 from gjwalk/dev
Shared resources added
2021-06-27 08:50:46 -04:00
Shaun Walker
b59706ab8b Merge pull request #1516 from sbwalker/dev
add ability to register for updates
2021-06-27 08:47:25 -04:00
Shaun Walker
9e004f5b3c add ability to register for updates 2021-06-27 08:48:18 -04:00
gjwalk
f989f63546 Merge branch 'dev' into dev 2021-06-25 17:56:21 -04:00
Grayson Walker
ef6f5f2769 update resources 2021-06-25 17:03:29 -04:00
Grayson Walker
ba9ca22aaa update to resources 2021-06-25 16:34:30 -04:00
Shaun Walker
db1808d3e9 additional system info 2021-06-25 15:06:52 -04:00
Shaun Walker
8ad61a23c8 Merge pull request #1514 from sbwalker/dev
additional system info
2021-06-25 15:02:38 -04:00
Shaun Walker
e1e4d82684 resx file corrections 2021-06-25 08:22:36 -04:00
Shaun Walker
5d84eeea1d Merge pull request #1513 from sbwalker/dev
resx file corrections
2021-06-25 08:18:05 -04:00
Shaun Walker
509f054961 package UI updates 2021-06-25 08:10:15 -04:00
Shaun Walker
3a85eed397 Merge pull request #1512 from sbwalker/dev
package UI updates
2021-06-25 08:05:51 -04:00
Shaun Walker
52bcdb12c5 package management modifications 2021-06-24 18:02:01 -04:00
Shaun Walker
30a667debf Merge pull request #1511 from sbwalker/dev
package management modifications
2021-06-24 17:57:23 -04:00
Shaun Walker
161ab56701 improve handling of response status and logging in package controller 2021-06-24 10:42:43 -04:00
Shaun Walker
55bf2f1b6a Merge pull request #1510 from sbwalker/dev
improve handling of response status and logging in package controller
2021-06-24 10:38:31 -04:00
Shaun Walker
fb2a8e987e default resx fixes 2021-06-24 08:02:39 -04:00
Shaun Walker
0608287b5f Merge pull request #1509 from sbwalker/dev
default resx fixes
2021-06-24 07:58:08 -04:00
Shaun Walker
7fa30ff23c Merge pull request #1501 from Gotiap/dev
Allowed pages for external modules.
2021-06-24 07:37:49 -04:00
Shaun Walker
b0f76ff4e8 Merge pull request #1508 from sbwalker/dev
Page IsClickable column must be nullable in order to support upgrades, add more defensive logic
2021-06-24 07:37:27 -04:00
Shaun Walker
8e7b553ca8 Page IsClickable column must be nullable in order to support upgrades, add more defensive logic 2021-06-24 07:41:34 -04:00
Goti Ankit
89cc389918 Undo changes for login 2021-06-24 11:30:09 +05:30
Shaun Walker
bfafffd8cb add search to package manager components 2021-06-23 13:00:44 -04:00
Shaun Walker
4ea92652dd Merge pull request #1499 from ijaz-saeed/rich-text-editor
OnInitialized is not the right method to do this, Content is not set yet
2021-06-23 12:58:25 -04:00
Shaun Walker
6fbb325c42 Merge pull request #1506 from sbwalker/dev
add search to package manager components
2021-06-23 12:56:16 -04:00
Shaun Walker
c2f7546488 add database diagram 2021-06-22 14:30:20 -04:00
Shaun Walker
90778f5e1e Update README.md 2021-06-22 14:28:06 -04:00
Shaun Walker
c7d5f95949 Update README.md 2021-06-22 14:27:17 -04:00
Shaun Walker
67dff508ef Merge pull request #1504 from sbwalker/dev
add database diagram
2021-06-22 14:25:43 -04:00
Shaun Walker
c4e6a4af49 fix remaining default resx differences, enhance module message with ability to dismiss, fix issue in ConfigManager.RemoveSetting, introduce package registry service 2021-06-22 14:14:46 -04:00
Shaun Walker
c236e80e95 Merge pull request #1498 from ijaz-saeed/dev
adding SaveChangesAsync overloads to support Async save
2021-06-22 14:10:33 -04:00
Shaun Walker
1906a0ee8a Merge pull request #1502 from sbwalker/dev
fix remaining default resx differences, enhance module message with ability to dismiss, fix issue in ConfigManager.RemoveSetting, introduce package registry service
2021-06-22 14:10:23 -04:00
Goti Ankit
d348e9715f Allowed pages for external module.
Login internal module while edit, resolved error to be edit.
2021-06-22 10:51:05 +05:30
isaeed
91a1bfcab2 adding SaveChangesAsync overloads to support Async save 2021-06-20 17:52:41 +05:00
isaeed
73f2fc4f13 OnInitialized is not the right method to do this, Content is not available yet 2021-06-20 17:51:25 +05:00
Shaun Walker
247e00ecd4 implement shared resources 2021-06-18 16:56:54 -04:00
Shaun Walker
3274ab6258 Merge pull request #1497 from sbwalker/dev
implement shared resources
2021-06-18 16:52:27 -04:00
Shaun Walker
6bff09d0ca fix Localizer class specification 2021-06-18 16:46:15 -04:00
Shaun Walker
19f3095483 Merge pull request #1496 from sbwalker/dev
fix Localizer class specification
2021-06-18 16:41:47 -04:00
Shaun Walker
2e947625cd fix issue with HtmlText module rendering 2021-06-18 16:36:18 -04:00
Shaun Walker
8198f36530 Merge pull request #1495 from sbwalker/dev
fix issue with HtmlText module rendering
2021-06-18 16:32:09 -04:00
Shaun Walker
8bc0402801 fix syntax error 2021-06-18 16:30:49 -04:00
Shaun Walker
87aadcff5b Merge pull request #1494 from sbwalker/dev
fix syntax error
2021-06-18 16:27:00 -04:00
Shaun Walker
dc44fcd0d9 Merge pull request #1493 from gjwalk/dev
create default rex files with static keys
2021-06-18 16:21:37 -04:00
gjwalk
f7363504c2 Merge branch 'dev' into dev 2021-06-18 15:35:20 -04:00
Grayson Walker
ae0edcfd2d create default rex files with static keys 2021-06-18 14:45:38 -04:00
Shaun Walker
b180c260e5 Merge pull request #1492 from sbwalker/dev
improved error handling, improved consistency of console error messages, added ability to add a Decimal column in Migrations
2021-06-18 12:57:21 -04:00
Shaun Walker
3bc5744007 improved error handling, improved consistency of console error messages, added ability to add a Decimal column in Migrations 2021-06-18 13:01:42 -04:00
Shaun Walker
32c49f74d3 fix module template issues 2021-06-17 12:12:19 -04:00
Shaun Walker
8b70d1ccdc Merge pull request #1491 from sbwalker/dev
fix module template issues
2021-06-17 12:08:03 -04:00
Shaun Walker
f330c4fcb6 add extension method for Localization which allows specification of key and value 2021-06-16 22:16:48 -04:00
Shaun Walker
a953ca752e Merge pull request #1490 from sbwalker/dev
add extension method for Localization which allows specification of key and value
2021-06-16 22:12:48 -04:00
Shaun Walker
d32b622f7e allow order to be defined in page templates 2021-06-16 17:24:45 -04:00
Shaun Walker
8354d66c84 Merge pull request #1489 from sbwalker/dev
allow order to be defined in page templates
2021-06-16 17:20:53 -04:00
Shaun Walker
7ee9923b52 Merge pull request #1483 from leigh-pointer/SResControlPanel
Introduce SharedResource Localisation to ControlPanel
2021-06-16 16:27:52 -04:00
Shaun Walker
31c412a886 Merge pull request #1488 from sbwalker/dev
improvements to refresh logic, module template enhancements
2021-06-16 16:26:53 -04:00
Shaun Walker
72ff6fa0e7 improvements to refresh logic, module template enhancements 2021-06-16 16:31:02 -04:00
Shaun Walker
c6e12a614a Merge pull request #1485 from hishamco/database-projects
Add missing Oqtane.Server into Databases solution
2021-06-16 10:09:26 -04:00
Shaun Walker
cec24e7446 improve multi-tenancy navigation 2021-06-16 08:30:41 -04:00
Shaun Walker
05d7c7fc74 Merge pull request #1484 from hishamco/localization-cookie
Fix parsing localization cookie when the value is not present
2021-06-16 08:26:50 -04:00
Shaun Walker
0d10645d57 Merge pull request #1486 from sbwalker/dev
improve multi-tenancy navigation
2021-06-16 08:26:36 -04:00
hishamco
1bfe4fbd4f Add missing Oqtane.Server to Databases solutions 2021-06-16 11:55:36 +03:00
hishamco
c62a4ae8ae Fix parsing localization cookie when the value is not present 2021-06-16 11:02:12 +03:00
Leigh
4fcfb2ab4e Introduce SharedResource Localisation
Updated the ControlPanel to use Shared resources for;
 Add, Edit, Delete, Cancel

Corrected the SharedResources.cs namespace.
2021-06-16 09:46:33 +02:00
Leigh Pointer
0f208f3c30 Merge pull request #1 from oqtane/dev
merge
2021-06-16 09:19:09 +02:00
Shaun Walker
65a14da5a9 improve validation and exception handling in API Controllers 2021-06-15 19:11:00 -04:00
Shaun Walker
53f3245f1d Merge pull request #1482 from sbwalker/dev
improve validation and exception handling in API Controllers
2021-06-15 19:06:52 -04:00
Shaun Walker
ffbabcfb28 Update README.md 2021-06-15 09:18:17 -04:00
Shaun Walker
0a2293119e added back missing ITenantManager registration removed in #1245 2021-06-15 08:32:39 -04:00
Shaun Walker
abd9e2798d Merge pull request #1480 from sbwalker/dev
added back missing ITenantManager registration removed in #1245
2021-06-15 08:28:44 -04:00
Shaun Walker
f6cc11bd3b add logic removed in #1245 back to HttpClient creation 2021-06-15 08:23:26 -04:00
Shaun Walker
3e3bf937fd Merge pull request #1479 from sbwalker/dev
add logic removed in #1245 back to HttpClient creation
2021-06-15 08:19:20 -04:00
Shaun Walker
0fd16fbb59 added Oqtane.Client to _Imports so it can find the new SharedResources class 2021-06-15 07:59:05 -04:00
Shaun Walker
b2098bb2db Merge pull request #1478 from sbwalker/dev
added Oqtane.Client to _Imports so it can find the new SharedResources class
2021-06-15 07:54:54 -04:00
Shaun Walker
87c99e2ba7 Merge branch 'oqtane:dev' into dev 2021-06-15 07:46:51 -04:00
Shaun Walker
4a11524db3 Merge pull request #1245 from hishamco/clean-startup
Clean Startup Class
2021-06-15 07:45:12 -04:00
Shaun Walker
a9efc2792e Merge pull request #96 from oqtane/dev
sync
2021-06-15 07:42:22 -04:00
Shaun Walker
9558894a4f moved SharedResources class to proper location 2021-06-15 07:43:12 -04:00
Shaun Walker
abfb451290 Merge branch 'dev' into dev 2021-06-15 07:42:02 -04:00
Shaun Walker
e279bca8ad Merge pull request #1476 from leigh-pointer/SharedResource
SharedResources to reside at the project root.
2021-06-15 07:40:27 -04:00
Leigh
f2b3d6bc5f SharedResources to reside at the project root.
Namespace was changed from Oqtane to Oqtane.Client
2021-06-15 07:09:22 +02:00
Shaun Walker
28694fc11f added defensive logic to app.razor, relocated shared resource definition in preparation for utilizing shared resources 2021-06-14 17:29:23 -04:00
Shaun Walker
e99d62d5c7 Merge pull request #1475 from sbwalker/dev
added defensive logic to app.razor, relocated shared resource definition in preparation for utilizing shared resources
2021-06-14 17:25:23 -04:00
gjwalk
216dd39474 Merge branch 'oqtane:dev' into dev 2021-06-13 15:24:05 -04:00
Shaun Walker
643895b62b add icon for reuse 2021-06-12 09:21:24 -04:00
Shaun Walker
bd0ee1370c Merge pull request #1471 from sbwalker/dev
add icon for reuse
2021-06-12 09:17:10 -04:00
hishamco
7c181b65cd Fix merge conflict 2021-06-12 00:18:57 +03:00
Shaun Walker
bdf36fc49c bug fixes 2021-06-11 17:07:54 -04:00
Shaun Walker
965b935128 Merge pull request #1470 from sbwalker/dev
bug fixes
2021-06-11 17:03:57 -04:00
hishamco
126024991c Merge remote-tracking branch 'upstream/dev' into clean-startup
# Conflicts:
#	Oqtane.Client/Program.cs
#	Oqtane.Server/Startup.cs
2021-06-11 23:54:38 +03:00
Shaun Walker
8f944e29ac set the DefaultDBType as the default database option in the Installer and Add Site UI 2021-06-11 08:43:46 -04:00
Shaun Walker
7b26ecfec8 Merge pull request #1467 from sbwalker/dev
set the DefaultDBType as the default database option in the Installer and Add Site UI
2021-06-11 08:40:17 -04:00
Shaun Walker
aa5aca3a8e back out auth policy header support as Blazor HttpClient is registered as Scoped and can not support variable headers 2021-06-11 07:54:02 -04:00
Shaun Walker
c46ef0fbc4 Merge pull request #1466 from sbwalker/dev
back out auth policy header support as Blazor HttpClient is registered as Scoped and can not support variable headers
2021-06-11 07:50:00 -04:00
Shaun Walker
d82fc8be90 added IsClickable Page property #1092, improve validation in Role Management, display database information in SQL Management, improve HttpClient header support 2021-06-10 20:10:46 -04:00
Shaun Walker
a51e7c2b44 Merge pull request #1465 from sbwalker/dev
added IsClickable Page property #1092, improve validation in Role Management, display database information in SQL Management, improve HttpClient header support
2021-06-10 20:06:41 -04:00
Shaun Walker
52d9c14d78 Update README.md 2021-06-10 13:06:05 -04:00
Shaun Walker
4bee097e66 fix Site Settings issue 2021-06-10 10:55:59 -04:00
Shaun Walker
6899a7cbb2 Merge pull request #1464 from sbwalker/dev
fix Site Settings issue
2021-06-10 10:51:49 -04:00
Shaun Walker
edc0e2a8fe Merge pull request #1462 from albahadly/dev
fix issue: WebAssembly with IDM app
2021-06-10 10:46:52 -04:00
salwan albahadly
f5f374d2ae #1460 fix issue: WebAssembly with IDM app 2021-06-11 01:06:20 +12:00
Shaun Walker
ece90c39cb Merge pull request #1461 from sbwalker/dev
refactoring, enhancements, and some fixes
2021-06-10 08:13:35 -04:00
Shaun Walker
bc720555c4 refactoring, enhancements, and some fixes 2021-06-10 08:16:02 -04:00
salwan albahadly
25dc6b9b08 when set Runtime as WebAssembly, IDM app recognize oqtane.zip and download this file and this make an issue and oqtane not work correctly and for this I set diffrent extention that IDM cant recognize it 2021-06-09 12:45:31 +12:00
Shaun Walker
36bd8e4b7f Update README.md 2021-06-07 15:58:04 -04:00
Shaun Walker
82c05a841f Improve validation and error handling in Controller methods 2021-06-07 15:29:08 -04:00
Shaun Walker
dd3385c447 Update README.md 2021-06-07 15:25:57 -04:00
Shaun Walker
93031c9aaa Merge pull request #1457 from sbwalker/dev
Improve validation and error handling in Controller methods
2021-06-07 15:25:04 -04:00
Shaun Walker
54cd360bb5 allow host to change runtime and rendermode settings in System Info 2021-06-06 11:04:37 -04:00
Shaun Walker
aa30caa1a7 Merge pull request #1451 from sbwalker/dev
allow host to change runtime and rendermode settings in System Info
2021-06-06 11:00:58 -04:00
Shaun Walker
900ea8cfbc allow host to view tenant information in Site Settings 2021-06-06 10:36:13 -04:00
Shaun Walker
cf99f04451 Merge pull request #1450 from sbwalker/dev
allow host to view tenant information in Site Settings
2021-06-06 10:32:21 -04:00
Shaun Walker
357ef09dd1 new controller auth parameter should take precedence over legacy 2021-06-06 10:03:54 -04:00
Shaun Walker
42d653969d Merge pull request #1449 from sbwalker/dev
new controller auth parameter should take precedence over legacy
2021-06-06 10:00:09 -04:00
Shaun Walker
a2b808fde2 use new service auth pattern in module template 2021-06-04 15:01:25 -04:00
Shaun Walker
33405b9457 Merge pull request #1448 from sbwalker/dev
use new service auth pattern in module template
2021-06-04 14:57:23 -04:00
Shaun Walker
ffb5ca44ec Merge pull request #1447 from oqtane/master
Merge pull request #1446 from oqtane/dev
2021-06-04 13:05:35 -04:00
Shaun Walker
3f8a0d4933 Merge pull request #1446 from oqtane/dev
2.1.0 release
2021-06-04 12:56:13 -04:00
Shaun Walker
970845d640 Merge pull request #1445 from sbwalker/dev
create Public folder during installation
2021-06-04 12:26:42 -04:00
Shaun Walker
fab06a5279 create Public folder during installation 2021-06-04 12:30:46 -04:00
Shaun Walker
ff59a12443 UX clarification 2021-06-04 12:18:04 -04:00
Shaun Walker
b7af8d0d91 Merge pull request #1444 from sbwalker/dev
UX clarification
2021-06-04 12:14:38 -04:00
Shaun Walker
3401d33a35 Update README.md 2021-06-04 09:32:58 -04:00
Shaun Walker
69c948ad79 misc site settings UX fixes 2021-06-04 08:42:33 -04:00
Shaun Walker
07b684d49a Merge pull request #1443 from sbwalker/dev
misc site settings UX fixes
2021-06-04 08:38:51 -04:00
Shaun Walker
ab3af5f294 use full package name for manifest 2021-06-04 07:30:33 -04:00
Shaun Walker
aefdcdcd8a Merge pull request #1442 from sbwalker/dev
use full package name for manifest
2021-06-04 07:26:32 -04:00
Shaun Walker
7b32a16fd8 handle versionless package names in installer 2021-06-03 15:03:11 -04:00
Shaun Walker
7c7dbfe638 Merge pull request #1440 from sbwalker/dev
handle versionless package names in installer
2021-06-03 14:59:13 -04:00
Shaun Walker
e527f6e3d1 updater improvements 2021-06-03 11:05:40 -04:00
Shaun Walker
5f068081f3 Merge pull request #1439 from sbwalker/dev
updater improvements
2021-06-03 11:01:57 -04:00
Shaun Walker
02de8e0bf7 fix path 2021-06-03 09:01:52 -04:00
Shaun Walker
f412657987 Merge pull request #1438 from sbwalker/dev
fix path
2021-06-03 08:57:46 -04:00
Shaun Walker
ec462e2372 Merge pull request #1437 from sbwalker/dev
create all artifacts in Oqtane.Packages folder
2021-06-03 08:56:01 -04:00
Shaun Walker
0deffff370 create all artifacts in Oqtane.Packages folder 2021-06-03 08:58:45 -04:00
Shaun Walker
57885f71a7 Revert "create all artifacts in Oqtane.Package folder"
This reverts commit a05a1d6321.
2021-06-03 08:52:51 -04:00
Shaun Walker
a05a1d6321 create all artifacts in Oqtane.Package folder 2021-06-03 08:52:25 -04:00
Shaun Walker
060f764da7 separated updater from main solution 2021-06-03 08:37:56 -04:00
Shaun Walker
ae2caacc81 Merge pull request #1436 from sbwalker/dev
separated updater from main solution
2021-06-03 08:34:02 -04:00
Shaun Walker
dd9f2e6675 improve System Update user experience 2021-06-02 19:22:20 -04:00
Shaun Walker
b5a81d8328 Merge pull request #1435 from sbwalker/dev
improve System Update user experience
2021-06-02 19:19:22 -04:00
Shaun Walker
d1204c7dea Merge pull request #1434 from sbwalker/dev
use secure Packages location for upgrade process
2021-06-02 17:10:44 -04:00
Shaun Walker
3db12a225b use secure Packages location for upgrade process 2021-06-02 16:53:55 -04:00
Shaun Walker
912b775553 preserve backward compatibility of CreateAuthorizationPolicyUrl method 2021-06-02 12:20:31 -04:00
Shaun Walker
25952b53f2 Merge pull request #1433 from sbwalker/dev
preserve backward compatibility of CreateAuthorizationPolicyUrl method
2021-06-02 12:16:31 -04:00
Shaun Walker
9bccc402a0 use versionless package names for database providers to support future framework upgrades 2021-06-02 08:09:46 -04:00
Shaun Walker
b44cc06324 Merge pull request #1432 from sbwalker/dev
use versionless package names for database providers to support future framework upgrades
2021-06-02 08:05:48 -04:00
Shaun Walker
1b4934d623 Merge pull request #1431 from sbwalker/dev
fix issue in theme creator
2021-06-01 15:45:09 -04:00
Shaun Walker
8dfe8eba27 fix issue in theme creator 2021-06-01 15:49:06 -04:00
Shaun Walker
56a1c1a57d Update README.md 2021-06-01 14:51:13 -04:00
Shaun Walker
3c48657e73 version all DLLs and packages consistently and fix all deprecated iconurl warnings 2021-06-01 12:30:21 -04:00
Shaun Walker
c7442f12e8 Merge pull request #1430 from sbwalker/dev
version all DLLs and packages consistently and fix all deprecated iconurl warnings
2021-06-01 12:26:23 -04:00
Shaun Walker
c91b8e72c0 fix EF Core version value in upgrade scripts 2021-06-01 10:31:16 -04:00
Shaun Walker
dc4e3213b1 Merge pull request #1429 from sbwalker/dev
fix EF Core version value in upgrade scripts
2021-06-01 10:27:30 -04:00
Shaun Walker
5a46d6b842 Merge pull request #1428 from cnurse/dev 2021-05-31 21:50:11 -04:00
Charles Nurse
c6f4723ee3 Fix for Issue #1420 2021-05-31 15:55:09 -07:00
Shaun Walker
b76e8498d7 move logic for inserting migrations history from MigrateableModuleBase to MigrationUtils 2021-05-31 16:17:06 -04:00
Shaun Walker
0347aae140 Merge pull request #1427 from sbwalker/dev
move logic for inserting migrations history from MigrateableModuleBase to MigrationUtils
2021-05-31 16:13:12 -04:00
Shaun Walker
4576f056d5 Merge pull request #1424 from 2sic-forks/dev
More docs for #1382
2021-05-31 11:56:18 -04:00
Shaun Walker
879829b9bb Merge pull request #1425 from sbwalker/dev
added metadata support for Module and Theme templates
2021-05-31 11:55:54 -04:00
Shaun Walker
ddd657bfa7 added metadata support for Module and Theme templates 2021-05-31 11:59:19 -04:00
ijungleboy
d52cbf6817 More docs for https://github.com/oqtane/oqtane.framework/issues/1382 - should not affect any code 2021-05-31 15:45:07 +02:00
Shaun Walker
276817c89d made RenderMode configurable 2021-05-30 15:37:23 -04:00
Shaun Walker
d8b811e09f Update appsettings.release.json 2021-05-30 15:35:19 -04:00
Shaun Walker
b21ffc2d63 Update appsettings.json 2021-05-30 15:35:04 -04:00
Shaun Walker
c402113df3 Merge pull request #1423 from sbwalker/dev
made RenderMode configurable
2021-05-30 15:34:04 -04:00
Shaun Walker
afcc5e2170 handle HtmlText module transition from SQL scripts to Migrations in module rather than in core framework 2021-05-30 13:16:26 -04:00
Shaun Walker
5a2ad4f827 Merge pull request #1422 from sbwalker/dev
handle HtmlText module transition from SQL scripts to Migrations in module rather than in core framework
2021-05-30 13:12:27 -04:00
Shaun Walker
967f0fe626 leave a copy of database provider packages in distribution folder 2021-05-29 17:38:58 -04:00
Shaun Walker
f8aeef06b2 Merge pull request #1421 from sbwalker/dev
leave a copy of database provider packages in distribution folder
2021-05-29 17:35:03 -04:00
Shaun Walker
7ed93b5ce6 package installer fix to handle .bak files 2021-05-29 15:13:27 -04:00
Shaun Walker
89cd0c760a Merge pull request #1418 from sbwalker/dev
package installer fix to handle .bak files
2021-05-29 15:09:29 -04:00
Shaun Walker
d73e1d21c7 prepare for 2.1.0 release 2021-05-29 13:00:36 -04:00
Shaun Walker
21ad5f4c1a Merge pull request #1417 from sbwalker/dev
prepare for 2.1.0 release
2021-05-29 12:56:55 -04:00
Shaun Walker
e84908485f add support for custom "internal" module and theme templates. fix package installer issue related to absolute paths 2021-05-29 11:48:29 -04:00
Shaun Walker
b05fbae401 Merge pull request #1416 from sbwalker/dev
add support for custom "internal" module and theme templates. fix package installer issue related to absolute paths
2021-05-29 11:44:30 -04:00
Shaun Walker
54a639d1d5 Module Creator external template changes for 2.1 - supporting mutliple databases, EF Core migrations, and other multi-tenancy improvements 2021-05-28 17:01:25 -04:00
Shaun Walker
ba61c3318b Merge pull request #1413 from sbwalker/dev
Module Creator external template changes for 2.1 - supporting mutliple databases, EF Core migrations, and other multi-tenancy improvements
2021-05-28 16:57:39 -04:00
Shaun Walker
8529a42075 fixed upgrade logic 2021-05-28 16:01:11 -04:00
Shaun Walker
b62a9fa1ff Merge pull request #1412 from sbwalker/dev
fixed upgrade logic
2021-05-28 15:57:16 -04:00
Shaun Walker
e559a11261 Delete Oqtane.Server/Content/Tenants/1/Sites/1 directory 2021-05-28 08:43:42 -04:00
Shaun Walker
e878db2f21 Merge pull request #1411 from sbwalker/dev
add new packages location to gitignore
2021-05-28 08:40:12 -04:00
Shaun Walker
e693f6b52b add new packages location to gitignore 2021-05-28 08:44:14 -04:00
Shaun Walker
e0c2763c9f refactoring in preparation for release 2021-05-28 07:53:49 -04:00
Shaun Walker
723ae68609 Merge pull request #1410 from sbwalker/dev
refactoring in preparation for release
2021-05-28 07:49:56 -04:00
Shaun Walker
9dbfbd78a4 Update README.md 2021-05-27 21:47:04 -04:00
Shaun Walker
9cd29b62ed Update README.md 2021-05-27 21:46:27 -04:00
Shaun Walker
4108c07862 moved Packages folder to secure location 2021-05-27 21:39:43 -04:00
Shaun Walker
01716099d6 Merge pull request #1408 from sbwalker/dev
moved Packages folder to secure location
2021-05-27 21:35:57 -04:00
Shaun Walker
a144a5c432 improved legacy support for module authorization policy 2021-05-27 21:01:25 -04:00
Shaun Walker
dbccfe4bf7 Merge pull request #1407 from sbwalker/dev
improved legacy support for module authorization policy
2021-05-27 20:57:46 -04:00
Shaun Walker
9aff82e504 Update appsettings.release.json 2021-05-27 16:17:09 -04:00
Shaun Walker
9ff4d9c143 Update appsettings.json 2021-05-27 16:16:48 -04:00
Shaun Walker
6c8703356f Merge pull request #1406 from sbwalker/dev
automate the 2.1.0 upgrade
2021-05-27 16:15:02 -04:00
Shaun Walker
fbce6c7248 automate the 2.1.0 upgrade 2021-05-27 16:18:45 -04:00
Shaun Walker
908d572cc9 Update appsettings.release.json 2021-05-26 17:43:02 -04:00
Shaun Walker
f0384732ac Update appsettings.json 2021-05-26 17:42:43 -04:00
Shaun Walker
c089283645 Merge pull request #1405 from sbwalker/dev
move database projects into their own solution to keep the streamline main solution
2021-05-26 17:42:18 -04:00
Shaun Walker
50ac9236af move database projects into their own solution to keep the streamline main solution 2021-05-26 17:46:08 -04:00
Shaun Walker
d520d50b75 Update appsettings.release.json
synchronized with appsettings.json
2021-05-26 12:00:49 -04:00
Shaun Walker
99838679bd Update appsettings.json
reorganized to move most relevant settings to the top of the file
2021-05-26 12:00:15 -04:00
Shaun Walker
4b49358968 Merge pull request #1404 from sbwalker/dev
add support for public content folders
2021-05-26 11:57:46 -04:00
Shaun Walker
c07e766e57 add support for public content folders 2021-05-26 12:01:35 -04:00
Shaun Walker
1d171d2e56 Merge pull request #1400 from 2sic-forks/dev
More documentation - almost all Models done #1382
2021-05-26 07:31:16 -04:00
Shaun Walker
6527d383db Merge pull request #1401 from cnurse/database-options
Move Available Databases to appsettings and use IOptions
2021-05-26 07:30:34 -04:00
Charles Nurse
d280a4aa01 Move Available Databases to appsettings and use IOptions 2021-05-25 15:03:27 -07:00
ijungleboy
bcff9caf5c More documentation - almost all Models done
https://github.com/oqtane/oqtane.framework/issues/1382
Should not contain any code changes, just docs
2021-05-26 00:01:22 +02:00
Shaun Walker
bb92011641 Merge pull request #1398 from cnurse/dev
Merge AppVersions Information into __EFMigrationsHistory table
2021-05-25 17:46:19 -04:00
Charles Nurse
9c0cef870c Merge AppVersions information into EFMigrationsHistory table 2021-05-25 12:17:44 -07:00
Charles Nurse
077b866e8c Move Migrations into Master and Tenant folders so its clear what type of Migration is being applied 2021-05-25 12:16:10 -07:00
Shaun Walker
7ec3376308 Merge pull request #1397 from cnurse/dev
Fix Upgrade issue with new componentized Database projects
2021-05-25 07:39:24 -04:00
Charles Nurse
7753988f64 Remove log files from git 2021-05-24 16:02:45 -07:00
Charles Nurse
a62a1be1f3 Merge branch 'dev' of https://github.com/cnurse/oqtane.framework into dev
# Conflicts:
#	Oqtane.Server/Infrastructure/DatabaseManager.cs
2021-05-24 15:47:02 -07:00
Charles Nurse
f2ae1e3bff Merge commit '42265cdda4ea03541522bf5cf5d104059927393f' into dev
# Conflicts:
#	Oqtane.Server/Infrastructure/DatabaseManager.cs
2021-05-24 15:40:35 -07:00
Charles Nurse
a0838cbc84 3rd attempt to resolve conflicts 2021-05-24 15:14:58 -07:00
Charles Nurse
17f5f39a54 2nd attempt to Fix conflict 2021-05-24 15:12:41 -07:00
Charles Nurse
4853a64cf9 Fix conflict 2021-05-24 15:08:44 -07:00
Charles Nurse
69376c5baf Missing files from previous commit 2021-05-24 14:46:54 -07:00
Charles Nurse
42265cdda4 Fix Upgrade issue with new componentized Database projects 2021-05-24 14:46:12 -07:00
Shaun Walker
6283fc9abb Merge pull request #1396 from sbwalker/dev
remove Microsoft.EntityFrameworkCore.Relational from Oqtane.Shared as it is no longer needed
2021-05-24 16:39:33 -04:00
Shaun Walker
723002968a remove Microsoft.EntityFrameworkCore.Relational from Oqtane.Shared as it is no longer needed 2021-05-24 16:43:17 -04:00
Shaun Walker
1f7207bd5a Merge pull request #1395 from sbwalker/dev
fix #1272 - add support for ref folder in package installation
2021-05-24 15:51:02 -04:00
Shaun Walker
72b06b16cf fix #1272 - add support for ref folder in package installation 2021-05-24 15:50:38 -04:00
Shaun Walker
8c70913a72 Merge pull request #1394 from cnurse/dev
Rename IOqtaneDatabase interface (and related base class)
2021-05-24 15:19:33 -04:00
Charles Nurse
4a609b444e Rename IOqtaneDatabase interface (and related base class) 2021-05-24 11:57:47 -07:00
Shaun Walker
791e786db8 Update appsettings.release.json 2021-05-24 09:03:57 -04:00
Shaun Walker
e5229626ab Update appsettings.json 2021-05-24 09:03:04 -04:00
Shaun Walker
34ed19deda Merge pull request #1393 from sbwalker/dev
added PackageName property to IModule and ITheme interfaces to allow creators to specify the Nuget package name associated to a specific module/theme. This is necessary for packages which contain multiple extensions.
2021-05-24 08:55:57 -04:00
Shaun Walker
5c21ab37ee added PackageName property to IModule and ITheme interfaces to allow creators to specify the Nuget package name associated to a specific module/theme. This is necessary for packages which contain multiple extensions. 2021-05-24 08:59:50 -04:00
Shaun Walker
41ed069072 fix #1389 - exception in PrincipalValidator 2021-05-24 08:17:46 -04:00
Shaun Walker
80c82a9ec3 Merge pull request #1392 from sbwalker/dev
fix #1389 - exception in PrincipalValidator
2021-05-24 08:14:56 -04:00
Shaun Walker
d69ceecb41 Merge pull request #1388 from sbwalker/dev
implemented Label component in Installer for consistency and removed redundant logic
2021-05-23 11:13:42 -04:00
Shaun Walker
63378e1654 implemented Label component in Installer for consistency and removed redundant logic 2021-05-23 11:17:23 -04:00
Shaun Walker
3f48c1f8fe fix #1367 - provides support for multiple entities in auth policy and makes parameter names more intuitive - backward compatible with entityid 2021-05-23 10:29:05 -04:00
Shaun Walker
35aaf476d0 Merge pull request #1387 from sbwalker/dev
fix #1367 - provides support for multiple entities in auth policy and makes parameter names more intuitive - backward compatible with entityid
2021-05-23 10:25:17 -04:00
Shaun Walker
fc3ba14d0f Merge pull request #1385 from 2sic-forks/dev 2021-05-22 08:25:06 -04:00
Shaun Walker
76879163d4 Merge pull request #1386 from cnurse/dev 2021-05-22 08:21:26 -04:00
Charles Nurse
342dae4aa7 Fix bug with MySQL Installation caused by new Migration 2021-05-21 16:38:48 -07:00
iJungleboy
f533279dec Merge branch 'oqtane:dev' into dev 2021-05-21 18:30:03 +02:00
ijungleboy
1bccf449fc Add docs to 2 core interfaces IAliasService and IFileService 2021-05-21 18:29:25 +02:00
ijungleboy
de6acf0029 Tell all concrete implementations to be private / not show in the docs 2021-05-21 18:29:06 +02:00
ijungleboy
074b998bbc Document most models 2021-05-21 18:28:21 +02:00
ijungleboy
e4b12aa87f Document most core interfaces 2021-05-21 18:28:14 +02:00
Shaun Walker
6f123c0fff Merge pull request #1383 from cnurse/dev
Convert Database projects so they build installable Packages
2021-05-20 17:04:06 -04:00
Charles Nurse
47c04dc150 Convert Database projects so they build installable Packages rather than deploy to bin and modify installation to deploy Databases on demand as needed. 2021-05-20 12:39:09 -07:00
Shaun Walker
4474d49c6a Merge pull request #1379 from sbwalker/dev
fix #1359 - Image bug in src attribute - image is not displayed - caused by multi-tenancy refactoring
2021-05-19 13:28:48 -04:00
Shaun Walker
0b6efdbc57 fix #1359 - Image bug in src attribute - image is not displayed - caused by multi-tenancy refactoring 2021-05-19 13:32:34 -04:00
Shaun Walker
6f981e0928 revert unnecessary code change in router 2021-05-19 09:15:05 -04:00
Shaun Walker
bc53c9e443 Merge pull request #1374 from sbwalker/dev
revert unnecessary code change in router
2021-05-19 09:13:06 -04:00
Shaun Walker
9256c88fc4 update template to remove ASP.NET Core 3 reference 2021-05-19 09:08:59 -04:00
Shaun Walker
9d877bc072 Merge pull request #1373 from sbwalker/dev
update template to remove ASP.NET Core 3 reference
2021-05-19 09:05:16 -04:00
Shaun Walker
470c7bb2a9 Merge pull request #1355 from hishamco/folder-columns
Change Folder Name & Path length
2021-05-19 08:50:56 -04:00
Shaun Walker
bb195e4796 Merge pull request #1357 from hishamco/database-type
Database type name should use type AssemblyQualifiedName instead of magic string
2021-05-19 08:44:12 -04:00
Shaun Walker
4d59460fbb Merge pull request #1358 from hishamco/unit-tests
Fix broken unit tests
2021-05-19 08:42:59 -04:00
Shaun Walker
ddc4254053 Merge pull request #1372 from sbwalker/dev
auth improvements related to multi-tenancy
2021-05-19 08:42:50 -04:00
Shaun Walker
09537ab0e4 auth improvements related to multi-tenancy 2021-05-19 08:46:02 -04:00
hishamco
07e8215919 Fix broken unit tests 2021-05-16 22:54:34 +03:00
hishamco
2324ae1ccb Database type name should use type AssemblyQualifiedName instead of maigic string 2021-05-16 22:50:39 +03:00
hishamco
b3d367329e Fix migration version name 2021-05-16 21:47:34 +03:00
hishamco
795e71278b Change Folder Name & Path length 2021-05-16 20:28:41 +03:00
Shaun Walker
943adec3a0 fixes for running on WebAssembly 2021-05-13 07:58:57 -04:00
Shaun Walker
6e21eb7327 Merge pull request #1347 from sbwalker/dev
fixes for running on WebAssembly
2021-05-13 07:55:31 -04:00
Shaun Walker
fe3b42feed Merge pull request #1345 from cnurse/dev
Remove DbConfig and new constructors on DbContextBase and refactor Migrations
2021-05-12 20:20:02 -04:00
Charles Nurse
c036a9d11f Remove DbConfig and new constructors on DbContextBase and refactor Migrations to use explcit generation of IOqtaneDatabase instance 2021-05-12 15:17:40 -07:00
Shaun Walker
c958f90ee2 Merge pull request #1342 from cnurse/dev
Switch DBType to use the fully-qualified type name rather than a simple name
2021-05-12 14:41:47 -04:00
Charles Nurse
92dd8354ba Switch DBType to use the fully-qualified type name rather than a simple name 2021-05-12 10:22:17 -07:00
Shaun Walker
c926fa0d27 Merge pull request #1340 from cnurse/dev 2021-05-11 18:39:40 -04:00
Charles Nurse
4ffdcf1e52 Remove dependency of Oqtane.Server on SqlClient 2021-05-11 13:56:49 -07:00
Charles Nurse
efe803f147 Merge branch 'oqtane:dev' into dev 2021-05-11 13:29:23 -07:00
Shaun Walker
0bd6fea476 Merge pull request #1339 from sbwalker/dev
added DatabaseService to get list of database types from server
2021-05-11 15:53:19 -04:00
Shaun Walker
bae6120e3b added DatabaseService to get list of database types from server 2021-05-11 15:56:41 -04:00
Shaun Walker
7c0721797c Update README.md 2021-05-11 09:07:19 -04:00
Shaun Walker
d88bd87aea add support for Blazor pre-rendering 2021-05-11 09:03:05 -04:00
Shaun Walker
dab94defa0 Merge pull request #1338 from sbwalker/dev
add support for Blazor pre-rendering
2021-05-11 08:59:39 -04:00
Shaun Walker
6eaa3d259e Merge pull request #1337 from sbwalker/dev
optimizing tenant resolution and routing
2021-05-11 08:37:44 -04:00
Shaun Walker
d88b6987a1 Update README.md 2021-05-11 08:35:27 -04:00
Shaun Walker
b003e3734d Update README.md 2021-05-11 08:33:49 -04:00
Shaun Walker
a5de639d15 optimizing tenant resolution and routing 2021-05-10 17:45:39 -04:00
Shaun Walker
75c336454b Merge pull request #1323 from hishamco/tiny-fixes
Few Enhancements in Language Management
2021-05-07 12:17:20 -04:00
Shaun Walker
15b0bed257 fix #1319 - module title is required 2021-05-07 12:14:54 -04:00
Shaun Walker
7b15c0a542 Merge pull request #1325 from sbwalker/dev
fix #1319 - module title is required
2021-05-07 12:11:33 -04:00
hishamco
9f3b6197fe Fix the UX for add a new language 2021-05-07 14:32:41 +03:00
hishamco
4c4553a1d1 Ability to delete a default language if there's one language alongside with English 2021-05-07 14:10:15 +03:00
hishamco
c5f65e4767 Fix IsDefault for English 2021-05-07 13:55:45 +03:00
hishamco
d86beecf5c Add default language by default 2021-05-07 13:43:21 +03:00
Shaun Walker
be38d2cd70 add upgrade support for language packages 2021-05-06 08:20:09 -04:00
Shaun Walker
5a511e63ad Merge pull request #1320 from sbwalker/dev
add upgrade support for language packages
2021-05-06 08:16:52 -04:00
Shaun Walker
38aebf5aff Allow installation of Language packages through Language Management 2021-05-05 19:03:06 -04:00
Shaun Walker
6625fa7c23 Merge pull request #1318 from sbwalker/dev
Allow installation of Language packages through Language Management
2021-05-05 18:59:46 -04:00
Charles Nurse
3d5a7fdc21 Merge branch 'dev' of https://github.com/cnurse/oqtane.framework into dev 2021-05-05 10:13:05 -07:00
Shaun Walker
e836e27a5a fix #1305 - tabpanel loses focus 2021-05-03 08:19:25 -04:00
Shaun Walker
71e004aca6 Merge pull request #1310 from sbwalker/dev
fix #1305 - tabpanel loses focus
2021-05-03 08:17:59 -04:00
Shaun Walker
42c4b351f3 Merge pull request #95 from oqtane/dev
sync
2021-05-02 09:21:15 -04:00
Shaun Walker
3f28282ab6 Merge pull request #1261 from hishamco/sql-server
Move SqlServer databases into a separate project
2021-05-02 09:20:43 -04:00
hishamco
d83eac5af3 Merge remote-tracking branch 'upstream/dev' into sql-server 2021-05-01 21:36:08 +03:00
Shaun Walker
4dc364b623 Merge pull request #1304 from leigh-pointer/NuGetPackageIcon
NuGet Icon Warning
2021-04-30 10:55:31 -04:00
Shaun Walker
d1abbde20c Merge pull request #1303 from leigh-pointer/AddModulePermissions
Permissions for edit applied from the page permissions.
2021-04-30 10:55:22 -04:00
Leigh
2be48e910e Set module view permissions to page edit permissions 2021-04-30 14:15:56 +02:00
Leigh
a310ac4ed6 Merge remote-tracking branch 'origin/AddModulePermissions' into AddModulePermissions 2021-04-30 13:53:07 +02:00
Leigh
bc2e3a7333 Permissions for edit are applied from the page permissions. 2021-04-30 13:52:50 +02:00
Shaun Walker
9180ceaeb7 Merge pull request #94 from oqtane/dev
sync
2021-04-30 07:36:10 -04:00
Shaun Walker
b710ac8705 Merge pull request #1301 from leigh-pointer/AddModulePermissions
Permissions for edit are applied from the page permissions.
2021-04-30 07:35:37 -04:00
Shaun Walker
2244fcc814 Merge pull request #1259 from hishamco/more-localization
Localize Page Template Module Titles
2021-04-30 07:35:21 -04:00
Shaun Walker
c02e83547b Merge pull request #1302 from leigh-pointer/AddPageWarning
Check now displays warning instead of an Error
2021-04-30 07:32:12 -04:00
Leigh
14801e7f0d NuGet Icon Warning
The IconURL is depreciate in favor of an embedded icon file in the package
2021-04-30 10:50:12 +02:00
Leigh
c36cd77ab4 Check now displays warning instead of an Error 2021-04-30 09:49:51 +02:00
Leigh
9e814fad64 Permissions for edit are applied from the page permissions. 2021-04-30 09:36:50 +02:00
hishamco
18aa8d48fe Use SharedResources 2021-04-29 02:44:41 +03:00
hishamco
d7966f2acf Revert changes in SiteRepository 2021-04-29 02:42:01 +03:00
Charles Nurse
9d3b460a6c Merge branch 'dev' of https://github.com/oqtane/oqtane.framework into dev 2021-04-28 15:14:36 -07:00
Charles Nurse
7296f94360 Merge remote-tracking branch 'upstream/dev' into dev 2021-04-28 15:08:00 -07:00
Shaun Walker
9037f49680 Merge pull request #1294 from cnurse/dev
Adding new DatabaseConfig components in the Client project for supported Databases
2021-04-28 15:30:22 -04:00
Shaun Walker
c759d22b3d Merge pull request #1295 from leigh-pointer/dev
Make container fluid to fill the pane
2021-04-28 15:25:53 -04:00
Leigh Pointer
6ae5777e1c Revert "Fix NuGet Warning NU5048"
This reverts commit cad5ce51fc.
2021-04-28 20:31:52 +02:00
Leigh Pointer
cad5ce51fc Fix NuGet Warning NU5048
Icon URL is deprecated in favor of embedding the icon inside the NuGet package.
2021-04-28 09:17:01 +02:00
Leigh Pointer
a79ba591fe Make container fluid to fill the pane 2021-04-28 07:01:39 +02:00
Charles Nurse
1efd623a99 Adding new DatabaseConfig components in the Client project for supported Databases to avoid deploying server dlls to client 2021-04-27 15:35:10 -07:00
Shaun Walker
c32003320d Merge pull request #1284 from iJungleboy/dev
Make version static-readonly
2021-04-27 07:56:28 -04:00
Shaun Walker
307f97c60c Merge pull request #1281 from hishamco/localization-manager
LocalizationManager enhancements
2021-04-27 07:51:01 -04:00
Shaun Walker
722c234cb5 Merge pull request #1285 from leigh-pointer/dev.fork
Fix Error with Footer on Oqtane Theme #1282
2021-04-27 07:50:36 -04:00
Leigh Pointer
189dcf5b90 Fix for Error with Footer on Oqtane Theme #1282 2021-04-26 15:38:33 +02:00
ijungleboy
a531a235a0 Make version static-readonly
https://github.com/oqtane/oqtane.framework/issues/1283
2021-04-26 13:51:37 +02:00
Leigh Pointer
d7569aa41a Merge pull request #3 from oqtane/dev
Merge with Fork
2021-04-26 11:31:42 +02:00
hishamco
55b69f0afc Order the cultures alphabatically 2021-04-26 01:55:55 +03:00
hishamco
76c2a2f2f9 Add English to supported cultures by default 2021-04-26 01:55:27 +03:00
Shaun Walker
d42c7a5ea5 user and role management improvements 2021-04-24 13:47:20 -04:00
Shaun Walker
60f386838e Merge pull request #1280 from sbwalker/dev
user and role management improvements
2021-04-24 13:44:22 -04:00
Shaun Walker
5a519510a9 improve comments and logging 2021-04-23 16:29:18 -04:00
Shaun Walker
a3449f5beb Merge pull request #1275 from sbwalker/dev
improve comments and logging
2021-04-23 16:26:22 -04:00
Shaun Walker
ffafe5d14c Merge pull request #93 from oqtane/dev
sync
2021-04-23 16:10:06 -04:00
Shaun Walker
9d083726be user and role management improvements 2021-04-23 16:11:35 -04:00
Shaun Walker
310c782326 Merge pull request #1274 from sbwalker/dev
user and role management improvements
2021-04-23 16:09:19 -04:00
Shaun Walker
65aac34f8c Merge pull request #1267 from sbwalker/dev
modify nuget package installer to support satellite assemblies in subfolders
2021-04-23 09:34:17 -04:00
Shaun Walker
856b11b574 Merge pull request #1265 from hishamco/language-switcher
Add English to the language switcher
2021-04-23 09:34:01 -04:00
Shaun Walker
1088e9adda Merge pull request #1264 from hishamco/language-management-exculde
Exclude English from the languages list
2021-04-23 09:33:22 -04:00
Leigh Pointer
7470513892 Merge pull request #2 from oqtane/dev
Updates
2021-04-22 05:49:01 +02:00
Shaun Walker
2780e4d029 modify nuget package installer to support satellite assemblies in subfolders 2021-04-21 19:31:02 -04:00
hishamco
c52f6c92f1 Add English to the language switcher 2021-04-21 17:47:50 +03:00
hishamco
3cafb68f6b Localize module titles in UI 2021-04-21 17:31:22 +03:00
hishamco
6e5496e969 Exclude English from the languages list 2021-04-21 16:41:24 +03:00
Shaun Walker
f9f0999315 Merge pull request #1260 from hishamco/supported-cultures
Remove supported cultures entry from appsettings.json
2021-04-20 17:14:21 -04:00
Shaun Walker
e7c5ca2c1a Merge pull request #1254 from chlupac/alias
Default Alias
2021-04-20 17:07:20 -04:00
Shaun Walker
d2ffb93fa4 Merge pull request #92 from oqtane/dev
sync
2021-04-20 14:13:41 -04:00
Shaun Walker
c4680c1972 Merge pull request #1262 from cnurse/dev
Fix bug with installs due to missing Migrations
2021-04-20 14:13:09 -04:00
Charles Nurse
8f5beaf3fe Fix bug with installs due to missing Migrations 2021-04-20 10:58:26 -07:00
hishamco
97fb6ede7e Reuse AddOqtaneScopedServices() 2021-04-20 19:10:06 +03:00
hishamco
f7d8888232 Refactor Program.cs 2021-04-20 19:01:56 +03:00
hishamco
e7f5fe9827 Merge branch 'database' into clean-startup
# Conflicts:
#	Oqtane.Server/Startup.cs
2021-04-20 17:42:39 +03:00
hishamco
35225b2bb9 Move SqlServer databases into a separate project 2021-04-20 17:29:24 +03:00
hishamco
0b32dcf9b3 Make English default culture instead of current installed culture 2021-04-20 16:27:18 +03:00
hishamco
e33c9e417d Remove SupportedCultures entry from appsettings.json 2021-04-20 16:26:17 +03:00
hishamco
9d9a5a0275 Localize modules title 2021-04-20 16:20:24 +03:00
gjwalk
8069d838d5 Merge pull request #4 from oqtane/master
sync
2021-04-20 08:50:44 -04:00
Leigh Pointer
a5494be8f1 Merge pull request #1 from oqtane/dev
Update to 2.0.2
2021-04-20 06:44:31 +02:00
Shaun Walker
bc6be52ae7 Merge pull request #91 from oqtane/dev
sync
2021-04-19 21:13:47 -04:00
Shaun Walker
40f8436947 Merge pull request #1239 from cnurse/dev
Implement Database Migrations and add Multi-Database Support
2021-04-19 21:11:11 -04:00
Charles Nurse
13f7db7b19 Resolve conflict 2021-04-19 11:57:45 -07:00
Charles Nurse
6b204cc988 Second attempt to resolve conflcit in Server project 2021-04-19 11:56:51 -07:00
Charles Nurse
a11d30b1e4 Attempt to resolve conflict in Server project file 2021-04-19 11:53:45 -07:00
Charles Nurse
2402cab3f3 Attempt to resolve conflict in DatabaseManager 2021-04-19 11:50:25 -07:00
Charles Nurse
20b5a10882 Resolve name of variable in AddSite 2021-04-19 11:15:53 -07:00
Charles Nurse
4598d0d6ba Resolve conflict in AddSite 2021-04-19 11:13:10 -07:00
Shaun Walker
7516be41d9 Update README.md 2021-04-19 14:10:13 -04:00
Charles Nurse
74c403cef1 Merge remote-tracking branch 'upstream/dev' into dev 2021-04-19 11:08:35 -07:00
Pavel Vesely
468f186511 Default Alias
When alias is not found in alias table, Oqtane fails with exception. This solution allows define default alias (*) for default site with unknown alias.
2021-04-19 20:03:18 +02:00
Shaun Walker
5455fadd65 Merge pull request #90 from oqtane/dev
sync
2021-04-19 09:33:34 -04:00
Shaun Walker
58ac86db8d Merge pull request #1253 from oqtane/master
Merge pull request #1252 from oqtane/dev
2021-04-19 09:28:24 -04:00
Shaun Walker
d8a65e9422 Merge pull request #1252 from oqtane/dev
2.0.2 release
2021-04-19 09:24:01 -04:00
Shaun Walker
a85376afb1 2.0.2 release testing 2021-04-19 08:40:58 -04:00
Shaun Walker
da3b83acf8 Merge pull request #1251 from sbwalker/dev
2.0.2 release testing
2021-04-19 08:38:08 -04:00
Shaun Walker
0fe931d772 prepare for 2.0.2 release 2021-04-19 08:04:33 -04:00
Shaun Walker
2c69392f43 Merge pull request #1248 from sbwalker/dev
prepare for 2.0.2 release
2021-04-19 08:01:50 -04:00
Shaun Walker
3b54d17286 Merge pull request #89 from oqtane/dev
sync
2021-04-18 14:10:17 -04:00
Shaun Walker
7a3b2e6dfc Merge pull request #1246 from leigh-pointer/dev.fork
Redirect on log out #1225 Fix
2021-04-18 14:07:55 -04:00
Shaun Walker
82b85ab24d optimize GetSupportedCultures 2021-04-18 11:51:33 -04:00
Shaun Walker
8899504d05 Merge pull request #1247 from sbwalker/dev
optimize GetSupportedCultures
2021-04-18 11:48:59 -04:00
Leigh Pointer
1e7e2c8848 Redirect on log out #1225 Fix 2021-04-18 16:58:58 +02:00
hishamco
7417e8dd27 Merge branch 'dev' of https://github.com/oqtane/oqtane.framework into dev 2021-04-18 02:29:39 +03:00
hishamco
a018e853a8 Register configuration in startup 2021-04-18 02:27:31 +03:00
hishamco
73b13d7a54 Add Oqtane extension methods for clean startup 2021-04-18 02:25:40 +03:00
Shaun Walker
cbe843bafc User experience improvements 2021-04-17 19:18:24 -04:00
Shaun Walker
8dac6fab54 Merge pull request #1244 from sbwalker/dev
User experience improvements
2021-04-17 19:16:13 -04:00
Charles Nurse
096f8249c3 Resolve conflict in Constants 2021-04-14 16:05:59 -07:00
Charles Nurse
e11a65c6ca Rollback removal of script files for Html Module to resolve conflict 2021-04-14 16:03:00 -07:00
Charles Nurse
23bab67bd3 Resolve new conflict 2021-04-14 15:59:31 -07:00
Charles Nurse
713b19e0e9 Remove Html Module Script files 2021-04-14 15:57:07 -07:00
Charles Nurse
f8b607911d Resolve conflict in project file 2021-04-14 15:53:07 -07:00
Charles Nurse
0222bbdeae Resolve conflict with main Oqtane repo 2021-04-14 15:48:54 -07:00
Charles Nurse
a0329b1b6c Fix bug in new Migration to support PostgreSQL 2021-04-08 14:58:02 -07:00
Charles Nurse
8c45b7e42f Added support for migrating existing Oqtane installations from DbUp to Migrations. Also added a Migration for version 2.0.2, and set current version to 2.1.0 2021-04-08 12:20:21 -07:00
Shaun Walker
1d3a79437c add theme creator module to simplify the scaffolding of external themes 2021-04-07 13:05:18 -04:00
Shaun Walker
947c254e12 Merge pull request #1230 from sbwalker/dev
add theme creator modules to simplify the scaffolding of external themes
2021-04-07 13:03:04 -04:00
Shaun Walker
d05747af1e enhanced ModuleActions component to display panes in a submenu, added more containers to Oqtane theme, added more panes to MultiPane layout, added module outline in edit mode to distinguish modules in panes, consolidated to use a single default AdminPane named "Content", fixed bug related to custom Admin Container behavior 2021-04-06 17:45:11 -04:00
Shaun Walker
0bf85a7a14 Merge pull request #1228 from sbwalker/dev
enhanced ModuleActions component to display panes in a submenu, added more containers to Oqtane theme, added more panes to MultiPane layout, added module outline in edit mode to distinguish modules in panes, consolidated to use a single default AdminPane named "Content", fixed bug related to custom Admin Container behavior
2021-04-06 17:42:43 -04:00
Shaun Walker
6b90e0f37b fix #1197 - move folder path logic from Client Service to Server Controller 2021-04-05 08:53:22 -04:00
Shaun Walker
224f0c3ceb Merge pull request #1227 from sbwalker/dev
fix #1197 - move folder path logic from Client Service to Server Controller
2021-04-05 08:52:29 -04:00
Shaun Walker
fc145a167d organize theme components into folders 2021-04-03 19:46:29 -04:00
Shaun Walker
6354c9ebd0 Merge pull request #1226 from sbwalker/dev
organize theme components into folders
2021-04-03 19:43:49 -04:00
Shaun Walker
61b73060e5 login form validation 2021-04-02 16:14:02 -04:00
Shaun Walker
b5c1184fa4 Merge pull request #1224 from sbwalker/dev
login form validation
2021-04-02 16:11:38 -04:00
Charles Nurse
d12b18350f Fixed bug in AddSite due to missing assignment of database type 2021-04-02 11:49:38 -07:00
Charles Nurse
985987d8f4 Updated initial appsettings.json 2021-04-02 11:28:34 -07:00
Charles Nurse
e6530ee127 Added support for MySQL and ProgreSQL and AddSite/Tenant 2021-04-02 10:55:00 -07:00
Shaun Walker
6606ebb58a Merge pull request #88 from oqtane/dev
sync
2021-04-02 13:19:36 -04:00
Shaun Walker
14480edd67 added globally unique identifier for Site ( used string data type to ensure compatibility with multiple database engines ) 2021-04-02 12:30:20 -04:00
Shaun Walker
d990a9fc30 Merge pull request #1221 from sbwalker/dev
added globally unique identifier for Site ( used string data type to ensure compatibility with multiple database engines )
2021-04-02 12:27:43 -04:00
Shaun Walker
00f8f2cb89 fix #1211 - add message to indicate Module Creator is only intended for use in development environments 2021-04-02 08:37:37 -04:00
Shaun Walker
57575945cd Merge pull request #1219 from sbwalker/dev
fix #1211 - add message to indicate Module Creator is only intended for use in development environments
2021-04-02 08:35:04 -04:00
Shaun Walker
9995066628 Merge pull request #1216 from leigh-pointer/dev.fork
Added Keypress event to catch Enter key on Login page #1198
2021-04-02 08:20:42 -04:00
Shaun Walker
c794f77d65 fix #1217 - ensure parent page cannot be set to current page 2021-04-02 08:19:55 -04:00
Shaun Walker
6d443842b2 Merge pull request #1218 from sbwalker/dev
fix #1217 - ensure parent page cannot be set to current page
2021-04-02 08:17:17 -04:00
Leigh Pointer
60a1f4ed15 Added functionality, when the EnterKey is press the login command is run. 2021-04-02 07:01:27 +02:00
Leigh Pointer
59e5eabeb8 Merge pull request #3 from oqtane/dev
Pull from oqtane.dev
2021-04-02 06:43:44 +02:00
gjwalk
8da55e1926 Merge pull request #3 from oqtane/dev
sync
2021-04-01 19:31:21 -04:00
Shaun Walker
af5f79d343 fix dropdown list UX behavior where there is a default option 2021-04-01 17:58:59 -04:00
Shaun Walker
39d0afa321 Merge pull request #1215 from sbwalker/dev
fix dropdown list UX behavior where there is a default option
2021-04-01 17:56:29 -04:00
Leigh Pointer
0a7fe5d82e Merge pull request #2 from oqtane/dev
Pull from source
2021-04-01 16:45:16 +02:00
Shaun Walker
58c84da9c9 add ability to test SMTP connection in Site Settings 2021-04-01 09:44:07 -04:00
Shaun Walker
46219df6b6 Merge pull request #1213 from sbwalker/dev
add ability to test SMTP connection in Site Settings
2021-04-01 09:41:45 -04:00
Shaun Walker
49f21e235b Merge pull request #87 from oqtane/dev
sync
2021-03-31 15:37:15 -04:00
Shaun Walker
bd48e1d8f1 if running on WebAssembly reload the client application if the server application is restarted 2021-03-31 15:39:01 -04:00
Shaun Walker
710d1be64b Merge pull request #1212 from sbwalker/dev
if running on WebAssembly reload the client application if the server application is restarted
2021-03-31 15:36:32 -04:00
Shaun Walker
bde1ff44f8 Merge pull request #1206 from hishamco/localizer
Fix localizer in Admin pages
2021-03-31 10:16:53 -04:00
hishamco
c92a81fcb6 Remove unnecessary localizer from RecycleBin page 2021-03-31 14:15:36 +03:00
hishamco
ec0b317f80 Fix localizer in Admin pages 2021-03-31 00:50:19 +03:00
Shaun Walker
09c040128a Ensure Install Wizard will only be displayed if the Master database connection string in appsettings.json is not specified. This addresses a potential security issue where the Install Wizard could be displayed in an existing installation if the Master database connection failed during startup. 2021-03-30 17:48:49 -04:00
Shaun Walker
c037614917 Merge pull request #1205 from sbwalker/dev
Ensure Install Wizard will only be displayed if the Master database connection string in appsettings.json is not specified. This addresses a potential security issue where the Install Wizard could be displayed in an existing installation if the Master database connection failed during startup.
2021-03-30 17:46:42 -04:00
Shaun Walker
3c5e7f997b Merge pull request #1204 from hishamco/typo
thene -> theme
2021-03-30 15:50:56 -04:00
hishamco
367a23171d thene -> theme 2021-03-30 17:26:03 +03:00
Leigh Pointer
0e20cad2d1 Merge pull request #1 from oqtane/dev
pull from source dev
2021-03-30 16:22:55 +02:00
Shaun Walker
5cd1d3a7af Merge pull request #86 from oqtane/dev
sync
2021-03-30 10:05:35 -04:00
Shaun Walker
62362b9194 make module creator templates extensible 2021-03-30 10:06:25 -04:00
Shaun Walker
40501c6ebd Merge pull request #1202 from hishamco/resources
Add Resources folder to Oqtane.Client
2021-03-30 10:04:38 -04:00
Shaun Walker
82b8c86fe3 Merge pull request #1203 from sbwalker/dev
make module creator templates extensible
2021-03-30 10:03:56 -04:00
hishamco
40f9437ea5 Add Resources folder to Oqtane.Client 2021-03-29 20:15:04 +03:00
Shaun Walker
d8bcc32239 refactor user deletion 2021-03-29 12:58:40 -04:00
Shaun Walker
77694da100 Merge pull request #1201 from sbwalker/dev
refactor user deletion
2021-03-29 12:56:18 -04:00
Charles Nurse
2fb63e8117 Added suuport to inject an IOqtaneDatabase in EntityBuilders to allow each Database to control certain Migration behaviors. Also updated Installer to dynamically build Database Configuration section 2021-03-27 11:16:16 -07:00
Shaun Walker
7223952eb2 Merge pull request #85 from oqtane/dev
sync
2021-03-25 13:49:47 -04:00
Shaun Walker
1271064872 Merge pull request #1178 from Raceeend/user-delete
fix: user delete
2021-03-25 13:49:11 -04:00
Shaun Walker
095d2e5f45 Merge pull request #1188 from erw13n/dev
Remove admin border after edit
2021-03-25 08:33:06 -04:00
Shaun Walker
4152b5c360 Merge pull request #1177 from hishamco/profile
Delete profile should refresh profiles list
2021-03-25 08:12:53 -04:00
Charles Nurse
3a032f401a Added IDatabase interface and refactored to use it to handle database type - updated Installer to dynamically add databases to selector 2021-03-24 11:45:44 -07:00
Charles Nurse
cbcfc88492 Add support for Sqlite - Installation path tested but AddSite not supported yet 2021-03-23 11:06:18 -07:00
Charles Nurse
8f1c760e87 Updated the Installation of Oqtane to use Migrations 2021-03-21 14:52:45 -07:00
Charles Nurse
83e5502111 Creation of EF Core Migrations - these execute using EF Tools, but are not integrated to run programmatically 2021-03-19 17:01:49 -07:00
Erwin Yulianto
63140bce81 Remove admin border after edit
After finish Edit, there's a class "container" which is conflict with Bootstrap that cause an issue on Full-width pane.
2021-03-17 19:26:50 +07:00
hishamco
c527f28a6d Address feedback 2021-03-13 17:02:24 +03:00
Pieter Kuyck
801615c981 fix: user delete 2021-03-13 12:34:47 +01:00
hishamco
c5e3c9b35e Delete profile should refresh profiles list 2021-03-13 13:02:40 +03:00
Shaun Walker
86ce8994d9 fix #1156 add defensive coding for scenario where host name does not match any alias 2021-03-11 20:21:15 -05:00
Shaun Walker
51687c382d Merge pull request #1174 from sbwalker/dev
fix #1156 add defensive coding for scenario where host name does not match any alias
2021-03-11 20:19:07 -05:00
Shaun Walker
6d3e17a5f5 Fix Pager component issue which manifested itself in Event Log. This reverts a fix from #1160 and addresses the root problem. 2021-03-11 11:21:47 -05:00
Shaun Walker
32eaa90e5e Merge pull request #1171 from sbwalker/dev
Fix Pager component issue which manifested itself in Event Log. This reverts a fix from #1160 and addresses the root problem.
2021-03-11 11:19:58 -05:00
Shaun Walker
ed12194ea2 Merge pull request #84 from oqtane/dev
sync
2021-03-10 17:01:33 -05:00
Shaun Walker
6bde83fab1 Merge pull request #1163 from leigh-pointer/dev
Issue with menu Icon Spacing. #1160
2021-03-10 17:00:08 -05:00
Leigh Pointer
b58c7386b3 Fixed issue Event Log strange behavior with the Paging control #1158 2021-03-10 17:00:49 +01:00
Leigh Pointer
3ff1dc4a21 MenuItems updated with HTML markup in place of the FontIcon component 2021-03-09 17:16:25 +01:00
Leigh Pointer
78aabaafb3 Merge pull request #11 from oqtane/dev
Merge from source
2021-03-09 15:50:08 +01:00
Shaun Walker
81b76f03ee Add folder structure to external module template client project to organize code and emphasize that a module project can contain multiple modules. 2021-03-09 09:47:01 -05:00
Shaun Walker
c9fa022279 Merge pull request #1161 from hishamco/fix#1152
Rows -> Maximum Records
2021-03-09 09:46:35 -05:00
Shaun Walker
7e4a37b07c Merge pull request #1168 from cnurse/dev
Create new UseOqtaneDatabase extension method
2021-03-09 09:46:14 -05:00
Shaun Walker
642bafb2fc Merge pull request #1170 from sbwalker/dev
Add folder structure to external module template client project to organize code and emphasize that a module project can contain multiple modules.
2021-03-09 09:46:05 -05:00
hishamco
7f1f4ec4fb Rows -> Records 2021-03-08 20:57:06 +03:00
Charles Nurse
c64f350f36 Create new DbContextUtils class and move common SaveChanges code to this class. While MasterDbContext has no entities that support IDeletable it does not hurt to check and minimizes duplication 2021-03-06 16:06:29 -08:00
Charles Nurse
8376a09ad6 Create new UseOqtaneDatabase extension method and replace all uses of UseSqlServer.
This is a preparative step to locate all database configuration in one file.
2021-03-06 14:13:06 -08:00
Leigh Pointer
13b45453c6 Fixed Issue with menu Icon Spacing. #1160 2021-03-05 15:31:38 +01:00
hishamco
4c9960b983 Rows -> Maximum Rows 2021-03-05 16:41:53 +03:00
Leigh Pointer
541bd5a279 Merge pull request #10 from oqtane/dev
Merge
2021-03-05 06:32:14 +01:00
Shaun Walker
745575c1f1 Fix UX issue where the Location field was not being updated when the user selected Create Module 2021-03-04 08:30:09 -05:00
Shaun Walker
af896e0fa8 Merge pull request #1155 from sbwalker/dev
Fix UX issue where the Location field was not being updated when the user selected Create Module
2021-03-04 08:29:54 -05:00
Shaun Walker
ab102f1883 Merge pull request #1154 from leigh-pointer/dev
Delete all Modules and Pages from Recycle bin
2021-03-04 08:29:45 -05:00
Shaun Walker
04caa8f725 Merge pull request #1151 from cnurse/dev
Add gitignore and README to Solution files and ad support for Jetbrains Rider
2021-03-04 08:28:23 -05:00
Leigh Pointer
63fc1cd042 Update Index.razor 2021-03-03 17:15:00 +01:00
Leigh Pointer
442a8018ce Merge branch 'dev' of https://github.com/leigh-pointer/oqtane.framework into dev 2021-03-03 17:07:04 +01:00
Leigh Pointer
0fd46d28b5 Delete all modules and pages in recycle bin 2021-03-03 16:55:13 +01:00
Leigh Pointer
a03434ac41 recycle bin and log paging 2021-03-03 16:39:32 +01:00
Leigh Pointer
b08fdf8690 Merge branch 'dev' of https://github.com/leigh-pointer/oqtane.framework into dev 2021-03-03 13:26:01 +01:00
Leigh Pointer
7205246718 Added Delete all pages and modules 2021-03-03 13:25:49 +01:00
Charles Nurse
a4f0afa0ab Merge branch 'master' into dev 2021-03-02 12:14:41 -08:00
Charles Nurse
dbc4e3ea66 Add the Jetbrains Rider "idea" folder to gitignore. 2021-03-02 12:07:04 -08:00
Charles Nurse
0d5ecb7427 Include gitignore and README files in Solution Files folder, so they are more accessible for editing 2021-03-02 12:03:26 -08:00
Leigh Pointer
e1b04f5dae Merge pull request #9 from oqtane/dev
Merge pull request #1149 from leigh-pointer/dev
2021-03-02 16:52:28 +01:00
Shaun Walker
ea1bcba32f Merge pull request #1149 from leigh-pointer/dev
Fix for #1148 LangVersion set to 7.3
2021-03-02 10:48:13 -05:00
Leigh Pointer
cccb0806e1 LangVersion Fix #1148
removed the LangVersion property from project
2021-03-02 16:17:33 +01:00
Leigh Pointer
92a1804846 Merge pull request #8 from oqtane/dev
2.0.1
2021-02-28 08:29:21 +01:00
Shaun Walker
191a1dea4d Update README.md 2021-02-27 12:50:36 -05:00
Shaun Walker
be782ee001 Merge pull request #1143 from oqtane/master
sync with master
2021-02-27 12:34:28 -05:00
Shaun Walker
0d6413e8a5 Merge pull request #1142 from oqtane/dev
merge dev with master for 2.0.1 release
2021-02-27 12:32:37 -05:00
Leigh Pointer
d69a392141 Merge pull request #7 from oqtane/dev
Commits on Feb 25,26,  2021
2021-02-26 15:49:06 +01:00
Shaun Walker
12fd845ed5 Fix issue when creating assets.json and folder does not exist. Improve module/theme uninstall to remove empty folders. 2021-02-26 09:08:25 -05:00
Shaun Walker
0eae1b690e Merge pull request #1139 from sbwalker/dev
Fix issue when creating assets.json and folder does not exist. Improve module/theme uninstall to remove empty folders.
2021-02-26 09:06:49 -05:00
Shaun Walker
5b9196cfd4 Update README.md 2021-02-26 08:05:36 -05:00
Shaun Walker
ba54076c61 Prepare for 2.0.1 release 2021-02-26 08:04:44 -05:00
Shaun Walker
8762809a83 Update README.md 2021-02-26 08:04:39 -05:00
Shaun Walker
c65bc1f4b1 Merge pull request #1138 from sbwalker/dev
Prepare for 2.0.1 release
2021-02-26 08:02:59 -05:00
Shaun Walker
99665800c4 remove SVG from allowable upload files 2021-02-26 07:48:16 -05:00
Shaun Walker
127a9c8deb Merge pull request #1137 from sbwalker/dev
remove SVG from allowable upload files
2021-02-26 07:46:35 -05:00
Shaun Walker
af1eebbf0d update copyright content 2021-02-26 07:45:10 -05:00
Shaun Walker
e5272d9725 Merge pull request #1136 from sbwalker/dev
update copyright content
2021-02-26 07:43:43 -05:00
Shaun Walker
4a2d3e452a Merge pull request #83 from oqtane/dev
sync
2021-02-25 14:27:51 -05:00
Leigh Pointer
579992d8f2 Merge pull request #6 from oqtane/dev
Merge pull request #1135 from leigh-pointer/dev
2021-02-25 15:49:43 +01:00
Shaun Walker
dbecfc1c9f Merge pull request #1135 from leigh-pointer/dev
Fix for #1134 Files size incorrect when less than 1000 bytes
2021-02-25 08:31:29 -05:00
Leigh Pointer
6c79006dd7 fix for #1134 Files size incorrect when less than 1000 bytes 2021-02-25 07:44:19 +01:00
Leigh Pointer
53af3f2a14 Merge pull request #5 from oqtane/dev
Commits 19, 24 Feb
2021-02-25 06:54:59 +01:00
Shaun Walker
385ec178eb Merge pull request #1132 from oqtane/revert-1121-dev
Revert "Fix Upload SVG throw error #1120"
2021-02-24 17:27:20 -05:00
Shaun Walker
eda2a5637f Revert "Fix Upload SVG throw error #1120" 2021-02-24 17:26:54 -05:00
Shaun Walker
f60c60ac1d Merge pull request #1121 from leigh-pointer/dev
Fix Upload SVG throw error #1120
2021-02-24 17:22:23 -05:00
Shaun Walker
75a5262259 Merge pull request #1124 from PhilipMur/dev
Fixed site Favicon not saving
2021-02-24 17:22:02 -05:00
gjwalk
12b44f6fa5 Merge pull request #2 from oqtane/dev
sync
2021-02-23 18:50:55 -05:00
Philip Murray
60d685416d Fixed site Favicon not saving
The saved function for the favicon was not there
2021-02-19 13:09:29 +00:00
Leigh Pointer
b04cee22cd Merge branch 'dev' of https://github.com/leigh-pointer/oqtane.framework into dev 2021-02-18 09:27:57 +01:00
Leigh Pointer
3af095997f Fixed when file size is less that 1 Kb displays 0. This can be misleading as many svg files are less that 1 kb. File size now displays to 2 deciaml places. 2021-02-18 09:27:51 +01:00
Leigh Pointer
1aae8a1373 Update FileController.cs 2021-02-18 08:55:13 +01:00
Leigh Pointer
bd762cb5c9 stream not needed 2021-02-18 08:52:57 +01:00
Leigh Pointer
59ba4b2e05 doesnt need to open the stream if svg 2021-02-18 08:51:05 +01:00
Leigh Pointer
45974a9c80 Update FileController.cs 2021-02-18 08:48:33 +01:00
Leigh Pointer
9411f9a62e Merge branch 'dev' of https://github.com/leigh-pointer/oqtane.framework into dev 2021-02-18 08:39:18 +01:00
Leigh Pointer
e3fc7c0ad1 #1120 Fix forUpload SVG throw error 2021-02-18 08:38:53 +01:00
Leigh Pointer
a60859ba19 Merge pull request #4 from oqtane/dev
Login changes and log out path
2021-02-17 06:52:57 +01:00
Leigh Pointer
eef26d02d3 Merge pull request #4 from oqtane/dev
Login changes
2021-02-17 06:46:35 +01:00
Shaun Walker
b7ce7bb3e4 Improve Login user experience when running on WebAssembly and address Logout scenario 2021-02-16 08:11:36 -05:00
Shaun Walker
e7b65aad19 Merge pull request #1114 from sbwalker/dev
Improve Login user experience when running on WebAssembly and address Logout scenario
2021-02-16 08:10:19 -05:00
Shaun Walker
cd89b2bf7b Merge pull request #82 from oqtane/dev
sync
2021-02-16 06:42:56 -05:00
gjwalk
8cd355135b Merge pull request #1 from oqtane/dev
sync
2021-02-15 13:49:36 -05:00
Leigh Pointer
4b3c488fb9 Merge pull request #3 from oqtane/dev
WebAssembly startup issue
2021-02-15 17:30:38 +01:00
Shaun Walker
9e8c574fb5 fix #1103 reported by @PhilipMur - incorrect life cycle method for Control Panel loading 2021-02-15 10:38:38 -05:00
Shaun Walker
dfa74f7eb6 Merge pull request #1111 from hishamco/lang-version
Remove LangVerion from Oqtane.Server
2021-02-15 10:37:58 -05:00
Shaun Walker
2b92dd51a1 Merge pull request #1112 from sbwalker/dev
fix #1103 reported by @PhilipMur - incorrect life cycle method for Control Panel loading
2021-02-15 10:37:27 -05:00
Leigh Pointer
a47aa28c89 Merge pull request #2 from oqtane/dev
Section head and Languages
2021-02-15 05:49:29 +01:00
hishamco
510f475816 Remove LangVerion from Oqtane.Server 2021-02-15 03:27:47 +03:00
Shaun Walker
de1107f046 Unauthenticated users need to be able to retrieve the list of languages 2021-02-14 18:35:42 -05:00
Shaun Walker
0f640dd68b Merge pull request #1110 from sbwalker/dev
Unauthenticated users need to be able to retrieve the list of languages
2021-02-14 18:34:33 -05:00
Shaun Walker
a50363fec7 Merge pull request #1107 from leigh-pointer/dev
#1106 Fix issue where Section would not initialize Expanded.
2021-02-14 15:03:09 -05:00
Leigh Pointer
22c6ccffb8 Merge pull request #1 from oqtane/dev
Merge from base
2021-02-13 07:53:23 +01:00
Leigh Pointer
fcd795be3d #1106 Fix issue where Section would not initialize collapsed. 2021-02-13 07:33:12 +01:00
Shaun Walker
6adda2b1a9 Merge pull request #1102 from leigh-pointer/dev
DirectorySeparator issue when black or forward slash.
2021-02-12 10:30:15 -05:00
Shaun Walker
0af8f427e1 Merge pull request #1101 from 2sic-forks/dev
fix typo memeber = member
2021-02-12 10:29:22 -05:00
Leigh Pointer
c6e2c2e501 DirectorySeparator issue when black or forward slash.
Tested on Apple mac and Windows
2021-02-11 15:38:37 +01:00
iJungleboy
278aab537f fix typo memeber = member 2021-02-11 10:41:43 +01:00
Shaun Walker
2fc877a99e fix #1097 - made PWA manifest Urls absolute rather than relative 2021-02-10 14:50:06 -05:00
Shaun Walker
22830a2cc1 Merge pull request #1098 from sbwalker/dev
fix #1097 - made PWA manifest Urls absolute rather than relative
2021-02-10 14:49:35 -05:00
Shaun Walker
478e4044b8 Fix #1094 - localization fallback logic 2021-02-08 08:17:13 -05:00
Shaun Walker
1fcb2ee2b3 Merge pull request #1096 from sbwalker/dev
Fix #1094 - localization fallback logic
2021-02-08 08:15:58 -05:00
Shaun Walker
05a98a9854 Merge pull request #81 from oqtane/dev
sync
2021-02-08 07:58:37 -05:00
Shaun Walker
00893459b2 Merge pull request #1095 from hishamco/localization-manager
Fix the localization manager resolution
2021-02-06 16:53:50 -05:00
hishamco
7db1fe226d Fix the localization manager resolution 2021-02-06 22:40:11 +03:00
Shaun Walker
d0f3d388fe Merge pull request #1071 from hishamco/default-language-fix
Set default language if the culture not supported
2021-02-05 14:29:42 -05:00
hishamco
13e356f510 Use LocalizationManager.GetDefaultCulture() 2021-02-05 21:47:50 +03:00
Shaun Walker
c3e7fa67f3 Performance improvement - set IsFixed="true" on ModuleState CascadingValues so that Blazor will not monitor them for changes 2021-02-05 09:37:10 -05:00
Shaun Walker
91be2ff4a0 Merge pull request #1090 from sbwalker/dev
Performance improvement - set IsFixed="true" on ModuleState CascadingValues so that Blazor will not monitor them for changes
2021-02-05 09:36:17 -05:00
hishamco
3f29fd1b9f Merge remote-tracking branch 'upstream/dev' into default-language-fix 2021-02-05 15:35:52 +03:00
Shaun Walker
988639b603 module creator owner and module name cannot be the same 2021-02-04 09:36:19 -05:00
Shaun Walker
170289cc8e Merge pull request #1089 from sbwalker/dev
module creator owner and module name cannot be the same
2021-02-04 09:35:15 -05:00
Shaun Walker
077c40ee05 Merge pull request #1088 from sbwalker/dev
performance and user experience improvements
2021-02-04 08:55:51 -05:00
Shaun Walker
531cba715e performance and user experience improvements 2021-02-04 08:54:59 -05:00
Shaun Walker
1fb58296d8 Merge pull request #80 from oqtane/dev
sync
2021-02-01 14:40:42 -05:00
Shaun Walker
9ba2328a04 Merge pull request #1074 from Jayson-Furr/dev
Fixes to horizontal menu logic. Now supports two levels of menu items.
2021-01-28 09:02:49 -05:00
Shaun Walker
901d4ca5c4 Merge pull request #1070 from hishamco/default-language
Reset IsDefault per site Id for newly added language
2021-01-26 09:57:10 -05:00
Jayson Furr
033ee0497b Merge branch 'dev' of https://github.com/Jayson-Furr/oqtane.framework into dev 2021-01-23 21:16:27 -06:00
Jayson Furr
5a02ce6124 Fixes to vertical menu logic. Now supports multiple levels of menu items. Added FontIcon component to reduce duplicate code. 2021-01-23 21:15:54 -06:00
Jayson Furr
f60a4af6d2 Fixes to horizontal menu logic. Now supports multiple levels of menu items. Added FontIcon component to reduce duplicate code. 2021-01-23 21:14:44 -06:00
Jayson Furr
6fdbbeb8ce Fixes to horizontal menu logic. Now supports two levels of menu items. 2021-01-23 18:24:07 -06:00
hishamco
90ca6aafe9 Set default language if the culture not supported 2021-01-24 01:06:50 +03:00
hishamco
5a660f2634 Reset IsDefault per site Id for new language 2021-01-23 23:48:10 +03:00
Shaun Walker
7057f93f13 Merge pull request #1069 from sbwalker/dev
added HTML5 date picker to input controls
2021-01-22 14:21:41 -05:00
Shaun Walker
f637c9137c added HTML5 date picker to input controls 2021-01-22 14:19:43 -05:00
Shaun Walker
fbf2820571 Merge pull request #1067 from sbwalker/dev
Localization fixes - table definition, SQL script naming, SQL script not marked as Embedded Resource, changed column name from IsCurrrent to IsDefault to reflect intent, set default language for site in _Host
2021-01-22 13:01:37 -05:00
Shaun Walker
c0ed7c7934 Localization fixes - table definition, SQL script naming, SQL script not marked as Embedded Resource, changed column name from IsCurrrent to IsDefault to reflect intent, set default language for site in _Host 2021-01-21 17:09:34 -05:00
Shaun Walker
892d9c1ecf Merge pull request #1065 from sbwalker/dev
notification improvements
2021-01-18 14:41:52 -05:00
Shaun Walker
82a118b603 notification improvements 2021-01-18 14:39:56 -05:00
Shaun Walker
fc8f200c32 Merge pull request #79 from oqtane/dev
sync
2021-01-18 10:21:04 -05:00
Shaun Walker
b664bc2dbb remove Add Job component and make Type read-only in Edit 2021-01-18 10:19:42 -05:00
Shaun Walker
350d2cec96 Merge pull request #1061 from sbwalker/dev
set SiteState in HostedServiceBase for scheduled jobs
2021-01-18 10:18:47 -05:00
Shaun Walker
8be9fd6eb2 set SiteState in HostedServiceBase for scheduled jobs 2021-01-18 08:59:07 -05:00
Shaun Walker
b4aec286ed Merge pull request #1045 from hishamco/language-management
Add Languages Management
2021-01-18 08:30:31 -05:00
Shaun Walker
6a4fd26787 Merge pull request #1059 from sbwalker/dev
auto registration of scheduled jobs
2021-01-18 08:30:14 -05:00
Shaun Walker
a2029a3ca3 auto registration of scheduled jobs 2021-01-17 11:46:09 -05:00
hishamco
bc0ba92303 Revert the changes in the LanguageController 2021-01-15 01:35:53 +03:00
hishamco
e938d4f801 Add Admins role 2021-01-15 00:28:59 +03:00
hishamco
54ff8eced1 Fix the relationship 2021-01-13 23:41:08 +03:00
hishamco
a2943d083b Set culture when added language set to current 2021-01-13 18:43:26 +03:00
hishamco
b3152ee3e5 LanguageSwitcher should have the cultures from language management 2021-01-13 18:26:36 +03:00
hishamco
c5ae8c979b Cultures should come from supported cultures 2021-01-13 18:19:56 +03:00
Shaun Walker
4fd49ab028 Merge pull request #1046 from chlupac/ContentUrl
Add missing ContentUrl method
2021-01-12 09:41:38 -05:00
Shaun Walker
edbdfe454e Merge pull request #1047 from chlupac/GetPath
Introduce GetFolderPath and GetFilePath repository methods
2021-01-12 09:41:09 -05:00
Pavel Vesely
f1a1a21d74 Introduce GetFolderPath and GetFilePath repository methods 2021-01-11 16:32:13 +01:00
Pavel Vesely
1dcb14811d Add missing ContentUrl method 2021-01-11 16:31:37 +01:00
hishamco
932c5590af Make sure one language is set to current 2021-01-11 00:11:30 +03:00
hishamco
3a8fc428a6 Use TriaStateCheckBox for language IsCurrent 2021-01-11 00:04:43 +03:00
hishamco
7d090e51a1 Add language page 2021-01-10 23:51:15 +03:00
hishamco
128729d4a0 TenantId -> SiteId 2021-01-10 23:50:34 +03:00
hishamco
70595eb90a Fix Language table 2021-01-10 23:50:21 +03:00
hishamco
8ab511fda7 Return empty list if languages list are null 2021-01-10 23:17:35 +03:00
hishamco
91a844c910 Add language management page template 2021-01-10 23:17:03 +03:00
hishamco
21e09d95da Add migration script 2021-01-10 21:32:25 +03:00
hishamco
9b4316d6cd Fix errors 2021-01-10 21:32:11 +03:00
hishamco
3059e8c763 Add language service 2021-01-10 20:17:35 +03:00
hishamco
aa19a35834 Add language repository & controller 2021-01-10 20:09:04 +03:00
Shaun Walker
1276c0269e add SMTP sender email 2021-01-07 15:06:48 -05:00
Shaun Walker
047fa9ac4e Merge pull request #1044 from sbwalker/dev
add SMTP sender email
2021-01-07 15:06:21 -05:00
Shaun Walker
b8fb230a0e Merge pull request #78 from oqtane/dev
sync with upstream
2021-01-05 17:12:40 -05:00
Shaun Walker
289c71d36f Merge pull request #1041 from sbwalker/dev
support for shared razor class library static resources in external module template
2021-01-05 17:11:52 -05:00
Shaun Walker
e3e5f782aa support for shared razor class library static resources in external module template 2021-01-05 17:11:45 -05:00
Shaun Walker
778f9cb356 added better validaton and user feedback related to SMTP configuration 2021-01-05 16:57:36 -05:00
Shaun Walker
767431fdab Merge pull request #1040 from sbwalker/dev
added better validaton and user feedback related to SMTP configuration
2021-01-05 16:57:03 -05:00
Shaun Walker
27f24160e4 Merge pull request #1039 from sbwalker/dev
fix navigation usability issue for shared add/edit page UI invoked by Control Panel and Page Management
2021-01-05 14:48:44 -05:00
Shaun Walker
1979a6dc4b Merge pull request #1021 from chlupac/UpdateSettings
Settings Fix
2021-01-05 14:47:46 -05:00
Shaun Walker
de25e3fbf1 fix navigation usability issue for shared add/edit page UI invoked by Control Panel and Page Management 2021-01-05 14:47:09 -05:00
Pavel Vesely
91c5ff7b00 UpdateSettings bugfix
ISettingControl introduction
2021-01-05 19:52:14 +01:00
Shaun Walker
78f36c9f95 Merge pull request #1038 from sbwalker/dev
fixed issue with Sql Management and System Info missing icons after new installation
2021-01-05 09:00:55 -05:00
Shaun Walker
fb258805d0 Merge pull request #1037 from hishamco/resources
Fix ResourceKey property
2021-01-05 09:00:43 -05:00
Shaun Walker
a61a2f748c fixed issue with Sql Management and System Info missing icons after new installation 2021-01-05 09:00:42 -05:00
Shaun Walker
c82d6de40e Merge pull request #1033 from hishamco/list-entries-order
Order users by display name
2021-01-05 09:00:32 -05:00
hishamco
c86a8cbd2d Fix ResourceKey property 2021-01-05 03:02:02 +03:00
hishamco
b8622e5943 Order users by display name 2021-01-03 14:02:48 +03:00
Shaun Walker
98eff1f84e Merge pull request #77 from oqtane/dev
sync
2021-01-02 15:03:25 -05:00
Shaun Walker
a9a66155e2 Merge pull request #981 from hishamco/readme
Update README.md
2021-01-02 14:07:47 -05:00
Shaun Walker
9f829e3100 Merge pull request #1032 from sbwalker/dev
fix script order
2021-01-02 14:07:21 -05:00
Shaun Walker
ab2a317728 Merge pull request #1028 from hishamco/localization
Make external module localize ready
2021-01-02 14:07:05 -05:00
Shaun Walker
7d84f156f1 Merge pull request #1025 from hishamco/language-switcher
Show LanguageSwitcher if more than one culture
2021-01-02 14:06:34 -05:00
Shaun Walker
35d1adae99 fix script order 2021-01-02 13:26:36 -05:00
Shaun Walker
18b528c1af Merge pull request #76 from oqtane/dev
Merge pull request #1009 from sbwalker/dev
2021-01-02 13:22:51 -05:00
hishamco
842442d27d Make external module localize ready 2021-01-01 00:19:58 +03:00
hishamco
56e86edf9f Address feedback 2020-12-28 19:59:58 +03:00
hishamco
f05b955c34 Show LanguageSwitcher if more than one culture 2020-12-28 18:15:28 +03:00
Shaun Walker
8ab01228ed Merge pull request #1009 from sbwalker/dev
allow developers to use custom icon libraries (Open Iconic is the default)
2020-12-22 08:37:43 -05:00
Shaun Walker
df382ce7a3 allow developers to use custom icon libraries (Open Iconic is the default) 2020-12-22 08:37:33 -05:00
Shaun Walker
05b0b74578 Merge pull request #75 from oqtane/dev
sync
2020-12-15 15:25:29 -05:00
Shaun Walker
3f8b9ef0c5 Merge pull request #997 from chlupac/content-disposition
FileController - content disposition
2020-12-15 09:02:12 -05:00
Shaun Walker
9d658e9166 Merge pull request #1001 from hishamco/revert-log-localization
Revert LogManager localization changes
2020-12-15 08:56:16 -05:00
Pavel Vesely
07711c082e FileController - content disposition 2020-12-15 11:06:52 +01:00
hishamco
eec680a151 Revert LogManager localization changes 2020-12-15 00:22:33 +03:00
Shaun Walker
deaaa74fc8 Update README.md 2020-12-14 08:52:01 -05:00
Shaun Walker
5dcfead4af Merge pull request #999 from sbwalker/dev
make QueryString parameter keys case insensitive - resolves #992
2020-12-12 15:59:19 -05:00
Shaun Walker
144c33bcab make QueryString parameter keys case insensitive - resolves #992 2020-12-12 15:58:58 -05:00
Shaun Walker
6c34c62e48 Merge pull request #74 from oqtane/dev
sync
2020-12-09 14:02:46 -05:00
Shaun Walker
01eab8fcfd Merge pull request #991 from hishamco/localize-alert-messages
Localize alert messages
2020-12-09 14:00:32 -05:00
hishamco
e94069e8a5 Localize alert messages in UI 2020-12-09 21:17:33 +03:00
hishamco
cf68d7320f Localize alert messages in controls 2020-12-09 21:15:35 +03:00
hishamco
a29d7b524c Localize alert messages in admin pages 2020-12-09 21:12:00 +03:00
Shaun Walker
3c71282379 Merge pull request #980 from chlupac/file-controller
FileController fix
2020-12-09 11:48:38 -05:00
Shaun Walker
08f2877e80 Merge pull request #983 from hishamco/translations
Add missing localization strings
2020-12-09 09:54:36 -05:00
Shaun Walker
3c13122c37 Merge pull request #987 from hishamco/localizable-component
Localizable Component Enhancement
2020-12-09 09:54:15 -05:00
Shaun Walker
7ca69be41a Merge pull request #990 from hishamco/language-switcher
Replace Visible with ShowLanguageSwitcher property
2020-12-09 09:53:53 -05:00
Shaun Walker
7c70055b83 Merge pull request #988 from hishamco/ignore
Add Content folder to .gitignore
2020-12-09 09:52:44 -05:00
hishamco
dd89296713 Replace Visible with ShowLanguageSwitcher property 2020-12-09 17:47:49 +03:00
hishamco
941d08f0a2 Add missing Control Panel localization strings 2020-12-08 22:57:58 +03:00
hishamco
3caf06d8ff Add Content folder to .gitignore 2020-12-08 22:50:36 +03:00
hishamco
c35b5d861a Add missing User Profile localization strings 2020-12-08 22:46:28 +03:00
hishamco
169a4b00a4 Add missing FileManager localization strings 2020-12-08 22:45:20 +03:00
hishamco
62f6082525 Localize TriStateCheckBox control 2020-12-08 21:23:03 +03:00
hishamco
c27e8b55df Add missing Users localization strings 2020-12-08 21:16:37 +03:00
hishamco
2d15f5d185 Add missing Themes localization strings 2020-12-08 20:55:38 +03:00
hishamco
836ba5eeb9 Add missing Tenanat localization strings 2020-12-08 20:55:28 +03:00
hishamco
0e95e94cab Add missing Sql localization strings 2020-12-08 20:50:14 +03:00
hishamco
8e4a7549ed Add missing Sites localization strings 2020-12-08 20:48:39 +03:00
hishamco
29c37575f1 Add missing Roles localization strings 2020-12-08 20:45:54 +03:00
hishamco
299e28abc4 Avoid Label.Text to be empty 2020-12-08 20:40:54 +03:00
hishamco
5ce7284a6b Returns English version if the value is empty 2020-12-08 16:45:53 +03:00
hishamco
df1d646083 Refactor LocalizableComponent 2020-12-08 16:37:55 +03:00
hishamco
f123ac89ef Add missing RecylceBin localization strings 2020-12-08 15:08:21 +03:00
hishamco
055ae26bc1 Add missing Logs localization strings 2020-12-08 14:41:03 +03:00
hishamco
e0087c1dbb Add missing Jobs localization strings 2020-12-08 14:37:54 +03:00
hishamco
87ba77fdba Localize AuditInfo 2020-12-08 13:43:05 +03:00
Shaun Walker
d953587e4b Merge pull request #986 from chlupac/returnurl
Fix - return to url during login fail when returnurl contains "/"
2020-12-07 17:06:04 -05:00
Pavel Vesely
35e776b150 Fix - return to url during login fail when returnurl contains "/" 2020-12-07 21:27:00 +01:00
Shaun Walker
86beef305e Merge pull request #976 from jimspillane/FixAureDeploy
Fix Azure deploy
2020-12-07 14:06:25 -05:00
Shaun Walker
a526719663 Merge pull request #982 from hishamco/action-dialog
Localize ActionDialog.Text
2020-12-07 13:28:02 -05:00
hishamco
f0f3055869 Add PermissionGrid localization strings 2020-12-06 21:46:19 +03:00
hishamco
5e49206828 Add FileManager localization strings 2020-12-06 21:46:03 +03:00
hishamco
5678a1796a Add missing Files localization strings 2020-12-06 21:45:33 +03:00
hishamco
b878b3ee2f Localize ActionDialog.Text 2020-12-06 19:51:25 +03:00
hishamco
8c9fc952d8 Update README.md 2020-12-06 19:28:12 +03:00
Pavel Vesely
14f8155df6 FileController fix
- using PhysicalFile framework method (current implementation causes file locks and 500 error at heavy load)
- Add correct mimetype to header based on file extension
2020-12-06 16:23:28 +01:00
Shaun Walker
5273ae8c45 Merge pull request #975 from jimspillane/FixAureDeploy
Fix Azure deploy
2020-12-04 14:54:05 -05:00
Shaun Walker
1968b0283d Merge pull request #967 from hishamco/language-switcher
Add Language switcher
2020-12-04 14:53:48 -05:00
Jim Spillane
1b017a9651 Fix Azure Deploy
Add 5.0 to framework App Service siteConfig
2020-12-04 10:43:29 -05:00
Jim Spillane
2fe474268e Revert "Fix Azure Deploy"
This reverts commit d688a7c10da81d42fe92b8e1ca7ee266199b3705.
2020-12-04 10:34:52 -05:00
Jim Spillane
dc7cea1db0 Merge pull request #23 from oqtane/master
Sync Master
2020-12-04 10:20:02 -05:00
Shaun Walker
0ba348d73e Merge pull request #974 from sbwalker/dev
fix #957 related to loading resources within a Settings component
2020-12-03 15:19:44 -05:00
Shaun Walker
9f590b32f7 fix #957 related to loading resources within a Settings component 2020-12-03 15:19:23 -05:00
hishamco
5e293ee298 Fix SupportedCultures bug 2020-12-03 17:25:01 +03:00
hishamco
20f1a6175f Use cookie everywhere 2020-12-03 17:15:08 +03:00
hishamco
049ded6f7e Fallback to default culture if its required 2020-12-03 16:14:23 +03:00
hishamco
1a8125c26d Use REST style 2020-12-03 15:50:25 +03:00
hishamco
5ee38e4ae7 Add Visible property to control the visibility 2020-12-03 14:13:01 +03:00
hishamco
a37eb8a44a Introduce Culture model to avoid CultureInfo.DisplayName issue 2020-12-03 14:05:49 +03:00
hishamco
1b3cc2c44e Interop local storage APIs should be generic 2020-12-03 13:37:18 +03:00
Shaun Walker
863c13d1d8 Merge pull request #968 from sbwalker/dev
Fixes to make site alias, page path, and module action Url resolutions case insensitive. Optimized logic for Settings component which fixed localization rendering issue.
2020-12-02 09:16:33 -05:00
Shaun Walker
fd60b40c53 Fixes to make site alias, page path, and module action Url resolutions case insensitive. Optimized logic for Settings component which fixed localization rendering issue. 2020-12-01 19:36:02 -05:00
hishamco
fa3cc48fd0 Avoid to select the current selected culture 2020-12-02 02:19:47 +03:00
hishamco
d4dd80ff32 Add missing event args 2020-12-02 02:15:52 +03:00
hishamco
330499dda5 Use Interop 2020-12-02 02:10:01 +03:00
hishamco
75556070d6 Ability to change culture 2020-12-02 02:04:34 +03:00
hishamco
c4d1b16abb Add LanguageSwitcher component 2020-12-02 01:52:46 +03:00
hishamco
c67e893b6e Add LocalizationService APIs 2020-12-02 01:38:32 +03:00
hishamco
418c9888c4 Add LocalizationController 2020-12-02 01:38:00 +03:00
Shaun Walker
a875a5ad32 Merge pull request #73 from oqtane/dev
sync
2020-12-01 14:34:11 -05:00
Shaun Walker
e9a58138fc Update README.md 2020-11-30 18:59:44 -05:00
Shaun Walker
e57f0675c6 Merge pull request #954 from hishamco/localize-logs
Localize log messages
2020-11-30 08:14:35 -05:00
hishamco
d964c25596 Add Resources folder 2020-11-27 22:06:54 +03:00
hishamco
d5e48296ed Set RootNamespace 2020-11-27 22:06:40 +03:00
hishamco
2ea0b7199b Localize log messages 2020-11-27 21:48:52 +03:00
Shaun Walker
a6b45014a4 Merge pull request #72 from oqtane/dev
sync
2020-11-25 16:53:03 -05:00
Shaun Walker
f6fafbfcfa Merge pull request #950 from hishamco/fix-action-link-localization
Fix localization issue in ActionLink
2020-11-25 16:52:24 -05:00
Shaun Walker
2f943546ba Merge pull request #951 from sbwalker/dev
Module Creator activation improvement
2020-11-25 16:52:08 -05:00
Shaun Walker
3fcbc07406 Module Creator activation improvement 2020-11-25 16:51:39 -05:00
hishamco
7fd0c6c3aa Fix localization issue in ActionLink 2020-11-26 00:04:47 +03:00
Shaun Walker
23d273f3f7 Merge pull request #949 from sbwalker/dev
improve user experience of Module Creator flow
2020-11-25 11:59:45 -05:00
Shaun Walker
4401dba4ec improve user experience of Module Creator flow 2020-11-25 11:59:17 -05:00
Shaun Walker
4bf7dcc835 Merge pull request #947 from sbwalker/dev
improve user experience by delegating application restart responsibility to the host user
2020-11-24 16:23:25 -05:00
Shaun Walker
5e42ab8cca improve user experience by delegating application restart responsibility to the host user 2020-11-24 16:22:53 -05:00
Shaun Walker
1e1a2aa145 Update README.md 2020-11-24 10:48:30 -05:00
Shaun Walker
fa59ec1b24 Merge pull request #71 from oqtane/dev
sync
2020-11-22 10:41:36 -05:00
Shaun Walker
03d246340f Merge pull request #940 from sbwalker/dev
fix ModuleCreator Invalid character use in naming fields #889
2020-11-20 16:40:58 -05:00
Shaun Walker
19f924c3d3 fix ModuleCreator Invalid character use in naming fields #889 2020-11-20 16:40:25 -05:00
Shaun Walker
6185750aeb Merge pull request #938 from sbwalker/dev
missing IStringLocalizer<Index> causing compilation error
2020-11-20 10:30:32 -05:00
Shaun Walker
710aab9b93 missing IStringLocalizer<Index> causing compilation error 2020-11-20 10:30:07 -05:00
Shaun Walker
6d913c842c Merge pull request #70 from oqtane/dev
sync
2020-11-20 10:27:20 -05:00
Shaun Walker
8311d01f32 Merge pull request #935 from hishamco/localize-RTE
Localize RichTextEditor Component
2020-11-20 10:26:08 -05:00
Shaun Walker
9a3528a208 Merge pull request #934 from hishamco/localize-permission-grid
Localize PermissionGrid Component
2020-11-20 10:25:52 -05:00
Shaun Walker
acd77b79ba Merge pull request #932 from hishamco/localize-control-panel
Localize ControlPanel Component
2020-11-20 10:25:38 -05:00
Shaun Walker
50959199bd Merge pull request #931 from hishamco/localize-oqtane-theme
Localize Login & UserProfile components
2020-11-20 10:25:25 -05:00
Shaun Walker
5d06c356cd Merge pull request #930 from hishamco/localize-installer-page
Localizer Installer Page
2020-11-20 10:25:14 -05:00
Shaun Walker
066f6095e6 Merge pull request #929 from hishamco/localize-html-text
Localize HtmlText
2020-11-20 10:25:02 -05:00
Shaun Walker
2ead8fc850 Merge pull request #928 from hishamco/localize-modules-pages
Localize Modules Pages
2020-11-20 10:24:49 -05:00
Shaun Walker
6c3726be0c Merge pull request #927 from hishamco/localize-module-definitions-pages
Localize Module Definitions Pages
2020-11-20 10:24:36 -05:00
Shaun Walker
16b713ad6c Merge pull request #926 from hishamco/localize-module-creator-page
Localize Module Creator Page
2020-11-20 10:24:23 -05:00
Shaun Walker
7cad2e9bd6 Merge pull request #925 from hishamco/localize-reset-page
Localize Reset Page
2020-11-20 10:24:06 -05:00
Shaun Walker
93cd2e563a Merge pull request #924 from hishamco/localize-register-page
Localizer Register Page
2020-11-20 10:23:52 -05:00
Shaun Walker
b7e40373b4 Merge pull request #923 from hishamco/localize-files-pages
Localize Files Pages
2020-11-20 10:23:36 -05:00
Shaun Walker
0a7e2dba84 Merge pull request #922 from hishamco/localize-jobs-pages
Localize Jobs Pages
2020-11-20 10:23:21 -05:00
Shaun Walker
fe3801dcfb Merge pull request #921 from hishamco/localize-login-page
Localize Login Page
2020-11-20 10:23:05 -05:00
Shaun Walker
c205b9f930 Merge pull request #920 from hishamco/localize-logs-pages
Localize Logs Pages
2020-11-20 10:22:51 -05:00
Shaun Walker
7db52ce49a Merge pull request #919 from hishamco/localize-pages
Localize Pages
2020-11-20 10:22:36 -05:00
Shaun Walker
6cf6e312a8 Merge pull request #918 from hishamco/localize-profiles-pages
Localize Profiles Pages
2020-11-20 10:22:21 -05:00
Shaun Walker
88ba43557c Merge pull request #917 from hishamco/localize-recycle-bin-page
Localize Recycle Bin
2020-11-20 10:22:03 -05:00
Shaun Walker
13e98e9d51 Merge pull request #937 from sbwalker/dev
missing using statement causing compilation error
2020-11-20 10:21:00 -05:00
Shaun Walker
d64f06eb71 missing using statement causing compilation error 2020-11-20 10:20:29 -05:00
hishamco
26f610e43b Localize RichTextEditor component 2020-11-20 02:25:45 +03:00
hishamco
33c8fe6e33 Localize PermissionGrid component 2020-11-20 02:22:21 +03:00
hishamco
5cee11accb Localize ControlPanel component 2020-11-20 02:11:16 +03:00
hishamco
f8e1c8c53d Localize Login & UserProfile components 2020-11-20 02:05:48 +03:00
hishamco
f9a0ecca61 Localizer installer page 2020-11-20 01:56:25 +03:00
hishamco
c7cb3ad53a Localize HtmlText 2020-11-20 01:53:24 +03:00
hishamco
d108cc3990 Localize non components for the modules pages 2020-11-20 01:45:09 +03:00
hishamco
867c8f84ad Localize components for the modules pages 2020-11-20 01:43:02 +03:00
hishamco
4599e9a0fc Localize non components for the module definitions pages 2020-11-20 01:39:56 +03:00
hishamco
a77a86a439 Localize components for the module definitions pages 2020-11-20 01:37:18 +03:00
hishamco
46bf682819 Localize module creator page 2020-11-20 01:32:15 +03:00
hishamco
d45035ce56 Localize reset page 2020-11-20 01:27:30 +03:00
hishamco
d5d13c6def Localizer register page 2020-11-20 01:26:01 +03:00
hishamco
6b61713205 Localize non components for the files pages 2020-11-20 01:20:59 +03:00
hishamco
fb3bd51227 Localize components for the files pages 2020-11-20 01:17:36 +03:00
hishamco
177dcad5a1 Localize non components for the jobs pages 2020-11-20 01:12:15 +03:00
hishamco
bc570de9e6 Localize components for jobs pages 2020-11-20 01:06:57 +03:00
hishamco
be1237f748 Localize login page 2020-11-20 01:00:50 +03:00
hishamco
db6e550c86 Localize non components for the logs pages 2020-11-20 00:56:37 +03:00
hishamco
e1b02ee405 Localize components for the logs pages 2020-11-20 00:53:55 +03:00
hishamco
9a3fd94c11 Localize non components for the pages 2020-11-20 00:50:14 +03:00
hishamco
917caab7a1 Localize components of the pages 2020-11-20 00:44:44 +03:00
hishamco
fcfcd46d8e Localize non components for the profiles pages 2020-11-20 00:37:10 +03:00
hishamco
387c1aa57f Localize component for the profiles pages 2020-11-20 00:34:39 +03:00
hishamco
09d84bc12a Localize Recylce Bin 2020-11-20 00:30:07 +03:00
Shaun Walker
2bf5e6c6b3 Merge pull request #69 from oqtane/dev
sync
2020-11-19 15:54:32 -05:00
Shaun Walker
301051898b Merge pull request #916 from hishamco/runtime
Runtime enum should be in Oqtane.Shared
2020-11-19 15:37:19 -05:00
Shaun Walker
217bb972e1 Merge pull request #901 from hishamco/localize-site-setiings-page
Localize Site Settings Page
2020-11-19 15:34:38 -05:00
Shaun Walker
3b62ffd4f0 Merge pull request #900 from hishamco/localize-sites-pages
Localize Sites Pages
2020-11-19 15:34:25 -05:00
Shaun Walker
ab5bf3cda5 Merge pull request #899 from hishamco/localize-sql-page
Localize SQL Page
2020-11-19 15:34:12 -05:00
Shaun Walker
db50a2de5f Merge pull request #898 from hishamco/localize-system-info-page
Localize system info page
2020-11-19 15:34:01 -05:00
Shaun Walker
4a8dd2dc6a Merge pull request #897 from hishamco/localize-tenants-pages
Localize Tenants Pages
2020-11-19 15:33:48 -05:00
Shaun Walker
6c445b1202 Merge pull request #896 from hishamco/localize-themes-pages
Localize Themes Pages
2020-11-19 15:33:36 -05:00
Shaun Walker
4973dbb9a5 Merge pull request #895 from hishamco/localize-upgrade-page
Localize Upgrade Page
2020-11-19 15:33:21 -05:00
Shaun Walker
bd198fef7b Merge pull request #894 from hishamco/localize-user-profiles-pages
Localize User Profile Pages
2020-11-19 15:33:08 -05:00
Shaun Walker
e25146cd68 Merge pull request #893 from hishamco/localize-users-pages
Localize Users Pages
2020-11-19 15:32:55 -05:00
Shaun Walker
a849ee283e Merge pull request #892 from hishamco/localize-roles-pages
Localize Roles Pages
2020-11-19 15:32:41 -05:00
Shaun Walker
57357de2a7 Merge pull request #891 from hishamco/default-localized-string
Fallback to English as default culture
2020-11-19 15:32:25 -05:00
Shaun Walker
34fb41fac7 Merge pull request #67 from oqtane/dev
sync
2020-11-19 15:02:16 -05:00
Shaun Walker
66b2718fbb Merge pull request #914 from sbwalker/master
Fix #904 - module title not updating in UI after modification
2020-11-19 14:29:26 -05:00
Shaun Walker
48aa051a11 Merge pull request #913 from sbwalker/master
Fix #904 - module title not updating in UI after modification
2020-11-19 14:24:32 -05:00
Shaun Walker
3967c7c783 Fix #904 - module title not updating in UI after modification 2020-11-19 14:22:30 -05:00
Shaun Walker
80dd3cae92 Update README.md 2020-11-19 14:20:44 -05:00
hishamco
322d45dd12 Runtime enum should be in Oqtane,Shared 2020-11-19 17:33:49 +03:00
Jim Spillane
a38cb25804 Merge pull request #21 from oqtane/master
sync master
2020-11-18 22:36:01 -05:00
Shaun Walker
1f91d7d1d2 Merge pull request #66 from oqtane/master
sync
2020-11-17 17:15:15 -05:00
hishamco
e94741d049 Localize site settings page 2020-11-18 00:17:16 +03:00
hishamco
5155cb214f Localize non component of the sites pages 2020-11-18 00:13:46 +03:00
hishamco
236a4bd3d9 Localize components of sites page 2020-11-18 00:09:51 +03:00
hishamco
1518afbd93 Localize SQL page 2020-11-17 23:57:58 +03:00
hishamco
a14616a7c1 Localize system info page 2020-11-17 23:54:59 +03:00
hishamco
2672f47cdf Localize non components of the tenants pages 2020-11-17 23:47:38 +03:00
hishamco
bbda300952 Localize components for the tenants pages 2020-11-17 23:46:14 +03:00
hishamco
c1fa6589af Localize non components for themes pages 2020-11-17 23:42:27 +03:00
hishamco
1b44de6972 Localize components for the themes pages 2020-11-17 23:40:23 +03:00
hishamco
2d9ad076d2 Localize upgrade page 2020-11-17 23:34:49 +03:00
hishamco
dca607b22f Localize non components for user profile pages 2020-11-17 23:24:14 +03:00
hishamco
5c3e22ab34 Localize components of the user profile pages 2020-11-17 23:13:13 +03:00
hishamco
086e3623c3 Localize non components in users pages 2020-11-17 23:04:16 +03:00
hishamco
261f48e842 Localize components for the users pages 2020-11-17 22:56:41 +03:00
hishamco
b4333a743d Localize non components strings in roles pages 2020-11-17 22:44:44 +03:00
hishamco
c70f37d33c Fix resource keys 2020-11-17 22:43:53 +03:00
hishamco
16b5dd99cc Localize components for the roles pages 2020-11-17 22:39:38 +03:00
hishamco
d8d1412a8f Fallback to English as default culture 2020-11-17 22:28:17 +03:00
Shaun Walker
c44bc8709d Update README.md 2020-11-16 08:30:02 -05:00
Shaun Walker
d9f9e73480 Update README.md 2020-11-13 10:00:31 -05:00
Shaun Walker
2b371b2a9f Update README.md 2020-11-11 11:35:57 -05:00
Shaun Walker
232cf77e84 Update README.md 2020-11-11 11:35:21 -05:00
Shaun Walker
080c9ff38b Update README.md 2020-11-11 11:33:38 -05:00
Shaun Walker
9250a03aea Update README.md 2020-11-11 11:32:56 -05:00
Shaun Walker
07ae0edd30 Merge pull request #879 from sbwalker/master
removed unnecessary file
2020-11-11 10:24:39 -05:00
Shaun Walker
32e8052079 removed unnecessary file 2020-11-11 10:24:10 -05:00
Shaun Walker
60ccad3106 Merge pull request #878 from sbwalker/master
fixed regression issue which was preventing proper handling of situations where module assembly is missing
2020-11-11 10:19:40 -05:00
Shaun Walker
bcc00a2dbb fixed regression issue which was preventing proper handling of situations where module assembly is missing 2020-11-11 10:19:04 -05:00
Shaun Walker
5080040590 Merge pull request #65 from oqtane/master
sync
2020-11-11 09:02:02 -05:00
Shaun Walker
0d71a3878f Merge pull request #877 from jimspillane/UpgradeExternalModuleTemplateToNET50
Upgrade external module template to net50
2020-11-11 09:00:36 -05:00
Jim Spillane
82b16d28ff Upgrade External Module Template to NET5.0 2020-11-10 21:02:51 -05:00
Jim Spillane
e34ffb716d Merge pull request #20 from oqtane/master
sync master
2020-11-10 20:52:37 -05:00
Shaun Walker
6f8c2fb2ed Merge pull request #875 from hishamco/net5
Update README.md
2020-11-10 16:29:21 -05:00
Shaun Walker
3970722abf Merge pull request #876 from sbwalker/master
include syncevents on module add/update/delete to trigger reload in UI
2020-11-10 16:27:37 -05:00
Shaun Walker
880ad0486a include syncevents on module add/update/delete to trigger reload in UI 2020-11-10 16:26:50 -05:00
hishamco
a02786b8b0 Update README.md 2020-11-11 00:22:07 +03:00
Shaun Walker
2bea59fc66 Merge pull request #874 from hishamco/net5
Upgrade packages to .NET 5 RTM
2020-11-10 16:15:20 -05:00
hishamco
45819aae07 Upgrade packages to .NET 5 RTM 2020-11-10 23:47:43 +03:00
Shaun Walker
4762fac0ce Merge pull request #873 from sbwalker/master
improve user experence of Module Creator during app restart
2020-11-09 15:53:14 -05:00
Shaun Walker
8b97872100 improve user experence of Module Creator during app restart 2020-11-09 15:52:40 -05:00
Shaun Walker
b921ec24ab Merge pull request #872 from sbwalker/master
fixed issue where modulestate was being modified and not treated as a readonly cache
2020-11-09 15:36:36 -05:00
Shaun Walker
07519bccde fixed issue where modulestate was being modified and not treated as a readonly cache 2020-11-09 15:35:32 -05:00
Shaun Walker
a8932ec1e0 Merge pull request #64 from oqtane/master
sync
2020-11-09 10:51:23 -05:00
Shaun Walker
a9bb82347d Merge pull request #871 from sbwalker/master
Removed comment and added defensive logic in the eent that the moduletype is not valid. Also changed default behavior to display the name if the key is missing. Will need an option in the future to enable the display of missing keys.
2020-11-09 09:43:52 -05:00
Shaun Walker
2c58a97ec1 fixed malformed tokens in external module template 2020-11-09 09:42:01 -05:00
Shaun Walker
41b30bfab2 Removed comment and added defensive logic in the eent that the moduletype is not valid. Also changed default behavior to display the name if the key is missing. Will need an option in the future to enable the display of missing keys. 2020-11-09 09:27:52 -05:00
Shaun Walker
a77aa5fe18 Merge pull request #63 from oqtane/master
sync
2020-11-09 08:29:14 -05:00
Shaun Walker
780b0c704c Merge pull request #870 from hishamco/localization
Use IStringLocalizerFactory for simplicity
2020-11-08 14:58:42 -05:00
hishamco
26c054c22d Use IStringLocalizerFactory for simplicity 2020-11-08 22:26:04 +03:00
Shaun Walker
047336ad21 Merge pull request #62 from oqtane/master
sync
2020-11-08 10:52:36 -05:00
Shaun Walker
2d344975ff Merge pull request #869 from sbwalker/master
Module Creator should only include Framework References for 2.0.0 and above
2020-11-07 16:45:30 -05:00
Shaun Walker
e0017065af Module Creator should only include Framework References for 2.0.0 and above 2020-11-07 16:44:41 -05:00
Shaun Walker
f0a9739b37 Merge pull request #868 from sbwalker/master
upgrade Module Creator external template to .NET 5 RC2 for testing. In order to use it you must choose Local as the Target Version in the Module Creator.
2020-11-07 16:36:48 -05:00
Shaun Walker
5e801bd5ee upgrade Module Creator external template to .NET 5 RC2 for testing. In order to use it you must choose Local as the Target Version in the Module Creator. 2020-11-07 16:35:44 -05:00
Shaun Walker
824df0e849 Update README.md 2020-11-05 10:27:20 -05:00
Shaun Walker
a24fd099c0 Update README.md 2020-11-05 09:25:46 -05:00
Shaun Walker
c6fdc99690 Merge pull request #866 from sbwalker/master
move version to 2.0.0 and target to net5.0
2020-11-05 09:20:59 -05:00
Shaun Walker
b602113cd1 move version to 2.0.0 2020-11-05 09:19:56 -05:00
Shaun Walker
b6886116ad Merge pull request #865 from sbwalker/master
fixed JavaScript issue when loading scripts dynamically which caused only the first script to be loaded for a module
2020-11-05 08:51:58 -05:00
Shaun Walker
f976910730 fixed JavaScript issue when loading scripts dynamically which caused only the first script to be loaded 2020-11-05 08:50:52 -05:00
Shaun Walker
6726a42406 Merge pull request #864 from sbwalker/master
resolve Login UI issue #794
2020-11-04 17:44:09 -05:00
Shaun Walker
23a35cf3c4 resolve Login UI issue #794 2020-11-04 17:43:27 -05:00
Shaun Walker
f5b99bf9d1 Merge pull request #863 from sbwalker/master
implement optional Security parameter for TabPanel #797
2020-11-04 17:27:58 -05:00
Shaun Walker
d7135ad4f9 implement optional Security parameter for TabPanel #797 2020-11-04 17:27:15 -05:00
Shaun Walker
0d03f59cd4 Merge pull request #862 from sbwalker/master
use logo with glow effect so it is visible on both black and white backgrounds
2020-11-04 16:59:03 -05:00
Shaun Walker
5b49e1bc7c use logo with glow effect so it is visible on both black and white backgrounds 2020-11-04 16:58:02 -05:00
Shaun Walker
a3215e286a Merge pull request #61 from oqtane/master
sync
2020-11-04 16:00:53 -05:00
Shaun Walker
b10140f513 Merge pull request #861 from sbwalker/master
performance optimization to reduce calls from client to server unless content is changed
2020-11-04 15:59:49 -05:00
Shaun Walker
8eaa298d8b performance optimization to reduce calls from client to server unless content is changed 2020-11-04 15:58:13 -05:00
Shaun Walker
c52d255a30 Merge pull request #860 from sbwalker/master
load module settings automatically so that they are part of the ModuleState and can be easily accessed by developers
2020-11-04 15:41:48 -05:00
Shaun Walker
97cec46ec1 load module settings automatically so that they are part of the ModuleState and can be easily accessed by developers 2020-11-04 15:40:57 -05:00
Shaun Walker
46c1564e3d Merge pull request #859 from sbwalker/master
optimize performance when running on WebAssembly by caching assembly payload that needs to be served to new clients
2020-11-04 08:11:03 -05:00
Shaun Walker
700b6e2d68 optimize performance when running on WebAssembly by caching assembly payload that needs to be served to new clients 2020-11-04 08:10:21 -05:00
Shaun Walker
3cfb27b2bc Merge pull request #857 from sbwalker/master
fixed compatibility issue in .NET5/WebAssembly where assemblies were not being loaded into the default AppDomain, optimized service registration on WebAssembly, fixed spelling mistake for satellite assemblies constant and fixed issue in LocalizableComponent
2020-11-03 14:44:23 -05:00
Shaun Walker
b4b73b7e5a fixed compatibility issue in .NET5/WebAssembly where assemblies were not being loaded into the default AppDomain, optimized service registration on WebAssembly, fixed spelling mistake for satellite assemblies constant and fixed issue in LocalizableComponent 2020-11-03 14:41:49 -05:00
Shaun Walker
8c2338e590 Update README.md 2020-10-28 07:54:35 -04:00
Shaun Walker
89875516e6 Update README.md 2020-10-25 21:07:56 -04:00
Shaun Walker
15aa2c2e47 Merge pull request #60 from oqtane/master
sync
2020-10-25 13:11:01 -04:00
Shaun Walker
1bf4bd0022 Merge pull request #850 from hishamco/patch-1
Update README.md
2020-10-25 13:09:23 -04:00
Shaun Walker
570b885c09 Merge pull request #849 from hishamco/section-localization
Localize section component
2020-10-25 13:08:40 -04:00
Shaun Walker
90de3949d2 Merge pull request #848 from hishamco/tab-panel-localization
Localize TabPanel component
2020-10-25 13:08:20 -04:00
Hisham Bin Ateya
38eb7c05b3 Update README.md 2020-10-24 10:12:48 +03:00
hishamco
5948e7ba76 Localize section component 2020-10-24 10:05:57 +03:00
hishamco
3cbf55e1ce Move DisplayHeading() from TabStrip to TabPanel 2020-10-24 09:52:17 +03:00
hishamco
ec270fbff0 Localize TabPanel component 2020-10-24 09:44:56 +03:00
Shaun Walker
03926bccb0 Merge pull request #846 from sbwalker/master
fix folder parsing issue specific to Azure environment where WebRootPath contains 2 wwwroot nested folders
2020-10-22 16:31:41 -04:00
Shaun Walker
cdb7de84fa fix folder parsing issue specific to Azure environment where WebRootPath contains 2 wwwroot nested folders 2020-10-22 16:30:27 -04:00
Shaun Walker
76eccececa Update README.md 2020-10-21 09:20:47 -04:00
Shaun Walker
2f17945020 Merge pull request #843 from sbwalker/master
Fixed issue where Page Url expansion script for 1.0.4 was not implemented properly - it was not tagged as an embedded resource.
2020-10-21 08:02:57 -04:00
Shaun Walker
cbd7caa6df Merge branch 'master' of https://github.com/sbwalker/oqtane.framework into master 2020-10-21 08:01:39 -04:00
Shaun Walker
0ef04e81ff Fixed issue where Page Url expansion script for 1.0.4 was not implemented properly - it was not tagged as an embedded resource. 2020-10-21 08:01:17 -04:00
Shaun Walker
4dbe16bee5 Merge pull request #841 from hishamco/action-link-localization
Localize ActionDialog
2020-10-20 16:47:34 -04:00
hishamco
3f78c99ed4 Localize ActionDialog 2020-10-20 23:16:53 +03:00
Shaun Walker
eaa8649699 Merge pull request #59 from oqtane/master
sync
2020-10-20 12:54:28 -04:00
Shaun Walker
5835e037a7 Merge pull request #839 from hishamco/action-link-localization
Fix issue with ActionLink localization
2020-10-20 12:50:42 -04:00
hishamco
af41e8bcfb Fix issue with ActionLink localization 2020-10-20 18:36:06 +03:00
Shaun Walker
d19f3f358b Update README.md 2020-10-20 09:13:43 -04:00
Shaun Walker
fc7000394f Merge pull request #58 from oqtane/master
sync
2020-10-20 09:05:32 -04:00
Shaun Walker
892b79833b Merge pull request #837 from mikecasas/master
Deleted some white space.
2020-10-20 07:53:58 -04:00
Shaun Walker
ef51d5f05d Merge pull request #836 from TonyValenti/master
Factor out Policy Names
2020-10-20 07:53:19 -04:00
Shaun Walker
40d8315cff Merge pull request #834 from hishamco/lang
Remove LangVersion
2020-10-20 07:52:55 -04:00
Shaun Walker
544475c489 Merge pull request #828 from hishamco/action-link-localization
Action link localization
2020-10-20 07:52:40 -04:00
Shaun Walker
e61cd3d366 Merge pull request #824 from hishamco/localizable-component
Localizable component
2020-10-20 07:52:11 -04:00
Mike Casas
01fc60d35d Merge remote-tracking branch 'upstream/master' into master 2020-10-20 07:32:33 -04:00
Mike Casas
17a9710c14 Delete white space. 2020-10-20 07:31:24 -04:00
Tony Valenti
8cf846ba90 Factor out Policy Names
Change AppDomain to AppContext
2020-10-19 20:04:13 -05:00
hishamco
70a345d2a9 Remove LangVersion 2020-10-19 22:11:51 +03:00
hishamco
79b584f268 Check needed if the component is localizable 2020-10-19 21:47:59 +03:00
Shaun Walker
3b09699618 Merge pull request #831 from mikecasas/master
Update template to use the new constants.
2020-10-19 09:48:32 -04:00
Mike Casas
1315e0382e Update template to use the new constants. 2020-10-19 09:26:28 -04:00
Shaun Walker
c733707adc Merge pull request #830 from sbwalker/master
modify comment
2020-10-19 08:51:21 -04:00
Shaun Walker
9294537e23 modify comment 2020-10-19 08:50:37 -04:00
Shaun Walker
2abc2cdf20 Merge pull request #829 from sbwalker/master
introduce Resource Declaration and Location properties to offer more resource management options for developers
2020-10-19 08:04:00 -04:00
Shaun Walker
ecacb681b4 introduce Resource Declaration and Location properties to offer more resource management options for developers 2020-10-19 08:03:04 -04:00
hishamco
34b9903b15 Localize ActionLink 2020-10-19 12:16:35 +03:00
hishamco
fed56098a0 Avoid resource check in child components 2020-10-19 11:36:05 +03:00
hishamco
fd5d777d3a Label should use LocalizableComponent 2020-10-19 11:17:34 +03:00
hishamco
5bb7c63d44 Introduce LocalizableComponent 2020-10-19 11:16:46 +03:00
Shaun Walker
34122a344d Merge pull request #818 from sbwalker/master
upgrade to .NET5 RC2
2020-10-18 09:31:16 -04:00
Shaun Walker
74026401a6 upgrade to .NET5 RC2 2020-10-18 09:30:24 -04:00
Shaun Walker
f5beb54ddb Merge pull request #817 from sbwalker/master
fixed compilation warnings in AuditInfo, fixed issue in ModuleMessage triggered in InstallWizard, fixed PWA JavaScript in ThemeBuilder for all browsers
2020-10-18 09:10:06 -04:00
Shaun Walker
d082c5427b fixed compilation warnings in AuditInfo, fixed issue in ModuleMessage triggered in InstallWizard, fixed PWA JavaScript in ThemeBuilder for all browsers 2020-10-18 09:09:18 -04:00
Shaun Walker
f3e2177423 Merge pull request #57 from oqtane/master
sync
2020-10-18 08:54:34 -04:00
Shaun Walker
7c8beac3dc Merge pull request #788 from sbwalker/master
Changes for .NET 5
2020-10-18 08:53:11 -04:00
Shaun Walker
1293b98226 Merge pull request #801 from hishamco/localizable-labels
Use ServiceActivator instead of IHttpContextAccessor
2020-10-18 08:52:13 -04:00
Shaun Walker
63f43bc27e Merge pull request #802 from iJungleboy/master
Add Documentation attributes #570
2020-10-18 08:52:01 -04:00
Shaun Walker
f9296ec5c5 Merge pull request #816 from hishamco/editor-config
Add .editorconfig
2020-10-18 08:51:48 -04:00
Shaun Walker
9543cd7031 Merge pull request #805 from TonyValenti/master
Factored out Contants.*** Role into RoleNames.***
2020-10-18 08:51:23 -04:00
hishamco
857d699c0d Add .editorconfig 2020-10-18 00:55:16 +03:00
Tony Valenti
c683de2cda Refactor TenantNames.Master 2020-10-16 10:45:13 -05:00
Tony Valenti
3e71bdfef3 Replace string with System.Net.Mime.MediaTypeNames.Application.Octet 2020-10-16 10:38:19 -05:00
Tony Valenti
766be6c929 Factor out default controller route. 2020-10-16 10:37:17 -05:00
Tony Valenti
f33fb4d001 Factoring out Constants.AdminPane and Constants.HostUser 2020-10-16 10:23:17 -05:00
Tony Valenti
becc779db8 Extracted "ViewModule" and "EditModule" into PolicyNames class. 2020-10-16 10:07:01 -05:00
Tony Valenti
955e7a3856 Factored out Contants.*** Role into RoleNames.***
Renamed 'AllUsers' to 'Everyone'
2020-10-16 06:22:52 -05:00
ijungleboy
06c041dd4e Add Documentation attributes
part of https://github.com/oqtane/oqtane.framework/issues/570
2020-10-15 10:38:25 +02:00
hishamco
4a90e6e64f Use ServiceActivator instead of IHttpContextAccessor 2020-10-15 06:07:11 +03:00
Shaun Walker
81475fd835 Merge pull request #796 from hishamco/localizable-labels
Support label localization
2020-10-13 07:52:24 -04:00
hishamco
edc65e66c9 Use AddHttpContextAccessor() 2020-10-12 18:26:04 +03:00
hishamco
4b11bdc4be Support label localization 2020-10-12 18:15:08 +03:00
Shaun Walker
67067a884b Merge pull request #791 from hishamco/localization-configuration
Simplify localization settings configurations
2020-10-11 20:34:56 -04:00
hishamco
86bb6d1ea8 Simplify localization settings configurations 2020-10-10 22:19:21 +03:00
Shaun Walker
7b1a2fb887 Merge pull request #789 from hishamco/debug
Add blazor error details on DEV environment
2020-10-09 14:28:34 -04:00
hishamco
b3db92ee95 Add blazor error details on DEV environment 2020-10-09 19:17:42 +03:00
Shaun Walker
aad10ab1c4 Changes for .NET 5 2020-10-08 11:20:43 -04:00
Shaun Walker
3ab9510e2a Update README.md 2020-10-08 09:59:05 -04:00
Shaun Walker
fde43b6c39 Merge pull request #783 from mikecasas/master
Refactor to eliminate repetitive code.
2020-10-07 09:24:43 -04:00
Mike Casas
7b3dfc49b2 Refactor to eliminate repetitive code. 2020-10-06 08:11:00 -04:00
Shaun Walker
0a9edd8916 Merge pull request #781 from sbwalker/master
Fixed build warnings related to ModuleMessage component changes
2020-10-05 09:12:52 -04:00
Shaun Walker
0c0916c6ab Fixed build warnings related to ModuleMessage component changes 2020-10-05 09:11:47 -04:00
Shaun Walker
ece8f3a57e Merge pull request #56 from oqtane/master
sync
2020-10-04 10:57:24 -04:00
Shaun Walker
3d7630d3d4 Update README.md 2020-10-04 10:43:09 -04:00
Shaun Walker
8b6d0d3c7f Merge pull request #779 from hishamco/supported-cultures
Skip missed satellite assemblies forlders
2020-10-04 10:29:44 -04:00
hishamco
ce37d2f2d2 Skip missed satellite assemblies forlders 2020-10-03 23:26:44 +03:00
Shaun Walker
40524300bf Merge pull request #777 from hishamco/remove-warning
Avoid Building ServiceProvider in ConfigureServices
2020-10-03 15:52:04 -04:00
Shaun Walker
5ae9daf5f2 Merge pull request #778 from sbwalker/master
added DefaultAction property to IModule (#765)
2020-10-03 15:51:30 -04:00
Shaun Walker
6a7be12758 added DefaultAction property to IModule (#765) 2020-10-03 15:50:15 -04:00
hishamco
bcb6c81e43 Avoid Building ServiceProvider in ConfigureServices 2020-10-03 22:41:48 +03:00
Shaun Walker
26c40fb367 Merge pull request #55 from oqtane/master
sync
2020-10-03 15:15:16 -04:00
Shaun Walker
e934a28c39 Merge pull request #770 from PoisnFang/flexible-index-page-in-custom-modules
Allows page to find Custom Index page in Module from Actions Property
2020-10-03 15:14:18 -04:00
Michael Atwood
c2ca55627e comment where index page is specifed if no action 2020-10-03 12:12:23 -07:00
Shaun Walker
4a6ffacf56 Merge pull request #54 from oqtane/master
sync
2020-10-03 14:27:02 -04:00
Shaun Walker
bc72e28d11 Merge pull request #767 from PoisnFang/fix-pane-div-default-class
add default class 'container' for div in pane to avoid content squishing
2020-10-03 14:19:16 -04:00
Michael Atwood
2a402497cf only add div on admin border 2020-10-01 16:02:14 -07:00
Shaun Walker
49985dcf9e Merge pull request #53 from oqtane/master
sync
2020-10-01 10:08:22 -04:00
Shaun Walker
666721bf1a Merge pull request #762 from hishamco/localization-support
Localization support
2020-10-01 10:06:01 -04:00
Shaun Walker
5f56bc288b Merge pull request #750 from hishamco/alert-component
Use ModuleMessage component everywhere
2020-10-01 10:05:43 -04:00
Michael Atwood
6e41cd850e allows page to find Custom Index page in Module from Actions Property 2020-09-30 22:53:41 -07:00
Michael Atwood
f70fed66ae add default class 'container' for div in pane to avoid content squishing 2020-09-30 16:22:46 -07:00
hishamco
2e2d46996a Refactoring 2020-09-30 00:07:00 +03:00
hishamco
f83c1b1741 Use invariant culture by default 2020-09-29 22:12:03 +03:00
hishamco
2924e7849f Read supported cultures from appsettings.json 2020-09-29 21:23:22 +03:00
hishamco
437170671f Support server-sider localization 2020-09-29 20:20:38 +03:00
hishamco
b52dd571ee Fix loading bug 2020-09-29 19:18:56 +03:00
hishamco
ad9146ead1 Fix stallite assemblies folder path 2020-09-29 19:14:48 +03:00
hishamco
52d1d5841e Avoid looking for en-US culture resources 2020-09-29 18:50:06 +03:00
hishamco
468327d597 Set localization RootNamespace to make it works 2020-09-29 18:29:18 +03:00
hishamco
7f28c5f2ff Add localization service to Oqtane.Client 2020-09-29 18:28:30 +03:00
hishamco
accf947afd LoadClientAssemblies adds satellite assemblies 2020-09-29 18:28:02 +03:00
hishamco
ec73c958c9 AddOqtaneParts -> AddOqtane 2020-09-29 18:03:24 +03:00
hishamco
396d584615 Dowanlod satellite assemblies to the browser 2020-09-29 18:01:57 +03:00
hishamco
edecfa10cd Load satellite assemblies on startup 2020-09-29 17:31:54 +03:00
hishamco
0796ce54a9 Add localization settings 2020-09-29 17:30:56 +03:00
hishamco
0044f031aa Set component params instead of SetModuleMessage 2020-09-23 11:29:05 +03:00
hishamco
913ad53302 Use ModuleMessage everywhere 2020-09-20 15:43:01 +03:00
hishamco
ad5f5fbc24 Replace Alert with ModuleMessage component 2020-09-20 15:10:48 +03:00
Shaun Walker
14746f47da Merge pull request #746 from mikecasas/patch-2
Update Constants.cs
2020-09-17 18:53:15 -04:00
hishamco
0d76070663 Use alert component in FileManager 2020-09-17 15:42:03 +03:00
hishamco
c01cd3b46c Add dismissible option 2020-09-17 15:41:34 +03:00
hishamco
3613ce62eb Add Alert component 2020-09-17 15:09:20 +03:00
Shaun Walker
61839d8e46 Merge pull request #748 from sbwalker/master
fixed Theme install/uninstall issue, fixed Layout inheritance issue, fixed File server performance issue, cleaned up remaining hardcoded permission strings
2020-09-16 15:25:33 -04:00
Shaun Walker
8196112a59 fixed Theme install/uninstall issue, fixed Layout inheritance issue, fixed File server performance issue, cleaned up remaining hardcoded permission strings 2020-09-16 15:24:07 -04:00
Mike Casas
465cbe3c96 Update Constants.cs
Hopefully, nothing wrong with uploading a csv file.
2020-09-16 14:18:22 -04:00
Shaun Walker
38f2fa5733 Merge pull request #735 from sbwalker/master
prepare for 1.0.4 release
2020-09-09 12:02:11 -04:00
Shaun Walker
7f15a5f464 prepare for 1.0.4 release 2020-09-09 12:01:16 -04:00
Shaun Walker
0c5d992d18 Merge pull request #52 from oqtane/master
sync
2020-09-09 11:49:45 -04:00
Shaun Walker
57dd983c1f Update README.md 2020-09-03 15:59:29 -04:00
Shaun Walker
d89927ca96 Update README.md 2020-09-02 15:20:17 -04:00
Shaun Walker
63744d9ec2 Update README.md 2020-09-02 15:17:56 -04:00
Shaun Walker
c67526b5b0 Update README.md 2020-09-01 16:44:33 -04:00
Shaun Walker
1cb6bf2a6b Merge pull request #724 from sbwalker/master
removed background color
2020-09-01 16:28:16 -04:00
Shaun Walker
ac9969c1b6 removed background color 2020-09-01 16:27:42 -04:00
Shaun Walker
510cd23d5e Update README.md 2020-09-01 16:24:27 -04:00
Shaun Walker
c94ccbff69 Merge pull request #723 from sbwalker/master
created architecture diagram
2020-09-01 16:23:21 -04:00
Shaun Walker
93d0cc5e1a created architecture diagram 2020-09-01 16:22:40 -04:00
Shaun Walker
075ea0aafd Merge pull request #51 from oqtane/master
sync
2020-08-31 10:04:27 -04:00
Shaun Walker
e75fe19103 Merge pull request #720 from sbwalker/master
add support for SVG and ICO files
2020-08-31 10:01:15 -04:00
Shaun Walker
e76f1b9663 use Label component in Module Creator templates 2020-08-31 10:00:30 -04:00
Shaun Walker
cb1c725ec1 add support for SVG and ICO files 2020-08-31 09:48:51 -04:00
Shaun Walker
98cd361fc0 Merge pull request #716 from sbwalker/master
enhanced Module Creator to allow developer to specify framework reference version so that modules can target any version including the local development environment
2020-08-29 11:30:53 -04:00
Shaun Walker
d0c8399dd9 enhanced Module Creator to allow developer to specify framework reference version so that modules can target any version including the local development environment 2020-08-29 11:30:16 -04:00
Shaun Walker
4effa8ec66 Merge pull request #715 from sbwalker/master
improved module/theme installation by saving the list of files which are in the Nuget package and using that list to remove them during uninstall
2020-08-29 10:56:26 -04:00
Shaun Walker
4065d87a74 improved module/theme installation by saving the list of files which are in the Nuget package and using that list to remove them during uninstall 2020-08-29 10:55:40 -04:00
Shaun Walker
eb9acc770c Merge pull request #714 from sbwalker/master
added support for dynamic inclusion of global resources in _host.cshtml ( ie. global stylesheets and scripts such as those required by UI component suites )
2020-08-28 11:25:38 -04:00
Shaun Walker
a8cd84e798 added support for dynamic inclusion of global resources in _host.cshtml ( ie. global stylesheets and scripts such as those required by UI component suites ) 2020-08-28 11:24:43 -04:00
Shaun Walker
74e5b83026 Merge pull request #711 from sbwalker/master
wired up JavaScript support in Module Creator templates
2020-08-27 17:17:32 -04:00
Shaun Walker
4aa0b83807 wired up JavaScript support in Module Creator templates 2020-08-27 17:16:54 -04:00
Shaun Walker
fd592e8d9f Merge pull request #707 from sbwalker/master
script file name should reflect next framework version
2020-08-26 15:25:54 -04:00
Shaun Walker
bb21eba39f script file name should reflect next major version 2020-08-26 15:24:44 -04:00
Shaun Walker
b09cb9d655 Merge pull request #50 from oqtane/master
sync
2020-08-26 15:16:28 -04:00
Shaun Walker
bbbe48b976 Merge pull request #700 from nohorse/patch-1
Create Tenant.01.00.02.02.sql
2020-08-26 15:08:35 -04:00
Shaun Walker
a036ee19a4 Merge pull request #698 from hishamco/logo
Fix logo
2020-08-26 15:02:43 -04:00
Shaun Walker
5b45c79357 Merge pull request #705 from sbwalker/master
Ensure folder does not contain files during deletion and remove directory during deletion, fix validation issue in add page which would allow a user to create a page without selecting a layout, modify action dialog to use its own CSS class name so it can be styled independently from the Admin Modal, rollback "container" CSS class assigment on panes
2020-08-26 15:01:09 -04:00
Shaun Walker
760fc3b8d4 Ensure folder does not contain files during deletion and remove directory during deletion, fix validation issue in add page which would allow a user to create a page without selecting a layout, modify action dialog to use its own CSS class name so it can be styled independently from the Admin Modal, rollback "container" CSS class assigment on panes 2020-08-26 15:00:07 -04:00
Mark Davis
fc50a45ecd Create Tenant.01.00.02.02.sql
Proposed fixed for #699
2020-08-22 14:55:43 -07:00
hishamco
e3fe8c5914 Fix logo 2020-08-22 04:19:11 +03:00
Shaun Walker
2624b9c105 Merge pull request #691 from mikecasas/plural-fix
Delete module pluralization in the location display.
2020-08-19 05:09:54 -07:00
Mike Casas
2f9f823330 Delete module pluralization in the location display. 2020-08-18 17:02:40 -04:00
Shaun Walker
6cc144d733 Merge pull request #49 from oqtane/master
sync
2020-08-18 13:38:24 -07:00
Shaun Walker
df404c12a4 Merge pull request #686 from mikecasas/master
Add project reference for dotnet publish to work without errors.
2020-08-18 13:37:36 -07:00
Shaun Walker
faec53b3c5 Merge pull request #688 from mikecasas/patch-1
Rename MenuHorizontal.Razor to MenuHorizontal.razor
2020-08-18 13:37:23 -07:00
Mike Casas
e1ec58b297 Rename MenuHorizontal.Razor to MenuHorizontal.razor 2020-08-18 09:34:26 -04:00
Jim Spillane
69abce7ce4 Merge pull request #19 from oqtane/master
sync master
2020-08-18 09:14:20 -04:00
Mike Casas
38738e0844 Add project reference for dotnet publish to work without errors. 2020-08-16 22:35:09 -04:00
Shaun Walker
abe0a1a806 Merge pull request #685 from sbwalker/master
resolved #604 - added support for renaming files and moving to a different folder. Also added support for renaming folders and moving to a different parent folder.
2020-08-16 16:03:10 -07:00
Shaun Walker
809946685a resolved #604 - added support for renaming files and moving to a different folder. Also added support for renaming folders and moving to a different parent folder. 2020-08-16 19:00:49 -04:00
Shaun Walker
20c8f1528d Merge pull request #683 from sbwalker/master
resolve #526 remove pluralization from module creation templates
2020-08-14 09:44:44 -07:00
Shaun Walker
282579fcf2 resolve #526 remove pluralization from module creation templates 2020-08-14 12:44:37 -04:00
Shaun Walker
c8e3fa88e7 Merge pull request #679 from sbwalker/master
Fix #676 - fix creation of new profile fields, add support for required and private profile fields, integrate field level help for consistency
2020-08-13 07:06:28 -07:00
Shaun Walker
aec5882de1 Fix #676 - fix creation of new profile fields, add support for required and private profile fields, integrate field level help for consistency 2020-08-13 10:06:15 -04:00
Shaun Walker
bc231b18cf Update README.md 2020-08-07 14:56:58 -04:00
1030 changed files with 81968 additions and 29734 deletions

View File

@@ -1,2 +0,0 @@
[config]
project = Oqtane.Server/Oqtane.Server.csproj

53
.editorconfig Normal file
View File

@@ -0,0 +1,53 @@
root = true
[*]
end_of_line = crlf
charset = utf-8
indent_style = space
indent_size = 4
[*.{json,csproj,props,targets}]
indent_size = 2
[*.cs]
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true : suggestion
csharp_style_var_when_type_is_apparent = true : suggestion
csharp_style_var_elsewhere = true : suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." if not necessary
dotnet_style_qualification_for_field = false : suggestion
dotnet_style_qualification_for_property = false : suggestion
dotnet_style_qualification_for_method = false : suggestion
dotnet_style_qualification_for_event = false : suggestion
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true : suggestion
dotnet_style_predefined_type_for_member_access = false : suggestion
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true : none
csharp_style_pattern_matching_over_as_with_null_check = true : none
csharp_style_inlined_variable_declaration = true : none
csharp_style_throw_expression = true : none
csharp_style_conditional_delegate_call = true : none
dotnet_style_object_initializer = true : suggestion
dotnet_style_collection_initializer = true : suggestion
dotnet_style_coalesce_expression = true : suggestion
dotnet_style_null_propagation = true : suggestion
dotnet_style_explicit_tuple_names = true : suggestion
trim_trailing_whitespace = true
insert_final_newline = true

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
Oqtane.Server/wwwroot/Modules/Templates/External/Package/*.sh eol=lf
Oqtane.Server/wwwroot/Themes/Templates/External/Package/*.sh eol=lf

View File

@@ -0,0 +1,25 @@
name: build-docker-imge
on:
- push
jobs:
build:
name: Build the docker container
runs-on: ubuntu-latest
steps:
- name: "Git clone"
run: git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git .
- name: "Git checkout"
run: git checkout "${{ gitea.sha }}"
- uses: aevea/action-kaniko@master
name: Run Kaniko to build our api docker container.
with:
image: kocoded/oqtane.framework
tag: ${{ git.workflow_sha }}
tag_with_latest: github.ref == 'refs/heads/master'
registry: git.kocoder.xyz
username: ${{ secrets.CI_RUNNER_USER }}
password: ${{ secrets.CI_RUNNER_TOKEN }}
build_file: Dockerfile
target: deploy

26
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,26 @@
---
name: Bug Report
about: Create a bug report to help us improve the product
title: "[BUG] "
labels: ''
assignees: ''
---
### Oqtane Info
Version - #.#.#
Render Mode - Static
Interactivity - Server
Database - SQL Server
### Describe the bug
### Expected Behavior
### Steps To Reproduce
### Anything else?

View File

@@ -0,0 +1,20 @@
---
name: Enhancement Request
about: 'Suggest a product enhancement '
title: "[ENH] "
labels: ''
assignees: ''
---
### Oqtane Info
Version - #.#.#
Render Mode - Static
Interactivity - Server
Database - SQL Server
### Describe the enhancement
### Anything else?

29
.gitignore vendored
View File

@@ -7,9 +7,32 @@ msbuild.binlog
.vscode/
*.binlog
*.nupkg
*.zip
*.idea
_ReSharper.Caches
.DS_Store
Oqtane.Server/appsettings.json
Oqtane.Server/Data/*.mdf
Oqtane.Server/Data/*.ldf
Oqtane.Server/Data
/Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml
Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml
Oqtane.Server/Content
Oqtane.Server/Packages
Oqtane.Server/wwwroot/Content
Oqtane.Server/wwwroot/Packages/*.log
Oqtane.Server/wwwroot/_content/*
!Oqtane.Server/wwwroot/_content/Placeholder.txt
Oqtane.Server/wwwroot/Modules/*
!Oqtane.Server/wwwroot/Modules/Oqtane.Modules.*
!Oqtane.Server/wwwroot/Modules/Templates
Oqtane.Server/wwwroot/Modules/Templates/*
!Oqtane.Server/wwwroot/Modules/Templates/External
Oqtane.Server/wwwroot/Themes/*
!Oqtane.Server/wwwroot/Themes/Oqtane.Themes.*
!Oqtane.Server/wwwroot/Themes/Templates
Oqtane.Server/wwwroot/Themes/Templates/*
Oqtane.Server/wwwroot/Themes/Templates/External

24
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,24 @@
# Contributing to Oqtane
## How to Contribute
We track all of our issues on Github. If you want to contribute, everything starts with an issue. If you don't have an issue yet, you can add one. Then a core contributor will tag it as either an enhancement [ENH] or a bug [BUG]. Tagged issues are open for contribution.
## Use GitHub-flow process
- Make a comment on the issue that you intend to work on it and read all the comments to gain a full understanding.
- Fork the repository
- Create a new branch and update your comment on the issue with a llink to the branch
- Make your changes and commit them
- Push to the branch
- Create a pull request
## Reporting Bugs
- Check if the issue has already been reported.
- Open a new issue if it hasnt been reported.
## Requesting Features
- Use the feature request template in the Issues tab.
Thank you for contributing!

24
Dockerfile Normal file
View File

@@ -0,0 +1,24 @@
# Build
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /source
COPY --link . .
RUN dotnet restore /source/Oqtane.sln
RUN dotnet build "/source/Oqtane.sln" -c Release -o /source/build/
# Publish
FROM build AS publish
RUN dotnet publish "Oqtane.Server/Oqtane.Server.csproj" -c Release -o /source/publish/
# Deploy
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS deploy
WORKDIR /app
COPY --from=publish /source/publish/ /app/
ENTRYPOINT ["dotnet", "Oqtane.Server.dll"]

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2018-2020 .NET Foundation
Copyright (c) 2018-2025 .NET Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,37 +0,0 @@
@inject IInstallationService InstallationService
@if (_initialized)
{
@if (!_installed)
{
<Installer />
}
else
{
<CascadingAuthenticationState>
<CascadingValue Value="@PageState">
<SiteRouter OnStateChange="@ChangeState" />
</CascadingValue>
</CascadingAuthenticationState>
}
}
@code {
private bool _initialized;
private bool _installed;
private PageState PageState { get; set; }
protected override async Task OnParametersSetAsync()
{
var installation = await InstallationService.IsInstalled();
_installed = installation.Success;
_initialized = true;
}
private void ChangeState(PageState pageState)
{
PageState = pageState;
StateHasChanged();
}
}

View File

@@ -0,0 +1,5 @@
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Localization;
[assembly: RootNamespace("Oqtane")]
[assembly: InternalsVisibleTo("Oqtane.Server")]

View File

@@ -0,0 +1,61 @@
using System;
namespace Microsoft.Extensions.Localization
{
public static class OqtaneLocalizationExtensions
{
/// <summary>
/// Gets the string resource for the specified key and returns the value if the resource does not exist
/// </summary>
/// <param name="localizer"></param>
/// <param name="key">the static key used to identify the string resource</param>
/// <param name="value">the default value if the resource for the static key does not exist</param>
/// <returns></returns>
public static string GetString(this IStringLocalizer localizer, string key, string value)
{
string localizedValue = localizer[key];
if (localizedValue == key && !string.IsNullOrEmpty(value)) // not localized
{
localizedValue = value;
}
return localizedValue;
}
/// <summary>
/// Creates an IStringLocalizer based on a type name. This extension method is useful in scenarios where the default IStringLocalizer is unable to locate the resources.
/// </summary>
/// <param name="localizerFactory"></param>
/// <param name="fullTypeName">the full type name ie. GetType().FullName</param>
/// <returns></returns>
public static IStringLocalizer Create(this IStringLocalizerFactory localizerFactory, string fullTypeName)
{
var typename = fullTypeName;
// handle generic types
var type = Type.GetType(fullTypeName);
if (type.IsGenericType)
{
typename = type.GetGenericTypeDefinition().FullName;
typename = typename.Substring(0, typename.IndexOf("`")); // remove generic type info
}
// format typename
if (typename.Contains(","))
{
typename = typename.Substring(0, typename.IndexOf(",")); // remove assembly info
}
// remove rootnamespace
var rootnamespace = "";
var attributes = type.Assembly.GetCustomAttributes(typeof(RootNamespaceAttribute), false);
if (attributes.Length > 0)
{
rootnamespace = ((RootNamespaceAttribute)attributes[0]).RootNamespace;
}
typename = typename.Replace(rootnamespace + ".", "");
// create IStringLocalizer using factory
return localizerFactory.Create(typename, type.Assembly.GetName().Name);
}
}
}

View File

@@ -0,0 +1,66 @@
using Microsoft.AspNetCore.Components.Authorization;
using Oqtane.Interfaces;
using Oqtane.Providers;
using Oqtane.Services;
using Oqtane.Shared;
namespace Microsoft.Extensions.DependencyInjection
{
public static class OqtaneServiceCollectionExtensions
{
public static IServiceCollection AddOqtaneAuthentication(this IServiceCollection services)
{
services.AddAuthorizationCore();
services.AddCascadingAuthenticationState();
services.AddScoped<IdentityAuthenticationStateProvider>();
services.AddScoped<AuthenticationStateProvider>(s => s.GetRequiredService<IdentityAuthenticationStateProvider>());
return services;
}
public static IServiceCollection AddOqtaneClientScopedServices(this IServiceCollection services)
{
services.AddScoped<SiteState>();
services.AddScoped<IInstallationService, InstallationService>();
services.AddScoped<IModuleDefinitionService, ModuleDefinitionService>();
services.AddScoped<IThemeService, ThemeService>();
services.AddScoped<IAliasService, AliasService>();
services.AddScoped<ITenantService, TenantService>();
services.AddScoped<ISiteService, SiteService>();
services.AddScoped<IPageService, PageService>();
services.AddScoped<IModuleService, ModuleService>();
services.AddScoped<IPageModuleService, PageModuleService>();
services.AddScoped<IUserService, UserService>();
services.AddScoped<IProfileService, ProfileService>();
services.AddScoped<IRoleService, RoleService>();
services.AddScoped<IUserRoleService, UserRoleService>();
services.AddScoped<ISettingService, SettingService>();
services.AddScoped<IPackageService, PackageService>();
services.AddScoped<ILogService, LogService>();
services.AddScoped<IJobService, JobService>();
services.AddScoped<IJobLogService, JobLogService>();
services.AddScoped<INotificationService, NotificationService>();
services.AddScoped<IFolderService, FolderService>();
services.AddScoped<IFileService, FileService>();
services.AddScoped<ISiteTemplateService, SiteTemplateService>();
services.AddScoped<ISqlService, SqlService>();
services.AddScoped<ISystemService, SystemService>();
services.AddScoped<ILocalizationService, LocalizationService>();
services.AddScoped<ILanguageService, LanguageService>();
services.AddScoped<IDatabaseService, DatabaseService>();
services.AddScoped<IUrlMappingService, UrlMappingService>();
services.AddScoped<IVisitorService, VisitorService>();
services.AddScoped<ISyncService, SyncService>();
services.AddScoped<ILocalizationCookieService, LocalizationCookieService>();
services.AddScoped<ICookieConsentService, CookieConsentService>();
services.AddScoped<IOutputCacheService, OutputCacheService>();
services.AddScoped<ITimeZoneService, TimeZoneService>();
// providers
services.AddScoped<ITextEditor, Oqtane.Modules.Controls.QuillJSTextEditor>();
services.AddScoped<ITextEditor, Oqtane.Modules.Controls.TextAreaTextEditor>();
return services;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace Oqtane
{
/// <summary>
/// Dummy class used to collect shared resource strings for this application
/// </summary>
/// <remarks>
/// This class is mostly used with IStringLocalizer and IHtmlLocalizer interfaces.
/// The class must reside at the project root.
/// </remarks>
public class IconResources
{
}
}

View File

@@ -0,0 +1,119 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
@inject IStringLocalizer<SqlServerConfig> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the database server name. This might include a port number as well if you are using a cloud service." ResourceKey="Server">Server:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="database" HelpText="Enter the name of the database" ResourceKey="Database">Database:</Label>
<div class="col-sm-9">
<input id="database" type="text" class="form-control" @bind="@_database" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="security" HelpText="Select your security method" ResourceKey="Security">Security:</Label>
<div class="col-sm-9">
<select id="security" class="form-select custom-select" @bind="@_security">
<option value="integrated" selected>@Localizer["Integrated"]</option>
<option value="custom">@Localizer["Custom"]</option>
</select>
</div>
</div>
@if (_security == "custom")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uid" HelpText="Enter the username to use for the database" ResourceKey="Uid">User Id:</Label>
<div class="col-sm-9">
<input id="uid" type="text" class="form-control" @bind="@_uid" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pwd" HelpText="Enter the password to use for the database" ResourceKey="Pwd">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="pwd" type="@_passwordType" class="form-control" @bind="@_pwd" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
</div>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="encryption" HelpText="Specify if you are using an encrypted database connection. It is highly recommended to use encryption in a production environment." ResourceKey="Encryption">Encryption:</Label>
<div class="col-sm-9">
<select id="encryption" class="form-select custom-select" @bind="@_encryption">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
@if (_encryption == "true")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="trustservercertificate" HelpText="Specify the type of certificate you are using for encryption. Verifiable is equivalent to False. Self Signed is equivalent to True." ResourceKey="TrustServerCertificate">Certificate:</Label>
<div class="col-sm-9">
<select id="encryption" class="form-select custom-select" @bind="@_trustservercertificate">
<option value="true">@Localizer["Self Signed"]</option>
<option value="false">@Localizer["Verifiable"]</option>
</select>
</div>
</div>
}
@code {
private string _server = "tcp:{SQL Server Name}.database.windows.net,1433";
private string _database = "{SQL Database Name}";
private string _security = "custom";
private string _uid = "{SQL Administrator Login}";
private string _pwd = String.Empty;
private string _passwordType = "password";
private string _togglePassword = string.Empty;
private string _encryption = "true";
private string _trustservercertificate = "false";
protected override void OnInitialized()
{
_togglePassword = SharedLocalizer["ShowPassword"];
}
public string GetConnectionString()
{
var connectionString = String.Empty;
if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database))
{
connectionString = $"Data Source={_server};Initial Catalog={_database};";
}
if (_security == "integrated")
{
connectionString += "Integrated Security=SSPI;";
}
else
{
connectionString += $"User ID={_uid};Password={_pwd};";
}
connectionString += $"Encrypt={_encryption};";
connectionString += $"TrustServerCertificate={_trustservercertificate};";
return connectionString;
}
private void TogglePassword()
{
if (_passwordType == "password")
{
_passwordType = "text";
_togglePassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordType = "password";
_togglePassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -0,0 +1,32 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the database server" ResourceKey="Server">Server:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="database" HelpText="Enter the name of the database" ResourceKey="Database">Database:</Label>
<div class="col-sm-9">
<input id="database" type="text" class="form-control" @bind="@_database" />
</div>
</div>
@code {
private string _server = "(LocalDb)\\MSSQLLocalDB";
private string _database = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm");
public string GetConnectionString()
{
var connectionString = String.Empty;
if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database))
{
connectionString = $"Data Source={_server};AttachDbFilename=|DataDirectory|\\{_database}.mdf;Initial Catalog={_database};Integrated Security=SSPI;Encrypt=false;";
}
return connectionString;
}
}

View File

@@ -0,0 +1,83 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the database server" ResourceKey="Server">Server:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="port" HelpText="Enter the port used to connect to the server" ResourceKey="Port">Port:</Label>
<div class="col-sm-9">
<input id="port" type="text" class="form-control" @bind="@_port" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="database" HelpText="Enter the name of the database" ResourceKey="Database">Database:</Label>
<div class="col-sm-9">
<input id="database" type="text" class="form-control" @bind="@_database" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uid" HelpText="Enter the username to use for the database" ResourceKey="Uid">User Id:</Label>
<div class="col-sm-9">
<input id="uid" type="text" class="form-control" @bind="@_uid" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pwd" HelpText="Enter the password to use for the database" ResourceKey="Pwd">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="pwd" type="@_passwordType" class="form-control" @bind="@_pwd" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
</div>
</div>
</div>
@code {
private string _server = "127.0.0.1";
private string _port = "3306";
private string _database = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm");
private string _uid = String.Empty;
private string _pwd = String.Empty;
private string _passwordType = "password";
private string _togglePassword = string.Empty;
protected override void OnInitialized()
{
_togglePassword = SharedLocalizer["ShowPassword"];
}
public string GetConnectionString()
{
var connectionString = String.Empty;
if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database) && !String.IsNullOrEmpty(_uid) && !String.IsNullOrEmpty(_pwd))
{
connectionString = $"Server={_server};Database={_database};Uid={_uid};Pwd={_pwd};";
}
if (!String.IsNullOrEmpty(_port))
{
connectionString += $"Port={_port};";
}
return connectionString;
}
private void TogglePassword()
{
if (_passwordType == "password")
{
_passwordType = "text";
_togglePassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordType = "password";
_togglePassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -0,0 +1,108 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
@inject IStringLocalizer<PostgreSQLConfig> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the database server" ResourceKey="Server">Server:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="port" HelpText="Enter the port used to connect to the server" ResourceKey="Port">Port:</Label>
<div class="col-sm-9">
<input id="port" type="text" class="form-control" @bind="@_port" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="database" HelpText="Enter the name of the database" ResourceKey="Database">Database:</Label>
<div class="col-sm-9">
<input id="database" type="text" class="form-control" @bind="@_database" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="security" HelpText="Select your security method" ResourceKey="Security">Security:</Label>
<div class="col-sm-9">
<select id="security" class="form-select custom-select" @bind="@_security">
<option value="integrated" selected>@Localizer["Integrated"]</option>
<option value="custom">@Localizer["Custom"]</option>
</select>
</div>
</div>
@if (_security == "custom")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uid" HelpText="Enter the username to use for the database" ResourceKey="Uid">User Id:</Label>
<div class="col-sm-9">
<input id="uid" type="text" class="form-control" @bind="@_uid" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pwd" HelpText="Enter the password to use for the database" ResourceKey="Pwd">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="pwd" type="@_passwordType" class="form-control" @bind="@_pwd" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
</div>
</div>
</div>
}
@code {
private string _server = "127.0.0.1";
private string _port = "5432";
private string _database = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm");
private string _security = "integrated";
private string _uid = String.Empty;
private string _pwd = String.Empty;
private string _passwordType = "password";
private string _togglePassword = string.Empty;
protected override void OnInitialized()
{
_togglePassword = SharedLocalizer["ShowPassword"];
}
public string GetConnectionString()
{
var connectionString = String.Empty;
if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database) && !String.IsNullOrEmpty(_port))
{
connectionString = $"Server={_server};Port={_port};Database={_database};";
}
if (_security == "integrated")
{
connectionString += "Integrated Security=true;";
}
else
{
if (!String.IsNullOrEmpty(_uid) && !String.IsNullOrEmpty(_pwd))
{
connectionString += $"User ID={_uid};Password={_pwd};";
}
else
{
connectionString = String.Empty;
}
}
return connectionString;
}
private void TogglePassword()
{
if (_passwordType == "password")
{
_passwordType = "text";
_togglePassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordType = "password";
_togglePassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -0,0 +1,119 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
@inject IStringLocalizer<SqlServerConfig> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the database server name. This might include a port number as well if you are using a cloud service." ResourceKey="Server">Server:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="database" HelpText="Enter the name of the database" ResourceKey="Database">Database:</Label>
<div class="col-sm-9">
<input id="database" type="text" class="form-control" @bind="@_database" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="security" HelpText="Select your security method" ResourceKey="Security">Security:</Label>
<div class="col-sm-9">
<select id="security" class="form-select custom-select" @bind="@_security">
<option value="integrated" selected>@Localizer["Integrated"]</option>
<option value="custom">@Localizer["Custom"]</option>
</select>
</div>
</div>
@if (_security == "custom")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uid" HelpText="Enter the username to use for the database" ResourceKey="Uid">User Id:</Label>
<div class="col-sm-9">
<input id="uid" type="text" class="form-control" @bind="@_uid" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pwd" HelpText="Enter the password to use for the database" ResourceKey="Pwd">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="pwd" type="@_passwordType" class="form-control" @bind="@_pwd" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
</div>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="encryption" HelpText="Specify if you are using an encrypted database connection. It is highly recommended to use encryption in a production environment." ResourceKey="Encryption">Encryption:</Label>
<div class="col-sm-9">
<select id="encryption" class="form-select custom-select" @bind="@_encryption">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
@if (_encryption == "true")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="trustservercertificate" HelpText="Specify the type of certificate you are using for encryption. Verifiable is equivalent to False. Self Signed is equivalent to True." ResourceKey="TrustServerCertificate">Certificate:</Label>
<div class="col-sm-9">
<select id="encryption" class="form-select custom-select" @bind="@_trustservercertificate">
<option value="true">@Localizer["Self Signed"]</option>
<option value="false">@Localizer["Verifiable"]</option>
</select>
</div>
</div>
}
@code {
private string _server = String.Empty;
private string _database = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm");
private string _security = "integrated";
private string _uid = String.Empty;
private string _pwd = String.Empty;
private string _passwordType = "password";
private string _togglePassword = string.Empty;
private string _encryption = "false";
private string _trustservercertificate = "false";
protected override void OnInitialized()
{
_togglePassword = SharedLocalizer["ShowPassword"];
}
public string GetConnectionString()
{
var connectionString = String.Empty;
if (!String.IsNullOrEmpty(_server) && !String.IsNullOrEmpty(_database))
{
connectionString = $"Data Source={_server};Initial Catalog={_database};";
}
if (_security == "integrated")
{
connectionString += "Integrated Security=SSPI;";
}
else
{
connectionString += $"User ID={_uid};Password={_pwd};";
}
connectionString += $"Encrypt={_encryption};";
connectionString += $"TrustServerCertificate={_trustservercertificate};";
return connectionString;
}
private void TogglePassword()
{
if (_passwordType == "password")
{
_passwordType = "text";
_togglePassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordType = "password";
_togglePassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -0,0 +1,25 @@
@namespace Oqtane.Installer.Controls
@implements Oqtane.Interfaces.IDatabaseConfigControl
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="Enter the file name to use for the database" ResourceKey="Server">File Name:</Label>
<div class="col-sm-9">
<input id="server" type="text" class="form-control" @bind="@_server" />
</div>
</div>
@code {
private string _server = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm") + ".db";
public string GetConnectionString()
{
var connectionstring = String.Empty;
if (!String.IsNullOrEmpty(_server))
{
connectionstring = $"Data Source={_server};";
}
return connectionstring;
}
}

View File

@@ -0,0 +1,340 @@
@namespace Oqtane.Installer
@using Oqtane.Interfaces
@inject NavigationManager NavigationManager
@inject IInstallationService InstallationService
@inject ISiteService SiteService
@inject IUserService UserService
@inject IDatabaseService DatabaseService
@inject ISiteTemplateService SiteTemplateService
@inject IJSRuntime JSRuntime
@inject IStringLocalizer<Installer> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject SiteState SiteState
<div class="container">
<div class="row">
<div class="mx-auto text-center">
<img src="oqtane-black.png" />
<div style="font-weight: bold">@SharedLocalizer["Version"] @Constants.Version (.NET @Environment.Version.Major)</div>
</div>
</div>
<hr class="app-rule" />
<div class="row justify-content-center">
<div class="col text-center">
<h2>@Localizer["DatabaseConfig"]</h2><br />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="databasetype" HelpText="Select the type of database you wish to use" ResourceKey="DatabaseType">Database:</Label>
<div class="col-sm-9">
@if (_databases != null)
{
<div class="input-group">
<select id="databaseType" class="form-select" value="@_databaseName" @onchange="(e => DatabaseChanged(e))" required>
@foreach (var database in _databases)
{
<option value="@database.Name">@Localizer[@database.Name]</option>
}
</select>
@if (!_showConnectionString)
{
<button type="button" class="btn btn-secondary" @onclick="ToggleConnectionString">@Localizer["EnterConnectionString"]</button>
}
else
{
<button type="button" class="btn btn-secondary" @onclick="ToggleConnectionString">@Localizer["EnterConnectionParameters"]</button>
}
</div>
}
</div>
</div>
@if (!_showConnectionString)
{
if (_databaseConfigType != null)
{
@DatabaseConfigComponent
}
}
else
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="connectionstring" HelpText="Enter a complete connection string including all parameters and delimiters" ResourceKey="ConnectionString">Settings:</Label>
<div class="col-sm-9">
<textarea id="connectionstring" class="form-control" @bind="@_connectionString" rows="3"></textarea>
</div>
</div>
}
</div>
</div>
<div class="col text-center">
<h2>@Localizer["ApplicationAdmin"]</h2><br />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="Provide a username for the primary user account" ResourceKey="Username">Username:</Label>
<div class="col-sm-9">
<input id="username" type="text" class="form-control" maxlength="256" @bind="@_hostUsername" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="password" HelpText="Provide a password for the primary user account" ResourceKey="Password">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="password" type="@_passwordType" class="form-control" maxlength="256" @bind="@_hostPassword" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirm" HelpText="Please confirm the password entered above by entering it again" ResourceKey="Confirm">Confirm:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="confirm" type="@_confirmPasswordType" class="form-control" maxlength="256" @bind="@_confirmPassword" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@ToggleConfirmPassword" tabindex="-1">@_toggleConfirmPassword</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="email" HelpText="Provide the email address for the host user account" ResourceKey="Email">Email:</Label>
<div class="col-sm-9">
<input type="text" class="form-control" maxlength="256" @bind="@_hostEmail" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Provide the full name of the host user" ResourceKey="Name">Full Name:</Label>
<div class="col-sm-9">
<input type="text" class="form-control" maxlength="50" @bind="@_hostName" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="template" HelpText="Select a site template" ResourceKey="Template">Template:</Label>
<div class="col-sm-9">
@if (_templates != null)
{
<select id="template" class="form-select" @bind="@_template" required>
@foreach (var template in _templates)
{
<option value="@template.TypeName">@template.Name</option>
}
</select>
}
</div>
</div>
</div>
</div>
</div>
<hr class="app-rule" />
<div class="row">
<div class="mx-auto text-center">
<button type="button" class="btn btn-success" @onclick="Install">@Localizer["InstallNow"]</button><br /><br />
@if (!string.IsNullOrEmpty(_message))
{
<div class="alert alert-danger alert-dismissible fade show mb-3" role="alert">
@((MarkupString)_message)
<button type="button" class="btn-close" aria-label="Close" @onclick="DismissModal"></button>
</div>
}
</div>
<div class="app-progress-indicator" style="@_loadingDisplay"></div>
</div>
<div class="row">
<div class="mx-auto text-center">
<input type="checkbox" @bind="@_register" /> @Localizer["Register"]
</div>
</div>
</div>
@code {
private List<Database> _databases;
private string _databaseName;
private Type _databaseConfigType;
private object _databaseConfig;
private RenderFragment DatabaseConfigComponent { get; set; }
private bool _showConnectionString = false;
private string _connectionString = string.Empty;
private string _hostUsername = string.Empty;
private string _hostPassword = string.Empty;
private string _passwordType = "password";
private string _confirmPasswordType = "password";
private string _togglePassword = string.Empty;
private string _toggleConfirmPassword = string.Empty;
private string _confirmPassword = string.Empty;
private string _hostEmail = string.Empty;
private string _hostName = string.Empty;
private List<SiteTemplate> _templates;
private string _template = Constants.DefaultSiteTemplate;
private bool _register = true;
private string _message = string.Empty;
private string _loadingDisplay = "display: none;";
protected override async Task OnInitializedAsync()
{
// include CSS
var content = $"<link rel=\"stylesheet\" href=\"{Constants.BootstrapStylesheetUrl}\" integrity=\"{Constants.BootstrapStylesheetIntegrity}\" crossorigin=\"anonymous\" type=\"text/css\"/>";
SiteState.AppendHeadContent(content);
_togglePassword = SharedLocalizer["ShowPassword"];
_toggleConfirmPassword = SharedLocalizer["ShowPassword"];
_databases = await DatabaseService.GetDatabasesAsync();
if (_databases.Exists(item => item.IsDefault))
{
_databaseName = _databases.Find(item => item.IsDefault).Name;
}
else
{
_databaseName = "LocalDB";
}
LoadDatabaseConfigComponent();
_templates = await SiteTemplateService.GetSiteTemplatesAsync();
}
private void DatabaseChanged(ChangeEventArgs eventArgs)
{
try
{
_databaseName = (string)eventArgs.Value;
_showConnectionString = false;
LoadDatabaseConfigComponent();
}
catch
{
_message = Localizer["Error.DbConfig.Load"];
}
}
private void LoadDatabaseConfigComponent()
{
var database = _databases.SingleOrDefault(d => d.Name == _databaseName);
if (database != null)
{
_databaseConfigType = Type.GetType(database.ControlType);
DatabaseConfigComponent = builder =>
{
builder.OpenComponent(0, _databaseConfigType);
builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); });
builder.CloseComponent();
};
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
// include JavaScript
var interop = new Interop(JSRuntime);
await interop.IncludeScript("", Constants.BootstrapScriptUrl, Constants.BootstrapScriptIntegrity, "anonymous", "", "head");
}
}
private async Task Install()
{
var connectionString = String.Empty;
if (_showConnectionString)
{
connectionString = _connectionString;
}
else
{
if (_databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
connectionString = databaseConfigControl.GetConnectionString();
}
}
if (connectionString != "" && !string.IsNullOrEmpty(_hostUsername) && !string.IsNullOrEmpty(_hostPassword) && _hostPassword == _confirmPassword && !string.IsNullOrEmpty(_hostEmail) && _hostEmail.Contains("@") && !string.IsNullOrEmpty(_hostName))
{
var result = await UserService.ValidateUserAsync(_hostUsername, _hostEmail, _hostPassword);
if (result.Succeeded)
{
_loadingDisplay = "";
StateHasChanged();
Uri uri = new Uri(NavigationManager.Uri);
var database = _databases.SingleOrDefault(d => d.Name == _databaseName);
var config = new InstallConfig
{
DatabaseType = database.DBType,
ConnectionString = connectionString,
Aliases = uri.Authority,
HostUsername = _hostUsername,
HostPassword = _hostPassword,
HostEmail = _hostEmail,
HostName = _hostName,
TenantName = TenantNames.Master,
IsNewTenant = true,
SiteName = Constants.DefaultSite,
Register = _register,
SiteTemplate = _template,
RenderMode = RenderModes.Static,
Runtime = Runtimes.Server
};
var installation = await InstallationService.Install(config);
if (installation.Success)
{
NavigationManager.NavigateTo(uri.Scheme + "://" + uri.Authority, true);
}
else
{
_message = installation.Message;
_loadingDisplay = "display: none;";
}
}
else
{
_message = string.Join("<br />", result.Errors.Select(i => !string.IsNullOrEmpty(i.Value) ? i.Value : Localizer[i.Key]));
}
}
else
{
_message = Localizer["Message.Require.DbInfo"];
}
}
private void TogglePassword()
{
if (_passwordType == "password")
{
_passwordType = "text";
_togglePassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordType = "password";
_togglePassword = SharedLocalizer["ShowPassword"];
}
}
private void ToggleConfirmPassword()
{
if (_confirmPasswordType == "password")
{
_confirmPasswordType = "text";
_toggleConfirmPassword = SharedLocalizer["HidePassword"];
}
else
{
_confirmPasswordType = "password";
_toggleConfirmPassword = SharedLocalizer["ShowPassword"];
}
}
private void ToggleConnectionString()
{
if (_databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
_connectionString = databaseConfigControl.GetConnectionString();
}
_showConnectionString = !_showConnectionString;
}
private void DismissModal()
{
_message = "";
StateHasChanged();
}
}

View File

@@ -1,31 +1,40 @@
@namespace Oqtane.Modules.Admin.Dashboard
@namespace Oqtane.Modules.Admin.Dashboard
@inherits ModuleBase
@inject IPageService PageService
@inject IUserService UserService
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="row">
@if (_pages != null)
{
<div class="row">
@foreach (var p in _pages)
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions))
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList))
{
string url = NavigateUrl(p.Path);
<div class="col-md-2 mx-auto text-center">
<NavLink class="nav-link" href="@url" Match="NavLinkMatch.All">
<h2><span class="oi oi-@p.Icon" aria-hidden="true"></span></h2>@p.Name
<div class="col-md-2 mx-auto text-center my-3">
<NavLink class="nav-link text-body" href="@url" Match="NavLinkMatch.All">
<h2><span class="@p.Icon" aria-hidden="true"></span></h2>
<div class="lead">@((MarkupString)SharedLocalizer[p.Name].ToString().Replace(" ", "<br />"))</div>
</NavLink>
</div>
}
}
</div>
</div>
}
@code {
private List<Page> _pages;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
public override string RenderMode => RenderModes.Static;
protected override void OnInitialized()
{
var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin");
_pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId).ToList();
if (admin != null)
{
_pages = PageState.Pages.Where(item => item.ParentId == admin.PageId).ToList();
}
}
}

View File

@@ -1,6 +1,7 @@
@namespace Oqtane.Modules.Admin.Error
@namespace Oqtane.Modules.Admin.Error
@inherits ModuleBase
@inject IModuleService ModuleService
@inject IStringLocalizer<Index> Localizer
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;
@@ -8,10 +9,9 @@
protected override async Task OnInitializedAsync()
{
Module module = await ModuleService.GetModuleAsync(ModuleState.ModuleId);
if (UserSecurity.IsAuthorized(PageState.User, Constants.HostRole))
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
string message = "A Problem Was Encountered Loading Module " + module.ModuleDefinitionName;
AddModuleMessage(message, MessageType.Error);
AddModuleMessage(string.Format(Localizer["Error.Module.Load"], module.ModuleDefinitionName), MessageType.Error);
}
await logger.LogCritical("Error Loading Module {Module}", module);

View File

@@ -1,61 +1,69 @@
@namespace Oqtane.Modules.Admin.Files
@namespace Oqtane.Modules.Admin.Files
@using System.IO
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IFileService FileService
@inject IFolderService FolderService
@inject ISettingService SettingService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Upload" Heading="Upload Files">
<table class="table table-borderless">
<tr>
<td>
<Label For="upload" HelpText="Upload the file you want">Upload: </Label>
</td>
<td>
<FileManager UploadMultiple="true" ShowFiles="false" FolderId="@_folderId" />
</td>
</tr>
</table>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<TabPanel Name="Upload" Heading="Upload Files" ResourceKey="UploadFiles">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="upload" HelpText="Upload the file you want" ResourceKey="Upload">Upload: </Label>
<div class="col-sm-9">
<FileManager UploadMultiple="true" ShowFiles="false" FolderId="@_folderId" ShowSuccess="true" />
</div>
</div>
</div>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</TabPanel>
<TabPanel Name="Download" Heading="Download Files">
<TabPanel Name="Download" Heading="Download Files" ResourceKey="DownloadFiles">
@if (_folders != null)
{
<table class="table table-borderless">
<tr>
<td>
<Label For="url" HelpText="Enter the url of the file you wish to download">Url: </Label>
</td>
<td>
<input id="url" class="form-control" @bind="@url" />
</td>
</tr>
<tr>
<td>
<Label For="folder" HelpText="Select the folder to save the file in">Folder: </Label>
</td>
<td>
<select id="folder" class="form-control" @bind="@_folderId">
<option value="-1">&lt;Select Folder&gt;</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="Enter the url of the file you wish to download" ResourceKey="Url">Url: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="folder" HelpText="Select the folder to save the file in" ResourceKey="Folder">Folder: </Label>
<div class="col-sm-9">
<select id="folder" class="form-select" @bind="@_folderId" required>
<option value="-1">&lt;@Localizer["Folder.Select"]&gt;</option>
@foreach (Folder folder in _folders)
{
<option value="@(folder.FolderId)">@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
</select>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="Download">Download</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the name of the file being downloaded" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" />
</div>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="Download">@SharedLocalizer["Download"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</form>
}
</TabPanel>
</TabStrip>
@code {
private string url = string.Empty;
private ElementReference form;
private bool validated = false;
private string _url = string.Empty;
private List<Folder> _folders;
private int _folderId = -1;
private string _name = "";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
@@ -71,37 +79,49 @@
private async Task Download()
{
if (url == string.Empty || _folderId == -1)
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
AddModuleMessage("You Must Enter A Url And Select A Folder", MessageType.Warning);
if (_url == string.Empty || _folderId == -1)
{
AddModuleMessage(Localizer["Message.Required.UrlFolder"], MessageType.Warning);
return;
}
var filename = url.Substring(url.LastIndexOf("/", StringComparison.Ordinal) + 1);
if (!Constants.UploadableFiles.Split(',')
.Contains(Path.GetExtension(filename).ToLower().Replace(".", "")))
if (string.IsNullOrEmpty(_name))
{
AddModuleMessage("File Could Not Be Downloaded From Url Due To Its File Extension", MessageType.Warning);
return ;
_name = _url.Substring(_url.LastIndexOf("/", StringComparison.Ordinal) + 1);
}
if (!filename.IsPathOrFileValid())
if (!PageState.Site.UploadableFiles.Split(',').Contains(Path.GetExtension(_name).ToLower().Replace(".", "")))
{
AddModuleMessage("You Must Enter A Url With A Valid File Name", MessageType.Warning);
AddModuleMessage(Localizer["Message.Download.InvalidExtension"], MessageType.Warning);
return;
}
if (!_name.IsPathOrFileValid())
{
AddModuleMessage(Localizer["Message.Required.UrlName"], MessageType.Warning);
return;
}
try
{
await FileService.UploadFileAsync(url, _folderId);
await logger.LogInformation("File Downloaded Successfully From Url {Url}", url);
AddModuleMessage("File Downloaded Successfully From Url", MessageType.Success);
await FileService.UploadFileAsync(_url, _folderId, _name);
await logger.LogInformation("File Downloaded Successfully From Url {Url}", _url);
AddModuleMessage(Localizer["Success.Download.File"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading File From Url {Url} {Error}", url, ex.Message);
AddModuleMessage("Error Downloading File From Url. Please Verify That The Url Is Valid.", MessageType.Error);
await logger.LogError(ex, "Error Downloading File From Url {Url} {Error}", _url, ex.Message);
AddModuleMessage(Localizer["Error.Download.InvalidUrl"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -0,0 +1,147 @@
@namespace Oqtane.Modules.Admin.Files
@inherits ModuleBase
@inject IFileService FileService
@inject IFolderService FolderService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Details> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_folders != null)
{
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="The name of the file" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="50" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="parent" HelpText="The folder where the file is located" ResourceKey="Folder">Folder: </Label>
<div class="col-sm-9">
<select id="parent" class="form-select" @bind="@_folderId" required>
@foreach (Folder folder in _folders)
{
<option value="@(folder.FolderId)">@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="A description of the file. This can be used as a caption for image files." ResourceKey="Description">Description: </Label>
<div class="col-sm-9">
<input id="description" class="form-control" @bind="@_description" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="size" HelpText="The size of the file (in bytes)" ResourceKey="Size">Size: </Label>
<div class="col-sm-9">
<input id="size" class="form-control" @bind="@_size" readonly />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveFile">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@if (_name.ToLower().EndsWith(".zip"))
{
<button type="button" class="btn btn-primary mx-1" @onclick="UnzipFile">Unzip</button>
}
<br /><br />
<AuditInfo CreatedBy="@_createdBy" CreatedOn="@_createdOn" ModifiedBy="@_modifiedBy" ModifiedOn="@_modifiedOn"></AuditInfo>
</form>
}
@code {
private ElementReference form;
private bool validated = false;
private int _fileId = -1;
private string _name;
private List<Folder> _folders;
private int _folderId = -1;
private string _description = string.Empty;
private int _size;
private string _createdBy;
private DateTime _createdOn;
private string _modifiedBy;
private DateTime _modifiedOn;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override string Title => "File Management";
protected override async Task OnInitializedAsync()
{
try
{
_folders = await FolderService.GetFoldersAsync(PageState.Site.SiteId);
_fileId = Int32.Parse(PageState.QueryString["id"]);
File file = await FileService.GetFileAsync(_fileId);
if (file != null)
{
_name = file.Name;
_folderId = file.FolderId;
_description = file.Description;
_size = file.Size;
_createdBy = file.CreatedBy;
_createdOn = file.CreatedOn;
_modifiedBy = file.ModifiedBy;
_modifiedOn = file.ModifiedOn;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading File {FileId} {Error}", _fileId, ex.Message);
AddModuleMessage(Localizer["Error.File.Load"], MessageType.Error);
}
}
private async Task SaveFile()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
if (_name.IsPathOrFileValid())
{
File file = await FileService.GetFileAsync(_fileId);
file.Name = _name;
file.FolderId = _folderId;
file.Description = _description;
file = await FileService.UpdateFileAsync(file);
await logger.LogInformation("File Saved {File}", file);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage(Localizer["Message.File.InvalidName"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving File {FileId} {Error}", _fileId, ex.Message);
AddModuleMessage(Localizer["Error.File.Save"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private async Task UnzipFile()
{
try
{
await FileService.UnzipFileAsync(_fileId);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Unzipping File {FileId} {Error}", _fileId, ex.Message);
AddModuleMessage(Localizer["Error.File.Unzip"], MessageType.Error);
}
}
}

View File

@@ -1,67 +1,128 @@
@namespace Oqtane.Modules.Admin.Files
@namespace Oqtane.Modules.Admin.Files
@inherits ModuleBase
@inject IFolderService FolderService
@inject IFileService FileService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_folders != null)
{
<table class="table table-borderless">
<tr>
<td>
<Label For="parent" HelpText="Select the parent folder">Parent: </Label>
</td>
<td>
<select id="parent" class="form-control" @bind="@_parentId">
@if (PageState.QueryString.ContainsKey("id"))
<TabStrip>
<TabPanel Name="Settings" ResourceKey="Settings" Heading="Settings">
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="parent" HelpText="Select the parent folder" ResourceKey="Parent">Parent: </Label>
<div class="col-sm-9">
@if (_parentId == -1)
{
<option value="-1">&lt;No Parent&gt;</option>
<select id="parent" class="form-select" @bind="@_parentId" required>
<option value="-1">&lt;@Localizer["NoParent"]&gt;</option>
</select>
}
else
{
<select id="parent" class="form-select" @bind="@_parentId" required>
@foreach (Folder folder in _folders)
{
<option value="@(folder.FolderId)">@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label for="name" HelpText="Enter the folder name">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<Label For="permissions" HelpText="Select the permissions you want for the folder">Permissions: </Label>
<PermissionGrid EntityName="@EntityNames.Folder" PermissionNames="Browse,View,Edit" Permissions="@_permissions" @ref="_permissionGrid" />
</td>
</tr>
</table>
@if (!_isSystem)
{
<button type="button" class="btn btn-success" @onclick="SaveFolder">Save</button>
}
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@if (!_isSystem && PageState.QueryString.ContainsKey("id"))
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the folder name" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
@if (_isSystem)
{
<button type="button" class="btn btn-danger" @onclick="DeleteFolder">Delete</button>
<input id="name" class="form-control" @bind="@_name" readonly />
}
<br />
<br />
else
{
<input id="name" class="form-control" @bind="@_name" maxlength="256" required />
}
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="type" HelpText="Select the folder type. Private folders are only accessible by authorized users. Public folders can be accessed by all users" ResourceKey="Type">Type: </Label>
<div class="col-sm-9">
@if (PageState.QueryString.ContainsKey("id"))
{
<input id="type" class="form-control" readonly @bind="@_type" />
}
else
{
<select id="type" class="form-select" @bind="@_type" required>
<option value="@FolderTypes.Private">@Localizer[FolderTypes.Private]</option>
<option value="@FolderTypes.Public">@Localizer[FolderTypes.Public]</option>
</select>
}
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="capacity" HelpText="Enter the maximum folder capacity (in megabytes). Specify zero if the capacity is unlimited." ResourceKey="Capacity">Capacity: </Label>
<div class="col-sm-9">
<input id="capacity" class="form-control" @bind="@_capacity" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="cachecontrol" HelpText="Optionally provide a Cache-Control directive for this folder. For example 'public, max-age=60' indicates that files in this folder should be cached for 60 seconds. Please note that when caching is enabled, changes to files will not be immediately reflected in the UI." ResourceKey="CacheControl">Caching: </Label>
<div class="col-sm-9">
<input id="cachecontrol" class="form-control" @bind="@_cachecontrol" maxlength="50" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="imagesizes" HelpText="Optionally enter a list of image sizes which can be generated dynamically from uploaded images (ie. 200x200,400x400). Use * to indicate the folder supports all image sizes (not recommended)." ResourceKey="ImageSizes">Image Sizes: </Label>
<div class="col-sm-9">
<input id="imagesizes" class="form-control" @bind="@_imagesizes" maxlength="512" />
</div>
</div>
</div>
@if (PageState.QueryString.ContainsKey("id"))
{
<br />
<AuditInfo CreatedBy="@_createdBy" CreatedOn="@_createdOn" ModifiedBy="@_modifiedBy" ModifiedOn="@_modifiedOn"></AuditInfo>
}
</form>
</TabPanel>
<TabPanel Name="Permissions" ResourceKey="Permissions" Heading="Permissions">
<div class="container">
<div class="row mb-1 align-items-center">
<PermissionGrid EntityName="@EntityNames.Folder" PermissionNames="@(PermissionNames.Browse + "," + PermissionNames.View + "," + PermissionNames.Edit)" PermissionList="@_permissions" @ref="_permissionGrid" />
</div>
</div>
</TabPanel>
</TabStrip>
<br />
@if (!_isSystem)
{
<button type="button" class="btn btn-success" @onclick="SaveFolder">@SharedLocalizer["Save"]</button>
@((MarkupString)"&nbsp;")
}
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@if (!_isSystem && PageState.QueryString.ContainsKey("id"))
{
@((MarkupString)"&nbsp;")
<ActionDialog Header="Delete Folder" Message="Are You Sure You Wish To Delete This Folder?" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteFolder())" ResourceKey="DeleteFolder" />
}
}
@code {
private ElementReference form;
private bool validated = false;
private List<Folder> _folders;
private int _folderId = -1;
private string _name;
private int _parentId = -1;
private string _name;
private string _type = FolderTypes.Private;
private string _capacity = "0";
private string _cachecontrol = string.Empty;
private string _imagesizes = string.Empty;
private bool _isSystem;
private string _permissions = string.Empty;
private List<Permission> _permissions = null;
private string _createdBy;
private DateTime _createdOn;
private string _modifiedBy;
@@ -89,8 +150,12 @@
{
_parentId = folder.ParentId ?? -1;
_name = folder.Name;
_type = folder.Type;
_capacity = folder.Capacity.ToString();
_cachecontrol = folder.CacheControl;
_imagesizes = folder.ImageSizes;
_isSystem = folder.IsSystem;
_permissions = folder.Permissions;
_permissions = folder.PermissionList;
_createdBy = folder.CreatedBy;
_createdOn = folder.CreatedOn;
_modifiedBy = folder.ModifiedBy;
@@ -100,33 +165,37 @@
else
{
_parentId = _folders[0].FolderId;
_permissions = string.Empty;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Folder {FolderId} {Error}", _folderId, ex.Message);
AddModuleMessage("Error Loading Folder", MessageType.Error);
AddModuleMessage(Localizer["Error.Folder.Load"], MessageType.Error);
}
}
private async Task SaveFolder()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (_name == string.Empty || _parentId == -1)
{
AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.FolderParent"], MessageType.Warning);
return;
}
if (!_name.IsPathOrFileValid())
{
AddModuleMessage("Folder Name Not Valid.", MessageType.Warning);
AddModuleMessage(Localizer["Message.Folder.InvalidName"], MessageType.Warning);
return;
}
try
{
Folder folder;
if (_folderId != -1)
{
folder = await FolderService.GetFolderAsync(_folderId);
@@ -136,8 +205,6 @@
folder = new Folder();
}
folder.SiteId = PageState.Site.SiteId;
if (_parentId == -1)
{
folder.ParentId = null;
@@ -147,9 +214,21 @@
folder.ParentId = _parentId;
}
// check for duplicate folder names
if (_folders.Any(item => item.ParentId == folder.ParentId && item.Name == _name && item.FolderId != _folderId))
{
AddModuleMessage(Localizer["Message.Folder.Duplicate"], MessageType.Warning);
return;
}
folder.SiteId = PageState.Site.SiteId;
folder.Name = _name;
folder.Type = _type;
folder.Capacity = int.Parse(_capacity);
folder.CacheControl = _cachecontrol;
folder.ImageSizes = _imagesizes;
folder.IsSystem = _isSystem;
folder.Permissions = _permissionGrid.GetPermissions();
folder.PermissionList = _permissionGrid.GetPermissionList();
if (_folderId != -1)
{
@@ -162,34 +241,54 @@
if (folder != null)
{
await FolderService.UpdateFolderOrderAsync(folder.SiteId, folder.FolderId, folder.ParentId);
await logger.LogInformation("Folder Saved {Folder}", folder);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error);
AddModuleMessage(Localizer["Error.Folder.Save"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Folder {FolderId} {Error}", _folderId, ex.Message);
AddModuleMessage("Error Saving Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Folder.Save"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private async Task DeleteFolder()
{
try
{
bool isparent = false;
foreach (Folder folder in _folders)
{
if (folder.ParentId == _folderId)
{
isparent = true;
break;
}
}
if (!isparent)
{
await FolderService.DeleteFolderAsync(_folderId);
await logger.LogInformation("Folder Deleted {Folder}", _folderId);
AddModuleMessage("Folder Deleted", MessageType.Success);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage(Localizer["Message.Folder.Subfolders.InvalidDelete"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Folder {Folder} {Error}", _folderId, ex.Message);
AddModuleMessage("Error Deleting Folder", MessageType.Error);
AddModuleMessage(Localizer["Error.Folder.Delete"], MessageType.Error);
}
}
}

View File

@@ -1,51 +1,94 @@
@namespace Oqtane.Modules.Admin.Files
@namespace Oqtane.Modules.Admin.Files
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IFolderService FolderService
@inject IFileService FileService
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_files != null)
@if (_files == null)
{
<table class="table table-borderless">
<tr>
<td>
<label class="control-label">Folder: </label>
</td>
<td>
<select class="form-control" @onchange="(e => FolderChanged(e))">
<p>
<em>@SharedLocalizer["Loading"]</em>
</p>
}
else
{
<TabStrip>
<TabPanel Name="Files" Heading="Files" ResourceKey="Files">
<div class="row">
<div class="col-md mb-1">
<ActionLink Action="Edit" Text="Add Folder" Class="btn btn-secondary" ResourceKey="AddFolder" />
</div>
<div class="col-md-8 mb-1">
<div class="input-group">
<span class="input-group-text">@Localizer["Folder"]:</span>
<select class="form-select" @onchange="(e => FolderChanged(e))">
@foreach (Folder folder in _folders)
{
<option value="@(folder.FolderId)">@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
</select>
</td>
<td>
<ActionLink Action="Edit" Text="Edit Folder" Class="btn btn-secondary" Parameters="@($"id=" + _folderId.ToString())" />&nbsp;
<ActionLink Action="Edit" Text="Add Folder" Class="btn btn-secondary" />&nbsp;
<ActionLink Action="Add" Text="Upload Files" Parameters="@($"id=" + _folderId.ToString())" />
</td>
</tr>
</table>
<Pager Items="@_files">
<ActionLink Action="Edit" Text="Edit Folder" Class="btn btn-secondary" Parameters="@($"id=" + _folderId.ToString())" ResourceKey="EditFolder" />&nbsp;
</div>
</div>
<div class="col-md mb-1 text-end">
<ActionLink Action="Add" Text="Upload Files" Parameters="@($"id=" + _folderId.ToString())" ResourceKey="UploadFiles" />
</div>
</div>
@if (_files.Count != 0)
{
<Pager Items="@_files" SearchProperties="Name">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>Modified</th>
<th>Type</th>
<th>Size</th>
<th style="width: 1px;">&nbsp;</th>
<th>@SharedLocalizer["Name"]</th>
<th>@Localizer["Modified"]</th>
<th>@Localizer["Type"]</th>
<th>@Localizer["Size"]</th>
</Header>
<Row>
<td><ActionDialog Header="Delete File" Message="@("Are You Sure You Wish To Delete " + context.Name + "?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteFile(context))" /></td>
<td><a href="@(ContentUrl(context.FileId))" target="_new">@context.Name</a></td>
<td>@context.ModifiedOn</td>
<td>@context.Extension.ToUpper() File</td>
<td>@(context.Size / 1000) KB</td>
<td><ActionLink Action="Details" Text="Edit" Parameters="@($"id=" + context.FileId.ToString())" ResourceKey="Details" /></td>
<td><ActionDialog Header="Delete File" Message="@string.Format(Localizer["Confirm.File.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteFile(context))" ResourceKey="DeleteFile" /></td>
<td><a href="@context.Url" target="_new">@context.Name</a></td>
<td>@UtcToLocal(context.ModifiedOn)</td>
<td>@context.Extension.ToUpper() @SharedLocalizer["File"]</td>
<td>@string.Format("{0:0.00}", ((decimal)context.Size / 1000)) KB</td>
</Row>
</Pager>
@if (_files.Count == 0)
{
<div class="text-center">No Files Exist In Selected Folder</div>
}
else
{
<div class="text-center">@Localizer["NoFiles"]</div>
}
</TabPanel>
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings" Security="SecurityAccessLevel.Admin">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="imageExt" HelpText="Enter a comma separated list of image file extensions" ResourceKey="ImageExtensions">Image Extensions: </Label>
<div class="col-sm-9">
<input id="imageExt" spellcheck="false" class="form-control" @bind="@_imageFiles" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uploadableFileExt" HelpText="Enter a comma separated list of uploadable file extensions" ResourceKey="UploadableFileExtensions">Uploadable File Extensions: </Label>
<div class="col-sm-9">
<input id="uploadableFileExt" spellcheck="false" class="form-control" @bind="@_uploadableFiles" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="maxChunkSize" HelpText="Files are split into chunks to streamline the upload process. Specify the maximum chunk size in MB (note that higher chunk sizes should only be used on faster networks)." ResourceKey="MaxChunkSize">Max Upload Chunk Size (MB): </Label>
<div class="col-sm-9">
<input id="maxChunkSize" type="number" min="1" max="10" step="1" class="form-control" @bind="@_maxChunkSize" />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
</TabPanel>
</TabStrip>
}
@code {
@@ -53,6 +96,10 @@
private int _folderId = -1;
private List<File> _files;
private string _imageFiles = string.Empty;
private string _uploadableFiles = string.Empty;
private int _maxChunkSize = 1;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnParametersSetAsync()
@@ -66,11 +113,18 @@
_folderId = _folders[0].FolderId;
await GetFiles();
}
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_imageFiles = SettingService.GetSetting(settings, "ImageFiles", Constants.ImageFiles);
_imageFiles = (string.IsNullOrEmpty(_imageFiles)) ? Constants.ImageFiles : _imageFiles;
_uploadableFiles = SettingService.GetSetting(settings, "UploadableFiles", Constants.UploadableFiles);
_uploadableFiles = (string.IsNullOrEmpty(_uploadableFiles)) ? Constants.UploadableFiles : _uploadableFiles;
_maxChunkSize = int.Parse(SettingService.GetSetting(settings, "MaxChunkSize", "1"));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Files {Error}", ex.Message);
AddModuleMessage("Error Loading Files", MessageType.Error);
AddModuleMessage(Localizer["Error.File.Load"], MessageType.Error);
}
}
@@ -90,7 +144,7 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Files {Error}", ex.Message);
AddModuleMessage("Error Loading Files", MessageType.Error);
AddModuleMessage(Localizer["Error.File.Load"], MessageType.Error);
}
}
@@ -100,14 +154,33 @@
{
await FileService.DeleteFileAsync(file.FileId);
await logger.LogInformation("File Deleted {File}", file.Name);
AddModuleMessage("File " + file.Name + " Deleted", MessageType.Success);
AddModuleMessage(string.Format(Localizer["Success.File.Delete"], file.Name), MessageType.Success);
await GetFiles();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting File {File} {Error}", file.Name, ex.Message);
AddModuleMessage("Error Deleting File " + file.Name, MessageType.Error);
AddModuleMessage(string.Format(Localizer["Error.File.Delete"], file.Name), MessageType.Error);
}
}
private async Task SaveSiteSettings()
{
try
{
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
settings = SettingService.SetSetting(settings, "ImageFiles", (_imageFiles != Constants.ImageFiles) ? _imageFiles.Replace(" ", "") : "", false);
settings = SettingService.SetSetting(settings, "UploadableFiles", (_uploadableFiles != Constants.UploadableFiles) ? _uploadableFiles.Replace(" ", "") : "", false);
settings = SettingService.SetSetting(settings, "MaxChunkSize", _maxChunkSize.ToString(), false);
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,19 @@
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.Admin.Files
{
[PrivateApi("Mark this as private, since it's not very useful in the public docs")]
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "File Management",
Description = "File Management",
Version = Constants.Version,
Categories = "Admin",
ServerManagerType = "Oqtane.Modules.Admin.Files.Manager.FileManager, Oqtane.Server"
};
}
}

View File

@@ -1,140 +0,0 @@
@namespace Oqtane.Modules.Admin.Jobs
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IJobService JobService
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Enter the job name">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="type" HelpText="Enter the job type">Type: </Label>
</td>
<td>
<input id="type" class="form-control" @bind="@_jobType" />
</td>
</tr>
<tr>
<td>
<Label For="enabled" HelpText="Select whether you want the job enabled or not">Enabled? </Label>
</td>
<td>
<select id="enabled" class="form-control" @bind="@_isEnabled">
<option value="True">Yes</option>
<option value="False">No</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="runs-every" HelpText="Select how often you want the job to run">Runs Every: </Label>
</td>
<td>
<input id="runs-every" class="form-control" @bind="@_interval" />
<select id="runs-every" class="form-control" @bind="@_frequency">
<option value="m">Minute(s)</option>
<option value="H">Hour(s)</option>
<option value="d">Day(s)</option>
<option value="M">Month(s)</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="starting" HelpText="What time do you want the job to start">Starting: </Label>
</td>
<td>
<input id="starting" class="form-control" @bind="@_startDate" />
</td>
</tr>
<tr>
<td>
<Label For="ending" HelpText="When do you want the job to end">Ending: </Label>
</td>
<td>
<input id="ending" class="form-control" @bind="@_endDate" />
</td>
</tr>
<tr>
<td>
<Label For="retention-log" HelpText="What items do you want in the retention log">Retention Log (Items): </Label>
</td>
<td>
<input id="retention-log" class="form-control" @bind="@_retentionHistory" />
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveJob">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@code {
private string _name = string.Empty;
private string _jobType = string.Empty;
private string _isEnabled = "True";
private string _interval = string.Empty;
private string _frequency = string.Empty;
private string _startDate = string.Empty;
private string _endDate = string.Empty;
private string _retentionHistory = "10";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
private async Task SaveJob()
{
if (_name != string.Empty && !string.IsNullOrEmpty(_jobType) && _frequency != string.Empty && _interval != string.Empty && _retentionHistory != string.Empty)
{
var job = new Job();
job.Name = _name;
job.JobType = _jobType;
job.IsEnabled = Boolean.Parse(_isEnabled);
job.Frequency = _frequency;
job.Interval = int.Parse(_interval);
if (_startDate == string.Empty)
{
job.StartDate = null;
}
else
{
job.StartDate = DateTime.Parse(_startDate);
}
if (_endDate == string.Empty)
{
job.EndDate = null;
}
else
{
job.EndDate = DateTime.Parse(_endDate);
}
job.RetentionHistory = int.Parse(_retentionHistory);
job.IsStarted = false;
job.IsExecuting = false;
job.NextExecution = null;
try
{
job = await JobService.AddJobAsync(job);
await logger.LogInformation("Job Added {Job}", job);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding Job {Job} {Error}", job, ex.Message);
AddModuleMessage("Error Adding Job", MessageType.Error);
}
}
else
{
AddModuleMessage("You Must Provide The Job Name, Type, Frequency, and Retention", MessageType.Warning);
}
}
}

View File

@@ -1,97 +1,121 @@
@namespace Oqtane.Modules.Admin.Jobs
@namespace Oqtane.Modules.Admin.Jobs
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IJobService JobService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Enter the job name">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="type" HelpText="Enter the job type">Type: </Label>
</td>
<td>
<input id="type" class="form-control" @bind="@_jobType" />
</td>
</tr>
<tr>
<td>
<Label For="enabled" HelpText="Select whether you want the job enabled or not">Enabled? </Label>
</td>
<td>
<select id="enabled" class="form-control" @bind="@_isEnabled">
<option value="True">Yes</option>
<option value="False">No</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the job name" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="200" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="type" HelpText="The fully qualified job type name" ResourceKey="Type">Type: </Label>
<div class="col-sm-9">
<input id="type" class="form-control" @bind="@_jobType" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="enabled" HelpText="Select whether you want the job enabled or not" ResourceKey="Enabled">Enabled? </Label>
<div class="col-sm-9">
<select id="enabled" class="form-select" @bind="@_isEnabled" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="runs-every" HelpText="Select how often you want the job to run">Runs Every: </Label>
</td>
<td>
<input id="runs-every" class="form-control" @bind="@_interval" />
<select id="runs-every" class="form-control" @bind="@_frequency">
<option value="m">Minute(s)</option>
<option value="H">Hour(s)</option>
<option value="d">Day(s)</option>
<option value="M">Month(s)</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runs-every" HelpText="Select how often you want the job to run" ResourceKey="RunsEvery">Runs Every: </Label>
<div class="col-sm-9">
<input id="runs-every" class="form-control mb-1" @bind="@_interval" maxlength="4" required />
<select id="runs-every" class="form-select" @bind="@_frequency" required>
<option value="m">@Localizer["Minute(s)"]</option>
<option value="H">@Localizer["Hour(s)"]</option>
<option value="d">@Localizer["Day(s)"]</option>
<option value="w">@Localizer["Week(s)"]</option>
<option value="M">@Localizer["Month(s)"]</option>
<option value="O">@Localizer["Once"]</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="starting" HelpText="What time do you want the job to start">Starting: </Label>
</td>
<td>
<input id="starting" class="form-control" @bind="@_startDate" />
</td>
</tr>
<tr>
<td>
<Label For="ending" HelpText="When do you want the job to end">Ending: </Label>
</td>
<td>
<input id="ending" class="form-control" @bind="@_endDate" />
</td>
</tr>
<tr>
<td>
<Label For="retention" HelpText="Number of log entries to retain for this job">Retention Log (Items): </Label>
</td>
<td>
<input id="retention" class="form-control" @bind="@_retentionHistory" />
</td>
</tr>
<tr>
<td>
<Label For="next" HelpText="Next execution for this job.">Next Execution: </Label>
</td>
<td>
<input id="next" class="form-control" @bind="@_nextExecution" />
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveJob">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="retention" HelpText="Number of log entries to retain for this job" ResourceKey="RetentionLog">Retention Log (Items): </Label>
<div class="col-sm-9">
<input id="retention" type="number" min="0" step ="1" class="form-control" @bind="@_retentionHistory" maxlength="3" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="starting" HelpText="Optionally enter the date and time when this job should start executing" ResourceKey="Starting">Starting: </Label>
<div class="col-sm-9">
<div class="row">
<div class="col">
<input id="starting" type="date" class="form-control" @bind="@_startDate" />
</div>
<div class="col">
<input id="starting" type="time" class="form-control" placeholder="hh:mm" @bind="@_startTime" />
</div>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ending" HelpText="Optionally enter the date and time when this job should stop executing" ResourceKey="Ending">Ending: </Label>
<div class="col-sm-9">
<div class="row">
<div class="col">
<input id="ending" type="date" class="form-control" @bind="@_endDate" />
</div>
<div class="col">
<input id="ending" type="time" class="form-control" placeholder="hh:mm" @bind="@_endTime" />
</div>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="next" HelpText="Optionally modify the date and time when this job should execute next" ResourceKey="NextExecution">Next Execution: </Label>
<div class="col-sm-9">
<div class="row">
<div class="col">
<input id="next" type="date" class="form-control" @bind="@_nextDate" />
</div>
<div class="col">
<input id="next" type="time" class="form-control" placeholder="hh:mm" @bind="@_nextTime" />
</div>
</div>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveJob">@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>
</form>
@code {
private ElementReference form;
private bool validated = false;
private int _jobId;
private string _name = string.Empty;
private string _jobType = string.Empty;
private string _isEnabled = "True";
private string _interval = string.Empty;
private string _frequency = string.Empty;
private string _startDate = string.Empty;
private string _endDate = string.Empty;
private DateTime? _startDate = null;
private DateTime? _startTime = null;
private DateTime? _endDate = null;
private DateTime? _endTime = null;
private string _retentionHistory = string.Empty;
private string _nextExecution = string.Empty;
private DateTime? _nextDate = null;
private DateTime? _nextTime = null;
private string createdby;
private DateTime createdon;
private string modifiedby;
private DateTime modifiedon;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@@ -108,58 +132,54 @@
_isEnabled = job.IsEnabled.ToString();
_interval = job.Interval.ToString();
_frequency = job.Frequency;
_startDate = (job.StartDate != null) ? job.StartDate.ToString() : string.Empty;
_endDate = (job.EndDate != null) ? job.EndDate.ToString() : string.Empty;
_startDate = UtcToLocal(job.StartDate);
_startTime = UtcToLocal(job.StartDate);
_endDate = UtcToLocal(job.EndDate);
_endTime = UtcToLocal(job.EndDate);
_retentionHistory = job.RetentionHistory.ToString();
_nextExecution = job.NextExecution.ToString();
_nextDate = UtcToLocal(job.NextExecution);
_nextTime = UtcToLocal(job.NextExecution);
createdby = job.CreatedBy;
createdon = job.CreatedOn;
modifiedby = job.ModifiedBy;
modifiedon = job.ModifiedOn;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Job {JobId} {Error}", _jobId, ex.Message);
AddModuleMessage("Error Loading Job", MessageType.Error);
AddModuleMessage(Localizer["Error.Job.Load"], MessageType.Error);
}
}
private async Task SaveJob()
{
if (_name != string.Empty && !string.IsNullOrEmpty(_jobType) && _frequency != string.Empty && _interval != string.Empty && _retentionHistory != string.Empty)
if (!Utilities.ValidateEffectiveExpiryDates(_startDate, _endDate))
{
AddModuleMessage(Localizer["Message.StartEndDateError"], MessageType.Warning);
return;
}
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
var job = await JobService.GetJobAsync(_jobId);
job.Name = _name;
job.JobType = _jobType;
job.IsEnabled = Boolean.Parse(_isEnabled);
job.Frequency = _frequency;
if (job.Frequency == "O") // once
{
job.Interval = 1;
}
else
{
job.Interval = int.Parse(_interval);
if (_startDate == string.Empty)
{
job.StartDate = null;
}
else
{
job.StartDate = DateTime.Parse(_startDate);
}
if (_endDate == string.Empty)
{
job.EndDate = null;
}
else
{
job.EndDate = DateTime.Parse(_endDate);
}
if (_nextExecution == string.Empty)
{
job.NextExecution = null;
}
else
{
job.NextExecution = DateTime.Parse(_nextExecution);
}
job.StartDate = LocalToUtc(_startDate.Value.Date.Add(_startTime.Value.TimeOfDay));
job.EndDate = LocalToUtc(_endDate.Value.Date.Add(_endTime.Value.TimeOfDay));
job.RetentionHistory = int.Parse(_retentionHistory);
job.NextExecution = LocalToUtc(_nextDate.Value.Date.Add(_nextTime.Value.TimeOfDay));
try
{
@@ -170,12 +190,12 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Udate Job {Job} {Error}", job, ex.Message);
AddModuleMessage("Error Updating Job", MessageType.Error);
AddModuleMessage(Localizer["Error.Job.Update"], MessageType.Error);
}
}
else
{
AddModuleMessage("You Must Provide The Job Name, Type, Frequency, and Retention", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.JobInfo"], MessageType.Warning);
}
}

View File

@@ -1,49 +1,50 @@
@namespace Oqtane.Modules.Admin.Jobs
@namespace Oqtane.Modules.Admin.Jobs
@inherits ModuleBase
@inject IJobService JobService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_jobs == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Add Job" />
<ActionLink Action="Log" Class="btn btn-secondary" Text="View Logs" />
<button type="button" class="btn btn-secondary" @onclick="(async () => await Refresh())">Refresh</button>
<br /><br />
<button type="button" class="btn btn-secondary" @onclick="Refresh">@Localizer["Refresh.Text"]</button>
<br />
<Pager Items="@_jobs">
<Pager Items="@_jobs" SearchProperties="Name">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>Status</th>
<th>Frequency</th>
<th>Next Execution</th>
<th>@SharedLocalizer["Name"]</th>
<th>@SharedLocalizer["Status"]</th>
<th>@Localizer["Frequency"]</th>
<th>@Localizer["NextExecution"]</th>
<th style="width: 1px;">&nbsp;</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.JobId.ToString())" /></td>
<td><ActionDialog Header="Delete Job" Message="@("Are You Sure You Wish To Delete This Job?")" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteJob(context))" /></td>
<td><ActionLink Action="Log" Class="btn btn-secondary" Parameters="@($"id=" + context.JobId.ToString())" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.JobId.ToString())" ResourceKey="EditJob" /></td>
<td><ActionLink Action="Log" Text="Log" Class="btn btn-secondary" Parameters="@($"id=" + context.JobId.ToString())" ResourceKey="JobLog" /></td>
<td>@context.Name</td>
<td>@DisplayStatus(context.IsEnabled, context.IsExecuting)</td>
<td>@DisplayFrequency(context.Interval, context.Frequency)</td>
<td>@context.NextExecution</td>
<td>@UtcToLocal(context.NextExecution)</td>
<td>
@if (context.IsStarted)
{
<button type="button" class="btn btn-danger" @onclick="(async () => await StopJob(context.JobId))">Stop</button>
<button type="button" class="btn btn-danger" @onclick="(async () => await StopJob(context.JobId))">@Localizer["Stop"]</button>
}
else
{
<button type="button" class="btn btn-success" @onclick="(async () => await StartJob(context.JobId))">Start</button>
<button type="button" class="btn btn-success" @onclick="(async () => await StartJob(context.JobId))">@Localizer["Start"]</button>
}
</td>
</Row>
</Pager>
<br />
<ActionLink Action="Log" Class="btn btn-secondary" Text="View All Logs" ResourceKey="ViewLogs" />
}
@code {
@@ -51,7 +52,12 @@ else
public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } }
protected override async Task OnParametersSetAsync()
protected override async Task OnInitializedAsync()
{
await GetJobs();
}
private async Task GetJobs()
{
_jobs = await JobService.GetJobsAsync();
}
@@ -61,17 +67,17 @@ else
var status = string.Empty;
if (!isEnabled)
{
status = "Disabled";
status = Localizer["Disabled"];
}
else
{
if (isExecuting)
{
status = "Executing";
status = Localizer["Executing"];
}
else
{
status = "Idle";
status = Localizer["Idle"];
}
}
@@ -81,59 +87,69 @@ else
private string DisplayFrequency(int interval, string frequency)
{
var result = "Every " + interval.ToString() + " ";
var result = "";
switch (frequency)
{
case "m":
result += "Minute";
result = $"{Localizer["Every"]} {interval.ToString()} " + Localizer["Minute"];
break;
case "H":
result += "Hour";
result = $"{Localizer["Every"]} {interval.ToString()} " + Localizer["Hour"];
break;
case "d":
result += "Day";
result = $"{Localizer["Every"]} {interval.ToString()} " + Localizer["Day"];
break;
case "w":
result = $"{Localizer["Every"]} {interval.ToString()} " + Localizer["Week"];
break;
case "M":
result += "Month";
result = $"{Localizer["Every"]} {interval.ToString()} " + Localizer["Month"];
break;
case "O":
result = Localizer["Once"];
break;
}
if (interval > 1)
{
result += "s";
}
return result;
}
private async Task DeleteJob(Job job)
{
try
{
await JobService.DeleteJobAsync(job.JobId);
await logger.LogInformation("Job Deleted {Job}", job);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Job {Job} {Error}", job, ex.Message);
AddModuleMessage("Error Deleting Job", MessageType.Error);
}
}
private async Task StartJob(int jobId)
{
try
{
await JobService.StartJobAsync(jobId);
await logger.LogInformation("Job Started {JobId}", jobId);
AddModuleMessage(Localizer["Message.Job.Start"], MessageType.Success);
_jobs = await JobService.GetJobsAsync();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Starting Job {JobId} {Error}", jobId, ex.Message);
AddModuleMessage(Localizer["Error.Job.Start"], MessageType.Error);
}
}
private async Task StopJob(int jobId)
{
try
{
await JobService.StopJobAsync(jobId);
await logger.LogInformation("Job Stopped {JobId}", jobId);
AddModuleMessage(Localizer["Message.Job.Stop"], MessageType.Success);
_jobs = await JobService.GetJobsAsync();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Stopping Job {JobId} {Error}", jobId, ex.Message);
AddModuleMessage(Localizer["Error.Job.Stop"], MessageType.Error);
}
}
private async Task Refresh()
{
_jobs = await JobService.GetJobsAsync();
StateHasChanged();
ShowProgressIndicator();
await GetJobs();
HideProgressIndicator();
}
}

View File

@@ -1,30 +1,35 @@
@namespace Oqtane.Modules.Admin.Jobs
@namespace Oqtane.Modules.Admin.Jobs
@inherits ModuleBase
@inject IJobLogService JobLogService
@inject IStringLocalizer<Log> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_jobLogs == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<Pager Items="@_jobLogs">
<button type="button" class="btn btn-secondary" @onclick="Refresh">@Localizer["Refresh"]</button>
<br /><br />
<Pager Items="@_jobLogs">
<Header>
<th>Name</th>
<th>Status</th>
<th>Started</th>
<th>Finished</th>
<th>@SharedLocalizer["Name"]</th>
<th>@SharedLocalizer["Status"]</th>
<th>@Localizer["Started"]</th>
<th>@Localizer["Finished"]</th>
</Header>
<Row>
<td>@context.Job.Name</td>
<td>@DisplayStatus(context.Job.IsExecuting, context.Succeeded)</td>
<td>@context.StartDate</td>
<td>@context.FinishDate</td>
<td>@UtcToLocal(context.StartDate)</td>
<td>@UtcToLocal(context.FinishDate)</td>
</Row>
<Detail>
<td colspan="4">@((MarkupString)context.Notes)</td>
</Detail>
</Pager>
</Pager>
}
@code {
@@ -34,14 +39,17 @@ else
protected override async Task OnParametersSetAsync()
{
_jobLogs = await JobLogService.GetJobLogsAsync();
if (PageState.QueryString.ContainsKey("id"))
{
_jobLogs = _jobLogs.Where(item => item.JobId == Int32.Parse(PageState.QueryString["id"])).ToList();
await GetJobLogs();
}
_jobLogs = _jobLogs.OrderByDescending(item => item.JobLogId).ToList();
private async Task GetJobLogs()
{
var jobId = -1;
if (PageState.QueryString.ContainsKey("id"))
{
jobId = int.Parse(PageState.QueryString["id"]);
}
_jobLogs = await JobLogService.GetJobLogsAsync(jobId);
}
private string DisplayStatus(bool isExecuting, bool? succeeded)
@@ -49,20 +57,27 @@ else
var status = string.Empty;
if (isExecuting)
{
status = "Executing";
status = Localizer["Executing"];
}
else
{
if (succeeded != null && succeeded.Value)
{
status = "Succeeded";
status = Localizer["Succeeded"];
}
else
{
status = "Failed";
status = Localizer["Failed"];
}
}
return status;
}
private async Task Refresh()
{
ShowProgressIndicator();
await GetJobLogs();
HideProgressIndicator();
}
}

View File

@@ -0,0 +1,139 @@
@namespace Oqtane.Modules.Admin.Languages
@inherits ModuleBase
@using System.Globalization
@inject NavigationManager NavigationManager
@inject ILocalizationService LocalizationService
@inject ILanguageService LanguageService
@inject IPackageService PackageService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_cultures == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<TabStrip>
<TabPanel Name="Manage" ResourceKey="Manage" Heading="Manage">
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Name Of The Language" ResourceKey="Name">Name:</Label>
<div class="col-sm-9">
<select id="_code" class="form-select" @bind="@_code" required>
<option value="-">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var culture in _cultures)
{
<option value="@culture.Name">@(culture.DisplayName + " (" + culture.Name + ")")</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="default" HelpText="Indicates Whether Or Not This Language Is The Default For The Site" ResourceKey="IsDefault">Default?</Label>
<div class="col-sm-9">
<select id="default" class="form-select" @bind="@_default" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="SaveLanguage">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</form>
</TabPanel>
<TabPanel Name="Upload" ResourceKey="Upload" Security="SecurityAccessLevel.Host" Heading="Upload">
<div class="container">
<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" OnUpload="OnUpload" />
</div>
</div>
</div>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</TabPanel>
</TabStrip>
}
@code {
private ElementReference form;
private bool validated = false;
private string _code = "-";
private string _default = "False";
private List<string> _languages;
private IEnumerable<Culture> _cultures;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnParametersSetAsync()
{
var languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId);
_languages = languages.Select(l => l.Code).ToList();
await LoadCultures();
}
private async Task LoadCultures()
{
_cultures = await LocalizationService.GetCulturesAsync(false);
_cultures = _cultures.Where(c => !c.Name.Equals(Constants.DefaultCulture) && !_languages.Contains(c.Name));
_code = "-";
}
private async Task SaveLanguage()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form) && _code != "-")
{
var language = new Language
{
SiteId = PageState.Page.SiteId,
Code = _code,
IsDefault = (_default == null ? false : Boolean.Parse(_default))
};
try
{
language = await LanguageService.AddLanguageAsync(language);
if (language.IsDefault)
{
await SetCultureAsync(language.Code);
}
await logger.LogInformation("Language Added {Language}", language);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding Language {Language} {Error}", language, ex.Message);
AddModuleMessage(Localizer["Error.Language.Add"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private async Task SetCultureAsync(string culture)
{
if (culture != CultureInfo.CurrentUICulture.Name)
{
var interop = new Interop(JSRuntime);
var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture));
await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360, true, "Lax");
}
}
private void OnUpload()
{
AddModuleMessage(string.Format(Localizer["Success.Language.Download"], NavigateUrl("admin/system")), MessageType.Success);
}
}

View File

@@ -0,0 +1,109 @@
@namespace Oqtane.Modules.Admin.Languages
@inherits ModuleBase
@using System.Globalization
@inject NavigationManager NavigationManager
@inject ILocalizationService LocalizationService
@inject ILanguageService LanguageService
@inject IPackageService PackageService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_code == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<TabStrip>
<TabPanel Name="Manage" ResourceKey="Manage" Heading="Manage">
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Name Of The Language" ResourceKey="Name">Name:</Label>
<div class="col-sm-9">
<input id="code" class="form-control" @bind="@_code" readonly/>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="default" HelpText="Indicates Whether Or Not This Language Is The Default For The Site" ResourceKey="IsDefault">Default?</Label>
<div class="col-sm-9">
<select id="default" class="form-select" @bind="@_default" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="SaveLanguage">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</form>
</TabPanel>
</TabStrip>
}
@code {
private ElementReference form;
private bool validated = false;
private int _languageId = -1;
private string _code = string.Empty;
private string _cultureName = string.Empty;
private string _default = "False";
private List<Language> _languages;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync()
{
_languageId = Int32.Parse(PageState.QueryString["id"]);
_languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId, Constants.ClientId);
Language language = _languages.Where(x => x.LanguageId == _languageId).FirstOrDefault();
if (language != null)
{
_code = language.Code;
_cultureName = language.Name;
_default = language.IsDefault.ToString();
if (language.SiteId == null)
{
language.SiteId = PageState.Site.SiteId;
}
};
}
private async Task SaveLanguage()
{
Language language = _languages.Where(x => x.LanguageId == _languageId).FirstOrDefault();
if (language != null)
{
language.IsDefault = Boolean.Parse(_default);
try
{
await LanguageService.EditLanguageAsync(language);
if (language.IsDefault)
{
await SetCultureAsync(language.Code);
}
await logger.LogInformation("Language Edited {Language}", language);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Editing Language {Language} {Error}", language, ex.Message);
AddModuleMessage(Localizer["Error.Language.Edit"], MessageType.Error);
}
};
}
private async Task SetCultureAsync(string culture)
{
if (culture != CultureInfo.CurrentUICulture.Name)
{
var interop = new Interop(JSRuntime);
var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture));
await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360, true, "Lax");
}
}
}

View File

@@ -0,0 +1,196 @@
@namespace Oqtane.Modules.Admin.Languages
@inherits ModuleBase
@inject ILanguageService LanguageService
@inject ILocalizationService LocalizationService
@inject IPackageService PackageService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_languages == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Add Language" ResourceKey="AddLanguage" />
<Pager Items="@_languages" SearchProperties="Name,Code">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>@SharedLocalizer["Name"]</th>
<th>@Localizer["Code"]</th>
<th>@Localizer["Default"]</th>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<th style="width: 1px;">@Localizer["Translation"]</th>
<th style="width: 1px;">&nbsp;</th>
}
</Header>
<Row>
<td>
@if (!context.IsDefault)
{
<ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.LanguageId.ToString())" ResourceKey="EditLanguage" />
}
</td>
<td><ActionDialog Header="Delete Language" Message="@string.Format(Localizer["Confirm.Language.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteLanguage(context))" Disabled="@((context.IsDefault && _languages.Count > 2) || context.Code == Constants.DefaultCulture)" ResourceKey="DeleteLanguage" /></td>
<td>@context.Name</td>
<td>@context.Code</td>
<td><TriStateCheckBox Value="@(context.IsDefault)" Disabled="true"></TriStateCheckBox></td>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<td>@((string.IsNullOrEmpty(context.Version)) ? "---" : context.Version)</td>
<td>
@{
var translation = TranslationAvailable(context.Code, context.Version);
}
@if (translation != null)
{
if (string.IsNullOrEmpty(context.Version))
{
<button type="button" class="btn btn-success" @onclick=@(async () => await GetPackage(context.Code, translation.Version))>@SharedLocalizer["Download"]</button>
}
else
{
if (Version.Parse(translation.Version).CompareTo(Version.Parse(context.Version)) > 0)
{
<button type="button" class="btn btn-success" @onclick=@(async () => await GetPackage(context.Code, translation.Version))>@SharedLocalizer["Upgrade"]</button>
}
}
}
</td>
}
</Row>
</Pager>
}
@if (_package != null)
{
<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;">
<h4 style="display: inline;"><a href="@_package.ProductUrl" target="_new">@_package.Name</a></h4><br />
@SharedLocalizer["Search.By"]:&nbsp;&nbsp;<strong><a href="@_package.OwnerUrl" target="new">@_package.Owner</a></strong><br />
@(_package.Description.Length > 400 ? (_package.Description.Substring(0, 400) + "...") : _package.Description)<br />
<strong>@(String.Format("{0:n0}", _package.Downloads))</strong> @SharedLocalizer["Search.Downloads"]&nbsp;&nbsp;|&nbsp;&nbsp;
@SharedLocalizer["Search.Released"]: <strong>@_package.ReleaseDate.ToString("MMM dd, yyyy")</strong>&nbsp;&nbsp;|&nbsp;&nbsp;
@SharedLocalizer["Search.Version"]: <strong>@_package.Version</strong>
@((MarkupString)(!string.IsNullOrEmpty(_package.PackageUrl) ? "&nbsp;&nbsp;|&nbsp;&nbsp;" + SharedLocalizer["Search.Source"] + ": <strong>" + new Uri(_package.PackageUrl).Host + "</strong>" : ""))
<br /><br />
@if (!string.IsNullOrEmpty(_package.License))
{
@((MarkupString)_package.License.Replace("\n", "<br />"))
}
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>
}
@code {
private List<Language> _languages;
private List<Package> _packages;
private Package _package;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnParametersSetAsync()
{
await GetLanguages();
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
_packages = await PackageService.GetPackagesAsync("translation");
}
}
private async Task GetLanguages()
{
_languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId, Constants.ClientId);
}
private async Task DeleteLanguage(Language language)
{
try
{
await LanguageService.DeleteLanguageAsync(language.LanguageId);
await logger.LogInformation("Language Deleted {Language}", language);
await GetLanguages();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Language {Language} {Error}", language, ex.Message);
AddModuleMessage(Localizer["Error.Language.Delete"], MessageType.Error);
}
}
private Package TranslationAvailable(string code, string version)
{
return _packages?.FirstOrDefault(item => item.PackageId == (Constants.PackageId + "." + code));
}
private async Task GetPackage(string code, string version)
{
try
{
_package = await PackageService.GetPackageAsync(Constants.PackageId + "." + code, version, false);
if (_package != null)
{
StateHasChanged();
}
else
{
await logger.LogError("Error Getting Package {PackageId} {Version}", Constants.PackageId + "." + code, Constants.Version);
AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", Constants.PackageId + "." + code, Constants.Version);
AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error);
}
}
private async Task DownloadPackage()
{
try
{
await PackageService.DownloadPackageAsync(_package.PackageId, _package.Version);
await logger.LogInformation("Language Package {Name} {Version} Downloaded Successfully", _package.PackageId, _package.Version);
AddModuleMessage(string.Format(Localizer["Success.Language.Download"], NavigateUrl("admin/system")), MessageType.Success);
_package = null;
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Translation {Name} {Version}", _package.PackageId, _package.Version);
AddModuleMessage(Localizer["Error.Language.Download"], MessageType.Error);
}
}
private void HideModal()
{
_package = null;
StateHasChanged();
}
}

View File

@@ -1,140 +1,277 @@
@namespace Oqtane.Modules.Admin.Login
@using System.Net
@namespace Oqtane.Modules.Admin.Login
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject ISettingService SettingService
@inject IServiceProvider ServiceProvider
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_message != string.Empty)
@if (PageState.User != null)
{
<ModuleMessage Message="@_message" Type="@_type" />
<ModuleMessage Message="@Localizer["Info.SignedIn"]" Type="MessageType.Info" />
}
<AuthorizeView>
<Authorizing>
<text>...</text>
</Authorizing>
<Authorized>
<ModuleMessage Message="You Are Already Logged In" Type="MessageType.Info" />
</Authorized>
<NotAuthorized>
<div class="container">
else
{
@if (!twofactor)
{
<form @ref="login" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="Oqtane-Modules-Admin-Login" @onkeypress="@(e => KeyPressed(e))">
@if (_allowexternallogin)
{
<button type="button" class="btn btn-primary" @onclick="ExternalLogin">@Localizer["Use"] @PageState.Site.Settings["ExternalLogin:ProviderName"]</button>
<br />
<br />
}
@if (_allowsitelogin)
{
<div class="form-group">
<label for="Username" class="control-label">Username: </label>
<input type="text" name="Username" class="form-control" placeholder="Username" @bind="@_username" id="Username" />
<Label Class="control-label" For="username" HelpText="Please enter your Username" ResourceKey="Username">Username:</Label>
<input id="username" type="text" @ref="username" class="form-control" placeholder="@Localizer["Username.Placeholder"]" @bind="@_username" @bind:event="oninput" required />
</div>
<div class="form-group mt-2">
<Label Class="control-label" For="password" HelpText="Please enter your Password" ResourceKey="Password">Password:</Label>
<div class="input-group">
<input id="password" type="@_passwordtype" name="Password" class="form-control" placeholder="@Localizer["Password.Placeholder"]" @bind="@_password" @bind:event="oninput" required />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
<div class="form-group mt-2">
@if (!_alwaysremember)
{
<div class="form-check">
<input id="remember" type="checkbox" class="form-check-input" @bind="@_remember" />
<Label Class="control-label" For="remember" HelpText="Specify if you would like to be signed back in automatically the next time you visit this site" ResourceKey="Remember">Remember Me?</Label>
</div>
}
</div>
<button type="button" class="btn btn-primary" @onclick="Login">@SharedLocalizer["Login"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
<br />
<br />
<button type="button" class="btn btn-secondary" @onclick="Forgot">@Localizer["ForgotPassword"]</button>
@if (PageState.Site.AllowRegistration)
{
<br />
<br />
<NavLink href="@NavigateUrl("register")">@Localizer["Register"]</NavLink>
}
}
</div>
</form>
}
else
{
<form @ref="login" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container Oqtane-Modules-Admin-Login">
<div class="form-group">
<label for="Password" class="control-label">Password: </label>
<input type="password" name="Password" class="form-control" placeholder="Password" @bind="@_password" id="Password" />
<Label Class="control-label" For="code" HelpText="Please enter the secure verification code which was sent to you by email" ResourceKey="Code">Verification Code:</Label>
<input id="code" class="form-control" @bind="@_code" placeholder="@Localizer["Code.Placeholder"]" maxlength="6" required />
</div>
<div class="form-group">
<div class="form-check form-check-inline">
<label class="form-check-label" for="Remember">Remember Me?</label>&nbsp;
<input type="checkbox" class="form-check-input" name="Remember" @bind="@_remember" id="Remember" />
<br />
<button type="button" class="btn btn-primary" @onclick="Login">@SharedLocalizer["Login"]</button>
<button type="button" class="btn btn-secondary" @onclick="Reset">@SharedLocalizer["Cancel"]</button>
</div>
</div>
<button type="button" class="btn btn-primary" @onclick="Login">Login</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Cancel</button>
<br /><br />
<button type="button" class="btn btn-secondary" @onclick="Forgot">Forgot Password</button>
</div>
</NotAuthorized>
</AuthorizeView>
</form>
}
}
@code {
private string _returnUrl = string.Empty;
private string _message = string.Empty;
private MessageType _type = MessageType.Info;
private bool _allowsitelogin = true;
private bool _allowexternallogin = false;
private ElementReference login;
private bool validated = false;
private bool twofactor = false;
private string _username = string.Empty;
private ElementReference username;
private string _password = string.Empty;
private string _passwordtype = "password";
private string _togglepassword = string.Empty;
private bool _remember = false;
private bool _alwaysremember = false;
private string _code = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;
public override bool? Prerender => true;
public override List<Resource> Resources => new List<Resource>()
{
new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }
};
protected override async Task OnInitializedAsync()
{
if (PageState.QueryString.ContainsKey("returnurl"))
try
{
_returnUrl = PageState.QueryString["returnurl"];
}
_allowexternallogin = (SettingService.GetSetting(PageState.Site.Settings, "ExternalLogin:ProviderType", "") != "") ? true : false;
_allowsitelogin = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:AllowSiteLogin", "true"));
_alwaysremember = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:AlwaysRemember", "false"));
_togglepassword = SharedLocalizer["ShowPassword"];
if (PageState.QueryString.ContainsKey("name"))
{
_username = PageState.QueryString["name"];
}
if (PageState.QueryString.ContainsKey("token"))
if (PageState.QueryString.ContainsKey("token") && !string.IsNullOrEmpty(_username))
{
var user = new User();
user.SiteId = PageState.Site.SiteId;
user.Username = _username;
user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]);
if (PageState.QueryString.ContainsKey("key"))
{
user = await UserService.LinkUserAsync(user, PageState.QueryString["token"], PageState.Site.Settings["ExternalLogin:ProviderType"], PageState.QueryString["key"], PageState.Site.Settings["ExternalLogin:ProviderName"]);
if (user != null)
{
_message = "User Account Verified Successfully. You Can Now Login With Your Username And Password Below.";
await logger.LogInformation(LogFunction.Security, "External Login Linkage Successful For Username {Username}", _username);
AddModuleMessage(Localizer["Success.Account.Linked"], MessageType.Info);
}
else
{
_message = "User Account Could Not Be Verified. Please Contact Your Administrator For Further Instructions.";
_type = MessageType.Warning;
await logger.LogError(LogFunction.Security, "External Login Linkage Failed For Username {Username}", _username);
AddModuleMessage(Localizer["Message.Account.NotLinked"], MessageType.Warning);
}
_username = "";
}
else
{
user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]);
if (user != null)
{
await logger.LogInformation(LogFunction.Security, "Email Verified For Username {Username}", _username);
AddModuleMessage(Localizer["Success.Account.Verified"], MessageType.Info);
}
else
{
await logger.LogError(LogFunction.Security, "Email Verification Failed For Username {Username}", _username);
AddModuleMessage(Localizer["Message.Account.NotVerified"], MessageType.Warning);
}
}
}
else
{
if (PageState.QueryString.ContainsKey("status"))
{
AddModuleMessage(Localizer["ExternalLoginStatus." + PageState.QueryString["status"]], MessageType.Info);
}
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Login {Error}", ex.Message);
AddModuleMessage(Localizer["Error.LoadLogin"], MessageType.Error);
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender && PageState.User == null && _allowsitelogin)
{
if (!string.IsNullOrEmpty(username.Id)) // ensure username is visible in UI
{
await username.FocusAsync();
}
}
// redirect logged in user to specified page
if (PageState.User != null && !UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
}
private async Task Login()
{
if (PageState.Runtime == Runtime.Server)
try
{
// server-side Blazor
var user = new User();
user.SiteId = PageState.Site.SiteId;
user.Username = _username;
user.Password = _password;
user = await UserService.LoginUserAsync(user, false, false);
if (user.IsAuthenticated)
{
await logger.LogInformation("Login Successful For Username {Username}", _username);
// complete the login on the server so that the cookies are set correctly on SignalR
validated = true;
var interop = new Interop(JSRuntime);
string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken");
var fields = new { __RequestVerificationToken = antiforgerytoken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl };
await interop.SubmitForm($"/{PageState.Alias.AliasId}/pages/login/", fields);
if (await interop.FormValid(login))
{
var hybrid = (PageState.Runtime == Shared.Runtime.Hybrid);
var user = new User { SiteId = PageState.Site.SiteId, Username = _username, Password = _password, LastIPAddress = SiteState.RemoteIPAddress};
if (!twofactor)
{
_remember = _alwaysremember || _remember;
user = await UserService.LoginUserAsync(user, hybrid, _remember);
}
else
{
await logger.LogInformation("Login Failed For Username {Username}", _username);
AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Email Verification When They Initially Created.", MessageType.Error);
user = await UserService.VerifyTwoFactorAsync(user, _code);
}
}
else
if (user != null && user.IsAuthenticated)
{
// client-side Blazor
var user = new User();
user.SiteId = PageState.Site.SiteId;
user.Username = _username;
user.Password = _password;
user = await UserService.LoginUserAsync(user, true, _remember);
if (user.IsAuthenticated)
await logger.LogInformation(LogFunction.Security, "Login Successful For {Username} From IP Address {IPAddress}", _username, SiteState.RemoteIPAddress);
// return url is not specified if user navigated directly to login page
var returnurl = (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : PageState.Alias.Path;
if (hybrid)
{
await logger.LogInformation("Login Successful For Username {Username}", _username);
// hybrid apps utilize an interactive login
var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider));
authstateprovider.NotifyAuthenticationChanged();
NavigationManager.NavigateTo(NavigateUrl(_returnUrl, "reload"));
NavigationManager.NavigateTo(NavigateUrl(returnurl, true));
}
else
{
await logger.LogInformation("Login Failed For Username {Username}", _username);
AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Verification When They Are Initially Created So You May Wish To Check Your Email.", MessageType.Error);
// post back to the Login page so that the cookies are set correctly
var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = WebUtility.UrlEncode(returnurl) };
string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/");
await interop.SubmitForm(url, fields);
}
}
else
{
if (SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:TwoFactor", "false") == "required" || (user != null && user.TwoFactorRequired))
{
twofactor = true;
validated = false;
AddModuleMessage(Localizer["Message.TwoFactor"], MessageType.Info);
}
else
{
if (!twofactor)
{
await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username);
AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error);
}
else
{
await logger.LogInformation(LogFunction.Security, "Two Factor Verification Failed For Username {Username}", _username);
AddModuleMessage(Localizer["Error.TwoFactor.Fail"], MessageType.Error);
}
}
}
}
else
{
AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Performing Login {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Login"], MessageType.Error);
}
}
private void Cancel()
{
NavigationManager.NavigateTo(_returnUrl);
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
private async Task Forgot()
{
try
{
if (_username != string.Empty)
{
@@ -142,19 +279,62 @@
if (user != null)
{
await UserService.ForgotPasswordAsync(user);
_message = "Please Check The Email Address Associated To Your User Account For A Password Reset Notification";
await logger.LogInformation(LogFunction.Security, "Password Reset Notification Sent For Username {Username}", _username);
AddModuleMessage(Localizer["Message.ForgotUser"], MessageType.Info);
}
else
{
_message = "User Does Not Exist";
_type = MessageType.Warning;
AddModuleMessage(Localizer["Message.UserDoesNotExist"], MessageType.Warning);
}
}
else
{
_message = "Please Enter The Username Related To Your Account And Then Select The Forgot Password Option Again";
AddModuleMessage(Localizer["Message.ForgotPassword"], MessageType.Info);
}
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Resetting Password {Error}", ex.Message);
AddModuleMessage(Localizer["Error.ResetPassword"], MessageType.Error);
}
}
private void Reset()
{
twofactor = false;
_username = "";
_password = "";
ClearModuleMessage();
StateHasChanged();
}
private async Task KeyPressed(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
await Login();
}
}
private void TogglePassword()
{
if (_passwordtype == "password")
{
_passwordtype = "text";
_togglepassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordtype = "password";
_togglepassword = SharedLocalizer["ShowPassword"];
}
}
private void ExternalLogin()
{
NavigationManager.NavigateTo(Utilities.TenantUrl(PageState.Alias, "/pages/external?returnurl=" + WebUtility.UrlEncode(PageState.ReturnUrl)), true);
}
}

View File

@@ -1,4 +1,4 @@
@namespace Oqtane.Modules.Admin.Logs
@namespace Oqtane.Modules.Admin.Logs
@using System.Globalization
@inherits ModuleBase
@inject NavigationManager NavigationManager
@@ -6,136 +6,114 @@
@inject IPageService PageService
@inject IPageModuleService PageModuleService
@inject IUserService UserService
@inject IStringLocalizer<Detail> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="dateTime" HelpText="The date and time of this log">Date/Time: </Label>
</td>
<td>
@if (_initialized)
{
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="dateTime" HelpText="The date and time of this log" ResourceKey="DateTime">Date/Time: </Label>
<div class="col-sm-9">
<input id="dateTime" class="form-control" @bind="@_logDate" readonly />
</td>
</tr>
<tr>
<td>
<Label For="level" HelpText="The level of this log">Level: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="level" HelpText="The level of this log" ResourceKey="Level">Level: </Label>
<div class="col-sm-9">
<input id="level" class="form-control" @bind="@_level" readonly />
</td>
</tr>
<tr>
<td>
<Label For="feature" HelpText="The feature that was affected">Feature: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="feature" HelpText="The feature that was affected" ResourceKey="Feature">Feature: </Label>
<div class="col-sm-9">
<input id="feature" class="form-control" @bind="@_feature" readonly />
</td>
</tr>
<tr>
<td>
<Label For="function" HelpText="The function that was performed">Function: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="function" HelpText="The function that was performed" ResourceKey="Function">Function: </Label>
<div class="col-sm-9">
<input id="function" class="form-control" @bind="@_function" readonly />
</td>
</tr>
<tr>
<td>
<Label For="category" HelpText="The categories that were affected">Category: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="category" HelpText="The fully qualified type type that was affected" ResourceKey="Category">Type Name: </Label>
<div class="col-sm-9">
<input id="category" class="form-control" @bind="@_category" readonly />
</td>
</tr>
</div>
</div>
@if (_pageName != string.Empty)
{
<tr>
<td>
<Label For="page" HelpText="The page that was affected">Page: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="page" HelpText="The page that was affected" ResourceKey="Page">Page: </Label>
<div class="col-sm-9">
<input id="page" class="form-control" @bind="@_pageName" readonly />
</td>
</tr>
</div>
</div>
}
@if (_moduleTitle != string.Empty)
{
<tr>
<td>
<Label For="module" HelpText="The module that was affected">Module: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="module" HelpText="The module that was affected" ResourceKey="Module">Module: </Label>
<div class="col-sm-9">
<input id="module" class="form-control" @bind="@_moduleTitle" readonly />
</td>
</tr>
</div>
</div>
}
@if (_username != string.Empty)
{
<tr>
<td>
<Label For="user" HelpText="The user that caused this log">User: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="user" HelpText="The user that caused this log" ResourceKey="User">User: </Label>
<div class="col-sm-9">
<input id="user" class="form-control" @bind="@_username" readonly />
</td>
</tr>
</div>
</div>
}
<tr>
<td>
<Label For="url" HelpText="The url the log comes from">Url: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="The url the log comes from" ResourceKey="Url">Url: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" readonly />
</td>
</tr>
<tr>
<td>
<Label For="template" HelpText="What the log is about">Template: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="template" HelpText="What the log is about" ResourceKey="Template">Template: </Label>
<div class="col-sm-9">
<input id="template" class="form-control" @bind="@_template" readonly />
</td>
</tr>
<tr>
<td>
<Label For="message" HelpText="The message that the system generated"class="control-label">Message: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="message" HelpText="The message that the system generated" ResourceKey="Message">Message: </Label>
<div class="col-sm-9">
<textarea id="message" class="form-control" @bind="@_message" rows="5" readonly></textarea>
</td>
</tr>
</div>
</div>
@if (!string.IsNullOrEmpty(_exception))
{
<tr>
<td>
<Label For="exception" HelpText="The exceptions generated by the system">Exception: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="exception" HelpText="The exceptions generated by the system" ResourceKey="Exception">Exception: </Label>
<div class="col-sm-9">
<textarea id="exception" class="form-control" @bind="@_exception" rows="5" readonly></textarea>
</td>
</tr>
</div>
</div>
}
<tr>
<td>
<Label For="properties" HelpText="The properties that were affected">Properties: </Label>
</td>
<td>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="properties" HelpText="The properties that were affected" ResourceKey="Properties">Properties: </Label>
<div class="col-sm-9">
<textarea id="properties" class="form-control" @bind="@_properties" rows="5" readonly></textarea>
</td>
</tr>
<tr>
<td>
<Label For="server" HelpText="The server that was affected">Server: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="server" HelpText="The server that was affected" ResourceKey="Server">Server: </Label>
<div class="col-sm-9">
<input id="server" class="form-control" @bind="@_server" readonly />
</td>
</tr>
</table>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
</div>
}
<NavLink class="btn btn-secondary" href="@CloseUrl()">@SharedLocalizer["Cancel"]</NavLink>
@code {
private bool _initialized = false;
private int _logId;
private string _logDate = string.Empty;
private string _level = string.Empty;
@@ -152,17 +130,18 @@
private string _properties = string.Empty;
private string _server = string.Empty;
public override string UrlParametersTemplate => "/{id}";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
_logId = Int32.Parse(PageState.QueryString["id"]);
_logId = Int32.Parse(UrlParameters["id"]);
var log = await LogService.GetLogAsync(_logId);
if (log != null)
{
_logDate = log.LogDate.ToString(CultureInfo.CurrentCulture);
_logDate = UtcToLocal(log.LogDate).Value.ToString(CultureInfo.CurrentCulture);
_level = log.Level;
_feature = log.Feature;
_function = log.Function;
@@ -177,7 +156,7 @@
}
}
if (log.PageId != null && log.ModuleId != null)
if (log.PageId != null && log.ModuleId != null && log.ModuleId != -1)
{
var pagemodule = await PageModuleService.GetPageModuleAsync(log.PageId.Value, log.ModuleId.Value);
if (pagemodule != null)
@@ -201,12 +180,18 @@
_exception = log.Exception;
_properties = log.Properties;
_server = log.Server;
_initialized = true;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Log {LogId} {Error}", _logId, ex.Message);
AddModuleMessage("Error Loading Log", MessageType.Error);
AddModuleMessage(Localizer["Error.Log.Load"], MessageType.Error);
}
}
private string CloseUrl()
{
return (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl();
}
}

View File

@@ -1,63 +1,70 @@
@namespace Oqtane.Modules.Admin.Logs
@namespace Oqtane.Modules.Admin.Logs
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ILogService LogService
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_logs == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<table class="table table-borderless">
<tr>
<td>
<label>Level: </label>
<select class="form-control" @onchange="(e => LevelChanged(e))">
<option value="-">&lt;All Levels&gt;</option>
<option value="Trace">Trace</option>
<option value="Debug">Debug</option>
<option value="Information">Information</option>
<option value="Warning">Warning</option>
<option value="Error">Error</option>
<option value="Critical">Critical</option>
<TabStrip>
<TabPanel Name="Events" Heading="Events" ResourceKey="Events">
<div class="container g-0">
<div class="row mb-1 align-items-center">
<div class="col-sm-4">
<Label For="level" HelpText="Select the log level for event log items" ResourceKey="Level">Level: </Label><br /><br />
<select id="level" class="form-select" value="@_level" @onchange="(e => LevelChanged(e))">
<option value="-">&lt;@Localizer["AllLevels"]&gt;</option>
<option value="Trace">@Localizer["Trace"]</option>
<option value="Debug">@Localizer["Debug"]</option>
<option value="Information">@Localizer["Information"]</option>
<option value="Warning">@Localizer["Warning"]</option>
<option value="Error">@Localizer["Error"]</option>
<option value="Critical">@Localizer["Critical"]</option>
</select>
</td>
<td>
<label>Function: </label>
<select class="form-control" @onchange="(e => FunctionChanged(e))">
<option value="-">&lt;All Functions&gt;</option>
<option value="Create">Create</option>
<option value="Read">Read</option>
<option value="Update">Update</option>
<option value="Delete">Delete</option>
<option value="Security">Security</option>
<option value="Other">Other</option>
</div>
<div class="col-sm-4">
<Label For="function" HelpText="Select the function for event log items" ResourceKey="Function">Function: </Label><br /><br />
<select id="function" class="form-select" value="@_function" @onchange="(e => FunctionChanged(e))">
<option value="-">&lt;@Localizer["AllFunctions"]&gt;</option>
<option value="Create">@Localizer["Create"]</option>
<option value="Read">@Localizer["Read"]</option>
<option value="Update">@SharedLocalizer["Update"]</option>
<option value="Delete">@SharedLocalizer["Delete"]</option>
<option value="Security">@Localizer["Security"]</option>
<option value="Other">@Localizer["Other"]</option>
</select>
</td>
<td>
<label>Rows: </label>
<select class="form-control" @onchange="(e => RowsChanged(e))">
</div>
<div class="col-sm-4">
<Label For="rows" HelpText="Select the maximum number of event log items to review. Please note that if you choose more than 10 items the information will be split into pages." ResourceKey="Rows">Maximum Items: </Label><br /><br />
<select id="rows" class="form-select" value="@_rows" @onchange="(e => RowsChanged(e))">
<option value="10">10</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</td>
</tr>
</table>
</div>
</div>
</div>
<br />
@if (_logs.Any())
{
<Pager Items="@_logs">
<Pager Items="@_logs" CurrentPage="@_page.ToString()" OnPageChange="OnPageChange">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th>Date</th>
<th>Level</th>
<th>Feature</th>
<th>Function</th>
<th>@Localizer["Date"]</th>
<th>@Localizer["Level"]</th>
<th>@Localizer["Feature"]</th>
<th>@Localizer["Function"]</th>
</Header>
<Row>
<td class="@GetClass(context.Function)"><ActionLink Action="Detail" Parameters="@($"id=" + context.LogId.ToString())" /></td>
<td class="@GetClass(context.Function)">@context.LogDate</td>
<td class="@GetClass(context.Function)"><ActionLink Action="Detail" Text="Details" Parameters="@($"/{context.LogId}")" ReturnUrl="@(NavigateUrl(PageState.Page.Path, AddUrlParameters(_level, _function, _rows, _page)))" ResourceKey="LogDetails" /></td>
<td class="@GetClass(context.Function)">@UtcToLocal(context.LogDate)</td>
<td class="@GetClass(context.Function)">@context.Level</td>
<td class="@GetClass(context.Function)">@context.Feature</td>
<td class="@GetClass(context.Function)">@context.Function</td>
@@ -66,28 +73,66 @@ else
}
else
{
<p><em>No Logs Match The Criteria Specified</em></p>
<p><em>@Localizer["NoLogs"]</em></p>
}
</TabPanel>
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="retention" HelpText="Number of days of events to retain" ResourceKey="Retention">Retention (Days): </Label>
<div class="col-sm-9">
<input id="retention" type="number" min="0" step="1" class="form-control" @bind="@_retention" />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
<ActionDialog Header="Clear Events" Message="Are You Sure You Wish To Remove All Log Events?" Action="DeleteLogs" Class="btn btn-danger" OnClick="@(async () => await DeleteLogs())" ResourceKey="DeleteLogs" />
</TabPanel>
</TabStrip>
}
@code {
private string _level = "-";
private string _function = "-";
private string _rows = "10";
private int _page = 1;
private List<Log> _logs;
private int _retention = 30;
public override string UrlParametersTemplate => "/{level}/{function}/{rows}/{page}";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
protected override async Task OnParametersSetAsync()
{
try
{
if (UrlParameters.ContainsKey("level"))
{
_level = UrlParameters["level"];
}
if (UrlParameters.ContainsKey("function"))
{
_function = UrlParameters["function"];
}
if (UrlParameters.ContainsKey("rows"))
{
_rows = UrlParameters["rows"];
}
if (UrlParameters.ContainsKey("page") && int.TryParse(UrlParameters["page"], out int page))
{
_page = page;
}
await GetLogs();
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_retention = int.Parse( SettingService.GetSetting(settings, "LogRetention", "30"));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
AddModuleMessage("Error Loading Logs", MessageType.Error);
AddModuleMessage(Localizer["Error.Log.Load"], MessageType.Error);
}
}
@@ -102,7 +147,7 @@ else
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
AddModuleMessage("Error Loading Logs", MessageType.Error);
AddModuleMessage(Localizer["Error.Log.Load"], MessageType.Error);
}
}
@@ -117,7 +162,7 @@ else
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
AddModuleMessage("Error Loading Logs", MessageType.Error);
AddModuleMessage(Localizer["Error.Log.Load"], MessageType.Error);
}
}
@@ -133,7 +178,7 @@ else
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message);
AddModuleMessage("Error Loading Logs", MessageType.Error);
AddModuleMessage(Localizer["Error.Log.Load"], MessageType.Error);
}
}
@@ -168,4 +213,53 @@ else
}
return classname;
}
private async Task SaveSiteSettings()
{
try
{
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
settings = SettingService.SetSetting(settings, "LogRetention", _retention.ToString(), true);
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
}
}
private async Task DeleteLogs()
{
try
{
await LogService.DeleteLogsAsync(PageState.Site.SiteId);
await GetLogs();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Logs {Error}", ex.Message);
AddModuleMessage(Localizer["Error.DeleteLogs"], MessageType.Error);
}
}
private void OnPageChange(int page)
{
_page = page;
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// external link to log item will display Details component
if (PageState.QueryString.ContainsKey("id") && int.TryParse(PageState.QueryString["id"], out int id))
{
NavigationManager.NavigateTo(EditUrl(PageState.Page.Path, ModuleState.ModuleId, "Detail", $"/{id}"));
}
}
}
}

View File

@@ -1,124 +0,0 @@
@namespace Oqtane.Modules.Admin.ModuleCreator
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IModuleDefinitionService ModuleDefinitionService
@inject IModuleService ModuleService
@inject ISystemService SystemService
<table class="table table-borderless">
<tr>
<td>
<Label For="owner" HelpText="Enter the name of the organization who is developing this module. It should not contain spaces or punctuation.">Owner Name: </Label>
</td>
<td>
<input id="owner" class="form-control" @bind="@_owner" />
</td>
</tr>
<tr>
<td>
<Label For="module" HelpText="Enter a name for this module. It should be in singular form (ie. Car) and not contain spaces or punctuation.">Module Name: </Label>
</td>
<td>
<input id="module" class="form-control" @bind="@_module" />
</td>
</tr>
<tr>
<td>
<Label For="description" HelpText="Enter s short description for the module">Description: </Label>
</td>
<td>
<textarea id="description" class="form-control" @bind="@_description" rows="3"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="template" HelpText="Select a module template. Internal modules are created inside of the Oqtane solution. External modules are created outside of the Oqtane solution.">Template: </Label>
</td>
<td>
<select id="template" class="form-control" @onchange="(e => TemplateChanged(e))">
<option value="-">&lt;Select Template&gt;</option>
<option value="internal">Internal</option>
<option value="external">External</option>
</select>
</td>
</tr>
@if (!string.IsNullOrEmpty(_location))
{
<tr>
<td>
<Label For="location" HelpText="Location where the module will be created">Location: </Label>
</td>
<td>
<input id="module" class="form-control" @bind="@_location" readonly />
</td>
</tr>
}
</table>
<button type="button" class="btn btn-success" @onclick="CreateModule">Create Module</button>
@code {
private string _owner = string.Empty;
private string _module = string.Empty;
private string _description = string.Empty;
private string _template = "-";
private string _location = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override void OnInitialized()
{
AddModuleMessage("Please Note That Once You Select The Create Module Button The Application Must Restart In Order To Complete The Process. If You Create An External Module You Will Need To Compile The Source Code In Order To Make It Functional.", MessageType.Info);
}
private async Task CreateModule()
{
try
{
if (!string.IsNullOrEmpty(_owner) && !string.IsNullOrEmpty(_module) && _template != "-")
{
var moduleDefinition = new ModuleDefinition { Owner = _owner.Replace(" ", ""), Name = _module.Replace(" ", ""), Description = _description, Template = _template };
await ModuleDefinitionService.CreateModuleDefinitionAsync(moduleDefinition, ModuleState.ModuleId);
}
else
{
AddModuleMessage("You Must Provide An Owner, Module Name, And Template", MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Creating Module");
}
}
private async void TemplateChanged(ChangeEventArgs e)
{
try
{
_location = string.Empty;
_template = (string)e.Value;
if (_template != "-")
{
Dictionary<string, string> systeminfo = await SystemService.GetSystemInfoAsync();
if (systeminfo != null)
{
string[] path = systeminfo["serverpath"].Split('\\');
if (_template == "internal")
{
_location = string.Join("\\", path, 0, path.Length - 1) + "\\Oqtane.Client\\Modules\\" + _owner + "." + _module + "s";
}
else
{
_location = string.Join("\\", path, 0, path.Length - 2) + "\\" + _owner + "." + _module + "s";
}
}
}
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Getting System Info {Error}", ex.Message);
AddModuleMessage("Error Getting System Info", MessageType.Error);
}
}
}

View File

@@ -1,15 +0,0 @@
using Oqtane.Models;
namespace Oqtane.Modules.Admin.ModuleCreator
{
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "Module Creator",
Description = "Enables software developers to quickly create modules by automating many of the initial module creation tasks",
Version = "1.0.0",
Categories = "Developer"
};
}
}

View File

@@ -1,53 +1,185 @@
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@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
@if (_packages != null)
{
<TabStrip>
@if (_packages.Count > 0)
<TabStrip>
<TabPanel Name="Download" ResourceKey="Download" Heading="Download">
<div class="row justify-content-center mb-3">
<div class="text-center">
<div class="form-check form-check-inline">
<input id="free" class="form-check-input" type="radio" checked="@(_price == "free")" name="Price" @onchange="@(() => PriceChanged("free"))" />
<label class="form-check-label" for="free">@SharedLocalizer["Free"]</label>
</div>
<div class="form-check form-check-inline">
<input id="paid" class="form-check-input" type="radio" checked="@(_price == "paid")" name="Price" @onchange="@(() => PriceChanged("paid"))" />
<label class="form-check-label" for="paid">@SharedLocalizer["Paid"]</label>
</div>
</div>
</div>
<div class="row justify-content-center mb-3">
<div class="col">
<div class="input-group">
<span class="input-group-text">@Localizer["Product"]</span>
<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>
<button type="button" class="btn btn-primary ms-2" @onclick="Refresh"><span class="@Icons.Reload" aria-hidden="true"></span></button>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col">
@if (_initialized)
{
<TabPanel Name="Download">
<ModuleMessage Type="MessageType.Info" Message="Download one or more modules from the list below. Once you are ready click Install to complete the installation."></ModuleMessage>
<Pager Items="@_packages">
<Header>
<th>Name</th>
<th>Version</th>
<th style="width: 1px"></th>
</Header>
<br />
<div class="row mb-3">
<div class="col-sm-4">
<h3>@((_packages != null) ? _packages.Count : 0) @SharedLocalizer["Search.Results"]</h3>
</div>
<div class="col-sm-4">
&nbsp;
</div>
<div class="col-sm-4">
<select class="form-select" value="@_sort" @onchange="(e => SortChanged(e))">
<option value="popularity">@SharedLocalizer["Search.Popularity"]</option>
<option value="alphabetical">@SharedLocalizer["Search.Alphabetical"]</option>
@if (_price == "free")
{
<option value="downloads">@SharedLocalizer["Search.Downloads"]</option>
}
<option value="recent">@SharedLocalizer["Search.RecentlyReleased"]</option>
@if (_price == "paid")
{
<option value="price">@SharedLocalizer["Search.Price"]</option>
}
</select>
</div>
</div>
<Pager Format="Grid" Items="@_packages" DisplayPages="1" PageSize="9" Toolbar="Both" Class="container-fluid px-0" RowClass="row g-0" ColumnClass="col-lg-4 col-md-6" CurrentPage="@_page.ToString()" OnPageChange="OnPageChange">
<Row>
<td>@context.Name</td>
<td>@context.Version</td>
<td>
<button type="button" class="btn btn-primary" @onclick=@(async () => await DownloadModule(context.PackageId, context.Version))>Download</button>
</td>
<div class="m-2 p-2 d-flex justify-content-center">
<div class="container-fluid px-0">
<div class="row g-0 mb-2">
<div class="col-4">
<a href="@context.ProductUrl" target="_blank">
@if (context.LogoUrl != null)
{
<img src="@context.LogoUrl" class="img-fluid" alt="@context.Name" />
}
else
{
<img src="/package.png" class="img-fluid" alt="@context.Name" />
}
</a>
</div>
<div class="col-8 text-end">
<small>@SharedLocalizer["Search.Version"]:</small> <strong>@context.Version</strong>
<br /><small>@SharedLocalizer["Search.Released"]:</small> <strong>@context.ReleaseDate.ToString("MM/dd/yyyy")</strong>
@if (!string.IsNullOrEmpty(context.PackageUrl))
{
<br /><small>@SharedLocalizer["Search.Source"]:</small> <strong>@(new Uri(context.PackageUrl).Host)</strong>
}
@if (context.Price == null)
{
<br /><small>@SharedLocalizer["Search.Downloads"]:</small> <strong>@(String.Format("{0:n0}", context.Downloads))</strong>
}
else
{
<br /><small>@SharedLocalizer["From"]:</small> <strong>@context.Price.Value.ToString("$#,##0.00")</strong>
@((MarkupString)(context.TrialPeriod > 0 ? " <strong>(" + context.TrialPeriod + " Day Trial)</strong>" : ""))
}
</div>
</div>
<div class="row g-0">
<div class="col">
<h3 style="display: inline;"><a href="@context.ProductUrl" target="_blank">@context.Name</a></h3><br />
<small>@SharedLocalizer["Search.By"]:</small> <strong><a href="@context.OwnerUrl" target="new">@context.Owner</a></strong><br />
@(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)<br />
<br />
@if (!string.IsNullOrEmpty(context.PackageUrl))
{
<button type="button" class="btn btn-primary" @onclick=@(async () => await GetPackage(context.PackageId, context.Version))>@SharedLocalizer["Download"]</button>
}
@if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl))
{
<a class="btn btn-success ms-2" style="text-decoration: none !important" href="@context.PaymentUrl" target="_new">@SharedLocalizer["Buy"]</a>
}
<br />
</div>
</div>
</div>
</div>
</Row>
</Pager>
</TabPanel>
}
<TabPanel Name="Upload">
<table class="table table-borderless">
<tr>
<td>
<Label HelpText="Upload one or more module packages. Once they are uploaded click Install to complete the installation.">Module: </Label>
</td>
<td>
<FileManager Filter="nupkg" ShowFiles="false" Folder="Modules" UploadMultiple="true" />
</td>
</tr>
</table>
</div>
</div>
<br />
<ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" />
</TabPanel>
</TabStrip>
<TabPanel Name="Upload" ResourceKey="Upload" Heading="Upload">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" HelpText="Upload one or more module packages." ResourceKey="Module">Module: </Label>
<div class="col-sm-9">
<FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" OnUpload="OnUpload" />
</div>
</div>
</div>
</TabPanel>
</TabStrip>
<button type="button" class="btn btn-success" @onclick="InstallModules">Install</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@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="DownloadPackage">@SharedLocalizer["Accept"]</button>
<button type="button" class="btn btn-secondary" @onclick="HideModal">@SharedLocalizer["Cancel"]</button>
</div>
</div>
</div>
</div>
</div>
}
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@code {
private bool _initialized = false;
private int _page = 1;
private List<Package> _packages;
private string _price = "free";
private string _sort = "popularity";
private string _search = "";
private string _productname = "";
private string _packageid = "";
private string _packagelicense = "";
private string _packageversion = "";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@@ -55,52 +187,129 @@
{
try
{
var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
_packages = await PackageService.GetPackagesAsync("module");
await LoadModuleDefinitions();
_initialized = true;
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Package.Load"], MessageType.Error);
}
}
private async Task LoadModuleDefinitions()
{
ShowProgressIndicator();
var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
_packages = await PackageService.GetPackagesAsync("module", _search, _price, "", _sort);
if (_packages != null)
{
foreach (Package package in _packages.ToArray())
{
if (moduledefinitions.Exists(item => Utilities.GetTypeName(item.ModuleDefinitionName) == package.PackageId))
if (moduledefinitions.Exists(item => item.PackageName == package.PackageId))
{
_packages.Remove(package);
}
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message);
AddModuleMessage("Error Loading Packages", MessageType.Error);
}
HideProgressIndicator();
}
private async Task InstallModules()
private async void PriceChanged(string price)
{
_price = price;
_sort = "popularity";
await LoadModuleDefinitions();
StateHasChanged();
}
private async Task Search()
{
await LoadModuleDefinitions();
}
private async Task Reset()
{
_page = 1;
_search = "";
await LoadModuleDefinitions();
}
private async Task Refresh()
{
await LoadModuleDefinitions();
}
private void OnPageChange(int page)
{
_page = page;
}
private async void SortChanged(ChangeEventArgs e)
{
_sort = (string)e.Value;
await LoadModuleDefinitions();
}
private void HideModal()
{
_productname = "";
_packagelicense = "";
StateHasChanged();
}
private async Task GetPackage(string packageid, string version)
{
try
{
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ModuleDefinitionService.InstallModuleDefinitionsAsync();
var package = await PackageService.GetPackageAsync(packageid, version, false);
if (package != null)
{
_productname = package.Name;
_packageid = package.PackageId;
if (!string.IsNullOrEmpty(package.License))
{
_packagelicense = package.License.Replace("\n", "<br />");
}
_packageversion = package.Version;
StateHasChanged();
}
else
{
await logger.LogError("Error Getting Package {PackageId} {Version}", packageid, version);
AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Installating Module");
await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version);
AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error);
}
}
private async Task DownloadModule(string packageid, string version)
private async Task DownloadPackage()
{
try
{
await PackageService.DownloadPackageAsync(packageid, version, "Modules");
await logger.LogInformation("Module {ModuleDefinitionName} {Version} Downloaded Successfully", packageid, version);
AddModuleMessage("Modules Downloaded Successfully. Click Install To Complete Installation.", MessageType.Success);
await PackageService.DownloadPackageAsync(_packageid, _packageversion);
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 Module {ModuleDefinitionName} {Version}", packageid, version);
AddModuleMessage("Error Downloading Module", MessageType.Error);
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);
}
}

View File

@@ -0,0 +1,194 @@
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@inherits ModuleBase
@using System.Text.RegularExpressions
@inject NavigationManager NavigationManager
@inject IModuleDefinitionService ModuleDefinitionService
@inject IModuleService ModuleService
@inject ISettingService SettingService
@inject IStringLocalizer<Create> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_templates != null)
{
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="owner" HelpText="Enter the name of the organization who is developing this module. It should not contain spaces or punctuation or the word oqtane." ResourceKey="OwnerName">Owner Name: </Label>
<div class="col-sm-9">
<input id="owner" class="form-control" @bind="@_owner" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="module" HelpText="Enter a name for this module. It should not contain spaces or punctuation or the word oqtane." ResourceKey="ModuleName">Module Name: </Label>
<div class="col-sm-9">
<input id="module" class="form-control" @bind="@_module" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="Enter a short description for the module" ResourceKey="Description">Description: </Label>
<div class="col-sm-9">
<textarea id="description" class="form-control" @bind="@_description" rows="3" maxlength="2000"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="template" HelpText="Select a module template. Templates are located in the wwwroot/Modules/Templates folder on the server." ResourceKey="Template">Template: </Label>
<div class="col-sm-9">
<select id="template" class="form-select" @onchange="(e => TemplateChanged(e))" required>
<option value="-">&lt;@Localizer["Template.Select"]&gt;</option>
@foreach (Template template in _templates)
{
<option value="@template.Name">@template.Title</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="reference" HelpText="Select a framework reference version" ResourceKey="FrameworkReference">Framework Reference: </Label>
<div class="col-sm-9">
<select id="reference" class="form-select" @bind="@_reference" required>
@foreach (string version in _versions)
{
if (Version.Parse(version).CompareTo(Version.Parse(_minversion)) >= 0)
{
<option value="@(version)">@(version)</option>
}
}
<option value="local">@SharedLocalizer["LocalVersion"]</option>
</select>
</div>
</div>
@if (!string.IsNullOrEmpty(_location))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="location" HelpText="Location where the module will be created" ResourceKey="Location">Location: </Label>
<div class="col-sm-9">
<input id="module" class="form-control" @bind="@_location" readonly />
</div>
</div>
}
</div>
<button type="button" class="btn btn-success" @onclick="CreateModule">@Localizer["CreateModule"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</form>
}
@code {
private ElementReference form;
private bool validated = false;
private string _owner = string.Empty;
private string _module = string.Empty;
private string _description = string.Empty;
private List<Template> _templates;
private string _template = "-";
private string[] _versions;
private string _reference = "local";
private string _minversion = "2.0.0";
private string _location = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override void OnInitialized()
{
if (!NavigationManager.BaseUri.Contains("localhost:"))
{
AddModuleMessage(Localizer["Info.Module.Development"], MessageType.Info);
}
}
protected override async Task OnParametersSetAsync()
{
try
{
_templates = await ModuleDefinitionService.GetModuleDefinitionTemplatesAsync();
_versions = Constants.ReleaseVersions.Split(',').Where(item => Version.Parse(item).CompareTo(Version.Parse("2.0.0")) >= 0).ToArray();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Module Creator");
}
}
private async Task CreateModule()
{
validated = true;
_owner = _owner.Trim();
_module = _module.Trim();
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
if (IsValid(_owner) && IsValid(_module) && _owner != _module && _template != "-")
{
if (string.IsNullOrEmpty(_description)) _description = _module;
if (IsValidXML(_description))
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
var moduleDefinition = new ModuleDefinition { Owner = _owner, Name = _module, Description = _description, Template = _template, Version = _reference, ModuleDefinitionName = template.Namespace };
moduleDefinition = await ModuleDefinitionService.CreateModuleDefinitionAsync(moduleDefinition);
GetLocation();
AddModuleMessage(string.Format(Localizer["Success.Module.Create"], NavigateUrl("admin/system")), MessageType.Success);
}
else
{
AddModuleMessage(Localizer["Message.Require.ValidDescription"], MessageType.Warning);
}
}
else
{
AddModuleMessage(Localizer["Message.Require.ValidName"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Creating Module");
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private bool IsValid(string name)
{
// must contain letters, underscores and digits and first character must be letter or underscore
return !string.IsNullOrEmpty(name) && name.ToLower() != "module" && !name.ToLower().Contains("oqtane") && Regex.IsMatch(name, "^[A-Za-z_][A-Za-z0-9_]*$");
}
private bool IsValidXML(string description)
{
// must contain letters, digits, or spaces
return Regex.IsMatch(description, "^[A-Za-z0-9 .,!?]+$");
}
private void TemplateChanged(ChangeEventArgs e)
{
_template = (string)e.Value;
_minversion = "2.0.0";
if (_template != "-")
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
_minversion = template.Version;
}
GetLocation();
}
private void GetLocation()
{
_location = string.Empty;
if (_owner != "" && _module != "" && _template != "-")
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
if (!string.IsNullOrEmpty(template.Namespace))
{
_location = template.Location + template.Namespace.Replace("[Owner]", _owner).Replace("[Module]", _module);
}
else
{
_location = template.Location + _owner + ".Module." + _module;
}
}
StateHasChanged();
}
}

View File

@@ -1,134 +1,251 @@
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@inherits ModuleBase
@using System.Globalization
@inject IModuleDefinitionService ModuleDefinitionService
@inject IPackageService PackageService
@inject ILanguageService LanguageService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject IPageModuleService PageModuleService
@inject IModuleService ModuleService
@inject IPageService PageService
<TabStrip>
<TabPanel Name="Definition">
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="The name of the module">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="description" HelpText="The description of the module">Description: </Label>
</td>
<td>
<textarea id="description" class="form-control" @bind="@_description" rows="2"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="categories" HelpText="Comma delimited list of module categories">Categories: </Label>
</td>
<td>
<input id="categories" class="form-control" @bind="@_categories" />
</td>
</tr>
</table>
<Section Name="Information">
<table class="table table-borderless">
<tr>
<td>
<Label For="moduledefinitionname" HelpText="The internal name of the module">Internal Name: </Label>
</td>
<td>
@if (_initialized)
{
<TabStrip>
<TabPanel Name="Definition" ResourceKey="Definition" Heading="Definition">
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="The name of the module" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="200" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="The description of the module" ResourceKey="Description">Description: </Label>
<div class="col-sm-9">
<textarea id="description" class="form-control" @bind="@_description" rows="2" maxlength="2000" required></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="categories" HelpText="Comma delimited list of module categories" ResourceKey="Categories">Categories: </Label>
<div class="col-sm-9">
<input id="categories" class="form-control" @bind="@_categories" maxlength="200" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="isenabled" HelpText="Is module enabled for this site?" ResourceKey="IsEnabled">Enabled? </Label>
<div class="col-sm-9">
<select id="isenabled" class="form-select" @bind="@_isenabled" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
</form>
<Section Name="Information" ResourceKey="Information">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="moduledefinitionname" HelpText="The internal name of the module" ResourceKey="InternalName">Internal Name: </Label>
<div class="col-sm-9">
<input id="moduledefinitionname" class="form-control" @bind="@_moduledefinitionname" disabled />
</td>
</tr>
<tr>
<td>
<Label For="version" HelpText="The version of the module">Version: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="version" HelpText="The version of the module" ResourceKey="Version">Version: </Label>
<div class="col-sm-9">
<input id="version" class="form-control" @bind="@_version" disabled />
</td>
</tr>
<tr>
<td>
<Label For="owner" HelpText="The owner or creator of the module">Owner: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="packagename" HelpText="The unique name of the package from which this module was installed. This value must be specified within the module's IModule interface specification." ResourceKey="PackageName">Package Name: </Label>
<div class="col-sm-9">
<input id="packagename" class="form-control" @bind="@_packagename" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="owner" HelpText="The owner or creator of the module" ResourceKey="Owner">Owner: </Label>
<div class="col-sm-9">
<input id="owner" class="form-control" @bind="@_owner" disabled />
</td>
</tr>
<tr>
<td>
<Label For="url" HelpText="The reference url of the module">Reference Url: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="The url of the module" ResourceKey="Url">Url: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" disabled />
</td>
</tr>
<tr>
<td>
<Label For="contact" HelpText="The contact for the module">Contact: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="contact" HelpText="The contact for the module" ResourceKey="Contact">Contact: </Label>
<div class="col-sm-9">
<input id="contact" class="form-control" @bind="@_contact" disabled />
</td>
</tr>
<tr>
<td>
<Label For="license" HelpText="The module license terms">License: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="license" HelpText="The module license terms" ResourceKey="License">License: </Label>
<div class="col-sm-9">
@if (_license.StartsWith("http") || _license.StartsWith("/") || _license.StartsWith("~"))
{
<a href="@_license.Replace("~", PageState?.Alias.BaseUrl + "/Modules/" + Utilities.GetTypeName(_moduledefinitionname))" class="btn btn-info" style="text-decoration: none !important" target="_new">@Localizer["View License"]</a>
}
else
{
<textarea id="license" class="form-control" @bind="@_license" rows="5" disabled></textarea>
</td>
</tr>
<tr>
<td>
<Label For="runtimes" HelpText="The Blazor runtimes which this module supports">Runtimes: </Label>
</td>
<td>
<input id="runtimes" class="form-control" @bind="@_runtimes" disabled />
</td>
</tr>
</table>
}
</div>
</div>
</div>
</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">
<table class="table table-borderless">
<tr>
<TabPanel Name="Permissions" ResourceKey="Permissions" Heading="Permissions">
<div class="container">
<div class="row mb-1 align-items-center">
<PermissionGrid EntityName="@EntityNames.ModuleDefinition" PermissionNames="@PermissionNames.Utilize" PermissionList="@_permissions" @ref="_permissionGrid" />
</div>
</div>
<br />
<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="Pages" ResourceKey="Pages" Heading="Pages">
<Pager Items="@_pagesWithModules" RowClass="align-middle">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th>@SharedLocalizer["Name"]</th>
</Header>
<Row>
<td><button type="button" class="btn btn-secondary" @onclick="@(async () => NavigationManager.NavigateTo(Browse(context)))">@Localizer["Browse"]</button></td>
<td>@(string.IsNullOrEmpty(context.Title) ? @context.Name : @context.Title )</td>
</Row>
</Pager>
</TabPanel>
<TabPanel Name="Translations" ResourceKey="Translations" Heading="Translations">
@if (_languages != null && _languages.Count > 0)
{
<Pager Items="@_languages">
<Header>
<th>@SharedLocalizer["Name"]</th>
<th>@Localizer["Code"]</th>
<th style="width: 1px;">@Localizer["Version"]</th>
<th style="width: 1px;">&nbsp;</th>
</Header>
<Row>
<td>@context.Name</td>
<td>@context.Code</td>
<td>@((string.IsNullOrEmpty(context.Version)) ? "---" : context.Version)</td>
<td>
<PermissionGrid EntityName="@EntityNames.ModuleDefinition" PermissionNames="@PermissionNames.Utilize" Permissions="@_permissions" @ref="_permissionGrid" />
@switch (TranslationAvailable(_packagename + "." + context.Code, context.Version))
{
case "install":
<button type="button" class="btn btn-success" @onclick=@(async () => await GetPackage(_packagename + "." + context.Code))>@SharedLocalizer["Download"]</button>
break;
case "upgrade":
<button type="button" class="btn btn-success" @onclick=@(async () => await GetPackage(_packagename + "." + context.Code))>@SharedLocalizer["Upgrade"]</button>
break;
}
</td>
</tr>
</table>
</Row>
</Pager>
}
else
{
<br />
<div class="mx-auto text-center">
@if (string.IsNullOrEmpty(_packagename))
{
@Localizer["Search.PackageNameMissing"]
}
else
{
@Localizer["Search.NoResults"]
}
</div>
<br />
}
</TabPanel>
</TabStrip>
<button type="button" class="btn btn-success" @onclick="SaveModuleDefinition">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<br /><br />
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo>
</TabStrip>
@if (_package != null)
{
<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;">
<h4 style="display: inline;"><a href="@_package.ProductUrl" target="_new">@_package.Name</a></h4><br />
@SharedLocalizer["Search.By"]:&nbsp;&nbsp;<strong><a href="@_package.OwnerUrl" target="new">@_package.Owner</a></strong><br />
@(_package.Description.Length > 400 ? (_package.Description.Substring(0, 400) + "...") : _package.Description)<br />
<strong>@(String.Format("{0:n0}", _package.Downloads))</strong> @SharedLocalizer["Search.Downloads"]&nbsp;&nbsp;|&nbsp;&nbsp;
@SharedLocalizer["Search.Released"]: <strong>@_package.ReleaseDate.ToString("MMM dd, yyyy")</strong>&nbsp;&nbsp;|&nbsp;&nbsp;
@SharedLocalizer["Search.Version"]: <strong>@_package.Version</strong>
@((MarkupString)(!string.IsNullOrEmpty(_package.PackageUrl) ? "&nbsp;&nbsp;|&nbsp;&nbsp;" + SharedLocalizer["Search.Source"] + ": <strong>" + new Uri(_package.PackageUrl).Host + "</strong>" : ""))
<br /><br />
@if (!string.IsNullOrEmpty(_package.License))
{
@((MarkupString)_package.License.Replace("\n", "<br />"))
}
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 bool _initialized = false;
private ElementReference form;
private bool validated = false;
private int _moduleDefinitionId;
private string _name;
private string _version;
private string _categories;
private string _moduledefinitionname = "";
private string _description = "";
private string _categories;
private string _isenabled;
private string _moduledefinitionname = "";
private string _version;
private string _packagename = "";
private string _owner = "";
private string _url = "";
private string _contact = "";
private string _license = "";
private string _runtimes = "";
private string _permissions;
private List<Permission> _permissions = null;
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
private List<Page> _pagesWithModules;
#pragma warning disable 649
private PermissionGrid _permissionGrid;
#pragma warning restore 649
private List<Package> _packages;
private List<Language> _languages;
private Package _package;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync()
@@ -140,32 +257,70 @@
if (moduleDefinition != null)
{
_name = moduleDefinition.Name;
_version = moduleDefinition.Version;
_categories = moduleDefinition.Categories;
_moduledefinitionname = moduleDefinition.ModuleDefinitionName;
_description = moduleDefinition.Description;
_categories = moduleDefinition.Categories;
_isenabled = moduleDefinition.IsEnabled.ToString();
_moduledefinitionname = moduleDefinition.ModuleDefinitionName;
_version = moduleDefinition.Version;
_packagename = moduleDefinition.PackageName;
_owner = moduleDefinition.Owner;
_url = moduleDefinition.Url;
_contact = moduleDefinition.Contact;
_license = moduleDefinition.License;
_runtimes = moduleDefinition.Runtimes;
_permissions = moduleDefinition.Permissions;
_permissions = moduleDefinition.PermissionList;
_createdby = moduleDefinition.CreatedBy;
_createdon = moduleDefinition.CreatedOn;
_modifiedby = moduleDefinition.ModifiedBy;
_modifiedon = moduleDefinition.ModifiedOn;
if (!string.IsNullOrEmpty(_packagename))
{
_packages = await PackageService.GetPackagesAsync("translation", "", "", _packagename);
_languages = await LanguageService.GetLanguagesAsync(-1, _packagename);
foreach (var package in _packages)
{
var code = package.PackageId.Split('.').Last();
if (!_languages.Any(item => item.Code == code))
{
_languages.Add(new Language { Code = code, Name = CultureInfo.GetCultureInfo(code).DisplayName, Version = package.Version, IsDefault = true });
}
}
_languages = _languages.OrderBy(item => item.Name).ToList();
}
// get distinct pages where module exists
var modules = await ModuleService.GetModulesAsync(PageState.Site.SiteId);
var distinctPageIds = modules
.Where(md => md.ModuleDefinition?.ModuleDefinitionId == _moduleDefinitionId && md.IsDeleted == false)
.Select(md => md.PageId)
.Distinct();
// retrieve the pages which contain the module
var pages = await PageService.GetPagesAsync(PageState.Site.SiteId);
_pagesWithModules = pages
.Where(pg => distinctPageIds.Contains(pg.PageId) && pg.IsDeleted == false)
.ToList();
_initialized = true;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message);
AddModuleMessage("Error Loading Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error);
}
}
private async Task SaveModuleDefinition()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
var moduleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
if (!moduleDefinitions.Any(item => item.Name.ToLower() == _name.ToLower() && item.ModuleDefinitionId != _moduleDefinitionId))
{
var moduledefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId);
if (moduledefinition.Name != _name)
@@ -180,15 +335,97 @@
{
moduledefinition.Categories = _categories;
}
moduledefinition.Permissions = _permissionGrid.GetPermissions();
moduledefinition.IsEnabled = (_isenabled == null ? true : bool.Parse(_isenabled));
moduledefinition.PermissionList = _permissionGrid.GetPermissionList();
await ModuleDefinitionService.UpdateModuleDefinitionAsync(moduledefinition);
await logger.LogInformation("ModuleDefinition Saved {ModuleDefinition}", moduledefinition);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage(Localizer["Message.DuplicateName"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message);
AddModuleMessage("Error Saving Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Save"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private void HideModal()
{
_package = null;
StateHasChanged();
}
private string TranslationAvailable(string packagename, string version)
{
if (_packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null)
{
if (string.IsNullOrEmpty(version))
{
return "install";
}
else
{
if (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0)
{
return "upgrade";
}
}
}
}
return "";
}
private async Task GetPackage(string packagename)
{
var version = _packages.Where(item => item.PackageId == packagename).FirstOrDefault().Version;
try
{
_package = await PackageService.GetPackageAsync(packagename, version, false);
if (_package != null)
{
StateHasChanged();
}
else
{
await logger.LogError("Error Getting Package {PackageId} {Version}", packagename, version);
AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packagename, version);
AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error);
}
}
private async Task DownloadTranslation()
{
try
{
await PackageService.DownloadPackageAsync(_package.PackageId, _package.Version);
await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _package.PackageId, _package.Version);
AddModuleMessage(string.Format(Localizer["Success.Translation.Download"], NavigateUrl("admin/system")), MessageType.Success);
_package = null;
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packagename, _version);
AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error);
}
}
private string Browse(Page page) => string.IsNullOrEmpty(page.Url) ? NavigateUrl(page.Path) : page.Url;
}

View File

@@ -1,39 +1,98 @@
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@namespace Oqtane.Modules.Admin.ModuleDefinitions
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IModuleService ModuleService
@inject IModuleDefinitionService ModuleDefinitionService
@inject IPackageService PackageService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_moduleDefinitions == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Install Module" />
<div class="container">
<div class="row mb-3 align-items-center">
<div class="col-sm-6">
<ActionLink Action="Add" Text="Install Module" ResourceKey="InstallModule" />
<ActionLink Action="Create" Text="Create Module" ResourceKey="CreateModule" Class="btn btn-secondary ps-2" />
<button type="button" class="btn btn-secondary pw-2" @onclick="@Synchronize">@Localizer["Synchronize"]</button>
</div>
<div class="col-sm-6">
<select class="form-select" @onchange="(e => CategoryChanged(e))">
@foreach (var category in _categories)
{
if (category == _category)
{
<option value="@category" selected>@category @Localizer["Modules"]</option>
}
else
{
<option value="@category">@category @Localizer["Modules"]</option>
}
}
</select>
</div>
</div>
</div>
<Pager Items="@_moduleDefinitions">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>Version</th>
<th>@SharedLocalizer["Name"]</th>
<th>@SharedLocalizer["Version"]</th>
<th>@Localizer["Enabled"]</th>
<th>@Localizer["InUse"]</th>
<th>@SharedLocalizer["Support"]</th>
<th>@SharedLocalizer["Expires"]</th>
<th style="width: 1px;">&nbsp;</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.ModuleDefinitionId.ToString())" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.ModuleDefinitionId.ToString())" ResourceKey="EditModule" /></td>
<td>
@if (context.AssemblyName != "Oqtane.Client")
@if (context.AssemblyName != Constants.ClientId)
{
<ActionDialog Header="Delete Module" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Module?")" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" />
<ActionDialog Header="Delete Module" Message="@string.Format(Localizer["Confirm.Module.Delete", context.Name])" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" ResourceKey="DeleteModule" />
}
</td>
<td>@context.Name</td>
<td>@context.Version</td>
<td>
@if (UpgradeAvailable(context.ModuleDefinitionName, context.Version))
@if (context.IsEnabled)
{
<button type="button" class="btn btn-success" @onclick=@(async () => await DownloadModule(context.ModuleDefinitionName, context.Version))>Upgrade</button>
<span>@SharedLocalizer["Yes"]</span>
}
else
{
<span>@SharedLocalizer["No"]</span>
}
</td>
<td>
@if (context.AssemblyName == Constants.ClientId || _modules.Where(m => m.ModuleDefinition?.ModuleDefinitionId == context.ModuleDefinitionId).FirstOrDefault() != null)
{
<span>@SharedLocalizer["Yes"]</span>
}
else
{
<span>@SharedLocalizer["No"]</span>
}
</td>
<td>
@((MarkupString)SupportLink(context.PackageName, context.Version))
</td>
<td>
@((MarkupString)PurchaseLink(context.PackageName))
</td>
<td>
@{
var version = UpgradeAvailable(context.PackageName, context.Version);
}
@if (version != context.Version)
{
<button type="button" class="btn btn-success" @onclick=@(async () => await DownloadModule(context.PackageName, version))>@SharedLocalizer["Upgrade"]</button>
}
</td>
</Row>
@@ -41,58 +100,103 @@ else
}
@code {
private List<Module> _modules;
private List<ModuleDefinition> _allModuleDefinitions;
private List<ModuleDefinition> _moduleDefinitions;
private List<Package> _packages;
private List<string> _categories = new List<string>();
private string _category = "Common";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
protected override async Task OnParametersSetAsync()
{
try
{
_moduleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
_packages = await PackageService.GetPackagesAsync("module");
_modules = await ModuleService.GetModulesAsync(PageState.Site.SiteId);
_allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
_categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList();
await LoadModuleDefinitions();
}
catch (Exception ex)
{
if (_moduleDefinitions == null)
{
await logger.LogError(ex, "Error Loading Modules {Error}", ex.Message);
AddModuleMessage("Error Loading Modules", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error);
}
}
}
private bool UpgradeAvailable(string moduledefinitionname, string version)
private async Task LoadModuleDefinitions()
{
var upgradeavailable = false;
if (_packages != null)
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList();
_packages = await PackageService.GetPackageUpdatesAsync("module");
}
private string PurchaseLink(string packagename)
{
var package = _packages.Where(item => item.PackageId == Utilities.GetTypeName(moduledefinitionname)).FirstOrDefault();
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null)
{
upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0);
if (package.ExpiryDate != null && package.ExpiryDate.Value.Date != DateTime.MaxValue.Date)
{
if (string.IsNullOrEmpty(package.PaymentUrl))
{
link = "<span>" + package.ExpiryDate.Value.Date.ToString("MMM dd, yyyy") + "</span>";
}
else
{
link = "<a class=\"btn btn-primary\" style=\"text-decoration: none !important\" href=\"" + package.PaymentUrl + "\" target=\"_new\">" + package.ExpiryDate.Value.Date.ToString("MMM dd, yyyy") + "</a>";
}
}
}
}
return link;
}
private string SupportLink(string packagename, string version)
{
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && !string.IsNullOrEmpty(package.SupportUrl))
{
link += "<a class=\"btn btn-info\" style=\"text-decoration: none !important\" href=\"" + package.SupportUrl.Replace("{Version}", version) + "\" target=\"_new\">" + SharedLocalizer["Help"] + "</a>";
}
return upgradeavailable;
}
return link;
}
private async Task DownloadModule(string moduledefinitionname, string version)
private string UpgradeAvailable(string packagename, string version)
{
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0)
{
return package.Version;
}
}
return version;
}
private async Task DownloadModule(string packagename, string version)
{
try
{
await PackageService.DownloadPackageAsync(moduledefinitionname, version, "Modules");
await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", moduledefinitionname, version);
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ModuleDefinitionService.InstallModuleDefinitionsAsync();
await PackageService.DownloadPackageAsync(packagename, version);
await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", packagename, version);
AddModuleMessage(string.Format(Localizer["Success.Module.Install"], NavigateUrl("admin/system")), MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version} {Error}", moduledefinitionname, version, ex.Message);
AddModuleMessage("Error Downloading Module", MessageType.Error);
await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version} {Error}", packagename, version, ex.Message);
AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error);
}
}
@@ -100,15 +204,43 @@ else
{
try
{
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ModuleDefinitionService.DeleteModuleDefinitionAsync(moduleDefinition.ModuleDefinitionId, moduleDefinition.SiteId);
AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success);
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Module {ModuleDefinition} {Error}", moduleDefinition, ex.Message);
AddModuleMessage("Error Deleting Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Delete"], MessageType.Error);
}
}
private async Task CategoryChanged(ChangeEventArgs e)
{
_category = (string)e.Value;
await LoadModuleDefinitions();
}
private async Task Synchronize()
{
try
{
ShowProgressIndicator();
foreach (var moduleDefinition in _moduleDefinitions)
{
if (!string.IsNullOrEmpty(moduleDefinition.PackageName) && !_packages.Any(item => item.PackageId == moduleDefinition.PackageName))
{
var package = await PackageService.GetPackageAsync(moduleDefinition.PackageName, moduleDefinition.Version, false);
}
}
HideProgressIndicator();
AddModuleMessage(Localizer["Success.Module.Synchronize"], MessageType.Success);
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Synchronizing Modules {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Module.Synchronize"], MessageType.Error);
}
}
}

View File

@@ -1,33 +1,101 @@
@namespace Oqtane.Modules.Admin.Modules
@namespace Oqtane.Modules.Admin.Modules
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IModuleService ModuleService
@inject IStringLocalizer<Export> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Content" Heading="Content" ResourceKey="Content">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="content" HelpText="Select the Export option and you will be able to view the module content" ResourceKey="Content">Content: </Label>
<div class="col-sm-9">
<textarea id="content" class="form-control" @bind="@_content" rows="5" readonly></textarea>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="ExportText">@Localizer["Export"]</button>
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
</TabPanel>
<TabPanel Name="File" Heading="File" ResourceKey="File">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="folder" HelpText="Select a folder where you wish to save the exported content" ResourceKey="Folder">Folder: </Label>
<div class="col-sm-9">
<FileManager ShowFiles="false" ShowUpload="false" @ref="_filemanager" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="filename" HelpText="Specify a name for the file (without an extension)" ResourceKey="Filename">Filename: </Label>
<div class="col-sm-9">
<input id="content" type="text" class="form-control" @bind="@_filename" />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="ExportFile">@Localizer["Export"]</button>
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
</TabPanel>
</TabStrip>
<table class="table table-borderless">
<tbody>
<tr>
<td>
<Label For="content" HelpText="Enter the module content">Content: </Label>
</td>
<td>
<textarea id="content" class="form-control" @bind="@_content" rows="5"></textarea>
</td>
</tr>
</tbody>
</table>
<button type="button" class="btn btn-success" @onclick="ExportModule">Export</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@code {
private string _content = string.Empty;
private FileManager _filemanager;
private string _filename = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override string Title => "Export Module";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
public override string Title => "Export Content";
private async Task ExportModule()
protected override void OnInitialized()
{
_content = await ModuleService.ExportModuleAsync(ModuleState.ModuleId);
_filename = Utilities.GetFriendlyUrl(ModuleState.Title);
}
private async Task ExportText()
{
try
{
_content = await ModuleService.ExportModuleAsync(ModuleState.ModuleId, PageState.Page.PageId);
AddModuleMessage(Localizer["Success.Content.Export"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Exporting Module {ModuleId} {Error}", ModuleState.ModuleId, ex.Message);
AddModuleMessage(Localizer["Error.Module.Export"], MessageType.Error);
}
}
private async Task ExportFile()
{
try
{
var folderid = _filemanager.GetFolderId();
if (folderid != -1 && !string.IsNullOrEmpty(_filename))
{
var fileid = await ModuleService.ExportModuleAsync(ModuleState.ModuleId, PageState.Page.PageId, folderid, _filename);
if (fileid != -1)
{
AddModuleMessage(Localizer["Success.Content.Export"], MessageType.Success);
}
else
{
AddModuleMessage(Localizer["Error.Module.Export"], MessageType.Error);
}
}
else
{
AddModuleMessage(Localizer["Message.Content.Export"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Exporting Module {ModuleId} {Error}", ModuleState.ModuleId, ex.Message);
AddModuleMessage(Localizer["Error.Module.Export"], MessageType.Error);
}
}
}

View File

@@ -1,55 +1,80 @@
@namespace Oqtane.Modules.Admin.Modules
@namespace Oqtane.Modules.Admin.Modules
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IModuleService ModuleService
@inject IFileService FileService
@inject IStringLocalizer<Import> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tbody>
<tr>
<td>
<Label For="content" HelpText="Enter the module content">Content: </Label>
</td>
<td>
<textarea id="content" class="form-control" @bind="@_content" rows="5"></textarea>
</td>
</tr>
</tbody>
</table>
<button type="button" class="btn btn-success" @onclick="ImportModule">Import</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="file" HelpText="Optionally upload or select a file to import for this module" ResourceKey="File">File: </Label>
<div class="col-sm-9">
<FileManager Filter="json" OnSelectFile="OnSelectFile" />
</div>
</div>
<hr />
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="content" HelpText="Provide the module content to import" ResourceKey="Content">Content: </Label>
<div class="col-sm-9">
<textarea id="content" class="form-control" @bind="@_content" rows="5" required></textarea>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="ImportModule">@Localizer["Import"]</button>
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
</form>
@code {
private string _content = string.Empty;
private ElementReference form;
private bool validated = false;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override string Title => "Import Module";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
public override string Title => "Import Content";
private async Task OnSelectFile(int fileId)
{
var bytes = await FileService.DownloadFileAsync(fileId);
_content = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
}
private async Task ImportModule()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (_content != string.Empty)
{
try
{
bool success = await ModuleService.ImportModuleAsync(ModuleState.ModuleId, _content);
bool success = await ModuleService.ImportModuleAsync(ModuleState.ModuleId, PageState.Page.PageId, _content);
if (success)
{
AddModuleMessage("Content Imported Successfully", MessageType.Success);
AddModuleMessage(Localizer["Success.Content.Import"], MessageType.Success);
}
else
{
AddModuleMessage("A Problem Was Encountered Importing Content. Please Ensure The Content Is Formatted Correctly For The Module.", MessageType.Warning);
AddModuleMessage(Localizer["Message.Content.ImportProblem"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Importing Module {ModuleId} {Error}", ModuleState.ModuleId, ex.Message);
AddModuleMessage("Error Importing Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Import"], MessageType.Error);
}
}
else
{
AddModuleMessage("You Must Enter Some Content To Import", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.ImportContent"], MessageType.Warning);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -1,149 +1,295 @@
@namespace Oqtane.Modules.Admin.Modules
@namespace Oqtane.Modules.Admin.Modules
@using Oqtane.Interfaces
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IThemeService ThemeService
@inject IPageService PageService
@inject IModuleService ModuleService
@inject IPageModuleService PageModuleService
@inject IStringLocalizer<Settings> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Settings" Heading="Module Settings">
@if (_initialized)
{
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<TabStrip ActiveTab="@_activetab">
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings">
@if (_containers != null)
{
<table class="table table-borderless">
<tr>
<td>
<Label For="title" HelpText="Enter the title of the module">Title: </Label>
</td>
<td>
<input id="title" type="text" name="Title" class="form-control" @bind="@_title" />
</td>
</tr>
<tr>
<td>
<Label For="container" HelpText="Select the module's container">Container: </Label>
</td>
<td>
<select id="container" class="form-control" @bind="@_containerType">
<option value="-">&lt;Inherit From Page Or Site&gt;</option>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="module" HelpText="The name of the module" ResourceKey="Module">Module: </Label>
<div class="col-sm-9">
<input id="module" type="text" class="form-control" @bind="@_module" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="title" HelpText="Enter the title of the module" ResourceKey="Title">Title: </Label>
<div class="col-sm-9">
<input id="title" type="text" class="form-control" @bind="@_title" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pane" HelpText="The pane where the module will be displayed" ResourceKey="Pane">Pane: </Label>
<div class="col-sm-9">
<select class="form-select" @bind="@_pane">
@foreach (string pane in PageState.Page.Panes)
{
<option value="@pane">@pane Pane</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="container" HelpText="Select the module's container" ResourceKey="Container">Container: </Label>
<div class="col-sm-9">
<select id="container" class="form-select" @bind="@_containerType" required>
@foreach (var container in _containers)
{
<option value="@container.TypeName">@container.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="allpages" HelpText="Indicate if this module should be displayed on all pages">Display On All Pages? </Label>
</td>
<td>
<select id="allpages" class="form-control" @bind="@_allPages">
<option value="True">Yes</option>
<option value="False">No</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="effectiveDate" HelpText="The date that this module is active" ResourceKey="EffectiveDate">Effective Date: </Label>
<div class="col-sm-9">
<input type="date" id="effectiveDate" class="form-control" @bind="@_effectivedate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="expiryDate" HelpText="The date that this module expires" ResourceKey="ExpiryDate">Expiry Date: </Label>
<div class="col-sm-9">
<input type="date" id="expiryDate" class="form-control" @bind="@_expirydate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="allpages" HelpText="Indicate if this module should be displayed on all pages" ResourceKey="DisplayOnAllPages">Display On All Pages? </Label>
<div class="col-sm-9">
<select id="allpages" class="form-select" @bind="@_allPages" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="page" HelpText="The page that the module is on">Page: </Label>
</td>
<td>
<select id="page" class="form-control" @bind="@_pageId">
@foreach (Page p in PageState.Pages)
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="page" HelpText="The page that the module is located on" ResourceKey="Page">Page: </Label>
<div class="col-sm-9">
<select id="page" class="form-select" @bind="@_pageId" required>
@if (PageState.Page.UserId != null)
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions))
<option value="@PageState.Page.PageId">@(PageState.Page.Name)</option>
}
else
{
if (_pages != null)
{
foreach (Page p in _pages)
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, p.PermissionList))
{
<option value="@p.PageId">@(new string('-', p.Level * 2))@(p.Name)</option>
}
}
}
}
</select>
</td>
</tr>
</table>
</div>
</div>
</div>
<br />
<Section Name="ModuleContent" Heading="Content" ResourceKey="ModuleContent">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="moduleheader" HelpText="Optionally provide content to be injected above the module instance" ResourceKey="Header">Header: </Label>
<div class="col-sm-9">
<textarea id="moduleheader" class="form-control" @bind="@_header" rows="3" maxlength="4000"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="modulefooter" HelpText="Optionally provide content to be injected below the module instance" ResourceKey="Footer">Footer: </Label>
<div class="col-sm-9">
<textarea id="modulefooter" class="form-control" @bind="@_footer" rows="3" maxlength="4000"></textarea>
</div>
</div>
</div>
</Section>
}
</TabPanel>
<TabPanel Name="Permissions">
<TabPanel Name="Permissions" Heading="Permissions" ResourceKey="Permissions">
@if (_permissions != null)
{
<table class="table table-borderless">
<tr>
<td>
<PermissionGrid EntityName="@EntityNames.Module" PermissionNames="@_permissionNames" Permissions="@_permissions" @ref="_permissionGrid" />
</td>
</tr>
</table>
<div class="container">
<div class="row mb-1 align-items-center">
<PermissionGrid EntityName="@EntityNames.Module" PermissionNames="@_permissionNames" PermissionList="@_permissions" @ref="_permissionGrid" />
</div>
</div>
}
</TabPanel>
@if (_settingsModuleType != null)
@if (_moduleSettingsType != null)
{
<TabPanel Name="ModuleSettings" Heading="@_settingstitle">
@DynamicComponent
<TabPanel Name="ModuleSettings" Heading="@_moduleSettingsTitle" ResourceKey="ModuleSettings">
@ModuleSettingsComponent
</TabPanel>
}
</TabStrip>
<button type="button" class="btn btn-success" @onclick="SaveModule">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@if (_containerSettingsType != null)
{
<TabPanel Name="ContainerSettings" Heading="Container Settings" ResourceKey="ContainerSettings">
@ContainerSettingsComponent
</TabPanel>
}
</TabStrip>
<br />
<button type="button" class="btn btn-success" @onclick="SaveModule">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
<br />
<br />
<AuditInfo CreatedBy="@createdby" CreatedOn="@createdon" ModifiedBy="@modifiedby" ModifiedOn="@modifiedon"></AuditInfo>
</form>
}
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
private bool _initialized = false;
private ElementReference form;
private bool validated = false;
private List<ThemeControl> _containers = new List<ThemeControl>();
private string _module;
private string _title;
private string _pane;
private string _containerType;
private string _allPages = "false";
private string _header = "";
private string _footer = "";
private string _permissionNames = "";
private string _permissions = null;
private List<Permission> _permissions = null;
private string _pageId;
private PermissionGrid _permissionGrid;
private Type _settingsModuleType;
private string _settingstitle = "Other Settings";
private object _settings;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
public override string Title => "Module Settings";
private RenderFragment DynamicComponent { get; set; }
private Type _moduleSettingsType;
private object _moduleSettings;
private string _moduleSettingsTitle;
private RenderFragment ModuleSettingsComponent { get; set; }
private Type _containerSettingsType;
private object _containerSettings;
private RenderFragment ContainerSettingsComponent { get; set; }
private string createdby;
private DateTime createdon;
private string modifiedby;
private DateTime modifiedon;
private DateTime? _effectivedate = null;
private DateTime? _expirydate = null;
private List<Page> _pages;
private string _activetab = "";
protected override async Task OnInitializedAsync()
{
_title = ModuleState.Title;
_containers = ThemeService.GetContainerControls(await ThemeService.GetThemesAsync(), PageState.Page.ThemeType);
_containerType = ModuleState.ContainerType;
if (!string.IsNullOrEmpty(PageState.Page.DefaultContainerType) && _containerType == PageState.Page.DefaultContainerType)
{
_containerType = "-";
}
if (_containerType == PageState.Site.DefaultContainerType)
{
_containerType = "-";
}
_allPages = ModuleState.AllPages.ToString();
_permissions = ModuleState.Permissions;
_permissionNames = ModuleState.ModuleDefinition.PermissionNames;
_pageId = ModuleState.PageId.ToString();
SetModuleTitle(Localizer["ModuleSettings.Title"]);
_moduleSettingsTitle = Localizer["ModuleSettings.Heading"];
_settingsModuleType = Type.GetType(ModuleState.ModuleType);
if (_settingsModuleType != null)
_containers = ThemeService.GetContainerControls(PageState.Site.Themes, PageState.Page.ThemeType);
_pages = await PageService.GetPagesAsync(PageState.Site.SiteId);
var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId);
_pageId = pagemodule.PageId.ToString();
_title = pagemodule.Title;
_pane = pagemodule.Pane;
_containerType = pagemodule.ContainerType;
if (string.IsNullOrEmpty(_containerType))
{
var moduleobject = Activator.CreateInstance(_settingsModuleType) as IModuleControl;
_settingstitle = moduleobject.Title;
if (string.IsNullOrEmpty(_settingstitle))
_containerType = (!string.IsNullOrEmpty(PageState.Page.DefaultContainerType)) ? PageState.Page.DefaultContainerType : PageState.Site.DefaultContainerType;
}
_header = pagemodule.Header;
_footer = pagemodule.Footer;
_effectivedate = Utilities.UtcAsLocalDate(pagemodule.EffectiveDate);
_expirydate = Utilities.UtcAsLocalDate(pagemodule.ExpiryDate);
_allPages = pagemodule.Module.AllPages.ToString();
createdby = pagemodule.Module.CreatedBy;
createdon = pagemodule.Module.CreatedOn;
modifiedby = pagemodule.Module.ModifiedBy;
modifiedon = pagemodule.Module.ModifiedOn;
_permissions = pagemodule.Module.PermissionList;
if (pagemodule.Module.ModuleDefinition != null)
{
_settingstitle = "Other Settings";
_module = pagemodule.Module.ModuleDefinition.Name;
_permissionNames = pagemodule.Module.ModuleDefinition?.PermissionNames;
if (!string.IsNullOrEmpty(pagemodule.Module.ModuleDefinition.SettingsType))
{
// module settings type explicitly declared in IModule interface
_moduleSettingsType = Type.GetType(pagemodule.Module.ModuleDefinition.SettingsType);
}
else
{
// legacy support - module settings type determined by convention ( ie. existence of a "Settings.razor" component in module )
_moduleSettingsType = Type.GetType(pagemodule.Module.ModuleDefinition.ControlTypeTemplate.Replace(Constants.ActionToken, PageState.Action), false, true);
}
if (_moduleSettingsType != null)
{
var moduleobject = Activator.CreateInstance(_moduleSettingsType) as IModuleControl;
if (!string.IsNullOrEmpty(moduleobject.Title))
{
_moduleSettingsTitle = moduleobject.Title;
}
DynamicComponent = builder =>
ModuleSettingsComponent = builder =>
{
builder.OpenComponent(0, _settingsModuleType);
builder.AddComponentReferenceCapture(1, inst => { _settings = Convert.ChangeType(inst, _settingsModuleType); });
builder.OpenComponent(0, _moduleSettingsType);
builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary);
builder.AddComponentReferenceCapture(2, inst => { _moduleSettings = Convert.ChangeType(inst, _moduleSettingsType); });
builder.CloseComponent();
};
}
}
else
{
AddModuleMessage(string.Format(Localizer["Error.Module.Load"], pagemodule.Module.ModuleDefinitionName), MessageType.Error);
}
var theme = PageState.Site.Themes.FirstOrDefault(item => item.Containers.Any(themecontrol => themecontrol.TypeName.Equals(_containerType)));
if (theme != null && !string.IsNullOrEmpty(theme.ContainerSettingsType))
{
_containerSettingsType = Type.GetType(theme.ContainerSettingsType);
if (_containerSettingsType != null)
{
ContainerSettingsComponent = builder =>
{
builder.OpenComponent(0, _containerSettingsType);
builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary);
builder.AddComponentReferenceCapture(2, inst => { _containerSettings = Convert.ChangeType(inst, _containerSettingsType); });
builder.CloseComponent();
};
}
}
_initialized = true;
}
private async Task SaveModule()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (!string.IsNullOrEmpty(_title))
{
if (!Utilities.ValidateEffectiveExpiryDates(_effectivedate, _expirydate))
{
AddModuleMessage(SharedLocalizer["Message.EffectiveExpiryDateError"], MessageType.Warning);
return;
}
var pagemodule = await PageModuleService.GetPageModuleAsync(ModuleState.PageModuleId);
pagemodule.PageId = int.Parse(_pageId);
pagemodule.Title = _title;
pagemodule.Pane = _pane;
pagemodule.EffectiveDate = Utilities.LocalDateAndTimeAsUtc(_effectivedate);
pagemodule.ExpiryDate = Utilities.LocalDateAndTimeAsUtc(_expirydate);
pagemodule.ContainerType = (_containerType != "-") ? _containerType : string.Empty;
if (!string.IsNullOrEmpty(pagemodule.ContainerType) && pagemodule.ContainerType == PageState.Page.DefaultContainerType)
{
@@ -153,24 +299,48 @@
{
pagemodule.ContainerType = string.Empty;
}
pagemodule.Header = _header;
pagemodule.Footer = _footer;
await PageModuleService.UpdatePageModuleAsync(pagemodule);
await PageModuleService.UpdatePageModuleOrderAsync(pagemodule.PageId, pagemodule.Pane);
var module = ModuleState;
var module = await ModuleService.GetModuleAsync(ModuleState.ModuleId);
module.AllPages = bool.Parse(_allPages);
module.Permissions = _permissionGrid.GetPermissions();
module.PageModuleId = ModuleState.PageModuleId;
module.PermissionList = _permissionGrid.GetPermissionList();
await ModuleService.UpdateModuleAsync(module);
if (_settingsModuleType != null)
if (_moduleSettingsType != null)
{
var moduleType = Type.GetType(ModuleState.ModuleType);
if (moduleType != null)
if (_moduleSettings is ISettingsControl moduleSettingsControl)
{
moduleType.GetMethod("UpdateSettings")?.Invoke(_settings, null); // method must be public in settings component
// module settings updated using explicit interface
await moduleSettingsControl.UpdateSettings();
}
else
{
// legacy support - module settings updated by convention ( ie. by calling a public method named "UpdateSettings" in settings component )
_moduleSettings?.GetType().GetMethod("UpdateSettings")?.Invoke(_moduleSettings, null);
}
}
NavigationManager.NavigateTo(NavigateUrl());
if (_containerSettingsType != null && _containerSettings is ISettingsControl containerSettingsControl)
{
await containerSettingsControl.UpdateSettings();
}
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
else
{
_activetab = "Settings";
AddModuleMessage(Localizer["Message.Required.Title"], MessageType.Warning);
}
}
else
{
_activetab = "Settings";
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -1,112 +1,164 @@
@namespace Oqtane.Modules.Admin.Pages
@namespace Oqtane.Modules.Admin.Pages
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IPageService PageService
@inject IThemeService ThemeService
@inject ISystemService SystemService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Settings">
@if (_themeList != null)
@if (_initialized)
{
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<TabStrip Refresh="@_refresh">
<TabPanel Name="Settings" ResourceKey="Settings" Heading="Settings">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the page name" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="50" required />
</div>
</div>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
<table class="table table-borderless">
<tr>
<td>
<Label For="Name" HelpText="Enter the page name">Name: </Label>
</td>
<td>
<input id="Name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="Parent" HelpText="Select the parent for the page in the site hierarchy">Parent: </Label>
</td>
<td>
<select id="Parent" class="form-control" @onchange="(e => ParentChanged(e))">
<option value="-1">&lt;Site Root&gt;</option>
@foreach (Page page in _pageList)
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="parent" HelpText="Select the parent for the page in the site hierarchy" ResourceKey="Parent">Parent: </Label>
<div class="col-sm-9">
<select id="parent" class="form-select" value="@_parentid" @onchange="(e => ParentChanged(e))" required>
<option value="-1">&lt;@Localizer["SiteRoot"]&gt;</option>
@foreach (Page page in _pages)
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, page.PermissionList))
{
<option value="@(page.PageId)">@(new string('-', page.Level * 2))@(page.Name)</option>
}
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="Insert" HelpText="Select the location where you would like the page to be inserted in relation to other pages">Insert: </Label>
</td>
<td>
<select id="Insert" class="form-control" @bind="@_insert">
<option value="<<">At Beginning</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="insert" HelpText="Select the location where you would like the page to be inserted in relation to other pages" ResourceKey="Insert">Insert: </Label>
<div class="col-sm-9">
<select id="insert" class="form-select" @bind="@_insert" required>
@if (_children != null && _children.Count > 0)
{
<option value="<">Before</option>
<option value=">">After</option>
<option value="<<">@Localizer["AtBeginning"]</option>
<option value="<">@Localizer["Before"]</option>
<option value=">">@Localizer["After"]</option>
}
<option value=">>">At End</option>
<option value=">>">@Localizer["AtEnd"]</option>
</select>
@if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">"))
{
<select class="form-control" @bind="@_childid">
<option value="-1">&lt;Select Page&gt;</option>
<select class="form-select" @bind="@_childid">
<option value="-1">&lt;@Localizer["Page.Select"]&gt;</option>
@foreach (Page page in _children)
{
<option value="@(page.PageId)">@(page.Name)</option>
}
</select>
}
</td>
</tr>
<tr>
<td>
<Label For="Navigation" HelpText="Select whether the page is part of the site navigation or hidden">Navigation? </Label>
</td>
<td>
<select id="Navigation" class="form-control" @bind="@_isnavigation">
<option value="True">Yes</option>
<option value="False">No</option>
</div>
</div>
}
else
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="parent" HelpText="Select the parent for the page in the site hierarchy" ResourceKey="Parent">Parent: </Label>
<div class="col-sm-9">
<select id="parent" class="form-select" @onchange="(e => ParentChanged(e))" required>
<option value="@(_parent.PageId)">@(new string('-', _parent.Level * 2))@(_parent.Name)</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="Path" HelpText="Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used.">Url Path: </Label>
</td>
<td>
<input id="Path" class="form-control" @bind="@_path" />
</td>
</tr>
<tr>
<td>
<Label For="Url" HelpText="Optionally enter a url which this page should redirect to when a user navigates to it">Redirect: </Label>
</td>
<td>
<input id="Url" class="form-control" @bind="@_url" />
</td>
</tr>
</table>
<Section Name="Appearance">
<table class="table table-borderless">
<tr>
<td>
<Label For="Title" HelpText="Optionally enter the page title. If you do not provide a page title, the page name will be used.">Title: </Label>
</td>
<td>
<input id="Title" class="form-control" @bind="@_title" />
</td>
</tr>
<tr>
<td>
<Label For="Theme" HelpText="Select the theme for this page">Theme: </Label>
</td>
<td>
<select id="Theme" class="form-control" @onchange="(e => ThemeChanged(e))">
<option value="-">&lt;Inherit From Site&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="insert" HelpText="Select the location where you would like the page to be inserted in relation to other pages" ResourceKey="Insert">Insert: </Label>
<div class="col-sm-9">
<select id="insert" class="form-select" @bind="@_insert" required>
<option value=">>">@Localizer["AtEnd"]</option>
</select>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="navigation" HelpText="Select whether the page is part of the site navigation or hidden" ResourceKey="Navigation">Navigation? </Label>
<div class="col-sm-9">
<select id="navigation" class="form-select" @bind="@_isnavigation" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="clickable" HelpText="Select whether the link in the site navigation is enabled or disabled" ResourceKey="Clickable">Clickable? </Label>
<div class="col-sm-9">
<select id="clickable" class="form-select" @bind="@_isclickable" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="path" HelpText="Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. If the page is intended to be the root path specify '/'." ResourceKey="UrlPath">Url Path: </Label>
<div class="col-sm-9">
<input id="path" class="form-control" @bind="@_path" maxlength="256" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="Optionally enter a url which this page should redirect to when a user navigates to it" ResourceKey="Redirect">Redirect: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" maxlength="500" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="icon" HelpText="Optionally provide an icon class name for this page which will be displayed in the site navigation" ResourceKey="Icon">Icon: </Label>
<div class="col-sm-8">
<InputList Value="@_icon" ValueChanged="IconChanged" DataList="@_icons" ResourceKey="Icon" ResourceType="@_iconresources" />
</div>
<div class="col-sm-1">
<i class="@_icon"></i>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="effectiveDate" HelpText="The date that this page is active" ResourceKey="EffectiveDate">Effective Date: </Label>
<div class="col-sm-9">
<input type="date" id="effectiveDate" class="form-control" @bind="@_effectivedate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="expiryDate" HelpText="The date that this page expires" ResourceKey="ExpiryDate">Expiry Date: </Label>
<div class="col-sm-9">
<input type="date" id="expiryDate" class="form-control" @bind="@_expirydate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="personalizable" HelpText="Select whether you would like users to be able to personalize this page with their own content" ResourceKey="Personalizable">Personalizable? </Label>
<div class="col-sm-9">
<select id="personalizable" class="form-select" @bind="@_ispersonalizable" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<Section Name="Appearance" ResourceKey="Appearance" Heading=@Localizer["Appearance.Name"]>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="title" HelpText="Optionally enter the page title. If you do not provide a page title, the page name will be used." ResourceKey="Title">Title: </Label>
<div class="col-sm-9">
<input id="title" class="form-control" @bind="@_title" maxlength="200" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="theme" HelpText="Select the theme for this page" ResourceKey="Theme">Theme: </Label>
<div class="col-sm-9">
<select id="theme" class="form-select" value="@_themetype" @onchange="(e => ThemeChanged(e))" required>
@foreach (var theme in _themes)
{
if (theme.TypeName == _themetype)
@if (theme.TypeName == PageState.Site.DefaultThemeType)
{
<option value="@theme.TypeName" selected>@theme.Name</option>
<option value="@theme.TypeName">*@theme.Name*</option>
}
else
{
@@ -114,122 +166,134 @@
}
}
</select>
</td>
</tr>
@if (_layouts.Count > 0)
{
<tr>
<td>
<Label For="Layout" HelpText="Select a layout for the page (if the selected theme supports it)">Layout: </Label>
</td>
<td>
<select id="Layout" class="form-control" @bind="@_layouttype">
<option value="-">&lt;Inherit From Site&gt;</option>
@foreach (var layout in _layouts)
{
if (layout.TypeName == _layouttype)
{
<option value="@(layout.TypeName)" selected>@(layout.Name)</option>
}
else
{
<option value="@(layout.TypeName)">@(layout.Name)</option>
}
}
</select>
</td>
</tr>
}
<tr>
<td>
<Label For="defaultContainer" HelpText="Select the default container for the page">Default Container: </Label>
</td>
<td>
<select id="defaultContainer" class="form-control" @bind="@_containertype">
<option value="-">&lt;Inherit From Site&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="container" HelpText="Select the default container for the page" ResourceKey="DefaultContainer">Default Container: </Label>
<div class="col-sm-9">
<select id="container" class="form-select" @bind="@_containertype" required>
@foreach (var container in _containers)
{
<option value="@container.TypeName">@container.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="Icon" HelpText="Optionally provide an icon for this page which will be displayed in the site navigation">Icon: </Label>
</td>
<td>
<input id="Icon" class="form-control" @bind="@_icon" />
</td>
</tr>
<tr>
<td>
<Label For="Personalizable" HelpText="Select whether you would like users to be able to personalize this page with their own content">Personalizable? </Label>
</td>
<td>
<select id="Personalizable" class="form-control" @bind="@_ispersonalizable">
<option value="True">Yes</option>
<option value="False">No</option>
</select>
</td>
</tr>
</table>
</div>
</div>
</div>
</Section>
<Section Name="PageContent" ResourceKey="PageContent" Heading=@Localizer["PageContent.Heading"]>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="headcontent" HelpText="Optionally enter content to be included in the page head (ie. meta, link, or script tags)" ResourceKey="HeadContent">Head Content: </Label>
<div class="col-sm-9">
<textarea id="headcontent" class="form-control" @bind="@_headcontent" rows="3" maxlength="4000"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="bodycontent" HelpText="Optionally enter content to be included in the page body (ie. script tags)" ResourceKey="BodyContent">Body Content: </Label>
<div class="col-sm-9">
<textarea id="bodycontent" class="form-control" @bind="@_bodycontent" rows="3" maxlength="4000"></textarea>
</div>
</div>
</div>
</Section>
}
</TabPanel>
<TabPanel Name="Permissions">
<table class="table table-borderless">
<tr>
<td>
<TabPanel Name="Permissions" ResourceKey="Permissions" Heading=@Localizer["Permissions.Heading"]>
<div class="container">
<div class="row mb-1 align-items-center">
<PermissionGrid EntityName="@EntityNames.Page" Permissions="@_permissions" @ref="_permissionGrid" />
</td>
</tr>
</table>
</div>
</div>
</TabPanel>
</TabStrip>
<button type="button" class="btn btn-success" @onclick="SavePage">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</TabStrip>
<br />
<button type="button" class="btn btn-success" @onclick="SavePage">@SharedLocalizer["Save"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
</form>
}
@code {
private List<Theme> _themeList;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
private bool _initialized = false;
private ElementReference form;
private bool validated = false;
private List<ThemeControl> _themes = new List<ThemeControl>();
private List<ThemeControl> _layouts = new List<ThemeControl>();
private List<ThemeControl> _containers = new List<ThemeControl>();
private List<Page> _pageList;
private List<Page> _pages;
private int _pageId;
private string _name;
private string _title;
private string _path = string.Empty;
private string _parentid;
private string _parentid = "-1";
private string _insert = ">>";
private List<Page> _children;
private int _childid = -1;
private string _isnavigation = "True";
private string _isclickable = "True";
private string _path = string.Empty;
private string _url;
private string _ispersonalizable = "False";
private string _themetype = "-";
private string _layouttype = "-";
private string _containertype = "-";
private string _title;
private string _icon = string.Empty;
private string _permissions = string.Empty;
private string _themetype = string.Empty;
private string _containertype = string.Empty;
private string _headcontent;
private string _bodycontent;
private string _permissions = null;
private PermissionGrid _permissionGrid;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private bool _refresh = false;
protected Page _parent = null;
protected Dictionary<string, string> _icons;
private string _iconresources = "";
private DateTime? _effectivedate = null;
private DateTime? _expirydate = null;
protected override async Task OnInitializedAsync()
{
try
{
_themeList = await ThemeService.GetThemesAsync();
_pageList = PageState.Pages;
_children = PageState.Pages.Where(item => item.ParentId == null).ToList();
_pages = await PageService.GetPagesAsync(PageState.Site.SiteId);
_themes = ThemeService.GetThemeControls(_themeList);
_permissions = string.Empty;
if (PageState.QueryString.ContainsKey("id"))
{
_pageId = Int32.Parse(PageState.QueryString["id"]);
_parent = await PageService.GetPageAsync(_pageId);
if (_parent != null)
{
_parentid = _parent.PageId.ToString();
}
}
_icons = await SystemService.GetIconsAsync();
_iconresources = typeof(IconResources).FullName;
// if admin or user has edit access to parent page
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin) || (_parent != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, _parent.PermissionList)))
{
_themetype = PageState.Site.DefaultThemeType;
_themes = ThemeService.GetThemeControls(PageState.Site.Themes);
_containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype);
_containertype = PageState.Site.DefaultContainerType;
_children = new List<Page>();
foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid))))
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList))
{
_children.Add(p);
}
}
_effectivedate = Utilities.UtcAsLocalDate(PageState.Page.EffectiveDate);
_expirydate = Utilities.UtcAsLocalDate(PageState.Page.ExpiryDate);
_initialized = true;
}
else
{
await logger.LogWarning("Error Loading Page {ParentId}", _parentid);
AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Initializing Page {Error}", ex.Message);
AddModuleMessage("Error Initializing Page", MessageType.Error);
await logger.LogError(ex, "Error Loading Page {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error);
}
}
@@ -239,91 +303,88 @@
{
_parentid = (string)e.Value;
_children = new List<Page>();
if (_parentid == "-1")
foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid))))
{
foreach (Page p in PageState.Pages.Where(item => item.ParentId == null))
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions))
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList))
{
_children.Add(p);
}
}
}
else
{
foreach (Page p in PageState.Pages.Where(item => item.ParentId == int.Parse(_parentid)))
{
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions))
{
_children.Add(p);
}
}
}
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Child Pages For Parent {PageId} {Error}", _parentid, ex.Message);
AddModuleMessage("Error Loading Child Pages For Parent", MessageType.Error);
AddModuleMessage(Localizer["Error.ChildPage.Load"], MessageType.Error);
await ScrollToPageTop();
}
}
private async void ThemeChanged(ChangeEventArgs e)
{
try
private async Task ThemeChanged(ChangeEventArgs e)
{
_themetype = (string)e.Value;
if (_themetype != "-")
{
_layouts = ThemeService.GetLayoutControls(_themeList, _themetype);
_containers = ThemeService.GetContainerControls(_themeList, _themetype);
}
else
{
_layouts = new List<ThemeControl>();
_containers = new List<ThemeControl>();
}
_layouttype = "-";
_containertype = "-";
_containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype);
_containertype = _containers.First().TypeName;
StateHasChanged();
}
catch (Exception ex)
// if theme chosen is different than default site theme, display warning message to user
if (ThemeService.GetTheme(PageState.Site.Themes, _themetype)?.ThemeName != ThemeService.GetTheme(PageState.Site.Themes, PageState.Site.DefaultThemeType)?.ThemeName)
{
await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message);
AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error);
AddModuleMessage(Localizer["ThemeChanged.Message"], MessageType.Warning);
await ScrollToPageTop();
}
}
private async Task SavePage()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
Page page = null;
try
{
if (_name != string.Empty && !string.IsNullOrEmpty(_themetype) && (_layouts.Count == 0 || !string.IsNullOrEmpty(_layouttype)))
if (!Utilities.ValidateEffectiveExpiryDates(_effectivedate, _expirydate))
{
AddModuleMessage(SharedLocalizer["Message.EffectiveExpiryDateError"], MessageType.Warning);
await ScrollToPageTop();
return;
}
if (!string.IsNullOrEmpty(_themetype) && !string.IsNullOrEmpty(_containertype))
{
page = new Page();
page.SiteId = PageState.Page.SiteId;
page.Name = _name;
page.Title = _title;
if (_path == "")
if (_parentid == "-1")
{
page.ParentId = null;
}
else
{
page.ParentId = Int32.Parse(_parentid);
}
if (string.IsNullOrEmpty(_path))
{
_path = _name;
}
if (_path.Contains("/"))
{
if (_path.EndsWith("/") && _path != "/")
{
_path = _path.Substring(0, _path.Length - 1);
}
_path = _path.Substring(_path.LastIndexOf("/") + 1);
}
if (string.IsNullOrEmpty(_parentid))
if (_parentid == "-1")
{
page.ParentId = null;
page.Path = Utilities.GetFriendlyUrl(_path);
}
else
{
page.ParentId = Int32.Parse(_parentid);
var parent = PageState.Pages.Where(item => item.PageId == page.ParentId).FirstOrDefault();
Page parent = _pages.FirstOrDefault(item => item.PageId == page.ParentId);
if (parent.Path == string.Empty)
{
page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path);
@@ -334,9 +395,17 @@
}
}
if (!PagePathIsUnique(page.Path, page.SiteId, _pageList))
if (_pages.Any(item => item.Path == page.Path))
{
AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning);
AddModuleMessage(string.Format(Localizer["Message.Page.Exists"], _path), MessageType.Warning);
await ScrollToPageTop();
return;
}
if (page.ParentId == null && Constants.ReservedRoutes.Contains(page.Name.ToLower()))
{
AddModuleMessage(string.Format(Localizer["Message.Page.Reserved"], page.Name), MessageType.Warning);
await ScrollToPageTop();
return;
}
@@ -347,11 +416,11 @@
page.Order = 0;
break;
case "<":
child = PageState.Pages.Where(item => item.PageId == _childid).FirstOrDefault();
child = _pages.Where(item => item.PageId == _childid).FirstOrDefault();
page.Order = child.Order - 1;
break;
case ">":
child = PageState.Pages.Where(item => item.PageId == _childid).FirstOrDefault();
child = _pages.Where(item => item.PageId == _childid).FirstOrDefault();
page.Order = child.Order + 1;
break;
case ">>":
@@ -360,48 +429,81 @@
}
page.IsNavigation = (_isnavigation == null ? true : Boolean.Parse(_isnavigation));
page.IsClickable = (_isclickable == null ? true : Boolean.Parse(_isclickable));
page.Url = _url;
page.ThemeType = (_themetype != "-") ? _themetype : string.Empty;
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
page.EffectiveDate = Utilities.LocalDateAndTimeAsUtc(_effectivedate);
page.ExpiryDate = Utilities.LocalDateAndTimeAsUtc(_expirydate);
page.UserId = null;
// appearance
page.Title = _title;
page.Icon = (_icon == null ? string.Empty : _icon);
page.ThemeType = _themetype;
if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType)
{
page.ThemeType = string.Empty;
}
page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty;
if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType)
{
page.LayoutType = string.Empty;
}
page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty;
page.DefaultContainerType = _containertype;
if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType)
{
page.DefaultContainerType = string.Empty;
}
page.Icon = (_icon == null ? string.Empty : _icon);
page.Permissions = _permissionGrid.GetPermissions();
page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable));
page.UserId = null;
// page content
page.HeadContent = _headcontent;
page.BodyContent = _bodycontent;
// permissions
page.PermissionList = _permissionGrid.GetPermissionList();
page = await PageService.AddPageAsync(page);
await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId);
await logger.LogInformation("Page Added {Page}", page);
NavigationManager.NavigateTo(NavigateUrl(page.Path));
if (!string.IsNullOrEmpty(PageState.ReturnUrl))
{
NavigationManager.NavigateTo(NavigateUrl(page.Path), true); // redirect to page added and reload
}
else
{
AddModuleMessage("You Must Provide Page Name And Theme", MessageType.Warning);
NavigationManager.NavigateTo(NavigateUrl()); // redirect to page management
}
}
else
{
AddModuleMessage(Localizer["Message.Required.PageInfo"], MessageType.Warning);
await ScrollToPageTop();
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Page {Page} {Error}", page, ex.Message);
AddModuleMessage("Error Saving Page", MessageType.Error);
AddModuleMessage(Localizer["Error.Page.Save"], MessageType.Error);
await ScrollToPageTop();
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
await ScrollToPageTop();
}
}
private static bool PagePathIsUnique(string pagePath, int siteId, List<Page> existingPages)
private void Cancel()
{
return !existingPages.Any(page => page.SiteId == siteId && page.Path == pagePath);
if (!string.IsNullOrEmpty(PageState.ReturnUrl))
{
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
else
{
NavigationManager.NavigateTo(NavigateUrl());
}
}
private void IconChanged(string NewIcon)
{
_icon = NewIcon;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,25 @@
@namespace Oqtane.Modules.Admin.Pages
@namespace Oqtane.Modules.Admin.Pages
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IPageService PageService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (PageState.Pages != null)
@if (_pages != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
<ActionLink Action="Add" Text="Add Page" />
<ActionLink Action="Add" Text="Add Page" ResourceKey="AddPage" />
<Pager Items="@PageState.Pages.Where(item => !item.IsDeleted)">
<Pager Items="@_pages.Where(item => !item.IsDeleted)" SearchProperties="Name">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th style="width: 1px;">&nbsp;</th>
<th>@SharedLocalizer["Name"]</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.PageId.ToString())" /></td>
<td><ActionDialog Header="Delete Page" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Page?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.PageId.ToString())" ResourceKey="EditPage" /></td>
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
<td><button type="button" class="btn btn-secondary" @onclick="@(async () => NavigationManager.NavigateTo(Browse(context)))">@Localizer["Browse"]</button></td>
<td>@(new string('-', context.Level * 2))@(context.Name)</td>
</Row>
</Pager>
@@ -24,6 +28,21 @@
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private List<Page> _pages;
protected override async Task OnInitializedAsync()
{
try
{
_pages = await PageService.GetPagesAsync(PageState.Site.SiteId);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Pages {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error);
}
}
private async Task DeletePage(Page page)
{
try
@@ -37,7 +56,11 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Page {Page} {Error}", page, ex.Message);
AddModuleMessage("Error Deleting Page", MessageType.Error);
AddModuleMessage(Localizer["Error.Page.Delete"], MessageType.Error);
}
}
protected string Browse(Page page)
{
return string.IsNullOrEmpty(page.Url) ? NavigateUrl(page.Path) : page.Url;
}
}

View File

@@ -1,104 +1,131 @@
@namespace Oqtane.Modules.Admin.Profiles
@namespace Oqtane.Modules.Admin.Profiles
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IProfileService ProfileService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="The name of this field">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="title" HelpText="The title of the field">Title: </Label>
</td>
<td>
<input id="title" class="form-control" @bind="@_title" />
</td>
</tr>
<tr>
<td>
<Label For="description" HelpText="What the profile field is">Description: </Label>
</td>
<td>
<textarea id="description" class="form-control" @bind="@_description" rows="5"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="category" HelpText="What larger category does this field belong to">Category: </Label>
</td>
<td>
<input id="category" class="form-control" @bind="@_category" />
</td>
</tr>
<tr>
<td>
<Label For="order" HelpText="What place is this field in a larger category list">Order: </Label>
</td>
<td>
<input id="order" class="form-control" @bind="@_vieworder" />
</td>
</tr>
<tr>
<td>
<Label For="length" HelpText="What is the max amount of characters should this field accept">Length: </Label>
</td>
<td>
<input id="length" class="form-control" @bind="@_maxlength" />
</td>
</tr>
<tr>
<td>
<Label For="defaultVal" HelpText="What value do you want this field to start with">Default Value: </Label>
</td>
<td>
<input id="defaultVal" class="form-control" @bind="@_defaultvalue" />
</td>
</tr>
<tr>
<td>
<Label For="required" HelpText="Is a user required to input something into this field?">Required? </Label>
</td>
<td>
<select id="required" class="form-control" @bind="@_isrequired">
<option value="True">Yes</option>
<option value="False">No</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="The name of this profile item" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="50" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="title" HelpText="The title of the profile item to display to the user" ResourceKey="Title">Title: </Label>
<div class="col-sm-9">
<input id="title" class="form-control" @bind="@_title" maxlength="50" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="The help text displayed to the user for this profile item" ResourceKey="Description">Description: </Label>
<div class="col-sm-9">
<textarea id="description" class="form-control" @bind="@_description" rows="3" maxlength="256" required></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="category" HelpText="The category of this profile item (for grouping)" ResourceKey="Category">Category: </Label>
<div class="col-sm-9">
<input id="category" class="form-control" @bind="@_category" maxlength="50" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="order" HelpText="The index order of where this profile item should be displayed" ResourceKey="Order">Order: </Label>
<div class="col-sm-9">
<input id="order" class="form-control" @bind="@_vieworder" min="0" max="9999" type="number" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="length" HelpText="The max number of characters this profile item should accept (enter zero for unlimited)" ResourceKey="Length">Length: </Label>
<div class="col-sm-9">
<input id="length" class="form-control" @bind="@_maxlength" min="0" max="524288" type="number" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="rows" HelpText="The number of rows for text entry (one is the default)" ResourceKey="Rows">Rows: </Label>
<div class="col-sm-9">
<input id="rows" class="form-control" @bind="@_rows" min="1" max="10" type="number" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="defaultVal" HelpText="The default value for this profile item" ResourceKey="DefaultValue">Default Value: </Label>
<div class="col-sm-9">
<input id="defaultVal" class="form-control" @bind="@_defaultvalue" maxlength="2000" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="options" HelpText="A comma delimited list of options the user can select from" ResourceKey="Options">Options: </Label>
<div class="col-sm-9">
<input id="options" class="form-control" @bind="@_options" maxlength="2000" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="required" HelpText="Should a user be required to provide a value for this profile item?" ResourceKey="Required">Required? </Label>
<div class="col-sm-9">
<select id="required" class="form-select" @bind="@_isrequired" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="private" HelpText="Is this field private?">Private? </Label>
</td>
<td>
<select id="private" class="form-control" @bind="@_isprivate">
<option value="True">Yes</option>
<option value="False">No</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="validation" HelpText="Optionally provide a regular expression (RegExp) for validating the value entered" ResourceKey="Validation">Validation: </Label>
<div class="col-sm-9">
<input id="validation" class="form-control" @bind="@_validation" maxlength="200" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="autocomplete" HelpText="The HTML autocomplete attribute allows you to specify browser behavior for automated user assistance in filling out form field values. Allowable values are blank (default), 'on', 'off', or any value from the standardized taxonomy defined for this attribute." ResourceKey="Autocomplete">Autocomplete: </Label>
<div class="col-sm-9">
<input id="autocomplete" class="form-control" @bind="@_autocomplete" maxlength="30" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="private" HelpText="Should this profile item be visible to all users?" ResourceKey="Private">Private? </Label>
<div class="col-sm-9">
<select id="private" class="form-select" @bind="@_isprivate" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveProfile">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveProfile">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@if (PageState.QueryString.ContainsKey("id"))
{
<br />
<br />
<AuditInfo CreatedBy="@createdby" CreatedOn="@createdon" ModifiedBy="@modifiedby" ModifiedOn="@modifiedon"></AuditInfo>
}
</form>
@code {
private int _profileid = -1;
private ElementReference form;
private bool validated = false;
private string _name = string.Empty;
private string _title = string.Empty;
private string _description = string.Empty;
private string _category = string.Empty;
private string _vieworder = "0";
private string _maxlength = "0";
private string _rows = "1";
private string _defaultvalue = string.Empty;
private string _options = string.Empty;
private string _validation = string.Empty;
private string _autocomplete = string.Empty;
private string _isrequired = "False";
private string _isprivate = "False";
private string createdby;
private DateTime createdon;
private string modifiedby;
private DateTime modifiedon;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
public override string Actions => "Add,Edit";
@@ -118,20 +145,32 @@
_category = profile.Category;
_vieworder = profile.ViewOrder.ToString();
_maxlength = profile.MaxLength.ToString();
_rows = profile.Rows.ToString();
_defaultvalue = profile.DefaultValue;
_options = profile.Options;
_validation = profile.Validation;
_autocomplete = profile.Autocomplete;
_isrequired = profile.IsRequired.ToString();
_isprivate = profile.IsPrivate.ToString();
createdby = profile.CreatedBy;
createdon = profile.CreatedOn;
modifiedby = profile.ModifiedBy;
modifiedon = profile.ModifiedOn;
}
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Profile {ProfileId} {Error}", _profileid, ex.Message);
AddModuleMessage("Error Loading Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Load"], MessageType.Error);
}
}
private async Task SaveProfile()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
@@ -145,19 +184,26 @@
profile = new Profile();
}
profile.SiteId = PageState.Site.SiteId;
profile.Name = _name;
profile.Title = _title;
profile.Description = _description;
profile.Category = _category;
profile.ViewOrder = int.Parse(_vieworder);
profile.MaxLength = int.Parse(_maxlength);
profile.Rows = int.Parse(_rows);
profile.DefaultValue = _defaultvalue;
profile.Options = _options;
profile.Validation = _validation;
profile.Autocomplete = _autocomplete;
profile.IsRequired = (_isrequired == null ? false : Boolean.Parse(_isrequired));
profile.IsPrivate = (_isprivate == null ? false : Boolean.Parse(_isprivate));
if (_profileid != -1)
{
profile = await ProfileService.UpdateProfileAsync(profile);
}else
}
else
{
profile = await ProfileService.AddProfileAsync(profile);
}
@@ -168,7 +214,12 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Profile {ProfleId} {Error}", _profileid, ex.Message);
AddModuleMessage("Error Saving Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Save"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -1,25 +1,33 @@
@namespace Oqtane.Modules.Admin.Profiles
@namespace Oqtane.Modules.Admin.Profiles
@inherits ModuleBase
@inject IProfileService ProfileService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_profiles == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Security="SecurityAccessLevel.Admin" Text="Add Profile" />
<ActionLink Action="Add" Text="Add Profile" Security="SecurityAccessLevel.Edit" ResourceKey="AddProfile" />
<Pager Items="@_profiles">
<Pager Items="@_profiles" SearchProperties="Title,Category">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>@SharedLocalizer["Name"]</th>
<th>@Localizer["Title"]</th>
<th>@Localizer["Category"]</th>
<th>@Localizer["Order"]</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.ProfileId.ToString())" /></td>
<td><ActionDialog Header="Delete Profile" Message="@("Are You Sure You Wish To Delete " + context.Name + "?")" Action="Delete" Class="btn btn-danger" OnClick="@(async () => await DeleteProfile(context.ProfileId))" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.ProfileId.ToString())" Security="SecurityAccessLevel.Edit" ResourceKey="EditProfile" /></td>
<td><ActionDialog Header="Delete Profile" Message="@string.Format(Localizer["Confirm.Profile.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteProfile(context.ProfileId))" ResourceKey="DeleteProfile" /></td>
<td>@context.Name</td>
<td>@context.Title</td>
<td>@context.Category</td>
<td>@context.ViewOrder</td>
</Row>
</Pager>
}
@@ -27,11 +35,11 @@ else
@code {
private List<Profile> _profiles;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
protected override async Task OnInitializedAsync()
protected override async Task OnParametersSetAsync()
{
_profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId);
await GetProfilesAsync();
}
private async Task DeleteProfile(int profileId)
@@ -40,12 +48,22 @@ else
{
await ProfileService.DeleteProfileAsync(profileId);
await logger.LogInformation("Profile Deleted {ProfileId}", profileId);
AddModuleMessage("Profile Deleted", MessageType.Success);
AddModuleMessage(Localizer["Success.Profile.Delete"], MessageType.Success);
await GetProfilesAsync();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Profile {ProfileId} {Error}", profileId, ex.Message);
AddModuleMessage("Error Deleting Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Delete"], MessageType.Error);
}
}
private async Task GetProfilesAsync()
{
_profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId);
}
}

View File

@@ -0,0 +1,20 @@
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.Admin.Profiles
{
[PrivateApi("Mark this as private, since it's not very useful in the public docs")]
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "Profiles",
Description = "Manage Profiles",
Categories = "Admin",
Version = Constants.Version,
PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
$"{EntityNames.Profile}:{PermissionNames.Write}:{RoleNames.Admin}"
};
}
}

View File

@@ -1,71 +1,85 @@
@namespace Oqtane.Modules.Admin.RecycleBin
@namespace Oqtane.Modules.Admin.RecycleBin
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IPageModuleService PageModuleService
@inject IModuleService ModuleService
@inject IPageService PageService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Pages">
@if (_pages == null)
@if (_pages == null || _modules == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<TabStrip>
<TabPanel Name="Pages" ResourceKey="Pages" Heading="Pages">
@if (!_pages.Where(item => item.IsDeleted).Any())
{
<br />
<p>No Deleted Pages</p>
<p>@Localizer["NoPage.Deleted"]</p>
}
else
{
<Pager Items="@_pages">
<Pager Items="@_pages.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pagePage.ToString()" OnPageChange="OnPageChangePage">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>Deleted By</th>
<th>Deleted On</th>
<th>@SharedLocalizer["Path"]</th>
<th>@Localizer["DeletedBy"]</th>
<th>@Localizer["DeletedOn"]</th>
</Header>
<Row>
<td><button @onclick="@(() => RestorePage(context))" class="btn btn-info" title="Restore">Restore</button></td>
<td><ActionDialog Header="Delete Page" Message="@("Are You Sure You Wish To Permanently Delete The " + context.Name + " Page?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" /></td>
<td>@context.Name</td>
<td><button type="button" @onclick="@(() => RestorePage(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
<td>@context.Path</td>
<td>@context.DeletedBy</td>
<td>@context.DeletedOn</td>
</Row>
</Pager>
<br />
<ActionDialog Header="Remove All Deleted Pages" Message="Are You Sure You Wish To Permanently Remove All Deleted Pages?" Action="Remove All Deleted Pages" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllPages())" ResourceKey="DeleteAllPages" />
}
</TabPanel>
<TabPanel Name="Modules">
@if (_modules == null)
<TabPanel Name="Modules" ResourceKey="Modules" Heading="Modules">
@if (!_modules.Where(item => item.IsDeleted).Any())
{
<br />
<p>No Deleted Modules</p>
<p>@Localizer["NoModule.Deleted"]</p>
}
else
{
<Pager Items="@_modules">
<Pager Items="@_modules.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pageModule.ToString()" OnPageChange="OnPageChangeModule">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Page</th>
<th>Module</th>
<th>Deleted By</th>
<th>Deleted On</th>
<th>@Localizer["Page"]</th>
<th>@Localizer["Module"]</th>
<th>@Localizer["DeletedBy"]</th>
<th>@Localizer["DeletedOn"]</th>
</Header>
<Row>
<td><button @onclick="@(() => RestoreModule(context))" class="btn btn-info" title="Restore">Restore</button></td>
<td><ActionDialog Header="Delete Module" Message="@("Are You Sure You Wish To Permanently Delete The " + context.Title + " Module?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" /></td>
<td>@PageState.Pages.Find(item => item.PageId == context.PageId).Name</td>
<td><button type="button" @onclick="@(() => RestoreModule(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
<td><ActionDialog Header="Delete Module" Message="@string.Format(Localizer["Confirm.Module.Delete"], context.Title)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" ResourceKey="DeleteModule" /></td>
<td>@_pages.Find(item => item.PageId == context.PageId).Name</td>
<td>@context.Title</td>
<td>@context.DeletedBy</td>
<td>@context.DeletedOn</td>
</Row>
</Pager>
<br />
<ActionDialog Header="Remove All Deleted Modules" Message="Are You Sure You Wish To Permanently Remove All Deleted Modules?" Action="Remove All Deleted Modules" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllModules())" ResourceKey="DeleteAllModules" />
}
</TabPanel>
</TabStrip>
</TabStrip>
}
@code {
private List<Page> _pages;
private List<Module> _modules;
private int _pagePage = 1;
private int _pageModule = 1;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync()
@@ -77,34 +91,44 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Deleted Pages Or Modules {Error}", ex.Message);
AddModuleMessage("Error Loading Deleted Pages Or Modules", MessageType.Error);
AddModuleMessage(Localizer["Error.DeletedModulePage.Load"], MessageType.Error);
}
}
private async Task Load()
{
_pages = await PageService.GetPagesAsync(PageState.Site.SiteId);
_pages = _pages.Where(item => item.IsDeleted).ToList();
_modules = await ModuleService.GetModulesAsync(PageState.Site.SiteId);
_modules = _modules.Where(item => item.IsDeleted).ToList();
}
private async Task RestorePage(Page page)
{
try
{
var validated = true;
if (page.ParentId != null)
{
var parent = _pages.Find(item => item.PageId == page.ParentId);
validated = !parent.IsDeleted;
}
if (validated)
{
page.IsDeleted = false;
await PageService.UpdatePageAsync(page);
await logger.LogInformation("Page Restored {Page}", page);
AddModuleMessage(Localizer["Success.Page.Restore"], MessageType.Success);
await Load();
StateHasChanged();
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage(Localizer["Message.Page.Restore"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Restoring Deleted Page {Page} {Error}", page, ex.Message);
AddModuleMessage("Error Restoring Deleted Page", MessageType.Error);
AddModuleMessage(Localizer["Error.Page.Restore"], MessageType.Error);
}
}
@@ -114,9 +138,9 @@
{
await PageService.DeletePageAsync(page.PageId);
await logger.LogInformation("Page Permanently Deleted {Page}", page);
AddModuleMessage(Localizer["Success.Page.Delete"], MessageType.Success);
await Load();
StateHasChanged();
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
@@ -125,6 +149,31 @@
}
}
private async Task DeleteAllPages()
{
try
{
ShowProgressIndicator();
foreach (Page page in _pages.Where(item => item.IsDeleted))
{
await PageService.DeletePageAsync(page.PageId);
await logger.LogInformation("Page Permanently Deleted {Page}", page);
}
await logger.LogInformation("Pages Permanently Deleted");
AddModuleMessage(Localizer["Success.Pages.Delete"], MessageType.Success);
await Load();
HideProgressIndicator();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Permanently Deleting Pages {Error}", ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
HideProgressIndicator();
}
}
private async Task RestoreModule(Module module)
{
try
@@ -133,13 +182,14 @@
pagemodule.IsDeleted = false;
await PageModuleService.UpdatePageModuleAsync(pagemodule);
await logger.LogInformation("Module Restored {Module}", module);
AddModuleMessage(Localizer["Success.Module.Restore"], MessageType.Success);
await Load();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Restoring Deleted Module {Module} {Error}", module, ex.Message);
AddModuleMessage("Error Restoring Deleted Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Restore"], MessageType.Error);
}
}
@@ -148,22 +198,46 @@
try
{
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
// check if there are any remaining module instances in the site
_modules = await ModuleService.GetModulesAsync(PageState.Site.SiteId);
if (!_modules.Exists(item => item.ModuleId == module.ModuleId))
{
await ModuleService.DeleteModuleAsync(module.ModuleId);
}
await logger.LogInformation("Module Permanently Deleted {Module}", module);
AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success);
await Load();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Permanently Deleting Module {Module} {Error}", module, ex.Message);
AddModuleMessage("Error Permanently Deleting Module", MessageType.Error);
AddModuleMessage(Localizer["Error.Module.Delete"], MessageType.Error);
}
}
private async Task DeleteAllModules()
{
try
{
ShowProgressIndicator();
foreach (Module module in _modules.Where(item => item.IsDeleted).ToList())
{
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
}
await logger.LogInformation("Modules Permanently Deleted");
AddModuleMessage(Localizer["Success.Modules.Delete"], MessageType.Success);
await Load();
HideProgressIndicator();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Permanently Deleting Modules {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Modules.Delete"], MessageType.Error);
HideProgressIndicator();
}
}
private void OnPageChangePage(int page)
{
_pagePage = page;
}
private void OnPageChangeModule(int page)
{
_pageModule = page;
}
}

View File

@@ -1,68 +1,141 @@
@namespace Oqtane.Modules.Admin.Register
@namespace Oqtane.Modules.Admin.Register
@using System.Net
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject ITimeZoneService TimeZoneService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject ISettingService SettingService
@if (PageState.Site.AllowRegistration)
@if (_initialized)
{
<AuthorizeView>
<Authorizing>
<text>...</text>
</Authorizing>
<Authorized>
<ModuleMessage Message="You Are Already Registered" Type="MessageType.Info" />
</Authorized>
<NotAuthorized>
<ModuleMessage Message="Please Note That Registration Requires A Valid Email Address In Order To Verify Your Identity" Type="MessageType.Info" />
@if (PageState.Site.AllowRegistration)
{
if (!_userCreated)
{
if (PageState.User != null)
{
<ModuleMessage Message="@Localizer["Info.Registration.Exists"]" Type="MessageType.Info" />
}
else
{
<ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="form-group">
<label for="Username" class="control-label">Username: </label>
<input type="text" class="form-control" placeholder="Username" @bind="@_username" id="Username" />
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="Your username. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@_username" maxlength="256" required />
</div>
<div class="form-group">
<label for="Password" class="control-label">Password: </label>
<input type="password" class="form-control" placeholder="Password" @bind="@_password" id="Password" />
</div>
<div class="form-group">
<label for="Confirm" class="control-label">Confirm Password: </label>
<input type="password" class="form-control" placeholder="Password" @bind="@_confirm" id="Confirm" />
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="password" HelpText="Please choose a sufficiently secure password and enter it here" ResourceKey="Password"></Label>
<div class="col-sm-9">
<div class="input-group">
<input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" required />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
<div class="form-group">
<label for="Email" class="control-label">Email: </label>
<input type="text" class="form-control" placeholder="Email" @bind="@_email" id="Email" />
</div>
<div class="form-group">
<label for="DisplayName" class="control-label">Full Name: </label>
<input type="text" class="form-control" placeholder="Full Name" @bind="@_displayName" id="DisplayName" />
</div>
<button type="button" class="btn btn-primary" @onclick="Register">Register</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Cancel</button>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirm" HelpText="Enter your password again to confirm it matches the value entered above" ResourceKey="Confirm"></Label>
<div class="col-sm-9">
<div class="input-group">
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" required />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</NotAuthorized>
</AuthorizeView>
}
else
{
<ModuleMessage Message="Registration is Disabled For This Site" Type="MessageType.Info" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="email" HelpText="Your email address where you wish to receive notifications" ResourceKey="Email"></Label>
<div class="col-sm-9">
<input id="email" class="form-control" @bind="@_email" maxlength="256" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="displayname" HelpText="Your full name" ResourceKey="DisplayName"></Label>
<div class="col-sm-9">
<input id="displayname" class="form-control" @bind="@_displayname" maxlength="50" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="timezone" HelpText="Your time zone" ResourceKey="TimeZone">Time Zone:</Label>
<div class="col-sm-9">
<select id="timezone" class="form-select" @bind="@_timezoneid">
<option value="">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var timezone in _timezones)
{
<option value="@timezone.Id">@timezone.DisplayName</option>
}
</select>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-primary" @onclick="Register">@Localizer["Register"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
@if (_allowsitelogin)
{
<br />
<br />
<NavLink href="@NavigateUrl("login")">@Localizer["Login"]</NavLink>
}
</form>
}
}
}
else
{
<ModuleMessage Message="@Localizer["Info.Registration.Disabled"]" Type="MessageType.Info" />
}
}
@code {
private bool _initialized = false;
private List<Models.TimeZone> _timezones;
private string _passwordrequirements;
private string _username = string.Empty;
private ElementReference form;
private bool validated = false;
private string _password = string.Empty;
private string _passwordtype = "password";
private string _togglepassword = string.Empty;
private string _confirm = string.Empty;
private string _email = string.Empty;
private string _displayName = string.Empty;
private string _displayname = string.Empty;
private string _timezoneid = string.Empty;
private bool _userCreated = false;
private bool _allowsitelogin = true;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;
protected override async Task OnInitializedAsync()
{
_passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId);
_allowsitelogin = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:AllowSiteLogin", "true"));
_timezones = await TimeZoneService.GetTimeZonesAsync();
_timezoneid = PageState.Site.TimeZoneId;
_initialized = true;
}
protected override void OnParametersSet()
{
_togglepassword = SharedLocalizer["ShowPassword"];
}
private async Task Register()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
bool _isEmailValid = Utilities.IsValidEmail(_email);
if (_username != "" && _password != "" && _confirm != "" && _isEmailValid)
if (_isEmailValid)
{
if (_password == _confirm)
{
@@ -70,42 +143,64 @@ else
{
SiteId = PageState.Site.SiteId,
Username = _username,
DisplayName = (_displayName == string.Empty ? _username : _displayName),
Password = _password,
Email = _email,
Password = _password
DisplayName = (_displayname == string.Empty ? _username : _displayname),
TimeZoneId = _timezoneid,
PhotoFileId = null
};
user = await UserService.AddUserAsync(user);
if (user != null)
{
await logger.LogInformation("User Created {Username} {Email}", _username, _email);
AddModuleMessage("User Account Created. Please Check Your Email For Verification Instructions.", MessageType.Info);
_userCreated = true;
AddModuleMessage(Localizer["Info.User.AccountCreate"], MessageType.Info);
}
else
{
await logger.LogError("Error Adding User {Username} {Email}", _username, _email);
AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error);
AddModuleMessage(Localizer["Error.User.AddInfo"], MessageType.Error);
}
}
else
{
AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
AddModuleMessage(Localizer["Message.Password.NoMatch"], MessageType.Warning);
}
}
else
{
AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message);
AddModuleMessage("Error Adding User", MessageType.Error);
AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private void Cancel()
{
NavigationManager.NavigateTo(NavigateUrl(string.Empty));
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
private void TogglePassword()
{
if (_passwordtype == "password")
{
_passwordtype = "text";
_togglepassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordtype = "password";
_togglepassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -1,45 +1,76 @@
@namespace Oqtane.Modules.Admin.Reset
@namespace Oqtane.Modules.Admin.Reset
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="container">
<div class="form-group">
<label for="Username" class="control-label">Username: </label>
<input type="text" class="form-control" placeholder="Username" @bind="@_username" readonly id="Username"/>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="Your username will be populated from the link you received in the password reset notification" ResourceKey="Username">Username: </Label>
<div class="col-sm-9">
<input id="username" type="text" class="form-control" @bind="@_username" readonly />
</div>
<div class="form-group">
<label for="Password" class="control-label">Password: </label>
<input type="password" class="form-control" placeholder="Password" @bind="@_password" id="Password"/>
</div>
<div class="form-group">
<label for="Confirm" class="control-label">Confirm Password: </label>
<input type="password" class="form-control" placeholder="Password" @bind="@_confirm" id="Confirm"/>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="password" HelpText="The new password. It must satisfy complexity rules for the site." ResourceKey="Password">Password: </Label>
<div class="col-sm-9">
<div class="input-group">
<input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" required />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
<button type="button" class="btn btn-primary" @onclick="Reset">Reset Password</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Cancel</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirm" HelpText="Enter the password again. It must exactly match the password entered above." ResourceKey="Confirm">Confirm: </Label>
<div class="col-sm-9">
<div class="input-group">
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" required />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-primary" @onclick="Reset">@Localizer["Password.Reset"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
</form>
@code {
private ElementReference form;
private bool validated = false;
private string _username = string.Empty;
private string _password = string.Empty;
private string _passwordtype = "password";
private string _togglepassword = string.Empty;
private string _confirm = string.Empty;
private string _passwordrequirements;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;
protected override void OnInitialized()
protected override async Task OnInitializedAsync()
{
_togglepassword = SharedLocalizer["ShowPassword"];
_passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId);
if (PageState.QueryString.ContainsKey("name") && PageState.QueryString.ContainsKey("token"))
{
_username = PageState.QueryString["name"];
}
else
{
NavigationManager.NavigateTo(NavigateUrl(string.Empty));
await logger.LogError(LogFunction.Security, "Invalid Attempt To Access User Password Reset");
NavigationManager.NavigateTo(NavigateUrl("")); // home page
}
}
private async Task Reset()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
@@ -63,23 +94,28 @@
else
{
await logger.LogError("Error Resetting User Password {Username}", _username);
AddModuleMessage("Error Resetting User Password. Please Ensure Password Meets Complexity Requirements.", MessageType.Error);
AddModuleMessage(Localizer["Error.Password.ResetInfo"], MessageType.Error);
}
}
else
{
AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
AddModuleMessage(Localizer["Message.Password.NoMatch"], MessageType.Warning);
}
}
else
{
AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Resetting User Password {Username} {Error}", _username, ex.Message);
AddModuleMessage("Error Resetting User Password", MessageType.Error);
AddModuleMessage(Localizer["Error.Password.Reset"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
@@ -87,4 +123,18 @@
{
NavigationManager.NavigateTo(NavigateUrl(string.Empty));
}
private void TogglePassword()
{
if (_passwordtype == "password")
{
_passwordtype = "text";
_togglepassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordtype = "password";
_togglepassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -1,48 +1,54 @@
@namespace Oqtane.Modules.Admin.Roles
@namespace Oqtane.Modules.Admin.Roles
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IRoleService RoleService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Name Of The Role">Name:</Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="description" HelpText="A Short Description Of The Role Which Describes Its Purpose">Description:</Label>
</td>
<td>
<textarea id="description" class="form-control" @bind="@_description" rows="5"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="isautoassigned" HelpText="Indicates Whether Or Not New Users Are Automatically Assigned To This Role">Auto Assigned?</Label>
</td>
<td>
<select id="isautoassigned" class="form-control" @bind="@_isautoassigned">
<option value="True">Yes</option>
<option value="False">No</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Name Of The Role" ResourceKey="Name">Name:</Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="256" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="A Short Description Of The Role Which Describes Its Purpose" ResourceKey="Description">Description:</Label>
<div class="col-sm-9">
<textarea id="description" class="form-control" @bind="@_description" rows="5" maxlength="256" required></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="isautoassigned" HelpText="Indicates Whether Or Not New Users Are Automatically Assigned To This Role" ResourceKey="AutoAssigned">Auto Assigned?</Label>
<div class="col-sm-9">
<select id="isautoassigned" class="form-select" @bind="@_isautoassigned" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveRole">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveRole">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</div>
</form>
@code {
private ElementReference form;
private bool validated = false;
private string _name = string.Empty;
private string _description = string.Empty;
private string _isautoassigned = "False";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
private async Task SaveRole()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
var role = new Role();
role.SiteId = PageState.Page.SiteId;
@@ -61,7 +67,12 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding Role {Role} {Error}", role, ex.Message);
AddModuleMessage("Error Adding Role", MessageType.Error);
AddModuleMessage(Localizer["Error.AddRole"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}

View File

@@ -1,47 +1,55 @@
@namespace Oqtane.Modules.Admin.Roles
@namespace Oqtane.Modules.Admin.Roles
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IRoleService RoleService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Name Of The Role">Name:</Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="description" HelpText="A Short Description Of The Role Which Describes Its Purpose">Description:</Label>
</td>
<td>
<textarea id="description" class="form-control" @bind="@_description" rows="5"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="isautoassigned" HelpText="Indicates Whether Or Not New Users Are Automatically Assigned To This Role">Auto Assigned?</Label>
</td>
<td>
<select id="isautoassigned" class="form-control" @bind="@_isautoassigned">
<option value="True">Yes</option>
<option value="False">No</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Name Of The Role" ResourceKey="Name">Name:</Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="256" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="A Short Description Of The Role Which Describes Its Purpose" ResourceKey="Description">Description:</Label>
<div class="col-sm-9">
<textarea id="description" class="form-control" @bind="@_description" rows="5" maxlength="256" required></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="isautoassigned" HelpText="Indicates Whether Or Not New Users Are Automatically Assigned To This Role" ResourceKey="AutoAssigned">Auto Assigned?</Label>
<div class="col-sm-9">
<select id="isautoassigned" class="form-select" @bind="@_isautoassigned" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveRole">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveRole">@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>
</div>
</form>
@code {
private ElementReference form;
private bool validated = false;
private int _roleid;
private string _name = string.Empty;
private string _description = string.Empty;
private string _isautoassigned = "False";
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
protected override async Task OnInitializedAsync()
{
@@ -54,16 +62,24 @@
_name = role.Name;
_description = role.Description;
_isautoassigned = role.IsAutoAssigned.ToString();
_createdby = role.CreatedBy;
_createdon = role.CreatedOn;
_modifiedby = role.ModifiedBy;
_modifiedon = role.ModifiedOn;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Role {RoleId} {Error}", _roleid, ex.Message);
AddModuleMessage("Error Loading Role", MessageType.Error);
AddModuleMessage(Localizer["Error.LoadRole"], MessageType.Error);
}
}
private async Task SaveRole()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
var role = await RoleService.GetRoleAsync(_roleid);
role.Name = _name;
@@ -80,7 +96,12 @@
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Role {Role} {Error}", role, ex.Message);
AddModuleMessage("Error Saving Role", MessageType.Error);
AddModuleMessage(Localizer["Error.SaveRole"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -1,26 +1,28 @@
@namespace Oqtane.Modules.Admin.Roles
@namespace Oqtane.Modules.Admin.Roles
@inherits ModuleBase
@inject IRoleService RoleService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_roles == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Add Role" />
<ActionLink Action="Add" Text="Add Role" Security="SecurityAccessLevel.Edit" ResourceKey="AddRole" />
<Pager Items="@_roles">
<Pager Items="@_roles" SearchProperties="Name">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>@SharedLocalizer["Name"]</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.RoleId.ToString())" Disabled="@(context.IsSystem)" /></td>
<td><ActionDialog Header="Delete Role" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Role?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteRole(context))" Disabled="@(context.IsSystem)" /></td>
<td><ActionLink Action="Users" Parameters="@($"id=" + context.RoleId.ToString())" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.RoleId.ToString())" Security="SecurityAccessLevel.Edit" Disabled="@(context.IsSystem)" ResourceKey="Edit" /></td>
<td><ActionDialog Header="Delete Role" Message="@string.Format(Localizer["Confirm.DeleteUser"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteRole(context))" Disabled="@(context.IsSystem)" ResourceKey="DeleteRole" /></td>
<td><ActionLink Action="Users" Text="Users" Parameters="@($"id=" + context.RoleId.ToString())" Security="SecurityAccessLevel.Edit" ResourceKey="Users" /></td>
<td>@context.Name</td>
</Row>
</Pager>
@@ -29,11 +31,11 @@ else
@code {
private List<Role> _roles;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
protected override async Task OnParametersSetAsync()
{
_roles = await RoleService.GetRolesAsync(PageState.Site.SiteId);
await GetRoles();
}
private async Task DeleteRole(Role role)
@@ -42,12 +44,26 @@ else
{
await RoleService.DeleteRoleAsync(role.RoleId);
await logger.LogInformation("Role Deleted {Role}", role);
await GetRoles();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Role {Role} {Error}", role, ex.Message);
AddModuleMessage("Error Deleting Role", MessageType.Error);
AddModuleMessage(Localizer["Error.DeleteRole"], MessageType.Error);
}
}
private async Task GetRoles()
{
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
_roles = await RoleService.GetRolesAsync(PageState.Site.SiteId, true);
_roles.RemoveAll(item => item.Name == RoleNames.Everyone || item.Name == RoleNames.Unauthenticated);
}
else
{
_roles = await RoleService.GetRolesAsync(PageState.Site.SiteId);
}
}
}

View File

@@ -0,0 +1,21 @@
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.Admin.Roles
{
[PrivateApi("Mark this as private, since it's not very useful in the public docs")]
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "Roles",
Description = "Manage Roles",
Categories = "Admin",
Version = Constants.Version,
PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
$"{EntityNames.Role}:{PermissionNames.Write}:{RoleNames.Admin}," +
$"{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}"
};
}
}

View File

@@ -1,84 +1,85 @@
@namespace Oqtane.Modules.Admin.Roles
@namespace Oqtane.Modules.Admin.Roles
@inherits ModuleBase
@inject IRoleService RoleService
@inject IUserRoleService UserRoleService
@inject IStringLocalizer<Users> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (userroles == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<table class="table table-borderless">
<tr>
<td>
<Label For="role" HelpText="The role you are assigning users to">Role: </Label>
</td>
<td>
<input id="role" class="form-control" @bind="@name" disabled />
</td>
</tr>
<tr>
<td>
<Label For="user" HelpText="Select a user">User: </Label>
</td>
<td>
<select id="user" class="form-control" @bind="@userid">
<option value="-1">&lt;Select User&gt;</option>
@foreach (UserRole userrole in users)
{
<option value="@(userrole.UserId)">@userrole.User.DisplayName</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="effectiveDate" HelpText="The date that this role assignment is active">Effective Date: </Label>
</td>
<td>
<input id="effectiveDate" class="form-control" @bind="@effectivedate" />
</td>
</tr>
<tr>
<td>
<Label For="expiryDate" HelpText="The date that this role assignment expires">Expiry Date: </Label>
</td>
<td>
<input id="expiryDate" class="form-control" @bind="@expirydate" />
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveUserRole">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="role" HelpText="The role you are assigning users to" ResourceKey="Role">Role: </Label>
<div class="col-sm-9">
<input id="role" class="form-control" @bind="@name" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="user" HelpText="Select a user" ResourceKey="User">User: </Label>
<div class="col-sm-9">
<AutoComplete OnSearch="GetUsers" Placeholder="@Localizer["User.Select"]" @ref="user" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="effectiveDate" HelpText="The date that this role assignment is active" ResourceKey="EffectiveDate">Effective Date: </Label>
<div class="col-sm-9">
<input type="date" id="effectiveDate" class="form-control" @bind="@effectivedate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="expiryDate" HelpText="The date that this role assignment expires" ResourceKey="ExpiryDate">Expiry Date: </Label>
<div class="col-sm-9">
<input type="date" id="expiryDate" class="form-control" @bind="@expirydate" />
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveUserRole">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
<hr class="app-rule" />
<div class="row mb-1 align-items-center">
<p align="center">
<Pager Items="@userroles">
<Header>
<th>Users</th>
<th>@Localizer["Users"]</th>
<th>@SharedLocalizer["Username"]</th>
<th>@Localizer["Effective"]</th>
<th>@Localizer["Expiry"]</th>
<th>&nbsp;</th>
</Header>
<Row>
<td>@context.User.DisplayName</td>
<td>@context.User.Username</td>
<td>@context.EffectiveDate</td>
<td>@context.ExpiryDate</td>
<td>
<button type="button" class="btn btn-danger" @onclick=@(async () => await DeleteUserRole(context.UserRoleId))>Delete</button>
<ActionDialog Header="Remove User" Message="@string.Format(Localizer["Confirm.User.DeleteRole"], context.User.DisplayName)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteUserRole(context.UserRoleId))" Disabled="@(context.User.Username == UserNames.Host || context.User.UserId == PageState.User.UserId)" ResourceKey="DeleteUserRole" />
</td>
</Row>
</Pager>
</p>
</div>
</div>
</form>
}
@code {
private ElementReference form;
private bool validated = false;
private int roleid;
private string name = string.Empty;
private List<UserRole> users;
private int userid = -1;
private string effectivedate = string.Empty;
private string expirydate = string.Empty;
private AutoComplete user;
private DateTime? effectivedate = null;
private DateTime? expirydate = null;
private List<UserRole> userroles;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
protected override async Task OnInitializedAsync()
{
@@ -87,57 +88,59 @@ else
roleid = Int32.Parse(PageState.QueryString["id"]);
Role role = await RoleService.GetRoleAsync(roleid);
name = role.Name;
users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
users = users.Where(item => item.Role.Name == Constants.RegisteredRole).ToList();
await GetUserRoles();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Users {Error}", ex.Message);
AddModuleMessage("Error Loading Users", MessageType.Error);
AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error);
}
}
private async Task<Dictionary<string, string>> GetUsers(string filter)
{
try
{
var users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Registered);
return users.Where(item => item.User.DisplayName.Contains(filter, StringComparison.OrdinalIgnoreCase))
.ToDictionary(item => item.UserId.ToString(), item => item.User.DisplayName);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Users {filter} {Error}", filter, ex.Message);
AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error);
}
return new Dictionary<string, string>();
}
private async Task GetUserRoles()
{
try
{
userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
userroles = userroles.Where(item => item.RoleId == roleid).ToList();
userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, name);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading User Roles {RoleId} {Error}", roleid, ex.Message);
AddModuleMessage("Error Loading User Roles", MessageType.Error);
AddModuleMessage(Localizer["Error.User.LoadRole"], MessageType.Error);
}
}
private async Task SaveUserRole()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
if (userid != -1)
if (!string.IsNullOrEmpty(user.Key) && int.TryParse(user.Key, out int userid))
{
var userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault();
if (userrole != null)
{
if (string.IsNullOrEmpty(effectivedate))
{
userrole.EffectiveDate = null;
}
else
{
userrole.EffectiveDate = DateTime.Parse(effectivedate);
}
if (string.IsNullOrEmpty(expirydate))
{
userrole.ExpiryDate = null;
}
else
{
userrole.ExpiryDate = DateTime.Parse(expirydate);
}
userrole.EffectiveDate = effectivedate;
userrole.ExpiryDate = expirydate;
await UserRoleService.UpdateUserRoleAsync(userrole);
}
else
@@ -145,57 +148,60 @@ else
userrole = new UserRole();
userrole.UserId = userid;
userrole.RoleId = roleid;
if (string.IsNullOrEmpty(effectivedate))
{
userrole.EffectiveDate = null;
}
else
{
userrole.EffectiveDate = DateTime.Parse(effectivedate);
}
if (string.IsNullOrEmpty(expirydate))
{
userrole.ExpiryDate = null;
}
else
{
userrole.ExpiryDate = DateTime.Parse(expirydate);
}
userrole.EffectiveDate = effectivedate;
userrole.ExpiryDate = expirydate;
await UserRoleService.AddUserRoleAsync(userrole);
}
await GetUserRoles();
await logger.LogInformation("User Assigned To Role {UserRole}", userrole);
AddModuleMessage("User Assigned To Role", MessageType.Success);
AddModuleMessage(Localizer["Success.User.AssignedRole"], MessageType.Success);
await GetUserRoles();
user.Clear();
StateHasChanged();
}
else
{
AddModuleMessage("You Must Select A User", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.UserSelect"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving User Roles {RoleId} {Error}", roleid, ex.Message);
AddModuleMessage("Error Saving User Roles", MessageType.Error);
AddModuleMessage(Localizer["Error.User.SaveRole"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private async Task DeleteUserRole(int UserRoleId)
{
try
{
var userrole = await UserRoleService.GetUserRoleAsync(UserRoleId);
if (userrole.Role.Name == RoleNames.Registered)
{
userrole.ExpiryDate = DateTime.UtcNow;
await UserRoleService.UpdateUserRoleAsync(userrole);
await logger.LogInformation("User {Username} Expired From Role {Role}", userrole.User.Username, userrole.Role.Name);
}
else
{
await UserRoleService.DeleteUserRoleAsync(UserRoleId);
await logger.LogInformation("User {Username} Removed From Role {Role}", userrole.User.Username, userrole.Role.Name);
}
AddModuleMessage(Localizer["Confirm.User.RoleRemoved"], MessageType.Success);
await GetUserRoles();
await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId);
AddModuleMessage("User Removed From Role", MessageType.Success);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message);
AddModuleMessage("Error Removing User From Role", MessageType.Error);
AddModuleMessage(Localizer["Error.User.RemoveRole"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,119 @@
@namespace Oqtane.Modules.Admin.Search
@inherits ModuleBase
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="searchprovider" HelpText="Specify the search provider for this site" ResourceKey="SearchProvider">Search Provider: </Label>
<div class="col-sm-9">
<input id="searchprovider" class="form-control" @bind="@_searchProvider" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="enabled" HelpText="Specify if search indexing is enabled" ResourceKey="Enabled">Indexing Enabled? </Label>
<div class="col-sm-9">
<select id="enabled" class="form-select" @bind="@_enabled">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="lastindexedon" HelpText="The date/time which the site was last indexed on" ResourceKey="LastIndexedOn">Last Indexed: </Label>
<div class="col-sm-9">
<input id="lastindexedon" class="form-control" @bind="@_lastIndexedOn" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ignorepages" HelpText="Comma delimited list of pages which should be ignored (based on their path)" ResourceKey="IgnorePages">Ignore Pages: </Label>
<div class="col-sm-9">
<textarea id="ignorepages" class="form-control" @bind="@_ignorePages" rows="3"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ignoreentities" HelpText="Comma delimited list of entities which should be ignored" ResourceKey="IgnoreEntities">Ignore Entities: </Label>
<div class="col-sm-9">
<textarea id="ignoreentities" class="form-control" @bind="@_ignoreEntities" rows="3"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="minimumwordlength" HelpText="Minimum length of a word to be indexed" ResourceKey="MinimumWordLength">Word Length: </Label>
<div class="col-sm-9">
<input id="minimumwordlength" class="form-control" type="number" min="0" step="1" @bind="@_minimumWordLength" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ignorewords" HelpText="Comma delimited list of words which should be ignored" ResourceKey="IgnoreWords">Ignore Words: </Label>
<div class="col-sm-9">
<textarea id="ignorewords" class="form-control" @bind="@_ignoreWords" rows="3"></textarea>
</div>
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="Save">@SharedLocalizer["Save"]</button>
<ActionDialog Header="Reindex" Message="Are You Sure You Wish To Reindex Search Content?" Action="Reindex" Class="btn btn-danger" OnClick="@(async () => await Reindex())" ResourceKey="Reindex" />
<br /><br />
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private string _searchProvider;
private string _enabled = "True";
private string _lastIndexedOn = "";
private string _ignorePages = "";
private string _ignoreEntities = "File";
private string _minimumWordLength = "3";
private string _ignoreWords = "the,be,to,of,and,a,i,in,that,have,it,for,not,on,with,he,as,you,do,at,this,but,his,by,from,they,we,say,her,she,or,an,will,my,one,all,would,there,their,what,so,up,out,if,about,who,get,which,go,me,when,make,can,like,time,no,just,him,know,take,people,into,year,your,good,some,could,them,see,other,than,then,now,look,only,come,its,over,think,also,back,after,use,two,how,our,work,first,well,way,even,new,want,because,any,these,give,day,most,us";
protected override async Task OnInitializedAsync()
{
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_searchProvider = SettingService.GetSetting(settings, "Search_SearchProvider", Constants.DefaultSearchProviderName);
_enabled = SettingService.GetSetting(settings, "Search_Enabled", _enabled);
_lastIndexedOn = SettingService.GetSetting(settings, "Search_LastIndexedOn", _lastIndexedOn);
_ignorePages = SettingService.GetSetting(settings, "Search_IgnorePages", _ignorePages);
_ignoreEntities = SettingService.GetSetting(settings, "Search_IgnoreEntities", _ignoreEntities);
_minimumWordLength = SettingService.GetSetting(settings, "Search_MininumWordLength", _minimumWordLength);
_ignoreWords = SettingService.GetSetting(settings, "Search_IgnoreWords", _ignoreWords);
}
private async Task Save()
{
try
{
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
settings = SettingService.SetSetting(settings, "Search_SearchProvider", _searchProvider);
settings = SettingService.SetSetting(settings, "Search_Enabled", _enabled);
settings = SettingService.SetSetting(settings, "Search_LastIndexedOn", _lastIndexedOn, true);
settings = SettingService.SetSetting(settings, "Search_IgnorePages", _ignorePages, true);
settings = SettingService.SetSetting(settings, "Search_IgnoreEntities", _ignoreEntities, true);
settings = SettingService.SetSetting(settings, "Search_MininumWordLength", _minimumWordLength, true);
settings = SettingService.SetSetting(settings, "Search_IgnoreWords", _ignoreWords, true);
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
AddModuleMessage(Localizer["Success.Save"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Search Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Save"], MessageType.Error);
}
}
private async Task Reindex()
{
try
{
_lastIndexedOn = DateTime.MinValue.ToString();
await Save();
AddModuleMessage(Localizer["Message.Reindex"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Search Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Save"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,142 @@
@using Oqtane.Services
@using System.Net
@namespace Oqtane.Modules.Admin.SearchResults
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ISearchResultsService SearchResultsService
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@attribute [StreamRendering] // attribute allows the progress indicator to be displayed
<div class="search-result-container">
<div class="row">
<div class="col">
<form method="post" @formname="SearchResultsForm" @onsubmit="Search" data-enhance>
<div class="input-group mb-3">
<span class="input-group-text">@Localizer["SearchLabel"]</span>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<input type="text" name="keywords" class="form-control shadow-none" maxlength="50"
aria-label="Keywords"
placeholder="@Localizer["SearchPlaceholder"]"
@bind="@_keywords">
<button class="btn btn-primary" type="submit">@SharedLocalizer["Search"]</button>
<a class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Reset"]</a>
</div>
</form>
</div>
</div>
<div class="row">
<div class="col-md-12 mb-3">
@if (_loading)
{
<div class="app-progress-indicator"></div>
}
else
{
@if (_searchResults != null && _searchResults.Results != null)
{
if (_searchResults.Results.Any())
{
<Pager Items="@_searchResults?.Results"
Format="Grid"
Columns="1"
Toolbar="Bottom"
Parameters="@($"q={_keywords}")">
<Row>
<div class="search-item mb-2">
<h4 class="mb-1"><a href="@context.Url">@context.Title</a></h4>
<p class="mb-0 text-muted">@((MarkupString)context.Snippet)</p>
</div>
</Row>
</Pager>
}
else
{
<div class="alert alert-info show mt-3" role="alert">
@Localizer["NoResult"]
</div>
}
}
<div class="clearfix"></div>
}
</div>
</div>
</div>
@code {
public override string RenderMode => RenderModes.Static;
private string _includeEntities;
private string _excludeEntities;
private string _fromDate;
private string _toDate;
private string _pageSize;
private string _sortField;
private string _sortOrder;
private string _bodyLength;
private string _keywords;
private SearchResults _searchResults;
private bool _loading;
[SupplyParameterFromForm(FormName = "SearchResultsForm")]
public string KeyWords { get => ""; set => _keywords = value; }
protected override async Task OnInitializedAsync()
{
_includeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_IncludeEntities", "");
_excludeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ExcludeEntities", "");
_fromDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_FromDate", DateTime.MinValue.ToString());
_toDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ToDate", DateTime.MaxValue.ToString());
_pageSize = SettingService.GetSetting(ModuleState.Settings, "SearchResults_PageSize", int.MaxValue.ToString());
_sortField = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortField", "Relevance");
_sortOrder = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortOrder", "Descending");
_bodyLength = SettingService.GetSetting(ModuleState.Settings, "SearchResults_BodyLength", "255");
if (_keywords == null && PageState.QueryString.ContainsKey("q"))
{
_keywords = WebUtility.UrlDecode(PageState.QueryString["q"]);
await PerformSearch();
}
}
private void Search()
{
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, $"page=1&q={WebUtility.UrlEncode(_keywords)}"));
}
private async Task PerformSearch()
{
_loading = true;
StateHasChanged();
if (!string.IsNullOrEmpty(_keywords))
{
var searchQuery = new SearchQuery
{
SiteId = PageState.Site.SiteId,
Alias = PageState.Alias,
Keywords = _keywords,
IncludeEntities = _includeEntities,
ExcludeEntities = _excludeEntities,
FromDate = (!string.IsNullOrEmpty(_fromDate)) ? DateTime.Parse(_fromDate) : DateTime.MinValue,
ToDate = (!string.IsNullOrEmpty(_toDate)) ? DateTime.Parse(_toDate) : DateTime.MaxValue,
PageSize = (!string.IsNullOrEmpty(_pageSize)) ? int.Parse(_pageSize) : int.MaxValue,
PageIndex = 0,
SortField = (!string.IsNullOrEmpty(_sortField)) ? (SearchSortField)Enum.Parse(typeof(SearchSortField), _sortField) : SearchSortField.Relevance,
SortOrder = (!string.IsNullOrEmpty(_sortOrder)) ? (SearchSortOrder)Enum.Parse(typeof(SearchSortOrder), _sortOrder) : SearchSortOrder.Descending,
BodyLength = (!string.IsNullOrEmpty(_bodyLength)) ? int.Parse(_bodyLength) : 255
};
_searchResults = await SearchResultsService.GetSearchResultsAsync(searchQuery);
}
else
{
AddModuleMessage(Localizer["NoCriteria"], MessageType.Info, "bottom");
}
_loading = false;
StateHasChanged();
}
}

View File

@@ -0,0 +1,19 @@
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.Admin.SearchResults
{
[PrivateApi("Mark this as private, since it's not very useful in the public docs")]
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "Search Results",
Description = "Search Results",
Categories = "Admin",
Version = Constants.Version,
SettingsType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client"
};
}
}

View File

@@ -0,0 +1,123 @@
@namespace Oqtane.Modules.Admin.SearchResults
@inherits ModuleBase
@inject ISettingService SettingService
@implements Oqtane.Interfaces.ISettingsControl
@inject IStringLocalizer<Settings> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="includeentities" ResourceKey="IncludeEntities" ResourceType="@resourceType" HelpText="Comma delimited list of entities to include in the search results. By default all entities will be included.">Include Entities: </Label>
<div class="col-sm-9">
<input id="includeentities" type="text" class="form-control" @bind="@_includeEntities" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="excludeentities" ResourceKey="ExcludeEntities" ResourceType="@resourceType" HelpText="Comma delimited list of entities to exclude from search results. By default no entities will be excluded.">Exclude Entities: </Label>
<div class="col-sm-9">
<input id="excludeentities" class="form-control" @bind="@_excludeEntities" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="daterange" ResourceKey="DateRange" ResourceType="@resourceType" HelpText="Enter the date range for search results. The default includes all content.">Date Range: </Label>
<div class="col-sm-9">
<div class="input-group">
<input type="date" class="form-control" @bind="@_fromDate" />
<span class="input-group-text">@Localizer["To"]</span>
<input type="date" class="form-control" @bind="@_toDate" />
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pagesize" ResourceKey="PageSize" ResourceType="@resourceType" HelpText="The maximum number of search results to retrieve. The default is unlimited.">Page Size: </Label>
<div class="col-sm-9">
<input id="pagesize" type="text" class="form-control" @bind="@_pageSize" />
</div>
</div>
<hr />
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="sortfield" ResourceKey="SortField" ResourceType="@resourceType" HelpText="Specify the default sort field">Sort By: </Label>
<div class="col-sm-9">
<select id="softfield" class="form-select" @bind="@_sortField">
<option value="Relevance">@Localizer["Relevance"]</option>
<option value="Title">@Localizer["Title"]</option>
<option value="LastModified">@Localizer["LastModified"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="sortorder" ResourceKey="SortOrder" ResourceType="@resourceType" HelpText="Specify the default sort order">Sort Order: </Label>
<div class="col-sm-9">
<select id="softorder" class="form-select" @bind="@_sortOrder">
<option value="Ascending">@Localizer["Ascending"]</option>
<option value="Descending">@Localizer["Descending"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="bodylength" ResourceKey="BodyLength" ResourceType="@resourceType" HelpText="The number of characters displayed for each search result summary. The default is 255 characters.">Body Size: </Label>
<div class="col-sm-9">
<input id="bodylength" type="text" class="form-control" @bind="@_bodyLength" />
</div>
</div>
</div>
</form>
@code {
private string resourceType = "Oqtane.Modules.Admin.SearchResults.Settings, Oqtane.Client"; // for localization
private ElementReference form;
private bool validated = false;
private string _includeEntities;
private string _excludeEntities;
private DateTime? _fromDate = null;
private DateTime? _toDate = null;
private string _pageSize;
private string _sortField;
private string _sortOrder;
private string _bodyLength;
protected override void OnInitialized()
{
try
{
_includeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_IncludeEntities", "");
_excludeEntities = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ExcludeEntities", "");
var fromDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_FromDate", "");
_fromDate = (string.IsNullOrEmpty(fromDate)) ? null : DateTime.Parse(fromDate);
var toDate = SettingService.GetSetting(ModuleState.Settings, "SearchResults_ToDate", "");
_toDate = (string.IsNullOrEmpty(toDate)) ? null : DateTime.Parse(toDate);
_pageSize = SettingService.GetSetting(ModuleState.Settings, "SearchResults_PageSize", "");
_sortField = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortField", "Relevance");
_sortOrder = SettingService.GetSetting(ModuleState.Settings, "SearchResults_SortOrder", "Descending");
_bodyLength = SettingService.GetSetting(ModuleState.Settings, "SearchResults_BodyLength", "255");
}
catch (Exception ex)
{
AddModuleMessage(ex.Message, MessageType.Error);
}
}
public async Task UpdateSettings()
{
try
{
var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId);
settings = SettingService.SetSetting(settings, "SearchResults_IncludeEntities", _includeEntities);
settings = SettingService.SetSetting(settings, "SearchResults_ExcludeEntities", _excludeEntities);
settings = SettingService.SetSetting(settings, "SearchResults_From", _fromDate.ToString());
settings = SettingService.SetSetting(settings, "SearchResults_To", _toDate.ToString());
settings = SettingService.SetSetting(settings, "SearchResults_PageSize", _pageSize);
settings = SettingService.SetSetting(settings, "SearchResults_SortField", _sortField);
settings = SettingService.SetSetting(settings, "SearchResults_SortOrder", _sortOrder);
settings = SettingService.SetSetting(settings, "SearchResults_BodyLength", _bodyLength);
await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId);
}
catch (Exception ex)
{
AddModuleMessage(ex.Message, MessageType.Error);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,6 @@
@namespace Oqtane.Modules.Admin.Sites
@namespace Oqtane.Modules.Admin.Sites
@using Oqtane.Interfaces
@using System.Text.RegularExpressions
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ITenantService TenantService
@@ -8,254 +10,273 @@
@inject ISiteTemplateService SiteTemplateService
@inject IUserService UserService
@inject IInstallationService InstallationService
@inject IDatabaseService DatabaseService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_tenants == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Enter the name of the site">Site Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="alias" HelpText="Enter the alias for the server">Aliases: </Label>
</td>
<td>
<textarea id="alias" class="form-control" @bind="@_urls" rows="3"></textarea>
</td>
</tr>
<tr>
<td>
<Label For="defaultTheme" HelpText="Select the default theme for the website">Default Theme: </Label>
</td>
<td>
<select id="defaultTheme" class="form-control" @onchange="(e => ThemeChanged(e))">
<option value="-">&lt;Select Theme&gt;</option>
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the name of the site" ResourceKey="Name">Site Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="200" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="alias" HelpText="The urls for the site (comman delimited). This can include domain names (ie. domain.com), subdomains (ie. sub.domain.com) or virtual folders (ie. domain.com/folder)." ResourceKey="Aliases">Urls: </Label>
<div class="col-sm-9">
<textarea id="alias" class="form-control" @bind="@_urls" rows="3" required></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="defaultTheme" HelpText="Select the default theme for the website" ResourceKey="DefaultTheme">Default Theme: </Label>
<div class="col-sm-9">
<select id="defaultTheme" class="form-select" value="@_themetype" @onchange="(e => ThemeChanged(e))" required>
<option value="-">&lt;@Localizer["Theme.Select"]&gt;</option>
@foreach (var theme in _themes)
{
<option value="@theme.TypeName">@theme.Name</option>
}
</select>
</td>
</tr>
@if (_layouts.Count > 0)
{
<tr>
<td>
<Label For="defaultLayout" HelpText="Select the default layout for the site">Default Layout: </Label>
</td>
<td>
<select id="defaultLayout" class="form-control" @bind="@_layouttype">
<option value="-">&lt;Select Layout&gt;</option>
@foreach (var layout in _layouts)
{
<option value="@(layout.TypeName)">@(layout.Name)</option>
}
</select>
</td>
</tr>
}
<tr>
<td>
<Label For="defaultContainer" HelpText="Select the default container for the site">Default Container: </Label>
</td>
<td>
<select id="defaultContainer" class="form-control" @bind="@_containertype">
<option value="-">&lt;Select Container&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="defaultContainer" HelpText="Select the default container for the site" ResourceKey="DefaultContainer">Default Container: </Label>
<div class="col-sm-9">
<select id="defaultContainer" class="form-select" @bind="@_containertype" required>
<option value="-">&lt;@Localizer["Container.Select"]&gt;</option>
@foreach (var container in _containers)
{
<option value="@container.TypeName">@container.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="siteTemplate" HelpText="Select the site template">Site Template: </Label>
</td>
<td>
<select id="siteTemplate" class="form-control" @bind="@_sitetemplatetype">
<option value="-">&lt;Select Site Template&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="siteTemplate" HelpText="Select the site template" ResourceKey="SiteTemplate">Site Template: </Label>
<div class="col-sm-9">
<select id="siteTemplate" class="form-select" @bind="@_sitetemplatetype" required>
<option value="-">&lt;@Localizer["SiteTemplate.Select"]&gt;</option>
@foreach (SiteTemplate siteTemplate in _siteTemplates)
{
<option value="@siteTemplate.TypeName">@siteTemplate.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="tenant" HelpText="Select the tenant for the site">Tenant: </Label>
</td>
<td>
<select id="tenant" class="form-control" @onchange="(e => TenantChanged(e))">
<option value="-">&lt;Select Tenant&gt;</option>
<option value="+">&lt;Create New Tenant&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="rendermode" HelpText="The default render mode for the site" ResourceKey="Rendermode">Render Mode: </Label>
<div class="col-sm-9">
<select id="rendermode" class="form-select" @bind="@_rendermode" required>
<option value="@RenderModes.Interactive">@(SharedLocalizer["RenderMode" + @RenderModes.Interactive])</option>
<option value="@RenderModes.Static">@(SharedLocalizer["RenderMode" + @RenderModes.Static])</option>
<option value="@RenderModes.Headless">@(SharedLocalizer["RenderMode" + @RenderModes.Headless])</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runtime" HelpText="The render mode for UI components which require interactivity" ResourceKey="Runtime">Interactivity: </Label>
<div class="col-sm-9">
<select id="runtime" class="form-select" @bind="@_runtime" required>
<option value="@Runtimes.Server">@(SharedLocalizer["Runtime" + @Runtimes.Server])</option>
<option value="@Runtimes.WebAssembly">@(SharedLocalizer["Runtime" + @Runtimes.WebAssembly])</option>
<option value="@Runtimes.Auto">@(SharedLocalizer["Runtime" + @Runtimes.Auto])</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="tenant" HelpText="Select the database for the site" ResourceKey="Tenant">Database: </Label>
<div class="col-sm-9">
<select id="tenant" class="form-select" value="@_tenantid" @onchange="(e => TenantChanged(e))" required>
<option value="-">&lt;@Localizer["Tenant.Select"]&gt;</option>
<option value="+">&lt;@Localizer["Tenant.Add"]&gt;</option>
@foreach (Tenant tenant in _tenants)
{
<option value="@tenant.TenantId">@tenant.Name</option>
}
</select>
</td>
</tr>
</div>
</div>
@if (_tenantid == "+")
{
<tr>
<td colspan="2">
<div class="row mb-1 align-items-center">
<hr class="app-rule" />
</td>
</tr>
<tr>
<td>
<Label For="name" HelpText="Enter the name for the tenant">Tenant Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_tenantname" />
</td>
</tr>
<tr>
<td>
<Label For="databaseType" HelpText="Select the database type for the tenant">Database Type: </Label>
</td>
<td>
<select id="databaseType" class="custom-select" @bind="@_databasetype">
<option value="LocalDB">Local Database</option>
<option value="SQLServer">SQL Server</option>
</select>
</td>
</tr>
<tr>
<td>
<Label For="server" HelpText="Enter the server for the tenant">Server: </Label>
</td>
<td>
<input id="server" type="text" class="form-control" @bind="@_server" />
</td>
</tr>
<tr>
<td>
<Label For="database" HelpText="Enter the database for the tenant">Database: </Label>
</td>
<td>
<input id="database" type="text" class="form-control" @bind="@_database" />
</td>
</tr>
<tr>
<td>
<Label For="integratedSecurity" HelpText="Select if you want integrated security or not">Integrated Security: </Label>
</td>
<td>
<select id="integratedSecurity" class="custom-select" @onchange="SetIntegratedSecurity">
<option value="true" selected>True</option>
<option value="false">False</option>
</select>
</td>
</tr>
@if (!_integratedsecurity)
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the name for the database. Note that this will be the tenant name which is used within the framework to identify the database." ResourceKey="TenantName">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_tenantName" maxlength="100" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="databaseType" HelpText="Select the database type" ResourceKey="DatabaseType">Type: </Label>
<div class="col-sm-9">
@if (_databases != null)
{
<tr>
<td>
<Label For="username" HelpText="Enter the username for the integrated security">Database Username: </Label>
</td>
<td>
<input id="username" type="text" class="form-control" @bind="@_username" />
</td>
</tr>
<tr>
<td>
<Label For="password" HelpText="Enter the password for the integrated security">Database Password: </Label>
</td>
<td>
<input id="password" type="password" class="form-control" @bind="@_password" />
</td>
</tr>
<div class="input-group">
<select id="databaseType" class="form-select" value="@_databaseName" @onchange="(e => DatabaseChanged(e))" required>
@foreach (var database in _databases)
{
<option value="@database.Name">@Localizer[@database.Name]</option>
}
<tr>
<td>
<Label For="hostUsername" HelpText="Enter the username of the host for this site">Host Username:</Label>
</td>
<td>
<input id="hostUsername" class="form-control" @bind="@_hostusername" readonly />
</td>
</tr>
<tr>
<td>
<Label For="hostPassword" HelpText="Enter the password for the host of this site">Host Password:</Label>
</td>
<td>
<input id="hostPassword" type="password" class="form-control" @bind="@_hostpassword" />
</td>
</tr>
</select>
@if (!_showConnectionString)
{
<button type="button" class="btn btn-secondary" @onclick="ToggleConnectionString">@Localizer["EnterConnectionString"]</button>
}
</table>
<button type="button" class="btn btn-success" @onclick="SaveSite">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
else
{
<button type="button" class="btn btn-secondary" @onclick="ToggleConnectionString">@Localizer["EnterConnectionParameters"]</button>
}
</div>
}
</div>
</div>
@if (!_showConnectionString)
{
if (_databaseConfigType != null)
{
@DatabaseConfigComponent
}
}
else
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="connectionstring" HelpText="Enter a complete connection string including all parameters and delimiters" ResourceKey="ConnectionString">Settings:</Label>
<div class="col-sm-9">
<textarea id="connectionstring" class="form-control" @bind="@_connectionString" rows="3"></textarea>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="hostUsername" HelpText="Enter the username of an existing host user" ResourceKey="HostUsername">Host Username:</Label>
<div class="col-sm-9">
<input id="hostUsername" class="form-control" @bind="@_hostusername" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="hostPassword" HelpText="Enter the password of an existing host user" ResourceKey="HostPassword">Host Password:</Label>
<div class="col-sm-9">
<input id="hostPassword" type="password" class="form-control" @bind="@_hostpassword" autocomplete="new-password" required />
</div>
</div>
}
</div>
<br />
<br />
<button type="button" class="btn btn-success" @onclick="SaveSite">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</form>
}
@code {
private List<Database> _databases;
private ElementReference form;
private bool validated = false;
private string _databaseName;
private Type _databaseConfigType;
private object _databaseConfig;
private RenderFragment DatabaseConfigComponent { get; set; }
private bool _showConnectionString = false;
private string _connectionString = string.Empty;
private List<Theme> _themeList;
private List<ThemeControl> _themes = new List<ThemeControl>();
private List<ThemeControl> _layouts = new List<ThemeControl>();
private List<ThemeControl> _containers = new List<ThemeControl>();
private List<SiteTemplate> _siteTemplates;
private List<Tenant> _tenants;
private string _tenantid = "-";
private string _tenantname = string.Empty;
private string _databasetype = "LocalDB";
private string _server = "(LocalDb)\\MSSQLLocalDB";
private string _database = "Oqtane-" + DateTime.UtcNow.ToString("yyyyMMddHHmm");
private string _username = string.Empty;
private string _password = string.Empty;
private bool _integratedsecurity = true;
private string _hostusername = Constants.HostUser;
private string _tenantName = string.Empty;
private string _hostusername = string.Empty;
private string _hostpassword = string.Empty;
private string _name = string.Empty;
private string _urls = string.Empty;
private string _themetype = "-";
private string _layouttype = "-";
private string _containertype = "-";
private string _sitetemplatetype = "-";
private string _rendermode = RenderModes.Static;
private string _runtime = Runtimes.Server;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
_tenants = await TenantService.GetTenantsAsync();
if (_tenants.Any(item => item.Name == TenantNames.Master))
{
_tenantid = _tenants.First(item => item.Name == TenantNames.Master).TenantId.ToString();
}
_urls = PageState.Alias.Name;
_themeList = await ThemeService.GetThemesAsync();
_themes = ThemeService.GetThemeControls(_themeList);
if (_themes.Any(item => item.TypeName == Constants.DefaultTheme))
{
_themetype = Constants.DefaultTheme;
_containers = ThemeService.GetContainerControls(_themeList, _themetype);
_containertype = _containers.First().TypeName;
}
_siteTemplates = await SiteTemplateService.GetSiteTemplatesAsync();
if (_siteTemplates.Any(item => item.TypeName == Constants.DefaultSiteTemplate))
{
_sitetemplatetype = Constants.DefaultSiteTemplate;
}
_databases = await DatabaseService.GetDatabasesAsync();
if (_databases.Exists(item => item.IsDefault))
{
_databaseName = _databases.Find(item => item.IsDefault).Name;
}
else
{
_databaseName = "LocalDB";
}
LoadDatabaseConfigComponent();
}
private void DatabaseChanged(ChangeEventArgs eventArgs)
{
try
{
_databaseName = (string)eventArgs.Value;
_showConnectionString = false;
LoadDatabaseConfigComponent();
}
catch
{
AddModuleMessage(Localizer["Error.Database.LoadConfig"], MessageType.Error);
}
}
private void LoadDatabaseConfigComponent()
{
var database = _databases.SingleOrDefault(d => d.Name == _databaseName);
if (database != null)
{
_databaseConfigType = Type.GetType(database.ControlType);
DatabaseConfigComponent = builder =>
{
builder.OpenComponent(0, _databaseConfigType);
builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); });
builder.CloseComponent();
};
}
}
private void TenantChanged(ChangeEventArgs e)
{
_tenantid = (string)e.Value;
if (string.IsNullOrEmpty(_tenantname))
if (string.IsNullOrEmpty(_tenantName))
{
_tenantname = _name;
}
StateHasChanged();
}
private void SetIntegratedSecurity(ChangeEventArgs e)
{
if (Convert.ToBoolean((string)e.Value))
{
_integratedsecurity = true;
}
else
{
_integratedsecurity = false;
_tenantName = _name;
}
StateHasChanged();
}
@@ -267,32 +288,35 @@ else
_themetype = (string)e.Value;
if (_themetype != "-")
{
_layouts = ThemeService.GetLayoutControls(_themeList, _themetype);
_containers = ThemeService.GetContainerControls(_themeList, _themetype);
_containertype = _containers.First().TypeName;
}
else
{
_layouts = new List<ThemeControl>();
_containers = new List<ThemeControl>();
}
_layouttype = "-";
_containertype = "-";
}
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message);
AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error);
await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message);
AddModuleMessage(Localizer["Error.Theme.LoadContainers"], MessageType.Error);
}
}
private async Task SaveSite()
{
if (_tenantid != "-" && _name != string.Empty && _urls != string.Empty && _themetype != "-" && (_layouts.Count == 0 || _layouttype != "-") && _containertype != "-" && _sitetemplatetype != "-")
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (_tenantid != "-" && _name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-" && _sitetemplatetype != "-")
{
_urls = Regex.Replace(_urls, @"\r\n?|\n", ",");
var duplicates = new List<string>();
var aliases = await AliasService.GetAliasesAsync();
foreach (string name in _urls.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
foreach (string name in _urls.Split(',', StringSplitOptions.RemoveEmptyEntries))
{
if (aliases.Exists(item => item.Name == name))
{
@@ -306,57 +330,55 @@ else
if (_tenantid == "+")
{
if (!string.IsNullOrEmpty(_tenantname) && _tenants.FirstOrDefault(item => item.Name == _tenantname) == null)
if (!string.IsNullOrEmpty(_tenantName) && !_tenants.Exists(item => item.Name == _tenantName))
{
// validate host credentials
var user = new User();
user.SiteId = PageState.Site.SiteId;
user.Username = Constants.HostUser;
user.Username = _hostusername;
user.Password = _hostpassword;
user.LastIPAddress = PageState.RemoteIPAddress;
user = await UserService.LoginUserAsync(user, false, false);
if (user.IsAuthenticated)
{
if (!string.IsNullOrEmpty(_server) && !string.IsNullOrEmpty(_database))
var database = _databases.SingleOrDefault(d => d.Name == _databaseName);
var connectionString = String.Empty;
if (_showConnectionString)
{
var connectionString = string.Empty;
if (_databasetype == "LocalDB")
{
connectionString = "Data Source=" + _server + ";AttachDbFilename=|DataDirectory|\\" + _database + ".mdf;Initial Catalog=" + _database + ";Integrated Security=SSPI;";
connectionString = _connectionString;
}
else
{
connectionString = "Data Source=" + _server + ";Initial Catalog=" + _database + ";";
if (_integratedsecurity)
if (_databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
connectionString += "Integrated Security=SSPI;";
}
else
{
connectionString += "User ID=" + _username + ";Password=" + _password;
connectionString = databaseConfigControl.GetConnectionString();
}
}
if (connectionString != "")
{
config.TenantName = _tenantName;
config.DatabaseType = database.DBType;
config.ConnectionString = connectionString;
config.HostUsername = _hostusername;
config.HostPassword = _hostpassword;
config.HostEmail = user.Email;
config.HostName = user.DisplayName;
config.TenantName = _tenantname;
config.IsNewTenant = true;
}
else
{
AddModuleMessage("You Must Specify A Server And Database", MessageType.Error);
AddModuleMessage(Localizer["Error.Required.ServerDatabase"], MessageType.Error);
}
}
else
{
AddModuleMessage("Invalid Host Password", MessageType.Error);
AddModuleMessage(Localizer["Error.InvalidPassword"], MessageType.Error);
}
}
else
{
AddModuleMessage("Tenant Name Is Missing Or Already Exists", MessageType.Error);
AddModuleMessage(Localizer["Error.TenantName.Exists"], MessageType.Error);
}
}
else
@@ -365,7 +387,8 @@ else
if (tenant != null)
{
config.TenantName = tenant.Name;
config.ConnectionString= tenant.DBConnectionString;
config.DatabaseType = tenant.DBType;
config.ConnectionString = tenant.DBConnectionString;
config.IsNewTenant = false;
}
}
@@ -373,11 +396,13 @@ else
if (!string.IsNullOrEmpty(config.TenantName))
{
config.SiteName = _name;
config.Aliases = _urls.Replace("\n", ",");
config.Aliases = _urls;
config.DefaultTheme = _themetype;
config.DefaultLayout = _layouttype;
config.DefaultContainer = _containertype;
config.DefaultAdminContainer = "";
config.SiteTemplate = _sitetemplatetype;
config.RenderMode = _rendermode;
config.Runtime = _runtime;
ShowProgressIndicator();
@@ -385,8 +410,7 @@ else
if (installation.Success)
{
var aliasname = config.Aliases.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[0];
var uri = new Uri(NavigationManager.Uri);
NavigationManager.NavigateTo(uri.Scheme + "://" + aliasname, true);
NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + aliasname, true);
}
else
{
@@ -397,12 +421,26 @@ else
}
else
{
AddModuleMessage(string.Join(", ", duplicates.ToArray()) + " Already Used For Another Site", MessageType.Warning);
AddModuleMessage(string.Format(Localizer["Message.SiteName.InUse"], string.Join(", ", duplicates.ToArray())), MessageType.Warning);
}
}
else
{
AddModuleMessage("You Must Provide A Tenant, Site Name, Alias, Default Theme/Container, And Site Template", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.Tenant"], MessageType.Warning);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private void ToggleConnectionString()
{
if (_databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
_connectionString = databaseConfigControl.GetConnectionString();
}
_showConnectionString = !_showConnectionString;
}
}

View File

@@ -1,280 +0,0 @@
@namespace Oqtane.Modules.Admin.Sites
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ISiteService SiteService
@inject ITenantService TenantService
@inject IAliasService AliasService
@inject IThemeService ThemeService
@if (_initialized)
{
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="Enter the name of the site">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" />
</td>
</tr>
<tr>
<td>
<Label For="tenant" HelpText="Enter the tenant for the site">Tenant: </Label>
</td>
<td>
<input id="tenant" class="form-control" @bind="@_tenant" readonly />
</td>
</tr>
<tr>
<td>
<Label For="alias" HelpText="Enter the alias for the server">Aliases: </Label>
</td>
<td>
<textarea id="alias" class="form-control" @bind="@_urls" rows="3" />
</td>
</tr>
<tr>
<td>
<Label For="defaultTheme" HelpText="Select the default theme for the website">Default Theme: </Label>
</td>
<td>
<select id="defaultTheme" class="form-control" @onchange="(e => ThemeChanged(e))">
<option value="-">&lt;Select Theme&gt;</option>
@foreach (var theme in _themes)
{
if (theme.TypeName == _themetype)
{
<option value="@theme.TypeName" selected>@theme.Name</option>
}
else
{
<option value="@theme.TypeName">@theme.Name</option>
}
}
</select>
</td>
</tr>
@if (_layouts.Count > 0)
{
<tr>
<td>
<Label For="defaultLayout" HelpText="Select the default layout for the site">Default Layout: </Label>
</td>
<td>
<select id="defaultLayout" class="form-control" @bind="@_layouttype">
<option value="-">&lt;Select Layout&gt;</option>
@foreach (var layout in _layouts)
{
<option value="@(layout.TypeName)">@(layout.Name)</option>
}
</select>
</td>
</tr>
}
<tr>
<td>
<Label For="defaultContainer" HelpText="Select the default container for the site">Default Container: </Label>
</td>
<td>
<select id="defaultIdea" class="form-control" @bind="@_containertype">
<option value="-">&lt;Select Container&gt;</option>
@foreach (var container in _containers)
{
<option value="@container.TypeName">@container.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="isDeleted" HelpText="Has this site been deleted?">Is Deleted? </Label>
</td>
<td>
<select id="isDeleted" class="form-control" @bind="@_isdeleted">
<option value="True">Yes</option>
<option value="False">No</option>
</select>
</td>
</tr>
</table>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSite">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<br />
<br />
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon" DeletedBy="@_deletedby" DeletedOn="@_deletedon"></AuditInfo>
}
@code {
private bool _initialized = false;
private List<Theme> _themeList;
private List<ThemeControl> _themes = new List<ThemeControl>();
private List<ThemeControl> _layouts = new List<ThemeControl>();
private List<ThemeControl> _containers = new List<ThemeControl>();
private Alias _alias;
private string _name = string.Empty;
private List<Tenant> _tenantList;
private string _tenant = string.Empty;
private List<Alias> _aliasList;
private string _urls = string.Empty;
private string _themetype;
private string _layouttype;
private string _containertype;
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
private string _deletedby;
private DateTime? _deletedon;
private string _isdeleted;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
_themeList = await ThemeService.GetThemesAsync();
_aliasList = await AliasService.GetAliasesAsync();
_alias = _aliasList.Find(item => item.AliasId == Int32.Parse(PageState.QueryString["id"]));
SiteService.SetAlias(_alias);
var site = await SiteService.GetSiteAsync(_alias.SiteId);
if (site != null)
{
_name = site.Name;
_tenantList = await TenantService.GetTenantsAsync();
_tenant = _tenantList.Find(item => item.TenantId == site.TenantId).Name;
foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList())
{
_urls += alias.Name + "\n";
}
_themes = ThemeService.GetThemeControls(_themeList);
_themetype = site.DefaultThemeType;
_layouts = ThemeService.GetLayoutControls(_themeList, _themetype);
_layouttype = site.DefaultLayoutType;
_containers = ThemeService.GetContainerControls(_themeList, _themetype);
_containertype = site.DefaultContainerType;
_createdby = site.CreatedBy;
_createdon = site.CreatedOn;
_modifiedby = site.ModifiedBy;
_modifiedon = site.ModifiedOn;
_deletedby = site.DeletedBy;
_deletedon = site.DeletedOn;
_isdeleted = site.IsDeleted.ToString();
_initialized = true;
}
}
catch (Exception ex)
{
await Log(_alias, LogLevel.Error, string.Empty, ex, "Error Loading Site {SiteId} {Error}", _alias.SiteId, ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
}
}
private async void ThemeChanged(ChangeEventArgs e)
{
try
{
_themetype = (string)e.Value;
if (_themetype != "-")
{
_layouts = ThemeService.GetLayoutControls(_themeList, _themetype);
_containers = ThemeService.GetContainerControls(_themeList, _themetype);
}
else
{
_layouts = new List<ThemeControl>();
_containers = new List<ThemeControl>();
}
_layouttype = "-";
_containertype = "-";
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message);
AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error);
}
}
private async Task SaveSite()
{
try
{
if (_name != string.Empty && _urls != string.Empty && _themetype != "-" && (_layouts.Count == 0 || _layouttype != "-") && _containertype != "-")
{
var unique = true;
foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
if (_aliasList.Exists(item => item.Name == name && item.SiteId != _alias.SiteId && item.TenantId != _alias.TenantId))
{
unique = false;
}
}
if (unique)
{
SiteService.SetAlias(_alias);
var site = await SiteService.GetSiteAsync(_alias.SiteId);
if (site != null)
{
site.Name = _name;
site.LogoFileId = null;
site.DefaultThemeType = _themetype;
site.DefaultLayoutType = _layouttype ?? string.Empty;
site.DefaultContainerType = _containertype;
site.IsDeleted = (_isdeleted == null || Boolean.Parse(_isdeleted));
site = await SiteService.UpdateSiteAsync(site);
_urls = _urls.Replace("\n", ",");
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList())
{
if (!names.Contains(alias.Name))
{
await AliasService.DeleteAliasAsync(alias.AliasId);
}
}
foreach (string name in names)
{
if (!_aliasList.Exists(item => item.Name == name))
{
Alias alias = new Alias
{
Name = name,
TenantId = site.TenantId,
SiteId = site.SiteId
};
await AliasService.AddAliasAsync(alias);
}
}
await Log(_alias, LogLevel.Information,PermissionNames.Edit, null, "Site Saved {Site}", site);
NavigationManager.NavigateTo(NavigateUrl());
}
}
else
{
AddModuleMessage("An Alias Specified Has Already Been Used For Another Site", MessageType.Warning);
}
}
else
{
AddModuleMessage("You Must Provide A Site Name, Alias, And Default Theme/Container", MessageType.Warning);
}
}
catch (Exception ex)
{
await Log(_alias, LogLevel.Error, string.Empty, ex, "Error Saving Site {SiteId} {Error}", _alias.SiteId, ex.Message);
AddModuleMessage("Error Saving Site", MessageType.Error);
}
}
}

View File

@@ -1,80 +1,72 @@
@namespace Oqtane.Modules.Admin.Sites
@namespace Oqtane.Modules.Admin.Sites
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IAliasService AliasService
@inject ISiteService SiteService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_sites == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Add Site" />
<ActionLink Action="Add" Text="Add Site" ResourceKey="AddSite" />
<Pager Items="@_sites">
<Pager Items="@_sites" SearchProperties="Name">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th>@Localizer["AliasName"]</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.AliasId.ToString())" /></td>
<td><ActionDialog Header="Delete Site" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Site?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteSite(context))" /></td>
<td><a href="@(_scheme + context.Name)">@context.Name</a></td>
<td><button type="button" class="btn btn-primary" @onclick="@(async () => Edit(context.Name))">@SharedLocalizer["Edit"]</button></td>
<td><button type="button" class="btn btn-secondary" @onclick="@(async () => Browse(context.Name))">@Localizer["Browse"]</button></td>
<td>@context.Name</td>
</Row>
</Pager>
}
@code {
private List<Alias> _sites;
private string _scheme;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnParametersSetAsync()
{
var uri = new Uri(NavigationManager.Uri);
_scheme = uri.Scheme + "://";
var aliases = await AliasService.GetAliasesAsync();
_sites = new List<Alias>();
foreach (Alias alias in aliases)
{
if (!_sites.Exists(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId))
if (alias.IsDefault && !_sites.Exists(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId))
{
_sites.Add(alias);
}
}
}
private async Task DeleteSite(Alias alias)
private void Edit(string name)
{
try
if (PageState.Alias.Name == name)
{
if (alias.SiteId != PageState.Site.SiteId || alias.TenantId != PageState.Site.TenantId)
{
SiteService.SetAlias(alias);
await SiteService.DeleteSiteAsync(alias.SiteId);
await Log(alias, LogLevel.Information, "", null, "Site Deleted {SiteId}", alias.SiteId);
var aliases = await AliasService.GetAliasesAsync();
foreach (Alias a in aliases.Where(item => item.SiteId == alias.SiteId && item.TenantId == alias.TenantId))
{
await AliasService.DeleteAliasAsync(a.AliasId);
}
NavigationManager.NavigateTo(NavigateUrl());
NavigationManager.NavigateTo("/admin/site");
}
else
{
AddModuleMessage("You Can Not Delete The Current Site", MessageType.Warning);
NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + name + "/admin/site", true);
}
}
catch (Exception ex)
private void Browse(string name)
{
await Log(alias, LogLevel.Error, "", ex, "Error Deleting Site {SiteId} {Error}", alias.SiteId, ex.Message);
AddModuleMessage("Error Deleting Site", MessageType.Error);
if (PageState.Alias.Name == name)
{
NavigationManager.NavigateTo(PageState.Alias.Path + "/");
}
else
{
NavigationManager.NavigateTo(PageState.Uri.Scheme + "://" + name, true);
}
}
}

View File

@@ -1,111 +1,325 @@
@namespace Oqtane.Modules.Admin.Sql
@namespace Oqtane.Modules.Admin.Sql
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ISystemService SystemService
@inject ITenantService TenantService
@inject IDatabaseService DatabaseService
@inject ISqlService SqlService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_tenants == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<table class="table table-borderless">
<tr>
<td>
<Label For="tenant" HelpText="Select the tenant for the SQL server">Tenant: </Label>
</td>
<td>
<select id="teneant" class="form-control" @bind="_tenantid">
<option value="-1">&lt;Select Tenant&gt;</option>
@foreach (Tenant tenant in _tenants)
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="connection" HelpText="Select a database connection (from appsettings.json)" ResourceKey="Connection">Connection: </Label>
<div class="col-sm-9">
<select id="tenant" class="form-select" value="@_connection" @onchange="(e => ConnectionChanged(e))">
<option value="-">&lt;@Localizer["Connection.Select"]&gt;</option>
<option value="+">&lt;@Localizer["Connection.Add"]&gt;</option>
@foreach (var connection in _connections)
{
<option value="@tenant.TenantId">@tenant.Name</option>
<option value="@connection.Key">@connection.Key</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="sqlQeury" HelpText="Enter the query for the SQL server">SQL Query: </Label>
</td>
<td>
<textarea id="sqlQeury" class="form-control" @bind="@_sql" rows="5"></textarea>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="Execute">Execute</button>
<br /><br />
@if (!string.IsNullOrEmpty(_results))
</div>
</div>
@if (_connection == "+")
{
@((MarkupString)_results)
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter the name of the connection" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" maxlength="100" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="databasetype" HelpText="Select the database type" ResourceKey="DatabaseType">Type: </Label>
<div class="col-sm-9">
@if (_databases != null)
{
<div class="input-group">
<select id="databasetype" class="form-select" value="@_databasetype" @onchange="(e => DatabaseTypeChanged(e))" required>
@foreach (var database in _databases)
{
<option value="@database.Name">@Localizer[@database.Name]</option>
}
</select>
@if (!_showConnectionString)
{
<button type="button" class="btn btn-secondary" @onclick="ShowConnectionString">@Localizer["EnterConnectionString"]</button>
}
else
{
<button type="button" class="btn btn-secondary" @onclick="ShowConnectionString">@Localizer["EnterConnectionParameters"]</button>
}
</div>
}
</div>
</div>
@if (!_showConnectionString)
{
if (_databaseConfigType != null)
{
@DatabaseConfigComponent
}
}
else
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="connectionstring" HelpText="Enter a complete connection string including all parameters and delimiters" ResourceKey="ConnectionString">Settings:</Label>
<div class="col-sm-9">
<textarea id="connectionstring" class="form-control" @bind="@_connectionstring" rows="3"></textarea>
</div>
</div>
}
<br />
<button type="button" class="btn btn-success" @onclick="Add">@Localizer["Add"]</button>
}
else
{
@if (_connection != "-")
{
@if (!string.IsNullOrEmpty(_tenant))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="databasetype" HelpText="The database type" ResourceKey="DatabaseType">Type: </Label>
<div class="col-sm-9">
<input id="databasetype" class="form-control" @bind="@_databasetype" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="tenant" HelpText="The database using this connection" ResourceKey="Tenant">Database: </Label>
<div class="col-sm-9">
<input id="tenant" class="form-control" @bind="@_tenant" readonly />
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="connectionstring" HelpText="The connection string" ResourceKey="ConnectionString">Settings: </Label>
<div class="col-sm-9">
<div class="input-group">
<input id="connectionstring" type="@_connectionstringtype" class="form-control" @bind="@_connectionstring" readonly />
<button type="button" class="btn btn-secondary" @onclick="@ToggleConnectionString">@_connectionstringtoggle</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="sqlQuery" HelpText="Enter a valid SQL query for the database" ResourceKey="SqlQuery">SQL Query: </Label>
<div class="col-sm-9">
<textarea id="sqlQuery" class="form-control" @bind="@_sql" rows="3"></textarea>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="Execute">@Localizer["Execute"]</button>
<br />
<br />
@if (_results != null)
{
@if (_results.Count > 0)
{
<Pager Class="table table-bordered" Items="@_results">
<Header>
@foreach (KeyValuePair<string, string> kvp in _results.First())
{
<th>@kvp.Key</th>
}
</Header>
<Row>
@foreach (KeyValuePair<string, string> kvp in context)
{
<td>@kvp.Value</td>
}
</Row>
</Pager>
}
else
{
@Localizer["Return.NoResult"]
}
<br />
<br />
}
}
}
</div>
}
@code {
private string _connection = "-";
private Dictionary<string, object> _connections;
private List<Tenant> _tenants;
private string _tenantid = "-1";
private List<Database> _databases;
private string _name = string.Empty;
private string _databasetype = string.Empty;
private Type _databaseConfigType;
private object _databaseConfig;
private RenderFragment DatabaseConfigComponent { get; set; }
private bool _showConnectionString = false;
private string _tenant = string.Empty;
private string _connectionstring = string.Empty;
private string _connectionstringtype = "password";
private string _connectionstringtoggle = string.Empty;
private string _sql = string.Empty;
private string _results = string.Empty;
private List<Dictionary<string, string>> _results;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
_connections = await SystemService.GetSystemInfoAsync("connectionstrings");
_tenants = await TenantService.GetTenantsAsync();
_databases = await DatabaseService.GetDatabasesAsync();
_connectionstringtoggle = SharedLocalizer["ShowPassword"];
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Tenants {Error}", ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
}
}
private async void ConnectionChanged(ChangeEventArgs e)
{
try
{
_connection = (string)e.Value;
if (_connection != "-" && _connection != "+")
{
_connectionstring = _connections[_connection].ToString();
_tenant = "";
_databasetype = "";
var tenant = _tenants.FirstOrDefault(item => item.DBConnectionString == _connection);
if (tenant != null)
{
_tenant = tenant.Name;
_databasetype = _databases.FirstOrDefault(item => item.DBType == tenant.DBType && item.Name != "LocalDB").Name;
}
}
else
{
if (_databases.Exists(item => item.IsDefault))
{
_databasetype = _databases.Find(item => item.IsDefault).Name;
}
else
{
_databasetype = "LocalDB";
}
_showConnectionString = false;
LoadDatabaseConfigComponent();
}
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Connection {Connection} {Error}", _connection, ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
}
}
private void DatabaseTypeChanged(ChangeEventArgs eventArgs)
{
try
{
_databasetype = (string)eventArgs.Value;
_showConnectionString = false;
LoadDatabaseConfigComponent();
}
catch
{
AddModuleMessage(Localizer["Error.Database.LoadConfig"], MessageType.Error);
}
}
private void LoadDatabaseConfigComponent()
{
var database = _databases.SingleOrDefault(d => d.Name == _databasetype);
if (database != null)
{
_databaseConfigType = Type.GetType(database.ControlType);
DatabaseConfigComponent = builder =>
{
builder.OpenComponent(0, _databaseConfigType);
builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); });
builder.CloseComponent();
};
}
}
private void ShowConnectionString()
{
if (_databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
_connectionstring = databaseConfigControl.GetConnectionString();
}
_showConnectionString = !_showConnectionString;
}
private async Task Add()
{
var connectionstring = _connectionstring;
if (!_showConnectionString && _databaseConfig is IDatabaseConfigControl databaseConfigControl)
{
connectionstring = databaseConfigControl.GetConnectionString();
}
if (!string.IsNullOrEmpty(_name) && !string.IsNullOrEmpty(connectionstring))
{
var settings = new Dictionary<string, object>();
settings.Add($"{SettingKeys.ConnectionStringsSection}:{_name}", connectionstring);
await SystemService.UpdateSystemInfoAsync(settings);
_connections = await SystemService.GetSystemInfoAsync("connectionstrings");
_connection = "-";
AddModuleMessage(Localizer["Message.Connection.Added"], MessageType.Success);
}
else
{
AddModuleMessage(Localizer["Message.Required.Connection"], MessageType.Warning);
}
}
private void ToggleConnectionString()
{
if (_connectionstringtype == "password")
{
_connectionstringtype = "text";
_connectionstringtoggle = SharedLocalizer["HidePassword"];
}
else
{
_connectionstringtype = "password";
_connectionstringtoggle = SharedLocalizer["ShowPassword"];
}
}
private async Task Execute()
{
if (_tenantid != "-1" && !string.IsNullOrEmpty(_sql))
try
{
var sqlquery = new SqlQuery { TenantId = int.Parse(_tenantid), Query = _sql };
if (_databasetype != "-" && !string.IsNullOrEmpty(_sql))
{
var dbtype = _databases.FirstOrDefault(item => item.Name == _databasetype).DBType;
var sqlquery = new SqlQuery { DBConnectionString = _connection, DBType = dbtype, Query = _sql };
sqlquery = await SqlService.ExecuteQueryAsync(sqlquery);
_results = DisplayResults(sqlquery.Results);
_results = sqlquery.Results;
AddModuleMessage(Localizer["Success.QueryExecuted"], MessageType.Success);
}
else
{
AddModuleMessage("You Must Select A Tenant And Provide A SQL Query", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.Tenant"], MessageType.Warning);
}
}
private string DisplayResults(List<Dictionary<string, string>> results)
catch (Exception ex)
{
var table = string.Empty;
foreach (Dictionary<string, string> item in results)
{
if (table == string.Empty)
{
table = "<div class=\"table-responsive\">";
table += "<table class=\"table table-bordered\"><thead><tr>";
foreach (KeyValuePair<string, string> kvp in item)
{
table += "<th scope=\"col\">" + kvp.Key + "</th>";
await logger.LogError(ex, "Error Executing SQL Query {SQL} {Error}", _sql, ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
}
table += "</tr></thead><tbody>";
}
table += "<tr>";
foreach (KeyValuePair<string, string> kvp in item)
{
table += "<td>" + kvp.Value + "</td>";
}
table += "</tr>";
}
if (table != string.Empty)
{
table += "</tbody></table></div>";
}
else
{
table = "No Results Returned";
}
return table;
}
}

View File

@@ -1,81 +1,294 @@
@namespace Oqtane.Modules.Admin.SystemInfo
@namespace Oqtane.Modules.Admin.SystemInfo
@inherits ModuleBase
@inject ISystemService SystemService
@inject IInstallationService InstallationService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<table class="table table-borderless">
<tr>
<td>
<Label For="version" HelpText="Framework Version">Framework Version: </Label>
</td>
<td>
<TabStrip>
<TabPanel Name="Info" Heading="Info" ResourceKey="Info">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="version" HelpText="Framework Version" ResourceKey="FrameworkVersion">Framework Version: </Label>
<div class="col-sm-9">
<input id="version" class="form-control" @bind="@_version" readonly />
</td>
</tr>
<tr>
<td>
<Label For="runtime" HelpText="Blazor Runtime (Server or WebAssembly)">Blazor Runtime: </Label>
</td>
<td>
<input id="runtime" class="form-control" @bind="@_runtime" readonly />
</td>
</tr>
<tr>
<td>
<Label For="clrversion" HelpText="Common Language Runtime Version">CLR Version: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="clrversion" HelpText="Common Language Runtime Version" ResourceKey="CLRVersion">CLR Version: </Label>
<div class="col-sm-9">
<input id="clrversion" class="form-control" @bind="@_clrversion" readonly />
</td>
</tr>
<tr>
<td>
<Label For="osversion" HelpText="Operating System Version">OS Version: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="osversion" HelpText="Operating System Version" ResourceKey="OSVersion">OS Version: </Label>
<div class="col-sm-9">
<input id="osversion" class="form-control" @bind="@_osversion" readonly />
</td>
</tr>
<tr>
<td>
<Label For="serverpath" HelpText="Server Path">Server Path: </Label>
</td>
<td>
<input id="serverpath" class="form-control" @bind="@_serverpath" readonly />
</td>
</tr>
<tr>
<td>
<Label For="servertime" HelpText="Server Time">Server Time: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="process" HelpText="Indicates if the current process is 32 bit or 64 bit" ResourceKey="Process">Process: </Label>
<div class="col-sm-9">
<input id="process" class="form-control" @bind="@_process" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="machinename" HelpText="Machine Name" ResourceKey="MachineName">Machine Name: </Label>
<div class="col-sm-9">
<input id="machinename" class="form-control" @bind="@_machinename" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ipaddress" HelpText="Server IP Address" ResourceKey="IPAddress">IP Address: </Label>
<div class="col-sm-9">
<input id="ipaddress" class="form-control" @bind="@_ipaddress" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="environment" HelpText="Environment name" ResourceKey="Environment">Environment: </Label>
<div class="col-sm-9">
<input id="environment" class="form-control" @bind="@_environment" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="contentrootpath" HelpText="Root Path" ResourceKey="ContentRootPath">Root Path: </Label>
<div class="col-sm-9">
<input id="contentrootpath" class="form-control" @bind="@_contentrootpath" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="webrootpath" HelpText="Web Path" ResourceKey="WebRootPath">Web Path: </Label>
<div class="col-sm-9">
<input id="webrootpath" class="form-control" @bind="@_webrootpath" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="servertime" HelpText="Server Date/Time (in UTC)" ResourceKey="ServerTime">Server Date/Time: </Label>
<div class="col-sm-9">
<input id="servertime" class="form-control" @bind="@_servertime" readonly />
</td>
</tr>
</table>
<a class="btn btn-primary" href="swagger/index.html" target="_new">Access Framework API</a>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="workingset" HelpText="Memory Allocation Of Service (in MB)" ResourceKey="WorkingSet">Memory Allocation: </Label>
<div class="col-sm-9">
<input id="workingset" class="form-control" @bind="@_workingset" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="installationid" HelpText="The Unique Identifier For Your Installation" ResourceKey="InstallationId">Installation ID: </Label>
<div class="col-sm-9">
<input id="installationid" class="form-control" @bind="@_installationid" readonly />
</div>
</div>
</div>
<br /><br />
<ActionDialog Header="Restart Application" Message="Are You Sure You Wish To Restart The Application?" Action="Restart Application" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await RestartApplication())" ResourceKey="RestartApplication" />
</TabPanel>
<TabPanel Name="Options" Heading="Options" ResourceKey="Options">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="detailederrors" HelpText="Specify If Detailed Errors Are Enabled For Blazor. This Option Should Not Not Be Enabled In Production." ResourceKey="DetailedErrors">Detailed Errors? </Label>
<div class="col-sm-9">
<select id="detailederrors" class="form-select" @bind="@_detailederrors">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="logginglevel" HelpText="The Minimum Logging Level For The Event Log. This Option Can Be Used To Control The Volume Of Items Stored In Your Event Log." ResourceKey="LoggingLevel">Logging Level: </Label>
<div class="col-sm-9">
<select id="logginglevel" class="form-select" @bind="@_logginglevel">
<option value="Trace">@Localizer["Trace"]</option>
<option value="Debug">@Localizer["Debug"]</option>
<option value="Information">@Localizer["Information"]</option>
<option value="Warning">@Localizer["Warning"]</option>
<option value="Error">@Localizer["Error"]</option>
<option value="Critical">@Localizer["Critical"]</option>
<option value="None">@Localizer["None"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="notificationlevel" HelpText="The Minimum Logging Level For Which Notifications Should Be Sent To Host Users." ResourceKey="NotificationLevel">Notification Level: </Label>
<div class="col-sm-9">
<select id="notificationlevel" class="form-select" @bind="@_notificationlevel">
<option value="Trace">@Localizer["Trace"]</option>
<option value="Debug">@Localizer["Debug"]</option>
<option value="Information">@Localizer["Information"]</option>
<option value="Warning">@Localizer["Warning"]</option>
<option value="Error">@Localizer["Error"]</option>
<option value="Critical">@Localizer["Critical"]</option>
<option value="None">@Localizer["None"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="swagger" HelpText="Specify If Swagger Is Enabled For Your Server API" ResourceKey="Swagger">Swagger Enabled? </Label>
<div class="col-sm-9">
<select id="swagger" class="form-select" @bind="@_swagger">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="cachecontrol" HelpText="Provide a Cache-Control directive for static assets. For example 'public, max-age=60' indicates that static assets should be cached for 60 seconds. A blank value indicates caching is not enabled." ResourceKey="CacheControl">Static Asset Caching: </Label>
<div class="col-sm-9">
<input id="cachecontrol" class="form-control" @bind="@_cachecontrol" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="packageregistryurl" HelpText="Specify The Url Of The Package Manager Service For Installing Modules, Themes, And Translations. If This Field Is Blank It Means The Package Manager Service Is Disabled For This Installation." ResourceKey="PackageManager">Package Manager Url: </Label>
<div class="col-sm-9">
<input id="packageregistryurl" class="form-control" @bind="@_packageregistryurl" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="packageregistryemail" HelpText="Specify The Email Address Of The User Account Used For Interacting With The Package Manager Service. This Account Is Used For Managing Packages Across Multiple Installations." ResourceKey="PackageManagerEmail">Package Manager Email: </Label>
<div class="col-sm-9">
<input id="packageregistryemail" class="form-control" @bind="@_packageregistryemail" />
</div>
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveConfig">@SharedLocalizer["Save"]</button>&nbsp;
<ActionDialog Header="Restart Application" Message="Are You Sure You Wish To Restart The Application?" Action="Restart Application" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await RestartApplication())" ResourceKey="RestartApplication" />
<br /><br />
<a class="btn btn-primary" href="swagger/index.html" target="_new">@Localizer["Swagger"]</a>&nbsp;
<a class="btn btn-secondary" href="api/endpoint" target="_new">@Localizer["Endpoints"]</a>
</TabPanel>
<TabPanel Name="Log" Heading="Log" ResourceKey="Log">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="log" HelpText="System log information for current day" ResourceKey="Log">Log: </Label>
<div class="col-sm-9">
<textarea id="log" class="form-control" rows="10" @bind="@_log" readonly />
</div>
</div>
</div>
<br /><br />
<button type="button" class="btn btn-danger" @onclick="ClearLog">@Localizer["Clear"]</button>
</TabPanel>
</TabStrip>
<br /><br />
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
private string _version = string.Empty;
private string _runtime = string.Empty;
private string _clrversion = string.Empty;
private string _osversion = string.Empty;
private string _serverpath = string.Empty;
private string _process = string.Empty;
private string _machinename = string.Empty;
private string _ipaddress = string.Empty;
private string _environment = string.Empty;
private string _contentrootpath = string.Empty;
private string _webrootpath = string.Empty;
private string _servertime = string.Empty;
private string _workingset = string.Empty;
private string _installationid = string.Empty;
private string _detailederrors = string.Empty;
private string _logginglevel = string.Empty;
private string _notificationlevel = string.Empty;
private string _swagger = string.Empty;
private string _cachecontrol = string.Empty;
private string _packageregistryurl = string.Empty;
private string _packageregistryemail = string.Empty;
private string _log = string.Empty;
protected override async Task OnInitializedAsync()
{
_version = Constants.Version;
_runtime = PageState.Runtime.ToString();
Dictionary<string, string> systeminfo = await SystemService.GetSystemInfoAsync();
var systeminfo = await SystemService.GetSystemInfoAsync("environment");
if (systeminfo != null)
{
_clrversion = systeminfo["clrversion"];
_osversion = systeminfo["osversion"];
_serverpath = systeminfo["serverpath"];
_servertime = systeminfo["servertime"];
_clrversion = systeminfo["CLRVersion"].ToString();
_osversion = systeminfo["OSVersion"].ToString();
_process = systeminfo["Process"].ToString();
_machinename = systeminfo["MachineName"].ToString();
_ipaddress = systeminfo["IPAddress"].ToString();
_environment = systeminfo["Environment"].ToString();
_contentrootpath = systeminfo["ContentRootPath"].ToString();
_webrootpath = systeminfo["WebRootPath"].ToString();
_servertime = systeminfo["ServerTime"].ToString() + " UTC";
_workingset = (Convert.ToInt64(systeminfo["WorkingSet"].ToString()) / 1000000).ToString() + " MB";
}
systeminfo = await SystemService.GetSystemInfoAsync("configuration");
if (systeminfo != null)
{
_installationid = systeminfo["InstallationId"].ToString();
_detailederrors = systeminfo["DetailedErrors"].ToString();
_logginglevel = systeminfo["Logging:LogLevel:Default"].ToString();
_notificationlevel = systeminfo["Logging:LogLevel:Notify"].ToString();
_swagger = systeminfo["UseSwagger"].ToString();
_cachecontrol = systeminfo["CacheControl"].ToString();
_packageregistryurl = systeminfo["PackageRegistryUrl"].ToString();
_packageregistryemail = systeminfo["PackageRegistryEmail"].ToString();
}
systeminfo = await SystemService.GetSystemInfoAsync("log");
if (systeminfo != null)
{
_log = systeminfo["Log"].ToString();
}
}
private async Task SaveConfig()
{
try
{
var settings = new Dictionary<string, object>();
settings.Add("DetailedErrors", _detailederrors);
settings.Add("Logging:LogLevel:Default", _logginglevel);
settings.Add("Logging:LogLevel:Notify", _notificationlevel);
settings.Add("UseSwagger", _swagger);
settings.Add("CacheControl", _cachecontrol);
settings.Add("PackageRegistryUrl", _packageregistryurl);
settings.Add("PackageRegistryEmail", _packageregistryemail);
await SystemService.UpdateSystemInfoAsync(settings);
AddModuleMessage(Localizer["Success.UpdateConfig.Restart"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Configuration");
AddModuleMessage(Localizer["Error.UpdateConfig"], MessageType.Error);
}
}
private async Task ClearLog()
{
try
{
var settings = new Dictionary<string, object>();
settings.Add("clearlog", "true");
await SystemService.UpdateSystemInfoAsync(settings);
_log = string.Empty;
AddModuleMessage(Localizer["Success.ClearLog"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Clearing Log");
AddModuleMessage(Localizer["Error.ClearLog"], MessageType.Error);
}
}
private async Task RestartApplication()
{
try
{
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(""), 20);
await InstallationService.RestartAsync();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Restarting Application");
}
}
}

View File

@@ -1,85 +0,0 @@
@namespace Oqtane.Modules.Admin.Tenants
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject ITenantService TenantService
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="The name of the tenant">Name: </Label>
</td>
<td>
@if (name == Constants.MasterTenant)
{
<input id="name" class="form-control" @bind="@name" readonly />
}
else
{
<input id="name" class="form-control" @bind="@name" />
}
</td>
</tr>
<tr>
<td>
<Label For="connectionstring" HelpText="The database connection string">Connection String: </Label>
</td>
<td>
<textarea id="connectionstring" class="form-control" @bind="@connectionstring" rows="3" readonly></textarea>
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveTenant">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@code {
private int tenantid;
private string name = string.Empty;
private string connectionstring = string.Empty;
private string schema = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
tenantid = Int32.Parse(PageState.QueryString["id"]);
var tenant = await TenantService.GetTenantAsync(tenantid);
if (tenant != null)
{
name = tenant.Name;
connectionstring = tenant.DBConnectionString;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Tenant {TenantId} {Error}", tenantid, ex.Message);
AddModuleMessage("Error Loading Tenant", MessageType.Error);
}
}
private async Task SaveTenant()
{
try
{
connectionstring = connectionstring.Replace("\\\\", "\\");
var tenant = await TenantService.GetTenantAsync(tenantid);
if (tenant != null)
{
tenant.Name = name;
tenant.DBConnectionString = connectionstring;
await TenantService.UpdateTenantAsync(tenant);
await logger.LogInformation("Tenant Saved {TenantId}", tenantid);
NavigationManager.NavigateTo(NavigateUrl());
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Tenant {TenantId} {Error}", tenantid, ex.Message);
AddModuleMessage("Error Saving Tenant", MessageType.Error);
}
}
}

View File

@@ -1,67 +0,0 @@
@namespace Oqtane.Modules.Admin.Tenants
@inherits ModuleBase
@inject ITenantService TenantService
@inject IAliasService AliasService
@if (tenants == null)
{
<p><em>Loading...</em></p>
}
else
{
<Pager Items="@tenants">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.TenantId.ToString())" /></td>
<td><ActionDialog Header="Delete Tenant" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Tenant?")" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteTenant(context))" Disabled="@(context.Name == Constants.MasterTenant)" /></td>
<td>@context.Name</td>
</Row>
</Pager>
}
@code {
private List<Tenant> tenants;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnParametersSetAsync()
{
tenants = await TenantService.GetTenantsAsync();
}
private async Task DeleteTenant(Tenant Tenant)
{
try
{
string message = string.Empty;
var aliases = await AliasService.GetAliasesAsync();
foreach (var alias in aliases)
{
if (alias.TenantId == Tenant.TenantId)
{
message += ", " + alias.Name;
}
}
if (string.IsNullOrEmpty(message))
{
await TenantService.DeleteTenantAsync(Tenant.TenantId);
await logger.LogInformation("Tenant Deleted {Tenant}", Tenant);
StateHasChanged();
}
else
{
AddModuleMessage("Tenant Cannot Be Deleted Until The Following Sites Are Deleted: " + message.Substring(2), MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Tenant {Tenant} {Error}", Tenant, ex.Message);
AddModuleMessage("Error Deleting Tenant", MessageType.Error);
}
}
}

View File

@@ -1,53 +1,185 @@
@namespace Oqtane.Modules.Admin.Themes
@namespace Oqtane.Modules.Admin.Themes
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IFileService FileService
@inject IThemeService ThemeService
@inject IPackageService PackageService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_packages != null)
{
<TabStrip>
@if (_packages.Count > 0)
<TabStrip>
<TabPanel Name="Download" ResourceKey="Download">
<div class="row justify-content-center mb-3">
<div class="text-center">
<div class="form-check form-check-inline">
<input id="free" class="form-check-input" type="radio" checked="@(_price == "free")" name="Price" @onchange="@(() => PriceChanged("free"))" />
<label class="form-check-label" for="free">@SharedLocalizer["Free"]</label>
</div>
<div class="form-check form-check-inline">
<input id="paid" class="form-check-input" type="radio" checked="@(_price == "paid")" name="Price" @onchange="@(() => PriceChanged("paid"))" />
<label class="form-check-label" for="paid">@SharedLocalizer["Paid"]</label>
</div>
</div>
</div>
<div class="row justify-content-center mb-3">
<div class="col">
<div class="input-group">
<span class="input-group-text">@Localizer["Product"]</span>
<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>
<button type="button" class="btn btn-primary ms-2" @onclick="Refresh"><span class="@Icons.Reload" aria-hidden="true"></span></button>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col">
@if (_initialized)
{
<TabPanel Name="Download">
<ModuleMessage Type="MessageType.Info" Message="Download one or more themes from the list below. Once you are ready click Install to complete the installation."></ModuleMessage>
<Pager Items="@_packages">
<Header>
<th>Name</th>
<th>Version</th>
<th style="width: 1px;"></th>
</Header>
<br />
<div class="row mb-3">
<div class="col-sm-4">
<h3>@((_packages != null) ? _packages.Count : 0) @SharedLocalizer["Search.Results"]</h3>
</div>
<div class="col-sm-4">
&nbsp;
</div>
<div class="col-sm-4">
<select class="form-select" value="@_sort" @onchange="(e => SortChanged(e))">
<option value="popularity">@SharedLocalizer["Search.Popularity"]</option>
<option value="alphabetical">@SharedLocalizer["Search.Alphabetical"]</option>
@if (_price == "free")
{
<option value="downloads">@SharedLocalizer["Search.Downloads"]</option>
}
<option value="recent">@SharedLocalizer["Search.RecentlyReleased"]</option>
@if (_price == "paid")
{
<option value="price">@SharedLocalizer["Search.Price"]</option>
}
</select>
</div>
</div>
<Pager Format="Grid" Items="@_packages" DisplayPages="1" PageSize="9" Toolbar="Both" Class="container-fluid px-0" RowClass="row g-0" ColumnClass="col-lg-4 col-md-6">
<Row>
<td>@context.Name</td>
<td>@context.Version</td>
<td>
<button type="button" class="btn btn-primary" @onclick=@(async () => await DownloadTheme(context.PackageId, context.Version))>Download</button>
</td>
<div class="m-2 p-2 d-flex justify-content-center">
<div class="container-fluid px-0">
<div class="row g-0 mb-2">
<div class="col-4">
<a href="@context.ProductUrl" target="_blank">
@if (context.LogoUrl != null)
{
<img src="@context.LogoUrl" class="img-fluid" alt="@context.Name" />
}
else
{
<img src="/package.png" class="img-fluid" alt="@context.Name" />
}
</a>
</div>
<div class="col-8 text-end">
<small>@SharedLocalizer["Search.Version"]:</small> <strong>@context.Version</strong>
<br /><small>@SharedLocalizer["Search.Released"]:</small> <strong>@context.ReleaseDate.ToString("MM/dd/yyyy")</strong>
@if (!string.IsNullOrEmpty(context.PackageUrl))
{
<br /><small>@SharedLocalizer["Search.Source"]:</small> <strong>@(new Uri(context.PackageUrl).Host)</strong>
}
@if (context.Price == null)
{
<br /><small>@SharedLocalizer["Search.Downloads"]:</small> <strong>@(String.Format("{0:n0}", context.Downloads))</strong>
}
else
{
<br /><small>@SharedLocalizer["From"]:</small> <strong>@context.Price.Value.ToString("$#,##0.00")</strong>
@((MarkupString)(context.TrialPeriod > 0 ? " <strong>(" + context.TrialPeriod + " Day Trial)</strong>" : ""))
}
</div>
</div>
<div class="row g-0">
<div class="col">
<h3 style="display: inline;"><a href="@context.ProductUrl" target="_blank">@context.Name</a></h3><br />
<small>@SharedLocalizer["Search.By"]:</small> <strong><a href="@context.OwnerUrl" target="new">@context.Owner</a></strong><br />
@(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)<br />
<br />
@if (!string.IsNullOrEmpty(context.PackageUrl))
{
<button type="button" class="btn btn-primary" @onclick=@(async () => await GetPackage(context.PackageId, context.Version))>@SharedLocalizer["Download"]</button>
}
@if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl))
{
<a class="btn btn-success ms-2" style="text-decoration: none !important" href="@context.PaymentUrl" target="_new">@SharedLocalizer["Buy"]</a>
}
<br />
</div>
</div>
</div>
</div>
</Row>
</Pager>
</TabPanel>
}
<TabPanel Name="Upload">
<table class="table table-borderless">
<tr>
<td>
<Label HelpText="Upload one or more theme packages. Once they are uploaded click Install to complete the installation.">Theme: </Label>
</td>
<td>
<FileManager Filter="nupkg" ShowFiles="false" Folder="Themes" UploadMultiple="@true" />
</td>
</tr>
</table>
</div>
</div>
<br />
<ModuleMessage Type="MessageType.Info" Message="@SharedLocalizer["Oqtane.Marketplace"]" />
</TabPanel>
</TabStrip>
<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." ResourceKey="Theme">Theme: </Label>
<div class="col-sm-9">
<FileManager Folder="@Constants.PackagesFolder" UploadMultiple="true" OnUpload="OnUpload" />
</div>
</div>
</div>
</TabPanel>
</TabStrip>
<button type="button" class="btn btn-success" @onclick="InstallThemes">Install</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@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>
}
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@code {
private bool _initialized = false;
private int _page = 1;
private List<Package> _packages;
private string _price = "free";
private string _sort = "popularity";
private string _search = "";
private string _productname = "";
private string _license = "";
private string _packageid = "";
private string _version = "";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@@ -55,52 +187,129 @@
{
try
{
var themes = await ThemeService.GetThemesAsync();
_packages = await PackageService.GetPackagesAsync("theme");
await LoadThemes();
_initialized = true;
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Package.Load"], MessageType.Error);
}
}
private async Task LoadThemes()
{
ShowProgressIndicator();
var themes = await ThemeService.GetThemesAsync();
_packages = await PackageService.GetPackagesAsync("theme", _search, _price, "", _sort);
if (_packages != null)
{
foreach (Package package in _packages.ToArray())
{
if (themes.Exists(item => Utilities.GetTypeName(item.ThemeName) == package.PackageId))
if (themes.Exists(item => item.PackageName == package.PackageId))
{
_packages.Remove(package);
}
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message);
AddModuleMessage("Error Loading Packages", MessageType.Error);
}
HideProgressIndicator();
}
private async Task InstallThemes()
private async void PriceChanged(string price)
{
_price = price;
_sort = "popularity";
await LoadThemes();
StateHasChanged();
}
private async Task Search()
{
await LoadThemes();
}
private async Task Reset()
{
_page = 1;
_search = "";
await LoadThemes();
}
private async Task Refresh()
{
await LoadThemes();
}
private void OnPageChange(int page)
{
_page = page;
}
private async void SortChanged(ChangeEventArgs e)
{
_sort = (string)e.Value;
await LoadThemes();
}
private void HideModal()
{
_productname = "";
_license = "";
StateHasChanged();
}
private async Task GetPackage(string packageid, string version)
{
try
{
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ThemeService.InstallThemesAsync();
var package = await PackageService.GetPackageAsync(packageid, version, false);
if (package != null)
{
_productname = package.Name;
if (!string.IsNullOrEmpty(package.License))
{
_license = package.License.Replace("\n", "<br />");
}
_packageid = package.PackageId;
_version = package.Version;
StateHasChanged();
}
else
{
await logger.LogError("Error Getting Package {PackageId} {Version}", packageid, version);
AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Installating Theme");
await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version);
AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error);
}
}
private async Task DownloadTheme(string packageid, string version)
private async Task DownloadPackage()
{
try
{
await PackageService.DownloadPackageAsync(packageid, version, "Themes");
await logger.LogInformation("Theme {ThemeName} {Version} Downloaded Successfully", packageid, version);
AddModuleMessage("Themes Downloaded Successfully. Click Install To Complete Installation.", MessageType.Success);
await PackageService.DownloadPackageAsync(_packageid, _version);
await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version);
AddModuleMessage(string.Format(Localizer["Success.Theme.Download"], NavigateUrl("admin/system")), MessageType.Success);
_productname = "";
_license = "";
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Module {ThemeName} {Version}", packageid, version);
AddModuleMessage("Error Downloading Theme", MessageType.Error);
await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _version);
AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error);
}
}
private void OnUpload()
{
AddModuleMessage(string.Format(Localizer["Success.Theme.Download"], NavigateUrl("admin/system")), MessageType.Success);
}
}

View File

@@ -0,0 +1,160 @@
@namespace Oqtane.Modules.Admin.Themes
@inherits ModuleBase
@using System.Text.RegularExpressions
@inject NavigationManager NavigationManager
@inject IThemeService ThemeService
@inject IModuleService ModuleService
@inject IPageModuleService PageModuleService
@inject ISettingService SettingService
@inject IStringLocalizer<Create> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_templates != null)
{
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="owner" HelpText="Enter the name of the organization who is developing this theme. It should not contain spaces or punctuation." ResourceKey="OwnerName">Owner Name: </Label>
<div class="col-sm-9">
<input id="owner" class="form-control" @bind="@_owner" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="module" HelpText="Enter a name for this theme. It should not contain spaces or punctuation." ResourceKey="ThemeName">Theme Name: </Label>
<div class="col-sm-9">
<input id="module" class="form-control" @bind="@_theme" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="template" HelpText="Select a theme template. Templates are located in the wwwroot/Themes/Templates folder on the server." ResourceKey="Template">Template: </Label>
<div class="col-sm-9">
<select id="template" class="form-select" @onchange="(e => TemplateChanged(e))">
<option value="-">&lt;@Localizer["Template.Select"]&gt;</option>
@foreach (Template template in _templates)
{
<option value="@template.Name">@template.Title</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="reference" HelpText="Select a framework reference version" ResourceKey="FrameworkReference">Framework Reference: </Label>
<div class="col-sm-9">
<select id="reference" class="form-select" @bind="@_reference">
@foreach (string version in _versions)
{
if (Version.Parse(version).CompareTo(Version.Parse(_minversion)) >= 0)
{
<option value="@(version)">@(version)</option>
}
}
<option value="local">@SharedLocalizer["LocalVersion"]</option>
</select>
</div>
</div>
@if (!string.IsNullOrEmpty(_location))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="location" HelpText="Location where the theme will be created" ResourceKey="Location">Location: </Label>
<div class="col-sm-9">
<input id="module" class="form-control" @bind="@_location" readonly />
</div>
</div>
}
</div>
<br />
<button type="button" class="btn btn-success" @onclick="CreateTheme">@Localizer["Theme.Create"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
}
@code {
private string _owner = string.Empty;
private string _theme = string.Empty;
private List<Template> _templates;
private string _template = "-";
private string[] _versions;
private string _reference = "local";
private string _minversion = "2.0.0";
private string _location = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override void OnInitialized()
{
if (!NavigationManager.BaseUri.Contains("localhost:"))
{
AddModuleMessage(Localizer["Info.Theme.CreatorIntent"], MessageType.Info);
}
}
protected override async Task OnParametersSetAsync()
{
try
{
_templates = await ThemeService.GetThemeTemplatesAsync();
_versions = Constants.ReleaseVersions.Split(',').Where(item => Version.Parse(item).CompareTo(Version.Parse("2.0.0")) >= 0).ToArray();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Theme Creator");
}
}
private async Task CreateTheme()
{
try
{
if (IsValid(_owner) && IsValid(_theme) && _owner != _theme && _template != "-")
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
var theme = new Theme { Owner = _owner, Name = _theme, Template = _template, Version = _reference, ThemeName = template.Namespace };
theme = await ThemeService.CreateThemeAsync(theme);
GetLocation();
AddModuleMessage(string.Format(Localizer["Success.Theme.Create"], NavigateUrl("admin/system")), MessageType.Success);
}
else
{
AddModuleMessage(Localizer["Message.Required.ValidName"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Creating Theme");
}
}
private bool IsValid(string name)
{
// must contain letters, underscores and digits and first character must be letter or underscore
return !string.IsNullOrEmpty(name) && name.ToLower() != "theme" && !name.ToLower().Contains("oqtane") && Regex.IsMatch(name, "^[A-Za-z_][A-Za-z0-9_]*$");
}
private void TemplateChanged(ChangeEventArgs e)
{
_template = (string)e.Value;
_minversion = "2.0.0";
if (_template != "-")
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
_minversion = template.Version;
}
GetLocation();
}
private void GetLocation()
{
_location = string.Empty;
if (_owner != "" && _theme != "" && _template != "-")
{
var template = _templates.FirstOrDefault(item => item.Name == _template);
if (!string.IsNullOrEmpty(template.Namespace))
{
_location = template.Location + template.Namespace.Replace("[Owner]", _owner).Replace("[Theme]", _theme);
}
else
{
_location = template.Location + _owner + ".Theme." + _theme;
}
}
StateHasChanged();
}
}

View File

@@ -0,0 +1,170 @@
@namespace Oqtane.Modules.Admin.Themes
@using System.Net
@inherits ModuleBase
@inject IThemeService ThemeService
@inject IPackageService PackageService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_initialized)
{
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="The name of the module" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="isenabled" HelpText="Is theme enabled for this site?" ResourceKey="IsEnabled">Enabled? </Label>
<div class="col-sm-9">
<select id="isenabled" class="form-select" @bind="@_isenabled" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
</form>
<Section Name="Information" ResourceKey="Information" Heading="Information">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="themename" HelpText="The internal name of the module" ResourceKey="InternalName">Internal Name: </Label>
<div class="col-sm-9">
<input id="themename" class="form-control" @bind="@_themeName" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="version" HelpText="The version of the theme" ResourceKey="Version">Version: </Label>
<div class="col-sm-9">
<input id="version" class="form-control" @bind="@_version" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="packagename" HelpText="The unique name of the package from which this theme was installed. This value must be specified within the theme's ITheme interface specification." ResourceKey="PackageName">Package Name: </Label>
<div class="col-sm-9">
<input id="packagename" class="form-control" @bind="@_packagename" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="owner" HelpText="The owner or creator of the theme" ResourceKey="Owner">Owner: </Label>
<div class="col-sm-9">
<input id="owner" class="form-control" @bind="@_owner" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="The url of the theme" ResourceKey="Url">Url: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="contact" HelpText="The contact for the theme" ResourceKey="Contact">Contact: </Label>
<div class="col-sm-9">
<input id="contact" class="form-control" @bind="@_contact" disabled />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="license" HelpText="The license of the theme" ResourceKey="License">License: </Label>
<div class="col-sm-9">
@if (_license.StartsWith("http") || _license.StartsWith("/") || _license.StartsWith("~"))
{
<a href="@_license.Replace("~", PageState?.Alias.BaseUrl + "/Themes/" + Utilities.GetTypeName(_themeName))" class="btn btn-info" style="text-decoration: none !important" target="_new">@Localizer["View License"]</a>
}
else
{
<textarea id="license" class="form-control" @bind="@_license" rows="5" disabled></textarea>
}
</div>
</div>
</div>
</Section>
<br />
<button type="button" class="btn btn-success" @onclick="SaveTheme">@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>
}
@code {
private bool _initialized = false;
private ElementReference form;
private bool validated = false;
private int _themeId;
private string _themeName = "";
private string _isenabled;
private string _name;
private string _version;
private string _packagename = "";
private string _owner = "";
private string _url = "";
private string _contact = "";
private string _license = "";
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
_themeId = Int32.Parse(PageState.QueryString["id"]);
var theme = await ThemeService.GetThemeAsync(_themeId, ModuleState.SiteId);
if (theme != null)
{
_name = theme.Name;
_isenabled =theme.IsEnabled.ToString();
_version = theme.Version;
_packagename = theme.PackageName;
_owner = theme.Owner;
_url = theme.Url;
_contact = theme.Contact;
_license = theme.License;
_createdby = theme.CreatedBy;
_createdon = theme.CreatedOn;
_modifiedby = theme.ModifiedBy;
_modifiedon = theme.ModifiedOn;
_initialized = true;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Theme {ThemeName} {Error}", _themeName, ex.Message);
AddModuleMessage(Localizer["Error.Theme.Loading"], MessageType.Error);
}
}
private async Task SaveTheme()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
try
{
var theme = await ThemeService.GetThemeAsync(_themeId, ModuleState.SiteId);
theme.Name = _name;
theme.IsEnabled = (_isenabled == null ? true : bool.Parse(_isenabled));
await ThemeService.UpdateThemeAsync(theme);
await logger.LogInformation("Theme Saved {Theme}", theme);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Theme {ThemeId} {Error}", _themeId, ex.Message);
AddModuleMessage(Localizer["Error.Module.Save"], MessageType.Error);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -1,43 +1,71 @@
@namespace Oqtane.Modules.Admin.Themes
@namespace Oqtane.Modules.Admin.Themes
@using System.Net
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IThemeService ThemeService
@inject IPackageService PackageService
@inject ISiteService SiteService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_themes == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<ActionLink Action="Add" Text="Install Theme" />
<ActionLink Action="Add" Text="Install Theme" ResourceKey="InstallTheme" />
<ActionLink Action="Create" Text="Create Theme" ResourceKey="CreateTheme" Class="btn btn-secondary ps-2" />
<button type="button" class="btn btn-secondary pw-2" @onclick="@Synchronize">@Localizer["Synchronize"]</button>
<Pager Items="@_themes">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th scope="col">Name</th>
<th scope="col">Version</th>
<th style="width: 1px;">&nbsp;</th>
<th>@SharedLocalizer["Name"]</th>
<th>@SharedLocalizer["Version"]</th>
<th>@Localizer["Enabled"]</th>
<th>@SharedLocalizer["Support"]</th>
<th>@SharedLocalizer["Expires"]</th>
<th>&nbsp;</th>
</Header>
<Row>
<td><ActionLink Action="View" Parameters="@($"name=" + WebUtility.UrlEncode(context.ThemeName))" /></td>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.ThemeId.ToString())" ResourceKey="EditTheme" /></td>
<td>
@if (context.AssemblyName != "Oqtane.Client")
@if (context.AssemblyName != Constants.ClientId)
{
<ActionDialog Header="Delete Theme" Message="@("Are You Sure You Wish To Delete The " + context.Name + " Theme?")" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteTheme(context))" />
<ActionDialog Header="Delete Theme" Message="@string.Format(Localizer["Confirm.Theme.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteTheme(context))" ResourceKey="DeleteTheme" />
}
</td>
<td><NavLink class="btn btn-secondary" href="@NavigateUrl("admin/site")">@Localizer["Assign"]</NavLink></td>
<td>@context.Name</td>
<td>@context.Version</td>
<td>
@if (UpgradeAvailable(context.ThemeName, context.Version))
@if (context.IsEnabled)
{
<button type="button" class="btn btn-success" @onclick=@(async () => await DownloadTheme(context.ThemeName, context.Version))>Upgrade</button>
<span>@SharedLocalizer["Yes"]</span>
}
else
{
<span>@SharedLocalizer["No"]</span>
}
</td>
<td>
@((MarkupString)SupportLink(context.PackageName, context.Version))
</td>
<td>
@((MarkupString)PurchaseLink(context.PackageName))
</td>
<td>
@{
var version = UpgradeAvailable(context.PackageName, context.Version);
}
@if (version != context.Version)
{
<button type="button" class="btn btn-success" @onclick=@(async () => await DownloadTheme(context.PackageName, version))>@SharedLocalizer["Upgrade"]</button>
}
</td>
<td></td>
</Row>
</Pager>
}
@@ -48,52 +76,86 @@ else
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
protected override async Task OnParametersSetAsync()
{
try
{
_themes = await ThemeService.GetThemesAsync();
_packages = await PackageService.GetPackagesAsync("theme");
_packages = await PackageService.GetPackageUpdatesAsync("theme");
}
catch (Exception ex)
{
if (_themes == null)
{
await logger.LogError(ex, "Error Loading Themes {Error}", ex.Message);
AddModuleMessage("Error Loading Themes", MessageType.Error);
AddModuleMessage(Localizer["Error.Theme.Load"], MessageType.Error);
}
}
}
private bool UpgradeAvailable(string themename, string version)
private string PurchaseLink(string packagename)
{
var upgradeavailable = false;
if (_packages != null)
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == Utilities.GetTypeName(themename)).FirstOrDefault();
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null)
{
upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0);
if (package.ExpiryDate != null && package.ExpiryDate.Value.Date != DateTime.MaxValue.Date)
{
if (string.IsNullOrEmpty(package.PaymentUrl))
{
link = "<span>" + package.ExpiryDate.Value.Date.ToString("MMM dd, yyyy") + "</span>";
}
else
{
link = "<a class=\"btn btn-primary\" style=\"text-decoration: none !important\" href=\"" + package.PaymentUrl + "\" target=\"_new\">" + package.ExpiryDate.Value.Date.ToString("MMM dd, yyyy") + "</a>";
}
}
return upgradeavailable;
}
}
return link;
}
private async Task DownloadTheme(string themename, string version)
private string SupportLink(string packagename, string version)
{
string link = "";
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && !string.IsNullOrEmpty(package.SupportUrl))
{
link += "<a class=\"btn btn-info\" style=\"text-decoration: none !important\" href=\"" + package.SupportUrl.Replace("{Version}", version) + "\" target=\"_new\">" + SharedLocalizer["Help"] + "</a>";
}
}
return link;
}
private string UpgradeAvailable(string packagename, string version)
{
if (!string.IsNullOrEmpty(packagename) && _packages != null)
{
var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault();
if (package != null && Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0)
{
return package.Version;
}
}
return version;
}
private async Task DownloadTheme(string packagename, string version)
{
try
{
await PackageService.DownloadPackageAsync(themename, version, "Themes");
await logger.LogInformation("Theme Downloaded {ThemeName} {Version}", themename, version);
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ThemeService.InstallThemesAsync();
await PackageService.DownloadPackageAsync(packagename, version);
await logger.LogInformation("Theme Downloaded {ThemeName} {Version}", packagename, version);
AddModuleMessage(string.Format(Localizer["Success.Theme.Install"], NavigateUrl("admin/system")), MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Theme {ThemeName} {Version} {Error}", themename, version, ex.Message);
AddModuleMessage("Error Downloading Theme", MessageType.Error);
await logger.LogError(ex, "Error Downloading Theme {ThemeName} {Version} {Error}", packagename, version, ex.Message);
AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error);
}
}
@@ -101,15 +163,37 @@ else
{
try
{
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await ThemeService.DeleteThemeAsync(Theme.ThemeName);
AddModuleMessage(Localizer["Success.Theme.Delete"], MessageType.Success);
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Theme {Theme} {Error}", Theme, ex.Message);
AddModuleMessage("Error Deleting Theme", MessageType.Error);
AddModuleMessage(Localizer["Error.Theme.Delete"], MessageType.Error);
}
}
private async Task Synchronize()
{
try
{
ShowProgressIndicator();
foreach (var theme in _themes)
{
if (!string.IsNullOrEmpty(theme.PackageName) && !_packages.Any(item => item.PackageId == theme.PackageName))
{
await PackageService.GetPackageAsync(theme.PackageName, theme.Version, false);
}
}
HideProgressIndicator();
AddModuleMessage(Localizer["Success.Theme.Synchronize"], MessageType.Success);
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Synchronizing Themes {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Theme.Synchronize"], MessageType.Error);
}
}
}

View File

@@ -1,101 +0,0 @@
@namespace Oqtane.Modules.Admin.Themes
@using System.Net
@inherits ModuleBase
@inject IThemeService ThemeService
@inject NavigationManager NavigationManager
<table class="table table-borderless">
<tr>
<td>
<Label For="name" HelpText="The name of the theme">Name: </Label>
</td>
<td>
<input id="name" class="form-control" @bind="@_name" disabled />
</td>
</tr>
<tr>
<td>
<Label For="themename" HelpText="The internal name of the module">Internal Name: </Label>
</td>
<td>
<input id="themename" class="form-control" @bind="@_themeName" disabled />
</td>
</tr>
<tr>
<td>
<Label For="version" HelpText="The version of the thene">Version: </Label>
</td>
<td>
<input id="version" class="form-control" @bind="@_version" disabled />
</td>
</tr>
<tr>
<td>
<Label For="owner" HelpText="The owner or creator of the theme">Owner: </Label>
</td>
<td>
<input id="owner" class="form-control" @bind="@_owner" disabled />
</td>
</tr>
<tr>
<td>
<Label For="url" HelpText="The reference url of the theme">Reference Url: </Label>
</td>
<td>
<input id="url" class="form-control" @bind="@_url" disabled />
</td>
</tr>
<tr>
<td>
<Label For="contact" HelpText="The contact for the theme">Contact: </Label>
</td>
<td>
<input id="contact" class="form-control" @bind="@_contact" disabled />
</td>
</tr>
<tr>
<td>
<Label For="license" HelpText="The license of the theme">License: </Label>
</td>
<td>
<textarea id="license" class="form-control" @bind="@_license" rows="5" disabled></textarea>
</td>
</tr>
</table>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@code {
private string _themeName = "";
private string _name;
private string _version;
private string _owner = "";
private string _url = "";
private string _contact = "";
private string _license = "";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
protected override async Task OnInitializedAsync()
{
try
{
_themeName = WebUtility.UrlDecode(PageState.QueryString["name"]);
var themes = await ThemeService.GetThemesAsync();
var theme = themes.FirstOrDefault(item => item.ThemeName == _themeName);
if (theme != null)
{
_name = theme.Name;
_version = theme.Version;
_owner = theme.Owner;
_url = theme.Url;
_contact = theme.Contact;
_license = theme.License;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Theme {ThemeName} {Error}", _themeName, ex.Message);
AddModuleMessage("Error Loading Theme", MessageType.Error);
}
}
}

View File

@@ -1,43 +1,74 @@
@namespace Oqtane.Modules.Admin.Upgrade
@namespace Oqtane.Modules.Admin.Upgrade
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IFileService FileService
@inject IPackageService PackageService
@inject IInstallationService InstallationService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_package != null)
@if (_initialized)
{
<TabStrip>
<TabPanel Name="Download">
@if (_upgradeavailable)
<TabPanel Name="Download" ResourceKey="Download">
@if (_package != null && _upgradeavailable)
{
<ModuleMessage Type="MessageType.Info" Message="Select The Upgrade Button To Install a New Framework Version"></ModuleMessage>
<button type="button" class="btn btn-success" @onclick=@(async () => await Download(Constants.PackageId, @_package.Version))>Upgrade To @_package.Version</button>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" HelpText="Specify if you want to backup files during the upgrade process. Disabling this option will reduce the time required for the upgrade." ResourceKey="Backup">Backup Files? </Label>
<div class="col-sm-9">
<select id="backup" class="form-select" @bind="@_backup">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<br />
@if (!_downloaded)
{
<button type="button" class="btn btn-primary" @onclick=@(async () => await Download(Constants.PackageId, @_package.Version))>@SharedLocalizer["Download"] @_package.Version</button>
}
else
{
<ModuleMessage Type="MessageType.Info" Message="Framework Is Already Up To Date"></ModuleMessage>
<button type="button" class="btn btn-success" @onclick="Upgrade">@SharedLocalizer["Upgrade"]</button>
}
}
else
{
<ModuleMessage Type="MessageType.Info" Message=@Localizer["Message.Text"]></ModuleMessage>
}
</TabPanel>
<TabPanel Name="Upload">
<table class="table table-borderless">
<tr>
<td>
<Label HelpText="Upload a framework package and select Install to complete the installation">Framework: </Label>
</td>
<td>
<FileManager Filter="nupkg" ShowFiles="false" Folder="Framework" />
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="Upgrade">Install</button>
<TabPanel Name="Upload" ResourceKey="Upload">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" HelpText="Upload A Framework Package And Then Select Upgrade" ResourceKey="Framework">Framework: </Label>
<div class="col-sm-9">
<FileManager Folder="@Constants.PackagesFolder" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" HelpText="Specify if you want to backup files during the upgrade process. Disabling this option will reduce the time required for the upgrade." ResourceKey="Backup">Backup Files? </Label>
<div class="col-sm-9">
<select id="backup" class="form-select" @bind="@_backup">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="Upgrade">@SharedLocalizer["Upgrade"]</button>
</TabPanel>
</TabStrip>
}
@code {
private bool _initialized = false;
private bool _downloaded = false;
private Package _package;
private bool _upgradeavailable = false;
private string _backup = "True";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@@ -45,10 +76,18 @@
{
try
{
List<Package> packages = await PackageService.GetPackagesAsync("framework");
if (NavigationManager.BaseUri.Contains("localhost:"))
{
AddModuleMessage(Localizer["Localhost.Text"], MessageType.Info);
}
else
{
AddModuleMessage(Localizer["Disclaimer.Text"], MessageType.Warning);
List<Package> packages = await PackageService.GetPackagesAsync("framework", "", "", "");
if (packages != null)
{
_package = packages.FirstOrDefault();
_package = packages.Where(item => item.PackageId.StartsWith(Constants.PackageId)).FirstOrDefault();
if (_package != null)
{
_upgradeavailable = (Version.Parse(_package.Version).CompareTo(Version.Parse(Constants.Version)) > 0);
@@ -58,6 +97,8 @@
_package = new Package { Name = Constants.PackageId, Version = Constants.Version };
}
}
_initialized = true;
}
}
catch
{
@@ -69,15 +110,16 @@
{
try
{
AddModuleMessage(Localizer["Info.Upgrade.Wait"], MessageType.Info);
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await InstallationService.Upgrade();
await InstallationService.Upgrade(bool.Parse(_backup));
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Executing Upgrade {Error}", ex.Message);
AddModuleMessage("Error Executing Upgrade", MessageType.Error);
AddModuleMessage(Localizer["Error.Upgrade.Execute"], MessageType.Error);
}
}
@@ -85,16 +127,18 @@
{
try
{
await PackageService.DownloadPackageAsync(packageid, version, "Framework");
ShowProgressIndicator();
var interop = new Interop(JSRuntime);
await interop.RedirectBrowser(NavigateUrl(), 10);
await InstallationService.Upgrade();
await PackageService.DownloadPackageAsync(packageid, version);
await PackageService.DownloadPackageAsync(Constants.UpdaterPackageId, version);
_downloaded = true;
HideProgressIndicator();
AddModuleMessage(Localizer["Success.Framework.Download"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Downloading Framework {Error}", ex.Message);
AddModuleMessage("Error Downloading Framework", MessageType.Error);
await logger.LogError(ex, "Error Downloading Framework Package {Error}", ex.Message);
HideProgressIndicator();
AddModuleMessage(Localizer["Error.Framework.Download"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,108 @@
@namespace Oqtane.Modules.Admin.UrlMappings
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUrlMappingService UrlMappingService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="A Url identifying a path to a specific page in the site (absolute or relative)" ResourceKey="Url">Url:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="url" class="form-control" @bind="@_url" maxlength="500" required />
<button type="button" class="btn btn-primary" @onclick="GenerateUrl">@Localizer["Generate"]</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="mappedurl" HelpText="A Url where the user will be redirected (absolute or relative). Use '/' for site root path." ResourceKey="MappedUrl">Redirect To:</Label>
<div class="col-sm-9">
<input id="mappedurl" class="form-control" @bind="@_mappedurl" maxlength="500" required />
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveUrlMapping">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</div>
</form>
@code {
private ElementReference form;
private bool validated = false;
private string _url = string.Empty;
private string _mappedurl = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private async Task SaveUrlMapping()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (_url != _mappedurl)
{
var url = PageState.Uri.Scheme + "://" + PageState.Uri.Authority + "/";
url = url + (!string.IsNullOrEmpty(PageState.Alias.Path) ? PageState.Alias.Path + "/" : "");
_url = (_url.StartsWith("/")) ? _url.Substring(1) : _url;
_url = (!_url.StartsWith("http")) ? url + _url : _url;
_mappedurl = _mappedurl.Replace(url, "");
_mappedurl = (_mappedurl.StartsWith("/") && _mappedurl != "/") ? _mappedurl.Substring(1) : _mappedurl;
if (_url.StartsWith(url))
{
var urlmapping = new UrlMapping();
urlmapping.SiteId = PageState.Site.SiteId;
urlmapping.Url = new Route(_url, PageState.Alias.Path).PagePath;
urlmapping.MappedUrl = _mappedurl;
urlmapping.Requests = 0;
urlmapping.CreatedOn = DateTime.UtcNow;
urlmapping.RequestedOn = DateTime.UtcNow;
try
{
urlmapping = await UrlMappingService.AddUrlMappingAsync(urlmapping);
await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message);
AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error);
}
}
else
{
AddModuleMessage(Localizer["Message.SaveUrlMapping"], MessageType.Warning);
}
}
else
{
AddModuleMessage(Localizer["Message.DuplicateUrlMapping"], MessageType.Warning);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
private void GenerateUrl()
{
var url = PageState.Uri.Scheme + "://" + PageState.Uri.Authority + "/";
url = url + (!string.IsNullOrEmpty(PageState.Alias.Path) ? PageState.Alias.Path + "/" : "");
var chars = "abcdefghijklmnopqrstuvwxyz";
Random rnd = new Random();
for (int i = 0; i < 5; i++)
{
url += chars.Substring(rnd.Next(0, chars.Length - 1), 1);
}
_url = url;
}
}

View File

@@ -0,0 +1,95 @@
@namespace Oqtane.Modules.Admin.UrlMappings
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUrlMappingService UrlMappingService
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="A Url identifying a path to a specific page in the site (absolute or relative)" ResourceKey="Url">Url:</Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" maxlength="500" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="mappedurl" HelpText="A Url where the user will be redirected (absolute or relative). Use '/' for site root path." ResourceKey="MappedUrl">Redirect To:</Label>
<div class="col-sm-9">
<input id="mappedurl" class="form-control" @bind="@_mappedurl" maxlength="500" required />
</div>
</div>
<br /><br />
<button type="button" class="btn btn-success" @onclick="SaveUrlMapping">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
</div>
</form>
@code {
private ElementReference form;
private bool validated = false;
private int _urlmappingid;
private string _url = string.Empty;
private string _mappedurl = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync()
{
try
{
_urlmappingid = Int32.Parse(PageState.QueryString["id"]);
var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid);
if (urlmapping != null)
{
_url = urlmapping.Url;
_mappedurl = urlmapping.MappedUrl;
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message);
AddModuleMessage(Localizer["Error.LoadUrlMapping"], MessageType.Error);
}
}
private async Task SaveUrlMapping()
{
validated = true;
var interop = new Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (_url != _mappedurl)
{
try
{
var url = PageState.Uri.Scheme + "://" + PageState.Uri.Authority + "/";
url = url + (!string.IsNullOrEmpty(PageState.Alias.Path) ? PageState.Alias.Path + "/" : "");
_mappedurl = _mappedurl.Replace(url, "");
_mappedurl = (_mappedurl.StartsWith("/") && _mappedurl != "/") ? _mappedurl.Substring(1) : _mappedurl;
var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid);
urlmapping.MappedUrl = _mappedurl;
urlmapping = await UrlMappingService.UpdateUrlMappingAsync(urlmapping);
await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping);
NavigationManager.NavigateTo(NavigateUrl());
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message);
AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error);
}
}
else
{
AddModuleMessage(Localizer["Message.DuplicateUrlMapping"], MessageType.Warning);
}
}
else
{
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
}
}
}

View File

@@ -0,0 +1,151 @@
@namespace Oqtane.Modules.Admin.UrlMappings
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUrlMappingService UrlMappingService
@inject ISiteService SiteService
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_urlMappings == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<TabStrip>
<TabPanel Name="Urls" Heading="Urls" ResourceKey="Urls">
<div class="container">
<div class="row mb-1 align-items-center">
<div class="col-sm-6">
<ActionLink Action="Add" Text="Add Url Mapping" ResourceKey="AddUrlMapping" />
</div>
<div class="col-sm-6">
<select id="type" class="form-select custom-select" @onchange="(e => MappedChanged(e))">
<option value="true">@Localizer["Mapped"]</option>
<option value="false">@Localizer["Broken"]</option>
</select>
</div>
</div>
</div>
<br/>
<Pager Items="@_urlMappings" SearchProperties="Url">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>@Localizer["Url"]</th>
<th>@Localizer["Requests"]</th>
<th>@Localizer["Requested"]</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.UrlMappingId.ToString())" ResourceKey="Edit" /></td>
<td><ActionDialog Header="Delete Url Mapping" Message="@string.Format(Localizer["Confirm.DeleteUrlMapping"], context.Url)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteUrlMapping(context))" ResourceKey="DeleteUrlMapping" /></td>
<td>
<a href="@Utilities.TenantUrl(PageState.Alias, context.Url)">@context.Url</a>
@if (_mapped)
{
@((MarkupString)"<br />&gt;&gt;&nbsp;")<a href="@((context.MappedUrl.StartsWith("http") ? context.MappedUrl : Utilities.TenantUrl(PageState.Alias, context.MappedUrl)))">@context.MappedUrl</a>
}
</td>
<td>@context.Requests</td>
<td>@UtcToLocal(context.RequestedOn)</td>
</Row>
</Pager>
</TabPanel>
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="capturebrokenurls" HelpText="Specify if broken Urls should be captured automatically and saved in Url Mappings" ResourceKey="CaptureBrokenUrls">Capture Broken Urls? </Label>
<div class="col-sm-9">
<select id="capturebrokenurls" class="form-select" @bind="@_capturebrokenurls" >
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="retention" HelpText="Number of days of broken urls to retain" ResourceKey="Retention">Retention (Days): </Label>
<div class="col-sm-9">
<input id="retention" class="form-control" type="number" min="0" step="1" @bind="@_retention" />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
</TabPanel>
</TabStrip>
}
@code {
private bool _mapped = true;
private List<UrlMapping> _urlMappings;
private string _capturebrokenurls;
private int _retention = 30;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnParametersSetAsync()
{
await GetUrlMappings();
_capturebrokenurls = PageState.Site.CaptureBrokenUrls.ToString();
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_retention = int.Parse(SettingService.GetSetting(settings, "UrlMappingRetention", "30"));
}
private async void MappedChanged(ChangeEventArgs e)
{
try
{
_mapped = bool.Parse(e.Value.ToString());
await GetUrlMappings();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error On TypeChanged");
}
}
private async Task DeleteUrlMapping(UrlMapping urlMapping)
{
try
{
await UrlMappingService.DeleteUrlMappingAsync(urlMapping.UrlMappingId);
await logger.LogInformation("UrlMapping Deleted {UrlMapping}", urlMapping);
await GetUrlMappings();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting UrlMapping {UrlMapping} {Error}", urlMapping, ex.Message);
AddModuleMessage(Localizer["Error.DeleteUrlMapping"], MessageType.Error);
}
}
private async Task GetUrlMappings()
{
_urlMappings = await UrlMappingService.GetUrlMappingsAsync(PageState.Site.SiteId, _mapped);
}
private async Task SaveSiteSettings()
{
try
{
var site = PageState.Site;
site.CaptureBrokenUrls = bool.Parse(_capturebrokenurls);
await SiteService.UpdateSiteAsync(site);
var settings = await SettingService.GetSiteSettingsAsync(site.SiteId);
settings = SettingService.SetSetting(settings, "UrlMappingRetention", _retention.ToString(), true);
await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId);
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
}
}
}

View File

@@ -1,43 +1,41 @@
@namespace Oqtane.Modules.Admin.UserProfile
@namespace Oqtane.Modules.Admin.UserProfile
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IUserRoleService UserRoleService
@inject INotificationService NotificationService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (PageState.User != null)
{
<table class="table table-borderless">
<tr>
<td>
<Label For="to" HelpText="Enter the username you wish to send a message to">To: </Label>
</td>
<td>
<input id="to" class="form-control" @bind="@username" />
</td>
</tr>
<tr>
<td>
<Label For="subject" HelpText="Enter the subject of the message">Subject: </Label>
</td>
<td>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="to" HelpText="Enter the user you wish to send a message to" ResourceKey="To">To: </Label>
<div class="col-sm-9">
<AutoComplete OnSearch="GetUsers" Placeholder="@Localizer["Username.Enter"]" @ref="username" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="subject" HelpText="Enter the subject of the message" ResourceKey="Subject">Subject: </Label>
<div class="col-sm-9">
<input id="subject" class="form-control" @bind="@subject" />
</td>
</tr>
<tr>
<td>
<Label For="message" HelpText="Enter the message">Message: </Label>
</td>
<td>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="message" HelpText="Enter the message" ResourceKey="Message">Message: </Label>
<div class="col-sm-9">
<textarea id="message" class="form-control" @bind="@body" rows="5" />
</td>
</tr>
</table>
<button type="button" class="btn btn-primary" @onclick="Send">Send</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
</div>
<br/>
<button type="button" class="btn btn-primary" @onclick="Send">@SharedLocalizer["Send"]</button>
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
}
@code {
private string username = "";
private AutoComplete username;
private string subject = "";
private string body = "";
@@ -45,41 +43,41 @@
public override string Title => "Send Notification";
private async Task<Dictionary<string, string>> GetUsers(string filter)
{
var users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Registered);
return users.Where(item => item.User.Username.Contains(filter, StringComparison.OrdinalIgnoreCase))
.ToDictionary(item => item.UserId.ToString(), item => item.User.Username);
}
private async Task Send()
{
var notification = new Notification();
try
{
var user = await UserService.GetUserAsync(username, PageState.Site.SiteId);
if (!string.IsNullOrEmpty(username.Key) && !string.IsNullOrEmpty(subject))
{
var user = await UserService.GetUserAsync(int.Parse(username.Key), ModuleState.SiteId);
if (user != null)
{
notification.SiteId = PageState.Site.SiteId;
notification.FromUserId = PageState.User.UserId;
notification.FromDisplayName = PageState.User.DisplayName;
notification.FromEmail = PageState.User.Email;
notification.ToUserId = user.UserId;
notification.ToDisplayName = user.DisplayName;
notification.ToEmail = user.Email;
notification.Subject = subject;
notification.Body = body;
notification.ParentId = null;
notification.CreatedOn = DateTime.UtcNow;
notification.IsDelivered = false;
notification.DeliveredOn = null;
notification.SendOn = DateTime.UtcNow;
var notification = new Notification(PageState.Site.SiteId, PageState.User, user, subject, body);
notification = await NotificationService.AddNotificationAsync(notification);
await logger.LogInformation("Notification Created {Notification}", notification);
NavigationManager.NavigateTo(NavigateUrl());
await logger.LogInformation("Notification Created {NotificationId}", notification.NotificationId);
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
else
{
AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning);
AddModuleMessage(Localizer["Message.User.Invalid"], MessageType.Warning);
}
}
else
{
AddModuleMessage(Localizer["Message.Required"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message);
AddModuleMessage("Error Adding Notification", MessageType.Error);
await logger.LogError(ex, "Error Adding Notification {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Notification.Add"], MessageType.Error);
}
}

View File

@@ -1,198 +1,398 @@
@namespace Oqtane.Modules.Admin.UserProfile
@namespace Oqtane.Modules.Admin.UserProfile
@using System.Net
@using System.Text.RegularExpressions;
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IProfileService ProfileService
@inject ISettingService SettingService
@inject INotificationService NotificationService
@inject IFileService FileService
@inject IFolderService FolderService
@inject ITimeZoneService TimeZoneService
@inject IJSRuntime jsRuntime
@inject IServiceProvider ServiceProvider
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (PageState.User != null && photofileid != -1)
@if (_initialized)
{
<img src="@(ContentUrl(photofileid))" alt="@displayname" style="max-width: 400px" class="rounded-circle mx-auto d-block">
}
else
{
<br />
}
<TabStrip>
<TabPanel Name="Identity">
@if (PageState.User != null)
@if (PageState.User != null && _photo != null)
{
<table class="table table-borderless">
<tr>
<td>
<label for="Name" class="control-label">Username: </label>
</td>
<td>
<input class="form-control" @bind="@username" readonly />
</td>
</tr>
<tr>
<td>
<label for="Name" class="control-label">Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@password" autocomplete="new-password" />
</td>
</tr>
<tr>
<td>
<label for="Name" class="control-label">Confirm Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@confirm" autocomplete="new-password" />
</td>
</tr>
<tr>
<td>
<label for="Name" class="control-label">Email: </label>
</td>
<td>
<input class="form-control" @bind="@email" />
</td>
</tr>
<tr>
<td>
<label for="Name" class="control-label">Full Name: </label>
</td>
<td>
<input class="form-control" @bind="@displayname" />
</td>
</tr>
<tr>
<td>
<label for="Name" class="control-label">Photo: </label>
</td>
<td>
<FileManager FileId="@photofileid" @ref="filemanager" />
</td>
</tr>
</table>
<button type="button" class="btn btn-primary" @onclick="Save">Save</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Cancel</button>
}
</TabPanel>
<TabPanel Name="Profile">
@if (profiles != null && settings != null)
{
<table class="table table-borderless">
@foreach (Profile profile in profiles)
{
var p = profile;
if (p.Category != category)
{
<tr>
<th colspan="2" style="text-align: center;">
@p.Category
</th>
</tr>
category = p.Category;
}
<tr>
<td>
<label for="@p.Name" class="control-label">@p.Title: </label>
</td>
<td>
<input class="form-control" maxlength="@p.MaxLength" value="@GetProfileValue(p.Name, p.DefaultValue)" placeholder="@p.Description" @onchange="@(e => ProfileChanged(e, p.Name))" />
</td>
</tr>
}
</table>
<button type="button" class="btn btn-primary" @onclick="Save">Save</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Cancel</button>
}
</TabPanel>
<TabPanel Name="Notifications">
@if (notifications != null)
{
<ActionLink Action="Add" Text="Send Notification" Security="SecurityAccessLevel.View" EditMode="false" />
<br /><br />
@if (filter == "to")
{
<Pager Items="@notifications">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>From</th>
<th>Subject</th>
<th>Received</th>
</Header>
<Row>
<td><ActionLink Action="View" Parameters="@($"id=" + context.NotificationId.ToString())" Security="SecurityAccessLevel.View" EditMode="false" /></td>
<td><ActionDialog Header="Delete Notification" Message="@("Are You Sure You Wish To Delete This Notification?")" Action="Delete" Security="SecurityAccessLevel.View" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" EditMode="false" /></td>
<td>@context.FromDisplayName</td>
<td>@context.Subject</td>
<td>@context.CreatedOn</td>
</Row>
<Detail>
<td colspan="2"></td>
<td colspan="3">
@{
string input = "___";
if (context.Body.Contains(input)){
context.Body = context.Body.Split(input)[0];
context.Body = context.Body.Replace("\n", "");
context.Body = context.Body.Replace("\r", "");
} }
@(context.Body.Length > 100 ? (context.Body.Substring(0, 97) + "...") : context.Body)
</td>
</Detail>
</Pager>
<img src="@ImageUrl(_photofileid, 400, 400)" alt="@_displayname" style="max-width: 400px" class="rounded-circle mx-auto d-block">
}
else
{
<Pager Items="@notifications">
<br />
}
<TabStrip>
<TabPanel Name="Identity" ResourceKey="Identity">
<ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="Your username. Note that this field can not be modified." ResourceKey="Username"></Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@_username" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="password" HelpText="If you wish to change your password you can enter it here. Please choose a sufficiently secure password." ResourceKey="Password"></Label>
<div class="col-sm-9">
<div class="input-group">
<input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirm" HelpText="If you are changing your password you must enter it again to confirm it matches" ResourceKey="Confirm"></Label>
<div class="col-sm-9">
<div class="input-group">
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
</div>
@if (_allowtwofactor)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="twofactor" HelpText="Indicates if you are using two factor authentication. Two factor authentication requires you to enter a verification code sent via email after you sign in." ResourceKey="TwoFactor"></Label>
<div class="col-sm-9">
<select id="twofactor" class="form-select" @bind="@_twofactor" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="email" HelpText="Your email address where you wish to receive notifications" ResourceKey="Email"></Label>
<div class="col-sm-9">
<input id="email" class="form-control" @bind="@_email" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="displayname" HelpText="Your full name" ResourceKey="DisplayName"></Label>
<div class="col-sm-9">
<input id="displayname" class="form-control" @bind="@_displayname" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="timezone" HelpText="Your time zone" ResourceKey="TimeZone">Time Zone:</Label>
<div class="col-sm-9">
<select id="timezone" class="form-select" @bind="@_timezoneid">
<option value="">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var timezone in _timezones)
{
<option value="@timezone.Id">@timezone.DisplayName</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="@_photofileid.ToString()" HelpText="A photo of yourself" ResourceKey="Photo"></Label>
<div class="col-sm-9">
<FileManager FileId="@_photofileid" Filter="@PageState.Site.ImageFiles" ShowFolders="false" ShowFiles="true" UploadMultiple="false" FolderId="@_folderid" @ref="_filemanager" />
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="Save">@SharedLocalizer["Save"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
<button type="button" class="btn btn-danger" @onclick="Logout">@Localizer["Logout Everywhere"]</button>
</TabPanel>
<TabPanel Name="Profile" ResourceKey="Profile">
<div class="container">
<div class="row mb-1 align-items-center">
@foreach (Profile profile in _profiles)
{
var p = profile;
if (!p.IsPrivate || UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
if (p.Category != _category)
{
<div class="col text-center pb-2">
@p.Category
</div>
_category = p.Category;
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="@p.Name" HelpText="@p.Description">@p.Title</Label>
<div class="col-sm-9">
@if (!string.IsNullOrEmpty(p.Options))
{
@if (!string.IsNullOrEmpty(p.Autocomplete))
{
<select id="@p.Name" class="form-select" @onchange="@(e => ProfileChanged(e, p.Name))" autocomplete="@p.Autocomplete">
@foreach (var option in p.Options.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
@if (GetProfileValue(p.Name, "") == option || (GetProfileValue(p.Name, "") == "" && p.DefaultValue == option))
{
<option value="@option" selected>@option</option>
}
else
{
<option value="@option">@option</option>
}
}
</select>
}
else
{
<select id="@p.Name" class="form-select" @onchange="@(e => ProfileChanged(e, p.Name))">
@foreach (var option in p.Options.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
@if (GetProfileValue(p.Name, "") == option || (GetProfileValue(p.Name, "") == "" && p.DefaultValue == option))
{
<option value="@option" selected>@option</option>
}
else
{
<option value="@option">@option</option>
}
}
</select>
}
}
else
{
@if (p.Rows == 1)
{
if (!string.IsNullOrEmpty(p.Autocomplete))
{
@if (p.IsRequired)
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" required @onchange="@(e => ProfileChanged(e, p.Name))" autocomplete="@p.Autocomplete"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
else
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" autocomplete="@p.Autocomplete"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
}
else
{
@if (p.IsRequired)
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" required @onchange="@(e => ProfileChanged(e, p.Name))"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
else
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
}
}
else
{
if (!string.IsNullOrEmpty(p.Autocomplete))
{
@if (p.IsRequired)
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" required @onchange="@(e => ProfileChanged(e, p.Name))" autocomplete="@p.Autocomplete"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
else
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" autocomplete="@p.Autocomplete"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
}
else
{
@if (p.IsRequired)
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" required @onchange="@(e => ProfileChanged(e, p.Name))"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
else
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))"
@attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
}
}
}
</div>
</div>
}
}
</div>
</div>
<button type="button" class="btn btn-success" @onclick="Save">@SharedLocalizer["Save"]</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
</TabPanel>
<TabPanel Name="Notifications" ResourceKey="Notifications">
<ActionLink Action="Add" Text="Send Notification" Security="SecurityAccessLevel.View" EditMode="false" ResourceKey="SendNotification" ReturnUrl="@NavigateUrl(PageState.Page.Path, "tab=Notifications")" />
<br />
<br />
<select class="form-select" @onchange="(e => FilterChanged(e))">
<option value="to">@Localizer["Inbox"]</option>
<option value="from">@Localizer["Items.Sent"]</option>
</select>
<br />
@if (_filter == "to")
{
@if (_notifications.Any())
{
<Pager Items="@_notifications">
<Header>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>To</th>
<th>Subject</th>
<th>Sent</th>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>@Localizer["From"]</th>
<th>@Localizer["Subject"]</th>
<th>@Localizer["Received"]</th>
</Header>
<Row>
<td><ActionLink Action="View" Parameters="@($"id=" + context.NotificationId.ToString())" Security="SecurityAccessLevel.View" EditMode="false" /></td>
<td><ActionDialog Header="Delete Notification" Message="@("Are You Sure You Wish To Delete This Notification?")" Action="Delete" Security="SecurityAccessLevel.View" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" EditMode="false" /></td>
<td>@context.ToDisplayName</td>
<td><ActionLink Action="View" Parameters="@($"id=" + context.NotificationId.ToString())" Security="SecurityAccessLevel.View" EditMode="false" ResourceKey="ViewNotification" ReturnUrl="@NavigateUrl(PageState.Page.Path, "tab=Notifications")" /></td>
<td><ActionDialog Header="Delete Notification" Message="Are You Sure You Wish To Delete This Notification?" Action="Delete" Security="SecurityAccessLevel.View" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" EditMode="false" ResourceKey="DeleteNotification" /></td>
@if (context.IsRead)
{
<td>@(string.IsNullOrEmpty(context.FromDisplayName) ? SharedLocalizer["System"] : context.FromDisplayName)</td>
<td>@context.Subject</td>
<td>@context.CreatedOn</td>
<td>@string.Format("{0:dd-MMM-yyyy HH:mm:ss}", @context.CreatedOn)</td>
}
else
{
<td><b>@(string.IsNullOrEmpty(context.FromDisplayName) ? SharedLocalizer["System"] : context.FromDisplayName)</b></td>
<td><b>@context.Subject</b></td>
<td><b>@string.Format("{0:dd-MMM-yyyy HH:mm:ss}", @context.CreatedOn)</b></td>
}
</Row>
<Detail>
<td colspan="2"></td>
<td colspan="3">
@{
string input = "___";
if (context.Body.Contains(input)){
if (context.Body.Contains(input))
{
context.Body = context.Body.Split(input)[0];
context.Body = context.Body.Replace("\n", "");
context.Body = context.Body.Replace("\r", "");
} }
@(context.Body.Length > 100 ? (context.Body.Substring(0, 97) + "...") : context.Body)
}
_notificationSummary = context.Body.Length > 100 ? (context.Body.Substring(0, 97) + "...") : context.Body;
}
@if (context.IsRead)
{
@_notificationSummary
}
else
{
<b>@_notificationSummary</b>
}
</td>
</Detail>
</Pager>
<br />
<ActionDialog Header="Clear Notifications" Message="Are You Sure You Wish To Permanently Delete All Notifications ?" Action="Delete All Notifications" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllNotifications())" ResourceKey="DeleteAllNotifications" />
}
else
{
<div class="no-notifications-text">
@Localizer["NoNotificationsReceived.Text"]
</div>
}
}
else
{
@if (_notifications.Any())
{
<Pager Items="@_notifications">
<Header>
<th style="width: 1px;"></th>
<th style="width: 1px;"></th>
<th>@Localizer["To"]</th>
<th>@Localizer["Subject"]</th>
<th>@Localizer["Sent"]</th>
</Header>
<Row>
<td><ActionLink Action="View" Parameters="@($"id=" + context.NotificationId.ToString())" Security="SecurityAccessLevel.View" EditMode="false" ResourceKey="ViewNotification" ReturnUrl="@NavigateUrl(PageState.Page.Path, "tab=Notifications")" /></td>
<td><ActionDialog Header="Delete Notification" Message="Are You Sure You Wish To Delete This Notification?" Action="Delete" Security="SecurityAccessLevel.View" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" EditMode="false" ResourceKey="DeleteNotification" /></td>
@if (context.IsRead)
{
<td>@context.ToDisplayName</td>
<td>@context.Subject</td>
<td>@string.Format("{0:dd-MMM-yyyy HH:mm:ss}", @context.CreatedOn)</td>
}
else
{
<td><b>@context.ToDisplayName</b></td>
<td><b>@context.Subject</b></td>
<td><b>@string.Format("{0:dd-MMM-yyyy HH:mm:ss}", @context.CreatedOn)</b></td>
}
</Row>
<Detail>
<td colspan="2"></td>
<td colspan="3">
@{
string input = "___";
if (context.Body.Contains(input))
{
context.Body = context.Body.Split(input)[0];
context.Body = context.Body.Replace("\n", "");
context.Body = context.Body.Replace("\r", "");
}
_notificationSummary = context.Body.Length > 100 ? (context.Body.Substring(0, 97) + "...") : context.Body;
}
@if (context.IsRead)
{
@_notificationSummary
}
else
{
<b>@_notificationSummary</b>
}
</td>
</Detail>
</Pager>
<br />
<ActionDialog Header="Clear Notifications" Message="Are You Sure You Wish To Permanently Delete All Notifications ?" Action="Delete All Notifications" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllNotifications())" ResourceKey="DeleteAllNotifications" />
}
else
{
<div class="no-notifications-text">
@Localizer["NoNotificationsSent.Text"]
</div>
}
<br /><hr />
<select class="form-control" @onchange="(e => FilterChanged(e))">
<option value="to">Inbox</option>
<option value="from">Sent Items</option>
</select>
}
</TabPanel>
</TabStrip>
</TabStrip>
<br />
<br />
}
@code {
private string username = string.Empty;
private string password = string.Empty;
private string confirm = string.Empty;
private string email = string.Empty;
private string displayname = string.Empty;
private FileManager filemanager;
private int photofileid = -1;
private List<Profile> profiles;
private Dictionary<string, string> settings;
private string category = string.Empty;
private string filter = "to";
private List<Notification> notifications;
private List<Models.TimeZone> _timezones;
private bool _initialized = false;
private string _passwordrequirements;
private string _username = string.Empty;
private string _password = string.Empty;
private string _passwordtype = "password";
private string _togglepassword = string.Empty;
private string _confirm = string.Empty;
private bool _allowtwofactor = false;
private string _twofactor = "False";
private string _email = string.Empty;
private string _displayname = string.Empty;
private FileManager _filemanager;
private int _folderid = -1;
private string _timezoneid = string.Empty;
private int _photofileid = -1;
private File _photo = null;
private string _imagefiles = string.Empty;
private List<Profile> _profiles;
private Dictionary<string, string> _userSettings;
private string _category = string.Empty;
private string _filter = "to";
private List<Notification> _notifications;
private string _notificationSummary = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
@@ -200,94 +400,220 @@ else
{
try
{
_passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId);
_togglepassword = SharedLocalizer["ShowPassword"];
_allowtwofactor = (SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:TwoFactor", "false") == "true");
_profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId);
_timezones = await TimeZoneService.GetTimeZonesAsync();
if (PageState.User != null)
{
username = PageState.User.Username;
email = PageState.User.Email;
displayname = PageState.User.DisplayName;
_username = PageState.User.Username;
_twofactor = PageState.User.TwoFactorRequired.ToString();
_email = PageState.User.Email;
_displayname = PageState.User.DisplayName;
_timezoneid = PageState.User.TimeZoneId;
if (string.IsNullOrEmpty(_email))
{
AddModuleMessage(Localizer["Message.User.NoEmail"], MessageType.Warning);
}
// get user folder
var folder = await FolderService.GetFolderAsync(ModuleState.SiteId, PageState.User.FolderPath);
if (folder != null)
{
_folderid = folder.FolderId;
}
if (PageState.User.PhotoFileId != null)
{
photofileid = PageState.User.PhotoFileId.Value;
}
profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId);
settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId);
await LoadNotificationsAsync();
_photofileid = PageState.User.PhotoFileId.Value;
_photo = await FileService.GetFileAsync(_photofileid);
}
else
{
AddModuleMessage("Current User Is Not Logged In", MessageType.Warning);
_photofileid = -1;
_photo = null;
}
_userSettings = PageState.User.Settings;
var sitesettings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_imagefiles = SettingService.GetSetting(_userSettings, "ImageFiles", Constants.ImageFiles);
_imagefiles = (string.IsNullOrEmpty(_imagefiles)) ? Constants.ImageFiles : _imagefiles;
await LoadNotificationsAsync();
_initialized = true;
}
else
{
AddModuleMessage(Localizer["Message.User.NoLogIn"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message);
AddModuleMessage("Error Loading User Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Load"], MessageType.Error);
}
}
private async Task LoadNotificationsAsync()
{
notifications = await NotificationService.GetNotificationsAsync(PageState.Site.SiteId, filter, PageState.User.UserId);
notifications = notifications.Where(item => item.DeletedBy != PageState.User.Username).ToList();
_notifications = await NotificationService.GetNotificationsAsync(PageState.Site.SiteId, _filter, PageState.User.UserId);
_notifications = _notifications.Where(item => item.DeletedBy != PageState.User.Username).ToList();
}
private string GetProfileValue(string SettingName, string DefaultValue)
=> SettingService.GetSetting(settings, SettingName, DefaultValue);
{
string value = SettingService.GetSetting(_userSettings, SettingName, DefaultValue);
if (value.Contains("]"))
{
value = value.Substring(value.IndexOf("]") + 1);
}
return value;
}
private async Task Save()
{
try
{
if (username != string.Empty && email != string.Empty)
if (_username != string.Empty && _email != string.Empty)
{
if (password == confirm)
if (_password == _confirm)
{
if (ValidateProfiles())
{
var user = PageState.User;
user.Username = username;
user.Password = password;
user.Email = email;
user.DisplayName = (displayname == string.Empty ? username : displayname);
user.Username = _username;
user.Password = _password;
user.TwoFactorRequired = bool.Parse(_twofactor);
user.Email = _email;
user.DisplayName = (_displayname == string.Empty ? _username : _displayname);
user.TimeZoneId = _timezoneid;
user.PhotoFileId = _filemanager.GetFileId();
if (user.PhotoFileId == -1)
{
user.PhotoFileId = null;
photofileid = filemanager.GetFileId();
if (photofileid != -1)
}
if (user.PhotoFileId != null)
{
user.PhotoFileId = photofileid;
_photofileid = user.PhotoFileId.Value;
_photo = await FileService.GetFileAsync(_photofileid);
}
else
{
_photofileid = -1;
_photo = null;
}
await UserService.UpdateUserAsync(user);
await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId);
user = await UserService.UpdateUserAsync(user);
if (user != null)
{
await SettingService.UpdateUserSettingsAsync(_userSettings, PageState.User.UserId);
await logger.LogInformation("User Profile Saved");
}
else
if (!string.IsNullOrEmpty(PageState.ReturnUrl))
{
AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
else // legacy behavior
{
AddModuleMessage(Localizer["Success.Profile.Update"], MessageType.Success);
StateHasChanged();
}
}
else
{
AddModuleMessage("You Must Provide A Username and Email Address", MessageType.Warning);
AddModuleMessage(Localizer["Message.Password.Complexity"], MessageType.Error);
}
}
}
else
{
AddModuleMessage(Localizer["Message.Password.Invalid"], MessageType.Warning);
}
}
else
{
AddModuleMessage(Localizer["Message.Required.ProfileInfo"], MessageType.Warning);
}
await ScrollToPageTop();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving User Profile {Error}", ex.Message);
AddModuleMessage("Error Saving User Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Save"], MessageType.Error);
}
}
private async Task Logout()
{
await logger.LogInformation("User Logout Everywhere For Username {Username}", PageState.User?.Username);
var url = NavigateUrl(""); // home page
if (PageState.Runtime == Shared.Runtime.Hybrid)
{
if (PageState.User != null)
{
// hybrid apps utilize an interactive logout
await UserService.LogoutUserEverywhereAsync(PageState.User);
var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider));
authstateprovider.NotifyAuthenticationChanged();
NavigationManager.NavigateTo(url, true);
}
}
else
{
// post to the Logout page to complete the logout process
var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, returnurl = url, everywhere = true };
var interop = new Interop(jsRuntime);
await interop.SubmitForm(Utilities.TenantUrl(PageState.Alias, "/pages/logout/"), fields);
}
}
private bool ValidateProfiles()
{
foreach (Profile profile in _profiles)
{
var value = GetProfileValue(profile.Name, string.Empty);
if (string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(profile.DefaultValue))
{
_userSettings = SettingService.SetSetting(_userSettings, profile.Name, profile.DefaultValue);
}
if (!profile.IsPrivate || UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
if (profile.IsRequired && string.IsNullOrEmpty(value))
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileRequired"], profile.Title), MessageType.Warning);
return false;
}
if (!string.IsNullOrEmpty(profile.Validation))
{
Regex regex = new Regex(profile.Validation);
bool valid = regex.Match(value).Success;
if (!valid)
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileInvalid"], profile.Title), MessageType.Warning);
return false;
}
}
}
}
return true;
}
private void Cancel()
{
NavigationManager.NavigateTo(NavigateUrl(string.Empty));
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
private void ProfileChanged(ChangeEventArgs e, string SettingName)
{
var value = (string)e.Value;
settings = SettingService.SetSetting(settings, SettingName, value);
_userSettings = SettingService.SetSetting(_userSettings, SettingName, value);
}
private async Task Delete(Notification Notification)
@@ -317,10 +643,54 @@ else
private async void FilterChanged(ChangeEventArgs e)
{
filter = (string)e.Value;
_filter = (string)e.Value;
await LoadNotificationsAsync();
StateHasChanged();
}
private async Task DeleteAllNotifications()
{
try
{
ShowProgressIndicator();
foreach(var Notification in _notifications)
{
if (!Notification.IsDeleted)
{
Notification.IsDeleted = true;
await NotificationService.UpdateNotificationAsync(Notification);
}
else
{
await NotificationService.DeleteNotificationAsync(Notification.NotificationId);
}
await logger.LogInformation("Notification Deleted {Notification}", Notification);
}
await logger.LogInformation("Notifications Permanently Deleted");
await LoadNotificationsAsync();
HideProgressIndicator();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting Notifications {Error}", ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
HideProgressIndicator();
}
}
private void TogglePassword()
{
if (_passwordtype == "password")
{
_passwordtype = "text";
_togglepassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordtype = "password";
_togglepassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -1,103 +1,80 @@
@namespace Oqtane.Modules.Admin.UserProfile
@namespace Oqtane.Modules.Admin.UserProfile
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject INotificationService NotificationService
@inject IStringLocalizer<View> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (PageState.User != null)
{
<table class="table table-borderless">
<tr>
<td>
<label class="control-label">@title: </label>
</td>
@if (title == "From")
{
<td>
<input class="form-control" @bind="@username" readonly />
</td>
}
@if (title == "To")
{
<td>
<input class="form-control" @bind="@username" />
</td>
}
</tr>
<tr>
<td>
<label class="control-label">Subject: </label>
</td>
@if (title == "From")
{
<td>
<input class="form-control" @bind="@subject" readonly />
</td>
}
@if (title == "To")
{
<td>
<input class="form-control" @bind="@subject" />
</td>
}
</tr>
@if (title == "From")
{
<tr>
<td>
<label class="control-label">Date: </label>
</td>
<td>
<input class="form-control" @bind="@createdon" readonly />
</td>
</tr>
}
@if (title == "From")
{
<tr>
<td>
<label class="control-label">Message: </label>
</td>
<td>
<textarea class="form-control" @bind="@body" rows="5" readonly />
</td>
</tr>
}
@if (title == "To")
{
<tr>
<td>
<label class="control-label">Message: </label>
</td>
<td>
<textarea class="form-control" @bind="@body" rows="5" />
</td>
</tr>
}
</table>
@if (reply != string.Empty)
{
<button type="button" class="btn btn-primary" @onclick="Send">Send</button> }
else
{
if (title == "From")
{
<button type="button" class="btn btn-primary" @onclick="Reply">Reply</button>}
}
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<br />
<br />
@if (title == "To")
{
<div class="control-group">
<label class="control-label">Original Message </label>
<textarea class="form-control" @bind="@reply" rows="5" readonly />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="The user who sent the message" ResourceKey="From">From:</Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@username" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="subject" HelpText="The subject of the message" ResourceKey="Subject">Subject:</Label>
<div class="col-sm-9">
<input id="subject" class="form-control" @bind="@subject" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label class="col-sm-3" For="date" HelpText="The date the message was sent" ResourceKey="Date">Sent:</Label>
<div class="col-sm-9">
<input id="date" class="form-control" @bind="@createdon" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label class="col-sm-3" For="message" HelpText="The contents of the message" ResourceKey="Message">Message:</Label>
<div class="col-sm-9">
<textarea id="message" class="form-control" @bind="@body" rows="5" readonly />
</div>
</div>
</div>
}
else
{
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="The user who will be the recipient of the message" ResourceKey="To">To:</Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@username" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="subject" HelpText="The subject of the message" ResourceKey="Subject">Subject:</Label>
<div class="col-sm-9">
<input id="subject" class="form-control" @bind="@subject" readonly="@(!reply)" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label class="col-sm-3" For="message" HelpText="The content of the message" ResourceKey="Message">Message:</Label>
<div class="col-sm-9">
<textarea id="message" class="form-control" @bind="@body" rows="5" readonly="@(!reply)" />
</div>
</div>
</div>
}
@if (reply)
{
<button type="button" class="btn btn-primary me-2" @onclick="Send">@SharedLocalizer["Send"]</button>
}
else
{
if (title == "From" && username != Localizer["System"])
{
<button type="button" class="btn btn-primary me-2" @onclick="Reply">@Localizer["Reply"]</button>
}
}
<NavLink class="btn btn-secondary" href="@PageState.ReturnUrl">@SharedLocalizer["Cancel"]</NavLink>
}
@code {
private int notificationid;
private string title = string.Empty;
@@ -105,7 +82,7 @@
private string subject = string.Empty;
private string createdon = string.Empty;
private string body = string.Empty;
private string reply = string.Empty;
private bool reply = false;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
public override string Title => "View Notification";
@@ -145,67 +122,63 @@
}
if (username == "")
{
username = "System";
username = Localizer["System"];
}
subject = notification.Subject;
createdon = notification.CreatedOn.ToString();
body = notification.Body;
if (title == "From" && !notification.IsRead)
{
notification.IsRead = true;
notification = await NotificationService.UpdateNotificationAsync(notification);
}
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Users {Error}", ex.Message);
AddModuleMessage("Error Loading Users", MessageType.Error);
AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error);
}
}
private void Reply()
{
title = "To";
if (!subject.Contains("RE:"))
if (!subject.Contains(Localizer["RE:"]))
{
subject = "RE: " + subject;
subject = Localizer["RE"] + " " + subject;
}
reply = body;
body = "\n\n____________________________________________\nSent: " + createdon + "\nSubject: " + subject + "\n\n" + body;
body = $"\n\n____________________________________________\n" +
$"{Localizer["From.Text"]} {username}\n" +
$"{Localizer["Date.Text"]} {createdon}\n" +
$"{Localizer["Subject.Text"]} {subject}\n\n" +
body;
reply = true;
StateHasChanged();
}
private async Task Send()
{
var notification = new Notification();
try
{
var user = await UserService.GetUserAsync(username, PageState.Site.SiteId);
if (user != null)
{
notification.SiteId = PageState.Site.SiteId;
notification.FromUserId = PageState.User.UserId;
notification.FromDisplayName = PageState.User.DisplayName;
notification.FromEmail = PageState.User.Email;
notification.ToUserId = user.UserId;
notification.ToDisplayName = user.DisplayName;
notification.ToEmail = user.Email;
notification.Subject = subject;
notification.Body = body;
notification.ParentId = notificationid;
notification.CreatedOn = DateTime.UtcNow;
notification.IsDelivered = false;
notification.DeliveredOn = null;
notification.SendOn = DateTime.UtcNow;
var notification = new Notification(PageState.Site.SiteId, PageState.User, user, subject, body, notificationid);
notification = await NotificationService.AddNotificationAsync(notification);
await logger.LogInformation("Notification Created {Notification}", notification);
NavigationManager.NavigateTo(NavigateUrl());
await logger.LogInformation("Notification Created {NotificationId}", notification.NotificationId);
NavigationManager.NavigateTo(PageState.ReturnUrl);
}
else
{
AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning);
AddModuleMessage(Localizer["Message.User.Invalid"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message);
AddModuleMessage("Error Adding Notification", MessageType.Error);
await logger.LogError(ex, "Error Adding Notification {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Notification.Add"], MessageType.Error);
}
}
}

View File

@@ -1,168 +1,240 @@
@namespace Oqtane.Modules.Admin.Users
@namespace Oqtane.Modules.Admin.Users
@using System.Text.RegularExpressions;
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IProfileService ProfileService
@inject ISettingService SettingService
@inject ITimeZoneService TimeZoneService
@inject IStringLocalizer<Add> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<TabStrip>
<TabPanel Name="Identity">
@if (profiles != null)
@if (_initialized)
{
<TabStrip>
<TabPanel Name="Identity" ResourceKey="Identity">
@if (_profiles != null)
{
<table class="table table-borderless">
<tr>
<td>
<label class="control-label">Username: </label>
</td>
<td>
<input class="form-control" @bind="@username" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@password" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Confirm Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@confirm" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Email: </label>
</td>
<td>
<input class="form-control" @bind="@email" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Full Name: </label>
</td>
<td>
<input class="form-control" @bind="@displayname" />
</td>
</tr>
</table>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="A unique username for a user. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@_username" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="email" HelpText="The email address where the user will receive notifications" ResourceKey="Email"></Label>
<div class="col-sm-9">
<input id="email" class="form-control" @bind="@_email" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="displayname" HelpText="The full name of the user" ResourceKey="DisplayName"></Label>
<div class="col-sm-9">
<input id="displayname" class="form-control" @bind="@_displayname" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="timezone" HelpText="Your time zone" ResourceKey="TimeZone">Time Zone:</Label>
<div class="col-sm-9">
<select id="timezone" class="form-select" @bind="@_timezoneid">
<option value="">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var timezone in _timezones)
{
<option value="@timezone.Id">@timezone.DisplayName</option>
}
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="notify" HelpText="Indicate if new users should receive an email notification" ResourceKey="Notify">Notify? </Label>
<div class="col-sm-9">
<select id="notify" class="form-select" @bind="@_notify" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
}
</TabPanel>
<TabPanel Name="Profile">
@if (profiles != null)
{
<table class="table table-borderless">
@foreach (Profile profile in profiles)
<TabPanel Name="Profile" ResourceKey="Profile">
<div class="container">
<div class="row mb-1 align-items-center">
@foreach (Profile profile in _profiles)
{
var p = profile;
if (p.Category != category)
if (p.Category != _category)
{
<tr>
<th colspan="2" style="text-align: center;">
@p.Category
</th>
</tr>
category = p.Category;
<div class="col text-center pb-2">
<strong>@p.Category</strong>
</div>
_category = p.Category;
}
<tr>
<td>
<label for="@p.Name" class="control-label">@p.Title: </label>
</td>
<td>
<input class="form-control" maxlength="@p.MaxLength" placeholder="@p.Description" @onchange="@(e => ProfileChanged(e, p.Name))" />
</td>
</tr>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="@p.Name" HelpText="@p.Description">@p.Title</Label>
<div class="col-sm-9">
@if (!string.IsNullOrEmpty(p.Options))
{
<select id="@p.Name" class="form-select" @onchange="@(e => ProfileChanged(e, p.Name))">
@foreach (var option in p.Options.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
@if (GetProfileValue(p.Name, "") == option || (GetProfileValue(p.Name, "") == "" && p.DefaultValue == option))
{
<option value="@option" selected>@option</option>
}
</table>
else
{
<option value="@option">@option</option>
}
}
</select>
}
else
{
@if (p.Rows == 1)
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" @attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
else
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" @attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
}
</div>
</div>
}
</div>
</div>
</TabPanel>
</TabStrip>
</TabStrip>
<br />
<br />
<button type="button" class="btn btn-success" @onclick="SaveUser">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
}
<button type="button" class="btn btn-primary" @onclick="SaveUser">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
@code {
private string username = string.Empty;
private string password = string.Empty;
private string confirm = string.Empty;
private string email = string.Empty;
private string displayname = string.Empty;
private List<Profile> profiles;
private Dictionary<string, string> settings;
private string category = string.Empty;
private List<Models.TimeZone> _timezones;
private bool _initialized = false;
private string _username = string.Empty;
private string _email = string.Empty;
private string _displayname = string.Empty;
private string _timezoneid = string.Empty;
private string _notify = "True";
private List<Profile> _profiles;
private Dictionary<string, string> _settings;
private string _category = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
protected override async Task OnInitializedAsync()
{
try
{
profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId);
settings = new Dictionary<string, string>();
_timezones = await TimeZoneService.GetTimeZonesAsync();
_profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId);
_settings = new Dictionary<string, string>();
_timezoneid = PageState.Site.TimeZoneId;
_initialized = true;
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message);
AddModuleMessage("Error Loading User Profile", MessageType.Error);
AddModuleMessage(Localizer["Error.Profile.Load"], MessageType.Error);
}
}
private string GetProfileValue(string SettingName, string DefaultValue)
{
string value = SettingService.GetSetting(_settings, SettingName, DefaultValue);
if (value.Contains("]"))
{
value = value.Substring(value.IndexOf("]") + 1);
}
return value;
}
private async Task SaveUser()
{
try
{
if (username != string.Empty && password != string.Empty && confirm != string.Empty && email != string.Empty)
if (_username != string.Empty && _email != string.Empty)
{
if (password == confirm)
if (ValidateProfiles())
{
var user = new User();
user.SiteId = PageState.Site.SiteId;
user.Username = username;
user.Password = password;
user.Email = email;
user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname;
user.Username = _username;
user.Password = ""; // will be auto generated
user.Email = _email;
user.DisplayName = string.IsNullOrWhiteSpace(_displayname) ? _username : _displayname;
user.TimeZoneId = _timezoneid;
user.PhotoFileId = null;
user.SuppressNotification = !bool.Parse(_notify);
user = await UserService.AddUserAsync(user);
if (user != null)
{
await SettingService.UpdateUserSettingsAsync(settings, user.UserId);
await SettingService.UpdateUserSettingsAsync(_settings, user.UserId);
await logger.LogInformation("User Created {User}", user);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
await logger.LogError("Error Adding User {Username} {Email}", username, email);
AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error);
await logger.LogError("Error Adding User {Username} {Email}", _username, _email);
AddModuleMessage(Localizer["Error.User.AddCheckPass"], MessageType.Error);
}
}
}
else
{
AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
}
}
else
{
AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.ProfileInfo"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", username, email, ex.Message);
AddModuleMessage("Error Adding User", MessageType.Error);
await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message);
AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
}
}
private bool ValidateProfiles()
{
foreach (Profile profile in _profiles)
{
var value = GetProfileValue(profile.Name, string.Empty);
if (string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(profile.DefaultValue))
{
_settings = SettingService.SetSetting(_settings, profile.Name, profile.DefaultValue);
}
if (!profile.IsPrivate || UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
if (profile.IsRequired && string.IsNullOrEmpty(value))
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileRequired"], profile.Title), MessageType.Warning);
return false;
}
if (!string.IsNullOrEmpty(profile.Validation))
{
Regex regex = new Regex(profile.Validation);
bool valid = regex.Match(value).Success;
if (!valid)
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileInvalid"], profile.Title), MessageType.Warning);
return false;
}
}
}
}
return true;
}
private void ProfileChanged(ChangeEventArgs e, string SettingName)
{
var value = (string)e.Value;
settings = SettingService.SetSetting(settings, SettingName, value);
_settings = SettingService.SetSetting(_settings, SettingName, value);
}
}

View File

@@ -1,232 +1,395 @@
@namespace Oqtane.Modules.Admin.Users
@namespace Oqtane.Modules.Admin.Users
@using System.Text.RegularExpressions;
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IProfileService ProfileService
@inject ISettingService SettingService
@inject IFileService FileService
@inject ITimeZoneService TimeZoneService
@inject IServiceProvider ServiceProvider
@inject IStringLocalizer<Edit> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (PageState.User != null && photofileid != -1)
@if (_initialized)
{
<img src="@(ContentUrl(photofileid))" alt="@displayname" style="max-width: 400px" class="rounded-circle mx-auto d-block">
}
else
{
<br />
}
<TabStrip>
<TabPanel Name="Identity">
@if (profiles != null)
{
<table class="table table-borderless">
<tr>
<td>
<label class="control-label">Username: </label>
</td>
<td>
<input class="form-control" @bind="@username" readonly />
</td>
</tr>
<tr>
<td>
<label class="control-label">Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@password" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Confirm Password: </label>
</td>
<td>
<input type="password" class="form-control" @bind="@confirm" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Email: </label>
</td>
<td>
<input class="form-control" @bind="@email" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Full Name: </label>
</td>
<td>
<input class="form-control" @bind="@displayname" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Photo: </label>
</td>
<td>
<FileManager FileId="@photofileid" @ref="filemanager" />
</td>
</tr>
<tr>
<td>
<label class="control-label">Is Deleted? </label>
</td>
<td>
<select class="form-control" @bind="@isdeleted">
<option value="True">Yes</option>
<option value="False">No</option>
<TabStrip>
<TabPanel Name="Identity" ResourceKey="Identity">
<ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="username" HelpText="The unique username for a user. Note that this field can not be modified." ResourceKey="Username">Username:</Label>
<div class="col-sm-9">
<input id="username" class="form-control" @bind="@_username" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="password" HelpText="The user's password. Please choose a password which is sufficiently secure." ResourceKey="Password">Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirm" HelpText="Please enter the password again to confirm it matches with the value above" ResourceKey="Confirm">Confirm Password:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" />
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="email" HelpText="The email address where the user will receive notifications" ResourceKey="Email">Email:</Label>
<div class="col-sm-9">
<input id="email" class="form-control" @bind="@_email" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="confirmed" HelpText="Indicates if the user's email is verified" ResourceKey="Confirmed">Confirmed?</Label>
<div class="col-sm-9">
<select id="confirmed" class="form-select" @bind="@_confirmed">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</td>
</tr>
</table>
}
</TabPanel>
<TabPanel Name="Profile">
@if (profiles != null)
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="displayname" HelpText="The full name of the user" ResourceKey="DisplayName">Full Name:</Label>
<div class="col-sm-9">
<input id="displayname" class="form-control" @bind="@_displayname" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="timezone" HelpText="Your time zone" ResourceKey="TimeZone">Time Zone:</Label>
<div class="col-sm-9">
<select id="timezone" class="form-select" @bind="@_timezoneid">
<option value="">&lt;@SharedLocalizer["Not Specified"]&gt;</option>
@foreach (var timezone in _timezones)
{
<table class="table table-borderless">
@foreach (Profile profile in profiles)
<option value="@timezone.Id">@timezone.DisplayName</option>
}
</select>
</div>
</div>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="isdeleted" HelpText="Indicate if the user is active" ResourceKey="IsDeleted">Deleted?</Label>
<div class="col-sm-9">
<select id="isdeleted" class="form-select" @bind="@_isdeleted">
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="lastlogin" HelpText="The date and time when the user last signed in" ResourceKey="LastLogin">Last Login:</Label>
<div class="col-sm-9">
<input id="lastlogin" class="form-control" @bind="@_lastlogin" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="lastipaddress" HelpText="The IP Address of the user recorded during their last login" ResourceKey="LastIPAddress">Last IP Address:</Label>
<div class="col-sm-9">
<input id="lastipaddress" class="form-control" @bind="@_lastipaddress" readonly />
</div>
</div>
</div>
</TabPanel>
<TabPanel Name="Profile" ResourceKey="Profile">
<div class="container">
<div class="row mb-1 align-items-center">
@foreach (Profile profile in _profiles)
{
var p = profile;
if (p.Category != category)
if (p.Category != _category)
{
<tr>
<th colspan="2" style="text-align: center;">
@p.Category
</th>
</tr>
category = p.Category;
<div class="col text-center pb-2">
<strong>@p.Category</strong>
</div>
_category = p.Category;
}
<tr>
<td>
<label for="@p.Name" class="control-label">@p.Title: </label>
</td>
<td>
<input class="form-control" maxlength="@p.MaxLength" value="@GetProfileValue(p.Name, p.DefaultValue)" placeholder="@p.Description" @onchange="@(e => ProfileChanged(e, p.Name))" />
</td>
</tr>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="@p.Name" HelpText="@p.Description">@p.Title</Label>
<div class="col-sm-9">
@if (!string.IsNullOrEmpty(p.Options))
{
<select id="@p.Name" class="form-select" @onchange="@(e => ProfileChanged(e, p.Name))">
@foreach (var option in p.Options.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
@if (GetProfileValue(p.Name, "") == option || (GetProfileValue(p.Name, "") == "" && p.DefaultValue == option))
{
<option value="@option" selected>@option</option>
}
</table>
else
{
<option value="@option">@option</option>
}
}
</select>
}
else
{
@if (p.Rows == 1)
{
<input id="@p.Name" class="form-control" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" @attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)" />
}
else
{
<textarea id="@p.Name" class="form-control" rows="@p.Rows" value="@GetProfileValue(p.Name, p.DefaultValue)" @onchange="@(e => ProfileChanged(e, p.Name))" @attributes="@(p.MaxLength > 0 ? new Dictionary<string, object> {{"maxlength", p.MaxLength }} : null)"></textarea>
}
}
</div>
</div>
}
</div>
</div>
</TabPanel>
</TabStrip>
<button type="button" class="btn btn-primary" @onclick="SaveUser">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
<br /><br />
<AuditInfo CreatedBy="@createdby" CreatedOn="@createdon" ModifiedBy="@modifiedby" ModifiedOn="@modifiedon" DeletedBy="@deletedby" DeletedOn="@deletedon"></AuditInfo>
</TabStrip>
<br />
<button type="button" class="btn btn-success" @onclick="SaveUser">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin) && PageState.Runtime != Shared.Runtime.Hybrid && !_ishost)
{
<button type="button" class="btn btn-primary ms-1" @onclick="ImpersonateUser">@Localizer["Impersonate"]</button>
}
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host) && _isdeleted == "True")
{
<ActionDialog Header="Delete User" Message="Are You Sure You Wish To Permanently Delete This User?" Action="Delete" Security="SecurityAccessLevel.Host" Class="btn btn-danger" OnClick="@(async () => await DeleteUser())" ResourceKey="DeleteUser" />
}
<br /><br />
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon" DeletedBy="@_deletedby" DeletedOn="@_deletedon"></AuditInfo>
}
@code {
private int userid;
private string username = string.Empty;
private string password = string.Empty;
private string confirm = string.Empty;
private string email = string.Empty;
private string displayname = string.Empty;
private FileManager filemanager;
private int photofileid = -1;
private List<Profile> profiles;
private Dictionary<string, string> settings;
private string category = string.Empty;
private string createdby;
private DateTime createdon;
private string modifiedby;
private DateTime modifiedon;
private string deletedby;
private DateTime? deletedon;
private string isdeleted;
private List<Models.TimeZone> _timezones;
private bool _initialized = false;
private string _passwordrequirements;
private int _userid;
private string _username = string.Empty;
private string _password = string.Empty;
private string _passwordtype = "password";
private string _togglepassword = string.Empty;
private string _confirm = string.Empty;
private string _email = string.Empty;
private string _confirmed = string.Empty;
private string _displayname = string.Empty;
private string _timezoneid = string.Empty;
private string _isdeleted;
private string _lastlogin;
private string _lastipaddress;
private bool _ishost = false;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private List<Profile> _profiles;
private Dictionary<string, string> _settings;
private string _category = string.Empty;
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
private string _deletedby;
private DateTime? _deletedon;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
protected override async Task OnInitializedAsync()
{
try
{
profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId);
_passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId);
_togglepassword = SharedLocalizer["ShowPassword"];
_profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId);
_timezones = await TimeZoneService.GetTimeZonesAsync();
userid = Int32.Parse(PageState.QueryString["id"]);
var user = await UserService.GetUserAsync(userid, PageState.Site.SiteId);
if (PageState.QueryString.ContainsKey("id") && int.TryParse(PageState.QueryString["id"], out int UserId))
{
_userid = UserId;
var user = await UserService.GetUserAsync(_userid, PageState.Site.SiteId);
if (user != null)
{
username = user.Username;
email = user.Email;
displayname = user.DisplayName;
_username = user.Username;
_email = user.Email;
_confirmed = user.EmailConfirmed.ToString();
_displayname = user.DisplayName;
_timezoneid = PageState.User.TimeZoneId;
_isdeleted = user.IsDeleted.ToString();
_lastlogin = string.Format("{0:MMM dd yyyy HH:mm:ss}", UtcToLocal(user.LastLoginOn));
_lastipaddress = user.LastIPAddress;
_ishost = UserSecurity.ContainsRole(user.Roles, RoleNames.Host);
if (user.PhotoFileId != null)
{
photofileid = user.PhotoFileId.Value;
_settings = user.Settings;
_createdby = user.CreatedBy;
_createdon = user.CreatedOn;
_modifiedby = user.ModifiedBy;
_modifiedon = user.ModifiedOn;
_deletedby = user.DeletedBy;
_deletedon = user.DeletedOn;
}
}
settings = await SettingService.GetUserSettingsAsync(user.UserId);
createdby = user.CreatedBy;
createdon = user.CreatedOn;
modifiedby = user.ModifiedBy;
modifiedon = user.ModifiedOn;
deletedby = user.DeletedBy;
deletedon = user.DeletedOn;
isdeleted = user.IsDeleted.ToString();
}
_initialized = true;
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading User {UserId} {Error}", userid, ex.Message);
AddModuleMessage("Error Loading User", MessageType.Error);
await logger.LogError(ex, "Error Loading User {UserId} {Error}", _userid, ex.Message);
AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error);
}
}
private string GetProfileValue(string SettingName, string DefaultValue)
=> SettingService.GetSetting(settings, SettingName, DefaultValue);
{
string value = SettingService.GetSetting(_settings, SettingName, DefaultValue);
if (value.Contains("]"))
{
value = value.Substring(value.IndexOf("]") + 1);
}
return value;
}
private async Task SaveUser()
{
try
{
if (username != string.Empty && email != string.Empty)
if (_username != string.Empty && _email != string.Empty)
{
if (password == confirm)
if (_password == _confirm)
{
var user = await UserService.GetUserAsync(userid, PageState.Site.SiteId);
if (ValidateProfiles())
{
var user = await UserService.GetUserAsync(_userid, PageState.Site.SiteId);
user.SiteId = PageState.Site.SiteId;
user.Username = username;
user.Password = password;
user.Email = email;
user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname;
user.PhotoFileId = null;
photofileid = filemanager.GetFileId();
if (photofileid != -1)
user.Username = _username;
user.Password = _password;
user.Email = _email;
user.EmailConfirmed = bool.Parse(_confirmed);
user.DisplayName = string.IsNullOrWhiteSpace(_displayname) ? _username : _displayname;
user.TimeZoneId = _timezoneid;
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
user.PhotoFileId = photofileid;
user.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted));
}
user.IsDeleted = (isdeleted == null ? true : Boolean.Parse(isdeleted));
user = await UserService.UpdateUserAsync(user);
await SettingService.UpdateUserSettingsAsync(settings, user.UserId);
if (user != null)
{
await SettingService.UpdateUserSettingsAsync(_settings, user.UserId);
await logger.LogInformation("User Saved {User}", user);
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
AddModuleMessage(Localizer["Message.Password.Complexity"], MessageType.Error);
}
}
}
else
{
AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning);
AddModuleMessage(Localizer["Message.Password.NoMatch"], MessageType.Warning);
}
}
else
{
AddModuleMessage(Localizer["Message.Required.ProfileInfo"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving User {Username} {Email} {Error}", username, email, ex.Message);
AddModuleMessage("Error Saving User", MessageType.Error);
await logger.LogError(ex, "Error Saving User {Username} {Email} {Error}", _username, _email, ex.Message);
AddModuleMessage(Localizer["Error.User.Save"], MessageType.Error);
}
}
private async Task ImpersonateUser()
{
try
{
await logger.LogInformation(LogFunction.Security, "User {Username} Impersonated By Administrator {Administrator}", _username, PageState.User.Username);
// post back to the server so that the cookies are set correctly
var interop = new Interop(JSRuntime);
var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, returnurl = PageState.Alias.Path };
string url = Utilities.TenantUrl(PageState.Alias, "/pages/impersonate/");
await interop.SubmitForm(url, fields);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Impersonating User {Username} {Error}", _username, ex.Message);
AddModuleMessage(Localizer["Error.User.Impersonate"], MessageType.Error);
}
}
private async Task DeleteUser()
{
try
{
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host) && _userid != PageState.User.UserId)
{
var user = await UserService.GetUserAsync(_userid, PageState.Site.SiteId);
await UserService.DeleteUserAsync(user.UserId, PageState.Site.SiteId);
await logger.LogInformation("User Permanently Deleted {User}", user);
NavigationManager.NavigateTo(NavigateUrl());
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Permanently Deleting User {UserId} {Error}", _userid, ex.Message);
AddModuleMessage(Localizer["Error.DeleteUser"], MessageType.Error);
}
}
private bool ValidateProfiles()
{
foreach (Profile profile in _profiles)
{
var value = GetProfileValue(profile.Name, string.Empty);
if (string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(profile.DefaultValue))
{
_settings = SettingService.SetSetting(_settings, profile.Name, profile.DefaultValue);
}
if (!profile.IsPrivate || UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin))
{
if (profile.IsRequired && string.IsNullOrEmpty(value))
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileRequired"], profile.Title), MessageType.Warning);
return false;
}
if (!string.IsNullOrEmpty(profile.Validation))
{
Regex regex = new Regex(profile.Validation);
bool valid = regex.Match(value).Success;
if (!valid)
{
AddModuleMessage(string.Format(SharedLocalizer["ProfileInvalid"], profile.Title), MessageType.Warning);
return false;
}
}
}
}
return true;
}
private void ProfileChanged(ChangeEventArgs e, string SettingName)
{
var value = (string)e.Value;
settings = SettingService.SetSetting(settings, SettingName, value);
_settings = SettingService.SetSetting(_settings, SettingName, value);
}
private void TogglePassword()
{
if (_passwordtype == "password")
{
_passwordtype = "text";
_togglepassword = SharedLocalizer["HidePassword"];
}
else
{
_passwordtype = "password";
_togglepassword = SharedLocalizer["ShowPassword"];
}
}
}

View File

@@ -1,114 +1,860 @@
@namespace Oqtane.Modules.Admin.Users
@namespace Oqtane.Modules.Admin.Users
@inherits ModuleBase
@inject IUserRoleService UserRoleService
@inject IUserService UserService
@inject ISettingService SettingService
@inject ISiteService SiteService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (userroles == null)
@if (users == null)
{
<p>
<em>Loading...</em>
<em>@SharedLocalizer["Loading"]</em>
</p>
}
else
{
<ActionLink Action="Add" Text="Add User"/>
<TabStrip>
<TabPanel Name="Users" Heading="Users" ResourceKey="Users">
<ActionLink Action="Add" Text="Add User" Security="SecurityAccessLevel.Edit" ResourceKey="AddUser" />&nbsp;
<ActionLink Text="Import Users" Class="btn btn-secondary ms-2" Action="Users" Security="SecurityAccessLevel.Admin" ResourceKey="ImportUsers"/>
<div class="d-flex p-1">
<input class="form-control mr-4" @bind="@_search"/><button class="btn btn-outline-primary ml-1" @onclick="OnSearch">Search</button>
</div>
<Pager Items="@userroles">
<Pager Items="@users" RowClass="align-middle" SearchProperties="User.Username,User.Email,User.DisplayName">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th style="width: 1px;">&nbsp;</th>
<th>Name</th>
<th class="app-sort-th link-primary text-decoration-underline" @onclick="@(() => SortTable("Username"))">@Localizer["Username"]<i class="@(SetSortIcon("Username"))"></i></th>
<th class="app-sort-th link-primary text-decoration-underline" @onclick="@(() => SortTable("DisplayName"))">@Localizer["Name"]<i class="@(SetSortIcon("DisplayName"))"></i></th>
<th class="app-sort-th link-primary text-decoration-underline" @onclick="@(() => SortTable("Email"))">@Localizer["Email"]<i class="@(SetSortIcon("Email"))"></i></th>
<th class="app-sort-th link-primary text-decoration-underline" @onclick="@(() => SortTable("LastLoginOn"))">@Localizer["LastLoginOn"]<i class="@(SetSortIcon("LastLoginOn"))"></i></th>
</Header>
<Row>
<td>
<ActionLink Action="Edit" Parameters="@($"id=" + context.UserId.ToString())"/>
<ActionLink Action="Edit" Text="Edit" Parameters="@($"id=" + context.UserId.ToString())" Security="SecurityAccessLevel.Edit" ResourceKey="EditUser" />
</td>
<td>
<ActionDialog Header="Delete User" Message="@("Are You Sure You Wish To Delete " + context.User.DisplayName + "?")" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteUser(context))"/>
<ActionDialog Header="Delete User" Message="@string.Format(Localizer["Confirm.User.Delete"], context.User.DisplayName)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteUser(context))" Disabled="@(context.UserId == PageState.User.UserId || context.User.IsDeleted)" ResourceKey="DeleteUser" />
</td>
<td>
<ActionLink Action="Roles" Parameters="@($"id=" + context.UserId.ToString())"/>
<ActionLink Action="Roles" Text="Roles" Parameters="@($"id=" + context.UserId.ToString())" Security="SecurityAccessLevel.Edit" ResourceKey="Roles" />
</td>
<td>@context.User.Username</td>
<td>@context.User.DisplayName</td>
<td>@((MarkupString)string.Format("<a href=\"mailto:{0}\">{1}</a>", @context.User.Email, @context.User.Email))</td>
<td>@((context.User.LastLoginOn != DateTime.MinValue) ? string.Format("{0:dd-MMM-yyyy HH:mm:ss}", UtcToLocal(context.User.LastLoginOn)) : "")</td>
</Row>
</Pager>
</TabPanel>
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings" Security="SecurityAccessLevel.Admin">
<div class="container">
<Section Name="User" Heading="User Settings" ResourceKey="UserSettings">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="allowregistration" HelpText="Do you want anonymous visitors to be able to register for an account on the site" ResourceKey="AllowRegistration">Allow User Registration?</Label>
<div class="col-sm-9">
<select id="allowregistration" class="form-select" @bind="@_allowregistration">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
@if (_allowregistration == "true")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="registerurl" HelpText="Optionally provide a custom registration url" ResourceKey="RegisterUrl">Register Url:</Label>
<div class="col-sm-9">
<input id="registerurl" class="form-control" @bind="@_registerurl" />
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="profileurl" HelpText="Optionally provide a custom profile url" ResourceKey="ProfileUrl">Profile Url:</Label>
<div class="col-sm-9">
<input id="profileurl" class="form-control" @bind="@_profileurl" />
</div>
</div>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="twofactor" HelpText="Do you want users to use two factor authentication? Note that you should use the Disabled option until you have successfully verified that the Notification Job in Scheduled Jobs is enabled and your SMTP options in Site Settings are configured or else you will lock yourself out." ResourceKey="TwoFactor">Two Factor?</Label>
<div class="col-sm-9">
<select id="twofactor" class="form-select" @bind="@_twofactor">
<option value="false">@Localizer["Disabled"]</option>
<option value="true">@Localizer["Optional"]</option>
<option value="required">@Localizer["Required"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="cookiename" HelpText="You can choose to use a custom authentication cookie name for each site. However please be aware that if you want to share an authentication cookie between sites on the same domain they need to use a consistent cookie name. Also be aware that changing the authentication cookie name will logout all current users." ResourceKey="CookieName">Cookie Name:</Label>
<div class="col-sm-9">
<input id="cookiename" class="form-control" @bind="@_cookiename" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="cookieexpiration" HelpText="You can choose to use a custom authentication cookie expiration timespan for each site (e.g. '08:00:00' for 8 hours). The default is 14 days if not specified." ResourceKey="CookieExpiration">Cookie Expiration Timespan:</Label>
<div class="col-sm-9">
<input id="cookieexpiration" class="form-control" @bind="@_cookieexpiration" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="alwaysremember" HelpText="Enabling this option will set a permanent cookie in conjunction with the Cookie Expiration Timespan, which will automatically sign in users the next time they visit the site. By default the site will use session cookies." ResourceKey="AlwaysRemember">Always Remember User?</Label>
<div class="col-sm-9">
<select id="alwaysremember" class="form-select" @bind="@_alwaysremember">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="logouteverywhere" HelpText="Do you want users to be logged out of every active session on any device, or only their current session?" ResourceKey="LogoutEverywhere">Logout Everywhere?</Label>
<div class="col-sm-9">
<select id="logouteverywhere" class="form-select" @bind="@_logouteverywhere">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
}
</Section>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<Section Name="Password" Heading="Password Settings" ResourceKey="PasswordSettings">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="minimumlength" HelpText="The Minimum Length For A Password" ResourceKey="RequiredLength">Minimum Length:</Label>
<div class="col-sm-9">
<input id="minimumlength" class="form-control" @bind="@_minimumlength" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="uniquecharacters" HelpText="The Minimum Number Of Unique Characters Which A Password Must Contain" ResourceKey="UniqueCharacters">Unique Characters:</Label>
<div class="col-sm-9">
<input id="uniquecharacters" class="form-control" @bind="@_uniquecharacters" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="requiredigit" HelpText="Indicate If Passwords Must Contain A Digit" ResourceKey="RequireDigit">Require Digit?</Label>
<div class="col-sm-9">
<select id="requiredigit" class="form-select" @bind="@_requiredigit" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="requireupper" HelpText="Indicate If Passwords Must Contain An Upper Case Character" ResourceKey="RequireUpper">Require Uppercase?</Label>
<div class="col-sm-9">
<select id="requireupper" class="form-select" @bind="@_requireupper" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="requirelower" HelpText="Indicate If Passwords Must Contain A Lower Case Character" ResourceKey="RequireLower">Require Lowercase?</Label>
<div class="col-sm-9">
<select id="requirelower" class="form-select" @bind="@_requirelower" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="requirepunctuation" HelpText="Indicate if Passwords Must Contain A Non-alphanumeric Character (ie. Punctuation)" ResourceKey="RequirePunctuation">Require Punctuation?</Label>
<div class="col-sm-9">
<select id="requirepunctuation" class="form-select" @bind="@_requirepunctuation" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</Section>
<Section Name="Lockout" Heading="Lockout Settings" ResourceKey="LockoutSettings">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="maximum" HelpText="The Maximum Number Of Sign In Attempts Before A User Is Locked Out" ResourceKey="MaximumFailures">Maximum Failures:</Label>
<div class="col-sm-9">
<input id="maximum" class="form-control" @bind="@_maximumfailures" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="lockoutduration" HelpText="The Number Of Minutes A User Should Be Locked Out" ResourceKey="LockoutDuration">Lockout Duration:</Label>
<div class="col-sm-9">
<input id="lockoutduration" class="form-control" @bind="@_lockoutduration" required />
</div>
</div>
</Section>
<Section Name="ExternalLogin" Heading="External Login Settings" ResourceKey="ExternalLoginSettings">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="provider" HelpText="Select the external login provider" ResourceKey="Provider">Provider:</Label>
<div class="col-sm-9">
<div class="input-group">
<select id="provider" class="form-select" value="@_provider" @onchange="(e => ProviderChanged(e))">
@foreach (var provider in Shared.ExternalLoginProviders.Providers)
{
<option value="@provider.Name">@Localizer[provider.Name]</option>
}
</select>
@if (!string.IsNullOrEmpty(_providerurl))
{
<a href="@_providerurl" class="btn btn-secondary" target="_new">@Localizer["Info"]</a>
}
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="providertype" HelpText="Select the external login provider type" ResourceKey="ProviderType">Provider Type:</Label>
<div class="col-sm-9">
<select id="providertype" class="form-select" value="@_providertype" @onchange="(e => ProviderTypeChanged(e))">
<option value="" selected>&lt;@Localizer["Not Specified"]&gt;</option>
<option value="@AuthenticationProviderTypes.OpenIDConnect">@Localizer["OIDC"]</option>
<option value="@AuthenticationProviderTypes.OAuth2">@Localizer["OAuth2"]</option>
</select>
</div>
</div>
@if (_providertype != "")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="providername" HelpText="Specify a friendly name for the external login provider which will be displayed on the Login page" ResourceKey="ProviderName">Provider Name:</Label>
<div class="col-sm-9">
<input id="providername" class="form-control" @bind="@_providername" />
</div>
</div>
}
@if (_providertype == AuthenticationProviderTypes.OpenIDConnect)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="authority" HelpText="The Authority Url or Issuer Url associated with the OpenID Connect provider" ResourceKey="Authority">Authority:</Label>
<div class="col-sm-9">
<input id="authority" class="form-control" @bind="@_authority" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="metadataurl" HelpText="The discovery endpoint for obtaining metadata for this provider. Only specify if the OpenID Connect provider does not use the standard approach (ie. /.well-known/openid-configuration)" ResourceKey="MetadataUrl">Metadata Url:</Label>
<div class="col-sm-9">
<input id="metadataurl" class="form-control" @bind="@_metadataurl" />
</div>
</div>
}
@if (_providertype == AuthenticationProviderTypes.OAuth2)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="authorizationurl" HelpText="The endpoint for obtaining an Authorization Code" ResourceKey="AuthorizationUrl">Authorization Url:</Label>
<div class="col-sm-9">
<input id="authorizationurl" class="form-control" @bind="@_authorizationurl" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="tokenurl" HelpText="The endpoint for obtaining an Auth Token" ResourceKey="TokenUrl">Token Url:</Label>
<div class="col-sm-9">
<input id="tokenurl" class="form-control" @bind="@_tokenurl" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="userinfourl" HelpText="The endpoint for obtaining user information. This should be an API or Page Url which contains the users email address." ResourceKey="UserInfoUrl">User Info Url:</Label>
<div class="col-sm-9">
<input id="userinfourl" class="form-control" @bind="@_userinfourl" />
</div>
</div>
}
@if (_providertype != "")
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="clientid" HelpText="The Client ID from the provider" ResourceKey="ClientID">Client ID:</Label>
<div class="col-sm-9">
<input id="clientid" class="form-control" @bind="@_clientid" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="clientsecret" HelpText="The Client Secret from the provider" ResourceKey="ClientSecret">Client Secret:</Label>
<div class="col-sm-9">
<div class="input-group">
<input type="@_clientsecrettype" id="clientsecret" class="form-control" @bind="@_clientsecret" />
<button type="button" class="btn btn-secondary" @onclick="@ToggleClientSecret">@_toggleclientsecret</button>
</div>
</div>
</div>
@if (_providertype == AuthenticationProviderTypes.OpenIDConnect)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="authresponsetype" HelpText="Specify the authorization response type. The default is Authorization Code which is considered to be the most secure option based on the latest OAuth specification." ResourceKey="AuthResponseType">Authorization Response Type:</Label>
<div class="col-sm-9">
<select id="authresponsetype" class="form-select" @bind="@_authresponsetype" required>
<option value="code">@Localizer["AuthFlow.Code"]</option>
<option value="code id_token">@Localizer["AuthFlow.CodeIdToken"]</option>
<option value="code id_token token">@Localizer["AuthFlow.CodeIdTokenToken"]</option>
<option value="code token">@Localizer["AuthFlow.CodeToken"]</option>
<option value="id_token">@Localizer["AuthFlow.IdToken"]</option>
<option value="id_token token">@Localizer["AuthFlow.IdTokenToken"]</option>
<option value="token">@Localizer["AuthFlow.Token"]</option>
<option value="none">@Localizer["AuthFlow.None"]</option>
</select>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="scopes" HelpText="A list of Scopes to request from the provider (separated by commas). If none are specified, standard Scopes will be used by default." ResourceKey="Scopes">Scopes:</Label>
<div class="col-sm-9">
<input id="scopes" class="form-control" @bind="@_scopes" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="parameters" HelpText="Optionally specify any additional parameters as name/value pairs to send to the provider (separated by commas if there are multiple)." ResourceKey="Parameters">Parameters:</Label>
<div class="col-sm-9">
<input id="parameters" class="form-control" @bind="@_parameters" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="pkce" HelpText="Indicate if the provider supports Proof Key for Code Exchange (PKCE)" ResourceKey="PKCE">Use PKCE?</Label>
<div class="col-sm-9">
<select id="pkce" class="form-select" @bind="@_pkce" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="redirecturl" HelpText="The Redirect Url (or Callback Url) which usually needs to be registered with the provider" ResourceKey="RedirectUrl">Redirect Url:</Label>
<div class="col-sm-9">
<input id="redirecturl" class="form-control" @bind="@_redirecturl" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="reviewclaims" HelpText="This option will record the full list of Claims returned by the Provider in the Event Log. It should only be used for testing purposes. External Login will be restricted when this option is enabled." ResourceKey="ReviewClaims">Review Claims?</Label>
<div class="col-sm-9">
<div class="input-group">
<select id="reviewclaims" class="form-select" @bind="@_reviewclaims" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
@if (_reviewclaims == "true")
{
<a href="@_externalloginurl" target="_blank" class="btn btn-secondary">@SharedLocalizer["Test"]</a>
}
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="identifierclaimtype" HelpText="Specify the type name of the unique user identifier claim provided by the provider. The default value is 'sub'." ResourceKey="IdentifierClaimType">Identifier Claim:</Label>
<div class="col-sm-9">
<input id="identifierclaimtype" class="form-control" @bind="@_identifierclaimtype" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="nameclaimtype" HelpText="Optionally specify the type name of the user's name claim provided by the provider. The typical value is 'name'." ResourceKey="NameClaimType">Name Claim:</Label>
<div class="col-sm-9">
<input id="nameclaimtype" class="form-control" @bind="@_nameclaimtype" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="emailclaimtype" HelpText="Optionally specify the type name of the email address claim provided by the provider. The typical value is 'email'," ResourceKey="EmailClaimType">Email Claim:</Label>
<div class="col-sm-9">
<input id="emailclaimtype" class="form-control" @bind="@_emailclaimtype" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="roleclaimtype" HelpText="The name of the roles claim provided by the provider" ResourceKey="RoleClaimType">Roles Claim:</Label>
<div class="col-sm-9">
<input id="roleclaimtype" class="form-control" @bind="@_roleclaimtype" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="roleclaimmappings" HelpText="Optionally provide a comma delimited list of role names provided by the identity provider, as well as mappings to your site roles." ResourceKey="RoleClaimMappings">Role Claim Mappings:</Label>
<div class="col-sm-9">
<input id="roleclaimmappings" class="form-control" @bind="@_roleclaimmappings" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="synchronizeroles" HelpText="This option will add or remove role assignments so that the site roles exactly match the roles provided by the identity provider" ResourceKey="SynchronizeRoles">Synchronize Roles?</Label>
<div class="col-sm-9">
<div class="input-group">
<select id="synchronizeroles" class="form-select" @bind="@_synchronizeroles" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="profileclaimtypes" HelpText="A comma delimited list of user profile claims provided by the provider, as well as mappings to your user profile definition. For example if the provider includes a 'given_name' claim and you have a 'FirstName' user profile definition you should specify 'given_name:FirstName'." ResourceKey="ProfileClaimTypes">User Profile Claims:</Label>
<div class="col-sm-9">
<input id="profileclaimtypes" class="form-control" @bind="@_profileclaimtypes" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="savetokens" HelpText="Specify whether access and refresh tokens should be saved after a successful login. The default is false to reduce the size of the authentication cookie." ResourceKey="SaveTokens">Save Tokens?</Label>
<div class="col-sm-9">
<select id="savetokens" class="form-select" @bind="@_savetokens" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="domainfilter" HelpText="Provide any email domain filter criteria (separated by commas). Domains to exclude should be prefixed with an exclamation point (!). For example 'microsoft.com,!hotmail.com' would include microsoft.com email addresses but not hotmail.com email addresses." ResourceKey="DomainFilter">Domain Filter:</Label>
<div class="col-sm-9">
<input id="domainfilter" class="form-control" @bind="@_domainfilter" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="createusers" HelpText="Do you want new users to be created automatically? If you disable this option, users must already be registered on the site in order to sign in with their external login." ResourceKey="CreateUsers">Create New Users?</Label>
<div class="col-sm-9">
<select id="createusers" class="form-select" @bind="@_createusers">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="verifyusers" HelpText="Do you want existing users to perform an additional email verification step to link their external login? If you disable this option, existing users will be linked automatically." ResourceKey="VerifyUsers">Verify Existing Users?</Label>
<div class="col-sm-9">
<select id="verifyusers" class="form-select" @bind="@_verifyusers">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
@if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="allowhostrole" HelpText="Indicate if host roles are supported from the identity provider. Please use caution with this option as it allows the host user to administrate every site within your installation." ResourceKey="AllowHostRole">Allow Host Role?</Label>
<div class="col-sm-9">
<select id="allowhostrole" class="form-select" @bind="@_allowhostrole" required>
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="allowsitelogin" HelpText="Do you want to allow users to sign in using a username and password that is managed locally on this site? Note that you should only disable this option if you have already sucessfully configured an external login provider, or else you may lock yourself out of the site." ResourceKey="AllowSiteLogin">Allow Local Login?</Label>
<div class="col-sm-9">
<select id="allowsitelogin" class="form-select" @bind="@_allowsitelogin">
<option value="true">@SharedLocalizer["Yes"]</option>
<option value="false">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
}
}
</Section>
<Section Name="Token" Heading="Token Settings" ResourceKey="TokenSettings">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="jwtsecret" HelpText="If you want to want to provide API access, please specify a secret which will be used to encrypt your tokens. The secret should be 16 characters or more to ensure optimal security. Please note that if you change this secret, all existing tokens will become invalid and will need to be regenerated." ResourceKey="Secret">Secret:</Label>
<div class="col-sm-9">
<div class="input-group">
<input type="@_secrettype" id="jwtsecret" class="form-control" @bind="@_secret" />
<button type="button" class="btn btn-secondary" @onclick="@ToggleSecret">@_togglesecret</button>
</div>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="issuer" HelpText="Optionally provide the issuer of the token" ResourceKey="Issuer">Issuer:</Label>
<div class="col-sm-9">
<input id="issuer" class="form-control" @bind="@_issuer" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="audience" HelpText="Optionally provide the audience for the token" ResourceKey="Audience">Audience:</Label>
<div class="col-sm-9">
<input id="audience" class="form-control" @bind="@_audience" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="lifetime" HelpText="The number of minutes for which a token should be valid" ResourceKey="Lifetime">Lifetime:</Label>
<div class="col-sm-9">
<input id="lifetime" class="form-control" @bind="@_lifetime" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="token" HelpText="Select the Create Token button to generate a long-lived access token (valid for 1 year). Be sure to store this token in a safe location as you will not be able to access it in the future." ResourceKey="Token">Access Token:</Label>
<div class="col-sm-9">
<div class="input-group">
<input id="token" class="form-control" @bind="@_token" />
<button type="button" class="btn btn-secondary" @onclick="@CreateToken">@Localizer["CreateToken"]</button>
</div>
</div>
</div>
</Section>
}
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
</TabPanel>
</TabStrip>
}
@code {
private List<UserRole> allroles;
private List<UserRole> userroles;
private string _search;
private List<UserRole> users;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private string _allowregistration;
private string _registerurl;
private string _profileurl;
private string _twofactor;
private string _cookiename;
private string _cookieexpiration;
private string _alwaysremember;
private string _logouteverywhere;
private string _minimumlength;
private string _uniquecharacters;
private string _requiredigit;
private string _requireupper;
private string _requirelower;
private string _requirepunctuation;
private string _maximumfailures;
private string _lockoutduration;
private string _provider;
private string _providerurl;
private string _providertype;
private string _providername;
private string _authority;
private string _metadataurl;
private string _authorizationurl;
private string _tokenurl;
private string _userinfourl;
private string _clientid;
private string _clientsecret;
private string _clientsecrettype = "password";
private string _toggleclientsecret = string.Empty;
private string _authresponsetype;
private string _scopes;
private string _parameters;
private string _pkce;
private string _redirecturl;
private string _reviewclaims;
private string _externalloginurl;
private string _identifierclaimtype;
private string _nameclaimtype;
private string _emailclaimtype;
private string _roleclaimtype;
private string _roleclaimmappings;
private string _synchronizeroles;
private string _profileclaimtypes;
private string _savetokens;
private string _domainfilter;
private string _createusers;
private string _verifyusers;
private string _allowhostrole;
private string _allowsitelogin;
private string _secret;
private string _secrettype = "password";
private string _togglesecret = string.Empty;
private string _issuer;
private string _audience;
private string _lifetime;
private string _token;
private bool isSortedAscending;
private string activeSortColumn;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
protected override async Task OnInitializedAsync()
{
allroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
await LoadSettingsAsync();
userroles = Search(_search);
await LoadUsersAsync(true);
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_allowregistration = PageState.Site.AllowRegistration.ToString().ToLower();
_registerurl = SettingService.GetSetting(settings, "LoginOptions:RegisterUrl", "");
_profileurl = SettingService.GetSetting(settings, "LoginOptions:ProfileUrl", "");
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
_twofactor = SettingService.GetSetting(settings, "LoginOptions:TwoFactor", "false");
_cookiename = SettingService.GetSetting(settings, "LoginOptions:CookieName", ".AspNetCore.Identity.Application");
_cookieexpiration = SettingService.GetSetting(settings, "LoginOptions:CookieExpiration", "");
_alwaysremember = SettingService.GetSetting(settings, "LoginOptions:AlwaysRemember", "false");
_logouteverywhere = SettingService.GetSetting(settings, "LoginOptions:LogoutEverywhere", "false");
_minimumlength = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredLength", "6");
_uniquecharacters = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", "1");
_requiredigit = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireDigit", "true");
_requireupper = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireUppercase", "true");
_requirelower = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireLowercase", "true");
_requirepunctuation = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", "true");
_maximumfailures = SettingService.GetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", "5");
_lockoutduration = TimeSpan.Parse(SettingService.GetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", "00:05:00")).TotalMinutes.ToString();
LoadExternalLoginSettings(settings);
_secret = SettingService.GetSetting(settings, "JwtOptions:Secret", "");
_togglesecret = SharedLocalizer["ShowPassword"];
_issuer = SettingService.GetSetting(settings, "JwtOptions:Issuer", PageState.Uri.Scheme + "://" + PageState.Alias.Name);
_audience = SettingService.GetSetting(settings, "JwtOptions:Audience", "");
_lifetime = SettingService.GetSetting(settings, "JwtOptions:Lifetime", "20");
}
}
private List<UserRole> Search(string search)
private void LoadExternalLoginSettings(Dictionary<string, string> settings)
{
if (string.IsNullOrEmpty(_search))
{
return allroles.Where(item => item.Role.Name == Constants.RegisteredRole).ToList();
}
return allroles
.Where(item => item.Role.Name == Constants.RegisteredRole &&
(
item.User.Username.Contains(search, StringComparison.OrdinalIgnoreCase) ||
item.User.Email.Contains(search, StringComparison.OrdinalIgnoreCase) ||
item.User.DisplayName.Contains(search, StringComparison.OrdinalIgnoreCase)
)
)
.ToList();
_provider = SettingService.GetSetting(settings, "ExternalLogin:Provider", "<Custom>");
_providerurl = SettingService.GetSetting(settings, "ExternalLogin:ProviderUrl", "");
_providertype = SettingService.GetSetting(settings, "ExternalLogin:ProviderType", "");
_providername = SettingService.GetSetting(settings, "ExternalLogin:ProviderName", "");
_authority = SettingService.GetSetting(settings, "ExternalLogin:Authority", "");
_metadataurl = SettingService.GetSetting(settings, "ExternalLogin:MetadataUrl", "");
_authorizationurl = SettingService.GetSetting(settings, "ExternalLogin:AuthorizationUrl", "");
_tokenurl = SettingService.GetSetting(settings, "ExternalLogin:TokenUrl", "");
_userinfourl = SettingService.GetSetting(settings, "ExternalLogin:UserInfoUrl", "");
_clientid = SettingService.GetSetting(settings, "ExternalLogin:ClientId", "");
_clientsecret = SettingService.GetSetting(settings, "ExternalLogin:ClientSecret", "");
_toggleclientsecret = SharedLocalizer["ShowPassword"];
_authresponsetype = SettingService.GetSetting(settings, "ExternalLogin:AuthResponseType", "code");
_scopes = SettingService.GetSetting(settings, "ExternalLogin:Scopes", "");
_parameters = SettingService.GetSetting(settings, "ExternalLogin:Parameters", "");
_pkce = SettingService.GetSetting(settings, "ExternalLogin:PKCE", "false");
_redirecturl = PageState.Uri.Scheme + "://" + PageState.Alias.Name + "/signin-" + _providertype;
_reviewclaims = SettingService.GetSetting(settings, "ExternalLogin:ReviewClaims", "false");
_externalloginurl = Utilities.TenantUrl(PageState.Alias, "/pages/external");
_identifierclaimtype = SettingService.GetSetting(settings, "ExternalLogin:IdentifierClaimType", "sub");
_nameclaimtype = SettingService.GetSetting(settings, "ExternalLogin:NameClaimType", "name");
_emailclaimtype = SettingService.GetSetting(settings, "ExternalLogin:EmailClaimType", "email");
_roleclaimtype = SettingService.GetSetting(settings, "ExternalLogin:RoleClaimType", "");
_roleclaimmappings = SettingService.GetSetting(settings, "ExternalLogin:RoleClaimMappings", "");
_synchronizeroles = SettingService.GetSetting(settings, "ExternalLogin:SynchronizeRoles", "false");
_profileclaimtypes = SettingService.GetSetting(settings, "ExternalLogin:ProfileClaimTypes", "");
_savetokens = SettingService.GetSetting(settings, "ExternalLogin:SaveTokens", "false");
_domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", "");
_createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true");
_verifyusers = SettingService.GetSetting(settings, "ExternalLogin:VerifyUsers", "true");
_allowhostrole = SettingService.GetSetting(settings, "ExternalLogin:AllowHostRole", "false");
_allowsitelogin = SettingService.GetSetting(settings, "LoginOptions:AllowSiteLogin", "true");
}
private async Task OnSearch()
private async Task LoadUsersAsync(bool load)
{
userroles = Search(_search);
await UpdateSettingsAsync();
if (load)
{
users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Registered);
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
var hosts = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Host);
users.AddRange(hosts);
users = users.OrderBy(u => u.User.DisplayName).ToList();
}
}
}
private async Task DeleteUser(UserRole UserRole)
{
try
{
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
var user = await UserService.GetUserAsync(UserRole.UserId, PageState.Site.SiteId);
if (user != null)
{
await UserService.DeleteUserAsync(user.UserId);
await logger.LogInformation("User Deleted {User}", UserRole.User);
StateHasChanged();
user.IsDeleted = true;
await UserService.UpdateUserAsync(user);
await logger.LogInformation("User Soft Deleted {User}", user);
}
}
else
{
var userrole = await UserRoleService.GetUserRoleAsync(UserRole.UserRoleId);
userrole.ExpiryDate = DateTime.UtcNow;
await UserRoleService.UpdateUserRoleAsync(userrole);
await logger.LogInformation("User {Username} Expired From Role {Role}", userrole.User.Username, userrole.Role.Name);
}
AddModuleMessage(Localizer["Success.DeleteUser"], MessageType.Success);
await LoadUsersAsync(true);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting User {User} {Error}", UserRole.User, ex.Message);
AddModuleMessage(ex.Message, MessageType.Error);
AddModuleMessage(Localizer["Error.DeleteUser"], MessageType.Error);
}
}
private string settingSearch = "AU-search";
private async Task LoadSettingsAsync()
private async Task SaveSiteSettings()
{
Dictionary<string, string> settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId);
_search = SettingService.GetSetting(settings, settingSearch, "");
}
private async Task UpdateSettingsAsync()
try
{
Dictionary<string, string> settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId);
SettingService.SetSetting(settings, settingSearch, _search);
await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId);
var site = PageState.Site;
site.AllowRegistration = bool.Parse(_allowregistration);
await SiteService.UpdateSiteAsync(site);
var settings = await SettingService.GetSiteSettingsAsync(site.SiteId);
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
settings = SettingService.SetSetting(settings, "LoginOptions:RegisterUrl", _registerurl, false);
settings = SettingService.SetSetting(settings, "LoginOptions:ProfileUrl", _profileurl, false);
settings = SettingService.SetSetting(settings, "LoginOptions:TwoFactor", _twofactor, false);
settings = SettingService.SetSetting(settings, "LoginOptions:CookieName", _cookiename, true);
settings = SettingService.SetSetting(settings, "LoginOptions:CookieExpiration", _cookieexpiration, true);
settings = SettingService.SetSetting(settings, "LoginOptions:AlwaysRemember", _alwaysremember, false);
settings = SettingService.SetSetting(settings, "LoginOptions:LogoutEverywhere", _logouteverywhere, false);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredLength", _minimumlength, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", _uniquecharacters, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireDigit", _requiredigit, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireUppercase", _requireupper, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireLowercase", _requirelower, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", _requirepunctuation, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", _maximumfailures, true);
settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", TimeSpan.FromMinutes(Convert.ToInt64(_lockoutduration)).ToString(), true);
settings = SettingService.SetSetting(settings, "ExternalLogin:Provider", _provider, false);
settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderType", _providertype, false);
settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderName", _providername, false);
settings = SettingService.SetSetting(settings, "ExternalLogin:Authority", _authority, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:MetadataUrl", _metadataurl, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:AuthorizationUrl", _authorizationurl, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:TokenUrl", _tokenurl, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:UserInfoUrl", _userinfourl, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:ClientId", _clientid, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:ClientSecret", _clientsecret, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:AuthResponseType", _authresponsetype, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:Scopes", _scopes, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:Parameters", _parameters, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:PKCE", _pkce, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:ReviewClaims", _reviewclaims, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:IdentifierClaimType", _identifierclaimtype, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:NameClaimType", _nameclaimtype, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:EmailClaimType", _emailclaimtype, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:RoleClaimType", _roleclaimtype, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:RoleClaimMappings", _roleclaimmappings, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:SynchronizeRoles", _synchronizeroles, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:ProfileClaimTypes", _profileclaimtypes, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:SaveTokens", _savetokens, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:VerifyUsers", _verifyusers, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:AllowHostRole", _allowhostrole, true);
settings = SettingService.SetSetting(settings, "LoginOptions:AllowSiteLogin", _allowsitelogin, false);
settings = SettingService.SetSetting(settings, "JwtOptions:Secret", _secret, true);
settings = SettingService.SetSetting(settings, "JwtOptions:Issuer", _issuer, true);
settings = SettingService.SetSetting(settings, "JwtOptions:Audience", _audience, true);
settings = SettingService.SetSetting(settings, "JwtOptions:Lifetime", _lifetime, true);
}
await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId);
await SettingService.ClearSiteSettingsCacheAsync();
if (!string.IsNullOrEmpty(_secret))
{
SiteState.AuthorizationToken = await UserService.GetTokenAsync();
}
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
}
finally
{
await ScrollToPageTop();
}
}
private void ProviderChanged(ChangeEventArgs e)
{
_provider = (string)e.Value;
var provider = Shared.ExternalLoginProviders.Providers.FirstOrDefault(item => item.Name == _provider);
if (provider != null)
{
LoadExternalLoginSettings(provider.Settings);
}
StateHasChanged();
}
private void ProviderTypeChanged(ChangeEventArgs e)
{
_providertype = (string)e.Value;
if (string.IsNullOrEmpty(_providername))
{
if (_providertype == AuthenticationProviderTypes.OpenIDConnect)
{
_scopes = "openid,profile,email";
}
else
{
_scopes = "";
}
}
_redirecturl = PageState.Uri.Scheme + "://" + PageState.Alias.Name + "/signin-" + _providertype;
StateHasChanged();
}
private async Task CreateToken()
{
_token = await UserService.GetPersonalAccessTokenAsync();
}
private void ToggleClientSecret()
{
if (_clientsecrettype == "password")
{
_clientsecrettype = "text";
_toggleclientsecret = SharedLocalizer["HidePassword"];
}
else
{
_clientsecrettype = "password";
_toggleclientsecret = SharedLocalizer["ShowPassword"];
}
}
private void ToggleSecret()
{
if (_secrettype == "password")
{
_secrettype = "text";
_togglesecret = SharedLocalizer["HidePassword"];
}
else
{
_secrettype = "password";
_togglesecret = SharedLocalizer["ShowPassword"];
}
}
private void SortTable(string columnName)
{
if (columnName != activeSortColumn)
{
users = users.OrderBy(x => x.User.GetType().GetProperty(columnName)?.GetValue(x.User)).ToList();
isSortedAscending = true;
activeSortColumn = columnName;
}
else
{
if (isSortedAscending)
{
users = users.OrderByDescending(x => x.User.GetType().GetProperty(columnName)?.GetValue(x.User)).ToList();
}
else
{
users = users.OrderBy(x => x.User.GetType().GetProperty(columnName)?.GetValue(x.User)).ToList();
}
isSortedAscending = !isSortedAscending;
}
}
private string SetSortIcon(string columnName)
{
if (activeSortColumn != columnName)
{
return "app-fas pe-3 ";
}
if (isSortedAscending)
{
return "app-fas oi oi-sort-ascending";
}
else
{
return "app-fas oi oi-sort-descending";
}
}
}

View File

@@ -0,0 +1,21 @@
using Oqtane.Documentation;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Modules.Admin.Users
{
[PrivateApi("Mark this as private, since it's not very useful in the public docs")]
public class ModuleInfo : IModule
{
public ModuleDefinition ModuleDefinition => new ModuleDefinition
{
Name = "Users",
Description = "Manage Users",
Categories = "Admin",
Version = Constants.Version,
PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit}," +
$"{EntityNames.User}:{PermissionNames.Write}:{RoleNames.Admin}," +
$"{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}"
};
}
}

View File

@@ -1,72 +1,69 @@
@namespace Oqtane.Modules.Admin.Users
@namespace Oqtane.Modules.Admin.Users
@inherits ModuleBase
@inject IRoleService RoleService
@inject IUserService UserService
@inject IUserRoleService UserRoleService
@inject IStringLocalizer<Roles> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (userroles == null)
{
<p><em>Loading...</em></p>
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<table class="table table-borderless">
<tr>
<td>
<Label For="user" HelpText="The user you are assigning roles to">User: </Label>
</td>
<td>
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="user" HelpText="The user you are assigning roles to" ResourceKey="User">User: </Label>
<div class="col-sm-9">
<input id="user" class="form-control" @bind="@name" disabled />
</td>
</tr>
<tr>
<td>
<Label For="role" HelpText="Select a role">Role: </Label>
</td>
<td>
<select id="role" class="form-control" @bind="@roleid">
<option value="-1">&lt;Select Role&gt;</option>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="role" HelpText="Select a role" ResourceKey="Role">Role: </Label>
<div class="col-sm-9">
<select id="role" class="form-select" @bind="@roleid">
<option value="-1">&lt;@Localizer["Role.Select"]&gt;</option>
@foreach (Role role in roles)
{
<option value="@(role.RoleId)">@role.Name</option>
}
</select>
</td>
</tr>
<tr>
<td>
<Label For="effectiveDate" HelpText="The date that this role assignment is active">Effective Date: </Label>
</td>
<td>
<input id="effectiveDate" class="form-control" @bind="@effectivedate" />
</td>
</tr>
<tr>
<td>
<Label For="expiryDate" HelpText="The date that this role assignment expires">Expiry Date: </Label>
</td>
<td>
<input id="expiryDate" class="form-control" @bind="@expirydate" />
</td>
</tr>
</table>
<button type="button" class="btn btn-success" @onclick="SaveUserRole">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="effectiveDate" HelpText="The date that this role assignment is active" ResourceKey="EffectiveDate">Effective Date: </Label>
<div class="col-sm-9">
<input type="date" id="effectiveDate" class="form-control" @bind="@_effectivedate" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="expiryDate" HelpText="The date that this role assignment expires" ResourceKey="ExpiryDate">Expiry Date: </Label>
<div class="col-sm-9">
<input type="date" id="expiryDate" class="form-control" @bind="@_expirydate" />
</div>
</div>
</div>
<br />
<br />
<button type="button" class="btn btn-success" @onclick="SaveUserRole">@SharedLocalizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
<hr class="app-rule" />
<p align="center">
<Pager Items="@userroles">
<Header>
<th>Roles</th>
<th>@Localizer["Roles"]</th>
<th>@Localizer["Effective"]</th>
<th>@Localizer["Expiry"]</th>
<th>&nbsp;</th>
</Header>
<Row>
<td>@context.Role.Name</td>
<td>@Utilities.UtcAsLocalDate(context.EffectiveDate)</td>
<td>@Utilities.UtcAsLocalDate(context.ExpiryDate)</td>
<td>
@if (context.Role.Name != Constants.RegisteredRole)
{
<button type="button" class="btn btn-danger" @onclick=@(async () => await DeleteUserRole(context.UserRoleId))>Delete</button>
}
<ActionDialog Header="Remove Role" Message="@string.Format(Localizer["Confirm.User.RemoveRole"], context.Role.Name)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteUserRole(context.UserRoleId))" Disabled="@(context.Role.Name == RoleNames.Host && userid == PageState.User.UserId)" ResourceKey="DeleteUserRole" />
</td>
</Row>
</Pager>
@@ -78,11 +75,11 @@ else
private string name = string.Empty;
private List<Role> roles;
private int roleid = -1;
private string effectivedate = string.Empty;
private string expirydate = string.Empty;
private DateTime? _effectivedate = null;
private DateTime? _expirydate = null;
private List<UserRole> userroles;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
protected override async Task OnInitializedAsync()
{
@@ -91,13 +88,23 @@ else
userid = Int32.Parse(PageState.QueryString["id"]);
User user = await UserService.GetUserAsync(userid, PageState.Site.SiteId);
name = user.DisplayName;
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
roles = await RoleService.GetRolesAsync(PageState.Site.SiteId, true);
roles.RemoveAll(item => item.Name == RoleNames.Everyone || item.Name == RoleNames.Unauthenticated);
}
else
{
roles = await RoleService.GetRolesAsync(PageState.Site.SiteId);
}
await GetUserRoles();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Roles {Error}", ex.Message);
AddModuleMessage("Error Loading Roles", MessageType.Error);
AddModuleMessage(Localizer["Error.LoadRole"], MessageType.Error);
}
}
@@ -105,13 +112,13 @@ else
{
try
{
userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
userroles = userroles.Where(item => item.UserId == userid).ToList();
userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, userid);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading User Roles {UserId} {Error}", userid, ex.Message);
AddModuleMessage("Error Loading User Roles", MessageType.Error);
AddModuleMessage(Localizer["Error.User.LoadRole"], MessageType.Error);
}
}
@@ -121,26 +128,16 @@ else
{
if (roleid != -1)
{
if (!Utilities.ValidateEffectiveExpiryDates(_effectivedate, _expirydate))
{
AddModuleMessage(SharedLocalizer["Message.EffectiveExpiryDateError"], MessageType.Warning);
return;
}
var userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault();
if (userrole != null)
{
if (string.IsNullOrEmpty(effectivedate))
{
userrole.EffectiveDate = null;
}
else
{
userrole.EffectiveDate = DateTime.Parse(effectivedate);
}
if (string.IsNullOrEmpty(expirydate))
{
userrole.ExpiryDate = null;
}
else
{
userrole.ExpiryDate = DateTime.Parse(expirydate);
}
userrole.EffectiveDate = _effectivedate;
userrole.ExpiryDate = _expirydate;
await UserRoleService.UpdateUserRoleAsync(userrole);
}
else
@@ -148,57 +145,52 @@ else
userrole = new UserRole();
userrole.UserId = userid;
userrole.RoleId = roleid;
if (string.IsNullOrEmpty(effectivedate))
{
userrole.EffectiveDate = null;
}
else
{
userrole.EffectiveDate = DateTime.Parse(effectivedate);
}
if (string.IsNullOrEmpty(expirydate))
{
userrole.ExpiryDate = null;
}
else
{
userrole.ExpiryDate = DateTime.Parse(expirydate);
}
userrole.EffectiveDate = Utilities.UtcAsLocalDate(_effectivedate);
userrole.ExpiryDate = Utilities.UtcAsLocalDate(_expirydate);
await UserRoleService.AddUserRoleAsync(userrole);
}
await GetUserRoles();
await logger.LogInformation("User Assigned To Role {UserRole}", userrole);
AddModuleMessage("User Assigned To Role", MessageType.Success);
AddModuleMessage(Localizer["Success.User.AssignRole"], MessageType.Success);
await GetUserRoles();
StateHasChanged();
}
else
{
AddModuleMessage("You Must Select A Role", MessageType.Warning);
AddModuleMessage(Localizer["Message.Required.Role"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving User Roles {UserId} {Error}", userid, ex.Message);
AddModuleMessage("Error Saving User Roles", MessageType.Error);
AddModuleMessage(Localizer["Error.User.SaveRole"], MessageType.Error);
}
}
private async Task DeleteUserRole(int UserRoleId)
{
try
{
var userrole = await UserRoleService.GetUserRoleAsync(UserRoleId);
if (userrole.Role.Name == RoleNames.Registered)
{
userrole.ExpiryDate = DateTime.UtcNow;
await UserRoleService.UpdateUserRoleAsync(userrole);
await logger.LogInformation("User {Username} Expired From Role {Role}", userrole.User.Username, userrole.Role.Name);
}
else
{
await UserRoleService.DeleteUserRoleAsync(UserRoleId);
await logger.LogInformation("User {Username} Removed From Role {Role}", userrole.User.Username, userrole.Role.Name);
}
AddModuleMessage(Localizer["Success.User.Remove"], MessageType.Success);
await GetUserRoles();
await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId);
AddModuleMessage("User Removed From Role", MessageType.Success);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message);
AddModuleMessage("Error Removing User From Role", MessageType.Error);
AddModuleMessage(Localizer["Error.User.RemoveRole"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,69 @@
@namespace Oqtane.Modules.Admin.Users
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IStringLocalizer<Users> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="importfile" HelpText="Upload or select a tab delimited text file containing user information. The file must be in the Template format specified (Roles can be specified as a comma delimited list)." ResourceKey="ImportFile">Import File:</Label>
<div class="col-sm-9">
<FileManager Id="importfile" @ref="_filemanager" Filter="txt" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="notify" HelpText="Indicate if new users should receive an email notification" ResourceKey="Notify">Notify? </Label>
<div class="col-sm-9">
<select id="notify" class="form-select" @bind="@_notify" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="ImportUsers">@Localizer["Import"]</button>&nbsp;
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>&nbsp;
<a class="btn btn-info" href="/users.txt" target="_new">@Localizer["Template"]</a>
@code {
private FileManager _filemanager;
public override string Title => "Import Users";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
private string _notify = "True";
private async Task ImportUsers()
{
try
{
var fileid = _filemanager.GetFileId();
if (fileid != -1)
{
ShowProgressIndicator();
var results = await UserService.ImportUsersAsync(PageState.Site.SiteId, fileid, bool.Parse(_notify));
if (bool.Parse(results["Success"]))
{
AddModuleMessage(string.Format(Localizer["Message.Import.Success"], results["Users"]), MessageType.Success);
}
else
{
AddModuleMessage(Localizer["Message.Import.Failure"], MessageType.Error);
}
HideProgressIndicator();
}
else
{
AddModuleMessage(Localizer["Message.Import.Validation"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Importing Users {Error}", ex.Message);
AddModuleMessage(Localizer["Error.Import"], MessageType.Error);
}
}
}

View File

@@ -0,0 +1,133 @@
@namespace Oqtane.Modules.Admin.Visitors
@using System.Globalization
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IVisitorService VisitorService
@inject IUserService UserService
@inject IStringLocalizer<Detail> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_initialized)
{
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="ip" HelpText="The last recorded IP address for this visitor" ResourceKey="IP">IP Address: </Label>
<div class="col-sm-9">
<input id="ip" class="form-control" @bind="@_ip" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="language" HelpText="The last recorded language for this visitor" ResourceKey="Language">Language: </Label>
<div class="col-sm-9">
<input id="language" class="form-control" @bind="@_language" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="useragent" HelpText="The last recorded user agent for this visitor" ResourceKey="UserAgent">User Agent: </Label>
<div class="col-sm-9">
<input id="useragent" class="form-control" @bind="@_useragent" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="url" HelpText="The last recorded url for this visitor" ResourceKey="Url">Url: </Label>
<div class="col-sm-9">
<input id="url" class="form-control" @bind="@_url" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="referrer" HelpText="The last recorded referrer for this visitor" ResourceKey="Referrer">Referrer: </Label>
<div class="col-sm-9">
<input id="referrer" class="form-control" @bind="@_referrer" readonly />
</div>
</div>
@if (_user != string.Empty)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="user" HelpText="The last recorded user associated with this visitor" ResourceKey="User">User: </Label>
<div class="col-sm-9">
<input id="user" class="form-control" @bind="@_user" readonly />
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="visits" HelpText="The total number of visits by this visitor all time" ResourceKey="Visits">Visits: </Label>
<div class="col-sm-9">
<input id="visits" class="form-control" @bind="@_visits" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="visited" HelpText="The last recorded date/time when the visitor visited the site" ResourceKey="Visited">Visited: </Label>
<div class="col-sm-9">
<input id="visited" class="form-control" @bind="@_visited" readonly />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="created" HelpText="The first recorded date/time when this visitor visited the site" ResourceKey="Created">Created: </Label>
<div class="col-sm-9">
<input id="created" class="form-control" @bind="@_created" readonly />
</div>
</div>
</div>
}
<NavLink class="btn btn-secondary" href="@CloseUrl()">@SharedLocalizer["Cancel"]</NavLink>
@code {
private bool _initialized = false;
private int _visitorId;
private string _ip = string.Empty;
private string _language = string.Empty;
private string _useragent = string.Empty;
private string _url = string.Empty;
private string _referrer = string.Empty;
private string _user = string.Empty;
private string _visits = string.Empty;
private string _visited = string.Empty;
private string _created = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync()
{
try
{
_visitorId = Int32.Parse(PageState.QueryString["id"]);
var visitor = await VisitorService.GetVisitorAsync(_visitorId);
if (visitor != null)
{
_ip = visitor.IPAddress;
_language = visitor.Language;
_useragent = visitor.UserAgent;
_url = visitor.Url;
_referrer = visitor.Referrer;
_visits = visitor.Visits.ToString();
_visited = UtcToLocal(visitor.VisitedOn).Value.ToString(CultureInfo.CurrentCulture);
_created = UtcToLocal(visitor.CreatedOn).Value.ToString(CultureInfo.CurrentCulture);
if (visitor.UserId != null)
{
var user = await UserService.GetUserAsync(visitor.UserId.Value, PageState.Site.SiteId);
if (user != null)
{
_user = user.DisplayName;
}
}
_initialized = true;
}
else
{
AddModuleMessage(Localizer["Error.LoadVisitor"], MessageType.Error);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Visitor {VisitorId} {Error}", _visitorId, ex.Message);
AddModuleMessage(Localizer["Error.LoadVisitor"], MessageType.Error);
}
}
private string CloseUrl()
{
return (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl();
}
}

View File

@@ -0,0 +1,224 @@
@namespace Oqtane.Modules.Admin.Visitors
@inherits ModuleBase
@inject IVisitorService VisitorService
@inject ISiteService SiteService
@inject ISettingService SettingService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_visitors == null)
{
<p><em>@SharedLocalizer["Loading"]</em></p>
}
else
{
<TabStrip>
<TabPanel Name="Visitors" Heading="Visitors" ResourceKey="Visitors">
<div class="container">
<div class="row mb-1 align-items-center">
<div class="col-sm-6">
<select id="type" class="form-select custom-select" value="@_type" @onchange="(e => TypeChanged(e))">
<option value="visitors">@Localizer["AllVisitors"]</option>
<option value="users">@Localizer["UsersOnly"]</option>
</select>
</div>
<div class="col-sm-6">
<select id="days" class="form-select custom-select" value="@_days" @onchange="(e => DaysChanged(e))">
<option value="1">@Localizer["PastDay"]</option>
<option value="7">@Localizer["PastWeek"]</option>
<option value="30">@Localizer["PastMonth"]</option>
</select>
</div>
</div>
</div>
<br/>
<Pager Items="@_visitors" CurrentPage="@_page.ToString()" OnPageChange="OnPageChange">
<Header>
<th style="width: 1px;">&nbsp;</th>
<th>@Localizer["IP"]</th>
<th>@Localizer["User"]</th>
<th>@Localizer["Language"]</th>
<th>@Localizer["Visits"]</th>
<th>@Localizer["Visited"]</th>
<th>@Localizer["Created"]</th>
</Header>
<Row>
<td><ActionLink Action="Detail" Text="Detail" Parameters="@($"id={context.VisitorId}")" ReturnUrl="@(NavigateUrl(PageState.Page.Path, $"type={_type}&days={_days}&page={_page}"))" ResourceKey="Details" /></td>
<td>@context.IPAddress</td>
<td>
@if (context.UserId != null)
{
@context.User.DisplayName
}
</td>
<td>@context.Language</td>
<td>@context.Visits</td>
<td>@UtcToLocal(context.VisitedOn)</td>
<td>@UtcToLocal(context.CreatedOn)</td>
</Row>
</Pager>
</TabPanel>
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="tracking" HelpText="Specify if visitor tracking is enabled" ResourceKey="Tracking">Tracking Enabled? </Label>
<div class="col-sm-9">
<select id="tracking" class="form-select" @bind="@_tracking" >
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="duration" HelpText="The duration of a browsing session considered to be a distinct visit (in minutes)" ResourceKey="Duration">Session Duration: </Label>
<div class="col-sm-9">
<input id="duration" class="form-control" type="number" min="0" step="1" @bind="@_duration" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="filter" HelpText="Comma delimited list of terms which may exist in IP addresses, user agents, or languages identifying visitors which should not be tracked" ResourceKey="Filter">Filter: </Label>
<div class="col-sm-9">
<textarea id="filter" class="form-control" @bind="@_filter" rows="3"></textarea>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="retention" HelpText="Number of days of visitor activity to retain" ResourceKey="Retention">Retention: </Label>
<div class="col-sm-9">
<input id="retention" class="form-control" type="number" min="0" step="1" @bind="@_retention" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="correlation" HelpText="Indicate if new visitors to this site should be correlated based on their IP Address" ResourceKey="Correlation">Correlate Visitors? </Label>
<div class="col-sm-9">
<select id="correlation" class="form-select" @bind="@_correlation">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
</TabPanel>
<TabPanel Name="Robots" Heading="Robots.txt" ResourceKey="Robots">
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="robots" HelpText="Specify your robots.txt instructions to provide bots with guidance on which parts of your site should be indexed" ResourceKey="Robots">Instructions: </Label>
<div class="col-sm-9">
<textarea id="robots" class="form-control" @bind="@_robots" rows="3"></textarea>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
</TabPanel>
</TabStrip>
}
@code {
private string _type = "visitors";
private int _days = 1;
private int _page = 1;
private List<Visitor> _visitors;
private string _tracking;
private int _duration = 5;
private string _filter = "";
private int _retention = 30;
private string _correlation = "true";
private string _robots = "";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnParametersSetAsync()
{
if (PageState.QueryString.ContainsKey("type"))
{
_type = PageState.QueryString["type"];
}
if (PageState.QueryString.ContainsKey("days") && int.TryParse(PageState.QueryString["days"], out int days))
{
_days = days;
}
if (PageState.QueryString.ContainsKey("page") && int.TryParse(PageState.QueryString["page"], out int page))
{
_page = page;
}
await GetVisitors();
_tracking = PageState.Site.VisitorTracking.ToString();
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_duration = int.Parse(SettingService.GetSetting(settings, "VisitorDuration", "5"));
_filter = SettingService.GetSetting(settings, "VisitorFilter", Constants.DefaultVisitorFilter);
_retention = int.Parse(SettingService.GetSetting(settings, "VisitorRetention", "30"));
_correlation = SettingService.GetSetting(settings, "VisitorCorrelation", "true");
_robots = SettingService.GetSetting(settings, "Robots", "");
}
private async void TypeChanged(ChangeEventArgs e)
{
try
{
_type = e.Value.ToString();
await GetVisitors();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error On TypeChanged");
}
}
private async void DaysChanged(ChangeEventArgs e)
{
try
{
_days = int.Parse(e.Value.ToString());
await GetVisitors();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error On DateChanged");
}
}
private async Task GetVisitors()
{
_visitors = await VisitorService.GetVisitorsAsync(PageState.Site.SiteId, DateTime.UtcNow.AddDays(-_days));
if (_type == "users")
{
_visitors = _visitors.Where(item => item.UserId != null).ToList();
}
}
private async Task SaveSiteSettings()
{
try
{
var site = PageState.Site;
site.VisitorTracking = bool.Parse(_tracking);
await SiteService.UpdateSiteAsync(site);
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
settings = SettingService.SetSetting(settings, "VisitorDuration", _duration.ToString(), true);
settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true);
settings = SettingService.SetSetting(settings, "VisitorRetention", _retention.ToString(), true);
settings = SettingService.SetSetting(settings, "VisitorCorrelation", _correlation, true);
settings = SettingService.SetSetting(settings, "Robots", _robots, true);
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
}
}
private void OnPageChange(int page)
{
_page = page;
}
}

View File

@@ -1,15 +1,20 @@
@namespace Oqtane.Modules.Controls
@inherits ModuleControlBase
@namespace Oqtane.Modules.Controls
@using System.Text.Json
@inherits LocalizableComponent
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject NavigationManager NavigationManager
@if (_visible)
@if (PageState.RenderMode == RenderModes.Interactive || ModuleState.RenderMode == RenderModes.Interactive)
{
<div class="app-admin-modal">
@if (_visible)
{
<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">@Header</h5>
<button type="button" class="close" @onclick="DisplayModal" aria-label="Close">&times;</button>
<button type="button" class="btn-close" aria-label="Close" @onclick="DisplayModal"></button>
</div>
<div class="modal-body">
<p>@Message</p>
@@ -17,32 +22,87 @@
<div class="modal-footer">
@if (!string.IsNullOrEmpty(Action))
{
<button type="button" class="@Class" @onclick="Confirm">@((MarkupString)_iconSpan) @Action</button>
<button type="button" class="@ConfirmClass" @onclick="Confirm">@((MarkupString)_iconSpan) @Text</button>
}
<button type="button" class="btn btn-secondary" @onclick="DisplayModal">Cancel</button>
<button type="button" class="@CancelClass" @onclick="DisplayModal">@SharedLocalizer["Cancel"]</button>
</div>
</div>
</div>
</div>
</div>
}
@if (_authorized)
{
}
@if (_authorized)
{
if (Disabled)
{
<button class="@Class" disabled>@((MarkupString)_iconSpan) @Text</button>
<button type="button" class="@Class" disabled>@((MarkupString)_openIconSpan) @_openText</button>
}
else
{
<button class="@Class" @onclick="DisplayModal">@((MarkupString)_iconSpan) @Text</button>
<button type="button" class="@Class" @onclick="DisplayModal">@((MarkupString)_openIconSpan) @_openText</button>
}
}
}
else
{
@if (_visible)
{
<div class="app-actiondialog">
<div class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<form class="app-form-inline" method="post" @formname="@($"ActionDialogCloseForm:{ModuleState.PageModuleId}:{Id}")" @onsubmit="DisplayModal" data-enhance>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<div class="modal-header">
<h5 class="modal-title">@Header</h5>
<button type="submit" class="btn-close" aria-label="Close"></button>
</div>
</form>
<div class="modal-body">
<p>@Message</p>
</div>
<div class="modal-footer">
@if (!string.IsNullOrEmpty(Action))
{
<form method="post" @formname="@($"ActionDialogConfirmForm:{ModuleState.PageModuleId}:{Id}")" @onsubmit="Confirm" data-enhance>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<button type="submit" class="@ConfirmClass">@((MarkupString)_iconSpan) @Text</button>
</form>
}
<form method="post" @formname="@($"ActionDialogCancelForm:{ModuleState.PageModuleId}:{Id}")" @onsubmit="DisplayModal" data-enhance>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<button type="submit" class="@CancelClass">@SharedLocalizer["Cancel"]</button>
</form>
</div>
</div>
</div>
</div>
</div>
}
@if (_authorized)
{
if (Disabled)
{
<button type="button" class="@Class" disabled>@((MarkupString)_openIconSpan) @_openText</button>
}
else
{
<form method="post" class="app-form-inline" @formname="@($"ActionDialogActionForm:{ModuleState.PageModuleId}:{Id}")" @onsubmit="DisplayModal" data-enhance>
<input type="hidden" name="@Constants.RequestVerificationToken" value="@SiteState.AntiForgeryToken" />
<button type="submit" class="@Class">@((MarkupString)_openIconSpan) @_openText</button>
</form>
}
}
}
@code {
private bool _visible = false;
private List<Permission> _permissions;
private bool _editmode = false;
private bool _authorized = false;
private string _iconSpan = string.Empty;
private string _openIconSpan = string.Empty;
private string _openText = string.Empty;
[Parameter]
public string Header { get; set; } // required
@@ -59,9 +119,21 @@
[Parameter]
public SecurityAccessLevel? Security { get; set; } // optional - can be used to explicitly specify SecurityAccessLevel
[Parameter]
public string Permissions { get; set; } // deprecated - use PermissionList instead
[Parameter]
public List<Permission> PermissionList { get; set; } // optional - can be used to specify permissions
[Parameter]
public string Class { get; set; } // optional
[Parameter]
public string ConfirmClass { get; set; } // optional - for Confirm modal button
[Parameter]
public string CancelClass { get; set; } // optional - for Cancel modal button
[Parameter]
public bool Disabled { get; set; } // optional
@@ -74,28 +146,82 @@
[Parameter]
public string IconName { get; set; } // optional - specifies an icon for the link - default is no icon
[Parameter]
public bool IconOnly { get; set; } // optional - specifies only icon in opening link
[Parameter]
public string Id { get; set; } // optional - specifies a unique id for the compoment - required when there are multiple component instances on a page in static rendering
protected override void OnInitialized()
{
if (!string.IsNullOrEmpty(Permissions))
{
PermissionList = JsonSerializer.Deserialize<List<Permission>>(Permissions);
}
}
protected override void OnParametersSet()
{
base.OnParametersSet();
if (string.IsNullOrEmpty(Text))
{
Text = Action;
}
if (string.IsNullOrEmpty(Class))
{
Class = "btn btn-success";
}
if (string.IsNullOrEmpty(ConfirmClass))
{
ConfirmClass = Class;
}
if (string.IsNullOrEmpty(CancelClass))
{
CancelClass = "btn btn-secondary";
}
if (!string.IsNullOrEmpty(EditMode))
{
_editmode = bool.Parse(EditMode);
}
Text = Localize(nameof(Text), Text);
Header = Localize(nameof(Header), Header);
Message = Localize(nameof(Message), Message);
_openText = Text;
if (!string.IsNullOrEmpty(IconName))
{
_iconSpan = $"<span class=\"oi oi-{IconName}\"></span>&nbsp;";
if (IconOnly)
{
_openText = string.Empty;
}
// Check if IconName starts with "oi oi-"
bool startsWithOiOi = IconName.StartsWith("oi oi-");
if (!startsWithOiOi && !IconName.Contains(" "))
{
IconName = "oi oi-" + IconName;
}
_openIconSpan = $"<span class=\"{IconName}\"></span>{(IconOnly ? "" : "&nbsp")}";
_iconSpan = $"<span class=\"{IconName}\"></span>&nbsp";
}
_permissions = (PermissionList == null) ? ModuleState.PermissionList : PermissionList;
_authorized = IsAuthorized();
if (string.IsNullOrEmpty(Id)) Id = "1";
if (PageState.QueryString.ContainsKey("dialog"))
{
_visible = (PageState.QueryString["dialog"] == Id);
}
}
private bool IsAuthorized()
@@ -128,16 +254,16 @@
authorized = true;
break;
case SecurityAccessLevel.View:
authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, ModuleState.Permissions);
authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, _permissions);
break;
case SecurityAccessLevel.Edit:
authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, ModuleState.Permissions);
authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, _permissions);
break;
case SecurityAccessLevel.Admin:
authorized = UserSecurity.IsAuthorized(PageState.User, Constants.AdminRole);
authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin);
break;
case SecurityAccessLevel.Host:
authorized = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole);
authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host);
break;
}
}
@@ -147,12 +273,22 @@
private void DisplayModal()
{
_visible = !_visible;
if (PageState.RenderMode == RenderModes.Interactive || ModuleState.RenderMode == RenderModes.Interactive)
{
StateHasChanged();
}
else
{
var parameters = new Dictionary<string, string>(PageState.QueryString);
if (parameters.ContainsKey("dialog")) parameters.Remove("dialog");
if (_visible) parameters.Add("dialog", Id);
NavigationManager.NavigateTo(PageState.Route.AbsolutePath + Utilities.CreateQueryString(parameters));
}
}
private void Confirm()
{
DisplayModal();
OnClick();
DisplayModal();
}
}

View File

@@ -1,46 +1,67 @@
@namespace Oqtane.Modules.Controls
@inherits ModuleControlBase
@namespace Oqtane.Modules.Controls
@using System.Net
@using System.Text.Json
@inherits LocalizableComponent
@inject IUserService UserService
@if (_authorized)
{
if (Disabled)
{
<button class="@_classname" style="@_style" disabled>@((MarkupString)_iconSpan) @_text</button>
<NavLink class="@($"{_classname} disabled")" href="@_url" style="@_style">@((MarkupString)_iconSpan) @_text</NavLink>
}
else
{
if (OnClick == null)
{
<NavLink class="@_classname" href="@_url" style="@_style">@((MarkupString)_iconSpan) @_text</NavLink>
}
else
{
<button type="button" class="@_classname" style="@_style" onclick="@OnClick">@((MarkupString)_iconSpan) @_text</button>
}
}
}
@code {
private string _text = string.Empty;
private string _url = string.Empty;
private int _moduleId = -1;
private string _path = string.Empty;
private string _parameters = string.Empty;
private string _classname = "btn btn-primary";
private string _style = string.Empty;
private string _url = string.Empty;
private List<Permission> _permissions;
private bool _editmode = false;
private bool _authorized = false;
private string _classname = "btn btn-primary";
private string _style = string.Empty;
private string _iconSpan = string.Empty;
[Parameter]
public string Action { get; set; } // required
[Parameter]
public SecurityAccessLevel? Security { get; set; } // optional - can be used to explicitly specify SecurityAccessLevel
[Parameter]
public string Text { get; set; } // optional - defaults to Action if not specified
[Parameter]
public string Parameters { get; set; } // optional - querystring parameter should be in the form of "id=x&name=y"
public int ModuleId { get; set; } = -1; // optional - allows the link to target a specific moduleid
[Parameter]
public string Class { get; set; } // optional - defaults to primary if not specified
public string Path { get; set; } = null; // optional - allows the link to target a specific page
[Parameter]
public string Style { get; set; } // optional
public string Parameters { get; set; } // optional - querystring parameters should be in the form of "id=x&name=y"
[Parameter]
public Action OnClick { get; set; } = null; // optional - executes a method in the calling component
[Parameter]
public SecurityAccessLevel? Security { get; set; } // optional - can be used to explicitly specify SecurityAccessLevel
[Parameter]
public string Permissions { get; set; } // deprecated - use PermissionList instead
[Parameter]
public List<Permission> PermissionList { get; set; } // optional - can be used to specify permissions
[Parameter]
public bool Disabled { get; set; } // optional
@@ -48,18 +69,41 @@
[Parameter]
public string EditMode { get; set; } // optional - specifies if an authorized user must be in edit mode to see the action - default is false.
[Parameter]
public string Class { get; set; } // optional - defaults to primary if not specified
[Parameter]
public string Style { get; set; } // optional
[Parameter]
public string IconName { get; set; } // optional - specifies an icon for the link - default is no icon
[Parameter]
public bool IconOnly { get; set; } // optional - specifies only icon in link
[Parameter]
public string ReturnUrl { get; set; } // optional - used to set a url to redirect to
protected override void OnInitialized()
{
if (!string.IsNullOrEmpty(Permissions))
{
PermissionList = JsonSerializer.Deserialize<List<Permission>>(Permissions);
}
}
protected override void OnParametersSet()
{
_text = Action;
base.OnParametersSet();
if (!string.IsNullOrEmpty(Text))
{
_text = Text;
_text = Localize(nameof(Text), Text);
}
else
{
_text = Localize(nameof(Action), Action);
}
if (IconOnly && !string.IsNullOrEmpty(IconName))
@@ -67,6 +111,18 @@
_text = string.Empty;
}
_moduleId = ModuleState.ModuleId;
if (ModuleId != -1)
{
_moduleId = ModuleId;
}
_path = PageState.Page.Path;
if (Path != null)
{
_path = Path;
}
if (!string.IsNullOrEmpty(Parameters))
{
_parameters = Parameters;
@@ -89,11 +145,23 @@
if (!string.IsNullOrEmpty(IconName))
{
_iconSpan = $"<span class=\"oi oi-{IconName}\"></span>{(IconOnly ? "" : "&nbsp")}";
// Check if IconName starts with "oi oi-"
bool startsWithOiOi = IconName.StartsWith("oi oi-");
if (!startsWithOiOi && !IconName.Contains(" "))
{
IconName = "oi oi-" + IconName;
}
_iconSpan = $"<span class=\"{IconName}\"></span>{(IconOnly ? "" : "&nbsp")}";
}
_url = EditUrl(Action, _parameters);
_permissions = (PermissionList == null) ? ModuleState.PermissionList : PermissionList;
_url = EditUrl(_path, _moduleId, Action, _parameters);
if (!string.IsNullOrEmpty(ReturnUrl))
{
_url += ((_url.Contains("?")) ? "&" : "?") + $"returnurl={WebUtility.UrlEncode(ReturnUrl)}";
}
_authorized = IsAuthorized();
}
@@ -129,16 +197,16 @@
authorized = true;
break;
case SecurityAccessLevel.View:
authorized = UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, ModuleState.Permissions);
authorized = UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, _permissions);
break;
case SecurityAccessLevel.Edit:
authorized = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, ModuleState.Permissions);
authorized = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, _permissions);
break;
case SecurityAccessLevel.Admin:
authorized = UserSecurity.IsAuthorized(PageState.User, Constants.AdminRole);
authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin);
break;
case SecurityAccessLevel.Host:
authorized = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole);
authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host);
break;
}
}

View File

@@ -1,5 +1,6 @@
@namespace Oqtane.Modules.Controls
@namespace Oqtane.Modules.Controls
@inherits ModuleControlBase
@inject IStringLocalizer<AuditInfo> Localizer
@if (_text != string.Empty)
{
@@ -14,13 +15,13 @@
public string CreatedBy { get; set; }
[Parameter]
public DateTime CreatedOn { get; set; }
public DateTime? CreatedOn { get; set; }
[Parameter]
public string ModifiedBy { get; set; }
[Parameter]
public DateTime ModifiedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
[Parameter]
public string DeletedBy { get; set; }
@@ -34,38 +35,41 @@
[Parameter]
public string Style { get; set; }
[Parameter]
public string DateTimeFormat { get; set; } = "MMM dd yyyy HH:mm:ss";
protected override void OnParametersSet()
{
_text = string.Empty;
if (!String.IsNullOrEmpty(CreatedBy) || CreatedOn != null)
if (!String.IsNullOrEmpty(CreatedBy) || CreatedOn.HasValue)
{
_text += "<p style=\"" + Style + "\">Created ";
_text += $"<p style=\"{Style}\">{Localizer["Created"]} ";
if (!String.IsNullOrEmpty(CreatedBy))
{
_text += " by <b>" + CreatedBy + "</b>";
_text += $" {Localizer["By"]} <b>{CreatedBy}</b>";
}
if (CreatedOn != null)
{
_text += " on <b>" + CreatedOn.ToString("MMM dd yyyy HH:mm:ss") + "</b>";
_text += $" {Localizer["On"]} <b>{UtcToLocal(CreatedOn).Value.ToString(DateTimeFormat)}</ b >";
}
_text += "</p>";
}
if (!String.IsNullOrEmpty(ModifiedBy) || ModifiedOn != null)
if (!String.IsNullOrEmpty(ModifiedBy) || ModifiedOn.HasValue)
{
_text += "<p style=\"" + Style + "\">Last modified ";
_text += $"<p style=\"{Style}\">{Localizer["LastModified"]} ";
if (!String.IsNullOrEmpty(ModifiedBy))
{
_text += " by <b>" + ModifiedBy + "</b>";
_text += $" {Localizer["By"]} <b>{ModifiedBy}</b>";
}
if (ModifiedOn != null)
{
_text += " on <b>" + ModifiedOn.ToString("MMM dd yyyy HH:mm:ss") + "</b>";
_text += $" {Localizer["On"]} <b>{UtcToLocal(ModifiedOn).Value.ToString(DateTimeFormat)}</ b >";
}
_text += "</p>";
@@ -73,16 +77,16 @@
if (!String.IsNullOrEmpty(DeletedBy) || DeletedOn.HasValue)
{
_text += "<p style=\"" + Style + "\">Deleted ";
_text += $"<p style=\"{Style}\">{Localizer["Deleted"]} ";
if (!String.IsNullOrEmpty(DeletedBy))
{
_text += " by <b>" + DeletedBy + "</b>";
_text += $" {Localizer["By"]} <b>{DeletedBy}</b>";
}
if (DeletedOn != null)
{
_text += " on <b>" + DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + "</b>";
_text += $" {Localizer["On"]} <b>{UtcToLocal(DeletedOn).Value.ToString(DateTimeFormat)}</ b >";
}
_text += "</p>";

View File

@@ -0,0 +1,174 @@
@namespace Oqtane.Modules.Controls
@inherits LocalizableComponent
<div class="app-autocomplete">
<input class="form-control" value="@Value" @oninput="OnInput" @onkeyup="OnKeyUp" placeholder="@Placeholder" autocomplete="off" @attributes="InputAttributes" />
@if (_results != null)
{
<select class="form-select" style="position: relative;" value="@Value" size="@Rows" @onkeyup="OnKeyUp" @onchange="(e => OnChange(e))">
@if (_results.Any())
{
@foreach (var result in _results)
{
if (result.Value == Value)
{
<option selected>@result.Value</option>
}
else
{
<option>@result.Value</option>
}
}
}
else
{
<option disabled>No Results</option>
}
</select>
}
</div>
@code {
Dictionary<string, string> _results;
Dictionary<string, object> InputAttributes { get; set; } = new();
[Parameter]
public Func<string, Task<Dictionary<string, string>>> 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 Rows { get; set; } = 3; // optional - number of result rows to display
[Parameter]
public string Placeholder { get; set; } // optional - placeholder input text
[Parameter]
public string Value { get; set; } // value of item selected
[Parameter]
public string Key { get; set; } // key of item selected
[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)
{
_results = await OnSearch?.Invoke(Value);
}
else
{
_results = null;
}
SetKey();
}
private async Task OnKeyUp(KeyboardEventArgs e)
{
var index = -1;
switch (e.Key)
{
case "ArrowDown":
if (_results == null)
{
if (Value?.Length >= Characters)
{
_results = await OnSearch?.Invoke(Value);
}
}
else
{
index = GetIndex();
if (index < _results.Count - 1)
{
Value = _results.ElementAt(index + 1).Value;
Key = _results.ElementAt(index + 1).Key;
}
}
break;
case "ArrowUp":
index = GetIndex();
if (index > 0)
{
Value = _results.ElementAt(index - 1).Value;
Key = _results.ElementAt(index - 1).Key;
}
break;
case "ArrowRight":
case "Tab":
_results = null;
break;
case "Enter": // note within a form the enter key submits the entire form
case "NumpadEnter":
_results = null;
break;
case "Escape":
Value = "";
_results = null;
break;
}
}
private void OnChange(ChangeEventArgs e)
{
Value = (string)e.Value;
SetKey();
_results = null;
}
private int GetIndex()
{
if (_results != null)
{
for (int index = 0; index < _results.Count; index++)
{
if (_results.ElementAt(index).Value == Value)
{
return index;
}
}
}
return -1;
}
private void SetKey()
{
var index = GetIndex();
if (index != -1)
{
Key = _results.ElementAt(index).Key;
}
else
{
Key = "";
}
}
public void Clear()
{
Value = "";
Key = "";
_results = null;
}
}

View File

@@ -1,57 +1,58 @@
@namespace Oqtane.Modules.Controls
@namespace Oqtane.Modules.Controls
@using System.Threading
@inherits ModuleControlBase
@inject IFolderService FolderService
@inject IFileService FileService
@inject IUserService UserService
@inject ISettingService SettingService
@inject IStringLocalizer<FileManager> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@if (_folders != null)
@if (_initialized)
{
<div id="@Id" class="container-fluid px-0">
<div class="row">
<div class="col">
@if (ShowFolders || FolderId <= 0)
<div class="container-fluid px-0">
@if (ShowFolders)
{
<div>
<select class="form-control" @onchange="(e => FolderChanged(e))">
@if (string.IsNullOrEmpty(Folder))
{
<option value="-1">&lt;Select Folder&gt;</option>
}
<div class="row">
<div class="col">
<select class="form-select" value="@FolderId" @onchange="(e => FolderChanged(e))">
<option value="-1">&lt;@Localizer["Folder.Select"]&gt;</option>
@foreach (Folder folder in _folders)
{
if (folder.FolderId == FolderId)
{
<option value="@(folder.FolderId)" selected>@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
else
{
<option value="@(folder.FolderId)">@(new string('-', folder.Level * 2))@(folder.Name)</option>
}
}
</select>
</div>
</div>
}
@if (ShowFiles)
{
<div>
<select class="form-control" @onchange="(e => FileChanged(e))">
<option value="-1">&lt;Select File&gt;</option>
<div class="row mt-1">
<div class="col">
<select class="form-select" value="@FileId" @onchange="(e => FileChanged(e))">
<option value="-1">&lt;@Localizer["File.Select"]&gt;</option>
@foreach (File file in _files)
{
if (file.FileId == FileId)
{
<option value="@(file.FileId)" selected>@(file.Name)</option>
}
else
{
<option value="@(file.FileId)">@(file.Name)</option>
}
}
</select>
</div>
</div>
}
else
{
if (FileId != -1 && _file != null && !UploadMultiple)
{
<input class="form-control" @bind="@_file.Name" disabled />
}
}
@if (ShowUpload && _haseditpermission)
{
<div>
<div class="row mt-2">
<div class="col">
@if (UploadMultiple)
{
<input type="file" id="@_fileinputid" name="file" accept="@_filter" multiple />
@@ -60,17 +61,39 @@
{
<input type="file" id="@_fileinputid" name="file" accept="@_filter" />
}
<span id="@_progressinfoid"></span><progress id="@_progressbarid" style="width: 150px; visibility: hidden;"></progress>
<span class="float-right">
<button type="button" class="btn btn-success" @onclick="UploadFile">Upload</button>
@if (ShowFiles && GetFileId() != -1)
</div>
<div class="col-auto">
<button type="button" class="btn btn-success" @onclick="UploadFiles">@SharedLocalizer["Upload"]</button>
@if (FileId != -1 && !UploadMultiple)
{
<button type="button" class="btn btn-danger" @onclick="DeleteFile">Delete</button>
<button type="button" class="btn btn-danger mx-1" @onclick="DeleteFile">@SharedLocalizer["Delete"]</button>
}
</span>
</div>
</div>
@if (ShowProgress)
{
<div class="row">
<div class="col mt-1"><span id="@_progressinfoid" style="display: none;"></span></div>
<div class="col mt-1"><progress id="@_progressbarid" class="mt-1" style="display: none;"></progress></div>
</div>
}
@((MarkupString) _message)
else
{
if (_uploading)
{
<div class="app-progress-indicator"></div>
}
}
}
@if (!string.IsNullOrEmpty(_message))
{
<div class="row mt-1">
<div class="col">
<ModuleMessage Message="@_message" Type="@_messagetype" />
</div>
</div>
}
</div>
</div>
@if (_image != string.Empty)
{
@@ -83,7 +106,7 @@
}
@code {
private string _id;
private bool _initialized = false;
private List<Folder> _folders;
private List<File> _files = new List<File>();
private string _fileinputid = string.Empty;
@@ -91,18 +114,27 @@
private string _progressbarid = string.Empty;
private string _filter = "*";
private bool _haseditpermission = false;
private string _message = string.Empty;
private string _image = string.Empty;
private File _file = null;
private string _guid;
private string _message = string.Empty;
private MessageType _messagetype;
private bool _uploading = false;
[Parameter]
public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility
[Parameter]
public string Folder { get; set; } // optional - for setting a specific folder by default
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 folderid by default
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 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
@@ -114,30 +146,86 @@
public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true
[Parameter]
public int FileId { get; set; } = -1; // optional - for setting a specific file by default
public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true
[Parameter]
public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif"
public bool ShowProgress { get; set; } = true; // optional - for indicating whether progress info should be displayed during upload - 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 UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false
protected override async Task OnInitializedAsync()
[Parameter]
public int ChunkSize { get; set; } = 1; // optional - size of file chunks to upload in MB
[Parameter]
public EventCallback<int> OnUpload { get; set; } // optional - executes a method in the calling component when a file is uploaded
[Parameter]
public EventCallback<int> OnSelectFolder { get; set; } // optional - executes a method in the calling component when a folder is selected
[Parameter]
public EventCallback<int> OnSelectFile { get; set; } // optional - executes a method in the calling component when a file is selected
[Obsolete("Use OnSelectFile instead.")]
[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
protected override void OnInitialized()
{
if (!string.IsNullOrEmpty(Id))
{
_id = Id;
// create unique id for component
_guid = Guid.NewGuid().ToString("N");
_fileinputid = "FileInput_" + _guid;
_progressinfoid = "ProgressInfo_" + _guid;
_progressbarid = "ProgressBar_" + _guid;
}
if (!string.IsNullOrEmpty(Folder))
protected override async Task OnParametersSetAsync()
{
_folders = new List<Folder> { new Folder { FolderId = -1, Name = Folder } };
FolderId = -1;
// packages folder is a framework folder for uploading installable nuget packages
if (Folder == Constants.PackagesFolder)
{
ShowFiles = false;
ShowFolders = false;
Filter = "nupkg";
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);
}
else
{
if (FolderId != -1)
{
var folder = await FolderService.GetFolderAsync(FolderId);
if (folder != null)
{
_folders = new List<Folder> { folder };
}
}
}
if (FileId != -1)
{
@@ -148,9 +236,12 @@
}
else
{
_message = "FileId " + FileId.ToString() + " Does Not Exist";
_messagetype = MessageType.Error;
FileId = -1; // file does not exist
}
}
await SetImage();
if (!string.IsNullOrEmpty(Filter))
@@ -160,35 +251,37 @@
await GetFiles();
// create unique id for component
_guid = Guid.NewGuid().ToString("N");
_fileinputid = _guid + "FileInput";
_progressinfoid = _guid + "ProgressInfo";
_progressbarid = _guid + "ProgressBar";
_initialized = true;
}
private async Task GetFiles()
{
_haseditpermission = false;
if (!string.IsNullOrEmpty(Folder))
if (Folder == Constants.PackagesFolder)
{
_haseditpermission = UserSecurity.IsAuthorized(PageState.User, Constants.HostRole);
_files = await FileService.GetFilesAsync(Folder);
_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.Permissions);
_haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList);
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Browse, folder.PermissionList))
{
_files = await FileService.GetFilesAsync(FolderId);
}
else
{
_files = new List<File>();
}
}
else
{
_haseditpermission = false;
_files = new List<File>();
}
}
if (_filter != "*")
{
List<File> filtered = new List<File>();
@@ -202,6 +295,7 @@
_files = filtered;
}
}
}
private async Task FolderChanged(ChangeEventArgs e)
{
@@ -211,13 +305,17 @@
FolderId = int.Parse((string)e.Value);
await GetFiles();
FileId = -1;
_file = null;
_image = string.Empty;
await OnSelectFolder.InvokeAsync(FolderId);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Loading Files {Error}", ex.Message);
_message = "<br /><div class=\"alert alert-danger\" role=\"alert\">Error Loading Files</div>";
_message = Localizer["Error.File.Load"];
_messagetype = MessageType.Error;
}
}
@@ -225,60 +323,219 @@
{
_message = string.Empty;
FileId = int.Parse((string)e.Value);
await SetImage();
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
StateHasChanged();
}
private async Task SetImage()
{
_image = string.Empty;
_file = null;
if (FileId != -1)
{
File file = await FileService.GetFileAsync(FileId);
if (file != null && file.ImageHeight != 0 && file.ImageWidth != 0)
_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 ratioX = (double)maxwidth / (double)_file.ImageWidth;
var ratioY = (double)maxheight / (double)_file.ImageHeight;
var ratio = ratioX < ratioY ? ratioX : ratioY;
_image = "<img src=\"" + ContentUrl(FileId) + "\" 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 UploadFile()
private async Task UploadFiles()
{
_message = string.Empty;
var interop = new Interop(JSRuntime);
var upload = await interop.GetFiles(_fileinputid);
if (upload.Length > 0)
var uploads = await interop.GetFiles(_fileinputid);
if (uploads.Length > 0)
{
string restricted = "";
foreach (var upload in uploads)
{
var filename = upload.Split(':')[0];
var extension = (filename.LastIndexOf(".") != -1) ? filename.Substring(filename.LastIndexOf(".") + 1) : "";
if (!PageState.Site.UploadableFiles.Split(',').Contains(extension.ToLower()))
{
restricted += (restricted == "" ? "" : ",") + extension;
}
}
if (restricted == "")
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
try
{
string result;
if (!string.IsNullOrEmpty(Folder))
// upload the files
var posturl = Utilities.TenantUrl(PageState.Alias, "/api/file/upload");
var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString();
var jwt = "";
if (PageState.Runtime == Shared.Runtime.Hybrid)
{
result = await FileService.UploadFilesAsync(Folder, upload, _guid);
jwt = await UserService.GetTokenAsync();
if (string.IsNullOrEmpty(jwt))
{
await logger.LogInformation("File Upload Failed From .NET MAUI Due To Missing Security Token. Token Options Must Be Set In User Settings.");
_message = "Security Token Not Specified";
_messagetype = MessageType.Error;
return;
}
}
var chunksize = ChunkSize;
if (chunksize == 1)
{
// if ChunkSize parameter is not overridden use the site setting
chunksize = int.Parse(SettingService.GetSetting(PageState.Site.Settings, "MaxChunkSize", "1"));
}
if (!ShowProgress)
{
_uploading = true;
StateHasChanged();
}
// upload files
var success = await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken, jwt, chunksize, tokenSource.Token);
// reset progress indicators
if (ShowProgress)
{
await interop.SetElementAttribute(_progressinfoid, "style", "display: none;");
await interop.SetElementAttribute(_progressbarid, "style", "display: none;");
}
else
{
result = await FileService.UploadFilesAsync(FolderId, upload, _guid);
_uploading = false;
StateHasChanged();
}
if (result == string.Empty)
if (success)
{
await logger.LogInformation("File Upload Succeeded {Files}", upload);
_message = "<br /><div class=\"alert alert-success\" role=\"alert\">File Upload Succeeded</div>";
await GetFiles();
await logger.LogInformation("File Upload Succeeded {Files}", uploads);
if (ShowSuccess)
{
_message = Localizer["Success.File.Upload"];
_messagetype = MessageType.Success;
}
}
else
{
await logger.LogError("File Upload Failed {Files}", uploads);
_message = Localizer["Error.File.Upload"];
_messagetype = MessageType.Error;
}
if (upload.Length == 1)
if (Folder == Constants.PackagesFolder)
{
var file = _files.Where(item => item.Name == upload[0]).FirstOrDefault();
await OnUpload.InvokeAsync(-1);
}
else
{
// set FileId to first file in upload collection
var file = await FileService.GetFileAsync(int.Parse(folder), uploads[0].Split(":")[0]);
if (file != null)
{
FileId = file.FileId;
await SetImage();
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
await OnUpload.InvokeAsync(FileId);
}
await GetFiles();
StateHasChanged();
}
}
catch (Exception ex)
{
await logger.LogError(ex, "File Upload Failed {Error}", ex.Message);
_message = Localizer["Error.File.Upload"];
_messagetype = MessageType.Error;
_uploading = false;
await tokenSource.CancelAsync();
}
finally {
tokenSource.Dispose();
}
}
else
{
_message = string.Format(Localizer["Message.File.Restricted"], restricted);
_messagetype = MessageType.Warning;
}
}
else
{
_message = Localizer["Message.File.NotSelected"];
_messagetype = MessageType.Warning;
}
}
private async Task DeleteFile()
{
_message = string.Empty;
try
{
await FileService.DeleteFileAsync(FileId);
await logger.LogInformation("File Deleted {File}", FileId);
await OnDelete.InvokeAsync(FileId);
if (ShowSuccess)
{
_message = Localizer["Success.File.Delete"];
_messagetype = MessageType.Success;
}
await GetFiles();
FileId = -1;
await SetImage();
#pragma warning disable CS0618
await OnSelect.InvokeAsync(FileId);
#pragma warning restore CS0618
await OnSelectFile.InvokeAsync(FileId);
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message);
_message = Localizer["Error.File.Delete"];
_messagetype = MessageType.Error;
}
}
public int GetFileId() => FileId;
public int GetFolderId() => FolderId;
public File GetFile() => _file;
public async Task Refresh()
{
await Refresh(-1);
}
public async Task Refresh(int fileId)
{
await GetFiles();
if (fileId != -1)
{
var file = _files.Where(item => item.FileId == fileId).FirstOrDefault();
if (file != null)
{
FileId = file.FileId;
@@ -287,45 +544,4 @@
}
StateHasChanged();
}
else
{
await logger.LogError("File Upload Failed For {Files}", result.Replace(",", ", "));
_message = "<br /><div class=\"alert alert-danger\" role=\"alert\">File Upload Failed</div>";
}
}
catch (Exception ex)
{
await logger.LogError(ex, "File Upload Failed {Error}", ex.Message);
_message = "<br /><div class=\"alert alert-danger\" role=\"alert\">File Upload Failed</div>";
}
}
else
{
_message = "<br /><div class=\"alert alert-warning\" role=\"alert\">You Have Not Selected A File To Upload</div>";
}
}
private async Task DeleteFile()
{
_message = string.Empty;
try
{
await FileService.DeleteFileAsync(FileId);
await logger.LogInformation("File Deleted {File}", FileId);
_message = "<br /><div class=\"alert alert-success\" role=\"alert\">File Deleted</div>";
await GetFiles();
FileId = -1;
await SetImage();
StateHasChanged();
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message);
_message = "<br /><div class=\"alert alert-danger\" role=\"alert\">Error Deleting File</div>";
}
}
public int GetFileId() => FileId;
}

View File

@@ -0,0 +1,47 @@
@namespace Oqtane.Modules.Controls
@inherits LocalizableComponent
<input type="text" value="@Value" list="@_id" class="form-control" @onchange="(e => OnChange(e))" />
<datalist id="@_id" value="@Value">
@foreach(var kvp in DataList)
{
if (!string.IsNullOrEmpty(kvp.Value))
{
<option value="@kvp.Key">@Localize(kvp.Value, kvp.Value)</option>
}
else
{
<option value="@kvp.Key">@Localize(kvp.Key, kvp.Key)</option>
}
}
</datalist>
@code {
private string _id;
[Parameter]
public string Value { get; set; }
[EditorRequired]
[Parameter]
public Dictionary<string, string> DataList { get; set; }
[EditorRequired]
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
protected override void OnInitialized()
{
// create unique id for component
_id = "DataList_" + Guid.NewGuid().ToString("N");
}
protected void OnChange(ChangeEventArgs e)
{
Value = e.Value.ToString();
if (ValueChanged.HasDelegate)
{
ValueChanged.InvokeAsync(Value);
}
}
}

Some files were not shown because too many files have changed in this diff Show More