Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
d2123cc
feat: Add import page form and modal
d-beezee Mar 13, 2025
4e7f332
feat(tryberApi): add mutations for posting dossiers by campaign (manu…
d-beezee Mar 14, 2025
93e64ff
refactor(ImportPages): use get for regenerate pages
d-beezee Mar 14, 2025
4e45e12
Merge pull request #169 from AppQuality/UN-958-add-import-pages
d-beezee Mar 17, 2025
be53b62
feat(campaigns): add quotes page and recap component for campaign quotes
d-beezee Mar 17, 2025
0c6908a
feat(quote): add QuoteInput component and integrate quote functionali…
d-beezee Mar 18, 2025
6c42fea
feat(quote): enhance quote display with conditional rendering and imp…
d-beezee Mar 18, 2025
f8d8d2a
feat(quote): add QuoteBanner component and enhance QuoteInput with st…
cannarocks Mar 25, 2025
92689f8
feat(quote): update quote status handling and enhance QuoteRecap with…
cannarocks Mar 26, 2025
918857f
feat(quote): enhance QuoteBanner messaging and improve QuoteInput err…
cannarocks Mar 26, 2025
7fe7d3c
fix(quote): correct condition for displaying previous quotes in campaign
cannarocks Mar 26, 2025
77cb3e7
Merge pull request #170 from AppQuality/UN-969-add-quote-page
cannarocks Mar 26, 2025
8543e68
feat(quote): add 'Rejected' status to QuoteStatusPill component
d-beezee Mar 27, 2025
c07c997
fix(quote): update QuoteInput to enable input based on quote status
d-beezee Mar 27, 2025
00edb77
Merge pull request #171 from AppQuality/new-quote-on-refused
d-beezee Mar 27, 2025
39ce678
feat(quote): add quotes history retrieval for campaigns
d-beezee Mar 28, 2025
030c3cf
Merge pull request #172 from AppQuality:update-quote-history
d-beezee Mar 28, 2025
7f7853f
fix(quote): update QuoteInput disabled state logic to handle unquoted
d-beezee Apr 1, 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
15 changes: 10 additions & 5 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,23 @@ import AdminPayments from "src/pages/Payments";
import Create from "src/pages/Popups/Create";
import List from "src/pages/Popups/List";
import Update from "src/pages/Popups/Update";
import NewPreselectionForm from "src/pages/preselectionForms/new";
import EditPreselectionForm from "src/pages/preselectionForms/edit";
import NewPreselectionForm from "src/pages/preselectionForms/new";
import { setupStore } from "src/store";
import { PageTemplate } from "./features/PageTemplate";
import SentryWrapper from "./features/SentryWrapper";
import Prospect from "./pages/Prospect";
import UxDashboard from "./pages/UxDashboard";
import AgreementsList from "./pages/agreements/list";
import SingleAgreementNew from "./pages/agreements/new";
import SingleAgreementEdit from "./pages/agreements/view-edit";
import Campaigns from "./pages/campaigns";
import EditCampaign from "./pages/campaigns/edit";
import NewCampaign from "./pages/campaigns/new";
import NewCampaignSuccess from "./pages/campaigns/new/Success";
import EditCampaign from "./pages/campaigns/edit";
import CampaignPreselectionList from "./pages/preselectionForms";
import QuotesPage from "./pages/campaigns/quote";
import SelectionPage from "./pages/campaigns/selection";
import CampaignPreselectionList from "./pages/preselectionForms";
import Prospect from "./pages/Prospect";
import UxDashboard from "./pages/UxDashboard";

const SentryRoute = Sentry.withSentryRouting(Route);
const history = createBrowserHistory();
Expand Down Expand Up @@ -73,6 +74,10 @@ function App() {
path="/backoffice/campaigns/:id/edit"
component={EditCampaign}
/>
<SentryRoute
path="/backoffice/campaigns/:id/quotes"
component={QuotesPage}
/>
<SentryRoute
path="/backoffice/campaigns/:id/selection"
component={SelectionPage}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { Select, SelectType } from "@appquality/appquality-design-system";
import { useState } from "react";
import { useGetCampaignsQuery } from "src/services/tryberApi";

const useSelectOptions = () => {
const { data, isLoading } = useGetCampaignsQuery({
fields: "id,name",
});

if (isLoading) {
return {
data: (offset: number, search?: string) =>
Promise.resolve({ results: [], more: false }),
isLoading,
hasValue: (value: SelectOptionType) => false,
};
}
const campaigns = data?.items || [];
const validCampaigns = (campaigns.filter((c) => c.id && c.name) || []) as {
id: number;
name: string;
}[];
const options = validCampaigns.map((c) => ({
label: `CP${c.id.toString()} - ${c.name}`,
value: c.id.toString(),
}));

return {
data: async (
pageNumber: number,
value: SelectOptionType,
search?: string
) => {
const filteredOptions = options.filter(
(o) =>
o.label.toLowerCase().includes((search || "").toLowerCase()) &&
o.value !== value.value
);
const results = filteredOptions.slice(
pageNumber * 10,
(pageNumber + 1) * 10
);
let more = results.length === 10;
if (pageNumber === 0) {
const selectedOption = options.find((o) => o.value === value.value);
if (selectedOption) {
results.unshift(selectedOption);
more = results.length === 11;
}
}
return {
results,
more,
};
},
isLoading,
hasValue: (value: SelectOptionType) =>
options.some((o) => o.value === value.value),
};
};

export const CampaignSelect = ({
name,
label,
onChange,
placeholder,
onBlur,
}: {
name: string;
label: string;
onChange?: (value: SelectType.Option) => void;
placeholder: string;
onBlur?: () => void;
}) => {
const { data, isLoading, hasValue } = useSelectOptions();

const [selectedCampaign, setSelectedCampaign] = useState<SelectType.Option>({
label: "",
value: "",
});

const selectedValueIsPresent =
selectedCampaign && selectedCampaign.value !== ""
? hasValue(selectedCampaign)
: true;
return (
<>
<Select
onBlur={onBlur}
isDisabled={isLoading || !selectedValueIsPresent}
name={name}
label={label}
key={selectedCampaign.value?.toString()}
onChange={(value) => {
if (value === null) {
value = { label: "", value: "" };
}
setSelectedCampaign(value);
if (onChange) {
onChange(value);
}
}}
placeholder={placeholder}
menuTargetQuery={"body"}
options={async (offset, search) => {
const options = await data(offset, selectedCampaign as any, search);
return {
...options,
results: selectedValueIsPresent
? options.results
: [...options.results, selectedCampaign],
};
}}
value={selectedCampaign}
/>
</>
);
};
Loading
Loading