diff --git a/frontend/src/domains/new_dashboard/NewDashboardPage.tsx b/frontend/src/domains/new_dashboard/NewDashboardPage.tsx index 6e14fe6..e5abc49 100644 --- a/frontend/src/domains/new_dashboard/NewDashboardPage.tsx +++ b/frontend/src/domains/new_dashboard/NewDashboardPage.tsx @@ -8,6 +8,7 @@ import { AddJobModal } from "./components/jobs/AddJobModal"; import { JobDetailModal } from "./components/jobs/JobDetailModal"; import { JobTab } from "./components/jobs/JobTab"; import { Header } from "./components/layout/Header"; +import { MobileTabBar } from "./components/layout/MobileTabBar"; import { Sidebar } from "./components/layout/Sidebar"; import { MentoringTab } from "./components/mentoring/MentoringTab"; import { ProfileTab } from "./components/profile/ProfileTab"; @@ -180,6 +181,20 @@ export default function NewDashboardPage() { saveUserProfile, saveSearchPreferences, } = useUserDashboardData(user, { onError: showToast }); + const preferredModelFilter = useMemo( + () => getModelFilterFromJobTypes(searchPreferences.jobTypes), + [searchPreferences.jobTypes], + ); + const initialRecommendationSearch = useMemo( + () => + isLoadingUserData + ? null + : { + keywords: [], + filters: modelFilterToApiFilter(preferredModelFilter), + }, + [isLoadingUserData, preferredModelFilter], + ); const { trackedJobs, recommendedJobs, @@ -190,7 +205,10 @@ export default function NewDashboardPage() { changeJobStatus, changeJobNotesLocally, saveJobNotes, - } = useDashboardJobs(user, { onError: showToast }); + } = useDashboardJobs(user, { + onError: showToast, + initialRecommendationSearch, + }); const matchedTrackedJobs = useMemo( () => @@ -213,10 +231,6 @@ export default function NewDashboardPage() { ), [filterType, matchedRecommendedJobs], ); - const preferredModelFilter = useMemo( - () => getModelFilterFromJobTypes(searchPreferences.jobTypes), - [searchPreferences.jobTypes], - ); const showPreferenceNotice = !hasUserChangedJobFilters && preferredModelFilter !== "Todos" && @@ -527,11 +541,13 @@ export default function NewDashboardPage() {
-
+
{renderContent()}
+ + {selectedJob ? ( + renderNode(child, `${key}-${index}`), + ); + + switch (tag) { + case "a": { + const href = safeExternalUrl(element.getAttribute("href")); + + return href ? ( + + {children} + + ) : ( + {children} + ); + } + case "br": + return
; + case "strong": + case "b": + return {children}; + case "em": + case "i": + return {children}; + case "h1": + return

{children}

; + case "h2": + return

{children}

; + case "h3": + return

{children}

; + case "h4": + case "h5": + case "h6": + return

{children}

; + case "ul": + return ; + case "ol": + return
    {children}
; + case "li": + return
  • {children}
  • ; + case "p": + return

    {children}

    ; + case "blockquote": + return
    {children}
    ; + case "code": + return {children}; + case "pre": + return
    {children}
    ; + case "hr": + return
    ; + case "div": + return
    {children}
    ; + default: + return {children}; + } +} + +export function FormattedJobDescription({ + description, +}: FormattedJobDescriptionProps) { + const decodedDescription = decodeEncodedMarkup(description); + const document = new DOMParser().parseFromString( + decodedDescription, + "text/html", + ); + const hasMarkup = /<\/?[a-z][\s\S]*>/i.test(decodedDescription); + + return ( +
    + {hasMarkup ? ( + Array.from(document.body.childNodes).map((node, index) => + renderNode(node, String(index)), + ) + ) : ( +

    + {document.body.textContent ?? decodedDescription} +

    + )} +
    + ); +} diff --git a/frontend/src/domains/new_dashboard/components/jobs/JobDetailModal.tsx b/frontend/src/domains/new_dashboard/components/jobs/JobDetailModal.tsx index 9670161..1d46fdc 100644 --- a/frontend/src/domains/new_dashboard/components/jobs/JobDetailModal.tsx +++ b/frontend/src/domains/new_dashboard/components/jobs/JobDetailModal.tsx @@ -2,6 +2,7 @@ import { ExternalLink } from "lucide-react"; import { jobStatusClasses, jobStatuses } from "../../constants"; import type { Job, JobStatus } from "../../types"; import { Modal } from "../shared/Modal"; +import { FormattedJobDescription } from "./FormattedJobDescription"; interface JobDetailModalProps { job: Job; @@ -49,7 +50,9 @@ export function JobDetailModal({ onStatusChange, onNotesChange, }: JobDetailModalProps) { - const payloadEntries = Object.entries(job.rawPayload ?? {}); + const payloadEntries = Object.entries(job.rawPayload ?? {}).filter( + ([key]) => key !== "description", + ); const description = payloadValueToText(job.rawPayload?.description); const hasDescription = description !== "Não informado"; @@ -131,9 +134,7 @@ export function JobDetailModal({ Descrição -

    - {description} -

    + ) : null} diff --git a/frontend/src/domains/new_dashboard/components/jobs/JobFilter.tsx b/frontend/src/domains/new_dashboard/components/jobs/JobFilter.tsx index 59b8213..eaf2c99 100644 --- a/frontend/src/domains/new_dashboard/components/jobs/JobFilter.tsx +++ b/frontend/src/domains/new_dashboard/components/jobs/JobFilter.tsx @@ -39,8 +39,8 @@ export function JobFilter({ setMatchSort, }: JobFilterProps) { return ( -
    -