From adf0d995e37c471f12402f1c358933edae82171e Mon Sep 17 00:00:00 2001 From: Mathis Hofer Date: Tue, 23 Apr 2024 13:28:01 +0200 Subject: [PATCH] Add static footer content pages #167 --- cypress/e2e/footer.cy.ts | 90 ++++++ public/locales/fr-CH.js | 44 ++- src/components/Content.ts | 43 ++- src/components/Footer.ts | 39 ++- src/components/Footer/Contact.ts | 24 ++ src/components/Footer/Imprint.ts | 57 ++++ src/components/Footer/Legal.ts | 170 ++++++++++ src/components/index.ts | 3 + src/settings.ts | 526 ++++++++++++++++++------------- src/utils/navigation.ts | 3 + src/utils/templates.ts | 6 + src/utils/theme.ts | 65 ++++ xliff/fr-CH.xlf | 288 ++++++++++++----- 13 files changed, 1037 insertions(+), 321 deletions(-) create mode 100644 cypress/e2e/footer.cy.ts create mode 100644 src/components/Footer/Contact.ts create mode 100644 src/components/Footer/Imprint.ts create mode 100644 src/components/Footer/Legal.ts create mode 100644 src/utils/templates.ts diff --git a/cypress/e2e/footer.cy.ts b/cypress/e2e/footer.cy.ts new file mode 100644 index 00000000..e8532ccb --- /dev/null +++ b/cypress/e2e/footer.cy.ts @@ -0,0 +1,90 @@ +describe("Footer", () => { + beforeEach(() => { + cy.resizeToDesktop(); + }); + + describe("de", () => { + beforeEach(() => { + cy.login({ locale: "de-CH", roles: ["TeacherRole"], permissions: [] }); + }); + + it("renders the footer with links to contact, legal and imprint pages", () => { + cy.visit("/index.html"); + + cy.get("bkd-footer").within(() => { + cy.get("a").contains("Kontakt"); + cy.get("a").contains("Rechtliche Hinweise"); + cy.get("a").contains("Impressum"); + }); + }); + + it("renders the static contact page", () => { + cy.visit("/index.html"); + cy.get("bkd-footer").find("a").contains("Kontakt").click(); + + cy.get("h1").contains("Kontakt", {}); + cy.contains("an die zuständige Stelle in ihrer Schule"); + cy.get("iframe").should("not.exist"); + }); + + it("renders the static legal page", () => { + cy.visit("/index.html"); + cy.get("bkd-footer").find("a").contains("Rechtliche Hinweise").click(); + + cy.get("h1").contains("Rechtliche Hinweise", {}); + cy.contains("Haftungsausschluss"); + cy.get("iframe").should("not.exist"); + }); + + it("renders the static imprint page", () => { + cy.visit("/index.html"); + cy.get("bkd-footer").find("a").contains("Impressum").click(); + + cy.get("h1").contains("Impressum", {}); + cy.contains("Inhaltsverantwortung"); + cy.get("iframe").should("not.exist"); + }); + }); + + describe("fr", () => { + beforeEach(() => { + cy.login({ locale: "fr-CH", roles: ["TeacherRole"], permissions: [] }); + }); + + it("renders the footer with links to contact, legal and imprint pages", () => { + cy.visit("/index.html?locale=fr-CH"); + cy.get("bkd-footer").within(() => { + cy.get("a").contains("Contact"); + cy.get("a").contains("Mentions légales"); + cy.get("a").contains("Impressum"); + }); + }); + + it("renders the static contact page", () => { + cy.visit("/index.html?locale=fr-CH"); + cy.get("bkd-footer").find("a").contains("Contact").click(); + + cy.get("h1").contains("Contact", {}); + cy.contains("contacter le service compétent de leur établissement"); + cy.get("iframe").should("not.exist"); + }); + + it("renders the static legal page", () => { + cy.visit("/index.html?locale=fr-CH"); + cy.get("bkd-footer").find("a").contains("Mentions légales").click(); + + cy.get("h1").contains("Mentions légales", {}); + cy.contains("Exclusion de la responsabilité"); + cy.get("iframe").should("not.exist"); + }); + + it("renders the static imprint page", () => { + cy.visit("/index.html?locale=fr-CH"); + cy.get("bkd-footer").find("a").contains("Impressum").click(); + + cy.get("h1").contains("Impressum", {}); + cy.contains("Responsabilité du contenu"); + cy.get("iframe").should("not.exist"); + }); + }); +}); diff --git a/public/locales/fr-CH.js b/public/locales/fr-CH.js index 1cb72d39..2afa2b07 100644 --- a/public/locales/fr-CH.js +++ b/public/locales/fr-CH.js @@ -6,29 +6,49 @@ export const templates = { s005058d82b713689: `Notes`, + s05ec46839b2c45c3: `Supprimer la notification`, + s0755fb794c2b9b3d: `Cette application contient des liens hypertextes menant à des offres proposées par des tiers. Vous utilisez ces liens à vos propres risques. Nous ne répondons pas du contenu publié sur ces autres sites Internet. Sont notamment exclus de notre responsabilité la garantie que notre application soit disponible en permanence ainsi que les dommages liés à son utilisation (p. ex. en raison d’une interruption de la connexion ou d’un logiciel malveillant).`, + s0ae8b0f434f47faa: `Les contenus de cette application informatique sont mis à disposition par l’établissement concerné. Bien qu’ils soient régulièrement vérifiés et mis à jour, nous déclinons toute responsabilité, pour autant que la loi le permette, en cas de conséquence indésirable liée à leur utilisation.`, + s1381f1fa0b3ddb62: `En utilisant cette application, vous acceptez le traitement des données citées, dans la mesure de ce qui est nécessaire. Voici des informations détaillées relatives au traitement des données :`, + s17b1ac4c36efd642: `Contact`, s1a8b197f436e88ab: `Menu paramètres`, s2ccb1c31fa62fea1: `Absences`, s2e7964a3ed3ff4b2: `Saisir un remplacement`, + s2f3ed4ae7b042337: `Fournisseur de prestations`, s2faf4f61874da789: `Rechercher des personnes et des institutions`, s30329742fbb01b71: `Contrôle des présences`, + s30c3ae3fb64d10bd: `Si vous avez des questions sur la protection des données en lien avec la présente application, vous pouvez vous adresser au service responsable de l’application, dont les coordonnées figurent dans l’impressum.`, s321998fa37fe89be: `© Direction de l'instruction publique et de la culture`, + s3490946cb9fc3368: `Réseaux sociaux`, s41d88871e0b18f8b: `Cours et manifestations`, + s41ff2c74cc56bc8f: `En cas de message d’erreur dans Evento Web ou de questions au sujet de cette application, les élèves, les membres du corps enseignant et les collaboratrices et collaborateurs des écoles peuvent contacter le service compétent de leur établissement. L’école indique aux élèves le service concerné. En cas de doute, veuillez contacter le secrétariat de l’école.`, + s44d2798b4a925e79: `Propriété intellectuelle`, s4c575b80febcc990: `Gérer les remplacements`, + s53f771f096f6dee7: `Adresse IP, données techniques relatives au système d’exploitation et au navigateur web, URL référent, nom d’hôte et heure`, + s6083633db7f4cf90: `La présente application n’utilise pas de cookies.`, + s63e457bc703a3030: `Courriel`, + s64629ecd4900e6de: `Le fournisseur de prestations du canton de Berne qui assure l’exploitation de cette application traite l’adresse IP ou les données techniques des appareils des personnes qui l’utilisent. Le degré de protection des données prévu par la législation que ce fournisseur est tenu de respecter équivaut à celui prévu dans le droit bernois. Avant traitement, l’adresse IP est transmise de manière cryptée et anonymisée.`, + s66a8ea9d4609abf8: `Politique de confidentialité`, s66fb201578f6f6c2: `Tutoriels vidéo`, s676022c035fe65f5: `Effectuer un remplacement`, s67749057edb2586b: `Se déconnecter`, s6ab9bf010cfc8931: `Enseignement`, s6d8b7baee47fca15: `Menu`, + s71d64f3daba42f69: `Exploitation et questions techniques`, s7459bbd6ff0ec70a: `Prestations`, + s751e73928c2bd1b0: `Raison du traitement`, s784d82bd15c49b4a: `Paramètres`, s79382e84e0818a6e: `Mon profil`, s805a26293333f4d7: `Évaluer les absences`, + s8218de939c80532c: `Responsabilité du contenu`, + s84044e9a5f99c170: `Données du journal du serveur web du canton de Berne afin d’identifier et de traiter des problèmes techniques et des attaques.`, s885970c4ee8d21cc: `Fermer`, s8bb0b618bf59b96e: `Détails de l'événement`, s8e7e1013bc071156: `Saisie des notes`, s918230658d993873: `Navigation mobile`, s9b0191032da1cf5e: `Traiter les absences`, sa37b83f4c60e63d3: `Excuser les absences en suspens`, + sa981ad28edcf81e5: `Il se peut que des éléments figurant dans l’application (images, icônes) soient la propriété de tiers. Leur utilisation est donc interdite. Sur demande, le canton de Berne peut cependant autoriser l’utilisation, en dehors du site web, des éléments dont il détient les droits. Veuillez adresser vos demandes à cet effet au service responsable de l’application, dont les coordonnées figurent dans l’impressum.`, saac6cc64d5c17b4f: `Administration`, sac1056b6664675ca: `Réserver des salles et des appareils`, sb5ffc0faf2cf16da: `Formation continue interne`, @@ -37,16 +57,36 @@ export const templates = { sc202079fc13ee45a: `Disciplines actuelles`, sc217172426ab34d5: `Formation (continue)`, sc265a7e29e120db0: `Evento`, - sc42d48a091dc3230: `Page d'accueil Evento`, + sc354c34c1a7cbcc4: `Cookies`, sc42d48a091dc3230: `Page d'accueil Evento`, sc874744fb4632e62: `Mentions légales`, + sccb118772784d38c: `Bedag Informatique SA +Engehaldenstrasse 12 +3012 Berne`, sccb8c6ab6c0cf3e6: `Terminer le remplacement`, scde3342a428aaee8: `Hors ligne`, scfa1631260cdd84a: `Tests et évalution`, scff9b2b73fc9a17f: `Notifications`, + sd0195378eb1d12a7: `Erreur lors du chargement des notifications`, sd10fcf5b06af72f6: `Navigation service`, sd11a46c2e7022f58: `Impressum`, - sda82f4406693e77c: `Tout effacer`, + sd58f707de5fe6c23: `Exclusion de la responsabilité`, sd79be54b222abcae: `Aucune connexion disponible.`, + sda7b78ee4d822af5: `Traitement des données`, + sda82f4406693e77c: `Tout effacer`, + se33353371b3ee38b: `Données traitées`, + sea31a3191cc166f8: `École compétente, voir Contact`, + seae9439e8d8e58e7: `La présente application renvoie uniquement vers des réseaux sociaux tels que YouTube au moyen de liens et non via l’exécution de programmes (plug-in). Ainsi, aucune donnée personnelle n’est transmise aux réseaux sociaux lorsque vous utilisez l’application.`, sec148f76974d9b06: `Saisir des détails d'inscription`, + sef3cc5f0adf7abc3: `Application`, + sf49fc5f227269877: `Le service responsable de l’application au sens de la législation sur la protection des données, et notamment du règlement général de l’UE sur la protection des données (RGPD), est :`, + sf4fb738671432c9c: `Direction de l’instruction publique et de la culture du canton de Berne +Office des écoles moyennes et de la formation professionnelle +Unité Applications informatiques +Kasernenstrasse 27 +3013 Berne`, + sf6588ea1b5ceacff: `Office des écoles moyennes et de la formation professionnelle +Kasernenstrasse 27 +3013 Berne`, + sfb4410b48e95fa73: `Contact`, }; diff --git a/src/components/Content.ts b/src/components/Content.ts index edc755e1..839e92e5 100644 --- a/src/components/Content.ts +++ b/src/components/Content.ts @@ -1,5 +1,6 @@ import { LitElement, css, html } from "lit"; import { customElement, query } from "lit/decorators.js"; +import { choose } from "lit/directives/choose.js"; import { keyed } from "lit/directives/keyed.js"; import { when } from "lit/directives/when.js"; import { localized, msg } from "@lit/localize"; @@ -31,6 +32,8 @@ export class Content extends LitElement { font-size: 3.375rem; font-weight: 100; line-height: 2.25rem; + letter-spacing: 0.01rem; + word-spacing: 0.025rem; margin: 0 0 calc(3.375rem / 2) 0; } @@ -104,6 +107,33 @@ export class Content extends LitElement { } } + private renderAppIframe() { + return html`${keyed( + portalState.app.root, + html` + + `, + )}`; + } + + private renderFooterContent() { + return html` + ${choose( + portalState.navigationItemKey, + [ + ["contact", () => html``], + ["legal", () => html``], + ["imprint", () => html``], + ], + () => html``, + )} + `; + } + render() { this.renderedOffline = !navigator.onLine; if (!navigator.onLine) { @@ -129,15 +159,10 @@ export class Content extends LitElement { portalState.app.heading, () => html`

