From ee0ffaf28f849ea191467365529731154fe70801 Mon Sep 17 00:00:00 2001 From: Nguyen Thien Tu <15050790+thientu995@users.noreply.github.com> Date: Tue, 25 Aug 2026 12:26:39 +0700 Subject: [PATCH 1/4] update url image --- README.md | 6 +++--- ...-\304\221\341\272\267t-ban-\304\221\341\272\247u.config" | 4 ++-- ...\304\221\341\272\267t-to\303\240n-c\341\273\245c.config" | 2 +- ...2\245u-h\303\254nh-b\341\272\243o-m\341\272\255t.config" | 4 ++-- .../uSync/v17/Content/dashboard-header-app.config | 2 +- ...3n-qu\341\272\243n-l\303\275-n\341\273\231i-dung.config" | 2 +- ...341\273\257-\304\221a-ng\303\264n-ng\341\273\257.config" | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 649fb504..45fd046b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Logo uTPro – Umbraco Turbo Pro +# Logo uTPro – Umbraco Turbo Pro **For developers, by developers** @@ -42,9 +42,9 @@ dotnet run --project Project/uTPro.Project.Web/uTPro.Project.Web.csproj ## Screenshots -![Dashboard](https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/screenshots/uTPro/readme-dashboard.png) +![Dashboard](https://docs.utpro.dev/screenshots/uTPro/readme-dashboard.png) -![Block Preview](https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/screenshots/uTPro/readme-block-preview-live.png) +![Block Preview](https://docs.utpro.dev/screenshots/uTPro/readme-block-preview-live.png) --- diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-ban-\304\221\341\272\247u.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-ban-\304\221\341\272\247u.config" index 9e666576..e432ca26 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-ban-\304\221\341\272\247u.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-ban-\304\221\341\272\247u.config" @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003ESetup Domain\u003C/h2\u003E\u003Cp\u003EIn addition to the configurations used for Umbraco, we also provide other configurations for backoffice and language customization.\u003C/p\u003E\u003Cp\u003EIf you want to use multi site or configure separate backoffice, please update the \u003Cstrong\u003Ehosts file\u003C/strong\u003E according to each operating system:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003EFor Windows: C:\\Windows\\System32\\Drivers\\etc\\hosts\u003C/li\u003E\u003Cli\u003EFor MacOS and Linux: /etc/hosts\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-appsettings-config.png\u0022 alt=\u0022Setup appsettings config\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-hosts-file.png\u0022 alt=\u0022Setup hosts file\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003ESetup Project\u003C/h2\u003E\u003Cp\u003ESetting up uTPro is simple. Once you have downloaded the source code, you can open the project solution file in Visual Studio. We recommend using Visual Studio 2022 (or later).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-visual-studio-solution.png\u0022 alt=\u0022Setup Visual Studio solution\u0022 /\u003E\u003C/p\u003E\u003Cp\u003EThen follow the minimum requirements of the Umbraco CMS project:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase\u003C/strong\u003E: uTPro ships configured for PostgreSQL (default), and also supports SQL Server and SQLite. Change the ConnectionString in appsettings.json with key \u003Cstrong\u003EumbracoDbDSN\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETarget framework\u003C/strong\u003E: .NET 10 (Changes depending on the Umbraco version in use \u2014 Umbraco 17 runs on .NET 10)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-database-config.png\u0022 alt=\u0022Setup database config\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-connection-string.png\u0022 alt=\u0022Setup connection string\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-target-framework.png\u0022 alt=\u0022Setup target framework\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003ESetup Data\u003C/h2\u003E\u003Cp\u003EThe project has been integrated with data, and you can use \u003Cstrong\u003EuSync to synchronize data\u003C/strong\u003E after installing Umbraco CMS.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-usync-import.png\u0022 alt=\u0022Setup uSync import\u0022 /\u003E\u003C/p\u003E\u003Cp\u003EIn the \u0022Everything\u0022 group, select \u0022Import\u0022 and wait for the results, then refresh the page, return to the \u0022Content\u0022 tab to check the results.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-usync-result.png\u0022 alt=\u0022Setup uSync result\u0022 /\u003E\u003C/p\u003E" + "markup": "\u003Ch2\u003ESetup Domain\u003C/h2\u003E\u003Cp\u003EIn addition to the configurations used for Umbraco, we also provide other configurations for backoffice and language customization.\u003C/p\u003E\u003Cp\u003EIf you want to use multi site or configure separate backoffice, please update the \u003Cstrong\u003Ehosts file\u003C/strong\u003E according to each operating system:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003EFor Windows: C:\\Windows\\System32\\Drivers\\etc\\hosts\u003C/li\u003E\u003Cli\u003EFor MacOS and Linux: /etc/hosts\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-appsettings-config.png\u0022 alt=\u0022Setup appsettings config\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-hosts-file.png\u0022 alt=\u0022Setup hosts file\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003ESetup Project\u003C/h2\u003E\u003Cp\u003ESetting up uTPro is simple. Once you have downloaded the source code, you can open the project solution file in Visual Studio. We recommend using Visual Studio 2022 (or later).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-visual-studio-solution.png\u0022 alt=\u0022Setup Visual Studio solution\u0022 /\u003E\u003C/p\u003E\u003Cp\u003EThen follow the minimum requirements of the Umbraco CMS project:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase\u003C/strong\u003E: uTPro ships configured for PostgreSQL (default), and also supports SQL Server and SQLite. Change the ConnectionString in appsettings.json with key \u003Cstrong\u003EumbracoDbDSN\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETarget framework\u003C/strong\u003E: .NET 10 (Changes depending on the Umbraco version in use \u2014 Umbraco 17 runs on .NET 10)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-database-config.png\u0022 alt=\u0022Setup database config\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-connection-string.png\u0022 alt=\u0022Setup connection string\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-target-framework.png\u0022 alt=\u0022Setup target framework\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003ESetup Data\u003C/h2\u003E\u003Cp\u003EThe project has been integrated with data, and you can use \u003Cstrong\u003EuSync to synchronize data\u003C/strong\u003E after installing Umbraco CMS.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-usync-import.png\u0022 alt=\u0022Setup uSync import\u0022 /\u003E\u003C/p\u003E\u003Cp\u003EIn the \u0022Everything\u0022 group, select \u0022Import\u0022 and wait for the results, then refresh the page, return to the \u0022Content\u0022 tab to check the results.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-usync-result.png\u0022 alt=\u0022Setup uSync result\u0022 /\u003E\u003C/p\u003E" } } ] @@ -287,7 +287,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EC\u00E0i \u0111\u1EB7t Domain\u003C/h2\u003E\u003Cp\u003ENgo\u00E0i c\u00E1c c\u1EA5u h\u00ECnh d\u00E0nh cho Umbraco, ch\u00FAng t\u00F4i cung c\u1EA5p th\u00EAm c\u1EA5u h\u00ECnh cho backoffice v\u00E0 t\u00F9y ch\u1EC9nh ng\u00F4n ng\u1EEF.\u003C/p\u003E\u003Cp\u003EN\u1EBFu b\u1EA1n mu\u1ED1n s\u1EED d\u1EE5ng multi site ho\u1EB7c c\u1EA5u h\u00ECnh backoffice ri\u00EAng, h\u00E3y c\u1EADp nh\u1EADt \u003Cstrong\u003Ehosts file\u003C/strong\u003E theo h\u1EC7 \u0111i\u1EC1u h\u00E0nh:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003EWindows: C:\\Windows\\System32\\Drivers\\etc\\hosts\u003C/li\u003E\u003Cli\u003EMacOS v\u00E0 Linux: /etc/hosts\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-appsettings-config.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh appsettings\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-hosts-file.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh hosts file\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003EC\u00E0i \u0111\u1EB7t Project\u003C/h2\u003E\u003Cp\u003EC\u00E0i \u0111\u1EB7t uTPro r\u1EA5t \u0111\u01A1n gi\u1EA3n. Sau khi t\u1EA3i m\u00E3 ngu\u1ED3n, m\u1EDF file solution trong Visual Studio 2022 (ho\u1EB7c m\u1EDBi h\u01A1n).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-visual-studio-solution.png\u0022 alt=\u0022Visual Studio solution\u0022 /\u003E\u003C/p\u003E\u003Cp\u003ESau \u0111\u00F3 \u0111\u00E1p \u1EE9ng y\u00EAu c\u1EA7u t\u1ED1i thi\u1EC3u c\u1EE7a Umbraco CMS:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase\u003C/strong\u003E: uTPro m\u1EB7c \u0111\u1ECBnh d\u00F9ng PostgreSQL, h\u1ED7 tr\u1EE3 th\u00EAm SQL Server v\u00E0 SQLite. Thay \u0111\u1ED5i ConnectionString trong appsettings.json v\u1EDBi key \u003Cstrong\u003EumbracoDbDSN\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETarget framework\u003C/strong\u003E: .NET 10 (Umbraco 17 ch\u1EA1y tr\u00EAn .NET 10)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-database-config.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh database\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-connection-string.png\u0022 alt=\u0022Connection string\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-target-framework.png\u0022 alt=\u0022Target framework\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003EC\u00E0i \u0111\u1EB7t D\u1EEF li\u1EC7u\u003C/h2\u003E\u003Cp\u003ED\u1EF1 \u00E1n \u0111\u00E3 \u0111\u01B0\u1EE3c t\u00EDch h\u1EE3p s\u1EB5n d\u1EEF li\u1EC7u, b\u1EA1n c\u00F3 th\u1EC3 d\u00F9ng \u003Cstrong\u003EuSync \u0111\u1EC3 \u0111\u1ED3ng b\u1ED9 d\u1EEF li\u1EC7u\u003C/strong\u003E sau khi c\u00E0i Umbraco CMS.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-usync-import.png\u0022 alt=\u0022uSync import\u0022 /\u003E\u003C/p\u003E\u003Cp\u003ETrong nh\u00F3m \u0022Everything\u0022, ch\u1ECDn \u0022Import\u0022 v\u00E0 \u0111\u1EE3i k\u1EBFt qu\u1EA3, sau \u0111\u00F3 refresh trang, quay l\u1EA1i tab \u0022Content\u0022 \u0111\u1EC3 ki\u1EC3m tra.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/setup-usync-result.png\u0022 alt=\u0022K\u1EBFt qu\u1EA3 uSync\u0022 /\u003E\u003C/p\u003E" + "markup": "\u003Ch2\u003EC\u00E0i \u0111\u1EB7t Domain\u003C/h2\u003E\u003Cp\u003ENgo\u00E0i c\u00E1c c\u1EA5u h\u00ECnh d\u00E0nh cho Umbraco, ch\u00FAng t\u00F4i cung c\u1EA5p th\u00EAm c\u1EA5u h\u00ECnh cho backoffice v\u00E0 t\u00F9y ch\u1EC9nh ng\u00F4n ng\u1EEF.\u003C/p\u003E\u003Cp\u003EN\u1EBFu b\u1EA1n mu\u1ED1n s\u1EED d\u1EE5ng multi site ho\u1EB7c c\u1EA5u h\u00ECnh backoffice ri\u00EAng, h\u00E3y c\u1EADp nh\u1EADt \u003Cstrong\u003Ehosts file\u003C/strong\u003E theo h\u1EC7 \u0111i\u1EC1u h\u00E0nh:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003EWindows: C:\\Windows\\System32\\Drivers\\etc\\hosts\u003C/li\u003E\u003Cli\u003EMacOS v\u00E0 Linux: /etc/hosts\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-appsettings-config.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh appsettings\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-hosts-file.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh hosts file\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003EC\u00E0i \u0111\u1EB7t Project\u003C/h2\u003E\u003Cp\u003EC\u00E0i \u0111\u1EB7t uTPro r\u1EA5t \u0111\u01A1n gi\u1EA3n. Sau khi t\u1EA3i m\u00E3 ngu\u1ED3n, m\u1EDF file solution trong Visual Studio 2022 (ho\u1EB7c m\u1EDBi h\u01A1n).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-visual-studio-solution.png\u0022 alt=\u0022Visual Studio solution\u0022 /\u003E\u003C/p\u003E\u003Cp\u003ESau \u0111\u00F3 \u0111\u00E1p \u1EE9ng y\u00EAu c\u1EA7u t\u1ED1i thi\u1EC3u c\u1EE7a Umbraco CMS:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase\u003C/strong\u003E: uTPro m\u1EB7c \u0111\u1ECBnh d\u00F9ng PostgreSQL, h\u1ED7 tr\u1EE3 th\u00EAm SQL Server v\u00E0 SQLite. Thay \u0111\u1ED5i ConnectionString trong appsettings.json v\u1EDBi key \u003Cstrong\u003EumbracoDbDSN\u003C/strong\u003E.\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ETarget framework\u003C/strong\u003E: .NET 10 (Umbraco 17 ch\u1EA1y tr\u00EAn .NET 10)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-database-config.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh database\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-connection-string.png\u0022 alt=\u0022Connection string\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-target-framework.png\u0022 alt=\u0022Target framework\u0022 /\u003E\u003C/p\u003E\u003Ch2\u003EC\u00E0i \u0111\u1EB7t D\u1EEF li\u1EC7u\u003C/h2\u003E\u003Cp\u003ED\u1EF1 \u00E1n \u0111\u00E3 \u0111\u01B0\u1EE3c t\u00EDch h\u1EE3p s\u1EB5n d\u1EEF li\u1EC7u, b\u1EA1n c\u00F3 th\u1EC3 d\u00F9ng \u003Cstrong\u003EuSync \u0111\u1EC3 \u0111\u1ED3ng b\u1ED9 d\u1EEF li\u1EC7u\u003C/strong\u003E sau khi c\u00E0i Umbraco CMS.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-usync-import.png\u0022 alt=\u0022uSync import\u0022 /\u003E\u003C/p\u003E\u003Cp\u003ETrong nh\u00F3m \u0022Everything\u0022, ch\u1ECDn \u0022Import\u0022 v\u00E0 \u0111\u1EE3i k\u1EBFt qu\u1EA3, sau \u0111\u00F3 refresh trang, quay l\u1EA1i tab \u0022Content\u0022 \u0111\u1EC3 ki\u1EC3m tra.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/setup-usync-result.png\u0022 alt=\u0022K\u1EBFt qu\u1EA3 uSync\u0022 /\u003E\u003C/p\u003E" } } ] diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-to\303\240n-c\341\273\245c.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-to\303\240n-c\341\273\245c.config" index 2dd94d1b..d39c69a2 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-to\303\240n-c\341\273\245c.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\303\240i-\304\221\341\272\267t-to\303\240n-c\341\273\245c.config" @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EGlobal Settings (CMS-driven)\u003C/h2\u003E\u003Cp\u003ESeveral site behaviours are controlled by dedicated backoffice settings nodes rather than appsettings.json.\u003C/p\u003E\u003Ch3\u003ESite Settings \u2014 favicon, logo, title suffix\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EField\u003C/th\u003E\u003Cth\u003EPurpose\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EFavicon.ico\u003C/td\u003E\u003Ctd\u003ESite favicon (falls back to /favicon-default.ico)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ELogo\u003C/td\u003E\u003Ctd\u003ESite logo media\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ETitle Suffix\u003C/td\u003E\u003Ctd\u003EAppended to every page title as \u0022Page Title | Suffix\u0022\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-site-settings.png\u0022 alt=\u0022Site Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ESitemap \u0026amp; Robots Settings\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EContent\u003C/strong\u003E: Raw robots.txt body (when empty, a default is generated)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EIgnored Document Types\u003C/strong\u003E: Doc-type aliases to exclude from sitemap.xml\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EMax Sitemap Depth\u003C/strong\u003E: Limit how deep the sitemap crawls\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-sitemap-robots.png\u0022 alt=\u0022Sitemap \u0026amp; Robots Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EResponsive Image Settings\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ETurn Off Responsive Image\u003C/strong\u003E: Master toggle (OFF = responsive ON)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EExtend Sizes SrcSet\u003C/strong\u003E: Extra widths (defaults: 1200/1024/768)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-responsive-image.png\u0022 alt=\u0022Responsive Image Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EContact Form \u0026amp; Cloudflare Turnstile\u003C/h3\u003E\u003Cp\u003EThe Contact Form component renders a form from Simple Form Builder. Turnstile key resolution: field-level \u2192 appsettings fallback \u2192 not rendered.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-contact-form-turnstile.png\u0022 alt=\u0022Contact Form \u0026amp; Turnstile\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EHidden Container URLs\u003C/h3\u003E\u003Cp\u003EOrganisational nodes don\u0027t expose a public URL. HiddenUrlProvider suppresses URLs for built-in containers. Add custom ones via \u003Ccode\u003EuTPro:HiddenUrls:DocumentTypeAliases\u003C/code\u003E.\u003C/p\u003E\u003Ch3\u003EError Page\u003C/h3\u003E\u003Cp\u003EThe Page Error node provides 404/500 content with proper HTTP status codes.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-error-page.png\u0022 alt=\u0022Error Page\u0022 /\u003E\u003C/p\u003E" + "markup": "\u003Ch2\u003EGlobal Settings (CMS-driven)\u003C/h2\u003E\u003Cp\u003ESeveral site behaviours are controlled by dedicated backoffice settings nodes rather than appsettings.json.\u003C/p\u003E\u003Ch3\u003ESite Settings \u2014 favicon, logo, title suffix\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EField\u003C/th\u003E\u003Cth\u003EPurpose\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EFavicon.ico\u003C/td\u003E\u003Ctd\u003ESite favicon (falls back to /favicon-default.ico)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ELogo\u003C/td\u003E\u003Ctd\u003ESite logo media\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003ETitle Suffix\u003C/td\u003E\u003Ctd\u003EAppended to every page title as \u0022Page Title | Suffix\u0022\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-site-settings.png\u0022 alt=\u0022Site Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ESitemap \u0026amp; Robots Settings\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EContent\u003C/strong\u003E: Raw robots.txt body (when empty, a default is generated)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EIgnored Document Types\u003C/strong\u003E: Doc-type aliases to exclude from sitemap.xml\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EMax Sitemap Depth\u003C/strong\u003E: Limit how deep the sitemap crawls\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-sitemap-robots.png\u0022 alt=\u0022Sitemap \u0026amp; Robots Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EResponsive Image Settings\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ETurn Off Responsive Image\u003C/strong\u003E: Master toggle (OFF = responsive ON)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EExtend Sizes SrcSet\u003C/strong\u003E: Extra widths (defaults: 1200/1024/768)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-responsive-image.png\u0022 alt=\u0022Responsive Image Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EContact Form \u0026amp; Cloudflare Turnstile\u003C/h3\u003E\u003Cp\u003EThe Contact Form component renders a form from Simple Form Builder. Turnstile key resolution: field-level \u2192 appsettings fallback \u2192 not rendered.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-contact-form-turnstile.png\u0022 alt=\u0022Contact Form \u0026amp; Turnstile\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EHidden Container URLs\u003C/h3\u003E\u003Cp\u003EOrganisational nodes don\u0027t expose a public URL. HiddenUrlProvider suppresses URLs for built-in containers. Add custom ones via \u003Ccode\u003EuTPro:HiddenUrls:DocumentTypeAliases\u003C/code\u003E.\u003C/p\u003E\u003Ch3\u003EError Page\u003C/h3\u003E\u003Cp\u003EThe Page Error node provides 404/500 content with proper HTTP status codes.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-error-page.png\u0022 alt=\u0022Error Page\u0022 /\u003E\u003C/p\u003E" } } ] diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\341\272\245u-h\303\254nh-b\341\272\243o-m\341\272\255t.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\341\272\245u-h\303\254nh-b\341\272\243o-m\341\272\255t.config" index fc398f0b..079e69a3 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\341\272\245u-h\303\254nh-b\341\272\243o-m\341\272\255t.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/c\341\272\245u-h\303\254nh-b\341\272\243o-m\341\272\255t.config" @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003ESecurity Configuration\u003C/h2\u003E\u003Cp\u003EuTPro includes built-in security hardening. Most is code-level (in \u003Ccode\u003EStartup/*.cs\u003C/code\u003E), while HTTP security headers are content-driven from the backoffice.\u003C/p\u003E\u003Ch3\u003ESecurity Headers (backoffice-driven)\u003C/h3\u003E\u003Cp\u003ESecurity headers are read from a \u003Ccode\u003EGlobalSecurityHeadersSettings\u003C/code\u003E node. Sensible defaults fill in any field left blank.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EField\u003C/th\u003E\u003Cth\u003EHeader\u003C/th\u003E\u003Cth\u003EDefault\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EEnabled\u003C/td\u003E\u003Ctd\u003E(master toggle)\u003C/td\u003E\u003Ctd\u003E\u2014\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXContentTypeOptions\u003C/td\u003E\u003Ctd\u003EX-Content-Type-Options\u003C/td\u003E\u003Ctd\u003Enosniff\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXFrameOptions\u003C/td\u003E\u003Ctd\u003EX-Frame-Options\u003C/td\u003E\u003Ctd\u003ESAMEORIGIN\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EContentSecurityPolicyCsp\u003C/td\u003E\u003Ctd\u003EContent-Security-Policy\u003C/td\u003E\u003Ctd\u003E(omitted)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsEnabled\u003C/td\u003E\u003Ctd\u003EStrict-Transport-Security\u003C/td\u003E\u003Ctd\u003Efalse\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsMaxAgeSeconds\u003C/td\u003E\u003Ctd\u003Emax-age\u003C/td\u003E\u003Ctd\u003E31536000 (1 year)\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-security-headers.png\u0022 alt=\u0022Security Headers Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EOther Security Features\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERequest Size Limits\u003C/strong\u003E: 128MB max upload, 4MB per form value\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESync IO disabled\u003C/strong\u003E: Both IIS and Kestrel have AllowSynchronousIO = false\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EData Protection\u003C/strong\u003E: Keys persisted with 90-day rotation\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDomain Policy\u003C/strong\u003E: Domain allowlist with wildcard support in CheckPolicy.cs\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKestrel\u003C/strong\u003E: Server header disabled\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EHeader-injection safe\u003C/strong\u003E: Values collapsed to single line before emitting\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFails open\u003C/strong\u003E: If settings lookup errors, request served with no security headers (warning logged)\u003C/li\u003E\u003C/ul\u003E" + "markup": "\u003Ch2\u003ESecurity Configuration\u003C/h2\u003E\u003Cp\u003EuTPro includes built-in security hardening. Most is code-level (in \u003Ccode\u003EStartup/*.cs\u003C/code\u003E), while HTTP security headers are content-driven from the backoffice.\u003C/p\u003E\u003Ch3\u003ESecurity Headers (backoffice-driven)\u003C/h3\u003E\u003Cp\u003ESecurity headers are read from a \u003Ccode\u003EGlobalSecurityHeadersSettings\u003C/code\u003E node. Sensible defaults fill in any field left blank.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EField\u003C/th\u003E\u003Cth\u003EHeader\u003C/th\u003E\u003Cth\u003EDefault\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EEnabled\u003C/td\u003E\u003Ctd\u003E(master toggle)\u003C/td\u003E\u003Ctd\u003E\u2014\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXContentTypeOptions\u003C/td\u003E\u003Ctd\u003EX-Content-Type-Options\u003C/td\u003E\u003Ctd\u003Enosniff\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXFrameOptions\u003C/td\u003E\u003Ctd\u003EX-Frame-Options\u003C/td\u003E\u003Ctd\u003ESAMEORIGIN\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EContentSecurityPolicyCsp\u003C/td\u003E\u003Ctd\u003EContent-Security-Policy\u003C/td\u003E\u003Ctd\u003E(omitted)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsEnabled\u003C/td\u003E\u003Ctd\u003EStrict-Transport-Security\u003C/td\u003E\u003Ctd\u003Efalse\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsMaxAgeSeconds\u003C/td\u003E\u003Ctd\u003Emax-age\u003C/td\u003E\u003Ctd\u003E31536000 (1 year)\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-security-headers.png\u0022 alt=\u0022Security Headers Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EOther Security Features\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERequest Size Limits\u003C/strong\u003E: 128MB max upload, 4MB per form value\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESync IO disabled\u003C/strong\u003E: Both IIS and Kestrel have AllowSynchronousIO = false\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EData Protection\u003C/strong\u003E: Keys persisted with 90-day rotation\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDomain Policy\u003C/strong\u003E: Domain allowlist with wildcard support in CheckPolicy.cs\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKestrel\u003C/strong\u003E: Server header disabled\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EHeader-injection safe\u003C/strong\u003E: Values collapsed to single line before emitting\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFails open\u003C/strong\u003E: If settings lookup errors, request served with no security headers (warning logged)\u003C/li\u003E\u003C/ul\u003E" } } ] @@ -287,7 +287,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EC\u1EA5u h\u00ECnh B\u1EA3o m\u1EADt\u003C/h2\u003E\u003Cp\u003EuTPro t\u00EDch h\u1EE3p s\u1EB5n b\u1EA3o m\u1EADt. Ph\u1EA7n l\u1EDBn \u1EDF code-level (\u003Ccode\u003EStartup/*.cs\u003C/code\u003E), c\u00F2n HTTP security headers \u0111\u01B0\u1EE3c qu\u1EA3n l\u00FD t\u1EEB backoffice.\u003C/p\u003E\u003Ch3\u003ESecurity Headers (qu\u1EA3n l\u00FD t\u1EEB Backoffice)\u003C/h3\u003E\u003Cp\u003ESecurity headers \u0111\u01B0\u1EE3c \u0111\u1ECDc t\u1EEB node \u003Ccode\u003EGlobalSecurityHeadersSettings\u003C/code\u003E. Gi\u00E1 tr\u1ECB m\u1EB7c \u0111\u1ECBnh s\u1EBD \u0111\u01B0\u1EE3c \u00E1p d\u1EE5ng n\u1EBFu \u0111\u1EC3 tr\u1ED1ng.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003ETr\u01B0\u1EDDng\u003C/th\u003E\u003Cth\u003EHeader\u003C/th\u003E\u003Cth\u003EM\u1EB7c \u0111\u1ECBnh\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EEnabled\u003C/td\u003E\u003Ctd\u003E(b\u1EADt/t\u1EAFt ch\u00EDnh)\u003C/td\u003E\u003Ctd\u003E\u2014\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXContentTypeOptions\u003C/td\u003E\u003Ctd\u003EX-Content-Type-Options\u003C/td\u003E\u003Ctd\u003Enosniff\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXFrameOptions\u003C/td\u003E\u003Ctd\u003EX-Frame-Options\u003C/td\u003E\u003Ctd\u003ESAMEORIGIN\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EContentSecurityPolicyCsp\u003C/td\u003E\u003Ctd\u003EContent-Security-Policy\u003C/td\u003E\u003Ctd\u003E(b\u1ECF qua)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsEnabled\u003C/td\u003E\u003Ctd\u003EStrict-Transport-Security\u003C/td\u003E\u003Ctd\u003Efalse\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsMaxAgeSeconds\u003C/td\u003E\u003Ctd\u003Emax-age\u003C/td\u003E\u003Ctd\u003E31536000 (1 n\u0103m)\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/settings-security-headers.png\u0022 alt=\u0022Security Headers Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EC\u00E1c t\u00EDnh n\u0103ng B\u1EA3o m\u1EADt kh\u00E1c\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGi\u1EDBi h\u1EA1n Request\u003C/strong\u003E: Upload t\u1ED1i \u0111a 128MB, form value 4MB\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESync IO t\u1EAFt\u003C/strong\u003E: IIS v\u00E0 Kestrel \u0111\u1EC1u AllowSynchronousIO = false\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EData Protection\u003C/strong\u003E: Keys t\u1EF1 \u0111\u1ED9ng xoay v\u00F2ng 90 ng\u00E0y\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDomain Policy\u003C/strong\u003E: Danh s\u00E1ch domain cho ph\u00E9p v\u1EDBi wildcard trong CheckPolicy.cs\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKestrel\u003C/strong\u003E: T\u1EAFt Server header\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECh\u1ED1ng header-injection\u003C/strong\u003E: Gi\u00E1 tr\u1ECB \u0111\u01B0\u1EE3c collapse th\u00E0nh 1 d\u00F2ng tr\u01B0\u1EDBc khi emit\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFail open\u003C/strong\u003E: N\u1EBFu l\u1ED7i settings, request v\u1EABn \u0111\u01B0\u1EE3c serve (log warning)\u003C/li\u003E\u003C/ul\u003E" + "markup": "\u003Ch2\u003EC\u1EA5u h\u00ECnh B\u1EA3o m\u1EADt\u003C/h2\u003E\u003Cp\u003EuTPro t\u00EDch h\u1EE3p s\u1EB5n b\u1EA3o m\u1EADt. Ph\u1EA7n l\u1EDBn \u1EDF code-level (\u003Ccode\u003EStartup/*.cs\u003C/code\u003E), c\u00F2n HTTP security headers \u0111\u01B0\u1EE3c qu\u1EA3n l\u00FD t\u1EEB backoffice.\u003C/p\u003E\u003Ch3\u003ESecurity Headers (qu\u1EA3n l\u00FD t\u1EEB Backoffice)\u003C/h3\u003E\u003Cp\u003ESecurity headers \u0111\u01B0\u1EE3c \u0111\u1ECDc t\u1EEB node \u003Ccode\u003EGlobalSecurityHeadersSettings\u003C/code\u003E. Gi\u00E1 tr\u1ECB m\u1EB7c \u0111\u1ECBnh s\u1EBD \u0111\u01B0\u1EE3c \u00E1p d\u1EE5ng n\u1EBFu \u0111\u1EC3 tr\u1ED1ng.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003ETr\u01B0\u1EDDng\u003C/th\u003E\u003Cth\u003EHeader\u003C/th\u003E\u003Cth\u003EM\u1EB7c \u0111\u1ECBnh\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EEnabled\u003C/td\u003E\u003Ctd\u003E(b\u1EADt/t\u1EAFt ch\u00EDnh)\u003C/td\u003E\u003Ctd\u003E\u2014\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXContentTypeOptions\u003C/td\u003E\u003Ctd\u003EX-Content-Type-Options\u003C/td\u003E\u003Ctd\u003Enosniff\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EXFrameOptions\u003C/td\u003E\u003Ctd\u003EX-Frame-Options\u003C/td\u003E\u003Ctd\u003ESAMEORIGIN\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EContentSecurityPolicyCsp\u003C/td\u003E\u003Ctd\u003EContent-Security-Policy\u003C/td\u003E\u003Ctd\u003E(b\u1ECF qua)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsEnabled\u003C/td\u003E\u003Ctd\u003EStrict-Transport-Security\u003C/td\u003E\u003Ctd\u003Efalse\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHstsMaxAgeSeconds\u003C/td\u003E\u003Ctd\u003Emax-age\u003C/td\u003E\u003Ctd\u003E31536000 (1 n\u0103m)\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/settings-security-headers.png\u0022 alt=\u0022Security Headers Settings\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EC\u00E1c t\u00EDnh n\u0103ng B\u1EA3o m\u1EADt kh\u00E1c\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGi\u1EDBi h\u1EA1n Request\u003C/strong\u003E: Upload t\u1ED1i \u0111a 128MB, form value 4MB\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESync IO t\u1EAFt\u003C/strong\u003E: IIS v\u00E0 Kestrel \u0111\u1EC1u AllowSynchronousIO = false\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EData Protection\u003C/strong\u003E: Keys t\u1EF1 \u0111\u1ED9ng xoay v\u00F2ng 90 ng\u00E0y\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EDomain Policy\u003C/strong\u003E: Danh s\u00E1ch domain cho ph\u00E9p v\u1EDBi wildcard trong CheckPolicy.cs\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EKestrel\u003C/strong\u003E: T\u1EAFt Server header\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ECh\u1ED1ng header-injection\u003C/strong\u003E: Gi\u00E1 tr\u1ECB \u0111\u01B0\u1EE3c collapse th\u00E0nh 1 d\u00F2ng tr\u01B0\u1EDBc khi emit\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFail open\u003C/strong\u003E: N\u1EBFu l\u1ED7i settings, request v\u1EABn \u0111\u01B0\u1EE3c serve (log warning)\u003C/li\u003E\u003C/ul\u003E" } } ] diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/dashboard-header-app.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/dashboard-header-app.config index 31548a6e..fcc0c001 100644 --- a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/dashboard-header-app.config +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/dashboard-header-app.config @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EDashboard \u0026amp; Header App\u003C/h2\u003E\u003Cp\u003E\u003Ccode\u003EuTPro.Feature.Dashboard\u003C/code\u003E adds a branded backoffice dashboard and a header app to Umbraco. Both are backed by a single authenticated management-API controller \u2014 nothing is exposed publicly and the GitHub \u0022latest release\u0022 lookup happens server-side (cached).\u003C/p\u003E\u003Ch3\u003EWhat You Get\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EExtension\u003C/th\u003E\u003Cth\u003EWhere\u003C/th\u003E\u003Cth\u003EPurpose\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EHeader App\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003ETop-right of the backoffice header\u003C/td\u003E\u003Ctd\u003EPopover card with logo, installed version, Update/Check action, shortcut to dashboard\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EDashboard\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EContent section \u2192 uTPro tab\u003C/td\u003E\u003Ctd\u003EOverview page: version \u002B update status, site stats, current-user details, recent activity/audit trail\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Ch3\u003EDashboard Layout\u003C/h3\u003E\u003Cp\u003EThe dashboard uses a two-column layout (stacks on narrow screens):\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003ELeft (main):\u003C/strong\u003E\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EHero\u003C/strong\u003E \u2014 logo, product blurb, update button or \u0022Up to date\u0022 tag\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EResources\u003C/strong\u003E \u2014 quick links (Documentation, Releases, Report an issue)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EuTPro Apps\u003C/strong\u003E \u2014 auto-discovered sibling uTPro packages\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESEO Audit Score trend\u003C/strong\u003E \u2014 conditional card, shown when SEOAudit is installed\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent trail\u003C/strong\u003E \u2014 grouped bar chart (All vs You) with scope toggle and time-range picker\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent activity\u003C/strong\u003E \u2014 content actions (save, publish, create, move, delete)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cstrong\u003ERight (sidebar):\u003C/strong\u003E\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EProduct Information\u003C/strong\u003E \u2014 product name, core version, installed/latest version\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESite\u003C/strong\u003E \u2014 published content, recycle bins, users/members counts\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EYour Details\u003C/strong\u003E \u2014 name, email, 2FA status, last login, last password change\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/dashboard-overview.png\u0022 alt=\u0022Dashboard Overview\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EVersion \u0026amp; Update Check\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003EGET version\u003C/code\u003E returns installed, latest, updateAvailable, plus website/releasesUrl\u003C/li\u003E\u003Cli\u003ELatest release tag is fetched from GitHub server-side and cached for 1 hour\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003EGET version?refresh=true\u003C/code\u003E drops cache and re-checks immediately\u003C/li\u003E\u003Cli\u003EVersions normalized for display (v17.0.4 \u2192 17.0.4)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/dashboard-header-app.png\u0022 alt=\u0022Header App Popover\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ERecent Activity \u0026amp; Audit Trail\u003C/h3\u003E\u003Cp\u003EThe dashboard surfaces two kinds of history:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERecent activity\u003C/strong\u003E (from umbracoLog) \u2014 content actions with node links to Document, Media, or DictionaryItem editors\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent trail\u003C/strong\u003E (from umbracoAudit) \u2014 cross-cutting events with a grouped bar chart (Frappe Charts), scope toggle (All/You), and time-range picker (week/month/quarter/year)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/dashboard-audit-trail.png\u0022 alt=\u0022Audit Trail Chart\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EManagement API\u003C/h3\u003E\u003Cp\u003EAll endpoints live under \u003Ccode\u003E/umbraco/management/api/v1/utpro/dashboard/\u003C/code\u003E and require backoffice authentication.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EEndpoint\u003C/th\u003E\u003Cth\u003EReturns\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET version\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EInstalled \u002B latest version and update status\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET stats\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ESite statistics (content, recycle bins, users, members)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET current-user\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ECurrent backoffice user details\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET recent-activity / my-activity\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ENewest umbracoLog entries (all/current user)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET recent-trail / my-trail\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EumbracoAudit for the selected range with chart data\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" + "markup": "\u003Ch2\u003EDashboard \u0026amp; Header App\u003C/h2\u003E\u003Cp\u003E\u003Ccode\u003EuTPro.Feature.Dashboard\u003C/code\u003E adds a branded backoffice dashboard and a header app to Umbraco. Both are backed by a single authenticated management-API controller \u2014 nothing is exposed publicly and the GitHub \u0022latest release\u0022 lookup happens server-side (cached).\u003C/p\u003E\u003Ch3\u003EWhat You Get\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EExtension\u003C/th\u003E\u003Cth\u003EWhere\u003C/th\u003E\u003Cth\u003EPurpose\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EHeader App\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003ETop-right of the backoffice header\u003C/td\u003E\u003Ctd\u003EPopover card with logo, installed version, Update/Check action, shortcut to dashboard\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EDashboard\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EContent section \u2192 uTPro tab\u003C/td\u003E\u003Ctd\u003EOverview page: version \u002B update status, site stats, current-user details, recent activity/audit trail\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Ch3\u003EDashboard Layout\u003C/h3\u003E\u003Cp\u003EThe dashboard uses a two-column layout (stacks on narrow screens):\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003ELeft (main):\u003C/strong\u003E\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EHero\u003C/strong\u003E \u2014 logo, product blurb, update button or \u0022Up to date\u0022 tag\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EResources\u003C/strong\u003E \u2014 quick links (Documentation, Releases, Report an issue)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EuTPro Apps\u003C/strong\u003E \u2014 auto-discovered sibling uTPro packages\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESEO Audit Score trend\u003C/strong\u003E \u2014 conditional card, shown when SEOAudit is installed\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent trail\u003C/strong\u003E \u2014 grouped bar chart (All vs You) with scope toggle and time-range picker\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent activity\u003C/strong\u003E \u2014 content actions (save, publish, create, move, delete)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cstrong\u003ERight (sidebar):\u003C/strong\u003E\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EProduct Information\u003C/strong\u003E \u2014 product name, core version, installed/latest version\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ESite\u003C/strong\u003E \u2014 published content, recycle bins, users/members counts\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EYour Details\u003C/strong\u003E \u2014 name, email, 2FA status, last login, last password change\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/dashboard-overview.png\u0022 alt=\u0022Dashboard Overview\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EVersion \u0026amp; Update Check\u003C/h3\u003E\u003Cul\u003E\u003Cli\u003E\u003Ccode\u003EGET version\u003C/code\u003E returns installed, latest, updateAvailable, plus website/releasesUrl\u003C/li\u003E\u003Cli\u003ELatest release tag is fetched from GitHub server-side and cached for 1 hour\u003C/li\u003E\u003Cli\u003E\u003Ccode\u003EGET version?refresh=true\u003C/code\u003E drops cache and re-checks immediately\u003C/li\u003E\u003Cli\u003EVersions normalized for display (v17.0.4 \u2192 17.0.4)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/dashboard-header-app.png\u0022 alt=\u0022Header App Popover\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ERecent Activity \u0026amp; Audit Trail\u003C/h3\u003E\u003Cp\u003EThe dashboard surfaces two kinds of history:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ERecent activity\u003C/strong\u003E (from umbracoLog) \u2014 content actions with node links to Document, Media, or DictionaryItem editors\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003ERecent trail\u003C/strong\u003E (from umbracoAudit) \u2014 cross-cutting events with a grouped bar chart (Frappe Charts), scope toggle (All/You), and time-range picker (week/month/quarter/year)\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/dashboard-audit-trail.png\u0022 alt=\u0022Audit Trail Chart\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EManagement API\u003C/h3\u003E\u003Cp\u003EAll endpoints live under \u003Ccode\u003E/umbraco/management/api/v1/utpro/dashboard/\u003C/code\u003E and require backoffice authentication.\u003C/p\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EEndpoint\u003C/th\u003E\u003Cth\u003EReturns\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET version\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EInstalled \u002B latest version and update status\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET stats\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ESite statistics (content, recycle bins, users, members)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET current-user\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ECurrent backoffice user details\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET recent-activity / my-activity\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ENewest umbracoLog entries (all/current user)\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EGET recent-trail / my-trail\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EumbracoAudit for the selected range with chart data\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" } } ] diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/h\306\260\341\273\233ng-d\341\272\253n-qu\341\272\243n-l\303\275-n\341\273\231i-dung.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/h\306\260\341\273\233ng-d\341\272\253n-qu\341\272\243n-l\303\275-n\341\273\231i-dung.config" index ab902580..cf7ab0e7 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/h\306\260\341\273\233ng-d\341\272\253n-qu\341\272\243n-l\303\275-n\341\273\231i-dung.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/h\306\260\341\273\233ng-d\341\272\253n-qu\341\272\243n-l\303\275-n\341\273\231i-dung.config" @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EContent Editing Guide\u003C/h2\u003E\u003Cp\u003EThis guide is for content editors who build and maintain the website in the Umbraco backoffice.\u003C/p\u003E\u003Ch3\u003EContent Tree\u003C/h3\u003E\u003Cp\u003EuTPro organises content around a shared root and per-site nodes:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGlobal Root\u003C/strong\u003E \u2014 container, no URL\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Sites \u2192 Home\u003C/strong\u003E \u2014 the site root (Page Home)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Navigation Link\u003C/strong\u003E \u2014 holds the menu\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Settings\u003C/strong\u003E \u2014 favicon, logo, sitemap settings\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/content-tree.png\u0022 alt=\u0022Content Tree\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EPage Types\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EDoc type\u003C/th\u003E\u003Cth\u003EUse for\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EPage Home\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EThe single site root with navigation config\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EPage Standard\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EEvery normal content page\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003EBoth page types render three Block Grid areas: Top Component (inherited), Content (per page), Bottom Component (inherited).\u003C/p\u003E\u003Ch3\u003EBuilding a Page with Block Grid\u003C/h3\u003E\u003Col\u003E\u003Cli\u003EOpen a page \u2192 Content property (Block Grid editor)\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003EAdd content\u003C/strong\u003E and pick a component\u003C/li\u003E\u003Cli\u003EFill fields, then Save or Save and publish\u003C/li\u003E\u003Cli\u003EReorder blocks by dragging; delete via context menu\u003C/li\u003E\u003C/ol\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/content-blockgrid-editor.png\u0022 alt=\u0022Block Grid Editor\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ENavigation Menu\u003C/h3\u003E\u003Cp\u003EThe header menu is editor-built under Home \u2192 Folder Navigation Link \u2192 Items property. Each entry supports: Link, CSS classes, hidden toggle, children (multi-level), member-aware visibility.\u003C/p\u003E\u003Ch3\u003ESEO per Page\u003C/h3\u003E\u003Cp\u003EEach page has SEO fields via UmbracoSeoVisualizer: Title, Description, Keywords, Social Share Image, Open Graph, Twitter Card, Sitemap controls (noindex/nofollow, change frequency, priority).\u003C/p\u003E\u003Ch3\u003EMultilingual Content\u003C/h3\u003E\u003Cp\u003EConfigure languages under Settings \u2192 Languages. Set Culture and Hostnames on the Home node. Edit each page\u0027s variant per language. The language switcher appears automatically when multiple languages are active.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/content-language-switcher.png\u0022 alt=\u0022Language Switcher\u0022 /\u003E\u003C/p\u003E" + "markup": "\u003Ch2\u003EContent Editing Guide\u003C/h2\u003E\u003Cp\u003EThis guide is for content editors who build and maintain the website in the Umbraco backoffice.\u003C/p\u003E\u003Ch3\u003EContent Tree\u003C/h3\u003E\u003Cp\u003EuTPro organises content around a shared root and per-site nodes:\u003C/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGlobal Root\u003C/strong\u003E \u2014 container, no URL\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Sites \u2192 Home\u003C/strong\u003E \u2014 the site root (Page Home)\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Navigation Link\u003C/strong\u003E \u2014 holds the menu\u003C/li\u003E\u003Cli\u003E\u003Cstrong\u003EFolder Settings\u003C/strong\u003E \u2014 favicon, logo, sitemap settings\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/content-tree.png\u0022 alt=\u0022Content Tree\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EPage Types\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EDoc type\u003C/th\u003E\u003Cth\u003EUse for\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EPage Home\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EThe single site root with navigation config\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EPage Standard\u003C/strong\u003E\u003C/td\u003E\u003Ctd\u003EEvery normal content page\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u003Cp\u003EBoth page types render three Block Grid areas: Top Component (inherited), Content (per page), Bottom Component (inherited).\u003C/p\u003E\u003Ch3\u003EBuilding a Page with Block Grid\u003C/h3\u003E\u003Col\u003E\u003Cli\u003EOpen a page \u2192 Content property (Block Grid editor)\u003C/li\u003E\u003Cli\u003EClick \u003Cstrong\u003EAdd content\u003C/strong\u003E and pick a component\u003C/li\u003E\u003Cli\u003EFill fields, then Save or Save and publish\u003C/li\u003E\u003Cli\u003EReorder blocks by dragging; delete via context menu\u003C/li\u003E\u003C/ol\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/content-blockgrid-editor.png\u0022 alt=\u0022Block Grid Editor\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ENavigation Menu\u003C/h3\u003E\u003Cp\u003EThe header menu is editor-built under Home \u2192 Folder Navigation Link \u2192 Items property. Each entry supports: Link, CSS classes, hidden toggle, children (multi-level), member-aware visibility.\u003C/p\u003E\u003Ch3\u003ESEO per Page\u003C/h3\u003E\u003Cp\u003EEach page has SEO fields via UmbracoSeoVisualizer: Title, Description, Keywords, Social Share Image, Open Graph, Twitter Card, Sitemap controls (noindex/nofollow, change frequency, priority).\u003C/p\u003E\u003Ch3\u003EMultilingual Content\u003C/h3\u003E\u003Cp\u003EConfigure languages under Settings \u2192 Languages. Set Culture and Hostnames on the Home node. Edit each page\u0027s variant per language. The language switcher appears automatically when multiple languages are active.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/content-language-switcher.png\u0022 alt=\u0022Language Switcher\u0022 /\u003E\u003C/p\u003E" } } ] diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/ng\303\264n-ng\341\273\257-\304\221a-ng\303\264n-ng\341\273\257.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/ng\303\264n-ng\341\273\257-\304\221a-ng\303\264n-ng\341\273\257.config" index 21de9601..94208e99 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/ng\303\264n-ng\341\273\257-\304\221a-ng\303\264n-ng\341\273\257.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/ng\303\264n-ng\341\273\257-\304\221a-ng\303\264n-ng\341\273\257.config" @@ -115,7 +115,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003ELanguage \u0026 Multilingual Configuration\u003C/h2\u003E\u003Ch3\u003ECulture and Hostnames\u003C/h3\u003E\u003Cp\u003EuTPro provides multilingual configuration by \u003Cstrong\u003Ecookie\u003C/strong\u003E. You can find the \u0022Culture and Hostnames\u0022 settings in the \u0022Home\u0022 node (\u003Cstrong\u003EuTPro \u2192 Sites \u2192 Home\u003C/strong\u003E).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-culture-hostnames.png\u0022 alt=\u0022Culture and Hostnames configuration\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003EIMPORTANT:\u003C/strong\u003E Make sure that the default language (first access user has no cookie and url has no language set) is set to END \u0022/\u0022 by default and set it to the last position. Make sure each language has a hostname for Remember Language to work properly.\u003C/p\u003E\u003Cp\u003EYou can disable this feature by setting \u003Cstrong\u003EEnabled: \u0022false\u0022\u003C/strong\u003E for \u003Cstrong\u003ERememberLanguage\u003C/strong\u003E:\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-remember-language-disable.png\u0022 alt=\u0022Disable Remember Language\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EBackoffice and Website run separately\u003C/h3\u003E\u003Cp\u003EYou can separate Backoffice and Website into 2 separate domains. If you have enabled and configured the domain for Backoffice, try accessing the Website domain and \u0022/umbraco\u0022 to see the result.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-backoffice-domain.png\u0022 alt=\u0022Backoffice domain configuration\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EuTPro Custom Configuration (appsettings.json)\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EKey\u003C/th\u003E\u003Cth\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EEnable separate backoffice domain\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Url\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EBackoffice domain(s), comma-separated\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:RememberLanguage:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EEnable cookie-based language persistence\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:DefaultCulture\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EFallback culture when no language cookie/URL is present\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" + "markup": "\u003Ch2\u003ELanguage \u0026 Multilingual Configuration\u003C/h2\u003E\u003Ch3\u003ECulture and Hostnames\u003C/h3\u003E\u003Cp\u003EuTPro provides multilingual configuration by \u003Cstrong\u003Ecookie\u003C/strong\u003E. You can find the \u0022Culture and Hostnames\u0022 settings in the \u0022Home\u0022 node (\u003Cstrong\u003EuTPro \u2192 Sites \u2192 Home\u003C/strong\u003E).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-culture-hostnames.png\u0022 alt=\u0022Culture and Hostnames configuration\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003EIMPORTANT:\u003C/strong\u003E Make sure that the default language (first access user has no cookie and url has no language set) is set to END \u0022/\u0022 by default and set it to the last position. Make sure each language has a hostname for Remember Language to work properly.\u003C/p\u003E\u003Cp\u003EYou can disable this feature by setting \u003Cstrong\u003EEnabled: \u0022false\u0022\u003C/strong\u003E for \u003Cstrong\u003ERememberLanguage\u003C/strong\u003E:\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-remember-language-disable.png\u0022 alt=\u0022Disable Remember Language\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EBackoffice and Website run separately\u003C/h3\u003E\u003Cp\u003EYou can separate Backoffice and Website into 2 separate domains. If you have enabled and configured the domain for Backoffice, try accessing the Website domain and \u0022/umbraco\u0022 to see the result.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-backoffice-domain.png\u0022 alt=\u0022Backoffice domain configuration\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EuTPro Custom Configuration (appsettings.json)\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EKey\u003C/th\u003E\u003Cth\u003EDescription\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EEnable separate backoffice domain\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Url\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EBackoffice domain(s), comma-separated\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:RememberLanguage:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EEnable cookie-based language persistence\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:DefaultCulture\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EFallback culture when no language cookie/URL is present\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" } } ] @@ -287,7 +287,7 @@ "expose": [], "layout": {} }, - "markup": "\u003Ch2\u003EC\u1EA5u h\u00ECnh Ng\u00F4n ng\u1EEF \u0026 \u0110a ng\u00F4n ng\u1EEF\u003C/h2\u003E\u003Ch3\u003ECulture and Hostnames\u003C/h3\u003E\u003Cp\u003EuTPro cung c\u1EA5p c\u1EA5u h\u00ECnh \u0111a ng\u00F4n ng\u1EEF b\u1EB1ng \u003Cstrong\u003Ecookie\u003C/strong\u003E. B\u1EA1n c\u00F3 th\u1EC3 t\u00ECm c\u00E0i \u0111\u1EB7t \u0022Culture and Hostnames\u0022 trong node \u0022Home\u0022 (\u003Cstrong\u003EuTPro \u2192 Sites \u2192 Home\u003C/strong\u003E).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-culture-hostnames.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh Culture and Hostnames\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003EQUAN TR\u1ECENG:\u003C/strong\u003E \u0110\u1EA3m b\u1EA3o ng\u00F4n ng\u1EEF m\u1EB7c \u0111\u1ECBnh (ng\u01B0\u1EDDi d\u00F9ng truy c\u1EADp l\u1EA7n \u0111\u1EA7u kh\u00F4ng c\u00F3 cookie) \u0111\u01B0\u1EE3c \u0111\u1EB7t cu\u1ED1i v\u1EDBi \u0022/\u0022 m\u1EB7c \u0111\u1ECBnh. M\u1ED7i ng\u00F4n ng\u1EEF ph\u1EA3i c\u00F3 hostname ri\u00EAng \u0111\u1EC3 Remember Language ho\u1EA1t \u0111\u1ED9ng.\u003C/p\u003E\u003Cp\u003EC\u00F3 th\u1EC3 t\u1EAFt t\u00EDnh n\u0103ng n\u00E0y b\u1EB1ng c\u00E1ch \u0111\u1EB7t \u003Cstrong\u003EEnabled: \u0022false\u0022\u003C/strong\u003E cho \u003Cstrong\u003ERememberLanguage\u003C/strong\u003E:\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-remember-language-disable.png\u0022 alt=\u0022T\u1EAFt Remember Language\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ET\u00E1ch Backoffice v\u00E0 Website\u003C/h3\u003E\u003Cp\u003EB\u1EA1n c\u00F3 th\u1EC3 t\u00E1ch Backoffice v\u00E0 Website th\u00E0nh 2 domain ri\u00EAng. Sau khi b\u1EADt v\u00E0 c\u1EA5u h\u00ECnh domain cho Backoffice, th\u1EED truy c\u1EADp domain Website k\u00E8m \u0022/umbraco\u0022 \u0111\u1EC3 ki\u1EC3m tra.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://raw.githubusercontent.com/T4VN/uTPro/refs/heads/gh-pages/docs/screenshots/config-backoffice-domain.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh domain Backoffice\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EC\u1EA5u h\u00ECnh t\u00F9y ch\u1EC9nh (appsettings.json)\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EKey\u003C/th\u003E\u003Cth\u003EM\u00F4 t\u1EA3\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EB\u1EADt t\u00E1ch domain backoffice\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Url\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EDomain backoffice, ph\u00E2n c\u00E1ch b\u1EB1ng d\u1EA5u ph\u1EA9y\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:RememberLanguage:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EB\u1EADt l\u01B0u ng\u00F4n ng\u1EEF theo cookie\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:DefaultCulture\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ECulture m\u1EB7c \u0111\u1ECBnh khi kh\u00F4ng c\u00F3 cookie/URL\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" + "markup": "\u003Ch2\u003EC\u1EA5u h\u00ECnh Ng\u00F4n ng\u1EEF \u0026 \u0110a ng\u00F4n ng\u1EEF\u003C/h2\u003E\u003Ch3\u003ECulture and Hostnames\u003C/h3\u003E\u003Cp\u003EuTPro cung c\u1EA5p c\u1EA5u h\u00ECnh \u0111a ng\u00F4n ng\u1EEF b\u1EB1ng \u003Cstrong\u003Ecookie\u003C/strong\u003E. B\u1EA1n c\u00F3 th\u1EC3 t\u00ECm c\u00E0i \u0111\u1EB7t \u0022Culture and Hostnames\u0022 trong node \u0022Home\u0022 (\u003Cstrong\u003EuTPro \u2192 Sites \u2192 Home\u003C/strong\u003E).\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-culture-hostnames.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh Culture and Hostnames\u0022 /\u003E\u003C/p\u003E\u003Cp\u003E\u003Cstrong\u003EQUAN TR\u1ECENG:\u003C/strong\u003E \u0110\u1EA3m b\u1EA3o ng\u00F4n ng\u1EEF m\u1EB7c \u0111\u1ECBnh (ng\u01B0\u1EDDi d\u00F9ng truy c\u1EADp l\u1EA7n \u0111\u1EA7u kh\u00F4ng c\u00F3 cookie) \u0111\u01B0\u1EE3c \u0111\u1EB7t cu\u1ED1i v\u1EDBi \u0022/\u0022 m\u1EB7c \u0111\u1ECBnh. M\u1ED7i ng\u00F4n ng\u1EEF ph\u1EA3i c\u00F3 hostname ri\u00EAng \u0111\u1EC3 Remember Language ho\u1EA1t \u0111\u1ED9ng.\u003C/p\u003E\u003Cp\u003EC\u00F3 th\u1EC3 t\u1EAFt t\u00EDnh n\u0103ng n\u00E0y b\u1EB1ng c\u00E1ch \u0111\u1EB7t \u003Cstrong\u003EEnabled: \u0022false\u0022\u003C/strong\u003E cho \u003Cstrong\u003ERememberLanguage\u003C/strong\u003E:\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-remember-language-disable.png\u0022 alt=\u0022T\u1EAFt Remember Language\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003ET\u00E1ch Backoffice v\u00E0 Website\u003C/h3\u003E\u003Cp\u003EB\u1EA1n c\u00F3 th\u1EC3 t\u00E1ch Backoffice v\u00E0 Website th\u00E0nh 2 domain ri\u00EAng. Sau khi b\u1EADt v\u00E0 c\u1EA5u h\u00ECnh domain cho Backoffice, th\u1EED truy c\u1EADp domain Website k\u00E8m \u0022/umbraco\u0022 \u0111\u1EC3 ki\u1EC3m tra.\u003C/p\u003E\u003Cp\u003E\u003Cimg src=\u0022https://docs.utpro.dev/docs/screenshots/config-backoffice-domain.png\u0022 alt=\u0022C\u1EA5u h\u00ECnh domain Backoffice\u0022 /\u003E\u003C/p\u003E\u003Ch3\u003EC\u1EA5u h\u00ECnh t\u00F9y ch\u1EC9nh (appsettings.json)\u003C/h3\u003E\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EKey\u003C/th\u003E\u003Cth\u003EM\u00F4 t\u1EA3\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EB\u1EADt t\u00E1ch domain backoffice\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:Backoffice:Url\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EDomain backoffice, ph\u00E2n c\u00E1ch b\u1EB1ng d\u1EA5u ph\u1EA9y\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:RememberLanguage:Enabled\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EB\u1EADt l\u01B0u ng\u00F4n ng\u1EEF theo cookie\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003EuTPro:DefaultCulture\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003ECulture m\u1EB7c \u0111\u1ECBnh khi kh\u00F4ng c\u00F3 cookie/URL\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E" } } ] From c37cad5197524fd9c342a8844841b05177d7378f Mon Sep 17 00:00:00 2001 From: Nguyen Thien Tu <15050790+thientu995@users.noreply.github.com> Date: Tue, 25 Aug 2026 14:33:24 +0700 Subject: [PATCH 2/4] update docker --- uTPro/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/uTPro/Dockerfile b/uTPro/Dockerfile index 5f378db5..38afba2d 100644 --- a/uTPro/Dockerfile +++ b/uTPro/Dockerfile @@ -60,9 +60,11 @@ COPY --from=build /app/publish . ENV ASPNETCORE_ENVIRONMENT=Production ENV PORT=10000 -# Create a non-root user and grant it ownership of the app + writable temp dirs -RUN groupadd --system --gid 1000 appgroup \ - && useradd --system --uid 1000 --gid appgroup --no-create-home appuser \ +# Create a non-root user and grant it ownership of the app + writable temp dirs. +# Use --force so groupadd is a no-op if GID 1000 already exists in the base image, +# and use the -o (non-unique) flag on useradd to tolerate a pre-existing UID 1000. +RUN groupadd --system --gid 1000 --force appgroup \ + && useradd --system --uid 1000 -o --gid appgroup --no-create-home appuser \ && chown -R appuser:appgroup /app /tmp/umbraco USER appuser From b89b877a68a2680c09e424f07e03b47364c2c2b8 Mon Sep 17 00:00:00 2001 From: Nguyen Thien Tu <15050790+thientu995@users.noreply.github.com> Date: Fri, 28 Aug 2026 13:34:22 +0700 Subject: [PATCH 3/4] V17/dev (#306) * add validate DI * fix override color * update nuget * update defaule language --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../App_Plugins/utpro-cms-screen/style.css | 18 +- uTPro/Project/uTPro.Project.Web/Program.cs | 12 + .../uSync/v17/Content/home.config | 2590 +++++++++++++++++ .../v17/Content/trang-ch\341\273\247.config" | 2590 +---------------- .../v17/Domains/utpro.local_en-us.config | 8 + .../v17/Domains/utpro.local_vi-vn.config | 8 +- .../uSync/v17/Languages/en-us.config | 5 +- .../uSync/v17/Languages/vi-vn.config | 3 +- .../uTPro.Project.Web.csproj | 6 +- 9 files changed, 2628 insertions(+), 2612 deletions(-) create mode 100644 uTPro/Project/uTPro.Project.Web/uSync/v17/Content/home.config create mode 100644 uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_en-us.config diff --git a/uTPro/Feature/uTPro.Feature.Dashboard/App_Plugins/utpro-cms-screen/style.css b/uTPro/Feature/uTPro.Feature.Dashboard/App_Plugins/utpro-cms-screen/style.css index 40f89a82..8ba05a5d 100644 --- a/uTPro/Feature/uTPro.Feature.Dashboard/App_Plugins/utpro-cms-screen/style.css +++ b/uTPro/Feature/uTPro.Feature.Dashboard/App_Plugins/utpro-cms-screen/style.css @@ -1,13 +1,13 @@ :root { - --umb-login-primary-color: #f6821f; - --uui-color-header-surface: #f6821f; - --umb-login-greeting-color: #D9A44C; - --uui-color-default-emphasis: #D9A44C; - --uui-show-focus-outline: #ff9e40; - --uui-color-default: #f6821f; - --uui-color-current: #FFCE40; - /* --uui-palette-violet-blue: #f6821f; */ - /* --uui-button-contrast: #000; */ + --umb-login-primary-color: #f6821f !important; + --uui-color-header-surface: #f6821f !important; + --umb-login-greeting-color: #D9A44C !important; + --uui-color-default-emphasis: #D9A44C !important; + --uui-show-focus-outline: #ff9e40 !important; + --uui-color-default: #f6821f !important; + --uui-color-current: #FFCE40 !important; + /* --uui-palette-violet-blue: #f6821f !important; */ + /* --uui-button-contrast: #000 !important; */ --umb-login-curves-display: none; --umb-header-logo-display: none; --umb-login-header-font-size-large: 2rem; diff --git a/uTPro/Project/uTPro.Project.Web/Program.cs b/uTPro/Project/uTPro.Project.Web/Program.cs index f082e429..6e2d8457 100644 --- a/uTPro/Project/uTPro.Project.Web/Program.cs +++ b/uTPro/Project/uTPro.Project.Web/Program.cs @@ -7,6 +7,18 @@ var setup = HostingSetup.BuildWebApplicationOptions(args); var builder = WebApplication.CreateBuilder(setup); +#if DEBUG +// Enable DI container validation in Debug mode only. +// - ValidateScopes: throws if a Scoped service is resolved from the root provider (e.g. injecting scoped into singleton). +// - ValidateOnBuild: throws at Build() if any service has missing or unresolvable dependencies. +// Catches DI misconfigurations early during development instead of failing silently at runtime. +builder.Host.UseDefaultServiceProvider((context, options) => +{ + options.ValidateScopes = true; + options.ValidateOnBuild = true; +}); +#endif + // Expose the resolved web/content root to PathFolder (a DI-less static helper) so code // that locates files via PathFolder respects the configured RootPath instead of assuming // the default wwwroot under the process current directory. diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/home.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/home.config new file mode 100644 index 00000000..7900f57b --- /dev/null +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/home.config @@ -0,0 +1,2590 @@ + + + + Sites + /uTPro/Sites/Home + false + uTPro__PageHome + 2025-07-11T14:09:13 + + Home + Trang chủ + + 0 + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/trang-ch\341\273\247.config" "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/trang-ch\341\273\247.config" index 7421f958..763662c3 100644 --- "a/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/trang-ch\341\273\247.config" +++ "b/uTPro/Project/uTPro.Project.Web/uSync/v17/Content/trang-ch\341\273\247.config" @@ -1,2590 +1,2 @@  - - - Sites - /uTPro/Sites/TrangChu - false - uTPro__PageHome - 2025-07-11T14:09:13 - - Home - Trang chủ - - 0 - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_en-us.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_en-us.config new file mode 100644 index 00000000..f2fa151b --- /dev/null +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_en-us.config @@ -0,0 +1,8 @@ + + + + false + en-US + /uTPro/Sites/Trang chủ + + \ No newline at end of file diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_vi-vn.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_vi-vn.config index 7c9dbba5..6aceb9f3 100644 --- a/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_vi-vn.config +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Domains/utpro.local_vi-vn.config @@ -1,8 +1,2 @@  - - - false - vi-VN - /uTPro/Sites/Trang chủ - - \ No newline at end of file + \ No newline at end of file diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/en-us.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/en-us.config index 8ef35095..c189d7f6 100644 --- a/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/en-us.config +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/en-us.config @@ -2,7 +2,6 @@ English (United States) en-US - false - false - vi-VN + true + true \ No newline at end of file diff --git a/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/vi-vn.config b/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/vi-vn.config index c4e8c618..4f17b72f 100644 --- a/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/vi-vn.config +++ b/uTPro/Project/uTPro.Project.Web/uSync/v17/Languages/vi-vn.config @@ -3,5 +3,6 @@ Vietnamese (Vietnam) vi-VN true - true + false + en-US \ No newline at end of file diff --git a/uTPro/Project/uTPro.Project.Web/uTPro.Project.Web.csproj b/uTPro/Project/uTPro.Project.Web/uTPro.Project.Web.csproj index de1d74b6..4ca4f871 100644 --- a/uTPro/Project/uTPro.Project.Web/uTPro.Project.Web.csproj +++ b/uTPro/Project/uTPro.Project.Web/uTPro.Project.Web.csproj @@ -6,7 +6,7 @@ true false - 17.11.3 + 17.11.4 @@ -21,8 +21,8 @@ - - + + From 95ccf3b77a202f181a09cdd033f608aa26aa9710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:15:38 +0000 Subject: [PATCH 4/4] Bump github/codeql-action from 4.37.8 to 4.37.9 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.8 to 4.37.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.37.8...v4.37.9) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.37.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/defender-for-devops.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f05e5ba6..cbcf2f4d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -69,7 +69,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.8 + uses: github/codeql-action/init@v4.37.9 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -98,6 +98,6 @@ jobs: exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.8 + uses: github/codeql-action/analyze@v4.37.9 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/defender-for-devops.yml b/.github/workflows/defender-for-devops.yml index 12f718d0..6b78b404 100644 --- a/.github/workflows/defender-for-devops.yml +++ b/.github/workflows/defender-for-devops.yml @@ -45,6 +45,6 @@ jobs: uses: microsoft/security-devops-action@v1.12.0 id: msdo - name: Upload results to Security tab - uses: github/codeql-action/upload-sarif@v4.37.8 + uses: github/codeql-action/upload-sarif@v4.37.9 with: sarif_file: ${{ steps.msdo.outputs.sarifFile }}