feat: structured salary fields (min/max/currency/period)

Adds SalaryMin/SalaryMax/SalaryCurrency/SalaryPeriod alongside the
existing free-text Salary field (kept for back-compat and display).

- JobApplication model + idempotent column bridging for SQLite and MySQL
- Create/Update DTOs with NormalizeSalary (clamps negatives, swaps
  inverted min/max, uppercases currency, whitelists period)
- JobApplicationDto exposes the fields; CSV export gains 4 columns
- UI: add/edit dialogs get min/max/currency/period inputs; job table
  renders a formatted range via shared salary.ts formatter (falls back
  to free-text when structured values are absent)
- EN/NB translations; backend + full frontend suites green

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
cesnimda
2026-07-02 22:15:37 +02:00
parent 8f174cb767
commit 83e6430a24
11 changed files with 250 additions and 2 deletions
+14
View File
@@ -77,6 +77,13 @@ export const translations = {
addJobModalStatus: "Status",
addJobModalJobTitle: "Job title",
addJobModalSalary: "Salary",
salaryMinLabel: "Salary min",
salaryMaxLabel: "Salary max",
salaryCurrencyLabel: "Currency",
salaryPeriodLabel: "Per",
salaryPeriodYear: "Year",
salaryPeriodMonth: "Month",
salaryPeriodHour: "Hour",
addJobModalDeadline: "Deadline",
addJobModalDescriptionOriginal: "Description (original)",
addJobModalTranslatedDescription: "Translated description ({language})",
@@ -987,6 +994,13 @@ export const translations = {
addJobModalStatus: "Status",
addJobModalJobTitle: "Stillingstittel",
addJobModalSalary: "Lønn",
salaryMinLabel: "Lønn fra",
salaryMaxLabel: "Lønn til",
salaryCurrencyLabel: "Valuta",
salaryPeriodLabel: "Per",
salaryPeriodYear: "År",
salaryPeriodMonth: "Måned",
salaryPeriodHour: "Time",
addJobModalDeadline: "Frist",
addJobModalDescriptionOriginal: "Beskrivelse (original)",
addJobModalTranslatedDescription: "Oversatt beskrivelse ({language})",