diff --git a/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html b/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html index 0359112de..69788628d 100644 --- a/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html +++ b/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html @@ -21,6 +21,7 @@ auto-focus ng-model-options="{ debounce: 300 }" data-cy="k8sNamespace-namespaceSearchInput" + aria-label="Search input" />
diff --git a/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html b/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html index 2fb7cce11..5b2dd520a 100644 --- a/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html +++ b/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html @@ -1,4 +1,4 @@ -
+
{{ $ctrl.titleText }} @@ -6,7 +6,7 @@
No helm charts available.
-
+
diff --git a/app/kubernetes/components/helm/helm-templates/helm-templates.html b/app/kubernetes/components/helm/helm-templates/helm-templates.html index 54892b785..3b2ed2e4e 100644 --- a/app/kubernetes/components/helm/helm-templates/helm-templates.html +++ b/app/kubernetes/components/helm/helm-templates/helm-templates.html @@ -40,7 +40,7 @@ Show custom values - + Loading values.yaml... diff --git a/app/kubernetes/views/configurations/secret/create/createSecret.html b/app/kubernetes/views/configurations/secret/create/createSecret.html index f2ea1e2d5..41f682048 100644 --- a/app/kubernetes/views/configurations/secret/create/createSecret.html +++ b/app/kubernetes/views/configurations/secret/create/createSecret.html @@ -49,6 +49,7 @@ diff --git a/app/react/components/Tip/TextTip/TextTip.tsx b/app/react/components/Tip/TextTip/TextTip.tsx index a681247ed..24618f594 100644 --- a/app/react/components/Tip/TextTip/TextTip.tsx +++ b/app/react/components/Tip/TextTip/TextTip.tsx @@ -29,6 +29,7 @@ export function TextTip({ 'small gap-1 align-top text-xs', inline ? 'inline-flex' : 'flex' )} + role="status" > diff --git a/app/react/components/datatables/Datatable.tsx b/app/react/components/datatables/Datatable.tsx index 3d6f4e93a..e4e277b55 100644 --- a/app/react/components/datatables/Datatable.tsx +++ b/app/react/components/datatables/Datatable.tsx @@ -169,7 +169,7 @@ export function Datatable({ const selectedItems = selectedRowModel.rows.map((row) => row.original); return ( - + ) { if (noWidget) { - return
{children}
; + return ( +
+ {children} +
+ ); } return (
-
+
{children} -
+
); diff --git a/app/react/components/form-components/Slider/Slider.tsx b/app/react/components/form-components/Slider/Slider.tsx index 4ec7c0ba0..c0059c978 100644 --- a/app/react/components/form-components/Slider/Slider.tsx +++ b/app/react/components/form-components/Slider/Slider.tsx @@ -17,6 +17,7 @@ export interface Props { dataCy?: string; // true if you want to always show the tooltip visibleTooltip?: boolean; + disabled?: boolean; } export function Slider({ @@ -27,6 +28,7 @@ export function Slider({ onChange, dataCy, visibleTooltip: visible, + disabled, }: Props) { const marks = { [min]: visible && value / max < 0.1 ? '' : translateMinValue(min), @@ -34,14 +36,14 @@ export function Slider({ }; return ( -
+
diff --git a/app/react/components/form-components/Slider/SliderWithInput.tsx b/app/react/components/form-components/Slider/SliderWithInput.tsx index c66d9725b..088a91059 100644 --- a/app/react/components/form-components/Slider/SliderWithInput.tsx +++ b/app/react/components/form-components/Slider/SliderWithInput.tsx @@ -10,6 +10,7 @@ export function SliderWithInput({ step = 1, dataCy, visibleTooltip = false, + inputId, }: { value: number; onChange: (value: number) => void; @@ -18,6 +19,7 @@ export function SliderWithInput({ dataCy: string; step?: number; visibleTooltip?: boolean; + inputId?: string; }) { return (
@@ -44,6 +46,7 @@ export function SliderWithInput({ onChange={(e) => onChange(e.target.valueAsNumber)} className="w-32" data-cy={`${dataCy}Input`} + id={inputId} />
); diff --git a/app/react/components/form-components/SwitchField/Switch.tsx b/app/react/components/form-components/SwitchField/Switch.tsx index 2472a0aca..2ad968fae 100644 --- a/app/react/components/form-components/SwitchField/Switch.tsx +++ b/app/react/components/form-components/SwitchField/Switch.tsx @@ -2,6 +2,7 @@ import clsx from 'clsx'; import { isLimitedToBE } from '@/react/portainer/feature-flags/feature-flags.service'; import { FeatureId } from '@/react/portainer/feature-flags/enums'; +import { AutomationTestingProps } from '@/types'; import { BEFeatureIndicator } from '@@/BEFeatureIndicator'; @@ -9,7 +10,7 @@ import './Switch.css'; import styles from './Switch.module.css'; -export interface Props { +export interface Props extends AutomationTestingProps { checked: boolean; id: string; name: string; @@ -17,7 +18,6 @@ export interface Props { index?: number; className?: string; - dataCy?: string; disabled?: boolean; featureId?: FeatureId; } @@ -27,7 +27,7 @@ export function Switch({ checked, id, disabled, - dataCy, + 'data-cy': dataCy, onChange, index, featureId, @@ -42,6 +42,8 @@ export function Switch({ business: limitedToBE, limited: limitedToBE, })} + data-cy={dataCy} + aria-checked={checked} > onChange(checked, index)} /> - + {limitedToBE && } diff --git a/app/react/components/form-components/SwitchField/SwitchField.tsx b/app/react/components/form-components/SwitchField/SwitchField.tsx index ecfb8a09a..4ab2e8848 100644 --- a/app/react/components/form-components/SwitchField/SwitchField.tsx +++ b/app/react/components/form-components/SwitchField/SwitchField.tsx @@ -3,13 +3,14 @@ import uuid from 'uuid'; import { ComponentProps, PropsWithChildren, ReactNode } from 'react'; import { FeatureId } from '@/react/portainer/feature-flags/enums'; +import { AutomationTestingProps } from '@/types'; import { Tooltip } from '@@/Tip/Tooltip'; import styles from './SwitchField.module.css'; import { Switch } from './Switch'; -export interface Props { +export interface Props extends AutomationTestingProps { label: string; checked: boolean; onChange(value: boolean, index?: number): void; @@ -21,7 +22,7 @@ export interface Props { labelClass?: string; switchClass?: string; fieldClass?: string; - dataCy?: string; + disabled?: boolean; featureId?: FeatureId; valueExplanation?: ReactNode; @@ -35,7 +36,7 @@ export function SwitchField({ name = uuid(), labelClass, fieldClass, - dataCy, + 'data-cy': dataCy, disabled, onChange, featureId, @@ -65,7 +66,7 @@ export function SwitchField({ onChange={onChange} index={index} featureId={featureId} - dataCy={dataCy} + data-cy={dataCy} /> {valueExplanation && {valueExplanation}}
diff --git a/app/react/kubernetes/cluster/ConfigureView/ConfigureForm/StorageClassDatatable.tsx b/app/react/kubernetes/cluster/ConfigureView/ConfigureForm/StorageClassDatatable.tsx index 51c0a1745..b64d7daa4 100644 --- a/app/react/kubernetes/cluster/ConfigureView/ConfigureForm/StorageClassDatatable.tsx +++ b/app/react/kubernetes/cluster/ConfigureView/ConfigureForm/StorageClassDatatable.tsx @@ -40,7 +40,7 @@ export function StorageClassDatatable({ storageClassValues }: Props) { className="mr-2 mb-0" id={`kubeSetup-storageToggle${storageClassValue.Name}`} name={`kubeSetup-storageToggle${storageClassValue.Name}`} - dataCy={`kubeSetup-storageToggle${storageClassValue.Name}`} + data-cy={`kubeSetup-storageToggle${storageClassValue.Name}`} /> {storageClassValue.Name}
@@ -69,7 +69,7 @@ export function StorageClassDatatable({ storageClassValues }: Props) { ) } className="mr-2 mb-0" - dataCy={`kubeSetup-storageExpansionToggle${storageClassValue.Name}`} + data-cy={`kubeSetup-storageExpansionToggle${storageClassValue.Name}`} id={`kubeSetup-storageExpansionToggle${storageClassValue.Name}`} name={`kubeSetup-storageExpansionToggle${storageClassValue.Name}`} /> diff --git a/app/react/kubernetes/ingresses/CreateIngressView/IngressForm.tsx b/app/react/kubernetes/ingresses/CreateIngressView/IngressForm.tsx index a54c05adc..bdf544a23 100644 --- a/app/react/kubernetes/ingresses/CreateIngressView/IngressForm.tsx +++ b/app/react/kubernetes/ingresses/CreateIngressView/IngressForm.tsx @@ -11,10 +11,10 @@ import { Tooltip } from '@@/Tip/Tooltip'; import { Button } from '@@/buttons'; import { TooltipWithChildren } from '@@/Tip/TooltipWithChildren'; import { TextTip } from '@@/Tip/TextTip'; -import { Card } from '@@/Card'; -import { InputGroup } from '@@/form-components/InputGroup'; import { InlineLoader } from '@@/InlineLoader'; import { Select } from '@@/form-components/ReactSelect'; +import { Card } from '@@/Card'; +import { InputGroup } from '@@/form-components/InputGroup'; import { AnnotationsForm } from '../../annotations/AnnotationsForm'; @@ -399,9 +399,16 @@ export function IngressForm({
- Hostname + + Hostname + + {errors[`hosts[${hostIndex}].host`] && ( {errors[`hosts[${hostIndex}].host`]} @@ -420,10 +428,17 @@ export function IngressForm({
- TLS secret + + TLS secret + - + Service port ({ label: type, @@ -657,10 +689,17 @@ export function IngressForm({
- Path + + Path +
- - onChange({ ...values, memory: `${value}` }) - } - max={memoryLimit} - step={128} - dataCy="k8sNamespaceCreate-memoryLimit" - visibleTooltip - /> + {memoryLimit >= 0 && ( + + onChange({ ...values, memory: `${value}` }) + } + max={memoryLimit} + step={128} + dataCy="k8sNamespaceCreate-memoryLimit" + visibleTooltip + inputId="memory-limit" + /> + )} {errors?.memory && ( {errors.memory} )} diff --git a/app/react/portainer/access-control/AccessControlForm/AccessControlForm.tsx b/app/react/portainer/access-control/AccessControlForm/AccessControlForm.tsx index 57fd1baba..21edc8dfb 100644 --- a/app/react/portainer/access-control/AccessControlForm/AccessControlForm.tsx +++ b/app/react/portainer/access-control/AccessControlForm/AccessControlForm.tsx @@ -43,7 +43,7 @@ export function AccessControlForm({
+
- + +
); async function onDeleteClick(selectedItems: HelmRepository[]) { diff --git a/app/react/portainer/account/helm-repositories/components/HelmRepositoryForm.tsx b/app/react/portainer/account/helm-repositories/components/HelmRepositoryForm.tsx index b4925ca13..d9f0d39fd 100644 --- a/app/react/portainer/account/helm-repositories/components/HelmRepositoryForm.tsx +++ b/app/react/portainer/account/helm-repositories/components/HelmRepositoryForm.tsx @@ -39,13 +39,18 @@ export function HelmRepositoryForm({ > {({ values, errors, handleSubmit, isValid, dirty }) => (
- +
diff --git a/app/react/sidebar/DockerSidebar.tsx b/app/react/sidebar/DockerSidebar.tsx index 6762dec75..5351c6bb7 100644 --- a/app/react/sidebar/DockerSidebar.tsx +++ b/app/react/sidebar/DockerSidebar.tsx @@ -81,6 +81,7 @@ export function DockerSidebar({ environmentId, environment }: Props) { to="docker.templates" params={{ endpointId: environmentId }} data-cy="portainerSidebar-templates" + listId="dockerSidebar-templates" > @@ -164,6 +168,7 @@ export function SettingsSidebar({ isPureAdmin, isAdmin, isTeamLeader }: Props) { label="Settings" icon={Settings} data-cy="portainerSidebar-settings" + listId="portainer-settings" > ) { +}: PropsWithChildren) { const anchorProps = useSidebarSrefActive( to, undefined, @@ -78,7 +81,14 @@ export function SidebarParent({