diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index ca1ac3e0f88..a298a843a5e 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -102,11 +102,6 @@ jobs: name: docs documentation: true - os: ubuntu-20.04 - - os: centos-8 - - os: centos-7 - cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic" - - os: amazonlinux - cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-amazonlinux-dynamic" - os: rockylinux-8 - os: ubuntu-22.04 name: LN k8s @@ -121,22 +116,10 @@ jobs: - os: ubuntu-20.04 name: LN ln: true - - os: centos-8 - name: LN - cmake_options_extra: "" - ln: true - - os: centos-7 - name: LN - cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic" - ln: true - os: rockylinux-8 name: LN cmake_options_extra: "" ln: true - - os: centos-7-rh-python38 - name: LN Python 3.8 - cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic -DCUSTOM_LABEL=_rh_python38" - ln: true fail-fast: false steps: diff --git a/.github/workflows/build-gh_runner.yml b/.github/workflows/build-gh_runner.yml index fbd791f9115..3a83c51db3d 100644 --- a/.github/workflows/build-gh_runner.yml +++ b/.github/workflows/build-gh_runner.yml @@ -93,7 +93,6 @@ jobs: gnupg \ groff-base \ libtool \ - pkg-config \ software-properties-common \ tar \ unzip \ diff --git a/.github/workflows/build-vcpkg.yml b/.github/workflows/build-vcpkg.yml index 0cf26085f6a..a29f49f26e1 100644 --- a/.github/workflows/build-vcpkg.yml +++ b/.github/workflows/build-vcpkg.yml @@ -10,9 +10,6 @@ on: - 'ubuntu-22.04' - 'ubuntu-20.04' - 'rockylinux-8' - - 'centos-8' - - 'centos-7' - - 'amazonlinux' description: 'Operating System' required: false default: 'ubuntu-22.04' @@ -141,29 +138,6 @@ jobs: os: rockylinux-8 secrets: inherit - build-docker-centos-8: - if: ${{ contains('schedule,push', github.event_name) }} - uses: ./.github/workflows/build-docker.yml - with: - os: centos-8 - secrets: inherit - - build-docker-centos-7: - if: ${{ contains('pull_request,push', github.event_name) }} - uses: ./.github/workflows/build-docker.yml - with: - os: centos-7 - cmake-configuration-ex: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic" - secrets: inherit - - build-docker-amazonlinux: - if: ${{ contains('schedule,push', github.event_name) }} - uses: ./.github/workflows/build-docker.yml - with: - os: amazonlinux - cmake-configuration-ex: "-DVCPKG_TARGET_TRIPLET=x64-amazonlinux-dynamic" - secrets: inherit - build-gh_runner-ubuntu-22_04: if: ${{ contains('schedule,push', github.event_name) }} uses: ./.github/workflows/build-gh_runner.yml diff --git a/.github/workflows/test-smoke-gh_runner.yml b/.github/workflows/test-smoke-gh_runner.yml index f0fdfbaeab5..cc37e0b32e2 100644 --- a/.github/workflows/test-smoke-gh_runner.yml +++ b/.github/workflows/test-smoke-gh_runner.yml @@ -17,7 +17,7 @@ on: type: string description: 'Dependencies' required: false - default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline pkg-config libtool autotools-dev automake git cmake xmlstarlet' + default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' jobs: diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index 902b02f678b..ed1fad9bc21 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -17,7 +17,7 @@ on: type: string description: 'Dependencies' required: false - default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline pkg-config libtool autotools-dev automake git cmake xmlstarlet' + default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' jobs: diff --git a/.github/workflows/test-unit-gh_runner.yml b/.github/workflows/test-unit-gh_runner.yml index 69928aa0811..eb8daf6a069 100644 --- a/.github/workflows/test-unit-gh_runner.yml +++ b/.github/workflows/test-unit-gh_runner.yml @@ -17,7 +17,7 @@ on: type: string description: 'Dependencies' required: false - default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline pkg-config libtool autotools-dev automake git cmake xmlstarlet' + default: 'bison flex build-essential binutils-dev curl lsb-release libcppunit-dev python3-dev default-jdk r-base-dev r-cran-rcpp r-cran-rinside r-cran-inline libtool autotools-dev automake git cmake xmlstarlet' jobs: diff --git a/docs/EN_US/ECLLanguageReference/ECLR_mods/Value-TypeCasting.xml b/docs/EN_US/ECLLanguageReference/ECLR_mods/Value-TypeCasting.xml index 337b77dd7f0..65dfc5827ec 100644 --- a/docs/EN_US/ECLLanguageReference/ECLR_mods/Value-TypeCasting.xml +++ b/docs/EN_US/ECLLanguageReference/ECLR_mods/Value-TypeCasting.xml @@ -34,7 +34,7 @@ MyValue := (INTEGER) MAP(MyString = '1' => MyString, '0'); MySet := (SET OF INTEGER1) [1,2,3,4,5,6,7,8,9,10]; //casts from a SET OF INTEGER8 (the default) to SET OF INTEGER1 -UTPUT(MyBoolean); +OUTPUT(MyBoolean); OUTPUT(MyString); OUTPUT(MyValue); OUTPUT(MySet); diff --git a/esp/services/ws_workunits/ws_workunitsHelpers.hpp b/esp/services/ws_workunits/ws_workunitsHelpers.hpp index 7d7c5d8fe5c..ae040b8aae8 100644 --- a/esp/services/ws_workunits/ws_workunitsHelpers.hpp +++ b/esp/services/ws_workunits/ws_workunitsHelpers.hpp @@ -188,13 +188,15 @@ struct WUComponentLogOptions } else if (!isEmptyString(end)) { - if (isEmptyString(end)) + if (isEmptyString(start)) throw makeStringException(ECLWATCH_INVALID_INPUT, "ZapLogFilter: Empty 'Absolute TimeRange Start' detected!"); } else { if (relativeTimeBufferSecs > 0 ) wuLogSearchTimeBuffSecs = relativeTimeBufferSecs; + else + throw makeStringException(ECLWATCH_INVALID_INPUT, "ZapLogFilter: Invalid 'TimeRange' detected!"); } } @@ -208,9 +210,9 @@ struct WUComponentLogOptions logDataFormat = logAccessFormatFromName(requestedLogDataFormat.str()); StringBuffer start; // Absolute query time range start in YYYY-DD-MMTHH:MM:SS - zapHttpRequest->getParameter("LogFilter_AbsoluteTimeRange_Start", start); + zapHttpRequest->getParameter("LogFilter_AbsoluteTimeRange_StartDate", start); StringBuffer end; // Absolute query time range end in YYYY-DD-MMTHH:MM:SS - zapHttpRequest->getParameter("LogFilter_AbsoluteTimeRange_End", end); + zapHttpRequest->getParameter("LogFilter_AbsoluteTimeRange_EndDate", end); // Query time range based on WU Time +- Buffer in seconds unsigned bufferSecs = (unsigned)zapHttpRequest->getParameterInt("LogFilter_RelativeTimeRangeBuffer", 0); diff --git a/esp/src/eclwatch/ShowIndividualPermissionsWidget.js b/esp/src/eclwatch/ShowIndividualPermissionsWidget.js index fef10399d8b..ae3692d7ce6 100644 --- a/esp/src/eclwatch/ShowIndividualPermissionsWidget.js +++ b/esp/src/eclwatch/ShowIndividualPermissionsWidget.js @@ -181,6 +181,7 @@ define([ evt.preventDefault(); context.calcPermissionState(evt.cell.column.field, evt.value, evt.cell.row.data); evt.grid.store.put(evt.cell.row.data); + const t = window.setTimeout(() => { context.grid.refresh(); window.clearTimeout(t); }, 100); }); return retVal; }, diff --git a/esp/src/package-lock.json b/esp/src/package-lock.json index 06de90bbe29..363b1424c2d 100644 --- a/esp/src/package-lock.json +++ b/esp/src/package-lock.json @@ -18,7 +18,7 @@ "@hpcc-js/chart": "2.83.3", "@hpcc-js/codemirror": "2.62.0", "@hpcc-js/common": "2.71.17", - "@hpcc-js/comms": "2.92.2", + "@hpcc-js/comms": "2.92.3", "@hpcc-js/dataflow": "8.1.6", "@hpcc-js/eclwatch": "2.74.5", "@hpcc-js/graph": "2.85.15", @@ -1859,12 +1859,12 @@ } }, "node_modules/@hpcc-js/comms": { - "version": "2.92.2", - "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.92.2.tgz", - "integrity": "sha512-9AbPnCYuTF6OhbSiG5QMDA2vuF457YL88h2ltuxPOjsOxp9Dp5VFlTkh88vW1W3Yph/+faGhiqUSvLMgFIwXEA==", + "version": "2.92.3", + "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.92.3.tgz", + "integrity": "sha512-0mrIb4kXGTVnvHBpRZk+yas108sSXgIKq6HAGSv/ZJFCXEoKCynoaSH+DFaD9jcfZrVezn4fbjJtqYxXln86tA==", "dependencies": { - "@hpcc-js/ddl-shim": "^2.20.6", - "@hpcc-js/util": "^2.51.0", + "@hpcc-js/ddl-shim": "^2.20.7", + "@hpcc-js/util": "^2.51.1", "@xmldom/xmldom": "0.8.10", "abort-controller": "3.0.0", "node-fetch": "2.7.0", @@ -1873,6 +1873,14 @@ "undici": "5.28.4" } }, + "node_modules/@hpcc-js/comms/node_modules/@hpcc-js/util": { + "version": "2.51.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.1.tgz", + "integrity": "sha512-BJuqg6FGqcV4RR8/BU5e7fASDtkl0Na7dWY+Th7r5ciWKI5AXsO0GtlgwDBt2uLUOlcGOMpYozmdbGSCoSHAvQ==", + "dependencies": { + "tslib": "2.6.3" + } + }, "node_modules/@hpcc-js/comms/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1892,15 +1900,20 @@ } ] }, + "node_modules/@hpcc-js/comms/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, "node_modules/@hpcc-js/dataflow": { "version": "8.1.6", "resolved": "https://registry.npmjs.org/@hpcc-js/dataflow/-/dataflow-8.1.6.tgz", "integrity": "sha512-BMmpA6CP00nRDdeq7MS/LRN+e08dyBnnLWEITK5zuEn8D9sFo4ZJlmrKNp+Lcox/m+CuNqWMTG9Z5c+hK2jUyw==" }, "node_modules/@hpcc-js/ddl-shim": { - "version": "2.20.6", - "resolved": "https://registry.npmjs.org/@hpcc-js/ddl-shim/-/ddl-shim-2.20.6.tgz", - "integrity": "sha512-0N9KwRr2rzSJEhfXjEDmT2IBf2Bm6QJ4ReOzhu1wTN3O3gKkUXxNxJMDePFyCNaeHaNWGEQOxewf1q9NtrSkbA==", + "version": "2.20.7", + "resolved": "https://registry.npmjs.org/@hpcc-js/ddl-shim/-/ddl-shim-2.20.7.tgz", + "integrity": "sha512-n+MQBW9zgfhN6zCTaZSiZfMAJfhR6bw4Fuo4fMhQdF2x17Yu/DbN8MReNvyq2OOBmxkwcp28/VxYnsJeppWMQw==", "hasInstallScript": true, "dependencies": { "ajv": "6.12.6" diff --git a/esp/src/package.json b/esp/src/package.json index 9f825f692bf..6030c085361 100644 --- a/esp/src/package.json +++ b/esp/src/package.json @@ -44,7 +44,7 @@ "@hpcc-js/chart": "2.83.3", "@hpcc-js/codemirror": "2.62.0", "@hpcc-js/common": "2.71.17", - "@hpcc-js/comms": "2.92.2", + "@hpcc-js/comms": "2.92.3", "@hpcc-js/dataflow": "8.1.6", "@hpcc-js/eclwatch": "2.74.5", "@hpcc-js/graph": "2.85.15", diff --git a/esp/src/src-react/components/FileDetails.tsx b/esp/src/src-react/components/FileDetails.tsx index 599339bc7da..c936e617142 100644 --- a/esp/src/src-react/components/FileDetails.tsx +++ b/esp/src/src-react/components/FileDetails.tsx @@ -41,10 +41,10 @@ export const FileDetails: React.FunctionComponent = ({ }) => { const [file] = useFile(cluster, logicalFile); React.useEffect(() => { - if (file?.NodeGroup && cluster === undefined) { + if (file?.NodeGroup && cluster === undefined && !file?.isSuperfile) { replaceUrl(`/files/${file.NodeGroup}/${logicalFile}`); } - }, [cluster, file?.NodeGroup, logicalFile]); + }, [cluster, file?.NodeGroup, file?.isSuperfile, logicalFile]); const [defFile] = useDefFile(cluster, logicalFile, WsDfu.DFUDefFileFormat.def); const [xmlFile] = useDefFile(cluster, logicalFile, WsDfu.DFUDefFileFormat.xml); diff --git a/esp/src/src-react/components/LogicalFileSummary.tsx b/esp/src/src-react/components/LogicalFileSummary.tsx index 469f2c57b83..a2551783357 100644 --- a/esp/src/src-react/components/LogicalFileSummary.tsx +++ b/esp/src/src-react/components/LogicalFileSummary.tsx @@ -181,7 +181,7 @@ export const LogicalFileSummary: React.FunctionComponent ({ label: "", type: "link", value: row.Name, href: `#/files/${row.Name}` })) }, + "SuperOwner": { label: nlsHPCC.SuperFile, type: "links", links: file?.Superfiles?.DFULogicalFile?.map(row => ({ label: "", type: "link", value: row.Name, href: `#/files/${row.NodeGroup !== null ? row.NodeGroup : undefined}/${row.Name}` })) }, "NodeGroup": { label: nlsHPCC.ClusterName, type: "string", value: file?.NodeGroup, readonly: true }, "Description": { label: nlsHPCC.Description, type: "string", value: description }, "JobName": { label: nlsHPCC.JobName, type: "string", value: file?.JobName, readonly: true }, diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index ee05e3055e3..03f1e4d3a72 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -450,6 +450,7 @@ export const Metrics: React.FunctionComponent = ({ const propsTable2 = useConst(() => new Table() .columns([nlsHPCC.Property, nlsHPCC.Value]) .columnWidth("auto") + .sortable(true) ); const updatePropsTable2 = React.useCallback((selection: IScope[]) => { diff --git a/esp/src/src-react/components/MetricsPropertiesTables.tsx b/esp/src/src-react/components/MetricsPropertiesTables.tsx index 470516b55f7..83d8a894cff 100644 --- a/esp/src/src-react/components/MetricsPropertiesTables.tsx +++ b/esp/src/src-react/components/MetricsPropertiesTables.tsx @@ -23,6 +23,7 @@ export const MetricsPropertiesTables: React.FunctionComponent new Table() .columns([nlsHPCC.Property, nlsHPCC.Value, "Avg", "Min", "Max", "Delta", "StdDev", "SkewMin", "SkewMax", "NodeMin", "NodeMax"]) .columnWidth("auto") + .sortable(true) ); React.useEffect(() => { diff --git a/esp/src/src-react/components/PermissionsEditor.tsx b/esp/src/src-react/components/PermissionsEditor.tsx new file mode 100644 index 00000000000..b1d453f2354 --- /dev/null +++ b/esp/src/src-react/components/PermissionsEditor.tsx @@ -0,0 +1,205 @@ +import * as React from "react"; +import { Checkbox, CommandBar, ContextualMenuItemType, ICommandBarItemProps, Label, Stack } from "@fluentui/react"; +import { WsAccess, AccessService } from "@hpcc-js/comms"; +import { scopedLogger } from "@hpcc-js/util"; +import nlsHPCC from "src/nlsHPCC"; +import { useConfirm } from "../hooks/confirm"; +import { HolyGrail } from "../layouts/HolyGrail"; +import { ShortVerticalDivider } from "./Common"; +import { AddGroupResourceForm } from "./forms/AddGroupResource"; + +const logger = scopedLogger("src-react/components/PermissionsEditor.tsx"); + +const service = new AccessService({ baseUrl: "" }); + +// from ShowIndividualPermissionsWidget.js +const calcPermissionState = (field, value, row) => { + switch (field) { + case "allow_access": + row.allow_full = value && row.allow_read && row.allow_write; + if (value) + calcPermissionState("deny_access", false, row); + break; + case "allow_read": + row.allow_full = row.allow_access && value && row.allow_write; + if (value) + calcPermissionState("deny_read", false, row); + break; + case "allow_write": + row.allow_full = row.allow_access && row.allow_read && value; + if (value) + calcPermissionState("deny_write", false, row); + break; + case "allow_full": + row.allow_access = value; + row.allow_read = value; + row.allow_write = value; + if (value) + calcPermissionState("deny_full", false, row); + break; + case "deny_access": + row.deny_full = value && row.deny_read && row.deny_write; + if (value) + calcPermissionState("allow_access", false, row); + break; + case "deny_read": + row.deny_full = row.deny_access && value && row.deny_write; + if (value) + calcPermissionState("allow_read", false, row); + break; + case "deny_write": + row.deny_full = row.deny_access && row.deny_read && value; + if (value) + calcPermissionState("allow_write", false, row); + break; + case "deny_full": + row.deny_access = value; + row.deny_read = value; + row.deny_write = value; + if (value) + calcPermissionState("allow_full", false, row); + break; + } + row[field] = value; +}; + +interface PermissionsEditorProps { + BaseDn?: string; + Name?: string; +} + +export const PermissionsEditor: React.FunctionComponent = ({ + BaseDn, + Name +}) => { + + const [data, setData] = React.useState([]); + const [selectedIndex, setSelectedIndex] = React.useState(-1); + const [showAddGroup, setShowAddGroup] = React.useState(false); + + const refreshData = React.useCallback(() => { + service.ResourcePermissions({ BasednName: BaseDn, name: Name }) + .then(({ Permissions }: WsAccess.ResourcePermissionsResponse) => { + setData(Permissions?.Permission.map(Permission => { + return { + account_name: Permission.account_name, + allow_access: Permission.allow_access ?? false, + allow_read: Permission.allow_read ?? false, + allow_write: Permission.allow_write ?? false, + allow_full: Permission.allow_full ?? false, + deny_access: Permission.deny_access ?? false, + deny_read: Permission.deny_read ?? false, + deny_write: Permission.deny_write ?? false, + deny_full: Permission.deny_full ?? false, + }; + })); + setSelectedIndex(-1); + }) + .catch(err => logger.error(err)) + ; + }, [BaseDn, Name]); + + const [DeleteConfirm, setShowDeleteConfirm] = useConfirm({ + title: nlsHPCC.Delete, + message: nlsHPCC.DeleteSelectedGroups + "\n\n" + data[selectedIndex]?.account_name, + onSubmit: React.useCallback(() => { + service.PermissionAction({ + action: "delete", + BasednName: BaseDn, + rname: Name, + account_name: data[selectedIndex]?.account_name + }) + .then(() => refreshData()) + .catch(err => logger.error(err)) + ; + }, [BaseDn, data, Name, refreshData, selectedIndex]) + }); + + // Command Bar --- + const buttons = React.useMemo((): ICommandBarItemProps[] => [ + { + key: "refresh", text: nlsHPCC.Refresh, iconProps: { iconName: "Refresh" }, + onClick: () => refreshData() + }, + { key: "divider_1", itemType: ContextualMenuItemType.Divider, onRender: () => }, + { + key: "add", text: nlsHPCC.Add, + onClick: () => setShowAddGroup(true) + }, + { key: "divider_2", itemType: ContextualMenuItemType.Divider, onRender: () => }, + { + key: "delete", text: nlsHPCC.Delete, disabled: selectedIndex < 0, + onClick: () => setShowDeleteConfirm(true) + }, + ], [refreshData, selectedIndex, setShowDeleteConfirm]); + + React.useEffect(() => { + refreshData(); + }, [refreshData]); + + const onRowSelect = React.useCallback((evt, index) => { + if (evt.target.checked) { + setSelectedIndex(index); + } else { + setSelectedIndex(-1); + } + }, [setSelectedIndex]); + + const onPermissionCheckboxClick = React.useCallback((evt, permission, prop) => { + calcPermissionState(prop, evt.target.checked, permission); + service.PermissionAction({ + action: "update", + BasednName: BaseDn, + rname: Name, + account_type: 1, + ...permission + }).then(({ retcode, retmsg }) => { + if (retcode === 0) { + setData(prevState => { + const newState = Array.from(prevState); + return newState; + }); + } else if (retcode === -1) { + logger.error(retmsg); + refreshData(); + } + }).catch(err => logger.error(err)); + }, [BaseDn, Name, refreshData]); + + return <> + } + main={ +
+ + + + + + + + + + + + {data?.map((permission, index) => ( + + onRowSelect(ev, index)} /> + {permission.account_name} + onPermissionCheckboxClick(ev, permission, "allow_access")} /> + onPermissionCheckboxClick(ev, permission, "allow_read")} /> + onPermissionCheckboxClick(ev, permission, "allow_write")} /> + onPermissionCheckboxClick(ev, permission, "allow_full")} /> + onPermissionCheckboxClick(ev, permission, "deny_access")} /> + onPermissionCheckboxClick(ev, permission, "deny_read")} /> + onPermissionCheckboxClick(ev, permission, "deny_write")} /> + onPermissionCheckboxClick(ev, permission, "deny_full")} /> + + ))} +
+ } + /> + + + ; +}; \ No newline at end of file diff --git a/esp/src/src-react/components/Security.tsx b/esp/src/src-react/components/Security.tsx index fac4c8ed7a6..260f7b6239a 100644 --- a/esp/src/src-react/components/Security.tsx +++ b/esp/src/src-react/components/Security.tsx @@ -4,10 +4,10 @@ import { SizeMe } from "react-sizeme"; import { pushUrl } from "../util/history"; import { Groups } from "./Groups"; import { Permissions } from "./Permissions"; +import { PermissionsEditor } from "./PermissionsEditor"; import { Users } from "./Users"; import { useBuildInfo } from "../hooks/platform"; import { pivotItemStyle } from "../layouts/pivot"; -import { DojoAdapter } from "../layouts/DojoAdapter"; import nlsHPCC from "src/nlsHPCC"; interface SecurityProps { @@ -59,7 +59,7 @@ export const Security: React.FunctionComponent = ({ } {name && baseDn && - + } diff --git a/esp/src/src-react/components/SubFiles.tsx b/esp/src/src-react/components/SubFiles.tsx index 7337454931f..e7088869472 100644 --- a/esp/src/src-react/components/SubFiles.tsx +++ b/esp/src/src-react/components/SubFiles.tsx @@ -5,7 +5,7 @@ import nlsHPCC from "src/nlsHPCC"; import { QuerySortItem } from "src/store/Store"; import * as WsDfu from "src/WsDfu"; import { useConfirm } from "../hooks/confirm"; -import { useFile } from "../hooks/file"; +import { useFile, useSubfiles } from "../hooks/file"; import { FluentGrid, useCopyButtons, useFluentStoreState, FluentColumns } from "./controls/Grid"; import { ShortVerticalDivider } from "./Common"; import { pushUrl } from "../util/history"; @@ -28,7 +28,8 @@ export const SubFiles: React.FunctionComponent = ({ sort = defaultSort }) => { - const [file, , , refresh] = useFile(cluster, logicalFile); + const [file] = useFile(cluster, logicalFile); + const [subfiles, refreshSubfiles] = useSubfiles(cluster, logicalFile); const [uiState, setUIState] = React.useState({ ...defaultUIState }); const [data, setData] = React.useState([]); const { @@ -101,26 +102,30 @@ export const SubFiles: React.FunctionComponent = ({ message: nlsHPCC.RemoveSubfiles2, items: selection.map(item => item.Name), onSubmit: React.useCallback(() => { - WsDfu.SuperfileAction("remove", file.Name, selection, false).then(() => refresh()); - }, [file, refresh, selection]) + WsDfu.SuperfileAction("remove", file.Name, selection, false).then(() => refreshSubfiles()); + }, [file, refreshSubfiles, selection]) }); React.useEffect(() => { - const subfiles = []; + const files = []; const promises = []; - file?.subfiles?.Item.forEach(item => { + subfiles?.Item.forEach(item => { const logicalFile = ESPLogicalFile.Get("", item); promises.push(logicalFile.getInfo2({ onAfterSend: function (response) { } })); - subfiles.push(logicalFile); + files.push(logicalFile); }); - Promise.all(promises).then(logicalFiles => { - setData(subfiles); - }); - }, [file?.subfiles]); + if (promises.length) { + Promise.all(promises).then(logicalFiles => { + setData(files); + }); + } else { + setData(files); + } + }, [file, subfiles]); const buttons = React.useMemo((): ICommandBarItemProps[] => [ { diff --git a/esp/src/src-react/components/SuperFiles.tsx b/esp/src/src-react/components/SuperFiles.tsx index b1cbe3bdd0b..b9cb69e99e4 100644 --- a/esp/src/src-react/components/SuperFiles.tsx +++ b/esp/src/src-react/components/SuperFiles.tsx @@ -43,11 +43,11 @@ export const SuperFiles: React.FunctionComponent = ({ label: nlsHPCC.Name, sortable: true, formatter: (name, row) => { - return {name}; + return {name}; } } }; - }, [cluster]); + }, []); // Command Bar --- const buttons = React.useMemo((): ICommandBarItemProps[] => [ diff --git a/esp/src/src-react/components/forms/AddGroupResource.tsx b/esp/src/src-react/components/forms/AddGroupResource.tsx new file mode 100644 index 00000000000..0df103bf4a7 --- /dev/null +++ b/esp/src/src-react/components/forms/AddGroupResource.tsx @@ -0,0 +1,129 @@ +import * as React from "react"; +import { Checkbox, DefaultButton, PrimaryButton, TextField, } from "@fluentui/react"; +import { AccessService } from "@hpcc-js/comms"; +import { scopedLogger } from "@hpcc-js/util"; +import { useForm, Controller } from "react-hook-form"; +import nlsHPCC from "src/nlsHPCC"; +import { MessageBox } from "../../layouts/MessageBox"; + +const logger = scopedLogger("src-react/components/forms/AddGroupResource.tsx"); + +const service = new AccessService({ baseUrl: "" }); + +interface AddGroupResourceFormValues { + account_name: string; + allow_access: boolean; + allow_read: boolean; + allow_write: boolean; + allow_full: boolean; +} + +const defaultValues: AddGroupResourceFormValues = { + account_name: "", + allow_access: false, + allow_read: false, + allow_write: false, + allow_full: false +}; + +interface AddGroupResourceFormProps { + rname: string; + BasednName: string; + refreshGrid?: () => void; + showForm: boolean; + setShowForm: (_: boolean) => void; +} + +export const AddGroupResourceForm: React.FunctionComponent = ({ + rname, + BasednName, + refreshGrid, + showForm, + setShowForm +}) => { + + const { handleSubmit, control, reset } = useForm({ defaultValues }); + + const closeForm = React.useCallback(() => { + setShowForm(false); + }, [setShowForm]); + + const onSubmit = React.useCallback(() => { + handleSubmit( + (data, evt) => { + const request: any = data; + + request["action"] = "update"; + request["account_type"] = "1"; + request["rname"] = rname; + request["BasednName"] = BasednName; + + service.PermissionAction(request) + .then(() => { + closeForm(); + reset(defaultValues); + if (refreshGrid) refreshGrid(); + }) + .catch(err => logger.error(err)) + ; + }, + logger.info + )(); + }, [BasednName, closeForm, handleSubmit, refreshGrid, reset, rname]); + + return + + { reset(defaultValues); closeForm(); }} /> + }> + } + rules={{ + required: nlsHPCC.ValidationErrorRequired + }} + /> +
+ } + /> +
+
+ } + /> +
+
+ } + /> +
+
+ } + /> +
+
; +}; diff --git a/esp/src/src-react/components/forms/AddPermission.tsx b/esp/src/src-react/components/forms/AddPermission.tsx index 39f7df0f866..5b44b6eb7e2 100644 --- a/esp/src/src-react/components/forms/AddPermission.tsx +++ b/esp/src/src-react/components/forms/AddPermission.tsx @@ -67,7 +67,7 @@ export const AddPermissionForm: React.FunctionComponent )(); }, [closeForm, handleSubmit, refreshGrid, reset]); - return { reset(defaultValues); closeForm(); }} /> diff --git a/esp/src/src-react/components/forms/ZAPDialog.tsx b/esp/src/src-react/components/forms/ZAPDialog.tsx index a1a8dcfb158..63ae009560d 100644 --- a/esp/src/src-react/components/forms/ZAPDialog.tsx +++ b/esp/src/src-react/components/forms/ZAPDialog.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { Checkbox, DefaultButton, Dropdown, Icon, IDropdownProps, IOnRenderComboBoxLabelProps, IStackTokens, ITextFieldProps, mergeStyleSets, PrimaryButton, Stack, TextField, TooltipHost } from "@fluentui/react"; +import { Checkbox, DefaultButton, Dropdown, Icon, IDropdownProps, IOnRenderComboBoxLabelProps, IStackTokens, ITextFieldProps, mergeStyleSets, PrimaryButton, Spinner, Stack, TextField, TooltipHost } from "@fluentui/react"; import { useForm, Controller } from "react-hook-form"; import { LogType } from "@hpcc-js/comms"; import { scopedLogger } from "@hpcc-js/util"; @@ -168,6 +168,8 @@ export const ZAPDialog: React.FunctionComponent = ({ }), [theme]); const [emailDisabled, setEmailDisabled] = React.useState(true); + const [submitDisabled, setSubmitDisabled] = React.useState(false); + const [spinnerHidden, setSpinnerHidden] = React.useState(true); const [columnMode, setColumnMode] = React.useState(ColumnMode.DEFAULT); const [logFormat, setLogFormat] = React.useState(LogFormat.CSV); const [showCustomColumns, setShowCustomColumns] = React.useState(false); @@ -188,6 +190,8 @@ export const ZAPDialog: React.FunctionComponent = ({ const logFilter = data.LogFilter; delete data.LogFilter; + setSubmitDisabled(true); + setSpinnerHidden(false); for (const key in data) { formData.append(key, data[key]); @@ -227,6 +231,8 @@ export const ZAPDialog: React.FunctionComponent = ({ link.click(); link.remove(); + setSubmitDisabled(false); + setSpinnerHidden(true); closeForm(); if (logAccessorMessage !== "") { @@ -257,7 +263,8 @@ export const ZAPDialog: React.FunctionComponent = ({ return - + + closeForm()} /> }> { - const file = LogicalFile.attach({ baseUrl: "" }, cluster, name); + const file = LogicalFile.attach({ baseUrl: "" }, cluster === "undefined" ? undefined : cluster, name); let active = true; let handle; const fetchInfo = singletonDebounce(file, "fetchInfo"); @@ -87,3 +87,23 @@ export function useFileHistory(cluster: string, name: string): [WsDfu.Origin[], return [history, eraseHistory, increment]; } + +export function useSubfiles(cluster: string, name: string): [WsDfu.subfiles, () => void] { + + const [file] = useFile(cluster, name); + const [subfiles, setSubfiles] = React.useState({ Item: [] }); + const [count, increment] = useCounter(); + + React.useEffect(() => { + if (file) { + file.fetchInfo() + .then(response => { + setSubfiles(response.subfiles ?? { Item: [] }); + }) + .catch(err => logger.error(err)) + ; + } + }, [file, count]); + + return [subfiles, increment]; +} diff --git a/esp/src/src/nls/bs/hpcc.ts b/esp/src/src/nls/bs/hpcc.ts index 7a4097a5a93..cfe65e83908 100644 --- a/esp/src/src/nls/bs/hpcc.ts +++ b/esp/src/src/nls/bs/hpcc.ts @@ -412,6 +412,8 @@ IgnoreGlobalStoreOutEdges: "Zanemarite globalne ivice", Import: "Uvoz", Inactive: "Neaktivan", + IncludePerComponentLogs: "Uključite zapise po komponenti", + IncludeRelatedLogs: "Uključite relevantne zapise", IncludeSlaveLogs: "Uključite Izvještaje Sa Nodova Izvršilaca", IncludeSubFileInfo: "Uključiti informacije o poddatoteci?", Index: "Indeks", @@ -583,6 +585,7 @@ Newest: "Najnoviji", NewPassword: "Nova Lozinka", NextSelection: "Slijedeća Selekcija", + NextWorkunit: "Sljedeća radna jedinica", NoCommon: "Nema uobičajenog", NoContent: "(Bez sadržaja)", NoContentPleaseSelectItem: "Nema sadržaja - odaberite stavku", @@ -715,6 +718,7 @@ PressCtrlCToCopy: "Pritisnite ctrl + c za kopiranje.", Preview: "Pregled", PreviousSelection: "Prethodna Selekcija", + PreviousWorkunit: "Prethodna radna jedinica", PrimaryLost: "Primarni Je Izgubljen", PrimaryMonitoring: "Primarni Nadzor", Priority: "Prioritet", @@ -836,6 +840,7 @@ Save: "Sačuvajte", Scope: "Područje", SearchResults: "Rezultati Pretraživanja", + Seconds: "Sekunde", SecondsRemaining: "Preostalo Sekundi", Security: "Sigurnost", SecurityMessageHTML: "Pogledajte HTML samo od pouzdanih korisnika. Ovu radnu jedinicu kreirao je '{__placeholder__}'. Prikaži HTML?", @@ -934,6 +939,7 @@ SuspendedReason: "Razlog za Suspendovanje", SVGSource: "SVG Izvor", SyncSelection: "Sinhronizujte Sa Odabranim", + Syntax: "Sintaksa", SystemServers: "Sistem Servera", Table: "Tabela", tag: "tag", @@ -961,6 +967,7 @@ TimeMaxTotalExecuteMinutes: "Maksimalno ukupno vrijeme izvršavanja u minutama", TimeMeanTotalExecuteMinutes: "Prosječno ukupno vrijeme izvršavanja u minutama", TimeMinTotalExecuteMinutes: "Minimalno ukupno vrijeme izvršavanja u minutama", + TimePenalty: "Vremenska kazna", Timers: "Mjerači Vremena", TimeSeconds: "Vrijeme (Sekunde)", TimeStamp: "Vremenska Oznaka", @@ -1128,6 +1135,7 @@ WildcardFilter: "Višeznačni filter", Workflows: "Tokovi poslova", Workunit: "Radna Jedinica", + WorkunitNotFound: "Radna jedinica nije pronađena", Workunits: "Radne Jedinice", WorkUnitScopeDefaultPermissions: "Unaprijed Definisane Dozvole za Prostor za Radne Jedinice", Wrap: "Zamotajte", diff --git a/esp/src/src/nls/fr/hpcc.ts b/esp/src/src/nls/fr/hpcc.ts index d4f65ed9ca6..d2385e93462 100644 --- a/esp/src/src/nls/fr/hpcc.ts +++ b/esp/src/src/nls/fr/hpcc.ts @@ -412,6 +412,8 @@ export = { IgnoreGlobalStoreOutEdges: "Ignorer les bords de sortie du dépot global", Import: "Importer", Inactive: "Inactive", + IncludePerComponentLogs: "Inclure les journaux par composant", + IncludeRelatedLogs: "Inclure les journaux associés", IncludeSlaveLogs: "Inclure les journaux esclaves", IncludeSubFileInfo: "Inclure les informations du sous-fichier ?", Index: "Indice", @@ -583,6 +585,7 @@ export = { Newest: "Le plus récent", NewPassword: "Nouveau mot de passe", NextSelection: "Séléction suivante", + NextWorkunit: "Workunit suivante", NoCommon: "Pas commun", NoContent: "(Pas de contenu)", NoContentPleaseSelectItem: "Aucun contenu - veuillez sélectionner un élément", @@ -713,6 +716,7 @@ export = { PressCtrlCToCopy: "Appuyez sur ctrl + c pour copier.", Preview: "Aperçu", PreviousSelection: "Séléction précédante", + PreviousWorkunit: "Workunit précédente", PrimaryLost: "Primaire perdu", PrimaryMonitoring: "Surveillance primaire", Priority: "Priorité", @@ -832,6 +836,7 @@ export = { Save: "Sauver", Scope: "Portée", SearchResults: "Résultats de recherche", + Seconds: "Secondes", SecondsRemaining: "Secondes restantes", Security: "Sécurité", SecurityMessageHTML: "Afficher uniquement le code HTML des utilisateurs confiables. Cette unité de travail a été créée par '{__placeholder__}'. Afficher le HTML ?", @@ -930,6 +935,7 @@ export = { SuspendedReason: "Raison d'être suspendu", SVGSource: "Source SVG", SyncSelection: "Synchroniser avec la sélection", + Syntax: "Syntaxe", SystemServers: "Système de serveurs", Table: "Table", tag: "étiquette", @@ -957,6 +963,7 @@ export = { TimeMaxTotalExecuteMinutes: "Temps Maximum Total Exécuter Minutes", TimeMeanTotalExecuteMinutes: "Temps Moyen Total Exécuter Minutes", TimeMinTotalExecuteMinutes: "Temps Minimum Total Exécuter Minutes", + TimePenalty: "Pénalité de temps", Timers: "Minuteurs", TimeSeconds: "Temps (secondes)", TimeStamp: "Horodatage", @@ -1123,6 +1130,7 @@ export = { WildcardFilter: "Filtre générique", Workflows: "Flux de travail", Workunit: "Workunit", + WorkunitNotFound: "Workunit introuvable", Workunits: "Workunits", WorkUnitScopeDefaultPermissions: "Autorisations par défaut de l'étendue du workunit", Wrap: "Emballage", diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 00c1f83540c..948de38b62f 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -31,6 +31,7 @@ export = { AddBinding: "Add Binding", AddFile: "Add File", AddGroup: "Add Group", + AddResource: "Add Resource", AddtionalProcessesToFilter: "Addtional Processes To Filter", AdditionalResources: "Additional Resources", AddPart: "Add Part", diff --git a/esp/src/src/nls/hr/hpcc.ts b/esp/src/src/nls/hr/hpcc.ts index 72c1c4b2558..741b9486323 100644 --- a/esp/src/src/nls/hr/hpcc.ts +++ b/esp/src/src/nls/hr/hpcc.ts @@ -412,6 +412,8 @@ IgnoreGlobalStoreOutEdges: "Zanemarite globalne rubove", Import: "Uvoz", Inactive: "Neaktivan", + IncludePerComponentLogs: "Uključite zapise po komponenti", + IncludeRelatedLogs: "Uključite relevantne zapise", IncludeSlaveLogs: "Uključite Izvještaje Sa Nodova Izvršilaca", IncludeSubFileInfo: "Uključiti informacije o poddatoteci?", Index: "Indeks", @@ -583,6 +585,7 @@ Newest: "Najnoviji", NewPassword: "Nova Lozinka", NextSelection: "Sljedeći Odabir", + NextWorkunit: "Sljedeća radna jedinica", NoCommon: "Nema uobičajenog", NoContent: "(Bez sadržaja)", NoContentPleaseSelectItem: "Nema sadržaja - odaberite stavku", @@ -715,6 +718,7 @@ PressCtrlCToCopy: "Pritisnite ctrl + c za kopiranje.", Preview: "Pregled", PreviousSelection: "Prethodni Odabir", + PreviousWorkunit: "Prethodna radna jedinica", PrimaryLost: "Primarni Je Izgubljen", PrimaryMonitoring: "Primarni Nadzor", Priority: "Prioritet", @@ -836,6 +840,7 @@ Save: "Sačuvajte", Scope: "Područje", SearchResults: "Rezultati Pretraživanja", + Seconds: "Sekunde", SecondsRemaining: "Preostalo Sekundi", Security: "Sigurnost", SecurityMessageHTML: "Gledajte HTML samo od pouzdanih korisnika. Ovu radnu jedinicu izradio je '{__placeholder__}'. Prikaži HTML?", @@ -934,6 +939,7 @@ SuspendedReason: "Razlog za Suspendovanje", SVGSource: "SVG Izvor", SyncSelection: "Sinhronizujte Sa Odabranim", + Syntax: "Sintaksa", SystemServers: "Sistem Servera", Table: "Tabela", tag: "tag", @@ -961,6 +967,7 @@ TimeMaxTotalExecuteMinutes: "Maksimalno ukupno vrijeme izvršavanja u minutama", TimeMeanTotalExecuteMinutes: "Prosječno ukupno vrijeme izvršavanja u minutama", TimeMinTotalExecuteMinutes: "Minimalno ukupno vrijeme izvršavanja u minutama", + TimePenalty: "Vremenska kazna", Timers: "Mjerači Vremena", TimeSeconds: "Vrijeme (Sekunde)", TimeStamp: "Vremenska Oznaka", @@ -1128,6 +1135,7 @@ WildcardFilter: "Filter zamjenskih znakova", Workflows: "Tokovi poslova", Workunit: "Radna Jedinica", + WorkunitNotFound: "Radna jedinica nije pronađena", Workunits: "Radne Jedinice", WorkUnitScopeDefaultPermissions: "Unaprijed Definisane Dozvole za Prostor za Radne Jedinice", Wrap: "Zamotajte", diff --git a/esp/src/src/nls/hu/hpcc.ts b/esp/src/src/nls/hu/hpcc.ts index 0bed99cb1c3..ef57638c03d 100644 --- a/esp/src/src/nls/hu/hpcc.ts +++ b/esp/src/src/nls/hu/hpcc.ts @@ -412,6 +412,8 @@ export = { IgnoreGlobalStoreOutEdges: "A 'Global Storage Out Edges' metrika figyelmen kívül hagyása", Import: "Import", Inactive: "Inaktív", + IncludePerComponentLogs: "Komponensenkénti naplók felvétele", + IncludeRelatedLogs: "Tartalmazza a kapcsolódó naplókat", IncludeSlaveLogs: "Slave logok hozzáadása", IncludeSubFileInfo: "Hozzáadjuk az al-fájl információkat is?", Index: "Index", @@ -583,6 +585,7 @@ export = { Newest: "Legújabb", NewPassword: "Új jelszó", NextSelection: "Következő kiválasztott", + NextWorkunit: "Következő munkaegység", NoCommon: "Nem közös", NoContent: "(Nincs tartalom)", NoContentPleaseSelectItem: "Nincs tartalom - válaszon ki egy elemet", @@ -715,6 +718,7 @@ export = { PressCtrlCToCopy: "A másoláshoz nyomja meg a - gombokat.", Preview: "Előnézet", PreviousSelection: "Előző kiválasztott", + PreviousWorkunit: "Előző munkaegység", PrimaryLost: "Elveszett az elsődleges változat", PrimaryMonitoring: "Elsődleges felügyelet", Priority: "Prioritás", @@ -836,6 +840,7 @@ export = { Save: "Mentés", Scope: "Hatókör", SearchResults: "Keresések", + Seconds: "Másodpercek", SecondsRemaining: "másodperc maradt", Security: "Biztonság", SecurityMessageHTML: "Csak megbízható felhasználóktól származó HTML tekinthető meg. Ezt a munkaegységet '{__placeholder__}' hozta létre. HTML megjelenítése?", @@ -935,6 +940,7 @@ export = { SVGSource: "SVG forrás", Sync: "Szinkronizálás", SyncSelection: "Szinkronizálás a kiválasztottakhoz", + Syntax: "Szintaxis", SystemServers: "Rendszer kiszolgálók", Table: "Táblázat", tag: "jel", @@ -962,6 +968,7 @@ export = { TimeMaxTotalExecuteMinutes: "Maximális futási idők összege (perc)", TimeMeanTotalExecuteMinutes: "Átlagos futási idők összege (perc)", TimeMinTotalExecuteMinutes: "Minimális futási idők összege (perc)", + TimePenalty: "Időbüntetés", Timers: "Időzítések", TimeSeconds: "Idő (másodperc)", TimeStamp: "Időbélyeg", @@ -1129,6 +1136,7 @@ export = { WildcardFilter: "Wildcard szűrő", Workflows: "Munkafolyamat", Workunit: "Feladat", + WorkunitNotFound: "Munkaegység nem található", Workunits: "Feladatok", WorkUnitScopeDefaultPermissions: "Alapértelmezett feldolgozás-hatókör hozzáférési jogok", Wrap: "Csomagol (Wrap)", diff --git a/esp/src/src/nls/pt-br/hpcc.ts b/esp/src/src/nls/pt-br/hpcc.ts index a6c24fdd548..a60183f5a5c 100644 --- a/esp/src/src/nls/pt-br/hpcc.ts +++ b/esp/src/src/nls/pt-br/hpcc.ts @@ -412,6 +412,8 @@ IgnoreGlobalStoreOutEdges: "Ignorar Global Store Out Edges", Import: "Importar", Inactive: "Inativo", + IncludePerComponentLogs: "Incluir logs por componente", + IncludeRelatedLogs: "Incluir logs relacionados", IncludeSlaveLogs: "Incluie logs escravos", IncludeSubFileInfo: "Incluir informações de subarquivo?", Index: "Índice", @@ -583,6 +585,7 @@ Newest: "Mais recente", NewPassword: "Senha Nova", NextSelection: "Próxima Seleção", + NextWorkunit: "Próxima WU", NoCommon: "Incomum", NoContent: "(sem conteúdo)", NoContentPleaseSelectItem: "Sem conteúdo - selecione um item", @@ -715,6 +718,7 @@ PressCtrlCToCopy: "Pressione ctrl + c para copiar.", Preview: "Prévia", PreviousSelection: "Seleção Anterior", + PreviousWorkunit: "WU anterior", PrimaryLost: "Principal Perdido", PrimaryMonitoring: "Monitorador Principal", Priority: "Prioridade", @@ -836,6 +840,7 @@ Save: "Salvar", Scope: "Escopo", SearchResults: "Resultado da Busca", + Seconds: "Segundos", SecondsRemaining: "Segundos Restantes", Security: "Segurança", SecurityMessageHTML: "Visualizar apenas HTML de usuários confiáveis. Este workunit foi criada por ‘{__placeholder__}’. Renderizar HTML?", @@ -935,6 +940,7 @@ SVGSource: "Fonte de SVG", Sync: "Sync", SyncSelection: "Sincronizar seleção", + Syntax: "Sintaxe", SystemServers: "Servidores do Sistema", Table: "Tabela", tag: "tag", @@ -962,6 +968,7 @@ TimeMaxTotalExecuteMinutes: "Tempo Máximo Total de Minutos de Execução", TimeMeanTotalExecuteMinutes: "Tempo Médio Total de Minutos de Execução", TimeMinTotalExecuteMinutes: "Tempo Min, Total de Minutos de Execução", + TimePenalty: "Penalidade de tempo", Timers: "Controladores de tempo", TimeSeconds: "Tempo (Segundos)", TimeStamp: "Timestamp", @@ -1130,6 +1137,7 @@ WildcardFilter: "Filtro Curinga", Workflows: "Fluxo de Trabalho", Workunit: "Tarefa", + WorkunitNotFound: "WU não encontrada", Workunits: "Tarefas", WorkUnitScopeDefaultPermissions: "Permisos por defect de alcaces de Workunit", Wrap: "Embrulho", diff --git a/esp/src/src/nls/sr/hpcc.ts b/esp/src/src/nls/sr/hpcc.ts index a1924b198c1..a43a4e52a55 100644 --- a/esp/src/src/nls/sr/hpcc.ts +++ b/esp/src/src/nls/sr/hpcc.ts @@ -413,6 +413,8 @@ IgnoreGlobalStoreOutEdges: "Занемари глобалне ивице", Import: "Увоз", Inactive: "Неактиван", + IncludePerComponentLogs: "Укључите записе по компоненти", + IncludeRelatedLogs: "Укључите релевантне записе", IncludeSlaveLogs: "Укључите Извештаје Са Нодова Извршилаца", IncludeSubFileInfo: "Укључити информације о поддатотеци?", Index: "Индекс", @@ -584,6 +586,7 @@ Newest: "Најнивији", NewPassword: "Нова Лозинка", NextSelection: "Следећи Избор", + NextWorkunit: "Следећа радна јединица", NoCommon: "Није уобичајено", NoContent: "(Без садржаја)", NoContentPleaseSelectItem: "Нема садржаја - изаберите ставку", @@ -716,6 +719,7 @@ PressCtrlCToCopy: "Притисните цтрл + ц да бисте копирали.", Preview: "Преглед", PreviousSelection: "Претходни Избор", + PreviousWorkunit: "Претходна радна јединица", PrimaryLost: "Примарни Је Изгубљен", PrimaryMonitoring: "Основно Надгледање", Priority: "Приоритет", @@ -837,6 +841,7 @@ Save: "Сачувајте", Scope: "Подручје", SearchResults: "Резултати Претраживања", + Seconds: "Cекунде", SecondsRemaining: "Преостало Секунди", Security: "Сигурност", SecurityMessageHTML: "Погледајте ХТМЛ само од поузданих корисника. Ову радну јединицу је направио '{__плацехолдер__}'. Прикажи ХТМЛ?", @@ -935,6 +940,7 @@ SuspendedReason: "Разлог за Суспендовање", SVGSource: "СВГ Извор", SyncSelection: "Синхронизујте Са Одабраним", + Syntax: "Синтакса", SystemServers: "Систем Сервера", Table: "табела", tag: "таг", @@ -962,6 +968,7 @@ TimeMaxTotalExecuteMinutes: "Максимално укупно време извршавања у минутима", TimeMeanTotalExecuteMinutes: "Просечно укупно време извршавања у минутима", TimeMinTotalExecuteMinutes: "Минимално укупно време извршавања у минутима", + TimePenalty: "Bременска Kазна", Timers: "Мерачи Времена", TimeSeconds: "Време (Секунде)", TimeStamp: "Временска Ознака", @@ -1129,6 +1136,7 @@ WildcardFilter: "Вилдцард филтер", Workflows: "Токови послова", Workunit: "Радна Јединица", + WorkunitNotFound: "Радна јединица није пронађена", Workunits: "Радне Јединице", WorkUnitScopeDefaultPermissions: "Унапред Дефинисане Дозвиле за Простор за Радне Јединице", Wrap: "Замотајте", diff --git a/esp/src/src/nls/zh/hpcc.ts b/esp/src/src/nls/zh/hpcc.ts index 65cd9273116..eb8e7e677aa 100644 --- a/esp/src/src/nls/zh/hpcc.ts +++ b/esp/src/src/nls/zh/hpcc.ts @@ -412,6 +412,8 @@ IgnoreGlobalStoreOutEdges: "省略全局存储活动的边线", Import: "输入", Inactive: "未激活", + IncludePerComponentLogs: "包括每个组件的日志", + IncludeRelatedLogs: "包扩相关日志", IncludeSlaveLogs: "包括从属服务器日志", IncludeSubFileInfo: "包括子文件信息", Index: "索引", @@ -583,6 +585,7 @@ Newest: "最新", NewPassword: "新密码", NextSelection: "下一个选择", + NextWorkunit: "下一个Workunit", NoCommon: "非常用", NoContent: "(无内容)", NoContentPleaseSelectItem: "无内容,请选择一个项目", @@ -715,6 +718,7 @@ PressCtrlCToCopy: "用ctrl+c键复制", Preview: "预览", PreviousSelection: "上一个选择", + PreviousWorkunit: "前一个Workunit", PrimaryLost: "主要丢失", PrimaryMonitoring: "主监控", Priority: "优先级", @@ -836,6 +840,7 @@ Save: "保存", Scope: "范围", SearchResults: "查询结果", + Seconds: "秒", SecondsRemaining: "剩余时间(秒)", Security: "安全", SecurityMessageHTML: "仅查看来自受信任用户的 HTML。该工作单元由 {__placeholder__}. 生成HTML?", @@ -934,6 +939,7 @@ SuspendedReason: "暂停使用的原因", SVGSource: "SVG原始数据", SyncSelection: "选择同步", + Syntax: "语法", SystemServers: "系统服务器", Table: "表", tag: "标记", @@ -961,6 +967,7 @@ TimeMaxTotalExecuteMinutes: "总运行时间最大值(分钟)", TimeMeanTotalExecuteMinutes: "总运行时间均值(分钟)", TimeMinTotalExecuteMinutes: "总运行时间最小值(分钟)", + TimePenalty: "时间惩罚", Timers: "定时器", TimeSeconds: "时间(秒)", TimeStamp: "时间戳", @@ -1128,6 +1135,7 @@ WildcardFilter: "筛选关键字", Workflows: "工作流程", Workunit: "工作单元", + WorkunitNotFound: "无法找到Workunit", Workunits: "工作单元", WorkUnitScopeDefaultPermissions: "工作单元默认权限", Wrap: "自动换行", diff --git a/rtl/eclrtl/eclregex.cpp b/rtl/eclrtl/eclregex.cpp index 497b645078d..9aeed058250 100644 --- a/rtl/eclrtl/eclregex.cpp +++ b/rtl/eclrtl/eclregex.cpp @@ -439,7 +439,7 @@ class CCompiledStrRegExpr : implements ICompiledStrRegExpr { // No match found; return the original string out = (char *)rtlMalloc(sourceSize); - memcpy(out, str, sourceSize); + memcpy_iflen(out, str, sourceSize); outlen = slen; pcre2_match_data_free_8(matchData); } @@ -838,7 +838,7 @@ class CCompiledUStrRegExpr : implements ICompiledUStrRegExpr { // No match found; return the original string out = (UChar *)rtlMalloc(slen * sizeof(UChar)); - memcpy(out, str, slen * sizeof(UChar)); + memcpy_iflen(out, str, slen * sizeof(UChar)); outlen = slen; pcre2_match_data_free_16(matchData); }