Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,7 @@ function AgentNameForm({
const preferredAgent = useFetchPreferredAgent({organization});
const codingAgentSelectOptions = useFetchAgentOptions({organization});
const codingAgentMutationOptions = getPreferredAgentMutationOptions({organization});
const bulkMutateSelectedAgent = useBulkMutateSelectedAgent({
projects: projects.filter(p => !projectsIdsWithPreferredAgent.has(p.id)),
});
const bulkMutateSelectedAgent = useBulkMutateSelectedAgent();

const preferredAgentLabel = codingAgentSelectOptions.data?.find(
o => o.value === preferredAgent.data
Expand Down Expand Up @@ -225,7 +223,10 @@ function AgentNameForm({
onClick={async () => {
if (preferredAgent.data) {
setIsBulkMutatingAgent(true);
await bulkMutateSelectedAgent(preferredAgent.data);
await bulkMutateSelectedAgent(
projects.filter(p => !projectsIdsWithPreferredAgent.has(p.id)),
preferredAgent.data
);
setIsBulkMutatingAgent(false);
} else {
addErrorMessage(t('No coding agent integration found'));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,11 +295,10 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});

await act(async () => {
await result.current('seer');
await result.current([project], 'seer');
});

expect(projectPutRequest).toHaveBeenCalledWith(
Expand Down Expand Up @@ -328,11 +327,10 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});

await act(async () => {
await result.current(integration);
await result.current([project], integration);
});

expect(projectPutRequest).toHaveBeenCalledWith(
Expand Down Expand Up @@ -368,10 +366,9 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});
await act(async () => {
await result.current(integration);
await result.current([project], integration);
});

expect(seerPreferencesPostRequest).toHaveBeenCalledWith(
Expand All @@ -392,11 +389,10 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});

await act(async () => {
await result.current('seer');
await result.current([project], 'seer');
});

expect(updateSuccessSpy).toHaveBeenCalledWith({
Expand Down Expand Up @@ -427,11 +423,10 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});

await act(async () => {
await result.current('seer');
await result.current([project], 'seer');
});

expect(addErrorMessageSpy).toHaveBeenCalledWith(
Expand Down Expand Up @@ -461,11 +456,10 @@ describe('seerPreferredAgent', () => {

const {result} = renderHookWithProviders(useBulkMutateSelectedAgent, {
organization,
initialProps: {projects: [project]},
});

await act(async () => {
await result.current('seer');
await result.current([project], 'seer');
});

expect(addErrorMessageSpy).toHaveBeenCalledWith(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ export function getPreferredAgentMutationOptions({
});
}

export function useBulkMutateSelectedAgent({projects}: {projects: Project[]}) {
export function useBulkMutateSelectedAgent() {
const organization = useOrganization();
const queryClient = useQueryClient();
const autofixSettingsQueryOptions = bulkAutofixAutomationSettingsInfiniteOptions({
organization,
});

return useCallback(
async (integration: PreferredAgent) => {
async (projects: Project[], integration: PreferredAgent) => {
const results = await processInChunks({
items: projects,
chunkSize: 15,
Expand Down Expand Up @@ -184,6 +184,6 @@ export function useBulkMutateSelectedAgent({projects}: {projects: Project[]}) {
}
}
},
[projects, organization, queryClient, autofixSettingsQueryOptions.queryKey]
[organization, queryClient, autofixSettingsQueryOptions.queryKey]
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,6 @@ const FiltersContainer = styled('div')`
`;

const SimpleTableWithColumns = styled(SimpleTable)`
grid-template-columns: 3fr minmax(300px, 1fr) repeat(2, max-content);
grid-template-columns: max-content 3fr minmax(300px, 1fr) repeat(2, max-content);
overflow: visible;
`;
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import {parseQueryKey} from 'sentry/utils/api/apiQueryKey';
import type {Sort} from 'sentry/utils/discover/fields';
import {useListItemCheckboxContext} from 'sentry/utils/list/useListItemCheckboxState';
import {useOrganization} from 'sentry/utils/useOrganization';
import {
useBulkMutateSelectedAgent,
useFetchAgentOptions,
} from 'sentry/views/settings/seer/overview/utils/seerPreferredAgent';

import {useCanWriteSettings} from 'getsentry/views/seerAutomation/components/useCanWriteSettings';

Expand Down Expand Up @@ -91,15 +95,18 @@ export function ProjectTableHeader({
[projects, selectedIds]
);

const agentOptions = useFetchAgentOptions({organization});
const bulkMutateSelectedAgent = useBulkMutateSelectedAgent();

return (
<Fragment>
<TableHeader>
{/* <SimpleTable.HeaderCell>
<SimpleTable.HeaderCell>
<SelectAllCheckbox
listItemCheckboxState={listItemCheckboxState}
projects={projects}
/>
</SimpleTable.HeaderCell> */}
</SimpleTable.HeaderCell>
{COLUMNS.map(({title, key, sortKey}) => (
<SimpleTable.HeaderCell
key={key}
Expand Down Expand Up @@ -133,6 +140,23 @@ export function ProjectTableHeader({
/>
</TableCellFirst>
<TableCellsRemainingContent align="center" gap="md">
<DropdownMenu
isDisabled={!canWrite}
size="xs"
items={
agentOptions.data?.map(({value, label}) => ({
key: typeof value === 'object' ? value.provider : value,
label,
onAction: () => {
const selectedProjects = projects.filter(p =>
projectIds.includes(p.id)
);
bulkMutateSelectedAgent(selectedProjects, value);
},
})) ?? []
}
triggerLabel={t('Agent')}
/>
<DropdownMenu
isDisabled={!canWrite || organization.enableSeerCoding === false}
size="xs"
Expand All @@ -156,7 +180,7 @@ export function ProjectTableHeader({
),
},
]}
triggerLabel={t('Auto Create PRs')}
triggerLabel={t('Create PRs')}
/>
</TableCellsRemainingContent>
</TableHeader>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import styled from '@emotion/styled';

import {Checkbox} from '@sentry/scraps/checkbox';
import {InfoTip} from '@sentry/scraps/info';
import {Flex, Stack} from '@sentry/scraps/layout';
import {Link} from '@sentry/scraps/link';
Expand All @@ -15,6 +18,7 @@ import {SimpleTable} from 'sentry/components/tables/simpleTable';
import {IconWarning} from 'sentry/icons/iconWarning';
import {t, tct} from 'sentry/locale';
import type {Project} from 'sentry/types/project';
import {useListItemCheckboxContext} from 'sentry/utils/list/useListItemCheckboxState';
import {useOrganization} from 'sentry/utils/useOrganization';
import {
useAgentOptions,
Expand All @@ -40,7 +44,7 @@ export function SeerProjectTableRow({
}: Props) {
const organization = useOrganization();
const canWrite = useCanWriteSettings();
// const {isSelected, toggleSelected} = useListItemCheckboxContext();
const {isSelected, toggleSelected} = useListItemCheckboxContext();

const options = useAgentOptions({integrations: integrations ?? []});
const autofixAgent = useSelectedAgentFromBulkSettings({
Expand All @@ -66,7 +70,7 @@ export function SeerProjectTableRow({

return (
<SimpleTable.Row key={project.id}>
{/* <SimpleTable.RowCell>
<SimpleTable.RowCell>
<CheckboxClickTarget htmlFor={`replay-table-select-${project.id}`}>
<Checkbox
id={`replay-table-select-${project.id}`}
Expand All @@ -75,7 +79,7 @@ export function SeerProjectTableRow({
onChange={() => toggleSelected(project.id)}
/>
</CheckboxClickTarget>
</SimpleTable.RowCell> */}
</SimpleTable.RowCell>
<SimpleTable.RowCell>
<Link to={`/settings/${organization.slug}/projects/${project.slug}/seer/`}>
<ProjectBadge disableLink project={project} avatarSize={16} />
Expand Down Expand Up @@ -194,11 +198,11 @@ export function SeerProjectTableRow({
);
}

// const CheckboxClickTarget = styled('label')`
// cursor: pointer;
// display: block;
// margin: -${p => p.theme.space.md};
// padding: ${p => p.theme.space.md};
// max-width: unset;
// line-height: 0;
// `;
const CheckboxClickTarget = styled('label')`
cursor: pointer;
display: block;
margin: -${p => p.theme.space.md};
padding: ${p => p.theme.space.md};
max-width: unset;
line-height: 0;
`;
Loading