From 620b3a516a0ce2b6ffe155b979f0c09b8bca2497 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:44:31 -0400 Subject: [PATCH 1/9] HPCC-32857 ECL Watch v9 Logs grid timestamp formatter fixes an issue with the ECL Watch v9 Logs viewer potentially having an uncaught JS exception if the logging engine is misconfigured and the value provided as the "timestamp" for a log message cannot be converted to a valid date Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- esp/src/src-react/components/Logs.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esp/src/src-react/components/Logs.tsx b/esp/src/src-react/components/Logs.tsx index 3fcb095bdc2..98005a65873 100644 --- a/esp/src/src-react/components/Logs.tsx +++ b/esp/src/src-react/components/Logs.tsx @@ -137,7 +137,11 @@ export const Logs: React.FunctionComponent = ({ formatter: ts => { if (ts) { if (ts.indexOf(":") < 0) { - return timestampToDate(ts).toISOString(); + const date = timestampToDate(ts); + if (!isNaN(date.getTime())) { + return date.toISOString(); + } + return ts; } return formatDateString(ts); } From a610226f408495c9023095133b33dec9be60ba16 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:30:08 -0400 Subject: [PATCH 2/9] HPCC-32824 ECL Watch v9 show Open Telemetry ids on WU details adds the Open Telemetry trace and span ids to the WU details page, as well as a button to easily copy these values out of the UI Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- .../eclwatch/img/opentelemetry-icon-color.svg | 1 + esp/src/src-react/components/Variables.tsx | 9 ++-- .../src-react/components/WorkunitDetails.tsx | 13 +++-- .../src-react/components/WorkunitSummary.tsx | 52 ++++++++++++++++++- esp/src/src/nls/hpcc.ts | 3 ++ 5 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 esp/src/eclwatch/img/opentelemetry-icon-color.svg diff --git a/esp/src/eclwatch/img/opentelemetry-icon-color.svg b/esp/src/eclwatch/img/opentelemetry-icon-color.svg new file mode 100644 index 00000000000..6633300d0ac --- /dev/null +++ b/esp/src/eclwatch/img/opentelemetry-icon-color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/esp/src/src-react/components/Variables.tsx b/esp/src/src-react/components/Variables.tsx index 6cb7f193df6..b3ca2e58453 100644 --- a/esp/src/src-react/components/Variables.tsx +++ b/esp/src/src-react/components/Variables.tsx @@ -2,24 +2,25 @@ import * as React from "react"; import { CommandBar, ContextualMenuItemType, ICommandBarItemProps } from "@fluentui/react"; import nlsHPCC from "src/nlsHPCC"; import { QuerySortItem } from "src/store/Store"; -import { useWorkunitVariables } from "../hooks/workunit"; +import { Variable } from "../hooks/workunit"; import { HolyGrail } from "../layouts/HolyGrail"; import { FluentGrid, useCopyButtons, useFluentStoreState, FluentColumns } from "./controls/Grid"; import { ShortVerticalDivider } from "./Common"; interface VariablesProps { - wuid: string; + variables: Variable[]; + refreshData: () => void; sort?: QuerySortItem; } const defaultSort = { attribute: "Wuid", descending: true }; export const Variables: React.FunctionComponent = ({ - wuid, + variables, + refreshData, sort = defaultSort }) => { - const [variables, , , refreshData] = useWorkunitVariables(wuid); const [data, setData] = React.useState([]); const { selection, setSelection, diff --git a/esp/src/src-react/components/WorkunitDetails.tsx b/esp/src/src-react/components/WorkunitDetails.tsx index 47d632db043..0451dbd98b5 100644 --- a/esp/src/src-react/components/WorkunitDetails.tsx +++ b/esp/src/src-react/components/WorkunitDetails.tsx @@ -7,7 +7,7 @@ import nlsHPCC from "src/nlsHPCC"; import { hasLogAccess } from "src/ESPLog"; import { wuidToDate, wuidToTime } from "src/Utility"; import { emptyFilter, formatQuery } from "src/ESPWorkunit"; -import { useWorkunit } from "../hooks/workunit"; +import { Variable, useWorkunit, useWorkunitVariables } from "../hooks/workunit"; import { useDeepEffect } from "../hooks/deepHooks"; import { DojoAdapter } from "../layouts/DojoAdapter"; import { parseQuery, pushUrl } from "../util/history"; @@ -52,6 +52,8 @@ export const WorkunitDetails: React.FunctionComponent = ({ }) => { const [workunit] = useWorkunit(wuid, true); + const [variables, , , refreshVariables] = useWorkunitVariables(wuid); + const [otTraceParent, setOtTraceParent] = React.useState(""); const [logCount, setLogCount] = React.useState("*"); const [logsDisabled, setLogsDisabled] = React.useState(true); const [_nextPrev, setNextPrev] = useNextPrev(); @@ -64,6 +66,11 @@ export const WorkunitDetails: React.FunctionComponent = ({ return parseQuery("?" + parentUrlParts[1]); }, [parentUrl]); + React.useEffect(() => { + const traceInfo: Variable = variables.filter(v => v.Name === "ottraceparent")[0]; + setOtTraceParent(traceInfo?.Value ?? ""); + }, [variables]); + const nextWuid = React.useCallback((wuids: WsWorkunits.ECLWorkunit[]) => { let found = false; for (const wu of wuids) { @@ -177,10 +184,10 @@ export const WorkunitDetails: React.FunctionComponent = ({
- + - + {state?.outputs ? diff --git a/esp/src/src-react/components/WorkunitSummary.tsx b/esp/src/src-react/components/WorkunitSummary.tsx index a519dd1a36c..3bf1e0b4337 100644 --- a/esp/src/src-react/components/WorkunitSummary.tsx +++ b/esp/src/src-react/components/WorkunitSummary.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, MessageBar, MessageBarType, ScrollablePane, ScrollbarVisibility, Sticky, StickyPositionType } from "@fluentui/react"; +import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, mergeStyles, MessageBar, MessageBarType, registerIcons, ScrollablePane, ScrollbarVisibility, Sticky, StickyPositionType } from "@fluentui/react"; import { scopedLogger } from "@hpcc-js/util"; import nlsHPCC from "src/nlsHPCC"; import { WUStatus } from "src/react/index"; @@ -20,6 +20,35 @@ import { WorkunitPersona } from "./controls/StateIcon"; const logger = scopedLogger("../components/WorkunitDetails.tsx"); +registerIcons({ + icons: { + "open-telemetry": ( + // .../eclwatch/img/opentelemetry-icon-color.svg + + ) + } +}); + +const otIconStyle = mergeStyles({ + width: 16 +}); + +interface OtTraceSchema { + traceId: string; + spanId: string; +} + +const parseOtTraceParent = (parent: string = ""): OtTraceSchema => { + const retVal = { traceId: "", spanId: "" }; + const regex = /00\-([0-9a-z]+)\-([0-9a-z]+)\-01/; + const matches = parent.match(regex); + if (matches) { + retVal.traceId = matches[1] ?? ""; + retVal.spanId = matches[2] ?? ""; + } + return retVal; +}; + interface MessageBarContent { type: MessageBarType; message: string; @@ -27,11 +56,13 @@ interface MessageBarContent { interface WorkunitSummaryProps { wuid: string; + otTraceParent?: string; fullscreen?: boolean; } export const WorkunitSummary: React.FunctionComponent = ({ wuid, + otTraceParent = "", fullscreen = false }) => { @@ -39,6 +70,8 @@ export const WorkunitSummary: React.FunctionComponent = ({ const [exceptions, , refreshSavings] = useWorkunitExceptions(wuid); const [jobname, setJobname] = React.useState(""); const [description, setDescription] = React.useState(""); + const [otTraceId, setOtTraceId] = React.useState(""); + const [otSpanId, setOtSpanId] = React.useState(""); const [_protected, setProtected] = React.useState(false); const [showPublishForm, setShowPublishForm] = React.useState(false); const [showZapForm, setShowZapForm] = React.useState(false); @@ -60,6 +93,12 @@ export const WorkunitSummary: React.FunctionComponent = ({ setProtected(workunit?.Protected); }, [workunit?.Description, workunit?.Jobname, workunit?.Protected]); + React.useEffect(() => { + const otTrace = parseOtTraceParent(otTraceParent); + setOtTraceId(otTrace.traceId); + setOtSpanId(otTrace.spanId); + }, [otTraceParent]); + const canSave = workunit && ( jobname !== workunit.Jobname || description !== workunit.Description || @@ -98,6 +137,13 @@ export const WorkunitSummary: React.FunctionComponent = ({ navigator?.clipboard?.writeText(wuid); } }, + { + key: "copyOtel", text: nlsHPCC.CopyOpenTelemetry, iconProps: { iconName: "open-telemetry", className: otIconStyle }, + disabled: otTraceParent === "", + onClick: () => { + navigator?.clipboard?.writeText(JSON.stringify(parseOtTraceParent(otTraceParent))); + } + }, { key: "divider_1", itemType: ContextualMenuItemType.Divider, onRender: () => }, { key: "save", text: nlsHPCC.Save, iconProps: { iconName: "Save" }, disabled: !canSave, @@ -172,7 +218,7 @@ export const WorkunitSummary: React.FunctionComponent = ({ key: "slaveLogs", text: nlsHPCC.SlaveLogs, disabled: !workunit?.ThorLogList, onClick: () => setShowThorSlaveLogs(true) }, - ], [_protected, canDelete, canDeschedule, canReschedule, canSave, description, jobname, refresh, refreshSavings, setShowDeleteConfirm, showMessageBar, workunit, wuid]); + ], [_protected, canDelete, canDeschedule, canReschedule, canSave, description, jobname, otTraceParent, refresh, refreshSavings, setShowDeleteConfirm, showMessageBar, workunit, wuid]); const rightButtons = React.useMemo((): ICommandBarItemProps[] => [ { @@ -222,6 +268,8 @@ export const WorkunitSummary: React.FunctionComponent = ({ Date: Fri, 1 Nov 2024 16:29:49 +0000 Subject: [PATCH 3/9] Split off 9.4.110 Signed-off-by: Gavin Halliday --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- version.cmake | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 5ce36126d20..07ecc4abd54 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.4.109-closedown0 +version: 9.4.111-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.4.109-closedown0 +appVersion: 9.4.111-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 2f6b3bf4504..a8e5feacaa6 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1473,7 +1473,7 @@ Pass in dict with .root, .visibility defined {{- end -}} {{- define "hpcc.generateHelmVersion" -}} -helmVersion: 9.4.109-closedown0 +helmVersion: 9.4.111-closedown0 {{- end -}} {{/* diff --git a/version.cmake b/version.cmake index eff94d9919c..defd89632da 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 4 ) -set ( HPCC_POINT 109 ) +set ( HPCC_POINT 111 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-10-24T15:46:30Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-11-01T16:29:49Z" ) ### From f700e6a87a71d21253d8037efb91cce838857860 Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Fri, 1 Nov 2024 16:33:55 +0000 Subject: [PATCH 4/9] Split off 9.2.136 Signed-off-by: Gavin Halliday --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- version.cmake | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 7954fd07890..f5d9ab635ec 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.2.135-closedown0 +version: 9.2.137-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.2.135-closedown0 +appVersion: 9.2.137-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index d966e72fd0c..39bd5754557 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1361,7 +1361,7 @@ Pass in dict with .root, .visibility defined {{- end -}} {{- define "hpcc.generateHelmVersion" -}} -helmVersion: 9.2.135-closedown0 +helmVersion: 9.2.137-closedown0 {{- end -}} {{/* diff --git a/version.cmake b/version.cmake index b779e1a391f..66b41896bef 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 2 ) -set ( HPCC_POINT 135 ) +set ( HPCC_POINT 137 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-10-24T15:47:37Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-11-01T16:33:55Z" ) ### From 5d8344cf378324743e47539b84094ce20d539fde Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Tue, 5 Nov 2024 09:33:36 +0000 Subject: [PATCH 5/9] HPCC-32664 Fix bug creating DFS Group text causing DNS failures The changes introduced in HPCC-18382 (which preserved hostnames), caused group text (via SocketEndpointArray::getText) to be corrupted under certain circumstances. If the resolved IP of the hostnames in array were sequences, the function encoded it as such, then corrupt the hostnames when deserialized (fromText) was used. Signed-off-by: Jake Smith --- system/jlib/jsocket.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/system/jlib/jsocket.cpp b/system/jlib/jsocket.cpp index 9f4bb2d6b72..e5ce4770c47 100644 --- a/system/jlib/jsocket.cpp +++ b/system/jlib/jsocket.cpp @@ -6380,15 +6380,19 @@ StringBuffer &SocketEndpointArray::getText(StringBuffer &text) const return item(0).getEndpointHostText(text); byte lastip[4]; const SocketEndpoint &first = item(0); - bool lastis4 = first.getNetAddress(sizeof(lastip),&lastip)==sizeof(lastip); - unsigned short lastport = first.port; first.getHostText(text); + bool lastis4 = false; + if (!first.queryHostname()) + lastis4 = first.getNetAddress(sizeof(lastip),&lastip)==sizeof(lastip); + unsigned short lastport = first.port; unsigned rep=0; unsigned range=0; for (unsigned i=1;i Date: Mon, 4 Nov 2024 16:19:52 -0500 Subject: [PATCH 6/9] HPCC-32866 ECL Watch v5 disable tabs in containerized envs Fixes an issue in ECL Watch where "legacy" tabs in the operations section are unavailable, and attempts to reach them result in the page displaying a cryptic exception message from ESP Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- .../eclwatch/ClusterProcessesQueryWidget.js | 19 +++++++++++++++---- esp/src/eclwatch/SystemServersQueryWidget.js | 19 +++++++++++++++---- esp/src/eclwatch/TargetClustersQueryWidget.js | 19 +++++++++++++++---- esp/src/src/nls/hpcc.ts | 1 + 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/esp/src/eclwatch/ClusterProcessesQueryWidget.js b/esp/src/eclwatch/ClusterProcessesQueryWidget.js index 87ac7d5b130..3de56646a9c 100644 --- a/esp/src/eclwatch/ClusterProcessesQueryWidget.js +++ b/esp/src/eclwatch/ClusterProcessesQueryWidget.js @@ -2,6 +2,7 @@ define([ "dojo/_base/declare", "src/nlsHPCC", "dojo/topic", + "dojo/dom-construct", "dijit/registry", @@ -20,7 +21,7 @@ define([ "hpcc/IFrameWidget", "dijit/Dialog", -], function (declare, nlsHPCCMod, topic, +], function (declare, nlsHPCCMod, topic, domConstruct, registry, tree, selector, GridDetailsWidget, ESPPreflight, ESPRequest, WsTopology, Utility, ESPUtil, DelayLoadWidget, PreflightDetailsWidget, MachineInformationWidget, IFrameWidget) { @@ -50,6 +51,10 @@ define([ style: "border: 0; width: 100%; height: 100%" }); this.legacyClustersProcessesIframeWidget.placeAt(this._tabContainer, "last"); + if (dojoConfig.isContainer) { + const legacyTab = registry.byId(this.id + "_LegacyClustersProcessesIframeWidget"); + legacyTab.set("disabled", true); + } }, init: function (params) { @@ -85,9 +90,15 @@ define([ if (currSel.id === this.id + "_Grid") { this.refreshGrid(); } else if (currSel.id === this.legacyClustersProcessesIframeWidget.id && !this.legacyClustersProcessesIframeWidget.initalized) { - this.legacyClustersProcessesIframeWidget.init({ - src: ESPRequest.getBaseURL("WsTopology") + "/TpClusterQuery?Type=ROOT" - }); + if (!dojoConfig.isContainer) { + this.legacyClustersProcessesIframeWidget.init({ + src: ESPRequest.getBaseURL("WsTopology") + "/TpClusterQuery?Type=ROOT" + }); + } else { + const unavailMsg = domConstruct.create("div", { style: { margin: "5px" } }); + unavailMsg.innerText = this.i18n.UnavailableInContainerized; + this.legacyClustersProcessesIframeWidget.contentPane.set("content", unavailMsg); + } } else { currSel.init(currSel.params); } diff --git a/esp/src/eclwatch/SystemServersQueryWidget.js b/esp/src/eclwatch/SystemServersQueryWidget.js index b18f08e6c01..0acf7ea9d68 100644 --- a/esp/src/eclwatch/SystemServersQueryWidget.js +++ b/esp/src/eclwatch/SystemServersQueryWidget.js @@ -4,6 +4,7 @@ define([ "dojo/_base/array", "dojo/dom-class", "dojo/topic", + "dojo/dom-construct", "dijit/registry", "dijit/Dialog", @@ -21,7 +22,7 @@ define([ "hpcc/PreflightDetailsWidget", "hpcc/MachineInformationWidget", "hpcc/IFrameWidget" -], function (declare, nlsHPCCMod, arrayUtil, domClass, topic, +], function (declare, nlsHPCCMod, arrayUtil, domClass, topic, domConstruct, registry, Dialog, tree, selector, GridDetailsWidget, ESPPreflight, ESPRequest, WsTopology, Utility, ESPUtil, DelayLoadWidget, PreflightDetailsWidget, MachineInformationWidget, IFrameWidget) { @@ -71,9 +72,15 @@ define([ if (currSel.id === this.id + "_Grid") { this.refreshGrid(); } else if (currSel.id === this.systemServersQueryWidgetIframeWidget.id && !this.systemServersQueryWidgetIframeWidget.initalized) { - this.systemServersQueryWidgetIframeWidget.init({ - src: ESPRequest.getBaseURL("WsTopology") + "/TpServiceQuery?Type=ALLSERVICES" - }); + if (!dojoConfig.isContainer) { + this.systemServersQueryWidgetIframeWidget.init({ + src: ESPRequest.getBaseURL("WsTopology") + "/TpServiceQuery?Type=ALLSERVICES" + }); + } else { + const unavailMsg = domConstruct.create("div", { style: { margin: "5px" } }); + unavailMsg.innerText = this.i18n.UnavailableInContainerized; + this.systemServersQueryWidgetIframeWidget.contentPane.set("content", unavailMsg); + } } else { currSel.init(currSel.params); } @@ -139,6 +146,10 @@ define([ style: "border: 0; width: 100%; height: 100%" }); this.systemServersQueryWidgetIframeWidget.placeAt(this._tabContainer, "last"); + if (dojoConfig.isContainer) { + const legacyTab = registry.byId(this.id + "_SystemServersQueryWidgetIframeWidget"); + legacyTab.set("disabled", true); + } }, createGrid: function (domID) { diff --git a/esp/src/eclwatch/TargetClustersQueryWidget.js b/esp/src/eclwatch/TargetClustersQueryWidget.js index c58d4b175ee..85e33130515 100644 --- a/esp/src/eclwatch/TargetClustersQueryWidget.js +++ b/esp/src/eclwatch/TargetClustersQueryWidget.js @@ -2,6 +2,7 @@ define([ "dojo/_base/declare", "src/nlsHPCC", "dojo/topic", + "dojo/dom-construct", "dijit/registry", @@ -20,7 +21,7 @@ define([ "hpcc/IFrameWidget", "dijit/Dialog", -], function (declare, nlsHPCCMod, topic, +], function (declare, nlsHPCCMod, topic, domConstruct, registry, tree, selector, GridDetailsWidget, PreflightDetailsWidget, ESPPreflight, ESPRequest, WsTopology, Utility, DelayLoadWidget, ESPUtil, MachineInformationWidget, IFrameWidget) { @@ -61,9 +62,15 @@ define([ if (currSel.id === this.id + "_Grid") { this.refreshGrid(); } else if (currSel.id === this.legacyTargetClustersIframeWidget.id && !this.legacyTargetClustersIframeWidget.initalized) { - this.legacyTargetClustersIframeWidget.init({ - src: ESPRequest.getBaseURL("WsTopology") + "/TpTargetClusterQuery?Type=ROOT" - }); + if (!dojoConfig.isContainer) { + this.legacyTargetClustersIframeWidget.init({ + src: ESPRequest.getBaseURL("WsTopology") + "/TpTargetClusterQuery?Type=ROOT" + }); + } else { + const unavailMsg = domConstruct.create("div", { style: { margin: "5px" } }); + unavailMsg.innerText = this.i18n.UnavailableInContainerized; + this.legacyTargetClustersIframeWidget.contentPane.set("content", unavailMsg); + } } else if (currSel.params.newPreflight || currSel.params.Usergenerated) { //prevents loop of pfTab.init above currSel.init(currSel.params); } @@ -88,6 +95,10 @@ define([ style: "border: 0; width: 100%; height: 100%" }); this.legacyTargetClustersIframeWidget.placeAt(this._tabContainer, "last"); + if (dojoConfig.isContainer) { + const legacyTab = registry.byId(this.id + "_LegacyTargetClustersIframeWidget"); + legacyTab.set("disabled", true); + } this.machineFilter.disable(); }, diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 6c87a0415a7..e1ed54e8c32 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -1064,6 +1064,7 @@ export = { Text: "Text", Tree: "Tree", Type: "Type", + UnavailableInContainerized: "This is unavailable in a containerized environment.", Unbound: "unbound", undefined: "undefined", Unknown: "Unknown", From 5d8d6f02889bb8844001da7715dd33595856f026 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:58:54 -0500 Subject: [PATCH 7/9] HPCC-32956 ECL Watch v9 fix missing breadcrumb fix an issue with the ECL Watch v9 UI where the breadcrumb was missing Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- esp/src/src-react/components/Menu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp/src/src-react/components/Menu.tsx b/esp/src/src-react/components/Menu.tsx index 342cad13d63..214b16454a1 100644 --- a/esp/src/src-react/components/Menu.tsx +++ b/esp/src/src-react/components/Menu.tsx @@ -341,7 +341,7 @@ export const SubNavigation: React.FunctionComponent = ({ ; })} - {!subNav && + {!!subNav && {hashPath.includes("/files/") ? From 35517aa35a719c1e3c3856e6ee9764328b5787e4 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:11:06 -0500 Subject: [PATCH 8/9] HPCC-32957 ECL Watch ZAP dialog invalid date formats fixes an issue in both the v5 and v9 ECL Watch UIs, where in attemping to download a ZAP report the formatting of the date fields could be incorrect Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- esp/src/eclwatch/WUDetailsWidget.js | 4 +++- esp/src/eclwatch/templates/WUDetailsWidget.html | 2 +- esp/src/src-react/components/forms/ZAPDialog.tsx | 11 ++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/esp/src/eclwatch/WUDetailsWidget.js b/esp/src/eclwatch/WUDetailsWidget.js index a6d214c7697..24aa5eb0550 100644 --- a/esp/src/eclwatch/WUDetailsWidget.js +++ b/esp/src/eclwatch/WUDetailsWidget.js @@ -161,7 +161,9 @@ define([ formatLogFilterDateTime: function (dateField, timeField, dateTimeField) { if (dateField.value.toString() !== "Invalid Date") { const d = new Date(dateField.value); - const date = `${d.getFullYear()}-${(d.getMonth() < 9 ? "0" : "") + parseInt(d.getMonth() + 1, 10)}-${d.getDate()}`; + const month = d.getMonth() + 1; + const day = d.getDate(); + const date = `${d.getFullYear()}-${(month < 9 ? "0" : "") + month}-${(day < 9 ? "0" : "") + day}`; const time = timeField.value.toString().replace(/.*1970\s(\S+).*/, "$1"); dateTimeField.value = `${date}T${time}.000Z`; } diff --git a/esp/src/eclwatch/templates/WUDetailsWidget.html b/esp/src/eclwatch/templates/WUDetailsWidget.html index ef58752e1a6..cbc3ade4d7b 100644 --- a/esp/src/eclwatch/templates/WUDetailsWidget.html +++ b/esp/src/eclwatch/templates/WUDetailsWidget.html @@ -205,7 +205,7 @@

- +