@oneuptime/common 11.5.12 → 11.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIInsight.ts +30 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +21 -0
- package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +25 -0
- package/Models/DatabaseModels/GlobalConfig.ts +76 -0
- package/Models/DatabaseModels/Project.ts +30 -0
- package/Models/DatabaseModels/TelemetryException.ts +128 -0
- package/Server/API/AIAgentDataAPI.ts +129 -5
- package/Server/API/AIInvestigationAPI.ts +87 -0
- package/Server/API/EnterpriseLicenseAPI.ts +57 -0
- package/Server/API/GlobalConfigAPI.ts +62 -1
- package/Server/EnvironmentConfig.ts +22 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.ts +56 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/AIRunService.ts +8 -0
- package/Server/Services/AnalyticsDatabaseService.ts +48 -45
- package/Server/Services/DatabaseService.ts +66 -1
- package/Server/Services/TelemetryExceptionService.ts +320 -24
- package/Server/Services/WorkflowService.ts +100 -39
- package/Server/Types/Workflow/Components/Schedule.ts +57 -32
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +222 -24
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +225 -9
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +39 -0
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +114 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +59 -0
- package/Server/Utils/Express.ts +13 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +222 -0
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +799 -0
- package/Server/Utils/Telemetry/TelemetryWriterClient.ts +263 -0
- package/Server/Utils/Telemetry/TelemetryWriterServer.ts +240 -0
- package/Server/Utils/Telemetry/TelemetryWriterShedMetrics.ts +93 -0
- package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +232 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +205 -1
- package/Tests/Server/Services/UpdateOneByIdKeepsRowId.test.ts +107 -0
- package/Tests/Server/Services/WorkflowService.test.ts +308 -0
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +150 -141
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +277 -1
- package/Tests/Server/Utils/Attribution.test.ts +203 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +70 -0
- package/Tests/Server/Utils/InsightTriageClassification.test.ts +57 -0
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +183 -0
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +340 -0
- package/Tests/Server/Utils/Monitor/Criteria/ExceptionMonitorCriteria.test.ts +87 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +165 -0
- package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +86 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +1565 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterClient.test.ts +313 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterServer.test.ts +270 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterShedMetrics.test.ts +127 -0
- package/Tests/Server/Utils/TelemetryImprovementTaskTrigger.test.ts +141 -0
- package/Tests/Types/AI/CodeFixTaskType.test.ts +3 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +228 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +169 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +289 -0
- package/Tests/Types/Monitor/MonitorStepLogMonitor.test.ts +231 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +245 -0
- package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +155 -0
- package/Tests/Types/Monitor/MonitorStepTelemetrySerialization.test.ts +141 -0
- package/Tests/Types/Monitor/MonitorStepTraceMonitor.test.ts +137 -0
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +311 -0
- package/Tests/UI/Components/ModelTableSelectFromColumns.test.ts +259 -0
- package/Tests/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.test.ts +461 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +2852 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +758 -0
- package/Tests/UI/Utils/NotificationMethodUtil.test.ts +564 -0
- package/Tests/Utils/Array.test.ts +156 -0
- package/Tests/Utils/CronTab.test.ts +199 -0
- package/Tests/Utils/ModelImportExport.test.ts +101 -0
- package/Tests/Utils/Number.test.ts +179 -0
- package/Tests/Utils/VersionUtil.test.ts +348 -0
- package/Tests/jest.setup.ts +1 -0
- package/Types/AI/CodeFixTaskContext.ts +6 -0
- package/Types/AI/CodeFixTaskType.ts +38 -1
- package/Types/AI/ExceptionAIClassification.ts +27 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +6 -0
- package/Types/Log/LogScrubPatternType.ts +7 -0
- package/Types/Monitor/MonitorStep.ts +24 -4
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +105 -0
- package/Types/Trace/TraceScrubPatternType.ts +7 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +445 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +15 -46
- package/UI/Components/ModelTable/SelectFromColumns.ts +129 -0
- package/UI/Components/Workflow/ArgumentsForm.tsx +68 -30
- package/UI/Components/Workflow/CronScheduleField.tsx +411 -0
- package/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.ts +176 -0
- package/UI/Utils/NotificationMethodUtil.ts +310 -0
- package/Utils/CronTab.ts +823 -0
- package/Utils/ModelImportExport.ts +21 -6
- package/Utils/VersionUtil.ts +260 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +31 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +22 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +26 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +81 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +31 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +134 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +97 -8
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +55 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +47 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +52 -1
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +17 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js +33 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +9 -2
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +44 -16
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +53 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +263 -22
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowService.js +80 -30
- package/build/dist/Server/Services/WorkflowService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Schedule.js +44 -19
- package/build/dist/Server/Types/Workflow/Components/Schedule.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +193 -22
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +178 -9
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +37 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +98 -0
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js +24 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -0
- package/build/dist/Server/Utils/Express.js +12 -0
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +149 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +496 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterClient.js +165 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterClient.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterServer.js +136 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterServer.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterShedMetrics.js +76 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterShedMetrics.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +38 -1
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +28 -0
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -0
- package/build/dist/Types/Log/LogScrubPatternType.js +7 -0
- package/build/dist/Types/Log/LogScrubPatternType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +20 -4
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +73 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js +7 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +261 -13
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +12 -37
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js +82 -0
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +30 -6
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/CronScheduleField.js +209 -0
- package/build/dist/UI/Components/Workflow/CronScheduleField.js.map +1 -0
- package/build/dist/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.js +129 -0
- package/build/dist/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.js.map +1 -0
- package/build/dist/UI/Utils/NotificationMethodUtil.js +189 -0
- package/build/dist/UI/Utils/NotificationMethodUtil.js.map +1 -0
- package/build/dist/Utils/CronTab.js +609 -0
- package/build/dist/Utils/CronTab.js.map +1 -0
- package/build/dist/Utils/ModelImportExport.js +20 -6
- package/build/dist/Utils/ModelImportExport.js.map +1 -1
- package/build/dist/Utils/VersionUtil.js +193 -0
- package/build/dist/Utils/VersionUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -53,6 +53,10 @@ import TableColumn from "../Table/Types/Column";
|
|
|
53
53
|
import FieldType from "../Types/FieldType";
|
|
54
54
|
import ModelTableColumn from "./Column";
|
|
55
55
|
import Columns from "./Columns";
|
|
56
|
+
import {
|
|
57
|
+
getRelationSelectFromColumns,
|
|
58
|
+
getSelectFromColumns,
|
|
59
|
+
} from "./SelectFromColumns";
|
|
56
60
|
import AnalyticsBaseModel, {
|
|
57
61
|
AnalyticsBaseModelType,
|
|
58
62
|
} from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
@@ -664,33 +668,10 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
664
668
|
|
|
665
669
|
const getRelationSelect: GetRelationSelectFunction =
|
|
666
670
|
(): Select<TBaseModel> => {
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
? (Object.keys(column.field)[0] as string)
|
|
672
|
-
: null;
|
|
673
|
-
|
|
674
|
-
if (key && model.isFileColumn(key)) {
|
|
675
|
-
(relationSelect as JSONObject)[key] = {
|
|
676
|
-
file: true,
|
|
677
|
-
_id: true,
|
|
678
|
-
fileType: true,
|
|
679
|
-
name: true,
|
|
680
|
-
};
|
|
681
|
-
} else if (key && model.isEntityColumn(key)) {
|
|
682
|
-
if (!(relationSelect as JSONObject)[key]) {
|
|
683
|
-
(relationSelect as JSONObject)[key] = {};
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
(relationSelect as JSONObject)[key] = {
|
|
687
|
-
...((relationSelect as JSONObject)[key] as JSONObject),
|
|
688
|
-
...(column.field as any)[key],
|
|
689
|
-
};
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
return relationSelect;
|
|
671
|
+
return getRelationSelectFromColumns<TBaseModel>({
|
|
672
|
+
columns: props.columns || [],
|
|
673
|
+
model: model,
|
|
674
|
+
});
|
|
694
675
|
};
|
|
695
676
|
|
|
696
677
|
type DeleteItemFunction = (item: TBaseModel) => Promise<void>;
|
|
@@ -1226,25 +1207,13 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
1226
1207
|
type GetSelectFunction = () => Select<TBaseModel>;
|
|
1227
1208
|
|
|
1228
1209
|
const getSelect: GetSelectFunction = (): Select<TBaseModel> => {
|
|
1229
|
-
const selectFields: Select<TBaseModel> = {
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
: null;
|
|
1237
|
-
|
|
1238
|
-
if (key) {
|
|
1239
|
-
if (model.hasColumn(key)) {
|
|
1240
|
-
(selectFields as Dictionary<boolean>)[key] = true;
|
|
1241
|
-
} else {
|
|
1242
|
-
throw new BadDataException(
|
|
1243
|
-
`${key} column not found on ${model.singularName}`,
|
|
1244
|
-
);
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
}
|
|
1210
|
+
const selectFields: Select<TBaseModel> = getSelectFromColumns<TBaseModel>({
|
|
1211
|
+
columns: props.columns || [],
|
|
1212
|
+
model: model,
|
|
1213
|
+
hasPermissionToReadField: (field: string): boolean => {
|
|
1214
|
+
return hasPermissionToReadField(field as keyof TBaseModel);
|
|
1215
|
+
},
|
|
1216
|
+
});
|
|
1248
1217
|
|
|
1249
1218
|
const selectMoreFields: Array<keyof TBaseModel> = props.selectMoreFields
|
|
1250
1219
|
? (Object.keys(props.selectMoreFields) as Array<keyof TBaseModel>)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import Columns from "./Columns";
|
|
2
|
+
import AnalyticsBaseModel from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
3
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
4
|
+
import Select from "../../../Types/BaseDatabase/Select";
|
|
5
|
+
import Dictionary from "../../../Types/Dictionary";
|
|
6
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
7
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
8
|
+
import { Logger } from "../../Utils/Logger";
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Builds the API `select` for a ModelTable from its column definitions.
|
|
12
|
+
*
|
|
13
|
+
* A column may declare MORE THAN ONE field when its cell renders a value
|
|
14
|
+
* composed from several columns — e.g. a "Nodes" cell that renders
|
|
15
|
+
* `{onlineNodeCount}/{nodeCount} online` declares
|
|
16
|
+
* `field: { nodeCount: true, onlineNodeCount: true }`.
|
|
17
|
+
*
|
|
18
|
+
* These used to select only the FIRST key, which left every other declared
|
|
19
|
+
* field `undefined` on the fetched row, so such cells silently rendered
|
|
20
|
+
* their zero/empty fallback — a fully online Proxmox cluster displayed
|
|
21
|
+
* "0/3 online" (OneUptime/oneuptime#2756). ModelDetail has always selected
|
|
22
|
+
* every declared key; these helpers keep ModelTable in sync with it.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export function getSelectFromColumns<
|
|
26
|
+
TBaseModel extends BaseModel | AnalyticsBaseModel,
|
|
27
|
+
>(data: {
|
|
28
|
+
columns: Columns<TBaseModel>;
|
|
29
|
+
model: TBaseModel;
|
|
30
|
+
/*
|
|
31
|
+
* Secondary fields are gated on this. The API rejects the WHOLE request
|
|
32
|
+
* with NotAuthorizedException when the select names a column the caller
|
|
33
|
+
* cannot read (Common/Server/Types/Database/Permissions/SelectPermission
|
|
34
|
+
* .checkSelectPermission), so a secondary field the user has no read
|
|
35
|
+
* permission on must be dropped rather than blank the table for them.
|
|
36
|
+
* Primary fields are left exactly as they always were.
|
|
37
|
+
*/
|
|
38
|
+
hasPermissionToReadField?: ((field: string) => boolean) | undefined;
|
|
39
|
+
}): Select<TBaseModel> {
|
|
40
|
+
const selectFields: Select<TBaseModel> = {
|
|
41
|
+
_id: true,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
for (const column of data.columns) {
|
|
45
|
+
if (!column.field) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const keys: Array<string> = Object.keys(column.field);
|
|
50
|
+
|
|
51
|
+
for (const key of keys) {
|
|
52
|
+
const isPrimaryField: boolean = key === keys[0];
|
|
53
|
+
|
|
54
|
+
if (!data.model.hasColumn(key)) {
|
|
55
|
+
if (isPrimaryField) {
|
|
56
|
+
/*
|
|
57
|
+
* Only the primary field is a hard error — it is also the key
|
|
58
|
+
* used for sorting and for the default cell renderer, so a bad
|
|
59
|
+
* one is a genuine mistake.
|
|
60
|
+
*/
|
|
61
|
+
throw new BadDataException(
|
|
62
|
+
`${key} column not found on ${data.model.singularName}`,
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* A stray secondary key degrades to "not selected" rather than
|
|
68
|
+
* throwing, because throwing here blanks the entire page. Log it:
|
|
69
|
+
* silently dropping it is what produced #2756 in the first place.
|
|
70
|
+
*/
|
|
71
|
+
Logger.error(
|
|
72
|
+
`ModelTable column "${column.title}" on ${data.model.singularName} declares field "${key}", which is not a column on the model. It will not be fetched, so the cell will render its empty value.`,
|
|
73
|
+
);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (
|
|
78
|
+
!isPrimaryField &&
|
|
79
|
+
data.hasPermissionToReadField &&
|
|
80
|
+
!data.hasPermissionToReadField(key)
|
|
81
|
+
) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
(selectFields as Dictionary<boolean>)[key] = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return selectFields;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function getRelationSelectFromColumns<
|
|
93
|
+
TBaseModel extends BaseModel | AnalyticsBaseModel,
|
|
94
|
+
>(data: {
|
|
95
|
+
columns: Columns<TBaseModel>;
|
|
96
|
+
model: TBaseModel;
|
|
97
|
+
}): Select<TBaseModel> {
|
|
98
|
+
const relationSelect: Select<TBaseModel> = {};
|
|
99
|
+
|
|
100
|
+
for (const column of data.columns) {
|
|
101
|
+
if (!column.field) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Same multi-field contract as getSelectFromColumns: one cell can
|
|
107
|
+
* render several relations (e.g. an alert "Resource" cell spanning
|
|
108
|
+
* hosts / kubernetesClusters / dockerHosts / podmanHosts / services).
|
|
109
|
+
*/
|
|
110
|
+
for (const key of Object.keys(column.field)) {
|
|
111
|
+
if (data.model.isFileColumn(key)) {
|
|
112
|
+
(relationSelect as JSONObject)[key] = {
|
|
113
|
+
file: true,
|
|
114
|
+
_id: true,
|
|
115
|
+
fileType: true,
|
|
116
|
+
name: true,
|
|
117
|
+
};
|
|
118
|
+
} else if (data.model.isEntityColumn(key)) {
|
|
119
|
+
(relationSelect as JSONObject)[key] = {
|
|
120
|
+
...(((relationSelect as JSONObject)[key] as JSONObject) || {}),
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
|
+
...((column.field as any)[key] as JSONObject),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return relationSelect;
|
|
129
|
+
}
|
|
@@ -5,6 +5,7 @@ import FormFieldSchemaType from "../Forms/Types/FormFieldSchemaType";
|
|
|
5
5
|
import { CustomElementProps } from "../Forms/Types/Field";
|
|
6
6
|
import FormValues from "../Forms/Types/FormValues";
|
|
7
7
|
import ComponentValuePickerModal from "./ComponentValuePickerModal";
|
|
8
|
+
import CronScheduleField from "./CronScheduleField";
|
|
8
9
|
import ModelFieldPicker from "./ModelFieldPicker";
|
|
9
10
|
import { componentInputTypeToFormFieldType } from "./Utils";
|
|
10
11
|
import VariableModal from "./VariableModal";
|
|
@@ -198,40 +199,75 @@ const ArgumentsForm: FunctionComponent<ComponentProps> = (
|
|
|
198
199
|
arg.type === ComponentInputType.Select &&
|
|
199
200
|
Boolean(component.metadata.tableName);
|
|
200
201
|
|
|
201
|
-
|
|
202
|
+
/*
|
|
203
|
+
* The Schedule trigger's CronTab argument gets a dedicated
|
|
204
|
+
* cron picker (presets, custom expression with live preview,
|
|
205
|
+
* or a variable reference) instead of a bare dropdown.
|
|
206
|
+
*/
|
|
207
|
+
const useCronPicker: boolean =
|
|
208
|
+
arg.type === ComponentInputType.CronTab;
|
|
209
|
+
|
|
210
|
+
let baseField: {
|
|
202
211
|
fieldType: import("../Forms/Types/FormFieldSchemaType").default;
|
|
203
212
|
dropdownOptions?: Array<DropdownOption> | undefined;
|
|
204
213
|
getCustomElement?: (
|
|
205
214
|
values: FormValues<JSONObject>,
|
|
206
215
|
customProps: CustomElementProps,
|
|
207
216
|
) => ReactElement | undefined;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
if (useFieldPicker) {
|
|
220
|
+
baseField = {
|
|
221
|
+
fieldType: FormFieldSchemaType.CustomComponent,
|
|
222
|
+
getCustomElement: (
|
|
223
|
+
_values: FormValues<JSONObject>,
|
|
224
|
+
customProps: CustomElementProps,
|
|
225
|
+
): ReactElement => {
|
|
226
|
+
return (
|
|
227
|
+
<ModelFieldPicker
|
|
228
|
+
tableName={component.metadata.tableName as string}
|
|
229
|
+
initialValue={customProps.initialValue}
|
|
230
|
+
onChange={(value: string) => {
|
|
231
|
+
void customProps.onChange?.(value);
|
|
232
|
+
}}
|
|
233
|
+
placeholder={customProps.placeholder}
|
|
234
|
+
error={customProps.error}
|
|
235
|
+
tabIndex={customProps.tabIndex}
|
|
236
|
+
/>
|
|
237
|
+
);
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
} else if (useCronPicker) {
|
|
241
|
+
baseField = {
|
|
242
|
+
fieldType: FormFieldSchemaType.CustomComponent,
|
|
243
|
+
getCustomElement: (
|
|
244
|
+
_values: FormValues<JSONObject>,
|
|
245
|
+
customProps: CustomElementProps,
|
|
246
|
+
): ReactElement => {
|
|
247
|
+
return (
|
|
248
|
+
<CronScheduleField
|
|
249
|
+
workflowId={props.workflowId}
|
|
250
|
+
initialValue={
|
|
251
|
+
customProps.initialValue as string | null
|
|
252
|
+
}
|
|
253
|
+
onChange={(value: string) => {
|
|
254
|
+
void customProps.onChange?.(value);
|
|
255
|
+
}}
|
|
256
|
+
placeholder={customProps.placeholder}
|
|
257
|
+
error={customProps.error}
|
|
258
|
+
tabIndex={customProps.tabIndex}
|
|
259
|
+
/>
|
|
260
|
+
);
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
} else {
|
|
264
|
+
baseField = componentInputTypeToFormFieldType(
|
|
265
|
+
arg.type,
|
|
266
|
+
component.arguments && component.arguments[arg.id]
|
|
267
|
+
? component.arguments[arg.id]
|
|
268
|
+
: null,
|
|
269
|
+
);
|
|
270
|
+
}
|
|
235
271
|
|
|
236
272
|
/*
|
|
237
273
|
* For WorkflowSelect, inject the dynamically fetched list
|
|
@@ -244,10 +280,12 @@ const ArgumentsForm: FunctionComponent<ComponentProps> = (
|
|
|
244
280
|
/*
|
|
245
281
|
* The "pick from component / variable" footer doesn't
|
|
246
282
|
* apply to the field picker (it edits a structured object,
|
|
247
|
-
* not a free-text expression) or to
|
|
283
|
+
* not a free-text expression), to WorkflowSelect, or to the
|
|
284
|
+
* cron picker (which has its own built-in variable selector,
|
|
285
|
+
* and a schedule can't reference component return values).
|
|
248
286
|
*/
|
|
249
287
|
const showVariableFooter: boolean =
|
|
250
|
-
!isWorkflowSelect && !useFieldPicker;
|
|
288
|
+
!isWorkflowSelect && !useFieldPicker && !useCronPicker;
|
|
251
289
|
|
|
252
290
|
return {
|
|
253
291
|
title: `${arg.name}`,
|