Merge: audit quick wins (9 items — Dokumente tab, i18n, URLs, FRAND glossar, footer, calendars)
This commit is contained in:
@@ -40,13 +40,14 @@ Current migrations (as of April 2026):
|
||||
011_feedback_tables link_suggestions, checklisten_feedback, gerichte_feedback
|
||||
012_fristenrechner_rules DB-backed rule set for /tools/fristenrechner
|
||||
013_user_caldav_config per-user CalDAV (encrypted) + sync log
|
||||
014_checklist_instances persisted checklist instances linkable to Akten
|
||||
```
|
||||
|
||||
Add a new migration:
|
||||
|
||||
```
|
||||
internal/db/migrations/014_<description>.up.sql
|
||||
internal/db/migrations/014_<description>.down.sql
|
||||
internal/db/migrations/015_<description>.up.sql
|
||||
internal/db/migrations/015_<description>.down.sql
|
||||
```
|
||||
|
||||
The down file is required and must reverse the up cleanly (verified by adding a one-off down test before merge).
|
||||
@@ -104,6 +105,6 @@ Push to `main` → Gitea webhook → Dokploy auto-deploy on mlake.
|
||||
|
||||
## Project status (April 2026)
|
||||
|
||||
Phases A–G of the KanzlAI integration are shipped (schema, services, Akten, Fristen, Termine + CalDAV, Dashboard). Phase H (AI Frist extraction) is **deferred** pending a reversal of the "no Anthropic API" decision. Phase I (Notizen service + UI) pending — the polymorphic schema exists (`paliad.notizen`) but the service and UI aren't built yet.
|
||||
Phases A–G, I and J of the KanzlAI integration are shipped: schema, services, Akten, Fristen, Termine + CalDAV, Dashboard, Notizen service + UI (commit `5a9f8e5`, 2026-04-17), and instanceable Checklisten (migration 014). Phase H (AI Frist extraction) is **deferred** pending a reversal of the "no Anthropic API" decision; the Dokumente tab on Akten detail is hidden until that lands. KanzlAI infra retirement (Dokploy shutdown, `kanzlai` schema drop, Gitea archive) is still pending.
|
||||
|
||||
See `docs/feature-roadmap.md` for the full backlog and `docs/design-kanzlai-integration.md` for the integration design.
|
||||
|
||||
@@ -57,7 +57,6 @@ export function renderAktenDetail(): string {
|
||||
<a className="akten-tab" data-tab="parteien" href="#" data-i18n="akten.detail.tab.parteien">Parteien</a>
|
||||
<a className="akten-tab" data-tab="fristen" href="#" data-i18n="akten.detail.tab.fristen">Fristen</a>
|
||||
<a className="akten-tab" data-tab="termine" href="#" data-i18n="akten.detail.tab.termine">Termine</a>
|
||||
<a className="akten-tab" data-tab="dokumente" href="#" data-i18n="akten.detail.tab.dokumente">Dokumente</a>
|
||||
<a className="akten-tab" data-tab="notizen" href="#" data-i18n="akten.detail.tab.notizen">Notizen</a>
|
||||
<a className="akten-tab" data-tab="checklisten" href="#" data-i18n="akten.detail.tab.checklisten">Checklisten</a>
|
||||
</nav>
|
||||
@@ -212,16 +211,6 @@ export function renderAktenDetail(): string {
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* Dokumente — Phase H placeholder */}
|
||||
<section className="akten-tab-panel" id="tab-dokumente" style="display:none">
|
||||
<div className="akten-soon">
|
||||
<h2 data-i18n="akten.detail.soon">Bald verfügbar</h2>
|
||||
<p data-i18n="akten.detail.soon.dokumente">
|
||||
Dokumenten-Upload folgt in Phase H.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Notizen — Phase I */}
|
||||
<section className="akten-tab-panel" id="tab-notizen" style="display:none">
|
||||
<div id="notes-container" className="notiz-container" data-parent-type="akte" />
|
||||
|
||||
@@ -57,9 +57,9 @@ interface Me {
|
||||
office: string;
|
||||
}
|
||||
|
||||
type TabId = "verlauf" | "parteien" | "fristen" | "termine" | "dokumente" | "notizen" | "checklisten";
|
||||
type TabId = "verlauf" | "parteien" | "fristen" | "termine" | "notizen" | "checklisten";
|
||||
|
||||
const VALID_TABS: TabId[] = ["verlauf", "parteien", "fristen", "termine", "dokumente", "notizen", "checklisten"];
|
||||
const VALID_TABS: TabId[] = ["verlauf", "parteien", "fristen", "termine", "notizen", "checklisten"];
|
||||
|
||||
interface ChecklistInstanceSummary {
|
||||
id: string;
|
||||
|
||||
@@ -96,6 +96,15 @@ function render() {
|
||||
grid.querySelectorAll<HTMLElement>(".frist-cal-cell-has").forEach((cell) => {
|
||||
cell.addEventListener("click", () => openPopup(cell.dataset.iso!));
|
||||
});
|
||||
|
||||
const monthStart = isoDate(viewYear, viewMonth, 1);
|
||||
const monthEnd = isoDate(viewYear, viewMonth, daysInMonth);
|
||||
const hasInMonth = allFristen.some((f) => {
|
||||
const iso = f.due_date.slice(0, 10);
|
||||
return iso >= monthStart && iso <= monthEnd;
|
||||
});
|
||||
const empty = document.getElementById("frist-cal-empty")!;
|
||||
empty.style.display = hasInMonth ? "none" : "";
|
||||
}
|
||||
|
||||
function openPopup(iso: string) {
|
||||
|
||||
@@ -33,7 +33,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"nav.soon.tooltip": "Bald verf\u00fcgbar",
|
||||
|
||||
// Footer
|
||||
"footer.text": "\u00a9 2026 Paliad \u2014 Nur f\u00fcr internen Gebrauch. Hogan Lovells Patent Practice.",
|
||||
"footer.text": "\u00a9 2026 Paliad \u2014 Nur f\u00fcr internen Gebrauch.",
|
||||
|
||||
// Landing page
|
||||
"index.title": "Paliad \u2014 Patentwissen f\u00fcr Hogan Lovells",
|
||||
@@ -56,7 +56,13 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"index.style.title": "HL Patents Style",
|
||||
"index.style.desc": "Word-Vorlage im HL Patents Style. Formatierung, Schriftarten und Makros f\u00fcr standardisierte Schrifts\u00e4tze.",
|
||||
"index.offices": "Standorte",
|
||||
"index.munich": "M\u00fcnchen",
|
||||
"index.office.munich": "M\u00fcnchen",
|
||||
"index.office.duesseldorf": "D\u00fcsseldorf",
|
||||
"index.office.hamburg": "Hamburg",
|
||||
"index.office.amsterdam": "Amsterdam",
|
||||
"index.office.london": "London",
|
||||
"index.office.paris": "Paris",
|
||||
"index.office.milan": "Mailand",
|
||||
|
||||
// Login
|
||||
"login.title": "Anmelden \u2014 Paliad",
|
||||
@@ -453,7 +459,6 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"akten.detail.tab.parteien": "Parteien",
|
||||
"akten.detail.tab.fristen": "Fristen",
|
||||
"akten.detail.tab.termine": "Termine",
|
||||
"akten.detail.tab.dokumente": "Dokumente",
|
||||
"akten.detail.tab.notizen": "Notizen",
|
||||
"akten.detail.tab.checklisten": "Checklisten",
|
||||
"akten.detail.checklisten.empty": "F\u00fcr diese Akte sind noch keine Checklisten-Instanzen erfasst.",
|
||||
@@ -462,10 +467,6 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"akten.detail.checklisten.col.progress": "Fortschritt",
|
||||
"akten.detail.checklisten.col.created": "Angelegt",
|
||||
"akten.detail.checklisten.hint": "Instanzen werden auf der Vorlagen-Seite unter \"Checklisten\" angelegt.",
|
||||
"akten.detail.soon": "Bald verf\u00fcgbar",
|
||||
"akten.detail.soon.fristen": "Fristenverwaltung kommt in Phase E \u2014 diese Akte wird dann Fristen anzeigen.",
|
||||
"akten.detail.soon.termine": "Termine & CalDAV-Sync folgen in Phase F.",
|
||||
"akten.detail.soon.dokumente": "Dokumenten-Upload folgt in Phase H.",
|
||||
"akten.detail.verlauf.empty": "Noch keine Ereignisse aufgezeichnet.",
|
||||
"akten.detail.parteien.add": "Partei hinzuf\u00fcgen",
|
||||
"akten.detail.parteien.empty": "Noch keine Parteien eingetragen.",
|
||||
@@ -573,6 +574,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"fristen.kalender.subtitle": "Monats\u00fcbersicht aller Fristen Ihrer Akten.",
|
||||
"fristen.kalender.list": "Listenansicht",
|
||||
"fristen.kalender.today": "Heute",
|
||||
"fristen.kalender.empty": "Keine Fristen im ausgew\u00e4hlten Zeitraum.",
|
||||
"cal.day.mon": "Mo",
|
||||
"cal.day.tue": "Di",
|
||||
"cal.day.wed": "Mi",
|
||||
@@ -625,13 +627,13 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"dashboard.title": "Dashboard \u2014 Paliad",
|
||||
"dashboard.greeting.prefix": "Guten Tag",
|
||||
"dashboard.unavailable": "Dashboard ben\u00f6tigt die Datenbank \u2014 bitte Administrator kontaktieren.",
|
||||
"dashboard.onboarding": "Bitte schlie\u00dfen Sie das Onboarding ab, damit Ihnen Fristen und Mandate angezeigt werden k\u00f6nnen.",
|
||||
"dashboard.onboarding": "Bitte schlie\u00dfen Sie das Onboarding ab, damit Ihnen Fristen und Akten angezeigt werden k\u00f6nnen.",
|
||||
"dashboard.summary.heading": "Fristen auf einen Blick",
|
||||
"dashboard.summary.overdue": "\u00dcberf\u00e4llig",
|
||||
"dashboard.summary.this_week": "Diese Woche",
|
||||
"dashboard.summary.upcoming": "Kommend",
|
||||
"dashboard.summary.completed": "Abgeschlossen (7\u202fT.)",
|
||||
"dashboard.matters.heading": "Meine Mandate",
|
||||
"dashboard.matters.heading": "Meine Akten",
|
||||
"dashboard.matters.active": "Aktiv",
|
||||
"dashboard.matters.archived": "Archiviert",
|
||||
"dashboard.matters.total": "Gesamt",
|
||||
@@ -724,6 +726,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"termine.kalender.heading": "Terminkalender",
|
||||
"termine.kalender.subtitle": "Monats\u00fcbersicht aller Termine.",
|
||||
"termine.kalender.list": "Listenansicht",
|
||||
"termine.kalender.empty": "Keine Termine im ausgew\u00e4hlten Zeitraum.",
|
||||
"akten.detail.tab.termine": "Termine",
|
||||
"akten.detail.termine.add": "Termin hinzuf\u00fcgen",
|
||||
"akten.detail.termine.empty": "F\u00fcr diese Akte sind noch keine Termine erfasst.",
|
||||
@@ -806,7 +809,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"nav.soon.tooltip": "Coming soon",
|
||||
|
||||
// Footer
|
||||
"footer.text": "\u00a9 2026 Paliad \u2014 Internal use only. Hogan Lovells Patent Practice.",
|
||||
"footer.text": "\u00a9 2026 Paliad \u2014 Internal use only.",
|
||||
|
||||
// Landing page
|
||||
"index.title": "Paliad \u2014 Patent Knowledge for Hogan Lovells",
|
||||
@@ -829,7 +832,13 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"index.style.title": "HL Patents Style",
|
||||
"index.style.desc": "Word template in HL Patents style. Formatting, fonts, and macros for standardised briefs.",
|
||||
"index.offices": "Offices",
|
||||
"index.munich": "Munich",
|
||||
"index.office.munich": "Munich",
|
||||
"index.office.duesseldorf": "D\u00fcsseldorf",
|
||||
"index.office.hamburg": "Hamburg",
|
||||
"index.office.amsterdam": "Amsterdam",
|
||||
"index.office.london": "London",
|
||||
"index.office.paris": "Paris",
|
||||
"index.office.milan": "Milan",
|
||||
|
||||
// Login
|
||||
"login.title": "Sign In \u2014 Paliad",
|
||||
@@ -1226,7 +1235,6 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"akten.detail.tab.parteien": "Parties",
|
||||
"akten.detail.tab.fristen": "Deadlines",
|
||||
"akten.detail.tab.termine": "Appointments",
|
||||
"akten.detail.tab.dokumente": "Documents",
|
||||
"akten.detail.tab.notizen": "Notes",
|
||||
"akten.detail.tab.checklisten": "Checklists",
|
||||
"akten.detail.checklisten.empty": "No checklist instances linked to this Akte yet.",
|
||||
@@ -1235,10 +1243,6 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"akten.detail.checklisten.col.progress": "Progress",
|
||||
"akten.detail.checklisten.col.created": "Created",
|
||||
"akten.detail.checklisten.hint": "Instances are created on the template page under \"Checklists\".",
|
||||
"akten.detail.soon": "Coming soon",
|
||||
"akten.detail.soon.fristen": "Deadline management ships in Phase E \u2014 this matter will then list its deadlines here.",
|
||||
"akten.detail.soon.termine": "Appointments & CalDAV sync follow in Phase F.",
|
||||
"akten.detail.soon.dokumente": "Document upload lands in Phase H.",
|
||||
"akten.detail.verlauf.empty": "No events recorded yet.",
|
||||
"akten.detail.parteien.add": "Add party",
|
||||
"akten.detail.parteien.empty": "No parties recorded yet.",
|
||||
@@ -1346,6 +1350,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"fristen.kalender.subtitle": "Monthly view of all deadlines on your matters.",
|
||||
"fristen.kalender.list": "List view",
|
||||
"fristen.kalender.today": "Today",
|
||||
"fristen.kalender.empty": "No deadlines in the selected period.",
|
||||
"cal.day.mon": "Mon",
|
||||
"cal.day.tue": "Tue",
|
||||
"cal.day.wed": "Wed",
|
||||
@@ -1497,6 +1502,7 @@ const translations: Record<Lang, Record<string, string>> = {
|
||||
"termine.kalender.heading": "Appointment calendar",
|
||||
"termine.kalender.subtitle": "Monthly overview of all appointments.",
|
||||
"termine.kalender.list": "List view",
|
||||
"termine.kalender.empty": "No appointments in the selected period.",
|
||||
"akten.detail.tab.termine": "Appointments",
|
||||
"akten.detail.termine.add": "Add appointment",
|
||||
"akten.detail.termine.empty": "No appointments yet for this matter.",
|
||||
|
||||
@@ -103,6 +103,15 @@ function render() {
|
||||
grid.querySelectorAll<HTMLElement>(".frist-cal-cell-has").forEach((cell) => {
|
||||
cell.addEventListener("click", () => openPopup(cell.dataset.iso!));
|
||||
});
|
||||
|
||||
const monthStart = isoDate(viewYear, viewMonth, 1);
|
||||
const monthEnd = isoDate(viewYear, viewMonth, daysInMonth);
|
||||
const hasInMonth = allTermine.some((tt) => {
|
||||
const iso = tt.start_at.slice(0, 10);
|
||||
return iso >= monthStart && iso <= monthEnd;
|
||||
});
|
||||
const empty = document.getElementById("termin-cal-empty")!;
|
||||
empty.style.display = hasInMonth ? "none" : "";
|
||||
}
|
||||
|
||||
function openPopup(iso: string) {
|
||||
|
||||
@@ -4,7 +4,7 @@ export function Footer(): string {
|
||||
return (
|
||||
<footer className="footer">
|
||||
<div className="container">
|
||||
<p data-i18n="footer.text">{"\u00A9 2026 Paliad \u2014 Nur f\u00FCr internen Gebrauch. Hogan Lovells Patent Practice."}</p>
|
||||
<p data-i18n="footer.text">{"\u00A9 2026 Paliad \u2014 Nur f\u00FCr internen Gebrauch."}</p>
|
||||
<p className="footer-credit"><a href="https://flexsiebels.de" target="_blank" rel="noopener">flexsiebels.de</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@@ -46,7 +46,7 @@ export function renderDashboard(): string {
|
||||
|
||||
<div id="dashboard-onboarding" className="dashboard-unavailable" style="display:none">
|
||||
<p data-i18n="dashboard.onboarding">
|
||||
Bitte schließen Sie das Onboarding ab, damit Ihnen Fristen und Mandate angezeigt werden können.
|
||||
Bitte schließen Sie das Onboarding ab, damit Ihnen Fristen und Akten angezeigt werden können.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -79,7 +79,7 @@ export function renderDashboard(): string {
|
||||
<section className="dashboard-matters">
|
||||
<a href="/akten" className="dashboard-matter-card">
|
||||
<div className="dashboard-matter-header">
|
||||
<h3 data-i18n="dashboard.matters.heading">Meine Mandate</h3>
|
||||
<h3 data-i18n="dashboard.matters.heading">Meine Akten</h3>
|
||||
<span className="dashboard-matter-arrow" aria-hidden="true">→</span>
|
||||
</div>
|
||||
<div className="dashboard-matter-stats">
|
||||
|
||||
@@ -50,6 +50,10 @@ export function renderFristenKalender(): string {
|
||||
<div id="frist-cal-grid" className="frist-cal-grid" />
|
||||
</div>
|
||||
|
||||
<p className="akten-events-empty" id="frist-cal-empty" style="display:none" data-i18n="fristen.kalender.empty">
|
||||
Keine Fristen im ausgewählten Zeitraum.
|
||||
</p>
|
||||
|
||||
<div className="modal-overlay" id="cal-popup" style="display:none">
|
||||
<div className="modal-card">
|
||||
<div className="modal-header">
|
||||
|
||||
@@ -54,6 +54,7 @@ export function renderGlossar(): string {
|
||||
<button className="filter-pill" data-category="Prosecution" type="button" data-i18n="glossar.filter.prosecution">Prosecution</button>
|
||||
<button className="filter-pill" data-category="UPC" type="button">UPC</button>
|
||||
<button className="filter-pill" data-category="EPA" type="button">EPA</button>
|
||||
<button className="filter-pill" data-category="SEP/FRAND" type="button">SEP/FRAND</button>
|
||||
<button className="filter-pill" data-category="General" type="button" data-i18n="glossar.filter.general">Allgemein</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -105,6 +106,7 @@ export function renderGlossar(): string {
|
||||
<option value="Prosecution">Prosecution</option>
|
||||
<option value="UPC">UPC</option>
|
||||
<option value="EPA">EPA</option>
|
||||
<option value="SEP/FRAND">SEP/FRAND</option>
|
||||
<option value="General" data-i18n="glossar.filter.general">Allgemein</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -119,13 +119,13 @@ export function renderIndex(): string {
|
||||
<div className="container">
|
||||
<h3 data-i18n="index.offices">Standorte</h3>
|
||||
<div className="office-list">
|
||||
<span data-i18n="index.munich">München</span>
|
||||
<span>Düsseldorf</span>
|
||||
<span>Hamburg</span>
|
||||
<span>Amsterdam</span>
|
||||
<span>London</span>
|
||||
<span>Paris</span>
|
||||
<span>Mailand</span>
|
||||
<span data-i18n="index.office.munich">München</span>
|
||||
<span data-i18n="index.office.duesseldorf">Düsseldorf</span>
|
||||
<span data-i18n="index.office.hamburg">Hamburg</span>
|
||||
<span data-i18n="index.office.amsterdam">Amsterdam</span>
|
||||
<span data-i18n="index.office.london">London</span>
|
||||
<span data-i18n="index.office.paris">Paris</span>
|
||||
<span data-i18n="index.office.milan">Mailand</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -69,6 +69,10 @@ export function renderTermineKalender(): string {
|
||||
<div id="termin-cal-grid" className="frist-cal-grid" />
|
||||
</div>
|
||||
|
||||
<p className="akten-events-empty" id="termin-cal-empty" style="display:none" data-i18n="termine.kalender.empty">
|
||||
Keine Termine im ausgewählten Zeitraum.
|
||||
</p>
|
||||
|
||||
<div className="modal-overlay" id="cal-popup" style="display:none">
|
||||
<div className="modal-card">
|
||||
<div className="modal-header">
|
||||
|
||||
@@ -68,8 +68,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Court of Appeal — Luxembourg",
|
||||
Type: "UPC-CoA", Group: "UPC", Country: "LU", City: "Luxembourg",
|
||||
Address: "1, rue du Fort Thüngen, L-1499 Luxembourg",
|
||||
Email: "contact_luxembourg.coa@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/court-appeal",
|
||||
Email: "contact_luxembourg.coa@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/court-appeal",
|
||||
Languages: []string{"EN", "DE", "FR"},
|
||||
Filing: "Case Management System (CMS) der UPC — elektronische Einreichung Pflicht.",
|
||||
NotesDE: "Zweite Instanz für alle UPC-Verfahren. Sprache der Berufung folgt in der Regel der ersten Instanz.",
|
||||
@@ -83,13 +83,13 @@ var courts = []Court{
|
||||
NameDE: "UPC Zentralkammer — Sitz Paris",
|
||||
NameEN: "UPC Central Division — Paris Seat",
|
||||
Type: "UPC-CD", Group: "UPC", Country: "FR", City: "Paris",
|
||||
Email: "contact_paris.cd@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/central-division",
|
||||
Email: "contact_paris.cd@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/central-division",
|
||||
Languages: []string{"EN", "FR", "DE"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Zuständig u.a. für Sektionen B (Chemie, Hüttenwesen) und D (Textil, Papier) — inkl. der nach Milan verlagerten London-Zuständigkeiten.",
|
||||
NotesEN: "Competent for sections B (chemistry, metallurgy) and D (textiles, paper), among others — includes part of the former London competences.",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/central-division",
|
||||
Source: "https://www.unified-patent-court.org/en/court/central-division",
|
||||
},
|
||||
{
|
||||
ID: "upc-cd-munich",
|
||||
@@ -97,8 +97,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Central Division — Munich Section",
|
||||
Type: "UPC-CD", Group: "UPC", Country: "DE", City: "München",
|
||||
Address: "Cincinnatistraße 64, 81549 München, Deutschland",
|
||||
Email: "contact_munich.cd@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/central-division",
|
||||
Email: "contact_munich.cd@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/central-division",
|
||||
Languages: []string{"DE", "EN", "FR"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Zuständig für Sektion F (Maschinenbau, Beleuchtung, Heizung, Waffen, Sprengen) — teilt das Gebäude mit dem BPatG.",
|
||||
@@ -111,8 +111,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Central Division — Milan Section",
|
||||
Type: "UPC-CD", Group: "UPC", Country: "IT", City: "Milano",
|
||||
Address: "Via San Barnaba 50, 20122 Milano, Italien",
|
||||
Email: "contact_milan.cd@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/central-division",
|
||||
Email: "contact_milan.cd@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/central-division",
|
||||
Languages: []string{"EN", "IT"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Seit Juni 2024 operativ. Übernimmt Teile der ursprünglich London zugewiesenen Zuständigkeiten (Sektion A — human necessities).",
|
||||
@@ -127,8 +127,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division Munich",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "DE", City: "München",
|
||||
Address: "Denisstraße 3, 80335 München, Deutschland",
|
||||
Email: "contact_munich.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_munich.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"DE", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Eine der aktivsten UPC-Kammern. Zweite Kammer seit 2024 eingerichtet, um die Fallzahlen zu bewältigen.",
|
||||
@@ -141,8 +141,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division Düsseldorf",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "DE", City: "Düsseldorf",
|
||||
Address: "Cecilienallee 3, 40474 Düsseldorf, Deutschland",
|
||||
Email: "contact_dusseldorf.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_dusseldorf.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"DE", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Öffnungszeiten: Mo–Fr 9–12 Uhr persönlich, 13–16 Uhr nach Voranmeldung. Zweite Kammer eingerichtet aufgrund Fallzahlen.",
|
||||
@@ -154,8 +154,8 @@ var courts = []Court{
|
||||
NameDE: "UPC Lokalkammer Mannheim",
|
||||
NameEN: "UPC Local Division Mannheim",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "DE", City: "Mannheim",
|
||||
Email: "contact_mannheim.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_mannheim.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"DE", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Zweite Kammer eingerichtet. Aktive Kammer mit starker Rechtsprechung zu Verletzungsverfahren.",
|
||||
@@ -167,11 +167,11 @@ var courts = []Court{
|
||||
NameDE: "UPC Lokalkammer Hamburg",
|
||||
NameEN: "UPC Local Division Hamburg",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "DE", City: "Hamburg",
|
||||
Email: "contact_hamburg.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_hamburg.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"DE", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
|
||||
// --- UPC Local Divisions (other EU) ---
|
||||
@@ -180,13 +180,13 @@ var courts = []Court{
|
||||
NameDE: "UPC Lokalkammer Paris",
|
||||
NameEN: "UPC Local Division Paris",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "FR", City: "Paris",
|
||||
Email: "contact_paris.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_paris.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"FR", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Adressen-Hinweis des Gerichts: Kartendienste sind nicht immer präzise — Orientierung am Théâtre du Châtelet.",
|
||||
NotesEN: "Court note: map services are not always accurate — orient towards the Théâtre du Châtelet.",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
{
|
||||
ID: "upc-ld-milan",
|
||||
@@ -194,8 +194,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division Milan",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "IT", City: "Milano",
|
||||
Address: "Via San Barnaba 50, 20122 Milano, Italien",
|
||||
Email: "contact_milan.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_milan.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"IT", "EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Im selben Gebäude wie die Sektion Mailand der Zentralkammer.",
|
||||
@@ -208,8 +208,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division The Hague",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "NL", City: "Den Haag",
|
||||
Address: "Prinses Beatrixlaan 2, 2595 AL Den Haag, Niederlande (Postfach: P.O. Box 10366, 2501 HJ Den Haag)",
|
||||
Email: "contact_thehague.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_thehague.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "NL"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Verfahren werden überwiegend in englischer Sprache geführt.",
|
||||
@@ -221,11 +221,11 @@ var courts = []Court{
|
||||
NameDE: "UPC Lokalkammer Brüssel",
|
||||
NameEN: "UPC Local Division Brussels",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "BE", City: "Brussels",
|
||||
Email: "contact_brussels.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_brussels.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "FR", "NL", "DE"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
{
|
||||
ID: "upc-ld-helsinki",
|
||||
@@ -233,8 +233,8 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division Helsinki",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "FI", City: "Helsinki",
|
||||
Address: "Radanrakentajantie 5, 00520 Helsinki, Finnland",
|
||||
Email: "contact_helsinki.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_helsinki.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "FI", "SV"},
|
||||
Filing: "UPC Case Management System (CMS). Besuch nur nach Voranmeldung.",
|
||||
NotesDE: "Im selben Gebäude wie das finnische Marktgericht (Markkinaoikeus).",
|
||||
@@ -247,19 +247,19 @@ var courts = []Court{
|
||||
NameEN: "UPC Local Division Lisbon",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "PT", City: "Lisboa",
|
||||
Address: "Palácio da Justiça de Lisboa, Rua Marquês de Fronteira, 1098-001 Lisboa, Portugal",
|
||||
Email: "contact_lisbon.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_lisbon.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "PT"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
{
|
||||
ID: "upc-ld-wien",
|
||||
NameDE: "UPC Lokalkammer Wien",
|
||||
NameEN: "UPC Local Division Vienna",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "AT", City: "Wien",
|
||||
Email: "contact_vienna.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_vienna.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"DE", "EN"},
|
||||
Filing: "UPC Case Management System (CMS). Besuch nur nach schriftlicher Voranmeldung (Di–Mi 9–11:30 Uhr).",
|
||||
NotesDE: "Adresse wurde zum 01.01.2025 geändert — vor Besuch Kontaktdaten beim Gericht bestätigen.",
|
||||
@@ -271,22 +271,22 @@ var courts = []Court{
|
||||
NameDE: "UPC Lokalkammer Ljubljana",
|
||||
NameEN: "UPC Local Division Ljubljana",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "SI", City: "Ljubljana",
|
||||
Email: "contact_ljubljana.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_ljubljana.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "SL"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
{
|
||||
ID: "upc-ld-kopenhagen",
|
||||
NameDE: "UPC Lokalkammer Kopenhagen",
|
||||
NameEN: "UPC Local Division Copenhagen",
|
||||
Type: "UPC-LD", Group: "UPC", Country: "DK", City: "København",
|
||||
Email: "contact_copenhagen.loc@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_copenhagen.loc@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN", "DA"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
Source: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Source: "https://www.unified-patent-court.org/en/court/locations",
|
||||
},
|
||||
|
||||
// --- UPC Regional Division ---
|
||||
@@ -295,8 +295,8 @@ var courts = []Court{
|
||||
NameDE: "UPC Regionalkammer Nord-Baltikum (Stockholm)",
|
||||
NameEN: "UPC Nordic-Baltic Regional Division (Stockholm)",
|
||||
Type: "UPC-RD", Group: "UPC", Country: "SE", City: "Stockholm",
|
||||
Email: "contact_stockholm.rd@unifiedpatentcourt.org",
|
||||
Website: "https://www.unifiedpatentcourt.org/en/court/locations",
|
||||
Email: "contact_stockholm.rd@unified-patent-court.org",
|
||||
Website: "https://www.unified-patent-court.org/en/court/locations",
|
||||
Languages: []string{"EN"},
|
||||
Filing: "UPC Case Management System (CMS).",
|
||||
NotesDE: "Gemeinsame Regionalkammer für Schweden, Estland, Lettland und Litauen. Verhandlungen auch in Riga, Tallinn und Vilnius.",
|
||||
|
||||
@@ -116,6 +116,21 @@ var glossarTerms = []GlossarTerm{
|
||||
{DE: "Neuheitsschädlich", EN: "Novelty-destroying", Definition: "Eigenschaft einer Entgegenhaltung, die die Neuheit der beanspruchten Erfindung zerstört.", Category: "General"},
|
||||
{DE: "Aufgabe-Lösungs-Ansatz", EN: "Problem-solution approach", Definition: "Vom EPA angewandte Methode zur Prüfung der erfinderischen Tätigkeit.", Category: "General"},
|
||||
{DE: "Formstücke", EN: "Formal documents / Forms", Definition: "Standardformulare der Patentämter für Anträge und Mitteilungen.", Category: "General"},
|
||||
|
||||
// --- SEP/FRAND ---
|
||||
{DE: "FRAND", EN: "FRAND", Definition: "Fair, Reasonable and Non-Discriminatory \u2014 Lizenzbedingungen, zu denen sich SEP-Inhaber gegenüber Standardisierungsorganisationen verpflichten.", Category: "SEP/FRAND"},
|
||||
{DE: "SEP", EN: "SEP", Definition: "Standard Essential Patent \u2014 ein Patent, dessen Nutzung zur Umsetzung eines technischen Standards zwingend erforderlich ist.", Category: "SEP/FRAND"},
|
||||
{DE: "Standard-essentielles Patent", EN: "Standard-essential patent", Definition: "Deutsche Bezeichnung für ein SEP; ein Patent, das gegenüber einer Standardisierungsorganisation (z.\u202fB. ETSI) als essentiell deklariert wurde.", Category: "SEP/FRAND"},
|
||||
{DE: "Patentpool", EN: "Patent pool", Definition: "Zusammenschluss mehrerer SEP-Inhaber, die ihre Patente über einen Administrator (z.\u202fB. Avanci, Sisvel) gebündelt lizenzieren.", Category: "SEP/FRAND"},
|
||||
{DE: "Anti-Suit Injunction", EN: "Anti-suit injunction (ASI)", Definition: "Gerichtliche Anordnung, die einer Partei verbietet, ein paralleles Verfahren vor einem anderen Gericht zu führen \u2014 in SEP-Streitigkeiten insbesondere aus den USA und UK bekannt.", Category: "SEP/FRAND"},
|
||||
{DE: "Anti-Anti-Suit Injunction", EN: "Anti-anti-suit injunction (AASI)", Definition: "Gegenanordnung, die einer Partei untersagt, eine Anti-Suit Injunction zu beantragen oder durchzusetzen \u2014 von deutschen Gerichten (München I, Düsseldorf) als Verteidigung etabliert.", Category: "SEP/FRAND"},
|
||||
{DE: "Injunction Gap", EN: "Injunction gap", Definition: "Zeitraum zwischen dem Verletzungsurteil eines deutschen Gerichts und der Entscheidung des BPatG über den Rechtsbestand \u2014 umstritten, da SEP-Inhaber Unterlassung durchsetzen können, bevor das Patent auf Nichtigkeit überprüft ist.", Category: "SEP/FRAND"},
|
||||
{DE: "Orange-Book-Standard", EN: "Orange-Book-Standard", Definition: "BGH-Leitentscheidung (KZR 39/06, 2009) zum kartellrechtlichen Zwangslizenzeinwand im SEP-Kontext; überholt durch Huawei/ZTE (EuGH 2015), aber weiterhin zitiert.", Category: "SEP/FRAND"},
|
||||
{DE: "Huawei/ZTE-Verhandlungsmuster", EN: "Huawei/ZTE negotiation framework", Definition: "EuGH-Urteil C-170/13 (2015): Schrittweises Verhandlungsmuster (Verletzungshinweis, Lizenzangebot des SEP-Inhabers, FRAND-konformes Gegenangebot des Verletzers, Rechnungslegung), das vor Unterlassungsanträgen einzuhalten ist.", Category: "SEP/FRAND"},
|
||||
{DE: "RAND", EN: "RAND", Definition: "Reasonable and Non-Discriminatory \u2014 US-amerikanische Entsprechung zu FRAND; in ANSI-Kontexten gebräuchlich.", Category: "SEP/FRAND"},
|
||||
{DE: "ETSI IPR Policy", EN: "ETSI IPR Policy", Definition: "Regelwerk des European Telecommunications Standards Institute zu Offenlegungs- und FRAND-Lizenzverpflichtungen von SEP-Inhabern (insb. Clause 6.1).", Category: "SEP/FRAND"},
|
||||
{DE: "Patent-Hold-up", EN: "Patent hold-up", Definition: "Missbrauchsvorwurf gegen SEP-Inhaber, die nach der Standardisierung überhöhte Lizenzgebühren verlangen oder Unterlassung drohen, um Implementierer unter Druck zu setzen.", Category: "SEP/FRAND"},
|
||||
{DE: "Patent-Hold-out", EN: "Patent hold-out", Definition: "Gegenstück zum Hold-up: Implementierer verzögern oder verweigern Lizenzverhandlungen und nutzen die Standardtechnologie ohne Lizenz (\"efficient infringement\").", Category: "SEP/FRAND"},
|
||||
}
|
||||
|
||||
func handleGlossarPage(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -36,7 +36,6 @@ var linkCategories = []linkCategory{
|
||||
{ID: "recherche", NameDE: "Recherche", NameEN: "Research"},
|
||||
{ID: "upc", NameDE: "UPC", NameEN: "UPC"},
|
||||
{ID: "gesetze", NameDE: "Gesetze", NameEN: "Legislation"},
|
||||
{ID: "hl", NameDE: "HL Intern", NameEN: "HL Internal"},
|
||||
}
|
||||
|
||||
var curatedLinks = []link{
|
||||
@@ -201,22 +200,6 @@ var curatedLinks = []link{
|
||||
DescDE: "Zivilprozessordnung. Verfahrensrechtliche Grundlage für Patentverletzungsklagen.",
|
||||
DescEN: "Code of Civil Procedure. Procedural basis for patent infringement actions.",
|
||||
},
|
||||
|
||||
// HL Intern
|
||||
{
|
||||
ID: "hl-sharepoint", Category: "hl",
|
||||
Title: "HL SharePoint — Patent Practice",
|
||||
URL: "#",
|
||||
DescDE: "SharePoint der HL Patent Practice. Interne Dokumente und Teamressourcen.",
|
||||
DescEN: "HL Patent Practice SharePoint. Internal documents and team resources.",
|
||||
},
|
||||
{
|
||||
ID: "hl-tools", Category: "hl",
|
||||
Title: "HL Interne Tools",
|
||||
URL: "#",
|
||||
DescDE: "Interne Tools und Systeme. Wird in Kürze verlinkt.",
|
||||
DescEN: "Internal tools and systems. Links coming soon.",
|
||||
},
|
||||
}
|
||||
|
||||
func handleLinksPage(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
Reference in New Issue
Block a user