import React from 'react'; import { Button } from "@patternfly/react-core/dist/esm/components/Button"; import { FormGroup } from "@patternfly/react-core/dist/esm/components/Form"; import { FormSelect, FormSelectOption } from "@patternfly/react-core/dist/esm/components/FormSelect"; import { Grid } from "@patternfly/react-core/dist/esm/layouts/Grid"; import { TextInput } from "@patternfly/react-core/dist/esm/components/TextInput"; import { Popover } from "@patternfly/react-core/dist/esm/components/Popover"; import { OutlinedQuestionCircleIcon, TrashIcon } from '@patternfly/react-icons'; import cockpit from 'cockpit'; import ipaddr from "ipaddr.js"; import { FormHelper } from "cockpit-components-form-helper.jsx"; import * as utils from './util.js'; const _ = cockpit.gettext; const MAX_PORT = 65535; export function validatePublishPort(value, key) { switch (key) { case "IP": if (value && !ipaddr.isValid(value)) return _("Must be a valid IP address"); break; case "hostPort": { if (value) { const hostPort = parseInt(value); if (hostPort < 1 || hostPort > MAX_PORT) return _("1 to 65535"); } break; } case "containerPort": { if (!value) return _("Container port must not be empty"); const containerPort = parseInt(value); if (containerPort < 1 || containerPort > MAX_PORT) return _("1 to 65535"); break; } default: console.error(`Unknown key "${key}"`); // not-covered: unreachable assertion } } export const PublishPort = ({ id, item, onChange, idx, removeitem, itemCount, validationFailed, onValidationChange }) => ( }> { utils.validationClear(validationFailed, "IP", onValidationChange); utils.validationDebounce(() => onValidationChange({ ...validationFailed, IP: validatePublishPort(value, "IP") })); onChange(idx, 'IP', value); }} /> }> { utils.validationClear(validationFailed, "hostPort", onValidationChange); utils.validationDebounce(() => onValidationChange({ ...validationFailed, hostPort: validatePublishPort(value, "hostPort") })); onChange(idx, 'hostPort', value); }} /> { utils.validationClear(validationFailed, "containerPort", onValidationChange); utils.validationDebounce(() => onValidationChange({ ...validationFailed, containerPort: validatePublishPort(value, "containerPort") })); onChange(idx, 'containerPort', value); }} /> onChange(idx, 'protocol', value)}>