|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en" class="{{ .cssClass }}">
|
|
|
|
<head>
|
|
|
|
<link rel="stylesheet" type="text/css" href="{{ .urlBase }}/css/{{ .cssVersion }}bundle.css">
|
|
|
|
<script>
|
|
|
|
window.URLBase = "{{ .urlBase }}";
|
|
|
|
window.notificationsEnabled = {{ .notifications }};
|
|
|
|
window.emailEnabled = {{ .emailEnabled }};
|
|
|
|
window.telegramEnabled = {{ .telegramEnabled }};
|
|
|
|
window.discordEnabled = {{ .discordEnabled }};
|
|
|
|
window.matrixEnabled = {{ .matrixEnabled }};
|
|
|
|
window.ombiEnabled = {{ .ombiEnabled }};
|
|
|
|
window.usernameEnabled = {{ .username }};
|
|
|
|
window.langFile = JSON.parse({{ .language }});
|
|
|
|
window.linkResetEnabled = {{ .linkResetEnabled }};
|
|
|
|
window.language = "{{ .langName }}";
|
|
|
|
window.jellyfinLogin = {{ .jellyfinLogin }};
|
|
|
|
window.jfAdminOnly = {{ .jfAdminOnly }};
|
|
|
|
window.jfAllowAll = {{ .jfAllowAll }};
|
|
|
|
</script>
|
|
|
|
<title>Admin - jfa-go</title>
|
|
|
|
{{ template "header.html" . }}
|
|
|
|
</head>
|
|
|
|
<body class="max-w-full overflow-x-hidden section">
|
|
|
|
<div id="modal-login" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-login" href="">
|
|
|
|
<span class="heading">{{ .strings.login }}</span>
|
|
|
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.username }}" id="login-user">
|
|
|
|
<input type="password" class="field input ~neutral @high mb-4" placeholder="{{ .strings.password }}" id="login-password">
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.login }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-add-user" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-add-user" href="">
|
|
|
|
<span class="heading">{{ .strings.newUser }} <span class="modal-close">×</span></span>
|
|
|
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.username }}" id="add-user-user">
|
|
|
|
<input type="email" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.emailAddress }}">
|
|
|
|
<input type="password" class="field input ~neutral @high mb-4" placeholder="{{ .strings.password }}" id="add-user-password">
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.create }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-about" class="modal">
|
|
|
|
<div class="relative mx-auto my-[10%] w-4/5 lg:w-1/3 content card">
|
|
|
|
<img src="{{ .urlBase }}/banner.svg" class="banner header" alt="jfa-go banner">
|
|
|
|
<span class="heading"><span class="modal-close">×</span></span>
|
|
|
|
<p>{{ .strings.version }} <span class="text-black dark:text-white font-mono bg-inherit">{{ .version }}</span></p>
|
|
|
|
<p>{{ .strings.commitNoun }} <span class="text-black dark:text-white font-mono bg-inherit">{{ .commit }}</span></p>
|
|
|
|
<div class="row col flex">
|
|
|
|
<a class="button ~neutral mr-2 mt-4 mb-4 lang-link" href="https://github.com/hrfee/jfa-go"><i class="ri-github-line mr-2"></i>github</a>
|
|
|
|
<a class="button ~urge mt-4 mb-4 mr-2 lang-link" href="https://wiki.jfa-go.com">wiki/docs</a>
|
|
|
|
<a class="button ~positive mt-4 mb-4 mr-2 lang-link" href="https://weblate.jfa-go.com">translation</a>
|
|
|
|
<div class="dropdown mr-2" tabindex="0">
|
|
|
|
<a href="https://github.com/sponsors/hrfee" target="_blank" class="button ~info mt-4 mb-4 dropdown-button lang-link">
|
|
|
|
<i class="ri-hand-heart-line mr-2"></i>
|
|
|
|
donate
|
|
|
|
<span class="ml-2 chev"></span>
|
|
|
|
</a>
|
|
|
|
<div class="dropdown-display">
|
|
|
|
<div class="card ~neutral @low">
|
|
|
|
<a href="https://github.com/sponsors/hrfee" target="_blank" class="button ~neutral mb-2 w-100 lang-link">GitHub</a>
|
|
|
|
<a href="https://ko-fi.com/hrfee" target="_blank" class="button ~neutral mb-2 w-100 lang-link">Ko-fi</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<a class="button ~urge mt-4 mb-4 @low discord lang-link" href="https://discord.com/invite/MrtvuQmyhP" target="_blank"><i class="ri-discord-line mr-2"></i>discord</a>
|
|
|
|
</div>
|
|
|
|
<p><a href="https://github.com/hrfee/jfa-go/blob/main/LICENSE">Available under the MIT License.</a></p>
|
|
|
|
<pre class="font-mono bg-inherit">{{ .license }}</pre>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-logs" class="modal">
|
|
|
|
<div class="relative mx-auto my-[10%] w-4/5 lg:w-2/3 content content card">
|
|
|
|
<span class="heading">{{ .strings.logs }}<span class="modal-close">×</span></span>
|
|
|
|
<pre class="monospace" id="log-area"></pre>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-modify-user" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-modify-user" href="">
|
|
|
|
<span class="heading"><span id="header-modify-user"></span> <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.modifySettingsDescription }}</p>
|
|
|
|
<div class="flex-row mb-4">
|
|
|
|
<label class="flex-row-group mr-2">
|
|
|
|
<input type="radio" name="modify-user-source" class="unfocused" id="radio-use-profile" checked>
|
|
|
|
<span class="button ~neutral @high supra full-width center">{{ .strings.profile }}</span>
|
|
|
|
</label>
|
|
|
|
<label class="flex-row-group ml-2">
|
|
|
|
<input type="radio" name="modify-user-source" class="unfocused" id="radio-use-user">
|
|
|
|
<span class="button ~neutral @low supra full-width center">{{ .strings.user }}</span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<div class="select ~neutral @low mb-4">
|
|
|
|
<select id="modify-user-profiles"></select>
|
|
|
|
</div>
|
|
|
|
<div class="select ~neutral @low mb-4 unfocused">
|
|
|
|
<select id="modify-user-users"></select>
|
|
|
|
</div>
|
|
|
|
<label class="switch mb-4">
|
|
|
|
<input type="checkbox" id="modify-user-homescreen" checked>
|
|
|
|
<span>{{ .strings.applyHomescreenLayout }}</span>
|
|
|
|
</label>
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.apply }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-delete-user" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-delete-user" href="">
|
|
|
|
<span class="heading"><span id="header-delete-user"></span> <span class="modal-close">×</span></span>
|
|
|
|
<div class="content mt-8">
|
|
|
|
<label class="switch mb-4">
|
|
|
|
<input type="checkbox" id="delete-user-notify" checked>
|
|
|
|
<span>{{ .strings.sendDeleteNotificationEmail }}</span>
|
|
|
|
</label>
|
|
|
|
<textarea id="textarea-delete-user" class="textarea full-width ~neutral @low mb-4" placeholder="{{ .strings.sendDeleteNotificationExample }}"></textarea>
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~critical @low full-width center supra submit">{{ .strings.delete }}</span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-extend-expiry" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-extend-expiry" href="">
|
|
|
|
<span class="heading"><span id="header-extend-expiry"></span> <span class="modal-close">×</span></span>
|
|
|
|
<div class="content mt-8">
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="extend-expiry-months">{{ .strings.inviteMonths }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="extend-expiry-months">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="extend-expiry-days">{{ .strings.inviteDays }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="extend-expiry-days">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="extend-expiry-hours">{{ .strings.inviteHours }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="extend-expiry-hours">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="extend-expiry-minutes">{{ .strings.inviteMinutes }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="extend-expiry-minutes">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<label class="switch mb-4">
|
|
|
|
<input type="checkbox" id="expiry-extend-enable" checked>
|
|
|
|
<span>{{ .strings.sendDeleteNotificationEmail }}</span>
|
|
|
|
</label>
|
|
|
|
<textarea id="textarea-extend-enable" class="textarea full-width ~neutral @low mb-4" placeholder="{{ .strings.sendDeleteNotificationExample }}"></textarea>
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~critical @low full-width center supra submit">{{ .strings.submit }}</span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-announce" class="modal">
|
|
|
|
<form class="relative mx-auto my-[10%] w-4/5 lg:w-2/3 content card" id="form-announce" href="">
|
|
|
|
<span class="heading"><span id="header-announce"></span> <span class="modal-close">×</span></span>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col card ~neutral @low">
|
|
|
|
<div id="announce-details">
|
|
|
|
<span class="label supra" for="editor-variables" id="label-editor-variables">{{ .strings.variables }}</span>
|
|
|
|
<div id="announce-variables">
|
|
|
|
<span class="button ~urge @low mb-2 mt-4" id="announce-variables-username" style="margin-left: 0.25rem; margin-right: 0.25rem;"><span class="font-mono bg-inherit">{username}</span></span>
|
|
|
|
</div>
|
|
|
|
<label class="label supra" for="announce-subject"> {{ .strings.subject }}</label>
|
|
|
|
<input type="text" id="announce-subject" class="input ~neutral @low mb-2 mt-4">
|
|
|
|
<label class="label supra" for="textarea-announce">{{ .strings.message }}</label>
|
|
|
|
<textarea id="textarea-announce" class="textarea full-width ~neutral @low mt-4 font-mono"></textarea>
|
|
|
|
<p class="support mt-4 mb-2">{{ .strings.markdownSupported }}</p>
|
|
|
|
</div>
|
|
|
|
<label class="label unfocused" id="announce-name"><p class="supra">{{ .strings.name }}</p>
|
|
|
|
<input type="text" class="input ~neutral @low mb-2 mt-4">
|
|
|
|
<p class="support">{{ .strings.templateEnterName }}</p>
|
|
|
|
</label>
|
|
|
|
<div class="row flex-expand">
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low center supra submit">{{ .strings.send }}</span>
|
|
|
|
</label>
|
|
|
|
<span class="button ~info @low center supra" id="save-announce">{{ .strings.saveAsTemplate }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col card ~neutral @low">
|
|
|
|
<span class="subheading supra">{{ .strings.preview }}</span>
|
|
|
|
<div class="mt-8" id="announce-preview"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-customize" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3">
|
|
|
|
<span class="heading">{{ .strings.customizeMessages }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.customizeMessagesDescription }}</p>
|
|
|
|
<div class="table-responsive">
|
|
|
|
<table class="table">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th>{{ .strings.name }}</th>
|
|
|
|
<th class="table-inline justify-center">{{ .strings.reset }}</th>
|
|
|
|
<th>{{ .strings.edit }}</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody id="customize-list"></tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-editor" class="modal">
|
|
|
|
<form class="relative mx-auto my-[10%] w-4/5 lg:w-2/3 content card" id="form-editor" href="">
|
|
|
|
<span class="heading"><span id="header-editor"></span> <span class="modal-close">×</span></span>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col card ~neutral @low">
|
|
|
|
<span class="label supra" for="editor-variables" id="label-editor-variables">{{ .strings.variables }}</span>
|
|
|
|
<div id="editor-variables" class="mt-4"></div>
|
|
|
|
<span class="label supra" for="editor-conditionals" id="label-editor-conditionals">{{ .strings.conditionals }}</span>
|
|
|
|
<div id="editor-conditionals"></div>
|
|
|
|
<label class="label supra" for="textarea-editor">{{ .strings.message }}</label>
|
|
|
|
<textarea id="textarea-editor" class="textarea full-width flex-auto ~neutral @low mt-4 font-mono"></textarea>
|
|
|
|
<p class="support mt-4 mb-2">{{ .strings.markdownSupported }}</p>
|
|
|
|
<div class="flex-row">
|
|
|
|
<label class="full-width ml-2">
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.submit }}</span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col card ~neutral @low">
|
|
|
|
<span class="subheading supra">{{ .strings.preview }}</span>
|
|
|
|
<div class="mt-8" id="editor-preview"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-restart" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3 ~critical @low">
|
|
|
|
<span class="heading">{{ .strings.settingsRestartRequired }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.settingsRestartRequiredDescription }}</p>
|
|
|
|
<div class="float-right">
|
|
|
|
<span class="button ~info @low mb-2" id="settings-apply-no-restart">{{ .strings.settingsApplyRestartLater }}</span>
|
|
|
|
<span class="button ~critical @low" id="settings-apply-restart">{{ .strings.settingsApplyRestartNow }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-refresh" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3 ~neutral @low">
|
|
|
|
<span class="heading">{{ .strings.settingsApplied }}</span>
|
|
|
|
<p class="content">{{ .strings.settingsRefreshPage }}</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-send-pwr" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3 ~neutral @low">
|
|
|
|
<span class="heading">{{ .strings.sendPWR }}</span>
|
|
|
|
<p class="content my-2" id="send-pwr-note"></p>
|
|
|
|
<span class="button ~urge @low mt-2" id="send-pwr-link">{{ .strings.copy }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-ombi-profile" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-ombi-defaults" href="">
|
|
|
|
<span class="heading">{{ .strings.ombiProfile }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.ombiUserDefaultsDescription }}</p>
|
|
|
|
<div class="select ~neutral @low mb-4">
|
|
|
|
<select></select>
|
|
|
|
</div>
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.submit }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-user-profiles" class="modal">
|
|
|
|
<div class="relative mx-auto my-[10%] w-4/5 lg:w-2/3 content card">
|
|
|
|
<span class="heading">{{ .strings.userProfiles }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.userProfilesDescription }}</p>
|
|
|
|
<div class="table-responsive">
|
|
|
|
<table class="table">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th>{{ .strings.name }}</th>
|
|
|
|
<th>{{ .strings.userProfilesIsDefault }}</th>
|
|
|
|
{{ if .ombiEnabled }}
|
|
|
|
<th>Ombi</th>
|
|
|
|
{{ end }}
|
|
|
|
<th>{{ .strings.from }}</th>
|
|
|
|
<th>{{ .strings.userProfilesLibraries }}</th>
|
|
|
|
<th><span class="button ~neutral @high" id="button-profile-create">{{ .strings.create }}</span></th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody id="table-profiles"></tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="modal-add-profile" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-add-profile" href="">
|
|
|
|
<span class="heading">{{ .strings.addProfile }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content my-4">{{ .strings.addProfileDescription }}</p>
|
|
|
|
<label>
|
|
|
|
<span class="supra">{{ .strings.addProfileNameOf }} </span>
|
|
|
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.name }}" id="add-profile-name">
|
|
|
|
<label>
|
|
|
|
<span class="supra">{{ .strings.user }}</span>
|
|
|
|
<div class="select ~neutral @low mt-4 mb-2">
|
|
|
|
<select id="add-profile-user"></select>
|
|
|
|
</div>
|
|
|
|
</label>
|
|
|
|
<label class="switch mb-4">
|
|
|
|
<input type="checkbox" id="add-profile-homescreen" checked>
|
|
|
|
<span>{{ .strings.addProfileStoreHomescreenLayout }}</span>
|
|
|
|
</label>
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.create }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="modal-update" class="modal">
|
|
|
|
<div class="relative mx-auto my-[10%] w-4/5 lg:w-2/3 content card">
|
|
|
|
<span class="heading">{{ .strings.updates }} <span class="modal-close">×</span></span>
|
|
|
|
<p class="content">
|
|
|
|
<h2 class="mt-2">
|
|
|
|
<a id="update-version"></a> (<span class="font-mono bg-inherit" id="update-commit"></span>)
|
|
|
|
</h2>
|
|
|
|
<p class="content mt-2" id="update-description"></p>
|
|
|
|
<p class="support mt-2" id="update-date"></p>
|
|
|
|
<div class="content markdown-box mt-2" id="update-changelog"></div>
|
|
|
|
</p>
|
|
|
|
<span class="button ~info @low full-width center mt-2" id="update-download">{{ .strings.download }}</span>
|
|
|
|
<span class="button ~urge @low full-width center mt-2" id="update-update">{{ .strings.update }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{{ if .telegramEnabled }}
|
|
|
|
<div id="modal-telegram" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3">
|
|
|
|
<span class="heading mb-4">{{ .strings.linkTelegram }}</span>
|
|
|
|
<p class="content mb-4">{{ .strings.sendPIN }}</p>
|
|
|
|
<h1 class="ac" id="telegram-pin"></h1>
|
|
|
|
<a class="subheading link-center" id="telegram-link" target="_blank">
|
|
|
|
<span class="shield ~info mr-2">
|
|
|
|
<span class="icon">
|
|
|
|
<i class="ri-telegram-line"></i>
|
|
|
|
</span>
|
|
|
|
</span>
|
|
|
|
@<span id="telegram-username">
|
|
|
|
</a>
|
|
|
|
<span class="button ~info @low full-width center mt-4" id="telegram-waiting">{{ .strings.success }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{{ end }}
|
|
|
|
{{ if .discordEnabled }}
|
|
|
|
<div id="modal-discord" class="modal">
|
|
|
|
<div class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3">
|
|
|
|
<span class="heading mb-4"><span id="discord-header"></span><span class="modal-close">×</span></span>
|
|
|
|
<p class="content mb-4" id="discord-description"></p>
|
|
|
|
<div class="row">
|
|
|
|
<input type="search" class="col sm field ~neutral @low input" id="discord-search" placeholder="user#1234">
|
|
|
|
</div>
|
|
|
|
<table class="table"><tbody id="discord-list"></tbody></table>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{{ end }}
|
|
|
|
<div id="modal-matrix" class="modal">
|
|
|
|
<form class="card relative mx-auto my-[10%] w-4/5 lg:w-1/3" id="form-matrix" href="">
|
|
|
|
<span class="heading">{{ .strings.linkMatrix }}</span>
|
|
|
|
<p class="content my-4">{{ .strings.linkMatrixDescription }}</p>
|
|
|
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.matrixHomeServer }}" id="matrix-homeserver">
|
|
|
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.username }}" id="matrix-user">
|
|
|
|
<input type="password" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.password }}" id="matrix-password">
|
|
|
|
<label>
|
|
|
|
<input type="submit" class="unfocused">
|
|
|
|
<span class="button ~urge @low full-width center supra submit">{{ .strings.submit }}</span>
|
|
|
|
</label>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div id="notification-box"></div>
|
|
|
|
<div class="top-4 left-4 absolute">
|
|
|
|
<span class="dropdown" tabindex="0" id="lang-dropdown">
|
|
|
|
<span class="button ~urge dropdown-button">
|
|
|
|
<i class="ri-global-line"></i>
|
|
|
|
<span class="ml-2 chev"></span>
|
|
|
|
</span>
|
|
|
|
<div class="dropdown-display">
|
|
|
|
<div class="card ~neutral @low">
|
|
|
|
<label class="switch pb-4">
|
|
|
|
<input type="radio" name="lang-time" id="lang-12h">
|
|
|
|
<span>{{ .strings.time12h }}</span>
|
|
|
|
</label>
|
|
|
|
<label class="switch pb-4">
|
|
|
|
<input type="radio" name="lang-time" id="lang-24h">
|
|
|
|
<span>{{ .strings.time24h }}</span>
|
|
|
|
</label>
|
|
|
|
<div id="lang-list"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</span>
|
|
|
|
<span class="button ~warning" alt="{{ .strings.theme }}" id="button-theme"><i class="ri-sun-line"></i></span>
|
|
|
|
</div>
|
|
|
|
<div class="page-container">
|
|
|
|
<div class="mb-4">
|
|
|
|
<header class="flex flex-wrap items-center justify-between">
|
|
|
|
<div>
|
|
|
|
<span id="button-tab-invites" class="text-3xl button portal ~neutral dark:~d_neutral @low mr-2 mb-2 px-5">{{ .strings.invites }}</span>
|
|
|
|
<span id="button-tab-accounts" class="text-3xl button portal ~neutral dark:~d_neutral @low mr-2 mb-2 px-5">{{ .strings.accounts }}</span>
|
|
|
|
<span id="button-tab-settings" class="text-3xl button portal ~neutral dark:~d_neutral @low mr-2 mb-2 px-5">{{ .strings.settings }}</span>
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
</div>
|
|
|
|
<div class="mb-4">
|
|
|
|
<div>
|
|
|
|
<span class="button ~critical @low mb-4 unfocused" id="logout-button">{{ .strings.logout }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="tab-invites">
|
|
|
|
<div class="card @low invites dark:~d_neutral mb-4">
|
|
|
|
<span class="heading">{{ .strings.invites }}</span>
|
|
|
|
<div id="invites"></div>
|
|
|
|
</div>
|
|
|
|
<div class="card @low dark:~d_neutral">
|
|
|
|
<span class="heading">{{ .strings.create }}</span>
|
|
|
|
<div class="flex flex-col md:flex-row gap-3" id="create-inv">
|
|
|
|
<div class="card ~neutral @low col">
|
|
|
|
<div class="row mb-2">
|
|
|
|
<label class="col mr-2">
|
|
|
|
<input type="radio" name="duration" class="unfocused" id="radio-inv-duration" checked>
|
|
|
|
<span class="button ~neutral @high supra full-width center">{{ .strings.inviteDuration }}</span>
|
|
|
|
</label>
|
|
|
|
<label class="col ml-2">
|
|
|
|
<input type="radio" name="duration" class="unfocused" id="radio-user-expiry">
|
|
|
|
<span class="button ~neutral @low supra full-width center">{{ .strings.userExpiry }}</span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<div id="inv-duration">
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="create-months">{{ .strings.inviteMonths }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="create-months">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="create-days">{{ .strings.inviteDays }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="create-days">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="create-hours">{{ .strings.inviteHours }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="create-hours">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="create-minutes">{{ .strings.inviteMinutes }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="create-minutes">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="user-expiry" class="unfocused">
|
|
|
|
<p class="support mb-2">{{ .strings.userExpiryDescription }}</p>
|
|
|
|
<div class="mb-2">
|
|
|
|
<label for="create-user-expiry-enabled" class="button ~neutral @low">
|
|
|
|
<input type="checkbox" id="create-user-expiry-enabled" aria-label="User duration enabled">
|
|
|
|
<span class="ml-2">{{ .strings.enabled }} </span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="user-months">{{ .strings.inviteMonths }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="user-months">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="user-days">{{ .strings.inviteDays }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="user-days">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="user-hours">{{ .strings.inviteHours }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="user-hours">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="user-minutes">{{ .strings.inviteMinutes }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="user-minutes">
|
|
|
|
<option>0</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col">
|
|
|
|
<label class="label supra" for="create-label"> {{ .strings.label }}</label>
|
|
|
|
<input type="text" id="create-label" class="input ~neutral @low mb-2 mt-4">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="card ~neutral @low col">
|
|
|
|
<label class="label supra" for="create-uses">{{ .strings.inviteNumberOfUses }}</label>
|
|
|
|
<div class="flex-expand mb-2 mt-4">
|
|
|
|
<input type="number" min="0" id="create-uses" class="input ~neutral @low mr-2" value=1>
|
|
|
|
<label for="create-inf-uses" class="button ~neutral @low" title="Set uses to infinite">
|
|
|
|
<span>∞</span>
|
|
|
|
<input type="checkbox" class="unfocused" id="create-inf-uses" aria-label="Set uses to infinite">
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<p class="support unfocused my-2" id="create-inf-uses-warning"><span class="badge ~critical">{{ .strings.warning }}</span> {{ .strings.inviteInfiniteUsesWarning }}</p>
|
|
|
|
<label class="label supra">{{ .strings.profile }}</label>
|
|
|
|
<div class="select ~neutral @low mb-2 mt-4">
|
|
|
|
<select id="create-profile">
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
<div id="create-send-to-container">
|
|
|
|
<label class="label supra">{{ .strings.inviteSendToEmail }}</label>
|
|
|
|
<div class="flex-expand mb-2 mt-4">
|
|
|
|
{{ if .discordEnabled }}
|
|
|
|
<input type="text" id="create-send-to" class="input ~neutral @low mr-2" placeholder="example@example.com | user#1234">
|
|
|
|
<span id="create-send-to-search" class="button ~neutral @low mr-2">
|
|
|
|
<i class="icon ri-search-2-line" title="{{ .strings.search }}"></i>
|
|
|
|
</span>
|
|
|
|
{{ else }}
|
|
|
|
<input type="email" id="create-send-to" class="input ~neutral @low mr-2" placeholder="example@example.com">
|
|
|
|
{{ end }}
|
|
|
|
<label for="create-send-to-enabled" class="button ~neutral @low">
|
|
|
|
<input type="checkbox" id="create-send-to-enabled" aria-label="Send to address enabled">
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span class="button ~urge @low supra full-width center lg" id="create-submit">{{ .strings.create }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="tab-accounts" class="unfocused">
|
|
|
|
<div class="card @low dark:~d_neutral accounts mb-4 overflow-visible">
|
|
|
|
<div class="flex-expand align-middle">
|
|
|
|
<span class="text-3xl font-bold mr-4">{{ .strings.accounts }}</span>
|
|
|
|
<div id="accounts-filter-dropdown" class="dropdown" tabindex="0">
|
|
|
|
<span class="h-100 button ~neutral @low center" id="accounts-filter-button">{{ .strings.filters }}</span>
|
|
|
|
<div class="dropdown-display">
|
|
|
|
<div class="card ~neutral @low mt-2" id="accounts-filter-list">
|
|
|
|
<p class="supra pb-2">{{ .strings.filters }}</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<input type="search" class="field ~neutral @low input search ml-2 mr-2" id="accounts-search" placeholder="{{ .strings.search }}">
|
|
|
|
<span class="button ~neutral @low center -ml-8" id="accounts-search-clear" aria-label="{{ .strings.clearSearch }}" text="{{ .strings.clearSearch }}"><i class="ri-close-line"></i></span>
|
|
|
|
</div>
|
|
|
|
<div class="supra py-1 sm">{{ .strings.actions }}</div>
|
|
|
|
<div class="row -mx-2">
|
|
|
|
<span class="col button ~neutral @low center max-w-[20%]" id="accounts-add-user">{{ .quantityStrings.addUser.Singular }}</span>
|
|
|
|
<div id="accounts-announce-dropdown" class="col dropdown pb-0i max-w-[20%]" tabindex="0">
|
|
|
|
<span class="w-100 button ~info @low center" id="accounts-announce">{{ .strings.announce }}</span>
|
|
|
|
<div class="dropdown-display">
|
|
|
|
<div class="card ~neutral @low">
|
|
|
|
<span class="supra sm">{{ .strings.templates }}</span>
|
|
|
|
<div id="accounts-announce-templates"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span class="col button ~urge @low center max-w-[20%]" id="accounts-modify-user">{{ .strings.modifySettings }}</span>
|
|
|
|
<span class="col button ~warning @low center max-w-[20%]" id="accounts-extend-expiry">{{ .strings.extendExpiry }}</span>
|
|
|
|
<div id="accounts-disable-enable-dropdown" class="col dropdown manual pb-0i max-w-[20%]" tabindex="0">
|
|
|
|
<span class="w-100 button ~positive @low center" id="accounts-disable-enable">{{ .strings.disable }}</span>
|
|
|
|
<div class="dropdown-display">
|
|
|
|
<div class="card ~neutral @low">
|
|
|
|
<span class="button ~urge full-width accounts-announce-template-button" id="accounts-enable-expiry">{{ .strings.setExpiry }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span class="col button ~info @low center unfocused max-w-[20%]" id="accounts-send-pwr">{{ .strings.sendPWR }}</span>
|
|
|
|
<span class="col button ~critical @low center max-w-[20%]" id="accounts-delete-user">{{ .quantityStrings.deleteUser.Singular }}</span>
|
|
|
|
</div>
|
|
|
|
<div class="supra py-1 sm hidden" id="accounts-search-options-header">{{ .strings.searchOptions }}</div>
|
|
|
|
<div class="row -mx-2">
|
|
|
|
<button type="button" class="button ~neutral @low center m-2 hidden"><span id="accounts-sort-by-field"></span> <i class="ri-close-line ml-2 text-2xl"></i></button>
|
|
|
|
<span id="accounts-filter-area"></span>
|
|
|
|
</div>
|
|
|
|
<div class="card @low accounts-header table-responsive mt-2">
|
|
|
|
<table class="table text-base leading-4">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th><input type="checkbox" value="" id="accounts-select-all"></th>
|
|
|
|
<th class="table-inline my-2 grid gap-4 place-items-stretch accounts-header-username">{{ .strings.username }}</th>
|
|
|
|
{{ if .jellyfinLogin }}
|
|
|
|
<th class="text-center-i grid gap-4 place-items-stretch accounts-header-access-jfa">{{ .strings.accessJFA }}</th>
|
|
|
|
{{ end }}
|
|
|
|
<th class="grid gap-4 place-items-stretch accounts-header-email">{{ .strings.emailAddress }}</th>
|
|
|
|
{{ if .telegramEnabled }}
|
|
|
|
<th class="text-center-i grid gap-4 place-items-stretch accounts-header-telegram">Telegram</th>
|
|
|
|
{{ end }}
|
|
|
|
{{ if .matrixEnabled }}
|
|
|
|
<th class="text-center-i grid gap-4 place-items-stretch accounts-header-matrix">Matrix</th>
|
|
|
|
{{ end }}
|
|
|
|
{{ if .discordEnabled }}
|
|
|
|
<th class="text-center-i grid gap-4 place-items-stretch accounts-header-discord">Discord</th>
|
|
|
|
{{ end }}
|
|
|
|
<th class="grid gap-4 place-items-stretch accounts-header-expiry">{{ .strings.expiry }}</th>
|
|
|
|
<th class="grid gap-4 place-items-stretch accounts-header-last-active">{{ .strings.lastActiveTime }}</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody id="accounts-list"></tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="tab-settings" class="unfocused">
|
|
|
|
<div class="card @low dark:~d_neutral settings overflow">
|
|
|
|
<div class="flex-expand">
|
|
|
|
<div class="flex-row">
|
|
|
|
<span class="heading">{{ .strings.settings }}</span>
|
|
|
|
<label for="settings-advanced-enabled" class="button ~neutral @low ml-2 my-2">
|
|
|
|
<input type="checkbox" id="settings-advanced-enabled" aria-label="Advanced settings enabled">
|
|
|
|
<span class="ml-2">{{ .strings.advancedSettings }} </span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<span class="button ~info @low my-1" id="settings-logs">{{ .strings.logs }}</span>
|
|
|
|
<span class="button ~neutral @low my-1" id="settings-restart">{{ .strings.settingsRestart }}</span>
|
|
|
|
<span class="button ~urge @low unfocused my-1" id="settings-save">{{ .strings.settingsSave }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-col md:flex-row gap-3">
|
|
|
|
<div class="card @low dark:~d_neutral col" id="settings-sidebar">
|
|
|
|
<aside class="aside sm ~urge dark:~d_info mb-2 @low" id="settings-message">Note: <span class="badge ~critical">*</span> indicates a required field, <span class="badge ~info dark:~d_warning">R</span> indicates changes require a restart.</aside>
|
|
|
|
<span class="button ~neutral @low settings-section-button justify-between mb-2" id="setting-about"><span class="flex">{{ .strings.aboutProgram }} <i class="ri-information-line ml-2"></i></span></span>
|
|
|
|
<span class="button ~neutral @low settings-section-button justify-between mb-2" id="setting-profiles"><span class="flex">{{ .strings.userProfiles }} <i class="ri-user-line ml-2"></i></span></span>
|
|
|
|
</div>
|
|
|
|
<div class="card ~neutral @low col overflow" id="settings-panel"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="{{ .urlBase }}/js/admin.js" type="module"></script>
|
|
|
|
</body>
|
|
|
|
</html>
|