Files
thomasandClaude ddf909502a Browser-Plugin: Multi-User/X-API-Key + Footer-Download
Plugin (Manifest V3) refactored für gehostete Multi-User-Instanz:
- Tracker-URL hardcoded https://nextjobs.cc (keine URL-Eingabe mehr)
- Authentifizierung ausschließlich über persönlichen REST-API-Key
  (Header X-API-Key), pro Benutzer in chrome.storage.sync
- Server: /api/indeed-import nutzt neuen requireApiKey-Middleware,
  ordnet Import dem Benutzerkonto mit passendem cfg:API_TOKEN zu

Download: /plugin/nextjobs-stellen-import.zip packt extension/ on the
fly (dep-freier STORE-Zip in lib/zipdir.js, deterministischer Timestamp),
route hinter requireAuth. Footer-Link im App-Footer. Dockerfile kopiert
extension/ ins Image.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-20 09:44:41 +02:00

111 lines
3.9 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
width: 360px;
margin: 0;
padding: 16px;
color: #1f2937;
background: #fff;
}
h1 { font-size: 15px; margin: 0 0 2px; }
p.hint { font-size: 12px; color: #6b7280; margin: 0 0 12px; }
label { display: block; font-size: 12px; font-weight: 600; margin: 10px 0 4px; }
input, textarea, select {
width: 100%; box-sizing: border-box;
padding: 8px 10px; font-size: 13px;
border: 1px solid #d1d5db; border-radius: 6px;
font-family: inherit;
}
textarea { resize: vertical; min-height: 84px; }
.grid2 { display: flex; gap: 8px; }
.grid2 > div { flex: 1; }
.row { display: flex; gap: 8px; margin-top: 14px; }
button {
flex: 1; padding: 9px 10px; font-size: 13px; font-weight: 600;
border: none; border-radius: 6px; cursor: pointer;
}
button:disabled { opacity: .6; cursor: default; }
.primary { background: #1f4068; color: #fff; }
.primary:hover:not(:disabled) { background: #17324f; }
.secondary { background: #e5e7eb; color: #1f2937; }
.secondary:hover:not(:disabled) { background: #d1d5db; }
#status { font-size: 12px; margin-top: 10px; min-height: 16px; }
#status a { color: #1f4068; }
.ok { color: #16a34a; }
.err { color: #dc2626; }
details { margin-top: 16px; border-top: 1px solid #e5e7eb; padding-top: 10px; }
summary { font-size: 12px; font-weight: 600; color: #6b7280; cursor: pointer; }
details .row { margin-top: 10px; }
details label { margin-top: 8px; }
</style>
</head>
<body>
<h1>Stelle erfassen</h1>
<p class="hint">Automatisch von der aktuellen Seite ausgelesen - bitte prüfen, ggf. korrigieren und senden. Tipp: Text auf der Seite markieren, dann wird er als Beschreibung übernommen.</p>
<div class="grid2">
<div>
<label for="firma">Firma</label>
<input type="text" id="firma" placeholder="Unternehmen" />
</div>
<div>
<label for="art">Quelle</label>
<select id="art">
<option>E-Mail</option>
<option>Online-Portal</option>
<option>Indeed</option>
<option>StepStone</option>
<option>Firmenwebsite</option>
<option>Post</option>
<option>Initiativbewerbung</option>
<option>Arbeitsagentur</option>
<option>Sonstiges</option>
</select>
</div>
</div>
<label for="stelle">Stelle</label>
<input type="text" id="stelle" placeholder="Stellenbezeichnung" />
<div class="grid2">
<div>
<label for="ort">Ort</label>
<input type="text" id="ort" placeholder="Ort" />
</div>
<div>
<label for="gehalt">Gehalt (optional)</label>
<input type="text" id="gehalt" placeholder="z. B. 55.000 EUR" />
</div>
</div>
<label for="stellenbeschreibung">Stellenbeschreibung</label>
<textarea id="stellenbeschreibung" placeholder="Beschreibung der Stelle …"></textarea>
<input type="hidden" id="quelle_url" />
<div class="row">
<button class="secondary" id="rescanBtn">Neu auslesen</button>
<button class="primary" id="sendBtn">An Tracker senden</button>
</div>
<div id="status"></div>
<details id="settings" open>
<summary>Einstellungen</summary>
<label for="apiKey">REST-API-Key</label>
<input type="password" id="apiKey" placeholder="API-Key aus den Tracker-Einstellungen" autocomplete="off" />
<p class="hint" style="margin:6px 0 0">Deinen persönlichen Key findest du im Tracker unter <b>Einstellungen → API-Token (X-API-Key)</b>. Pro Benutzer eigener Key.</p>
<div class="row">
<button class="primary" id="saveBtn">Speichern</button>
<button class="secondary" id="testBtn">Verbindung testen</button>
</div>
</details>
<script src="popup.js"></script>
</body>
</html>