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
8 changes: 5 additions & 3 deletions src/pages/campaigns/components/campaignForm/FormProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { useMemo } from "react";
import { useHistory } from "react-router-dom";
import { addMessage } from "src/redux/siteWideMessages/actionCreators";
import {
DossierCreationData,
GetDossiersByCampaignApiResponse,
PostDossiersApiArg,
useGetDevicesByDeviceTypeOperatingSystemsQuery,
Expand Down Expand Up @@ -65,6 +64,7 @@ export interface NewCampaignValues {
notes?: string;
cuf?: { id: string; value: string[] }[];
provinces?: string[];
autoApply?: boolean;
}

const useGetInitialCufCriteria = ({
Expand Down Expand Up @@ -187,6 +187,7 @@ const FormProvider = ({
})) || [],
cuf: initialCufCriteria,
provinces: dossier?.visibilityCriteria?.province || [],
autoApply: dossier?.autoApply === 1,
};

const validationSchema = yup.object({
Expand Down Expand Up @@ -320,7 +321,7 @@ const FormProvider = ({
});
}
try {
const body: DossierCreationData = {
const body = {
project: parseInt(values.projectId),
testType: parseInt(values.testType),
title: {
Expand Down Expand Up @@ -354,6 +355,7 @@ const FormProvider = ({
? parseInt(values.productType, 10)
: undefined,
notes: values.notes,
autoApply: values.autoApply ? 1 : 0,
visibilityCriteria: {
gender: values.genderRequirements?.options || [],
cuf: values.cuf
Expand Down Expand Up @@ -394,7 +396,7 @@ const FormProvider = ({
if (isEdit) {
await putDossiers({
campaign: dossier?.id.toString() || "",
dossierCreationData: body,
body,
}).unwrap();
} else {
const resp = await postDossiers({
Expand Down
34 changes: 34 additions & 0 deletions src/pages/campaigns/components/campaignForm/fields/AutoApply.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import {
Checkbox,
FieldProps,
FormikField,
FormLabel,
} from "@appquality/appquality-design-system";
import { useFormikContext } from "formik";
import { NewCampaignValues } from "../FormProvider";

const AutoApply = () => {
const { setFieldValue } = useFormikContext<NewCampaignValues>();

return (
<div>
<FormLabel htmlFor="" label="Auto-apply candidates" />
Copy link

Copilot AI Oct 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The FormLabel has an empty htmlFor attribute. It should reference the checkbox id 'autoApply' to properly associate the label with the form control for screen readers.

Suggested change
<FormLabel htmlFor="" label="Auto-apply candidates" />
<FormLabel htmlFor="autoApply" label="Auto-apply candidates" />

Copilot uses AI. Check for mistakes.

<FormikField name="autoApply">
{({ field }: FieldProps) => (
<Checkbox
name={field.name}
id="autoApply"
label="Should auto-select candidates once the tester applies?"
checked={field.value}
onChange={(e) => {
setFieldValue("autoApply", e.target.checked);
}}
/>
)}
</FormikField>
</div>
);
};

export default AutoApply;
2 changes: 2 additions & 0 deletions src/pages/campaigns/components/campaignForm/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { PhaseSelector } from "../PhaseSelector";
import { CampaignFormContext } from "./campaignFormContext";
import FormOverlay from "./feedbackMessages/FormOverlay";
import AgeRequirements from "./fields/AgeRequirements";
import AutoApply from "./fields/AutoApply";
import BrowsersMultiselect from "./fields/BrowsersMultiselect";
import CountrySelect from "./fields/CountrySelect";
import CufCriteria from "./fields/CufCriteria";
Expand Down Expand Up @@ -129,6 +130,7 @@ const CampaignFormContent = ({ dossier, isEdit, duplicate }: FormProps) => {
required
/>
<TestTypeSelect />
{isEdit && <AutoApply />}
</FieldWrapper>
<Title size="s" className="aq-mb-2 aq-pt-4">
Give some context to your co-workers
Expand Down
185 changes: 183 additions & 2 deletions src/services/tryberApi/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,16 @@ const injectedRtkApi = api.injectEndpoints({
>({
query: (queryArg) => ({ url: `/campaigns/${queryArg.campaign}/payouts` }),
}),
putCampaignsByCampaignPayouts: build.mutation<
PutCampaignsByCampaignPayoutsApiResponse,
PutCampaignsByCampaignPayoutsApiArg
>({
query: (queryArg) => ({
url: `/campaigns/${queryArg.campaign}/payouts`,
method: "PUT",
body: queryArg.body,
}),
}),
getCampaignsByCampaignProspect: build.query<
GetCampaignsByCampaignProspectApiResponse,
GetCampaignsByCampaignProspectApiArg
Expand Down Expand Up @@ -459,7 +469,7 @@ const injectedRtkApi = api.injectEndpoints({
query: (queryArg) => ({
url: `/dossiers/${queryArg.campaign}`,
method: "PUT",
body: queryArg.dossierCreationData,
body: queryArg.body,
}),
}),
getDossiersByCampaignAvailableTesters: build.query<
Expand Down Expand Up @@ -801,6 +811,40 @@ const injectedRtkApi = api.injectEndpoints({
body: queryArg.body,
}),
}),
getUsersMeCampaignsByCampaignIdPayoutData: build.query<
GetUsersMeCampaignsByCampaignIdPayoutDataApiResponse,
GetUsersMeCampaignsByCampaignIdPayoutDataApiArg
>({
query: (queryArg) => ({
url: `/users/me/campaigns/${queryArg.campaignId}/payout_data`,
}),
}),
getUsersMeCampaignsByCampaignIdPreview: build.query<
GetUsersMeCampaignsByCampaignIdPreviewApiResponse,
GetUsersMeCampaignsByCampaignIdPreviewApiArg
>({
query: (queryArg) => ({
url: `/users/me/campaigns/${queryArg.campaignId}/preview`,
}),
}),
getUsersMeCampaignsByCampaignIdTasks: build.query<
GetUsersMeCampaignsByCampaignIdTasksApiResponse,
GetUsersMeCampaignsByCampaignIdTasksApiArg
>({
query: (queryArg) => ({
url: `/users/me/campaigns/${queryArg.campaignId}/tasks`,
}),
}),
postUsersMeCampaignsByCampaignIdTasksAndTaskId: build.mutation<
PostUsersMeCampaignsByCampaignIdTasksAndTaskIdApiResponse,
PostUsersMeCampaignsByCampaignIdTasksAndTaskIdApiArg
>({
query: (queryArg) => ({
url: `/users/me/campaigns/${queryArg.campaignId}/tasks/${queryArg.taskId}`,
method: "POST",
body: queryArg.body,
}),
}),
getUsersMeCampaignsByCampaignCompatibleDevices: build.query<
GetUsersMeCampaignsByCampaignCompatibleDevicesApiResponse,
GetUsersMeCampaignsByCampaignCompatibleDevicesApiArg
Expand Down Expand Up @@ -1367,6 +1411,8 @@ export type GetCampaignsByCampaignBugsAndBugIdApiResponse =
id: number;
media: {
id: number;
type: string;
url: string;
}[];
note: string;
reason: string;
Expand Down Expand Up @@ -1560,6 +1606,46 @@ export type GetCampaignsByCampaignPayoutsApiArg = {
/** A campaign id */
campaign: string;
};
export type PutCampaignsByCampaignPayoutsApiResponse = /** status 200 OK */ {
campaign_complete_bonus_eur?: number;
campaign_pts?: number;
critical_bug_payout?: number;
high_bug_payout?: number;
low_bug_payout?: number;
medium_bug_payout?: number;
minimum_bugs?: number;
payout_limit?: number;
percent_usecases?: number;
point_multiplier_critical?: number;
point_multiplier_high?: number;
point_multiplier_low?: number;
point_multiplier_medium?: number;
point_multiplier_perfect?: number;
point_multiplier_refused?: number;
top_tester_bonus?: number;
};
export type PutCampaignsByCampaignPayoutsApiArg = {
/** A campaign id */
campaign: string;
body: {
campaign_complete_bonus_eur?: number;
campaign_pts?: number;
critical_bug_payout?: number;
high_bug_payout?: number;
low_bug_payout?: number;
medium_bug_payout?: number;
minimum_bugs?: number;
payout_limit?: number;
percent_usecases?: number;
point_multiplier_critical?: number;
point_multiplier_high?: number;
point_multiplier_low?: number;
point_multiplier_medium?: number;
point_multiplier_perfect?: number;
point_multiplier_refused?: number;
top_tester_bonus?: number;
};
};
export type GetCampaignsByCampaignProspectApiResponse = /** status 200 OK */ {
items: {
bugs: {
Expand Down Expand Up @@ -1873,10 +1959,13 @@ export type PostDossiersApiArg = {
useCases?: number;
};
} & {
autoApply?: number;
pageVersion?: "v1" | "v2";
skipPagesAndTasks?: number;
};
};
export type GetDossiersByCampaignApiResponse = /** status 200 OK */ {
autoApply: number;
browsers?: {
id: number;
name: string;
Expand Down Expand Up @@ -1965,7 +2054,9 @@ export type PutDossiersByCampaignApiResponse = /** status 200 OK */ {};
export type PutDossiersByCampaignApiArg = {
/** A campaign id */
campaign: string;
dossierCreationData: DossierCreationData;
body: DossierCreationData & {
autoApply?: number;
};
};
export type GetDossiersByCampaignAvailableTestersApiResponse =
/** status 200 OK */ {
Expand Down Expand Up @@ -2432,9 +2523,16 @@ export type GetUsersMeCampaignsByCampaignIdApiResponse = /** status 200 OK */ {
invalid: string[];
valid: string[];
};
campaign_type: {
icon: string;
id: number;
name: string;
};
devices?: ({
id: number;
} & UserDevice)[];
end_date: string;
goal: string;
hasBugForm: boolean;
id: number;
language?: {
Expand Down Expand Up @@ -2573,6 +2671,81 @@ export type PostUsersMeCampaignsByCampaignIdMediaApiArg = {
media?: {} | string[];
};
};
export type GetUsersMeCampaignsByCampaignIdPayoutDataApiResponse =
/** status 200 OK */ {
campaign_complete_bonus_eur: number;
campaign_pts: number;
critical_bug_payout: number;
high_bug_payout: number;
low_bug_payout: number;
medium_bug_payout: number;
minimum_bugs: number;
payout_limit: number;
percent_usecases: number;
point_multiplier_critical: number;
point_multiplier_high: number;
point_multiplier_low: number;
point_multiplier_medium: number;
point_multiplier_perfect: number;
point_multiplier_refused: number;
top_tester_bonus: number;
};
export type GetUsersMeCampaignsByCampaignIdPayoutDataApiArg = {
campaignId: string;
};
export type GetUsersMeCampaignsByCampaignIdPreviewApiResponse =
/** status 200 OK */ {
acceptedDevices: {
console?: AvailableDevice[] | "all";
pc?: AvailableDevice[] | "all";
smartTv?: AvailableDevice[] | "all";
smartphone?: AvailableDevice[] | "all";
smartwatch?: AvailableDevice[] | "all";
tablet?: AvailableDevice[] | "all";
};
cap?: {
free: number;
value: number;
};
content: string;
endDate: string;
selectionStatus?: "starting" | "excluded" | "ready" | "complete";
startDate: string;
status: "available" | "applied" | "excluded" | "selected";
title: string;
tl?: {
email: string;
name: string;
};
type: {
icon: string;
name: string;
};
};
export type GetUsersMeCampaignsByCampaignIdPreviewApiArg = {
campaignId: string;
};
export type GetUsersMeCampaignsByCampaignIdTasksApiResponse =
/** status 200 OK */ {
content: string;
id: number;
is_required: number;
name: string;
status: "completed" | "pending";
}[];
export type GetUsersMeCampaignsByCampaignIdTasksApiArg = {
campaignId: string;
};
export type PostUsersMeCampaignsByCampaignIdTasksAndTaskIdApiResponse =
/** status 200 OK */ string;
export type PostUsersMeCampaignsByCampaignIdTasksAndTaskIdApiArg = {
/** the campaign id */
campaignId: string;
taskId: string;
body: {
status: "completed";
};
};
export type GetUsersMeCampaignsByCampaignCompatibleDevicesApiResponse =
/** status 200 OK */ UserDevice[];
export type GetUsersMeCampaignsByCampaignCompatibleDevicesApiArg = {
Expand Down Expand Up @@ -3231,6 +3404,9 @@ export type UserDevice = {
};
type: string;
};
export type AvailableDevice = {
name: string;
};
export type FiscalType =
| "withholding"
| "witholding-extra"
Expand Down Expand Up @@ -3287,6 +3463,7 @@ export const {
useGetCampaignsByCampaignGroupsQuery,
useGetCampaignsByCampaignObservationsQuery,
useGetCampaignsByCampaignPayoutsQuery,
usePutCampaignsByCampaignPayoutsMutation,
useGetCampaignsByCampaignProspectQuery,
usePatchCampaignsByCampaignProspectMutation,
usePutCampaignsByCampaignProspectMutation,
Expand Down Expand Up @@ -3353,6 +3530,10 @@ export const {
useGetUsersMeCampaignsByCampaignIdFormsQuery,
usePostUsersMeCampaignsByCampaignIdFormsMutation,
usePostUsersMeCampaignsByCampaignIdMediaMutation,
useGetUsersMeCampaignsByCampaignIdPayoutDataQuery,
useGetUsersMeCampaignsByCampaignIdPreviewQuery,
useGetUsersMeCampaignsByCampaignIdTasksQuery,
usePostUsersMeCampaignsByCampaignIdTasksAndTaskIdMutation,
useGetUsersMeCampaignsByCampaignCompatibleDevicesQuery,
usePostUsersMeCertificationsMutation,
useDeleteUsersMeCertificationsByCertificationIdMutation,
Expand Down
Loading