From 1fd11c23a34fb80abca89f2c6c6f788e1b89067f Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Mon, 15 Dec 2025 15:35:01 +0330 Subject: [PATCH 1/6] add OmniboxSpecialAction for help import (cherry picked from commit bde3712350811ce99227a0505b5e88664821437b) --- Extensions/Signum.Help/HelpClient.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Extensions/Signum.Help/HelpClient.tsx b/Extensions/Signum.Help/HelpClient.tsx index 29d8b66778..4870fe4989 100644 --- a/Extensions/Signum.Help/HelpClient.tsx +++ b/Extensions/Signum.Help/HelpClient.tsx @@ -12,6 +12,7 @@ import { NamespaceHelpEntity, TypeHelpEntity, AppendixHelpEntity, QueryHelpEntit import { QueryString } from '@framework/QueryString'; import { OmniboxClient } from '../Signum.Omnibox/OmniboxClient'; import HelpOmniboxProvider from './HelpOmniboxProvider'; +import * as OmniboxSpecialAction from '@framework/OmniboxSpecialAction' import { CultureInfoEntity } from '@framework/Signum.Basics'; import { WidgetContext, onWidgets } from '@framework/Frames/Widgets'; import { HelpIcon, HelpWidget } from './HelpWidget'; @@ -28,6 +29,12 @@ export namespace HelpClient { OmniboxClient.registerProvider(new HelpOmniboxProvider()); + OmniboxSpecialAction.registerSpecialAction({ + allowed: () => AppContext.isPermissionAuthorized(HelpPermissions.ExportHelp), + key: "ImportHelp", + onClick: () => Promise.resolve("/help/import") + }); + options.routes.push({ path: "/help", element: import("./Pages/HelpIndexPage")} /> }); options.routes.push({ path: "/help/namespace/:namespace", element: import("./Pages/NamespaceHelpPage")} /> }); options.routes.push({ path: "/help/type/:cleanName", element: import("./Pages/TypeHelpPage")} /> }); From 31f5e5f12b2877ae90e4f57bbf3fefabf4b38492 Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Mon, 15 Dec 2025 18:09:15 +0330 Subject: [PATCH 2/6] update Signum.TSGenerator to 10.0.3 - to enable manual TSGenerator run --- Extensions/Signum.Alerts/Signum.Alerts.csproj | 2 +- .../Signum.Authorization.ActiveDirectory.csproj | 2 +- .../Signum.Authorization.ResetPassword.csproj | 2 +- Extensions/Signum.Authorization/Signum.Authorization.csproj | 2 +- Extensions/Signum.Caching/Signum.Caching.csproj | 2 +- Extensions/Signum.Calendar/Signum.Calendar.csproj | 2 +- Extensions/Signum.Chart/Signum.Chart.csproj | 2 +- Extensions/Signum.CodeMirror/Signum.CodeMirror.csproj | 2 +- Extensions/Signum.ConcurrentUser/Signum.ConcurrentUser.csproj | 2 +- Extensions/Signum.Dashboard/Signum.Dashboard.csproj | 2 +- Extensions/Signum.DiffLog/Signum.DiffLog.csproj | 2 +- Extensions/Signum.Dynamic/Signum.Dynamic.csproj | 2 +- Extensions/Signum.Eval/Signum.Eval.csproj | 2 +- Extensions/Signum.Excel/Signum.Excel.csproj | 2 +- Extensions/Signum.Files/Signum.Files.csproj | 2 +- Extensions/Signum.Help/Signum.Help.csproj | 2 +- Extensions/Signum.HtmlEditor/Signum.HtmlEditor.csproj | 2 +- Extensions/Signum.Isolation/Signum.Isolation.csproj | 2 +- Extensions/Signum.MachineLearning/Signum.MachineLearning.csproj | 2 +- .../Signum.Mailing.ExchangeWS/Signum.Mailing.ExchangeWS.csproj | 2 +- .../Signum.Mailing.MicrosoftGraph.csproj | 2 +- Extensions/Signum.Mailing.Pop3/Signum.Mailing.Pop3.csproj | 2 +- Extensions/Signum.Mailing/Signum.Mailing.csproj | 2 +- Extensions/Signum.Map/Signum.Map.csproj | 2 +- Extensions/Signum.Migrations/Signum.Migrations.csproj | 2 +- Extensions/Signum.Notes/Signum.Notes.csproj | 2 +- Extensions/Signum.Omnibox/Signum.Omnibox.csproj | 2 +- Extensions/Signum.Printing/Signum.Printing.csproj | 2 +- Extensions/Signum.Processes/Signum.Processes.csproj | 2 +- Extensions/Signum.Profiler/Signum.Profiler.csproj | 2 +- Extensions/Signum.Rest/Signum.Rest.csproj | 2 +- Extensions/Signum.SMS/Signum.SMS.csproj | 2 +- Extensions/Signum.Scheduler/Signum.Scheduler.csproj | 2 +- Extensions/Signum.Templating/Signum.Templating.csproj | 2 +- Extensions/Signum.TimeMachine/Signum.TimeMachine.csproj | 2 +- Extensions/Signum.Toolbar/Signum.Toolbar.csproj | 2 +- Extensions/Signum.Translation/Signum.Translation.csproj | 2 +- Extensions/Signum.Tree/Signum.Tree.csproj | 2 +- Extensions/Signum.UserAssets/Signum.UserAssets.csproj | 2 +- Extensions/Signum.UserQueries/Signum.UserQueries.csproj | 2 +- Extensions/Signum.ViewLog/Signum.ViewLog.csproj | 2 +- Extensions/Signum.WhatsNew/Signum.WhatsNew.csproj | 2 +- Extensions/Signum.Word/Signum.Word.csproj | 2 +- Extensions/Signum.Workflow/Signum.Workflow.csproj | 2 +- Extensions/Signum.WorkflowDynamic/Signum.WorkflowDynamic.csproj | 2 +- Signum/Signum.csproj | 2 +- 46 files changed, 46 insertions(+), 46 deletions(-) diff --git a/Extensions/Signum.Alerts/Signum.Alerts.csproj b/Extensions/Signum.Alerts/Signum.Alerts.csproj index c93733b75b..2828d73288 100644 --- a/Extensions/Signum.Alerts/Signum.Alerts.csproj +++ b/Extensions/Signum.Alerts/Signum.Alerts.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Authorization.ActiveDirectory/Signum.Authorization.ActiveDirectory.csproj b/Extensions/Signum.Authorization.ActiveDirectory/Signum.Authorization.ActiveDirectory.csproj index 32c8976e62..8d24e0184d 100644 --- a/Extensions/Signum.Authorization.ActiveDirectory/Signum.Authorization.ActiveDirectory.csproj +++ b/Extensions/Signum.Authorization.ActiveDirectory/Signum.Authorization.ActiveDirectory.csproj @@ -20,7 +20,7 @@ - + diff --git a/Extensions/Signum.Authorization.ResetPassword/Signum.Authorization.ResetPassword.csproj b/Extensions/Signum.Authorization.ResetPassword/Signum.Authorization.ResetPassword.csproj index 7404733029..51da79c0c9 100644 --- a/Extensions/Signum.Authorization.ResetPassword/Signum.Authorization.ResetPassword.csproj +++ b/Extensions/Signum.Authorization.ResetPassword/Signum.Authorization.ResetPassword.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Authorization/Signum.Authorization.csproj b/Extensions/Signum.Authorization/Signum.Authorization.csproj index 692f96943d..b9f22fc2ef 100644 --- a/Extensions/Signum.Authorization/Signum.Authorization.csproj +++ b/Extensions/Signum.Authorization/Signum.Authorization.csproj @@ -16,7 +16,7 @@ - + diff --git a/Extensions/Signum.Caching/Signum.Caching.csproj b/Extensions/Signum.Caching/Signum.Caching.csproj index 7eae3d9165..67a5ea8d19 100644 --- a/Extensions/Signum.Caching/Signum.Caching.csproj +++ b/Extensions/Signum.Caching/Signum.Caching.csproj @@ -18,7 +18,7 @@ - + diff --git a/Extensions/Signum.Calendar/Signum.Calendar.csproj b/Extensions/Signum.Calendar/Signum.Calendar.csproj index b6311b601c..138d48c20b 100644 --- a/Extensions/Signum.Calendar/Signum.Calendar.csproj +++ b/Extensions/Signum.Calendar/Signum.Calendar.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Chart/Signum.Chart.csproj b/Extensions/Signum.Chart/Signum.Chart.csproj index fc6df4e82b..e7c0b9d2b7 100644 --- a/Extensions/Signum.Chart/Signum.Chart.csproj +++ b/Extensions/Signum.Chart/Signum.Chart.csproj @@ -113,7 +113,7 @@ - + diff --git a/Extensions/Signum.CodeMirror/Signum.CodeMirror.csproj b/Extensions/Signum.CodeMirror/Signum.CodeMirror.csproj index 8e1b919df9..d178918a5c 100644 --- a/Extensions/Signum.CodeMirror/Signum.CodeMirror.csproj +++ b/Extensions/Signum.CodeMirror/Signum.CodeMirror.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.ConcurrentUser/Signum.ConcurrentUser.csproj b/Extensions/Signum.ConcurrentUser/Signum.ConcurrentUser.csproj index 24d63ebd37..2100be197c 100644 --- a/Extensions/Signum.ConcurrentUser/Signum.ConcurrentUser.csproj +++ b/Extensions/Signum.ConcurrentUser/Signum.ConcurrentUser.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Dashboard/Signum.Dashboard.csproj b/Extensions/Signum.Dashboard/Signum.Dashboard.csproj index df81aeef78..c4c1e44108 100644 --- a/Extensions/Signum.Dashboard/Signum.Dashboard.csproj +++ b/Extensions/Signum.Dashboard/Signum.Dashboard.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.DiffLog/Signum.DiffLog.csproj b/Extensions/Signum.DiffLog/Signum.DiffLog.csproj index 268bc9192f..e90521bf2f 100644 --- a/Extensions/Signum.DiffLog/Signum.DiffLog.csproj +++ b/Extensions/Signum.DiffLog/Signum.DiffLog.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Dynamic/Signum.Dynamic.csproj b/Extensions/Signum.Dynamic/Signum.Dynamic.csproj index f61f65d4b1..6238a873e5 100644 --- a/Extensions/Signum.Dynamic/Signum.Dynamic.csproj +++ b/Extensions/Signum.Dynamic/Signum.Dynamic.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Eval/Signum.Eval.csproj b/Extensions/Signum.Eval/Signum.Eval.csproj index acebda49c2..9bc9672b58 100644 --- a/Extensions/Signum.Eval/Signum.Eval.csproj +++ b/Extensions/Signum.Eval/Signum.Eval.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Excel/Signum.Excel.csproj b/Extensions/Signum.Excel/Signum.Excel.csproj index 81cbbf4b7e..d6cb26fa6c 100644 --- a/Extensions/Signum.Excel/Signum.Excel.csproj +++ b/Extensions/Signum.Excel/Signum.Excel.csproj @@ -23,7 +23,7 @@ - + diff --git a/Extensions/Signum.Files/Signum.Files.csproj b/Extensions/Signum.Files/Signum.Files.csproj index 582a75586c..42c09b2be2 100644 --- a/Extensions/Signum.Files/Signum.Files.csproj +++ b/Extensions/Signum.Files/Signum.Files.csproj @@ -16,7 +16,7 @@ - + diff --git a/Extensions/Signum.Help/Signum.Help.csproj b/Extensions/Signum.Help/Signum.Help.csproj index 86335a0089..bd5b5a8b2f 100644 --- a/Extensions/Signum.Help/Signum.Help.csproj +++ b/Extensions/Signum.Help/Signum.Help.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.HtmlEditor/Signum.HtmlEditor.csproj b/Extensions/Signum.HtmlEditor/Signum.HtmlEditor.csproj index 8e1b919df9..d178918a5c 100644 --- a/Extensions/Signum.HtmlEditor/Signum.HtmlEditor.csproj +++ b/Extensions/Signum.HtmlEditor/Signum.HtmlEditor.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Isolation/Signum.Isolation.csproj b/Extensions/Signum.Isolation/Signum.Isolation.csproj index e85d11f87b..9463f08686 100644 --- a/Extensions/Signum.Isolation/Signum.Isolation.csproj +++ b/Extensions/Signum.Isolation/Signum.Isolation.csproj @@ -19,7 +19,7 @@ - + diff --git a/Extensions/Signum.MachineLearning/Signum.MachineLearning.csproj b/Extensions/Signum.MachineLearning/Signum.MachineLearning.csproj index 3d5e5db602..357b4ee9ec 100644 --- a/Extensions/Signum.MachineLearning/Signum.MachineLearning.csproj +++ b/Extensions/Signum.MachineLearning/Signum.MachineLearning.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Mailing.ExchangeWS/Signum.Mailing.ExchangeWS.csproj b/Extensions/Signum.Mailing.ExchangeWS/Signum.Mailing.ExchangeWS.csproj index 78ab6fb79e..8063859c43 100644 --- a/Extensions/Signum.Mailing.ExchangeWS/Signum.Mailing.ExchangeWS.csproj +++ b/Extensions/Signum.Mailing.ExchangeWS/Signum.Mailing.ExchangeWS.csproj @@ -14,7 +14,7 @@ - + diff --git a/Extensions/Signum.Mailing.MicrosoftGraph/Signum.Mailing.MicrosoftGraph.csproj b/Extensions/Signum.Mailing.MicrosoftGraph/Signum.Mailing.MicrosoftGraph.csproj index e0bd276abd..3ef8a1dfd2 100644 --- a/Extensions/Signum.Mailing.MicrosoftGraph/Signum.Mailing.MicrosoftGraph.csproj +++ b/Extensions/Signum.Mailing.MicrosoftGraph/Signum.Mailing.MicrosoftGraph.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Mailing.Pop3/Signum.Mailing.Pop3.csproj b/Extensions/Signum.Mailing.Pop3/Signum.Mailing.Pop3.csproj index 6b41e2c0a7..078a64b4c6 100644 --- a/Extensions/Signum.Mailing.Pop3/Signum.Mailing.Pop3.csproj +++ b/Extensions/Signum.Mailing.Pop3/Signum.Mailing.Pop3.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Mailing/Signum.Mailing.csproj b/Extensions/Signum.Mailing/Signum.Mailing.csproj index 2247efe3d8..62675d2c4b 100644 --- a/Extensions/Signum.Mailing/Signum.Mailing.csproj +++ b/Extensions/Signum.Mailing/Signum.Mailing.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Map/Signum.Map.csproj b/Extensions/Signum.Map/Signum.Map.csproj index f4dcac4ff6..1d4280a609 100644 --- a/Extensions/Signum.Map/Signum.Map.csproj +++ b/Extensions/Signum.Map/Signum.Map.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Migrations/Signum.Migrations.csproj b/Extensions/Signum.Migrations/Signum.Migrations.csproj index 3a3863d2cd..ec81a139fc 100644 --- a/Extensions/Signum.Migrations/Signum.Migrations.csproj +++ b/Extensions/Signum.Migrations/Signum.Migrations.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Notes/Signum.Notes.csproj b/Extensions/Signum.Notes/Signum.Notes.csproj index 268bc9192f..e90521bf2f 100644 --- a/Extensions/Signum.Notes/Signum.Notes.csproj +++ b/Extensions/Signum.Notes/Signum.Notes.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Omnibox/Signum.Omnibox.csproj b/Extensions/Signum.Omnibox/Signum.Omnibox.csproj index 882938999f..829f46266b 100644 --- a/Extensions/Signum.Omnibox/Signum.Omnibox.csproj +++ b/Extensions/Signum.Omnibox/Signum.Omnibox.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Printing/Signum.Printing.csproj b/Extensions/Signum.Printing/Signum.Printing.csproj index b481a4adfe..8bdf990e6e 100644 --- a/Extensions/Signum.Printing/Signum.Printing.csproj +++ b/Extensions/Signum.Printing/Signum.Printing.csproj @@ -14,7 +14,7 @@ - + diff --git a/Extensions/Signum.Processes/Signum.Processes.csproj b/Extensions/Signum.Processes/Signum.Processes.csproj index 24d63ebd37..2100be197c 100644 --- a/Extensions/Signum.Processes/Signum.Processes.csproj +++ b/Extensions/Signum.Processes/Signum.Processes.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Profiler/Signum.Profiler.csproj b/Extensions/Signum.Profiler/Signum.Profiler.csproj index 268bc9192f..e90521bf2f 100644 --- a/Extensions/Signum.Profiler/Signum.Profiler.csproj +++ b/Extensions/Signum.Profiler/Signum.Profiler.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Rest/Signum.Rest.csproj b/Extensions/Signum.Rest/Signum.Rest.csproj index bc80455939..7872fcc8ab 100644 --- a/Extensions/Signum.Rest/Signum.Rest.csproj +++ b/Extensions/Signum.Rest/Signum.Rest.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.SMS/Signum.SMS.csproj b/Extensions/Signum.SMS/Signum.SMS.csproj index 1d01a301c5..8e3873dafc 100644 --- a/Extensions/Signum.SMS/Signum.SMS.csproj +++ b/Extensions/Signum.SMS/Signum.SMS.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Scheduler/Signum.Scheduler.csproj b/Extensions/Signum.Scheduler/Signum.Scheduler.csproj index d3b5414cd9..67e95b07b6 100644 --- a/Extensions/Signum.Scheduler/Signum.Scheduler.csproj +++ b/Extensions/Signum.Scheduler/Signum.Scheduler.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Templating/Signum.Templating.csproj b/Extensions/Signum.Templating/Signum.Templating.csproj index 736acafcc2..5e88ef2b5d 100644 --- a/Extensions/Signum.Templating/Signum.Templating.csproj +++ b/Extensions/Signum.Templating/Signum.Templating.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.TimeMachine/Signum.TimeMachine.csproj b/Extensions/Signum.TimeMachine/Signum.TimeMachine.csproj index d992e86a7b..2a38694404 100644 --- a/Extensions/Signum.TimeMachine/Signum.TimeMachine.csproj +++ b/Extensions/Signum.TimeMachine/Signum.TimeMachine.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Toolbar/Signum.Toolbar.csproj b/Extensions/Signum.Toolbar/Signum.Toolbar.csproj index 5fe2ea3b1e..2f37c0d4ee 100644 --- a/Extensions/Signum.Toolbar/Signum.Toolbar.csproj +++ b/Extensions/Signum.Toolbar/Signum.Toolbar.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Translation/Signum.Translation.csproj b/Extensions/Signum.Translation/Signum.Translation.csproj index c6c8ee2bc9..ff2a844130 100644 --- a/Extensions/Signum.Translation/Signum.Translation.csproj +++ b/Extensions/Signum.Translation/Signum.Translation.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Tree/Signum.Tree.csproj b/Extensions/Signum.Tree/Signum.Tree.csproj index 96c3fd658b..53ded02c4d 100644 --- a/Extensions/Signum.Tree/Signum.Tree.csproj +++ b/Extensions/Signum.Tree/Signum.Tree.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.UserAssets/Signum.UserAssets.csproj b/Extensions/Signum.UserAssets/Signum.UserAssets.csproj index e81baf5beb..9e10d9e47c 100644 --- a/Extensions/Signum.UserAssets/Signum.UserAssets.csproj +++ b/Extensions/Signum.UserAssets/Signum.UserAssets.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.UserQueries/Signum.UserQueries.csproj b/Extensions/Signum.UserQueries/Signum.UserQueries.csproj index f97525c5fc..6eab08a298 100644 --- a/Extensions/Signum.UserQueries/Signum.UserQueries.csproj +++ b/Extensions/Signum.UserQueries/Signum.UserQueries.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.ViewLog/Signum.ViewLog.csproj b/Extensions/Signum.ViewLog/Signum.ViewLog.csproj index 268bc9192f..e90521bf2f 100644 --- a/Extensions/Signum.ViewLog/Signum.ViewLog.csproj +++ b/Extensions/Signum.ViewLog/Signum.ViewLog.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.WhatsNew/Signum.WhatsNew.csproj b/Extensions/Signum.WhatsNew/Signum.WhatsNew.csproj index 2659f99c9d..e25d519864 100644 --- a/Extensions/Signum.WhatsNew/Signum.WhatsNew.csproj +++ b/Extensions/Signum.WhatsNew/Signum.WhatsNew.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.Word/Signum.Word.csproj b/Extensions/Signum.Word/Signum.Word.csproj index 84248f4f84..c7ca951275 100644 --- a/Extensions/Signum.Word/Signum.Word.csproj +++ b/Extensions/Signum.Word/Signum.Word.csproj @@ -19,7 +19,7 @@ - + diff --git a/Extensions/Signum.Workflow/Signum.Workflow.csproj b/Extensions/Signum.Workflow/Signum.Workflow.csproj index 82e818449b..c0a6d5a45a 100644 --- a/Extensions/Signum.Workflow/Signum.Workflow.csproj +++ b/Extensions/Signum.Workflow/Signum.Workflow.csproj @@ -15,7 +15,7 @@ - + diff --git a/Extensions/Signum.WorkflowDynamic/Signum.WorkflowDynamic.csproj b/Extensions/Signum.WorkflowDynamic/Signum.WorkflowDynamic.csproj index 3d6c809613..1b3e92993c 100644 --- a/Extensions/Signum.WorkflowDynamic/Signum.WorkflowDynamic.csproj +++ b/Extensions/Signum.WorkflowDynamic/Signum.WorkflowDynamic.csproj @@ -14,7 +14,7 @@ - + diff --git a/Signum/Signum.csproj b/Signum/Signum.csproj index c06ffb05a1..590b29db9a 100644 --- a/Signum/Signum.csproj +++ b/Signum/Signum.csproj @@ -32,7 +32,7 @@ - + From f9742f9e96d2d3a3e84b00a326b920a219a5ac45 Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Wed, 17 Dec 2025 17:06:42 +0330 Subject: [PATCH 3/6] rename to handler --- Extensions/Signum.Help/Editor/HelpImageNode.tsx | 2 +- .../Extensions/ImageExtension/ImageNodeBase.tsx | 6 +++--- .../Signum.HtmlEditor/Extensions/ImageExtension/index.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Extensions/Signum.Help/Editor/HelpImageNode.tsx b/Extensions/Signum.Help/Editor/HelpImageNode.tsx index e3bc1d3eff..46a2801fde 100644 --- a/Extensions/Signum.Help/Editor/HelpImageNode.tsx +++ b/Extensions/Signum.Help/Editor/HelpImageNode.tsx @@ -4,8 +4,8 @@ import { ImageInfo } from '../../Signum.HtmlEditor/Extensions/ImageExtension/Ima export class HelpImageNode extends ImageNodeBase { static { - this.converter = new HelpImageHandler(); this.dataImageIdAttribute = "data-help-image-id"; + this.handler = new HelpImageHandler(); } static getType(): string { diff --git a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageNodeBase.tsx b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageNodeBase.tsx index f9531e0946..eb6aca3f0c 100644 --- a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageNodeBase.tsx +++ b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageNodeBase.tsx @@ -8,10 +8,10 @@ export class ImageNodeBase extends DecoratorNode { static dataImageIdAttribute: string; - static converter: ImageHandlerBase; + static handler: ImageHandlerBase; getHandler(): ImageHandlerBase { - return (this.constructor as typeof ImageNodeBase).converter; + return (this.constructor as typeof ImageNodeBase).handler; } constructor(public imageInfo: ImageInfo, key?: NodeKey) { @@ -50,7 +50,7 @@ export class ImageNodeBase extends DecoratorNode { priority: 1, conversion: (element: HTMLElement) => { try { - const info = this.converter.fromElement(element); + const info = this.handler.fromElement(element); if (!info) return null; return { node: new this(info) }; } catch { diff --git a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/index.tsx b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/index.tsx index 86e56c2e6d..a710bb3e09 100644 --- a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/index.tsx +++ b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/index.tsx @@ -50,7 +50,7 @@ export class ImageExtension implements HtmlEditorExtension { const files = event.dataTransfer?.files; if (!files?.length) return; - this.insertImageNodes(files, controller, this.nodeType.converter); + this.insertImageNodes(files, controller, this.nodeType.handler); }, { signal: abortController.signal }); element.addEventListener("paste", (event) => { @@ -59,7 +59,7 @@ export class ImageExtension implements HtmlEditorExtension { if (!files?.length) return; event.preventDefault(); - this.insertImageNodes(files, controller, this.nodeType.converter); + this.insertImageNodes(files, controller, this.nodeType.handler); }, { signal: abortController.signal }); return () => { From 2f88837037039dce7160e433f467477b326cd94e Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Wed, 17 Dec 2025 22:43:13 +0330 Subject: [PATCH 4/6] HelpImport: support intra-database imports across isolations - added HelpImage.Guid and using it in img tags instead of Id (PK) --- .../Signum.Help/Editor/HelpImageHandler.tsx | 61 ++++++++++++------- .../Signum.Help/Editor/HelpImageNode.tsx | 2 +- Extensions/Signum.Help/HelpClient.tsx | 3 + Extensions/Signum.Help/HelpCommon.cs | 3 +- Extensions/Signum.Help/HelpController.cs | 8 +++ Extensions/Signum.Help/HelpExportImport.cs | 18 +++--- Extensions/Signum.Help/HelpImage.cs | 5 +- Extensions/Signum.Help/HelpLogic.cs | 8 +-- Extensions/Signum.Help/InlineImagesLogic.cs | 20 +++--- Extensions/Signum.Help/Signum.Help.ts | 2 + .../ImageExtension/ImageHandlerBase.ts | 2 +- 11 files changed, 81 insertions(+), 51 deletions(-) diff --git a/Extensions/Signum.Help/Editor/HelpImageHandler.tsx b/Extensions/Signum.Help/Editor/HelpImageHandler.tsx index 78e625ee8e..1a36d482da 100644 --- a/Extensions/Signum.Help/Editor/HelpImageHandler.tsx +++ b/Extensions/Signum.Help/Editor/HelpImageHandler.tsx @@ -1,13 +1,15 @@ import { PropertyRoute } from "@framework/Lines"; import { getSymbol } from "@framework/Reflection"; +import { useAPI } from "@framework/Hooks"; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FileImage } from "../../Signum.Files/Components/FileImage"; import { toFileEntity } from "../../Signum.Files/Components/FileUploader"; import { FilePathEmbedded, FileTypeSymbol } from "../../Signum.Files/Signum.Files"; -import type { FilesClient } from '../../Signum.Files/FilesClient'; import { ImageHandlerBase, ImageInfo } from "../../Signum.HtmlEditor/Extensions/ImageExtension/ImageHandlerBase"; -import { HelpImageEntity } from "../Signum.Help"; +import { HelpImageEntity, HelpMessage } from "../Signum.Help"; import { HelpImageNode } from "./HelpImageNode"; import { ImageNodeBase } from "../../Signum.HtmlEditor/Extensions/ImageExtension/ImageNodeBase"; +import { HelpClient } from "../HelpClient"; export class HelpImageHandler implements ImageHandlerBase { @@ -24,7 +26,7 @@ export class HelpImageHandler implements ImageHandlerBase { val.binaryFile && img.setAttribute("data-binary-file", val.binaryFile); img.setAttribute("data-file-name", val.fileName || ""); - val.imageId && img.setAttribute("data-help-image-id", val.imageId); + val.key && img.setAttribute("data-help-image-guid", val.key); return img; } @@ -43,28 +45,16 @@ export class HelpImageHandler implements ImageHandlerBase { })); } - renderImage(info: ImageInfo): React.ReactElement React.ReactElement React.Component)> | null) | (new (props: any) => React.Component)> { - var fp = FilePathEmbedded.New({ - binaryFile: info.binaryFile, - entityId: info.imageId, - mListRowId: null, - fileType: getSymbol(FileTypeSymbol, this.pr.member!.defaultFileTypeInfo!.key), - rootType: this.pr.findRootType().name, - propertyRoute: this.pr.propertyPath() - }); - - if (fp.entityId == null && fp.binaryFile == null) - return
{JSON.stringify(info)}
; - - return ; + renderImage(info: ImageInfo): React.ReactElement { + return ; } toHtml(val: ImageInfo): string | undefined { if (val.binaryFile) return ``; - if (val.imageId) - return ``; + if (val.key) + return ``; return undefined; } @@ -72,12 +62,39 @@ export class HelpImageHandler implements ImageHandlerBase { fromElement(element: HTMLDivElement): ImageInfo | undefined { if (element.tagName == "IMG") { return { - binaryFile: element.dataset["binaryFile"], - fileName: element.dataset["fileName"], - imageId: element.dataset["helpImageId"], + binaryFile: element.getAttribute("data-binary-file") ?? undefined, + fileName: element.getAttribute("data-file-name") ?? undefined, + key: element.getAttribute("data-help-image-guid") ?? undefined, }; } return undefined; } } + +function InlineImage(p: { info: ImageInfo, pr: PropertyRoute }): React.ReactElement | undefined +{ + const imageId = useAPI(() => p.info.key && HelpClient.API.getImageId(p.info.key), []); + + if (!imageId && !p.info.binaryFile) + return ( +
+ + + {HelpMessage.LoadingImage.niceToString()}... + +
+ ); + + const fp = FilePathEmbedded.New({ + binaryFile: p.info.binaryFile, + entityId: imageId, + mListRowId: null, + fileType: getSymbol(FileTypeSymbol, p.pr.member!.defaultFileTypeInfo!.key), + rootType: p.pr.findRootType().name, + propertyRoute: p.pr.propertyPath() + }); + + return ; + +} diff --git a/Extensions/Signum.Help/Editor/HelpImageNode.tsx b/Extensions/Signum.Help/Editor/HelpImageNode.tsx index 46a2801fde..21f3283b98 100644 --- a/Extensions/Signum.Help/Editor/HelpImageNode.tsx +++ b/Extensions/Signum.Help/Editor/HelpImageNode.tsx @@ -4,8 +4,8 @@ import { ImageInfo } from '../../Signum.HtmlEditor/Extensions/ImageExtension/Ima export class HelpImageNode extends ImageNodeBase { static { - this.dataImageIdAttribute = "data-help-image-id"; this.handler = new HelpImageHandler(); + this.dataImageIdAttribute = "data-help-image-guid"; } static getType(): string { diff --git a/Extensions/Signum.Help/HelpClient.tsx b/Extensions/Signum.Help/HelpClient.tsx index 4870fe4989..d064dc2e4d 100644 --- a/Extensions/Signum.Help/HelpClient.tsx +++ b/Extensions/Signum.Help/HelpClient.tsx @@ -171,6 +171,9 @@ export namespace HelpClient { return ajaxPost({ url: "/api/help/applyImport" }, { file, model }); } + export function getImageId(guid: string): Promise { + return ajaxGet({ url: `/api/help/getImageId?guid=${guid}`, cache: 'default' as RequestCache }); + } } diff --git a/Extensions/Signum.Help/HelpCommon.cs b/Extensions/Signum.Help/HelpCommon.cs index a662a1fa0c..730d3d5ed6 100644 --- a/Extensions/Signum.Help/HelpCommon.cs +++ b/Extensions/Signum.Help/HelpCommon.cs @@ -164,7 +164,8 @@ public enum HelpMessage SelectedFile, HelpZipContents, NewKey, - ActionStatus + ActionStatus, + LoadingImage, } public enum HelpKindMessage diff --git a/Extensions/Signum.Help/HelpController.cs b/Extensions/Signum.Help/HelpController.cs index d25f544cf1..3fd8cc9a6e 100644 --- a/Extensions/Signum.Help/HelpController.cs +++ b/Extensions/Signum.Help/HelpController.cs @@ -155,6 +155,14 @@ public FileStreamResult Export([Required, FromBody] Lite[] lites) return MimeMapping.GetFileStreamResult(new MemoryStream(bytes), fileName); } + [HttpGet("api/help/getImageId")] + [ResponseCache(Duration = 90 * 24 * 60 * 60)] + public ActionResult GetImageId([Required, FromQuery] Guid guid) + { + var id = HelpLogic.GetImageId(guid); + return id is null ? NotFound() : id.Value.ToString(); + } + [HttpPost("api/help/importPreview")] public HelpImportPreviewModel ImportPreview([Required, FromBody] FileUpload file) { diff --git a/Extensions/Signum.Help/HelpExportImport.cs b/Extensions/Signum.Help/HelpExportImport.cs index 64a555e2d2..6c62021ffe 100644 --- a/Extensions/Signum.Help/HelpExportImport.cs +++ b/Extensions/Signum.Help/HelpExportImport.cs @@ -65,7 +65,7 @@ public enum ImportExecutionMode private static FileContent[] GetImageContents(IHelpEntity entity) => [.. Database.Query().Where(a => a.Target.Is(entity)) - .Select(i => new FileContent(i.Id + "." + i.File.FileName, i.File.GetByteArray()))]; + .Select(i => new FileContent(i.Guid + "." + i.File.FileName, i.File.GetByteArray()))]; private static byte[] ToBytes(this XDocument doc) { @@ -870,14 +870,16 @@ private static void ImportImages(IHelpEntity entity, HelpContent content) Synchronizer.Synchronize( newDictionary: content.Images.ToDictionaryEx(i => i.FileName), - oldDictionary: oldImages.EmptyIfNull().ToDictionaryEx(o => o.Id + "." + o.File.FileName), + oldDictionary: oldImages.EmptyIfNull().ToDictionaryEx(o => o.Guid + "." + o.File.FileName), createNew: (k, n) => { - Administrator.SaveDisableIdentity(new HelpImageEntity + new HelpImageEntity { Target = (entity).ToLite(), - File = new FilePathEmbedded(HelpImageFileType.Image, n.FileName.After("."), n.Bytes) - }.SetId(Guid.Parse(n.FileName.Before(".")))); + File = new FilePathEmbedded(HelpImageFileType.Image, n.FileName.After("."), n.Bytes), + Guid = Guid.Parse(n.FileName.Before(".")) + }.Save(); + SafeConsole.WriteColor(ConsoleColor.Green, '.'); }, removeOld: (k, o) => @@ -890,12 +892,6 @@ private static void ImportImages(IHelpEntity entity, HelpContent content) }); } -/* public static string TypesDirectory = "Types"; - public static string QueriesDirectory = "Query"; - public static string OperationsDirectory = "Operation"; - public static string NamespacesDirectory = "Namespace"; - public static string AppendicesDirectory = "Appendix";*/ - #region Export methods public static void ExportAll(string path) diff --git a/Extensions/Signum.Help/HelpImage.cs b/Extensions/Signum.Help/HelpImage.cs index 84f8cff575..c7acccaa1e 100644 --- a/Extensions/Signum.Help/HelpImage.cs +++ b/Extensions/Signum.Help/HelpImage.cs @@ -3,7 +3,6 @@ namespace Signum.Help; [EntityKind(EntityKind.Part, EntityData.Master)] -[PrimaryKey(typeof(Guid))] public class HelpImageEntity : Entity { [ImplementedBy(typeof(AppendixHelpEntity), typeof(NamespaceHelpEntity), typeof(QueryHelpEntity), typeof(TypeHelpEntity))] @@ -13,6 +12,10 @@ public class HelpImageEntity : Entity [DefaultFileType(nameof(HelpImageFileType.Image), nameof(HelpImageFileType))] public FilePathEmbedded File { get; set; } + + [UniqueIndex] + public Guid Guid { get; set; } = Guid.NewGuid(); + } [AutoInit] diff --git a/Extensions/Signum.Help/HelpLogic.cs b/Extensions/Signum.Help/HelpLogic.cs index a0ede92b15..d2913fed5f 100644 --- a/Extensions/Signum.Help/HelpLogic.cs +++ b/Extensions/Signum.Help/HelpLogic.cs @@ -7,11 +7,8 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using Signum.Engine.Sync; -using Signum.Basics; using Signum.Omnibox; using Signum.Files; -using Signum.Entities; -using DocumentFormat.OpenXml.Vml.Office; using Signum.API; namespace Signum.Help; @@ -237,7 +234,10 @@ public static CultureInfo GetCulture() throw new InvalidOperationException("No compatible CultureInfo found in the database for {0}".FormatWith(ci.Name)); } - + public static PrimaryKey? GetImageId(Guid guid) + { + return Database.Query().Single((HelpImageEntity a) => a.Guid == guid).Id; + } public static List AllTypes() { diff --git a/Extensions/Signum.Help/InlineImagesLogic.cs b/Extensions/Signum.Help/InlineImagesLogic.cs index 765759d2e5..6f53ef3878 100644 --- a/Extensions/Signum.Help/InlineImagesLogic.cs +++ b/Extensions/Signum.Help/InlineImagesLogic.cs @@ -11,16 +11,16 @@ public static class InlineImagesLogic public static IQueryable Images(this IHelpEntity e) => As.Expression(() => Database.Query().Where(a => a.Target.Is(e))); - public static Regex ImgRegex = new Regex(@"[\w\-]+)\s*=\s*""(?[^""]+)"")+\s*/?>"); + public static Regex ImgRegex = new(@"[\w\-]+)\s*=\s*""(?[^""]+)"")+\s*/?>"); public static bool SynchronizeInlineImages(IHelpEntity entity) { using (OperationLogic.AllowSave()) { - var toDeleteImages = entity.IsNew ? new Dictionary>() : - entity.Images().Select(a => a.ToLite()).ToDictionaryEx(a => a.Id) ; + var toDeleteImages = entity.IsNew ? [] : + entity.Images().Select(a => new { lite = a.ToLite(), a.Guid }).ToDictionaryEx(a => a.Guid) ; - List newImages = new List(); + List newImages = []; var hasChanges = entity.ForeachHtmlField(text => { @@ -28,9 +28,9 @@ public static bool SynchronizeInlineImages(IHelpEntity entity) { Dictionary atts = GetTagAttributes(m); var newAtts = atts.ToDictionary(); - if (atts.TryGetValue("data-help-image-id", out var imageId)) + if (atts.TryGetValue("data-help-image-guid", out var imageGuid)) { - toDeleteImages.Remove(PrimaryKey.Parse(imageId, typeof(HelpImageEntity))); + toDeleteImages.Remove(Guid.Parse(imageGuid)); } if (atts.TryGetValue("data-binary-file", out var base64Data)) @@ -53,7 +53,7 @@ public static bool SynchronizeInlineImages(IHelpEntity entity) else { image.Save(); - newAtts.Add("data-help-image-id", image.Id.ToString()); + newAtts.Add("data-help-image-guid", image.Guid.ToString()); } } @@ -64,7 +64,7 @@ public static bool SynchronizeInlineImages(IHelpEntity entity) }); if (toDeleteImages.Any()) - Database.DeleteList(toDeleteImages.Values.ToList()); + Database.DeleteList(toDeleteImages.Values.Select(a => a.lite).ToList()); if (!hasChanges) return false; @@ -74,7 +74,7 @@ public static bool SynchronizeInlineImages(IHelpEntity entity) entity.Save(); newImages.SaveList(); - var hashToHelpImageId = newImages.ToDictionary(a => a.File.Hash!, a => a.Id); + var hashToHelpImageId = newImages.ToDictionary(a => a.File.Hash!, a => a.Guid); entity.ForeachHtmlField(text => ImgRegex.Replace(text?? "", m => { @@ -83,7 +83,7 @@ public static bool SynchronizeInlineImages(IHelpEntity entity) if (atts.TryGetValue("data-hash", out var hash)) { atts.Remove("data-hash"); - atts.Add("data-help-image-id", hashToHelpImageId.GetOrThrow(hash).ToString()); + atts.Add("data-help-image-guid", hashToHelpImageId.GetOrThrow(hash).ToString()); } return $" $"{a.Key}=\"{a.Value}\"", " ")}/>"; diff --git a/Extensions/Signum.Help/Signum.Help.ts b/Extensions/Signum.Help/Signum.Help.ts index 9e2d01d48d..64cbde00c2 100644 --- a/Extensions/Signum.Help/Signum.Help.ts +++ b/Extensions/Signum.Help/Signum.Help.ts @@ -29,6 +29,7 @@ export interface HelpImageEntity extends Entities.Entity { target: Entities.Lite; creationDate: string /*DateTime*/; file: Files.FilePathEmbedded; + guid: string /*Guid*/; } export namespace HelpImageFileType { @@ -143,6 +144,7 @@ export namespace HelpMessage { export const HelpZipContents: MessageKey = new MessageKey("HelpMessage", "HelpZipContents"); export const NewKey: MessageKey = new MessageKey("HelpMessage", "NewKey"); export const ActionStatus: MessageKey = new MessageKey("HelpMessage", "ActionStatus"); + export const LoadingImage: MessageKey = new MessageKey("HelpMessage", "LoadingImage"); } export namespace HelpPermissions { diff --git a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageHandlerBase.ts b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageHandlerBase.ts index 76cb3e575f..5a7773ec14 100644 --- a/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageHandlerBase.ts +++ b/Extensions/Signum.HtmlEditor/Extensions/ImageExtension/ImageHandlerBase.ts @@ -10,7 +10,7 @@ export interface ImageHandlerBase { } export interface ImageInfo extends Partial{ - imageId?: string; + key?: string; binaryFile?: string; fileName?: string; } From dbdeb8541ca245ee62591224cdcd6f12139fb882 Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Thu, 18 Dec 2025 18:24:31 +0330 Subject: [PATCH 5/6] use Typed headers for cache control --- Extensions/Signum.Help/HelpController.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Extensions/Signum.Help/HelpController.cs b/Extensions/Signum.Help/HelpController.cs index 3fd8cc9a6e..3b501d39bb 100644 --- a/Extensions/Signum.Help/HelpController.cs +++ b/Extensions/Signum.Help/HelpController.cs @@ -1,10 +1,9 @@ +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Net.Http.Headers; using Signum.API.Filters; -using Signum.Basics; using Signum.Files; -using Signum.UserAssets; using System.ComponentModel.DataAnnotations; -using System.Globalization; using System.IO; namespace Signum.Help; @@ -156,9 +155,14 @@ public FileStreamResult Export([Required, FromBody] Lite[] lites) } [HttpGet("api/help/getImageId")] - [ResponseCache(Duration = 90 * 24 * 60 * 60)] public ActionResult GetImageId([Required, FromQuery] Guid guid) { + Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue + { + Public = true, + MaxAge = TimeSpan.FromDays(365), + }; + var id = HelpLogic.GetImageId(guid); return id is null ? NotFound() : id.Value.ToString(); } From 4e7f3fa70b6a3ebc14fbd3cf0996c2ac72d78304 Mon Sep 17 00:00:00 2001 From: Reza Nosratabad Date: Thu, 18 Dec 2025 18:46:59 +0330 Subject: [PATCH 6/6] FilesController : use Typed headers for cache control --- Extensions/Signum.Caching/CacheLogic.cs | 1 - Extensions/Signum.Files/FilesController.cs | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Extensions/Signum.Caching/CacheLogic.cs b/Extensions/Signum.Caching/CacheLogic.cs index 7a5b9856b2..e22acba9a0 100644 --- a/Extensions/Signum.Caching/CacheLogic.cs +++ b/Extensions/Signum.Caching/CacheLogic.cs @@ -12,7 +12,6 @@ using Signum.API; using Signum.Authorization; using Signum.Authorization.Rules; -using DocumentFormat.OpenXml.Office2013.Drawing.Chart; using Signum.Caching; namespace Signum.Cache; diff --git a/Extensions/Signum.Files/FilesController.cs b/Extensions/Signum.Files/FilesController.cs index b97be5d019..d8c97b4791 100644 --- a/Extensions/Signum.Files/FilesController.cs +++ b/Extensions/Signum.Files/FilesController.cs @@ -1,10 +1,10 @@ +using Azure.Core; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using System.IO; +using Microsoft.Net.Http.Headers; using Signum.Utilities.Reflection; using System.Collections.Concurrent; -using System.Security.Cryptography; -using System.Reflection.Metadata.Ecma335; -using Azure.Core; +using System.IO; namespace Signum.Files; @@ -24,7 +24,7 @@ public FileStreamResult DownloadFilePath(string filePathId) { var filePath = Database.Retrieve(PrimaryKey.Parse(filePathId, typeof(FilePathEntity))); - Response.Headers.CacheControl = $"max-age={FilePathLogic.MaxAge(filePath)}, private"; + Response.GetTypedHeaders().CacheControl = FilesCacheControl(filePath); return MimeMapping.GetFileStreamResult(filePath.OpenRead(), filePath.FileName); } @@ -53,11 +53,17 @@ public FileStreamResult DownloadFilePath(string filePathId) if (fpe == null) return null; - Response.Headers.CacheControl = $"max-age={FilePathLogic.MaxAge(fpe)}, private"; + Response.GetTypedHeaders().CacheControl = FilesCacheControl(fpe); - return MimeMapping.GetFileStreamResult(fpe.OpenRead(), fpe.FileName); + return MimeMapping.GetFileStreamResult(fpe.OpenRead(), fpe.FileName); } + private static CacheControlHeaderValue FilesCacheControl(IFilePath fpe) => new() + { + Private = true, + MaxAge = TimeSpan.FromSeconds(FilePathLogic.MaxAge(fpe)) + }; + static ConcurrentDictionary> queryBuilderCache = new ConcurrentDictionary>();