${portalState.navigationItem.label}

`, )} - ${keyed( - portalState.app.root, - html` - - `, + ${when( + portalState.app.key === "footer", + () => this.renderFooterContent(), + () => this.renderAppIframe(), )} `; diff --git a/src/components/Footer.ts b/src/components/Footer.ts index c84c56e2..9861a0e6 100644 --- a/src/components/Footer.ts +++ b/src/components/Footer.ts @@ -1,8 +1,11 @@ import { LitElement, css, html } from "lit"; import { customElement } from "lit/decorators.js"; +import { repeat } from "lit/directives/repeat.js"; import { localized, msg } from "@lit/localize"; import { StateController } from "@lit-app/state"; +import { NavigationItem, settings } from "../settings"; import { portalState } from "../state/portal-state"; +import { buildUrl } from "../utils/routing"; import { theme } from "../utils/theme"; @customElement("bkd-footer") @@ -94,27 +97,31 @@ export class Footer extends LitElement { new StateController(this, portalState); } + private renderFooterLink(item: NavigationItem) { + const url = buildUrl(item); + return html` + { + event?.preventDefault(); + console.log("navigate", new URL(url)); + portalState.navigate(new URL(url)); + }} + >${item.label} + `; + } + render() { return html` `; diff --git a/src/components/Footer/Contact.ts b/src/components/Footer/Contact.ts new file mode 100644 index 00000000..3c5426e3 --- /dev/null +++ b/src/components/Footer/Contact.ts @@ -0,0 +1,24 @@ +import { LitElement, html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { localized, msg } from "@lit/localize"; +import { contentStyles, theme } from "../../utils/theme"; + +@customElement("bkd-contact") +@localized() +export class Contact extends LitElement { + static styles = [theme, contentStyles]; + + render() { + return html`

+ ${msg( + "Lernende, Lehrpersonen und Schulmitarbeitende wenden sich bei Fehlermeldungen in Evento Web oder Fragen zu dieser Fachapplikation an die zuständige Stelle in ihrer Schule. Diese wird von der Schule kommuniziert. Im Zweifelsfall kontaktieren Sie bitte das Schulsekretariat.", + )} +

`; + } +} + +declare global { + interface HTMLElementTagNameMap { + "bkd-contact": Contact; + } +} diff --git a/src/components/Footer/Imprint.ts b/src/components/Footer/Imprint.ts new file mode 100644 index 00000000..09b151c4 --- /dev/null +++ b/src/components/Footer/Imprint.ts @@ -0,0 +1,57 @@ +import { LitElement, html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { localized, msg } from "@lit/localize"; +import { StateController } from "@lit-app/state"; +import { portalState } from "../../state/portal-state"; +import { withLineBreaks } from "../../utils/templates"; +import { contentStyles, theme } from "../../utils/theme"; + +@customElement("bkd-imprint") +@localized() +export class Imprint extends LitElement { + static styles = [theme, contentStyles]; + + constructor() { + super(); + new StateController(this, portalState); + } + + render() { + return html` +

${msg("Inhaltsverantwortung")}

+

${msg("Zuständige Schule, siehe Kontakt")}

+ +

${msg("Fachapplikation")}

+

+ ${withLineBreaks( + msg(`Bildungs- und Kulturdirektion des Kantons Bern +Mittelschul- und Berufsbildungsamt +Fachbereich Informatikanwendungen +Kasernenstrasse 27 +3013 Bern`), + )} +

+

${msg("E-Mail")}

+ +

${msg("Betrieb und Technik")}

+

+ ${withLineBreaks( + msg( + `Bedag Informatik AG +Engehaldenstrasse 12 +3012 Bern`, + ), + )} +

+

+ www.bedag.ch +

+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "bkd-imprint": Imprint; + } +} diff --git a/src/components/Footer/Legal.ts b/src/components/Footer/Legal.ts new file mode 100644 index 00000000..bcfdf24f --- /dev/null +++ b/src/components/Footer/Legal.ts @@ -0,0 +1,170 @@ +import { LitElement, css, html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { localized, msg } from "@lit/localize"; +import { withLineBreaks } from "../../utils/templates"; +import { contentStyles, theme } from "../../utils/theme"; + +@customElement("bkd-legal") +@localized() +export class Legal extends LitElement { + static styles = [ + theme, + contentStyles, + css` + .table-container { + overflow-x: auto; + margin-bottom: 0.9375rem; + } + + table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + } + + tbody, + tfoot, + thead { + border: none; + background-color: transparent; + } + + tfoot td, + tfoot th, + thead td, + thead th, + tbody td, + tbody th { + padding: 0.75rem; + text-align: left; + } + + th, + th { + font-weight: 1rem; + font-weight: 500; + } + + tbody td { + font-size: 0.875rem; + line-height: 1.125rem; + border-bottom: 1px solid var(--bkd-table-border); + } + + thead, + tbody tr:last-of-type th, + tbody tr:last-of-type td { + border-bottom: 1px solid var(--bkd-brand-black); + } + `, + ]; + + render() { + return html` +

${msg("Haftungsausschluss")}

+

+ ${msg( + "Die Inhalte dieser Fachapplikation sind ein Datenangebot der zuständigen Schule. Obwohl diese die Daten regelmässig auf Richtigkeit und Aktualität hin prüft, lehnen wir, soweit gesetzlich zulässig, jede Haftung für unerwünschte Folgen aus dem Gebrauch dieser Daten ab.", + )} +

+

+ ${msg( + "Diese Fachapplikation enthält Links zu Angeboten von Dritten. Sie benutzen diese Links auf eigenes Risiko. Für die Inhalte dieser anderen Webseiten übernehmen wir keine Verantwortung. Von unserer Haftung ausgeschlossen ist namentlich die Garantie für die ständige Verfügbarkeit unserer Fachapplikation sowie Schäden (z.B. wegen Verbindungsunterbruch oder schädlicher Software), die durch die Benutzung dieser Fachapplikation entstehen könnten.", + )} +

+ +

${msg("Immaterialgüterrechte")}

+

+ ${msg( + "Sichtbare Elemente (Bilder/Icons) dieser Fachapplikation können Dritten gehören. Diese Elemente dürfen deshalb grundsätzlich nicht verwendet werden. Der Kanton Bern kann deren Verwendung ausserhalb der Webseite auf Anfrage erlauben, sofern er dazu selbst berechtigt ist. Für solche Anfragen wenden Sie sich bitte an die Stelle, die für die Fachapplikation verantwortlich ist. Die Kontaktangaben finden Sie im Impressum.", + )} +

+ +

${msg("Datenschutzerklärung")}

+

+ ${msg( + "Verantwortliche Stelle im Sinne der Datenschutzgesetze, unter anderem auch der EU-Datenschutzgrundverordnung (DSGVO), ist:", + )} +

+

+ ${withLineBreaks( + msg(`Mittelschul- und Berufsbildungsamt +Kasernenstrasse 27 +3013 Bern`), + )} +

+

${msg("E-Mail")}

+

www.be.ch/mba

+ +

${msg("Datenbearbeitung")}

+

+ ${msg( + "Der zum Betrieb dieser Fachapplikation eingesetzte Leistungserbringer des Kantons Bern bearbeitet teilweise die IP-Adresse oder technische Angaben der Endgeräte von Personen, die diese Webseite besuchen. Der Leistungserbringer untersteht einer Datenschutzgesetzgebung mit einem dem Berner Recht gleichwertigem Datenschutzniveau. Die IP-Adresse wird verschlüsselt übertragen und vor der weiteren Bearbeitung anonymisiert.", + )} +

+

+ ${msg( + "Mit der Benutzung dieser Fachapplikation stimmen Sie dieser Datenbearbeitung soweit erforderlich zu. Sie erfolgt im Einzelnen wie folgt:", + )} +

+ +
+ + + + + + + + + + + + + + + +
${msg("Leistungserbringer")}${msg("Bearbeitete Daten")}${msg("Grund der Bearbeitung")}
+ ${withLineBreaks( + msg( + `Bedag Informatik AG +Engehaldenstrasse 12 +3012 Bern`, + ), + )} + + ${msg( + "IP-Adresse, technische Angaben zum Betriebssystem und Webbrowser, Referrer-URL, Hostname, Uhrzeit", + )} + + ${msg( + "Logdaten des Webserves des Kantons Bern zum Erkennen und Beheben von technischen Störungen und Angriffen.", + )} +
+
+ +

${msg("Cookies")}

+

${msg("Diese Webseite setzt keine Cookies ein.")}

+ +

${msg("Soziale Medien")}

+

+ ${msg( + "Soweit diese Fachapplikation auf soziale Medien wie YouTube verweist, geschieht das nur durch Links, nicht etwa durch das Ausführen von Programmen (Plug-ins). Mit dem Aufrufen dieser Fachapplikation werden daher keine Personendaten an die sozialen Medien übertragen.", + )} +

+ +

${msg("Kontakt bei Fragen")}

+

+ ${msg( + "Wenn Sie Fragen zum Datenschutz im Zusammenhang mit dieser Fachapplikation haben, können Sie sich an die Stelle wenden, die für die Fachapplikation verantwortlich ist. Die Kontaktangaben finden Sie im Impressum.", + )} +

+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "bkd-legal": Legal; + } +} diff --git a/src/components/index.ts b/src/components/index.ts index ce8fb6fe..091eaaf9 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,5 +1,8 @@ export * from "./Content"; export * from "./Footer"; +export * from "./Footer/Contact"; +export * from "./Footer/Imprint"; +export * from "./Footer/Legal"; export * from "./Header"; export * from "./Header/Hamburger"; export * from "./Header/LanguageSwitcher"; diff --git a/src/settings.ts b/src/settings.ts index f9501f23..a980842f 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -14,6 +14,7 @@ export type Settings = Readonly<{ navigationPhotoList: NavigationItem; navigationInputGrades: NavigationItem; navigation: ReadonlyArray; + footer: ReadonlyArray; }>; export type App = Readonly<{ @@ -143,6 +144,13 @@ export const settings: Settings = { root: "apps/Noteneingabe/index.html", heading: false, }, + { + // Dummy app entry for the footer pages + key: "footer", + scope: "Public", + root: "", + heading: true, + }, ], navigationHome: { key: "home", @@ -152,252 +160,324 @@ export const settings: Settings = { appKey: "schulverwaltung", appPath: "#/dashboard", }, - get navigationPhotoList() { - return { - key: "photoList", - label: msg("Fotoliste"), - allowedRolesOrPermissions: ["TeacherRole"], - deniedInstanceIds: null, - appKey: "fotoliste", - appPath: "#/", - }; + navigationPhotoList: { + key: "photoList", + get label() { + return msg("Fotoliste"); + }, + allowedRolesOrPermissions: ["TeacherRole"], + deniedInstanceIds: null, + appKey: "fotoliste", + appPath: "#/", }, - get navigationInputGrades() { - return { - key: "inputGrades", - label: msg("Noteneingabe"), - allowedRolesOrPermissions: ["TeacherRole"], - deniedInstanceIds: null, - appKey: "noteneingabe", - appPath: "#/", - }; + navigationInputGrades: { + key: "inputGrades", + get label() { + return msg("Noteneingabe"); + }, + allowedRolesOrPermissions: ["TeacherRole"], + deniedInstanceIds: null, + appKey: "noteneingabe", + appPath: "#/", }, - get navigationMyProfile() { - return { - key: "myProfile", - label: msg("Mein Profil"), - allowedRolesOrPermissions: null, - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/my-profile", - }; + navigationMyProfile: { + key: "myProfile", + get label() { + return msg("Mein Profil"); + }, + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/my-profile", }, - get navigationMySettings() { - return { - key: "mySettings", - label: msg("Einstellungen"), - allowedRolesOrPermissions: null, - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/my-settings", - }; + navigationMySettings: { + key: "mySettings", + get label() { + return msg("Einstellungen"); + }, + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/my-settings", }, - get navigation(): Navigation { - return [ - { - label: msg("Unterricht"), - items: [ - { - key: "presenceControl", - label: msg("Präsenzkontrolle"), - allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/presence-control", + navigation: [ + { + get label() { + return msg("Unterricht"); + }, + items: [ + { + key: "presenceControl", + get label() { + return msg("Präsenzkontrolle"); }, - { - key: "currentEvents", - label: msg("Aktuelle Fächer"), - allowedRolesOrPermissions: [ - "TeacherRole", - "LessonTeacherRole", - "ClassTeacherRole", - ], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/events/current", + allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/presence-control", + }, + { + key: "currentEvents", + get label() { + return msg("Aktuelle Fächer"); }, - { - key: "tests", - label: msg("Tests und Bewertung"), - allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/events", + allowedRolesOrPermissions: [ + "TeacherRole", + "LessonTeacherRole", + "ClassTeacherRole", + ], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/events/current", + }, + { + key: "tests", + get label() { + return msg("Tests und Bewertung"); }, - { - key: "substitutionsAssign", - label: msg("Stellvertretung erfassen"), - allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], - deniedInstanceIds: null, - appKey: "stellvertretung", - appPath: "#/substitutions/assign", + allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/events", + }, + { + key: "substitutionsAssign", + get label() { + return msg("Stellvertretung erfassen"); }, - { - key: "substitutionsExecute", - label: msg("Stellvertretung ausüben"), - allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], - deniedInstanceIds: null, - appKey: "stellvertretung", - appPath: "#/substitutions/execute", + allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], + deniedInstanceIds: null, + appKey: "stellvertretung", + appPath: "#/substitutions/assign", + }, + { + key: "substitutionsExecute", + get label() { + return msg("Stellvertretung ausüben"); }, - ], + allowedRolesOrPermissions: ["TeacherRole", "LessonTeacherRole"], + deniedInstanceIds: null, + appKey: "stellvertretung", + appPath: "#/substitutions/execute", + }, + ], + }, + { + get label() { + return msg("Absenzen"); }, - { - label: msg("Absenzen"), - items: [ - { - key: "openAbsences", - label: msg("Offene Absenzen entschuldigen"), - allowedRolesOrPermissions: [ - "TeacherRole", - "LessonTeacherRole", - "ClassTeacherRole", - ], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/open-absences", + items: [ + { + key: "openAbsences", + get label() { + return msg("Offene Absenzen entschuldigen"); }, - { - key: "editAbsences", - label: msg("Absenzen bearbeiten"), - allowedRolesOrPermissions: [ - "TeacherRole", - "LessonTeacherRole", - "ClassTeacherRole", - "AbsenceAdministratorRole", - ], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/edit-absences", + allowedRolesOrPermissions: [ + "TeacherRole", + "LessonTeacherRole", + "ClassTeacherRole", + ], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/open-absences", + }, + { + key: "editAbsences", + get label() { + return msg("Absenzen bearbeiten"); }, - { - key: "evaluateAbsences", - label: msg("Absenzen auswerten"), - allowedRolesOrPermissions: [ - "TeacherRole", - "LessonTeacherRole", - "ClassTeacherRole", - "AbsenceAdministratorRole", - ], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/evaluate-absences", + allowedRolesOrPermissions: [ + "TeacherRole", + "LessonTeacherRole", + "ClassTeacherRole", + "AbsenceAdministratorRole", + ], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/edit-absences", + }, + { + key: "evaluateAbsences", + get label() { + return msg("Absenzen auswerten"); }, - ], + allowedRolesOrPermissions: [ + "TeacherRole", + "LessonTeacherRole", + "ClassTeacherRole", + "AbsenceAdministratorRole", + ], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/evaluate-absences", + }, + ], + }, + { + get label() { + return msg("Aus-/Weiterbildung"); }, - { - label: msg("Aus-/Weiterbildung"), - items: [ - { - key: "myAbsences", - label: msg("Absenzen"), - allowedRolesOrPermissions: ["StudentRole"], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/my-absences", + items: [ + { + key: "myAbsences", + get label() { + return msg("Absenzen"); }, - { - key: "myGrades", - label: msg("Noten"), - allowedRolesOrPermissions: ["StudentRole"], - deniedInstanceIds: null, - appKey: "schulverwaltung", - appPath: "#/my-grades", + allowedRolesOrPermissions: ["StudentRole"], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/my-absences", + }, + { + key: "myGrades", + get label() { + return msg("Noten"); }, - ], + allowedRolesOrPermissions: ["StudentRole"], + deniedInstanceIds: null, + appKey: "schulverwaltung", + appPath: "#/my-grades", + }, + ], + }, + { + get label() { + return msg("Angebote"); }, - { - label: msg("Angebote"), - items: [ - { - key: "coursesAndEvents", - label: msg("Kurse und Veranstaltungen"), - allowedRolesOrPermissions: null, - deniedInstanceIds: null, - appKey: "kursausschreibung", - appPath: "#/", + items: [ + { + key: "coursesAndEvents", + get label() { + return msg("Kurse und Veranstaltungen"); }, - { - key: "internalTraining", - label: msg("Schulinterne Weiterbildung"), - allowedRolesOrPermissions: [ - "TeacherRole", - "LessonTeacherRole", - "ClassTeacherRole", - "AbsenceAdministratorRole", - "SubstituteAdministratorRole", - "Reservations", - ], - deniedInstanceIds: null, - appKey: "kursausschreibungIntern", - appPath: "#/", + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "kursausschreibung", + appPath: "#/", + }, + { + key: "internalTraining", + get label() { + return msg("Schulinterne Weiterbildung"); }, - { - key: "reservations", - label: msg("Räume und Geräte reservieren"), - allowedRolesOrPermissions: ["Reservations"], - deniedInstanceIds: null, - appKey: "reservation", - appPath: "#/", + allowedRolesOrPermissions: [ + "TeacherRole", + "LessonTeacherRole", + "ClassTeacherRole", + "AbsenceAdministratorRole", + "SubstituteAdministratorRole", + "Reservations", + ], + deniedInstanceIds: null, + appKey: "kursausschreibungIntern", + appPath: "#/", + }, + { + key: "reservations", + get label() { + return msg("Räume und Geräte reservieren"); }, - ], + allowedRolesOrPermissions: ["Reservations"], + deniedInstanceIds: null, + appKey: "reservation", + appPath: "#/", + }, + ], + }, + { + get label() { + return msg("Administration"); }, - { - label: msg("Administration"), - items: [ - { - key: "substitutionsAdmin", - label: msg("Stellvertretungen administrieren"), - allowedRolesOrPermissions: ["SubstituteAdministratorRole"], - deniedInstanceIds: null, - appKey: "stellvertretung", - appPath: "#/substitutions/admin", + items: [ + { + key: "substitutionsAdmin", + get label() { + return msg("Stellvertretungen administrieren"); }, - { - key: "personSearch", - label: msg("Personen und Institutionen suchen"), - allowedRolesOrPermissions: ["PersonRight"], - deniedInstanceIds: null, - appKey: "schulleiterPersonen", - appPath: "#/persons", + allowedRolesOrPermissions: ["SubstituteAdministratorRole"], + deniedInstanceIds: null, + appKey: "stellvertretung", + appPath: "#/substitutions/admin", + }, + { + key: "personSearch", + get label() { + return msg("Personen und Institutionen suchen"); }, - { - key: "eventRegistration", - label: msg("Anmeldedetails einlesen"), - allowedRolesOrPermissions: [ - "PersonRight", - "RegistrationRightAusbildungSemester", - "RegistrationRightAusbildungKurs", - "RegistrationRightAusbildungModulanlass", - "RegistrationRightAusbildungModul", - "RegistrationRightAusbildungStudiengang", - "RegistrationRightAusbildungStudienjahrgang", - "RegistrationRightAusbildungVeranstaltung", - "RegistrationRightWeiterbildungCAS", - "RegistrationRightWeiterbildungCASAnlass", - "RegistrationRightWeiterbildungDAS", - "RegistrationRightWeiterbildungDASJahrgang", - "RegistrationRightWeiterbildungInteressent", - "RegistrationRightWeiterbildungKurs", - "RegistrationRightWeiterbildungMAS", - "RegistrationRightWeiterbildungMASJahrgang", - "RegistrationRightWeiterbildungModulanlass", - "RegistrationRightWeiterbildungModulbefreiung", - "RegistrationRightWeiterbildungSemester", - "RegistrationRightWeiterbildungVeranstaltung", - "RegistrationRightWeiterbildungEvaluationsanlass", - "RegistrationRightWeiterbildungFakturierung", - "RegistrationRightWeiterbildungMailingliste", - "RegistrationRightWeiterbildungPlatzangebot", - "RegistrationRightWeiterbildungReservation", - ], - deniedInstanceIds: null, - appKey: "anmeldedetailsEinlesen", - appPath: "#/input", + allowedRolesOrPermissions: ["PersonRight"], + deniedInstanceIds: null, + appKey: "schulleiterPersonen", + appPath: "#/persons", + }, + { + key: "eventRegistration", + get label() { + return msg("Anmeldedetails einlesen"); }, - ], + allowedRolesOrPermissions: [ + "PersonRight", + "RegistrationRightAusbildungSemester", + "RegistrationRightAusbildungKurs", + "RegistrationRightAusbildungModulanlass", + "RegistrationRightAusbildungModul", + "RegistrationRightAusbildungStudiengang", + "RegistrationRightAusbildungStudienjahrgang", + "RegistrationRightAusbildungVeranstaltung", + "RegistrationRightWeiterbildungCAS", + "RegistrationRightWeiterbildungCASAnlass", + "RegistrationRightWeiterbildungDAS", + "RegistrationRightWeiterbildungDASJahrgang", + "RegistrationRightWeiterbildungInteressent", + "RegistrationRightWeiterbildungKurs", + "RegistrationRightWeiterbildungMAS", + "RegistrationRightWeiterbildungMASJahrgang", + "RegistrationRightWeiterbildungModulanlass", + "RegistrationRightWeiterbildungModulbefreiung", + "RegistrationRightWeiterbildungSemester", + "RegistrationRightWeiterbildungVeranstaltung", + "RegistrationRightWeiterbildungEvaluationsanlass", + "RegistrationRightWeiterbildungFakturierung", + "RegistrationRightWeiterbildungMailingliste", + "RegistrationRightWeiterbildungPlatzangebot", + "RegistrationRightWeiterbildungReservation", + ], + deniedInstanceIds: null, + appKey: "anmeldedetailsEinlesen", + appPath: "#/input", + }, + ], + }, + ], + footer: [ + { + key: "contact", + get label() { + return msg("Kontakt"); }, - ]; - }, + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "footer", + appPath: "#/", + }, + { + key: "legal", + get label() { + return msg("Rechtliche Hinweise"); + }, + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "footer", + appPath: "#/", + }, + { + key: "imprint", + get label() { + return msg("Impressum"); + }, + allowedRolesOrPermissions: null, + deniedInstanceIds: null, + appKey: "footer", + appPath: "#/", + }, + ], }; diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts index b4075803..0280f96b 100644 --- a/src/utils/navigation.ts +++ b/src/utils/navigation.ts @@ -12,6 +12,7 @@ const ungroupedNavigationItems = [ settings.navigationMySettings, settings.navigationPhotoList, settings.navigationInputGrades, + ...settings.footer, ]; /** @@ -47,6 +48,8 @@ function findNavigationItem( navigation: Navigation, callback: (item: NavigationItem) => boolean, ): { item: NavigationItem; group: NavigationGroup | null } | null { + // Although it is not "pure", we reference the `ungroupedNavigationItems` here + // directly, because they are not filtered based on the permissions let item = ungroupedNavigationItems.find((item) => callback(item)); if (item) return { item, group: null }; diff --git a/src/utils/templates.ts b/src/utils/templates.ts new file mode 100644 index 00000000..bc55d25d --- /dev/null +++ b/src/utils/templates.ts @@ -0,0 +1,6 @@ +import { html } from "lit"; +import { join } from "lit/directives/join.js"; + +export function withLineBreaks(message: string) { + return join(message?.split("\n"), html`
`); +} diff --git a/src/utils/theme.ts b/src/utils/theme.ts index f64049c0..a535397a 100644 --- a/src/utils/theme.ts +++ b/src/utils/theme.ts @@ -33,6 +33,7 @@ export const customProperties = css` --bkd-language-switcher-active-border: rgba(234, 22, 31, 0.77); --bkd-footer-border: rgba(238, 238, 238, 1); --bkd-mobile-nav-shadow: rgba(0, 0, 0, 0.16); + --bkd-table-border: rgba(182, 182, 182, 1); /* Dropdowns */ --bkd-z-index-dropdown: 1; @@ -132,6 +133,70 @@ export const theme = css` } `; +/** + * Styles to be used in content components like + */ +export const contentStyles = css` + :host { + display: block; + max-width: 800px; + } + + h2 { + font-size: 1.875rem; + font-weight: 300; + line-height: 2.25rem; + margin: 0 0 0.75rem -0.125rem; + letter-spacing: 0.01rem; + word-spacing: 0.025rem; + } + + p { + font-size: 1rem; + line-height: 1.625rem; + margin-bottom: 0.9375rem; + margin-top: -0.125rem; + } + + a { + text-decoration: underline; + color: var(--bkd-brand-black); + } + + a:hover, + a:focus { + text-decoration: underline; + text-decoration-color: var(--bkd-brand-red); + color: var(--bkd-brand-black); + } + + /* Medium screen */ + + @media screen and (max-width: 1200px) { + h2 { + font-size: 1.5rem; + line-height: 1.8125rem; + margin: -0.1875rem 0 0.5rem -0.0625rem; + } + } + + /* Small screen */ + + @media screen and (max-width: 767px) { + h2 { + font-size: 1.3125rem; + line-height: 1.5625rem; + margin: -0.125rem 0 0.75rem 0; + } + + p, + a { + font-size: 0.9375rem; + line-height: 1.5rem; + } + } +`; + /** * Register CSS in light DOM */ diff --git a/xliff/fr-CH.xlf b/xliff/fr-CH.xlf index 0236391d..cbd7aca3 100644 --- a/xliff/fr-CH.xlf +++ b/xliff/fr-CH.xlf @@ -2,13 +2,21 @@ - - Rechtliche Hinweise - Mentions légales + + Fotoliste + Détails de l'événement - - Impressum - Impressum + + Noteneingabe + Saisie des notes + + + Mein Profil + Mon profil + + + Einstellungen + Paramètres Unterricht @@ -26,6 +34,14 @@ Tests und Bewertung Tests et évalution + + Stellvertretung erfassen + Saisir un remplacement + + + Stellvertretung ausüben + Effectuer un remplacement + Absenzen Absences @@ -42,6 +58,14 @@ Absenzen auswerten Évaluer les absences + + Aus-/Weiterbildung + Formation (continue) + + + Noten + Notes + Angebote Prestations @@ -58,10 +82,6 @@ Räume und Geräte reservieren Réserver des salles et des appareils - - Noten - Notes - Administration Administration @@ -70,41 +90,161 @@ Stellvertretungen administrieren Gérer les remplacements + + Personen und Institutionen suchen + Rechercher des personnes et des institutions + Anmeldedetails einlesen Saisir des détails d'inscription - - © Bildungs- und Kulturdirektion - © Direction de l'instruction publique et de la culture + + Kontakt + Contact + + + Rechtliche Hinweise + Mentions légales + + + Impressum + Impressum Evento Evento - - Evento Startseite - Page d'accueil Evento - - - Menü - Menu - - - Evento Startseite - Page d'accueil Evento + + Offline + Hors ligne - - Menü Benutzereinstellungen - Menu paramètres + + Keine Verbindung vorhanden. + Aucune connexion disponible. - - Mein Profil - Mon profil + + © Bildungs- und Kulturdirektion + © Direction de l'instruction publique et de la culture - - Einstellungen - Paramètres + + Lernende, Lehrpersonen und Schulmitarbeitende wenden sich bei Fehlermeldungen in Evento Web oder Fragen zu dieser Fachapplikation an die zuständige Stelle in ihrer Schule. Diese wird von der Schule kommuniziert. Im Zweifelsfall kontaktieren Sie bitte das Schulsekretariat. + En cas de message d’erreur dans Evento Web ou de questions au sujet de cette application, les élèves, les membres du corps enseignant et les collaboratrices et collaborateurs des écoles peuvent contacter le service compétent de leur établissement. L’école indique aux élèves le service concerné. En cas de doute, veuillez contacter le secrétariat de l’école. + + + Inhaltsverantwortung + Responsabilité du contenu + + + Zuständige Schule, siehe Kontakt + École compétente, voir Contact + + + Fachapplikation + Application + + + Bildungs- und Kulturdirektion des Kantons Bern +Mittelschul- und Berufsbildungsamt +Fachbereich Informatikanwendungen +Kasernenstrasse 27 +3013 Bern + Direction de l’instruction publique et de la culture du canton de Berne +Office des écoles moyennes et de la formation professionnelle +Unité Applications informatiques +Kasernenstrasse 27 +3013 Berne + + + E-Mail + Courriel + + + Betrieb und Technik + Exploitation et questions techniques + + + Haftungsausschluss + Exclusion de la responsabilité + + + Die Inhalte dieser Fachapplikation sind ein Datenangebot der zuständigen Schule. Obwohl diese die Daten regelmässig auf Richtigkeit und Aktualität hin prüft, lehnen wir, soweit gesetzlich zulässig, jede Haftung für unerwünschte Folgen aus dem Gebrauch dieser Daten ab. + Les contenus de cette application informatique sont mis à disposition par l’établissement concerné. Bien qu’ils soient régulièrement vérifiés et mis à jour, nous déclinons toute responsabilité, pour autant que la loi le permette, en cas de conséquence indésirable liée à leur utilisation. + + + Diese Fachapplikation enthält Links zu Angeboten von Dritten. Sie benutzen diese Links auf eigenes Risiko. Für die Inhalte dieser anderen Webseiten übernehmen wir keine Verantwortung. Von unserer Haftung ausgeschlossen ist namentlich die Garantie für die ständige Verfügbarkeit unserer Fachapplikation sowie Schäden (z.B. wegen Verbindungsunterbruch oder schädlicher Software), die durch die Benutzung dieser Fachapplikation entstehen könnten. + Cette application contient des liens hypertextes menant à des offres proposées par des tiers. Vous utilisez ces liens à vos propres risques. Nous ne répondons pas du contenu publié sur ces autres sites Internet. Sont notamment exclus de notre responsabilité la garantie que notre application soit disponible en permanence ainsi que les dommages liés à son utilisation (p. ex. en raison d’une interruption de la connexion ou d’un logiciel malveillant). + + + Immaterialgüterrechte + Propriété intellectuelle + + + Sichtbare Elemente (Bilder/Icons) dieser Fachapplikation können Dritten gehören. Diese Elemente dürfen deshalb grundsätzlich nicht verwendet werden. Der Kanton Bern kann deren Verwendung ausserhalb der Webseite auf Anfrage erlauben, sofern er dazu selbst berechtigt ist. Für solche Anfragen wenden Sie sich bitte an die Stelle, die für die Fachapplikation verantwortlich ist. Die Kontaktangaben finden Sie im Impressum. + Il se peut que des éléments figurant dans l’application (images, icônes) soient la propriété de tiers. Leur utilisation est donc interdite. Sur demande, le canton de Berne peut cependant autoriser l’utilisation, en dehors du site web, des éléments dont il détient les droits. Veuillez adresser vos demandes à cet effet au service responsable de l’application, dont les coordonnées figurent dans l’impressum. + + + Datenschutzerklärung + Politique de confidentialité + + + Verantwortliche Stelle im Sinne der Datenschutzgesetze, unter anderem auch der EU-Datenschutzgrundverordnung (DSGVO), ist: + Le service responsable de l’application au sens de la législation sur la protection des données, et notamment du règlement général de l’UE sur la protection des données (RGPD), est : + + + Datenbearbeitung + Traitement des données + + + Der zum Betrieb dieser Fachapplikation eingesetzte Leistungserbringer des Kantons Bern bearbeitet teilweise die IP-Adresse oder technische Angaben der Endgeräte von Personen, die diese Webseite besuchen. Der Leistungserbringer untersteht einer Datenschutzgesetzgebung mit einem dem Berner Recht gleichwertigem Datenschutzniveau. Die IP-Adresse wird verschlüsselt übertragen und vor der weiteren Bearbeitung anonymisiert. + Le fournisseur de prestations du canton de Berne qui assure l’exploitation de cette application traite l’adresse IP ou les données techniques des appareils des personnes qui l’utilisent. Le degré de protection des données prévu par la législation que ce fournisseur est tenu de respecter équivaut à celui prévu dans le droit bernois. Avant traitement, l’adresse IP est transmise de manière cryptée et anonymisée. + + + Mit der Benutzung dieser Fachapplikation stimmen Sie dieser Datenbearbeitung soweit erforderlich zu. Sie erfolgt im Einzelnen wie folgt: + En utilisant cette application, vous acceptez le traitement des données citées, dans la mesure de ce qui est nécessaire. Voici des informations détaillées relatives au traitement des données : + + + Leistungserbringer + Fournisseur de prestations + + + Bearbeitete Daten + Données traitées + + + Grund der Bearbeitung + Raison du traitement + + + IP-Adresse, technische Angaben zum Betriebssystem und Webbrowser, Referrer-URL, Hostname, Uhrzeit + Adresse IP, données techniques relatives au système d’exploitation et au navigateur web, URL référent, nom d’hôte et heure + + + Logdaten des Webserves des Kantons Bern zum Erkennen und Beheben von technischen Störungen und Angriffen. + Données du journal du serveur web du canton de Berne afin d’identifier et de traiter des problèmes techniques et des attaques. + + + Cookies + Cookies + + + Diese Webseite setzt keine Cookies ein. + La présente application n’utilise pas de cookies. + + + Soziale Medien + Réseaux sociaux + + + Soweit diese Fachapplikation auf soziale Medien wie YouTube verweist, geschieht das nur durch Links, nicht etwa durch das Ausführen von Programmen (Plug-ins). Mit dem Aufrufen dieser Fachapplikation werden daher keine Personendaten an die sozialen Medien übertragen. + La présente application renvoie uniquement vers des réseaux sociaux tels que YouTube au moyen de liens et non via l’exécution de programmes (plug-in). Ainsi, aucune donnée personnelle n’est transmise aux réseaux sociaux lorsque vous utilisez l’application. + + + Kontakt bei Fragen + Contact + + + Wenn Sie Fragen zum Datenschutz im Zusammenhang mit dieser Fachapplikation haben, können Sie sich an die Stelle wenden, die für die Fachapplikation verantwortlich ist. Die Kontaktangaben finden Sie im Impressum. + Si vous avez des questions sur la protection des données en lien avec la présente application, vous pouvez vous adresser au service responsable de l’application, dont les coordonnées figurent dans l’impressum. Video-Tutorials @@ -114,67 +254,73 @@ Logout Se déconnecter - - Fotoliste - Détails de l'événement - - - Noteneingabe - Saisie des notes - - - Schliessen - Fermer - - - Stellvertretung ausüben - Effectuer un remplacement - Mobile Navigation Navigation mobile - - Hauptnavigation - Navigation principale - Servicenavigation Navigation service - - Stellvertretung erfassen - Saisir un remplacement + + Evento Startseite + Page d'accueil Evento - - Personen und Institutionen suchen - Rechercher des personnes et des institutions + + Menü + Menu - - Aus-/Weiterbildung - Formation (continue) + + Hauptnavigation + Navigation principale + + + Schliessen + Fermer Stellvertretung beenden Terminer le remplacement + + Fehler beim Laden der Benachrichtigungen + Erreur lors du chargement des notifications + + + Keine Benachrichtigungen + Aucune notification + + + Benachrichtigung löschen + Supprimer la notification + Benachrichtigungen Notifications - - Offline - Hors ligne Alle löschen Tout effacer - - Keine Benachrichtigungen - Aucune notification - - Keine Verbindung vorhanden. - Aucune connexion disponible. + + Menü Benutzereinstellungen + Menu paramètres + + + Mittelschul- und Berufsbildungsamt +Kasernenstrasse 27 +3013 Bern + Office des écoles moyennes et de la formation professionnelle +Kasernenstrasse 27 +3013 Berne + + + Bedag Informatik AG +Engehaldenstrasse 12 +3012 Bern + Bedag Informatique SA +Engehaldenstrasse 12 +3012 Berne