+ {/* Project Header */}
+
{
- return checked
- ? field.onChange([
- ...(field.value || []),
- item.projectId,
- ])
- : field.onChange(
- field.value?.filter(
- (value) =>
- value !== item.projectId,
- ),
+ if (checked) {
+ // Add the project
+ field.onChange([
+ ...(field.value || []),
+ project.projectId,
+ ]);
+ } else {
+ // Remove the project
+ field.onChange(
+ field.value?.filter(
+ (value) =>
+ value !== project.projectId,
+ ),
+ );
+
+ // Also remove all environments and services from this project
+ const currentEnvs =
+ form.getValues(
+ "accessedEnvironments",
+ ) || [];
+ const currentServices =
+ form.getValues(
+ "accessedServices",
+ ) || [];
+
+ // Get all environment IDs from this project
+ const projectEnvIds =
+ project.environments.map(
+ (env) => env.environmentId,
);
+
+ // Get all service IDs from this project
+ const projectServiceIds =
+ project.environments.flatMap(
+ (env) =>
+ extractServices(env).map(
+ (service) => service.id,
+ ),
+ );
+
+ // Remove environments and services from this project
+ form.setValue(
+ "accessedEnvironments",
+ currentEnvs.filter(
+ (envId) =>
+ !projectEnvIds.includes(envId),
+ ),
+ );
+ form.setValue(
+ "accessedServices",
+ currentServices.filter(
+ (serviceId) =>
+ !projectServiceIds.includes(
+ serviceId,
+ ),
+ ),
+ );
+ }
}}
/>
-
- {item.name}
+
+ {project.name}
- {applications.length === 0 && (
-
- No services found
-
- )}
- {applications?.map((item, index) => (
-
{
+
+ {/* Environments */}
+
+ {project.environments.length === 0 && (
+
+ No environments found
+
+ )}
+ {project.environments.map(
+ (environment, envIndex) => {
+ const services =
+ extractServices(environment);
return (
-
-
- {
- return checked
- ? field.onChange([
- ...(field.value || []),
- item.id,
- ])
- : field.onChange(
- field.value?.filter(
- (value) =>
- value !== item.id,
- ),
+ {/* Environment Header with Checkbox */}
+ (
+
+
+ {
+ if (checked) {
+ // Add the environment
+ envField.onChange([
+ ...(envField.value ||
+ []),
+ environment.environmentId,
+ ]);
+
+ // Auto-select the project if not already selected
+ const currentProjects =
+ form.getValues(
+ "accessedProjects",
+ ) || [];
+ if (
+ !currentProjects.includes(
+ project.projectId,
+ )
+ ) {
+ form.setValue(
+ "accessedProjects",
+ [
+ ...currentProjects,
+ project.projectId,
+ ],
+ );
+ }
+ } else {
+ // Remove the environment
+ envField.onChange(
+ envField.value?.filter(
+ (value) =>
+ value !==
+ environment.environmentId,
+ ),
+ );
+
+ // Also remove all services from this environment
+ const currentServices =
+ form.getValues(
+ "accessedServices",
+ ) || [];
+ const environmentServiceIds =
+ services.map(
+ (service) =>
+ service.id,
+ );
+
+ form.setValue(
+ "accessedServices",
+ currentServices.filter(
+ (serviceId) =>
+ !environmentServiceIds.includes(
+ serviceId,
+ ),
+ ),
+ );
+ }
+ }}
+ />
+
+
+
+
+ {environment.name}
+
+
+ ({services.length} services)
+
+
+
+ )}
+ />
+
+ {/* Services */}
+
+ {services.length === 0 && (
+
+ No services found
+
+ )}
+ {services.map(
+ (service, serviceIndex) => (
+
{
+ return (
+
+
+ {
+ if (checked) {
+ // Add the service
+ serviceField.onChange(
+ [
+ ...(serviceField.value ||
+ []),
+ service.id,
+ ],
+ );
+
+ // Auto-select the environment if not already selected
+ const currentEnvs =
+ form.getValues(
+ "accessedEnvironments",
+ ) || [];
+ if (
+ !currentEnvs.includes(
+ environment.environmentId,
+ )
+ ) {
+ form.setValue(
+ "accessedEnvironments",
+ [
+ ...currentEnvs,
+ environment.environmentId,
+ ],
+ );
+ }
+
+ // Auto-select the project if not already selected
+ const currentProjects =
+ form.getValues(
+ "accessedProjects",
+ ) || [];
+ if (
+ !currentProjects.includes(
+ project.projectId,
+ )
+ ) {
+ form.setValue(
+ "accessedProjects",
+ [
+ ...currentProjects,
+ project.projectId,
+ ],
+ );
+ }
+ } else {
+ // Remove the service
+ serviceField.onChange(
+ serviceField.value?.filter(
+ (value) =>
+ value !==
+ service.id,
+ ),
+ );
+ }
+ }}
+ />
+
+
+
+
+ {service.name}
+
+
+ ({service.type})
+
+
+
);
- }}
- />
-
-
- {item.name}
-
-
+ }}
+ />
+ ),
+ )}
+
+
);
- }}
- />
- ))}
+ },
+ )}
+