Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
ce095fb
chore(api): update api - add autoApprove field to PostDossiers and Ge…
iacopolea Dec 2, 2025
8816db8
feat(FormProvider): add autoApprove field and component for bug auto-…
iacopolea Dec 2, 2025
66f42e3
fix(CampaignForm): AutoApprove component order
iacopolea Dec 2, 2025
dd97ed3
fix(AutoApprove): update label for AI-powered bug approval
iacopolea Dec 2, 2025
3dbc8d2
fix(AutoApprove): update checkbox label for clarity
iacopolea Dec 3, 2025
2cbf413
Merge pull request #198 from AppQuality/UN-2132-add-autoapprove-check
marcbon Dec 4, 2025
f8e25ee
feat(QuotePage): enhance quote history and revenue overview sections …
Kariamos Dec 5, 2025
aab8bfb
fix(QuoteBanner): update quote status title and improve pending statu…
Kariamos Dec 5, 2025
ce401e3
feat(QuotePage): add token value and total revenue display in the quo…
Kariamos Dec 5, 2025
486ae61
fix(EditCampaign): update agreements link to use relative path
Kariamos Dec 5, 2025
8a68072
fix(QuotePage): adjust column sizes for token usage and linked agreem…
Kariamos Dec 5, 2025
3d7a282
feat(EditCampaign): enhance cost and resource details section with ne…
Kariamos Dec 5, 2025
94fcf3f
feat(QuotePage): add summary finance card with total revenue and cost…
Kariamos Dec 5, 2025
a6e1116
feat(QuotePage): add form section with vertical steps for campaign de…
Kariamos Dec 5, 2025
dfe03e7
refactor(QuotePage): refactor quote history section into a separate c…
Kariamos Dec 5, 2025
d494ee9
refactor(QuotePage): separate Cost and Resource Details section with …
Kariamos Dec 5, 2025
a367f0c
refactor(RevenueOverview): separate Revenue Overview section with tok…
Kariamos Dec 5, 2025
7837350
refactor(QuotePage): simplify EditCampaign component by extracting Re…
Kariamos Dec 5, 2025
a6da1c1
refactor(QuotePage): extracted SummaryFinanceCard and FormSectionCard…
Kariamos Dec 5, 2025
c7d037e
refactor(Dividers): create reusable HorizontalDivider and VerticalDiv…
Kariamos Dec 5, 2025
ba49fd7
chore: updated api schema and index
Kariamos Dec 5, 2025
bcb1bad
feat(api): add new endpoints for customer agreements and dossier mana…
Kariamos Dec 5, 2025
7358360
feat(RevenueOverviewSection): integrate API data for tokens and agree…
Kariamos Dec 5, 2025
8b132c5
feat(CostAndResourceDetailsSection): add select
Kariamos Dec 9, 2025
85407c7
feat(SummaryFinanceCard): pass campaignId prop and integrate data fet…
Kariamos Dec 9, 2025
59b98f1
feat(SummaryFinanceCard): update community costs filter to include ty…
Kariamos Dec 9, 2025
d104a9d
feat(RevenueOverviewSection): refactor form handling and integrate Fo…
iDome89 Dec 9, 2025
2439ce9
feat(RevenueOverviewSection): refactor form handling and integrate Fo…
iDome89 Dec 9, 2025
559d2e9
feat(HumanResources): implement Human Resources management with form …
d-beezee Dec 9, 2025
1c7574e
Merge pull request #199 from AppQuality/UN-2152-side-summary-finance-…
d-beezee Dec 9, 2025
ed1a0e3
feat(EditCampaign): conditionally render QuoteHistorySection and Quot…
Kariamos Dec 9, 2025
2d45625
Merge branch 'UN-2152-update-quote-page' into UN-2152-agreement-form
d-beezee Dec 9, 2025
69a3d99
Merge pull request #201 from AppQuality/UN-2152-agreement-form
d-beezee Dec 9, 2025
eb7c64b
feat: Update design system
d-beezee Dec 9, 2025
4c1c51e
fix(FormProvider): correct role assignment from work_rate to rate
d-beezee Dec 9, 2025
716b54b
feat(RevenueOverviewSection): update token display to show remaining …
d-beezee Dec 9, 2025
88c09b2
feat(SummaryFinanceCard): update HR costs calculation and adjust quer…
Kariamos Dec 9, 2025
a1be435
Merge pull request #200 from AppQuality/UN-2152-update-quote-page
d-beezee Dec 9, 2025
952c6fa
feat(RevenueOverviewSection): add success and error messages on data …
Kariamos Dec 9, 2025
840c9a3
Merge pull request #202 from AppQuality/UN-2152-update-quote-page
d-beezee Dec 10, 2025
c6cf641
fix(CostAndResourceDetailsSection): correct prospect link URL format
Kariamos Dec 10, 2025
787faca
feat(RevenueOverviewSection): refactor agreement handling to simplify…
d-beezee Dec 10, 2025
b5c24f8
fix(RevenueOverviewSection): change agreement type from number to str…
d-beezee Dec 10, 2025
47a801c
fix(RevenueOverviewSection): update tokenUsage input type to number a…
d-beezee Dec 10, 2025
acdf915
Merge pull request #203 from AppQuality/fix-prospect-link
d-beezee Dec 10, 2025
23bc084
refactor(RevenueOverviewSection): improve query structure for custome…
d-beezee Dec 10, 2025
3d1d93c
feat(HumanResources): add confirmation modal for deleting cost items
Kariamos Dec 10, 2025
153f54b
fix(RevenueOverviewSection): move save button inside card for better …
Kariamos Dec 10, 2025
eaa0167
Merge pull request #204 from AppQuality/add-prevention-modal-delete-hr
d-beezee Dec 10, 2025
4acb721
Merge pull request #205 from AppQuality/move-save-button-inside-card
d-beezee Dec 10, 2025
cb3c1ff
feat(QuoteForm): implement context for managing quote form sections a…
d-beezee Dec 10, 2025
c4d69b5
feat(HumanResources): add subtotals and total calculation for HR costs
Kariamos Dec 10, 2025
d7ece80
Merge pull request #206 from AppQuality/add-subtotals-and-totals-for-hr
d-beezee Dec 10, 2025
47ddae4
feat(SummaryFinanceCard): adjust title size for total revenue, total …
Kariamos Dec 10, 2025
3f59c68
Merge pull request #207 from AppQuality/adjust-title-size
d-beezee Dec 10, 2025
08f49cb
feat(SummaryFinanceCard): replace spans with Title components for tot…
Kariamos Dec 10, 2025
811292b
feat(FormProvider): add optional notSaved property to items
Kariamos Dec 10, 2025
1062e29
feat(HumanResources): update row removal behavior to handle unsaved i…
Kariamos Dec 10, 2025
d5c0452
Merge pull request #208 from AppQuality/ui-fixes-summary-finance-card
Kariamos Dec 10, 2025
7b43842
Merge pull request #209 from AppQuality/update-remove-hr-row-behaviour
Kariamos Dec 10, 2025
e85c439
feat(RevenueOverviewSection, SummaryFinanceCard): set default values …
Kariamos Dec 10, 2025
3f8c118
fix(FormProvider): update validation schema to allow zero as a minimu…
d-beezee Dec 11, 2025
1de0ba9
fix(HumanResources): remove ErrorMessage component from FormContent
Kariamos Dec 11, 2025
ee56e1e
Merge pull request #211 from AppQuality/error-hr-form-fix
d-beezee Dec 11, 2025
b1df3e6
fix(FormProvider): filter out invalid items before saving
d-beezee Dec 11, 2025
716e00a
Merge pull request #210 from AppQuality/added-zeroes-as-defaults
d-beezee Dec 11, 2025
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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"homepage": "backoffice/",
"dependencies": {
"@analytics/google-tag-manager": "^0.5.3",
"@appquality/appquality-design-system": "2.0.5",
"@appquality/appquality-design-system": "2.0.10",
"@appquality/craft-blocks": "^0.1.27",
"@appquality/languages": "^1.4.5",
"@appquality/stream-player": "^1.0.6",
Expand Down
25 changes: 13 additions & 12 deletions src/pages/BugsList/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ const FluidContainer = styled.div`
}
`;

const HeaderButton = (props: Parameters<typeof Button>[0]) => {
return <Button {...props} size="sm" kind="link-hover" />;
};

const BugsList = () => {
const { id } = useParams<{ id: string }>();
const [isStatsModalOpen, setIsStatsModalOpen] = useState(false);
Expand All @@ -37,20 +33,25 @@ const BugsList = () => {
isOpen={isStatsModalOpen}
setIsOpen={setIsStatsModalOpen}
/>
<HeaderButton
<Button
as="a"
href={`/wp-admin/admin.php?page=mvc_campaigns`}
kind="secondary"
className="aq-mr-2"
size="sm"
kind="link-hover"
>
{"<"} To Campaign List
</HeaderButton>
<HeaderButton as="a" href={`/campaigns/${id}`} className="aq-mr-2">
</Button>
<Button
as="a"
href={`/campaigns/${id}`}
className="aq-mr-2"
size="sm"
kind="link-hover"
>
{"<"} To Dashboard
</HeaderButton>
<HeaderButton onClick={() => setIsStatsModalOpen(true)}>
Stats
</HeaderButton>
</Button>
<Button onClick={() => setIsStatsModalOpen(true)}>Stats</Button>
<FilterContext>
<div className="aq-my-3">
<Filters id={id} />
Expand Down
25 changes: 13 additions & 12 deletions src/pages/Prospect/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
import { Button, Title } from "@appquality/appquality-design-system";
import { useRef } from "react";
import { useParams } from "react-router-dom";
import { PageTemplate } from "src/features/PageTemplate";
import { useContainerDimensions } from "src/hooks/useContainerDimensions";
import { useGetCampaignsByCampaignQuery } from "src/services/tryberApi";
import styled from "styled-components";
import Table from "./Table";
import { PageTemplate } from "src/features/PageTemplate";

const FluidContainer = styled.div`
max-width: 90%;
margin: 0 auto;
`;

const HeaderButton = (props: Parameters<typeof Button>[0]) => {
return <Button {...props} size="sm" type="link-hover" />;
};

const Prospect = () => {
const { id } = useParams<{ id: string }>();
const tablewrapper = useRef<HTMLDivElement>(null);
Expand All @@ -27,28 +23,33 @@ const Prospect = () => {
<PageTemplate>
<FluidContainer ref={tablewrapper}>
<Title size="xl">Prospect</Title>
<HeaderButton
<Button
as="a"
href={`/wp-admin/admin.php?page=cp-prospect&id=${id}`}
kind="secondary"
className="aq-mr-2"
size="sm"
type="link-hover"
>
{"<"} Go to old Prospect
</HeaderButton>
<HeaderButton
</Button>
<Button
as="a"
href={`/wp-admin/admin.php?page=cp-prospect-crowd&id=${id}`}
className="aq-mr-2"
size="sm"
type="link-hover"
>
Pay Assistants
</HeaderButton>
<HeaderButton
</Button>
<Button
as="a"
href={`/wp-admin/admin.php?page=add-booty&cid=${id}`}
className="aq-mr-2"
size="sm"
type="link-hover"
>
Go to Add Booty
</HeaderButton>
</Button>
<Title size="mt" className="aq-mb-3" style={{ display: "flex" }}>
CP{id} {data?.title ? `- ${data.title}` : ""}
</Title>
Expand Down
2 changes: 1 addition & 1 deletion src/pages/agreements/components/AgreementForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ const AgreementForm = ({ agreement, onSubmit }: AgreementFormProps) => {
id={field.name}
name={field.name}
defaultChecked={field.value}
onChange={(e) => {
onChange={(e: any) => {
field.onChange(e);
// if agreement change to not token based, calculate number of tokens based on amount
if (e.target.checked === false) {
Expand Down
22 changes: 10 additions & 12 deletions src/pages/agreements/list/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import {
BSGrid,
Button,
Card,
Container,
Title,
} from "@appquality/appquality-design-system";
import FilterContext from "src/pages/agreements/list/FilterContext";
import styled from "styled-components";
import CustomersFilter from "src/pages/agreements/list/Filters/CustomersFilter";
import { Container } from "@appquality/appquality-design-system";
import { Agreements } from "./Agreements";
import { ReactNode } from "react";
import { useGetAgreementsQuery } from "src/services/tryberApi";
import ErrorUnauthorized from "src/features/ErrorUnauthorized/ErrorUnauthorized";
import { PageTemplate } from "src/features/PageTemplate";
import FilterContext from "src/pages/agreements/list/FilterContext";
import CustomersFilter from "src/pages/agreements/list/Filters/CustomersFilter";
import { useGetAgreementsQuery } from "src/services/tryberApi";
import styled from "styled-components";
import { Agreements } from "./Agreements";

const FluidContainer = styled.div`
padding: 2rem;
Expand All @@ -26,10 +26,6 @@ const FlexContainer = styled.div`
align-items: center;
`;

const HeaderButton = (props: Parameters<typeof Button>[0]) => {
return <Button {...props} size="md" kind="secondary" />;
};

const AgreementsListPageContent = ({ children }: { children: ReactNode }) => {
const { isLoading, isFetching, error } = useGetAgreementsQuery({});

Expand Down Expand Up @@ -60,14 +56,16 @@ const AgreementsListPage = () => (
<FluidContainer>
<FlexContainer>
<Title size="m">Agreements List</Title>
<HeaderButton
<Button
size="md"
kind="secondary"
as="a"
href={`/backoffice/agreements/new`}
className="aq-mr-2"
id="add-new-agreement-btn"
>
+ Add New
</HeaderButton>
</Button>
</FlexContainer>
<Card className="aq-pb-4">
<FilterContext>
Expand Down
3 changes: 3 additions & 0 deletions src/pages/campaigns/components/campaignForm/FormProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export interface NewCampaignValues {
cuf?: { id: string; value: string[] }[];
provinces?: string[];
autoApply?: boolean;
autoApprove?: boolean;
}

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

const validationSchema = yup.object({
Expand Down Expand Up @@ -356,6 +358,7 @@ const FormProvider = ({
: undefined,
notes: values.notes,
autoApply: values.autoApply ? 1 : 0,
autoApprove: values.autoApprove ? 1 : 0,
visibilityCriteria: {
gender: values.genderRequirements?.options || [],
cuf: values.cuf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const AutoApply = () => {
id="autoApply"
label="Should auto-select candidates once the tester applies?"
checked={field.value}
onChange={(e) => {
onChange={(e: any) => {
setFieldValue("autoApply", e.target.checked);
}}
/>
Expand Down
34 changes: 34 additions & 0 deletions src/pages/campaigns/components/campaignForm/fields/AutoApprove.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 AutoApprove = () => {
const { setFieldValue } = useFormikContext<NewCampaignValues>();

return (
<div>
<FormLabel htmlFor="autoApprove" label="AI-Powered Bug Approval" />

<FormikField name="autoApprove">
{({ field }: FieldProps) => (
<Checkbox
name={field.name}
id="autoApprove"
label="Enable AI to automatically approve reported bugs"
checked={field.value}
onChange={(e: any) => {
setFieldValue("autoApprove", e.target.checked);
}}
/>
)}
</FormikField>
</div>
);
};

export default AutoApprove;
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const GenderRequirements = () => {
name={`${field.name}.options`}
label={option.label}
checked={value.options.includes(option.value)}
onChange={(e) => {
onChange={(e: any) => {
const newOptions = e.target.checked
? [...value.options, option.value]
: value.options.filter(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import {
Title,
Checkbox,
FormikField,
FieldProps,
FormikField,
Title,
} from "@appquality/appquality-design-system";
import InputField from "./InputField";
import { NewCampaignValues } from "../FormProvider";
import { useFormikContext } from "formik";
import { NewCampaignValues } from "../FormProvider";
import InputField from "./InputField";

const TargetSize = () => {
const {
Expand Down Expand Up @@ -40,7 +40,7 @@ const TargetSize = () => {
id="checkboxCap"
label="Limit the number of candidates"
checked={field.value}
onChange={(e) => {
onChange={(e: any) => {
setFieldValue("checkboxCap", e.target.checked);
if (!e.target.checked) setFieldValue("targetCap", "");
}}
Expand Down
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 @@ -22,6 +22,7 @@ import { CampaignFormContext } from "./campaignFormContext";
import FormOverlay from "./feedbackMessages/FormOverlay";
import AgeRequirements from "./fields/AgeRequirements";
import AutoApply from "./fields/AutoApply";
import AutoApprove from "./fields/AutoApprove";
import BrowsersMultiselect from "./fields/BrowsersMultiselect";
import CountrySelect from "./fields/CountrySelect";
import CufCriteria from "./fields/CufCriteria";
Expand Down Expand Up @@ -131,6 +132,7 @@ const CampaignFormContent = ({ dossier, isEdit, duplicate }: FormProps) => {
/>
<TestTypeSelect />
{isEdit && <AutoApply />}
{isEdit && <AutoApprove />}
</FieldWrapper>
<Title size="s" className="aq-mb-2 aq-pt-4">
Give some context to your co-workers
Expand Down
2 changes: 1 addition & 1 deletion src/pages/campaigns/components/table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const CampaignsTable = () => {
size="sm"
kind="secondary"
flat
onClick={(e) => openInWordpress(e, "open-new-campaign")}
onClick={(e: any) => openInWordpress(e, "open-new-campaign")}
>
Add campaign
</Button>
Expand Down
8 changes: 4 additions & 4 deletions src/pages/campaigns/components/table/useCampaigns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import BugType from "./BugTypeIcon";
import { useFiltersCardContext } from "./FilterContext";
import ResultTypeIcon from "./ResultTypeIcon";
import StatusIcon from "./StatusIcon";
import VisibilityIcon from "./VisibilityIcon";
import { Campaign } from "./types";
import VisibilityIcon from "./VisibilityIcon";

const formatDateTime = (dateTime: string) => {
const date = new Date(dateTime.split(" ")[0]).toLocaleDateString("it-IT", {
Expand Down Expand Up @@ -171,7 +171,7 @@ const useCampaigns = (options?: {
content: (
<>
<TableButton
onClick={(e) =>
onClick={(e: any) =>
openInWordpress(e, "open-edit", { id: campaign.id })
}
size="sm"
Expand All @@ -181,7 +181,7 @@ const useCampaigns = (options?: {
</TableButton>
{" | "}
<TableButton
onClick={(e) =>
onClick={(e: any) =>
openInWordpress(e, "open-show", { id: campaign.id })
}
size="sm"
Expand All @@ -191,7 +191,7 @@ const useCampaigns = (options?: {
</TableButton>
{" | "}
<TableButton
onClick={(e) =>
onClick={(e: any) =>
openInWordpress(e, "open-bugs", { id: campaign.id })
}
size="sm"
Expand Down
12 changes: 4 additions & 8 deletions src/pages/campaigns/quote/QuoteBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,14 @@ export const QuoteBanner = ({ status }: { status: string }) => {
return (
<div className="aq-mb-4">
<StyledDiv>
<Title size="s">The quote is now:</Title>
<Title size="s">Current Quote:</Title>
{getQuoteStatusPill(status)}
</StyledDiv>

{status === "pending" && (
<Text small>
We've prepared this quote based on the provided template. Please
review it to ensure it is accurate or make any necessary updates.
<br />
If you save it without making changes,{" "}
<strong>it will be automatically confirmed</strong>&nbsp;without
requiring further action from the client.
<Text color={"info"}>
💡 Please <strong>review this template-based quote.</strong>
<br /> Saving it without changes will automatically confirm it
</Text>
)}

Expand Down
Loading
Loading