Labels für Stellen (Bewerbungen + Jobangebote), inkl. API & Swagger
Mehrere Labels pro Stelle (Regional, Remote-Deutschlandweit, Homeoffice-Deutschlandweit), gespeichert als JSON-Array in einer neuen labels-Spalte beider Tabellen (Migration). Geteiltes lib/labels.js mit parse/serialize; wiederverwendbare Partials fuer Chips + Mehrfachauswahl. - Web: setzen im Hinzufuegen-Modal, auf der Bearbeiten-Seite und im Jobangebot-Bearbeiten-Formular; Anzeige als Chips in den Listen. - Uebernahme eines Angebots traegt dessen Labels in die neue Bewerbung. - REST-API: labels[] in /applications und /joboffers (GET/POST/PUT), Filter ?label=…; OpenAPI/Swagger-Schemas + Enums erweitert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
<%
|
||||
// Display-only label chips. Expects local `labels` (array of label strings).
|
||||
var _labelClasses = {
|
||||
'Regional': 'bg-sky-100 text-sky-800 dark:bg-sky-900/50 dark:text-sky-200',
|
||||
'Remote-Deutschlandweit': 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/50 dark:text-emerald-200',
|
||||
'Homeoffice-Deutschlandweit': 'bg-violet-100 text-violet-800 dark:bg-violet-900/50 dark:text-violet-200'
|
||||
};
|
||||
var _labels = (typeof labels !== 'undefined' && labels) ? labels : [];
|
||||
%>
|
||||
<% _labels.forEach(function (lbl) { %>
|
||||
<span class="inline-flex items-center px-2 py-0.5 rounded-full text-[11px] font-medium leading-tight <%= _labelClasses[lbl] || 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-200' %>"><%= lbl %></span>
|
||||
<% }); %>
|
||||
@@ -0,0 +1,16 @@
|
||||
<%
|
||||
// Multi-select label picker (checkboxes named "labels"). Expects locals:
|
||||
// labelOptions – array of all selectable labels
|
||||
// selected – array of currently selected labels (optional)
|
||||
var _opts = (typeof labelOptions !== 'undefined' && labelOptions) ? labelOptions : [];
|
||||
var _sel = (typeof selected !== 'undefined' && selected) ? selected : [];
|
||||
%>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<% _opts.forEach(function (opt) { %>
|
||||
<label class="inline-flex items-center gap-2 px-3 py-1.5 rounded-full border cursor-pointer text-sm transition-colors border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700">
|
||||
<input type="checkbox" name="labels" value="<%= opt %>" <%= _sel.indexOf(opt) !== -1 ? 'checked' : '' %>
|
||||
class="rounded border-gray-300 dark:border-gray-500 text-blue-600 focus:ring-blue-500">
|
||||
<span class="text-gray-700 dark:text-gray-200"><%= opt %></span>
|
||||
</label>
|
||||
<% }); %>
|
||||
</div>
|
||||
Reference in New Issue
Block a user