@ -16,164 +16,152 @@
< body class = "max-w-full overflow-x-hidden section" >
< div id = "modal-login" class = "modal" >
< form class = "modal-content card" id = "form-login" href = "" >
< span class = "heading" > Login < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " username" id = "login-user" >
< input type = "password" class = "field input ~neutral !high mb-1" placeholder = " password" id = "login-password" >
< span class = "heading" > {{ .strings.login }} < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " {{ .strings. username }} " id = "login-user" >
< input type = "password" class = "field input ~neutral !high mb-1" placeholder = " {{ .strings. password }} " id = "login-password" >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~urge !normal full-width center supra submit" > Login < / span >
< span class = "button ~urge !normal full-width center supra submit" > {{ .strings.login }} < / span >
< / label >
< / form >
< / div >
< div id = "modal-add-user" class = "modal" >
< form class = "modal-content card" id = "form-add-user" href = "" >
< span class = "heading" > New User < span class = "modal-close" > × < / span > < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " username" id = "add-user-user" >
< input type = "email" class = "field input ~neutral !high mt-half mb-1" placeholder = " email address ">
< input type = "password" class = "field input ~neutral !high mb-1" placeholder = " password" id = "add-user-password" >
< span class = "heading" > {{ .strings.newUser }} < span class = "modal-close" > × < / span > < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " {{ .strings. username }} " id = "add-user-user" >
< input type = "email" class = "field input ~neutral !high mt-half mb-1" placeholder = " {{ .strings.emailAddress }} ">
< input type = "password" class = "field input ~neutral !high mb-1" placeholder = " {{ .strings. password }} " id = "add-user-password" >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~urge !normal full-width center supra submit" > Create < / span >
< span class = "button ~urge !normal full-width center supra submit" > {{ .strings.create }} < / span >
< / label >
< / form >
< / div >
< div id = "modal-about" class = "modal" >
< div class = "modal-content content card" >
< span class = "heading" > About < span class = "modal-close" > × < / span > < / span >
< span class = "heading" > {{ .strings.aboutProgram }} < span class = "modal-close" > × < / span > < / span >
< img src = "/banner.svg" class = "mt-1" alt = "jfa-go banner" >
< p > < i class = "icon ri-github-fill" > < / i > < a href = "https://github.com/hrfee/jfa-go" > jfa-go< / a > < / p >
< p > Version < span class = "code monospace" > {{ .version }}< / span > < / p >
< p > Commit < span class = "code monospace" > {{ .commit }}< / span > < / p >
< p > {{ .strings.version }} < span class = "code monospace" > {{ .version }}< / span > < / p >
< p > {{ .strings.commitNoun }} < span class = "code monospace" > {{ .commit }}< / span > < / p >
< p > < a href = "https://github.com/hrfee/jfa-go/blob/main/LICENSE" > Available under the MIT License.< / a > < / p >
< / div >
< / div >
< div id = "modal-modify-user" class = "modal" >
< form class = "modal-content card" id = "form-modify-user" href = "" >
< span class = "heading" > Modify Settings for < span id = "header-modify-user" > < / span > < span class = "modal-close" > × < / span > < / span >
< p class = "content" > Apply settings from an existing profile, or source them directly from a user. < / p >
< span class = "heading" > < span id = "header-modify-user" > < / span > < span class = "modal-close" > × < / span > < / span >
< p class = "content" > {{ .strings.modifySettingsDescription }} < / p >
< div class = "flex-row mb-1" >
< label class = "flex-row-group mr-1" >
< input type = "radio" name = "modify-user-source" class = "unfocused" id = "radio-use-profile" checked >
< span class = "button ~neutral !high supra full-width center" > Profile < / span >
< span class = "button ~neutral !high supra full-width center" > {{ .strings.profile }} < / span >
< / label >
< label class = "flex-row-group ml-1" >
< input type = "radio" name = "modify-user-source" class = "unfocused" id = "radio-use-user" >
< span class = "button ~neutral !normal supra full-width center" > User < / span >
< span class = "button ~neutral !normal supra full-width center" > {{ .strings.user }} < / span >
< / label >
< / div >
< div class = "select ~neutral !normal mb-1" >
< select id = "modify-user-profiles" >
< option > Friends< / option >
< option > Family< / option >
< option > Default< / option >
< / select >
< select id = "modify-user-profiles" > < / select >
< / div >
< div class = "select ~neutral !normal mb-1 unfocused" >
< select id = "modify-user-users" >
< option > Person< / option >
< option > Other person< / option >
< / select >
< select id = "modify-user-users" > < / select >
< / div >
< label class = "switch mb-1" >
< input type = "checkbox" id = "modify-user-homescreen" checked >
< span > Apply homescreen layout < / span >
< span > {{ .strings.applyHomescreenLayout }} < / span >
< / label >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~urge !normal full-width center supra submit" > Apply < / span >
< span class = "button ~urge !normal full-width center supra submit" > {{ .strings.apply }} < / span >
< / label >
< / form >
< / div >
< div id = "modal-delete-user" class = "modal" >
< form class = "modal-content card" id = "form-delete-user" href = "" >
< span class = "heading" > Delete < span id = "header-delete-user" > < / span > < span class = "modal-close" > × < / span > < / span >
< span class = "heading" > < span id = "header-delete-user" > < / span > < span class = "modal-close" > × < / span > < / span >
< div class = "content mt-half" >
< label class = "switch mb-1" >
< input type = "checkbox" id = "delete-user-notify" checked >
< span > Send notification email < / span >
< span > {{ .strings.sendDeleteNotificationEmail }} < / span >
< / label >
< textarea id = "textarea-delete-user" class = "textarea full-width ~neutral !normal mb-1" placeholder = " Your account has been deleted. "> < / textarea >
< textarea id = "textarea-delete-user" class = "textarea full-width ~neutral !normal mb-1" placeholder = " {{ .strings.sendDeleteNotificationExample }} "> < / textarea >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~critical !normal full-width center supra submit" > Delete < / span >
< span class = "button ~critical !normal full-width center supra submit" > {{ .strings.delete }} < / span >
< / label >
< / div >
< / form >
< / div >
< div id = "modal-restart" class = "modal" >
< div class = "modal-content card ~critical !low" >
< span class = "heading" > Restart needed < span class = "modal-close" > × < / span > < / span >
< p class = "content pb-1" > A restart is needed to apply some settings you changed. Do it now or later? < / p >
< span class = "heading" > {{ .strings.settingsRestartRequired }} < span class = "modal-close" > × < / span > < / span >
< p class = "content pb-1" > {{ .strings.settingsRestartRequiredDescription }} < / p >
< div class = "fr" >
< span class = "button ~info !normal" id = "settings-apply-no-restart" > Apply, restart later < / span >
< span class = "button ~critical !normal" id = "settings-apply-restart" > Apply & restart < / span >
< span class = "button ~info !normal" id = "settings-apply-no-restart" > {{ .strings.settingsApplyRestartLater }} < / span >
< span class = "button ~critical !normal" id = "settings-apply-restart" > {{ .strings.settingsApplyRestartNow }} < / span >
< / div >
< / div >
< / div >
< div id = "modal-refresh" class = "modal" >
< div class = "modal-content card ~neutral !normal" >
< span class = "heading" > Settings applied. < / span >
< p class = "content" > Refresh the page in a few seconds. < / p >
< span class = "heading" > {{ .strings.settingsApplied }} < / span >
< p class = "content" > {{ .strings.settingsRefreshPage }} < / p >
< / div >
< / div >
< div id = "modal-ombi-defaults" class = "modal" >
< form class = "modal-content card" id = "form-ombi-defaults" href = "" >
< span class = "heading" > Ombi user defaults < span class = "modal-close" > × < / span > < / span >
< p class = "content" > Create an Ombi user and configure it, then select it here. It's settings/permissions will be stored and applied to new ombi users created by jfa-go. < / p >
< span class = "heading" > {{ .strings.ombiUserDefaults }} < span class = "modal-close" > × < / span > < / span >
< p class = "content" > {{ .strings.ombiUserDefaultsDescription }} < / p >
< div class = "select ~neutral !normal mb-1" >
< select >
< option > Person< / option >
< option > Other person< / option >
< / select >
< select > < / select >
< / div >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~urge !normal full-width center supra submit" > Submit < / span >
< span class = "button ~urge !normal full-width center supra submit" > {{ .strings.submit }} < / span >
< / label >
< / form >
< / div >
< div id = "modal-user-profiles" class = "modal" >
< div class = "modal-content wide card" >
< span class = "heading" > User profiles < span class = "modal-close" > × < / span > < / span >
< p class = "support lg" > Profiles are applied to users when they create an account. A profile includes library access rights and homescreen layout. < / p >
< span class = "heading" > {{ .strings.userProfiles }} < span class = "modal-close" > × < / span > < / span >
< p class = "support lg" > {{ .strings.userProfilesDescription }} < / p >
< div class = "table-responsive" >
< table class = "table" >
< thead >
< tr >
< th > Name < / th >
< th > Default< / th >
< th > From < / th >
< th > Libraries< / th >
< th > < span class = "button ~neutral !high" id = "button-profile-create" > Create < / span > < / th >
< th > {{ .strings.name }} < / th >
< th > {{ .strings.userProfilesIs Default }} < / th >
< th > {{ .strings.from }} < / th >
< th > {{ .strings.userProfiles Libraries }} < / th >
< th > < span class = "button ~neutral !high" id = "button-profile-create" > {{ .strings.create }} < / span > < / th >
< / tr >
< / thead >
< tbody id = "table-profiles" >
< / tbody >
< tbody id = "table-profiles" > < / tbody >
< / table >
< / div >
< / div >
< / div >
< div id = "modal-add-profile" class = "modal" >
< form class = "modal-content card" id = "form-add-profile" href = "" >
< span class = "heading" > Add profile < span class = "modal-close" > × < / span > < / span >
< p class = "content" > Create a Jellyfin user and configure it. Select it here, and when this profile is applied to an invite, new users will be created with its settings. < / p >
< span class = "heading" > {{ .strings.addProfile }} < span class = "modal-close" > × < / span > < / span >
< p class = "content" > {{ .strings.addProfileDescription }} < / p >
< label >
< span class = "supra" > Profile Name < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " Name " id = "add-profile-name" >
< span class = "supra" > {{ .strings.add ProfileNameOf }} < / span >
< input type = "text" class = "field input ~neutral !high mt-half mb-1" placeholder = " {{ .strings.name }} " id = "add-profile-name" >
< label >
< span class = "supra" > User < / span >
< span class = "supra" > {{ .strings.user }} < / span >
< div class = "select ~neutral !normal mt-half mb-1" >
< select id = "add-profile-user" >
< / select >
< select id = "add-profile-user" > < / select >
< / div >
< / label >
< label class = "switch mb-1" >
< input type = "checkbox" id = "add-profile-homescreen" checked >
< span > Store homescreen layout < / span >
< span > {{ .strings.addProfileStoreHomescreenLayout }} < / span >
< / label >
< label >
< input type = "submit" class = "unfocused" >
< span class = "button ~urge !normal full-width center supra submit" > Create < / span >
< span class = "button ~urge !normal full-width center supra submit" > {{ .strings.create }} < / span >
< / label >
< / form >
< / div >
@ -182,40 +170,40 @@
< div class = "mb-1" >
< header class = "flex flex-wrap items-center justify-between" >
< div class = "text-neutral-700" >
< span id = "button-tab-invites" class = "tab-button portal" > Invites < / span >
< span id = "button-tab-accounts" class = "tab-button portal" > Accounts < / span >
< span id = "button-tab-settings" class = "tab-button portal" > Settings < / span >
< span id = "button-tab-invites" class = "tab-button portal" > {{ .strings.invites }} < / span >
< span id = "button-tab-accounts" class = "tab-button portal" > {{ .strings.accounts }} < / span >
< span id = "button-tab-settings" class = "tab-button portal" > {{ .strings.settings }} < / span >
< / div >
< / header >
< / div >
< div class = "mb-1" >
< div class = "text-neutral-700" >
< span class = "button ~critical !normal mb-1 unfocused" id = "logout-button" > Logout < / span >
< span id = "button-theme" class = "button ~neutral !normal mb-1" > Theme < / span >
< span class = "button ~critical !normal mb-1 unfocused" id = "logout-button" > {{ .strings.logout }} < / span >
< span id = "button-theme" class = "button ~neutral !normal mb-1" > {{ .strings.theme }} < / span >
< / div >
< / div >
< div id = "tab-invites" >
< div class = "card ~neutral !low invites mb-1" >
< span class = "heading" > Invites < / span >
< span class = "heading" > {{ .strings.invites }} < / span >
< div id = "invites" > < / div >
< / div >
< div class = "card ~neutral !low" >
< span class = "heading" > Create < / span >
< span class = "heading" > {{ .strings.create }} < / span >
< div class = "row" id = "create-inv" >
< div class = "card ~neutral !normal col" >
< label class = "label supra" for = "create-days" > Days< / label >
< label class = "label supra" for = "create-days" > {{ .strings.invite Days }} < / label >
< div class = "select ~neutral !normal mb-1 mt-half" >
< select id = "create-days" >
< option > 0< / option >
< / select >
< / div >
< label class = "label supra" for = "create-hours" > Hours< / label >
< label class = "label supra" for = "create-hours" > {{ .strings.invite Hours }} < / label >
< div class = "select ~neutral !normal mb-1 mt-half" >
< select id = "create-hours" >
< option > 0< / option >
< / select >
< / div >
< label class = "label supra" for = "create-minutes" > Minutes< / label >
< label class = "label supra" for = "create-minutes" > {{ .strings.invite Minutes }} < / label >
< div class = "select ~neutral !normal mb-1 mt-half" >
< select id = "create-minutes" >
< option > 0< / option >
@ -223,7 +211,7 @@
< / div >
< / div >
< div class = "card ~neutral !normal col" >
< label class = "label supra" for = "create-uses" > Number of uses < / label >
< label class = "label supra" for = "create-uses" > {{ .strings.inviteNumberOfUses }} < / label >
< div class = "flex-expand mb-1 mt-half" >
< input type = "number" min = "0" id = "create-uses" class = "input ~neutral !normal mr-1" value = 1 >
< label for = "create-inf-uses" class = "button ~neutral !normal" >
@ -231,14 +219,14 @@
< input type = "checkbox" class = "unfocused" id = "create-inf-uses" aria-label = "Set uses to infinite" >
< / label >
< / div >
< p class = "support unfocused" id = "create-inf-uses-warning" > < span class = "badge ~critical" > Warning< / span > invites with infinite uses can be used abusively. < / p >
< label class = "label supra" > Profile < / label >
< p class = "support unfocused" 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 !normal mb-1 mt-half" >
< select id = "create-profile" >
< / select >
< / div >
< div id = "create-send-to-container" >
< label class = "label supra" > Send to < / label >
< label class = "label supra" > {{ .strings.inviteSendToEmail }} < / label >
< div class = "flex-expand mb-1 mt-half" >
< input type = "email" id = "create-send-to" class = "input ~neutral !normal mr-1" placeholder = "example@example.com" >
< label for = "create-send-to-enabled" class = "button ~neutral !normal" >
@ -246,27 +234,27 @@
< / label >
< / div >
< / div >
< span class = "button ~urge !normal supra full-width center lg" id = "create-submit" > Create < / span >
< span class = "button ~urge !normal supra full-width center lg" id = "create-submit" > {{ .strings.create }} < / span >
< / div >
< / div >
< / div >
< / div >
< div id = "tab-accounts" class = "unfocused" >
< div class = "card ~neutral !low accounts mb-1" >
< span class = "heading" > Accounts < / span >
< span class = "heading" > {{ .strings.accounts }} < / span >
< div class = "fr" >
< span class = "button ~neutral !normal" id = "accounts-add-user" > Add User < / span >
< span class = "button ~urge !normal" id = "accounts-modify-user" > Modify Settings < / span >
< span class = "button ~critical !normal" id = "accounts-delete-user" > Delete User < / span >
< span class = "button ~neutral !normal" id = "accounts-add-user" > {{ .quantityStrings.addUser.singular }} < / span >
< span class = "button ~urge !normal" id = "accounts-modify-user" > {{ .strings.modifySettings }} < / span >
< span class = "button ~critical !normal" id = "accounts-delete-user" > {{ .quantityStrings.deleteUser.singular }} < / span >
< / div >
< div class = "card ~neutral !normal accounts-header table-responsive mt-half" >
< table class = "table" >
< thead >
< tr >
< th > < input type = "checkbox" value = "" id = "accounts-select-all" > < / th >
< th > Username < / th >
< th > Email Address < / th >
< th > Last Active < / th >
< th > {{ .strings.username }} < / th >
< th > {{ .strings.emailAddress }} < / th >
< th > {{ .strings.lastActiveTime }} < / th >
< / tr >
< / thead >
< tbody id = "accounts-list" > < / tbody >
@ -276,15 +264,15 @@
< / div >
< div id = "tab-settings" class = "unfocused" >
< div class = "card ~neutral !low settings overflow" >
< span class = "heading" > Settings < / span >
< span class = "heading" > {{ .string.settings }} < / span >
< div class = "fr" >
< span class = "button ~neutral !normal unfocused" id = "settings-save" > Save< / span >
< span class = "button ~neutral !normal unfocused" id = "settings-save" > {{ .strings.settings Save }} < / span >
< / div >
< div class = "row" >
< div class = "card ~neutral !normal col" id = "settings-sidebar" >
< aside class = "aside sm ~info mb-half" > Note: < span class = "badge ~critical" > *< / span > indicates a required field, < span class = "badge ~info" > R< / span > indicates changes require a restart.< / aside >
< span class = "button ~neutral !low settings-section-button mb-half" id = "setting-about" > < span class = "flex" > About < i class = "ri-information-line ml-half" > < / i > < / span > < / span >
< span class = "button ~neutral !low settings-section-button mb-half" id = "setting-profiles" > < span class = "flex" > User profiles < i class = "ri-user-line ml-half" > < / i > < / span > < / span >
< aside class = "aside sm ~info mb-half" id = "settings-message" > Note: < span class = "badge ~critical" > *< / span > indicates a required field, < span class = "badge ~info" > R< / span > indicates changes require a restart.< / aside >
< span class = "button ~neutral !low settings-section-button mb-half" id = "setting-about" > < span class = "flex" > {{ .strings.aboutProgram }} < i class = "ri-information-line ml-half" > < / i > < / span > < / span >
< span class = "button ~neutral !low settings-section-button mb-half" id = "setting-profiles" > < span class = "flex" > {{ .strings.userProfiles }} < i class = "ri-user-line ml-half" > < / i > < / span > < / span >
< / div >
< div class = "card ~neutral !normal col overflow" id = "settings-panel" > < / div >
< / div >