Pracino · Issue

Detail nabídky — redesign handoff

Updated: July 8, 2026· Version 2

Reviewed against your comments — requirements confirmed, the three open questions resolved. This is the build-ready brief: current → target mapping, field reference, and files to touch. Candidate + offer detail get one shared skeleton.

01The requirements (confirmed on review)

My read of issue #180 + the call, restated tightly and confirmed against your comments. All eight agreed; R5 was refined per your note.

Why skills & languages stay badges

Decided live on the call: skills is free text, and languages were always kept aside. Everything else is a labelled value that reads better as an icon row.

02Resolved on review

The three open questions, now decided from your comments.

  1. Q1 — úvazek + typ spolupráce → icon rows. Pull both out of the price card into the icon list; the price card becomes salary-only (matching the candidate). Flagged as an optional later tweak — worth exploring a nicer presentation than a plain icon row, but the icon list is the default for now.
  2. Q2 — languages stay badges. They do not move to the icon list; skills and languages both remain badges. So the candidate's only change stays the single salary-card move.
  3. Q3 — description sits above the price card. It goes directly under the header group (logo + name + address), above the price card — the confirmed offer order.

03How it maps to the code

Current render order → target, per screen. Naming quirk: candidate detail lives under features/company/ (a company views candidates); offer detail under features/candidate/.

The offer detail today is 100% badge groups — zero icon rows. The icon treatment (ListItem) only exists on the candidate side, so R7 is a real build, not a tweak.

Offer — today
Header · title, logo+name, address
Price card · salary + load/type chips
Badge · profession
Badge · skills
Description · with heading
Badges · mode, hours, languages
O firmě card
unify
Offer — target
Header · title · logo + [name / address]
Description · moved up, no heading
Price card · salary only
Icon rows · profession, mode, hours, load, type
Badges · skills, languages
O firmě card · = contacts
Candidate — today
Header · avatar, name, lock
Icon rows · profession … hours
Badges · languages, skills
Salary card
Contact card
one move
Candidate — target
Header · avatar, name, lock
Salary card · moved up
Icon rows · profession … hours
Badges · languages, skills
Contact card

04The offer conversion, concretely

Illustrative — the pattern for turning each offer badge group into a candidate-style icon row. Reuse ListItem; don't invent a component.

05Field reference — offer

jobOffer on GetPublishedJobOfferDetailResponseDto. Target treatment per attribute, with the label map to resolve enum ids.

AttributeTargetSource
Profession · profesejobOffer.profession.name
Work mode · režim prácejobOffer.workModeIds → WORK_MODE_LABELS
Working hours · pracovní dobajobOffer.workingHourIds → WORKING_HOUR_LABELS
Employment load · úvazekjobOffer.employmentLoadIds → EMPLOYMENT_LOAD_LABELS
Work type · typ spoluprácejobOffer.workTypeIds → WORK_TYPE_LABELS
Skills · dovednostijobOffer.skillNames
Languages · jazykyjobOffer.languageIds → LANGUAGE_LABELS
SalarycardjobOffer.salary → formatSalary()
DescriptiontextjobOffer.description · drop heading offer.detail.section.description
AddressheaderjobOffer.location → formatAddressDtoLabel()
Info

= icon row (ListItem)  ·  = badge (Badge). Candidate fields mirror these on anonymizedProfile (professions, employmentLoadIds, workTypeIds, workModeIds, workingHourIds, languages, skills, minimumCompensation).

06Components to reuse

All already in the shared UI kit — don't invent equivalents.

07Files to touch

Three files carry the change; the O firmě card is left alone.

  • src
    • features
      • candidate
        • components
          • offer-detail-content.tsxreorder; badge groups → ListItem icon rows; description under header (raw, no heading) above price card; move load/type chips out of price card into icon rows
          • offer-detail-header.tsxR5: move address up into the text column beside the logo, under the company name
      • company
        • components
          • candidate-detail-content.tsxmove salary Card up under the header — the only change; languages stay badges
Info

Correction from review: the detail screens are full route screens (own back-arrow header, fixed CTA action bar, swipe pager) — opened from the map's bottom-sheet card or the floating pin card, not rendered inside the sheet. This change is layout-only; it adds no native or animation surface, so no iOS-specific gotcha is expected.