diff --git a/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html b/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html
index 69788628d..a7fd02a61 100644
--- a/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html
+++ b/app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html
@@ -97,7 +97,7 @@
-
+
diff --git a/app/kubernetes/views/deploy/deploy.html b/app/kubernetes/views/deploy/deploy.html
index 27ec85ee2..94f91238b 100644
--- a/app/kubernetes/views/deploy/deploy.html
+++ b/app/kubernetes/views/deploy/deploy.html
@@ -49,6 +49,7 @@
ng-model="ctrl.formValues.Namespace"
ng-change="ctrl.onChangeNamespace()"
ng-options="namespace.Name as namespace.Name for namespace in ctrl.namespaces"
+ data-cy="k8sAppCreate-nsSelect"
>
Namespaces specified in the manifest will be used
diff --git a/app/react/components/ImageConfigFieldset/InputSearch.tsx b/app/react/components/ImageConfigFieldset/InputSearch.tsx
index 3c3117d2d..721371aac 100644
--- a/app/react/components/ImageConfigFieldset/InputSearch.tsx
+++ b/app/react/components/ImageConfigFieldset/InputSearch.tsx
@@ -34,6 +34,7 @@ export function InputSearch({
onChange={onChange}
placeholder={placeholder}
inputId={inputId}
+ data-cy="component-imageConfigInputSearch"
/>
);
}
diff --git a/app/react/components/datatables/Datatable.tsx b/app/react/components/datatables/Datatable.tsx
index e4e277b55..15ee2fb1d 100644
--- a/app/react/components/datatables/Datatable.tsx
+++ b/app/react/components/datatables/Datatable.tsx
@@ -171,6 +171,7 @@ export function Datatable({
return (
;
+ const searchBar = (
+
+ );
const tableActions = !!renderTableActions && (
{renderTableActions()}
);
diff --git a/app/react/components/form-components/AutocompleteSelect/AutocompleteSelect.tsx b/app/react/components/form-components/AutocompleteSelect/AutocompleteSelect.tsx
index c44e88efa..c04b82c05 100644
--- a/app/react/components/form-components/AutocompleteSelect/AutocompleteSelect.tsx
+++ b/app/react/components/form-components/AutocompleteSelect/AutocompleteSelect.tsx
@@ -23,6 +23,7 @@ export function AutocompleteSelect({
searchResults,
readOnly,
inputId,
+ 'data-cy': dataCy,
}: {
value: string;
/**
@@ -35,6 +36,7 @@ export function AutocompleteSelect({
searchResults?: Option[];
readOnly?: boolean;
inputId: string;
+ 'data-cy': string;
}) {
const [searchTerm, setSearchTerm] = useDebounce(value, onChange);
const [selected, setSelected] = useState(false);
@@ -53,6 +55,7 @@ export function AutocompleteSelect({
placeholder={placeholder}
readOnly={readOnly}
id={inputId}
+ data-cy={dataCy}
autoComplete="off"
/>
{!selected && searchResults && searchResults.length > 0 && (
diff --git a/app/react/kubernetes/DeployView/StackName/StackName.tsx b/app/react/kubernetes/DeployView/StackName/StackName.tsx
index bf1e20f29..01767116d 100644
--- a/app/react/kubernetes/DeployView/StackName/StackName.tsx
+++ b/app/react/kubernetes/DeployView/StackName/StackName.tsx
@@ -71,6 +71,7 @@ export function StackName({
onChange={setStackName}
placeholder="e.g. myStack"
inputId="stack_name"
+ data-cy="component-stackNameInput"
/>
diff --git a/app/react/portainer/gitops/ComposePathField/ComposePathField.tsx b/app/react/portainer/gitops/ComposePathField/ComposePathField.tsx
index 85c41689f..21013d2d3 100644
--- a/app/react/portainer/gitops/ComposePathField/ComposePathField.tsx
+++ b/app/react/portainer/gitops/ComposePathField/ComposePathField.tsx
@@ -66,6 +66,7 @@ export function ComposePathField({
placeholder={isCompose ? 'docker-compose.yml' : 'manifest.yml'}
model={model}
inputId="stack_repository_path"
+ data-cy="component-gitPathInput"
createdFromCustomTemplateId={createdFromCustomTemplateId}
/>
) : (
@@ -76,6 +77,7 @@ export function ComposePathField({
}}
placeholder={isCompose ? 'docker-compose.yml' : 'manifest.yml'}
id="stack_repository_path"
+ data-cy="component-gitPathInput"
/>
)}
diff --git a/app/react/portainer/gitops/ComposePathField/PathSelector.tsx b/app/react/portainer/gitops/ComposePathField/PathSelector.tsx
index da6650b3b..db92c80d7 100644
--- a/app/react/portainer/gitops/ComposePathField/PathSelector.tsx
+++ b/app/react/portainer/gitops/ComposePathField/PathSelector.tsx
@@ -13,6 +13,7 @@ export function PathSelector({
dirOnly,
readOnly,
inputId,
+ 'data-cy': dataCy,
createdFromCustomTemplateId,
}: {
value: string;
@@ -22,6 +23,7 @@ export function PathSelector({
dirOnly?: boolean;
readOnly?: boolean;
inputId: string;
+ 'data-cy': string;
createdFromCustomTemplateId?: number;
}) {
const creds = getAuthentication(model);
@@ -50,6 +52,7 @@ export function PathSelector({
placeholder={placeholder}
readOnly={readOnly}
inputId={inputId}
+ data-cy={dataCy}
/>
);
}
diff --git a/app/react/portainer/gitops/RefField/RefField.tsx b/app/react/portainer/gitops/RefField/RefField.tsx
index 3261574ef..eba2035a5 100644
--- a/app/react/portainer/gitops/RefField/RefField.tsx
+++ b/app/react/portainer/gitops/RefField/RefField.tsx
@@ -75,6 +75,7 @@ export function RefField({
value={inputValue}
onChange={(e) => updateInputValue(e.target.value)}
placeholder="refs/heads/main"
+ data-cy="component-gitRefInput"
/>
);
diff --git a/app/react/portainer/gitops/RelativePathFieldset/RelativePathFieldset.tsx b/app/react/portainer/gitops/RelativePathFieldset/RelativePathFieldset.tsx
index 516b6d4bc..118937f48 100644
--- a/app/react/portainer/gitops/RelativePathFieldset/RelativePathFieldset.tsx
+++ b/app/react/portainer/gitops/RelativePathFieldset/RelativePathFieldset.tsx
@@ -187,6 +187,7 @@ export function RelativePathFieldset({
readOnly={isEditing}
dirOnly
inputId="per_device_configs_path_input"
+ data-cy="component-perDeviceConfigsPathInput"
/>
diff --git a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx
index 96eaf9d75..480b18f25 100644
--- a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx
+++ b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx
@@ -28,6 +28,7 @@ export function HelmSection() {
diff --git a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeConfigSection.tsx b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeConfigSection.tsx
index 42a7bb569..5287ef013 100644
--- a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeConfigSection.tsx
+++ b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeConfigSection.tsx
@@ -38,6 +38,7 @@ export function KubeConfigSection() {
value={value}
options={options}
onChange={(value) => value && setValue(value)}
+ inputId="kubeconfig-expiry-select"
/>
diff --git a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeSettingsPanel.tsx b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeSettingsPanel.tsx
index 6af5f1680..05e72e887 100644
--- a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeSettingsPanel.tsx
+++ b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/KubeSettingsPanel.tsx
@@ -61,6 +61,7 @@ export function KubeSettingsPanel({ settings }: { settings: Settings }) {
isLoading={mutation.isLoading}
loadingText="Saving"
className="!ml-0"
+ data-cy="save-kubernetes-settings-button"
>
Save Kubernetes settings
diff --git a/app/react/portainer/users/teams/ItemView/TeamAssociationSelector/TeamMembersList/TeamMembersList.tsx b/app/react/portainer/users/teams/ItemView/TeamAssociationSelector/TeamMembersList/TeamMembersList.tsx
index 3724ed2a5..14f03dcb5 100644
--- a/app/react/portainer/users/teams/ItemView/TeamAssociationSelector/TeamMembersList/TeamMembersList.tsx
+++ b/app/react/portainer/users/teams/ItemView/TeamAssociationSelector/TeamMembersList/TeamMembersList.tsx
@@ -52,6 +52,7 @@ export function TeamMembersList({ users, roles, disabled, teamId }: Props) {
return (
+ data-cy="team-members-table"
dataset={users}
columns={columns}
titleIcon={Users}
|