Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d54f574e0 | ||
|
|
3ff88ce67f | ||
|
|
c5f145a547 | ||
|
|
7939d384bc | ||
|
|
e9ad3882d2 |
No files matched your search
@@ -2,6 +2,22 @@
|
||||
|
||||
A small html/js project to nudge a user to use the desktop client for Jitsi.
|
||||
|
||||
## Configuration
|
||||
|
||||
All settings live in `assets/config.json`, loaded at startup. The launcher stays
|
||||
up but links break if the file is missing or malformed.
|
||||
|
||||
| Parameter | Description |
|
||||
| --- | --- |
|
||||
| `jitsiLauncher` | Domain of this Jitsi launcher. Used for the meeting URLs created by the meeting creator (Nextcloud, adhoc link). |
|
||||
| `jitsiHost` | Jitsi domain. Used for the browser fallback URL, the desktop protocol URL and the UID of generated ICS files. |
|
||||
| `nextcloudBase` | Nextcloud instance for calendar event creation. The "Create in Nextcloud Calendar" button is only shown if this is set. |
|
||||
| `allowAdhocMeetings` | Whether adhoc meetings are allowed. The "Create Adhoc Link" button is only shown if this is `true`. |
|
||||
| `launchTimeout` | Timeout in ms before the browser fallback is shown after trying to start the jitsi-meet-electron client. |
|
||||
| `backgroundImage` | Path to the page background image. Empty: no background. |
|
||||
| `logo` | Path to the logo shown in the logo bar. Empty: logo bar stays hidden. |
|
||||
| `downloads` | Download URLs for the jitsi-meet clients, shown in the fallback view per detected OS: `windows`, `macos`, `linux`, `ios`, `android`. |
|
||||
|
||||
## Third-party assets
|
||||
|
||||
- `assets/lib/ua-parser.min.js` — [ua-parser-js](https://github.com/faisalman/ua-parser-js) v2.0.10, © Faisal Salman, licensed under AGPL-3.0.
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"jitsiLauncher": "meet.bnvb.eu",
|
||||
"jitsiHost": "meet.bnvb-ingenieure.de",
|
||||
"nextcloudBase": "https://cloud.bnvb-ingenieure.de",
|
||||
"allowAdhocMeetings": true,
|
||||
"launchTimeout": 2000,
|
||||
"backgroundImage": "assets/images/background.png",
|
||||
"logo": "assets/images/logo.svg",
|
||||
"downloads": {
|
||||
"windows": "https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe",
|
||||
"macos": "https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg",
|
||||
"linux": "https://github.com/jitsi/jitsi-meet-electron/releases",
|
||||
"ios": "https://apps.apple.com/app/jitsi-meet/id1165103905",
|
||||
"android": "https://play.google.com/store/apps/details?id=org.jitsi.meet"
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,9 @@
|
||||
"creator": {
|
||||
"title": "Create New Meeting",
|
||||
"meetingNameLabel": "Meeting Name",
|
||||
"meetingNamePlaceholder": "My Meeting",
|
||||
"meetingDescriptionLabel": "Description",
|
||||
"meetingDescriptionPlaceholder": "Meeting description (optional)",
|
||||
"meetingStartLabel": "Start Date & Time",
|
||||
"meetingEndLabel": "End Date & Time",
|
||||
"meetingOrganizerLabel": "Organizer Email",
|
||||
@@ -152,7 +154,9 @@
|
||||
"creator": {
|
||||
"title": "Neues Meeting erstellen",
|
||||
"meetingNameLabel": "Meeting-Name",
|
||||
"meetingNamePlaceholder": "Mein Meeting",
|
||||
"meetingDescriptionLabel": "Beschreibung",
|
||||
"meetingDescriptionPlaceholder": "Beschreibung des Meetings (optional)",
|
||||
"meetingStartLabel": "Start Datum & Uhrzeit",
|
||||
"meetingEndLabel": "Ende Datum & Uhrzeit",
|
||||
"meetingOrganizerLabel": "Organisator E-Mail",
|
||||
@@ -240,7 +244,9 @@
|
||||
"creator": {
|
||||
"title": "Créer une nouvelle réunion",
|
||||
"meetingNameLabel": "Nom de la réunion",
|
||||
"meetingNamePlaceholder": "Ma réunion",
|
||||
"meetingDescriptionLabel": "Description",
|
||||
"meetingDescriptionPlaceholder": "Description de la réunion (facultatif)",
|
||||
"meetingStartLabel": "Date et heure de début",
|
||||
"meetingEndLabel": "Date et heure de fin",
|
||||
"meetingOrganizerLabel": "Email de l'organisateur",
|
||||
@@ -328,7 +334,9 @@
|
||||
"creator": {
|
||||
"title": "创建新会议",
|
||||
"meetingNameLabel": "会议名称",
|
||||
"meetingNamePlaceholder": "我的会议",
|
||||
"meetingDescriptionLabel": "描述",
|
||||
"meetingDescriptionPlaceholder": "会议描述(可选)",
|
||||
"meetingStartLabel": "开始日期和时间",
|
||||
"meetingEndLabel": "结束日期和时间",
|
||||
"meetingOrganizerLabel": "组织者邮箱",
|
||||
|
||||
+69
-34
@@ -5,42 +5,12 @@
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
const CONFIG = {
|
||||
/*
|
||||
* Your Jitsi Launcher domain
|
||||
* Konfiguration liegt in assets/config.json und wird beim
|
||||
* Start asynchron geladen (siehe START).
|
||||
*/
|
||||
jitsiLauncher: "meet.bnvb.eu",
|
||||
/*
|
||||
* Your Jitsi domain.
|
||||
*/
|
||||
jitsiHost: "meet.bnvb-ingenieure.de",
|
||||
/*
|
||||
* Your Nextcloud instance (calendar event creation).
|
||||
*/
|
||||
nextcloudBase: "https://cloud.bnvb-ingenieure.de",
|
||||
/*
|
||||
* Timeout trying to start the jitsi-meet-electron client
|
||||
*/
|
||||
launchTimeout: 2000,
|
||||
/*
|
||||
* set wallpaper for webpage
|
||||
*/
|
||||
backgroundImage: "assets/images/background.png",
|
||||
/*
|
||||
* Set logo
|
||||
*/
|
||||
logo: "assets/images/logo.svg",
|
||||
/*
|
||||
* Download URLs for jitsi-meet clients
|
||||
*/
|
||||
downloads: {
|
||||
windows: "https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe",
|
||||
macos: "https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg",
|
||||
linux: "https://github.com/jitsi/jitsi-meet-electron/releases",
|
||||
ios: "https://apps.apple.com/app/jitsi-meet/id1165103905",
|
||||
android: "https://play.google.com/store/apps/details?id=org.jitsi.meet"
|
||||
}
|
||||
};
|
||||
let CONFIG = {};
|
||||
const CONFIG_URL = "assets/config.json";
|
||||
|
||||
/* ============================================================
|
||||
* Translations
|
||||
@@ -121,6 +91,19 @@ function applyTranslations() {
|
||||
element.textContent = value;
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* Platzhalter von Eingabefeldern übersetzen.
|
||||
*/
|
||||
document
|
||||
.querySelectorAll("[data-i18n-placeholder]")
|
||||
.forEach((element) => {
|
||||
const value = getTranslation(element.dataset.i18nPlaceholder);
|
||||
|
||||
if (value !== null) {
|
||||
element.placeholder = value;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -326,6 +309,40 @@ function applyLogo() {
|
||||
logoBar.classList.remove("hidden");
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* NEXTCLOUD BUTTON
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Nur anzeigen, wenn eine Nextcloud-Instanz konfiguriert
|
||||
* ist (CONFIG.nextcloudBase in assets/config.json).
|
||||
*/
|
||||
function applyNextcloudButton() {
|
||||
if (!CONFIG.nextcloudBase || !createNextcloudButton) {
|
||||
return;
|
||||
}
|
||||
|
||||
createNextcloudButton.classList.remove("hidden");
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* ADHOC BUTTON
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Nur anzeigen, wenn explizit aktiviert
|
||||
* (CONFIG.allowAdhocMeetings in assets/config.json).
|
||||
*/
|
||||
function applyAdhocButton() {
|
||||
if (!CONFIG.allowAdhocMeetings || !createAdhocButton) {
|
||||
return;
|
||||
}
|
||||
|
||||
createAdhocButton.classList.remove("hidden");
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* DOM elements
|
||||
* ============================================================
|
||||
@@ -1440,6 +1457,19 @@ window
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
async function loadConfig() {
|
||||
try {
|
||||
const response = await fetch(CONFIG_URL);
|
||||
CONFIG = await response.json();
|
||||
} catch (error) {
|
||||
/*
|
||||
* Ohne Datei bleiben Launcher unbrauchbar – Fehler
|
||||
* melden und mit leerer Konfiguration fortfahren.
|
||||
*/
|
||||
console.error("Error loading config:", error);
|
||||
}
|
||||
}
|
||||
|
||||
async function loadTranslations() {
|
||||
try {
|
||||
const response = await fetch(I18N_URL);
|
||||
@@ -1461,8 +1491,13 @@ async function loadTranslations() {
|
||||
*/
|
||||
async function start() {
|
||||
applyTheme();
|
||||
|
||||
await loadConfig();
|
||||
|
||||
applyBackgroundImage();
|
||||
applyLogo();
|
||||
applyNextcloudButton();
|
||||
applyAdhocButton();
|
||||
|
||||
await loadTranslations();
|
||||
|
||||
|
||||
+4
-4
@@ -262,12 +262,12 @@
|
||||
|
||||
<div class="form-group">
|
||||
<label for="meetingName" data-i18n="creator.meetingNameLabel">Meeting Name</label>
|
||||
<input type="text" id="meetingName" placeholder="My Meeting" />
|
||||
<input type="text" id="meetingName" placeholder="My Meeting" data-i18n-placeholder="creator.meetingNamePlaceholder" />
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="meetingDescription" data-i18n="creator.meetingDescriptionLabel">Description</label>
|
||||
<textarea id="meetingDescription" placeholder="Meeting description (optional)"></textarea>
|
||||
<textarea id="meetingDescription" placeholder="Meeting description (optional)" data-i18n-placeholder="creator.meetingDescriptionPlaceholder"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
@@ -289,10 +289,10 @@
|
||||
<button id="createMeetingButton" class="button primary" type="button" data-i18n="creator.createButton">
|
||||
Create Meeting
|
||||
</button>
|
||||
<button id="createNextcloudButton" class="button primary" type="button" data-i18n="creator.nextcloudButton">
|
||||
<button id="createNextcloudButton" class="button primary hidden" type="button" data-i18n="creator.nextcloudButton">
|
||||
Create in Nextcloud Calendar
|
||||
</button>
|
||||
<button id="createAdhocButton" class="button secondary" type="button" data-i18n="creator.adhocButton">
|
||||
<button id="createAdhocButton" class="button secondary hidden" type="button" data-i18n="creator.adhocButton">
|
||||
Create Adhoc Link
|
||||
</button>
|
||||
<button id="cancelCreateButton" class="button secondary" type="button" data-i18n="creator.cancelButton">
|
||||
|
||||
Reference in new issue
Block a user