mirror of
https://github.com/hargata/lubelog.git
synced 2025-12-10 00:46:08 -06:00
332 lines
24 KiB
Plaintext
332 lines
24 KiB
Plaintext
@using CarCareTracker.Helper
|
|
@{
|
|
ViewData["Title"] = "Server Settings";
|
|
}
|
|
@inject IConfigHelper config
|
|
@inject ITranslationHelper translator
|
|
@{
|
|
bool emailServerIsSetup = true;
|
|
var mailConfig = config.GetMailConfig();
|
|
var userLanguage = config.GetServerLanguage();
|
|
if (mailConfig is null || string.IsNullOrWhiteSpace(mailConfig.EmailServer))
|
|
{
|
|
emailServerIsSetup = false;
|
|
}
|
|
}
|
|
@section Scripts {
|
|
<script src="~/js/serversettings.js?v=@StaticHelper.VersionNumber"></script>
|
|
}
|
|
@section Nav {
|
|
<div class="container-fluid lubelogger-navbar-container frosted hideOnPrint">
|
|
<div class="row mt-2">
|
|
<div class="d-flex lubelogger-navbar">
|
|
<div style="cursor:pointer;" onclick="returnToGarage()" class="me-2">
|
|
<img src="@config.GetSmallLogoUrl()" class="lubelogger-logo" />
|
|
</div>
|
|
<span class="text-truncate lead">@translator.Translate(userLanguage, "Server Settings Configurator")</span>
|
|
</div>
|
|
</div>
|
|
<hr />
|
|
</div>
|
|
}
|
|
@model ServerSettingsViewModel
|
|
<div class="setup-wizard-container frosted">
|
|
<div class="setup-wizard-content" data-page="0">
|
|
<div class="d-flex text-center align-items-center justify-content-center flex-column" style="height:100%;">
|
|
<div><span class="display-5">@translator.Translate(userLanguage, "Server Settings Configurator")</span></div>
|
|
<div><span class="lead">@translator.Translate(userLanguage, "By proceeding, you acknowledge that you are solely responsible for all consequences from utilizing the Server Settings Configurator")</span></div>
|
|
<div class="mt-2"><a class="btn btn-primary" onclick="nextSetupPage()">@translator.Translate(userLanguage, "Acknowledge and Continue")</a></div>
|
|
</div>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="1" style="display:none;">
|
|
<span class="display-5">@translator.Translate(userLanguage, "Server Settings")</span>
|
|
<hr />
|
|
<form class="form-inline">
|
|
<div class="form-group">
|
|
<label for="inputPostgres">@translator.Translate(userLanguage, "Postgres Connection")</label>
|
|
<div class="input-group">
|
|
<input type="text" id="inputPostgres" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.PostgresConnection">
|
|
<div class="input-group-text">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" id="skipPostgres">
|
|
<label class="form-check-label" for="skipPostgres">@translator.Translate(userLanguage, "Skip")</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Restart Required")</small>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputLocale">@translator.Translate(userLanguage, "Locale Override")</label>
|
|
<select class="form-select" id="inputLocale" onchange="loadLocaleSample()">
|
|
@foreach(string installedLocale in Model.AvailableLocales)
|
|
{
|
|
<!option value="@installedLocale" @(Model.LocaleOverride == installedLocale ? "selected" : "")>@installedLocale</!option>
|
|
}
|
|
</select>
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Leave blank to use system locale. Restart Required")</small>
|
|
<div id="dateTimeLocaleOverride" style="@(string.IsNullOrWhiteSpace(Model.LocaleOverride) ? "display:none;" : "")">
|
|
<label for="inputDateTimeLocale">@translator.Translate(userLanguage, "Locale DateTime Override")</label>
|
|
<select class="form-select" id="inputDateTimeLocale" onchange="loadLocaleSample()">
|
|
@foreach (string installedLocale in Model.AvailableLocales)
|
|
{
|
|
<!option value="@installedLocale" @(Model.LocaleDateTimeOverride == installedLocale ? "selected" : "")>@installedLocale</!option>
|
|
}
|
|
</select>
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Leave blank to use default datetime format. Restart Required")</small>
|
|
</div>
|
|
<div id="localeSampleContainer" style="display:none;"></div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputFileExt">@translator.Translate(userLanguage, "Allowed File Extensions")</label>
|
|
<input type="text" id="inputFileExt" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.AllowedFileExtensions">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputLogoURL">@translator.Translate(userLanguage, "Logo URL")</label>
|
|
<input type="text" id="inputLogoURL" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.CustomLogoURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputSmallLogoURL">@translator.Translate(userLanguage, "Small Logo URL")</label>
|
|
<input type="text" id="inputSmallLogoURL" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.CustomSmallLogoURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputMOTD">@translator.Translate(userLanguage, "Message of the Day")</label>
|
|
<input type="text" id="inputMOTD" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.MessageOfTheDay">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputWebHook">@translator.Translate(userLanguage, "WebHook URL")</label>
|
|
<input type="text" id="inputWebHook" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.WebHookURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputDomain">@translator.Translate(userLanguage, "Server URL")</label>
|
|
<input type="text" id="inputDomain" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.Domain">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputCustomWidget">@translator.Translate(userLanguage, "Custom Widgets")</label>
|
|
<select class="form-select" id="inputCustomWidget">
|
|
<!option value="true" @(Model.CustomWidgetsEnabled ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.CustomWidgetsEnabled ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputInvariantAPI">@translator.Translate(userLanguage, "Invariant API")</label>
|
|
<select class="form-select" id="inputInvariantAPI">
|
|
<!option value="true" @(Model.InvariantAPIEnabled ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.InvariantAPIEnabled ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputCookieLifeSpan" class="form-label"><span>@($"{translator.Translate(userLanguage, "Auth Cookie Lifespan")} - ")</span><span id="inputCookieLifeSpanRangeLabel">@Model.CookieLifeSpan</span><span>@($" {translator.Translate(userLanguage, "Days")}")</span></label>
|
|
<input type="range" class="form-range" oninput="updateCookieLifeSpanRange()" min="1" max="90" id="inputCookieLifeSpan" value="@Model.CookieLifeSpan">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="2" style="display:none;">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<span class="display-5">@translator.Translate(userLanguage, "SMTP")</span>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" onchange="nextOnSkip(this)" role="switch" id="skipSMTP">
|
|
<label class="form-check-label" for="skipSMTP">@translator.Translate(userLanguage, "Skip")</label>
|
|
</div>
|
|
</div>
|
|
<hr />
|
|
<form class="form-inline">
|
|
<div class="form-group">
|
|
<label for="inputSMTPServer">@translator.Translate(userLanguage, "SMTP Server")</label>
|
|
<input type="text" id="inputSMTPServer" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.SMTPConfig.EmailServer">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputSMTPPort">@translator.Translate(userLanguage, "SMTP Server Port")</label>
|
|
<input type="text" id="inputSMTPPort" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.SMTPConfig.Port">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputSMTPFrom">@translator.Translate(userLanguage, "SMTP Sender Address")</label>
|
|
<input type="text" id="inputSMTPFrom" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.SMTPConfig.EmailFrom">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputSMTPUsername">@translator.Translate(userLanguage, "SMTP Username")</label>
|
|
<input type="text" id="inputSMTPUsername" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.SMTPConfig.Username">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputSMTPPassword">@translator.Translate(userLanguage, "SMTP Password")</label>
|
|
<div class="input-group">
|
|
<input type="password" id="inputSMTPPassword" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.SMTPConfig.Password">
|
|
<div class="input-group-text">
|
|
<button type="button" class="btn btn-sm text-secondary password-visible-button" onclick="togglePasswordVisibility(this)"><i class="bi bi-eye"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div class="d-flex align-items-center justify-content-center flex-column">
|
|
<div class="mt-2"><a class="btn btn-warning" onclick="sendTestEmail()">@translator.Translate(userLanguage, "Test SMTP Settings")</a></div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="3" style="display:none;">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<span class="display-5">@translator.Translate(userLanguage, "Server Endpoints")</span>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" onchange="nextOnSkip(this)" role="switch" id="skipHTTPS">
|
|
<label class="form-check-label" for="skipHTTPS">@translator.Translate(userLanguage, "Skip")</label>
|
|
</div>
|
|
</div>
|
|
<hr />
|
|
<form class="form-inline">
|
|
<div class="form-group">
|
|
<label for="inputHTTPURL">@translator.Translate(userLanguage, "Http Endpoint")</label>
|
|
<input type="text" id="inputHTTPURL" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.KestrelAppConfig.Endpoints.Http.Url">
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Restart Required")</small>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputHTTPSURL">@translator.Translate(userLanguage, "Https Endpoint")</label>
|
|
<input type="text" id="inputHTTPSURL" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.KestrelAppConfig.Endpoints.HttpsInlineCertFile.Url">
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Restart Required")</small>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputHTTPSCertLocation">@translator.Translate(userLanguage, "HTTPS Certificate Location")</label>
|
|
<input type="text" id="inputHTTPSCertLocation" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.KestrelAppConfig.Endpoints.HttpsInlineCertFile.Certificate.Path">
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Restart Required")</small>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputHTTPSCertPassword">@translator.Translate(userLanguage, "HTTPS Certificate Password")</label>
|
|
<input type="text" id="inputHTTPSCertPassword" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.KestrelAppConfig.Endpoints.HttpsInlineCertFile.Certificate.Password">
|
|
<small class="text-body-secondary">@translator.Translate(userLanguage, "Restart Required")</small>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="4" style="display:none;">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<span class="display-5">@translator.Translate(userLanguage, "Single Sign On")</span>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" onchange="nextOnSkip(this)" role="switch" id="skipOIDC">
|
|
<label class="form-check-label" for="skipOIDC">@translator.Translate(userLanguage, "Skip")</label>
|
|
</div>
|
|
</div>
|
|
<hr />
|
|
<form class="form-inline">
|
|
<div class="form-group">
|
|
<label for="inputOIDCProvider">@translator.Translate(userLanguage, "OIDC Provider")</label>
|
|
<input type="text" id="inputOIDCProvider" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.Name">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCClient">@translator.Translate(userLanguage, "OIDC Client ID")</label>
|
|
<input type="text" id="inputOIDCClient" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.ClientId">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCSecret">@translator.Translate(userLanguage, "OIDC Client Secret")</label>
|
|
<div class="input-group">
|
|
<input type="password" id="inputOIDCSecret" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.ClientSecret">
|
|
<div class="input-group-text">
|
|
<button type="button" class="btn btn-sm text-secondary password-visible-button" onclick="togglePasswordVisibility(this)"><i class="bi bi-eye"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCAuth">@translator.Translate(userLanguage, "OIDC Auth URL")</label>
|
|
<input type="text" id="inputOIDCAuth" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.AuthURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCToken">@translator.Translate(userLanguage, "OIDC Token URL")</label>
|
|
<input type="text" id="inputOIDCToken" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.TokenURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCUserInfo">@translator.Translate(userLanguage, "OIDC UserInfo URL")</label>
|
|
<input type="text" id="inputOIDCUserInfo" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.UserInfoURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCRedirect">@translator.Translate(userLanguage, "OIDC Redirect URL")</label>
|
|
<input type="text" id="inputOIDCRedirect" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.RedirectURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCScope">@translator.Translate(userLanguage, "OIDC Scope")</label>
|
|
<input type="text" id="inputOIDCScope" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.Scope">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCLogout">@translator.Translate(userLanguage, "OIDC Logout URL")</label>
|
|
<input type="text" id="inputOIDCLogout" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.OIDCConfig.LogOutURL">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCState">@translator.Translate(userLanguage, "OIDC Validate State")</label>
|
|
<select class="form-select" id="inputOIDCState">
|
|
<!option value="true" @(Model.OIDCConfig.ValidateState ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.OIDCConfig.ValidateState ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCPKCE">@translator.Translate(userLanguage, "OIDC Use PKCE")</label>
|
|
<select class="form-select" id="inputOIDCPKCE">
|
|
<!option value="true" @(Model.OIDCConfig.UsePKCE ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.OIDCConfig.UsePKCE ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCDisable">@translator.Translate(userLanguage, "OIDC Login Only")</label>
|
|
<select class="form-select" id="inputOIDCDisable">
|
|
<!option value="true" @(Model.OIDCConfig.DisableRegularLogin ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.OIDCConfig.DisableRegularLogin ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="5" style="display:none;">
|
|
<span class="display-5">@translator.Translate(userLanguage, "Miscellaneous")</span>
|
|
<hr />
|
|
<form class="form-inline">
|
|
@if (Model.EnableAuth)
|
|
{
|
|
<div class="form-group">
|
|
<label for="inputRegistrationMode">@translator.Translate(userLanguage, "Registration")</label>
|
|
<select class="form-select" id="inputRegistrationMode">
|
|
<!option value="0" @(!Model.OpenRegistration && !Model.DisableRegistration ? "selected" : "")>@translator.Translate(userLanguage, "Invitation Only")</!option>
|
|
<!option value="1" @(Model.DisableRegistration ? "selected" : "")>@translator.Translate(userLanguage, "Disable Registration")</!option>
|
|
<!option value="2" @(Model.OpenRegistration ? "selected" : "")>@translator.Translate(userLanguage, "Open Registration")</!option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputOIDCRootUser">@translator.Translate(userLanguage, "Enable OIDC for Root User")</label>
|
|
<select class="form-select" id="inputOIDCRootUser">
|
|
<!option value="true" @(Model.EnableRootUserOIDC ? "selected" : "")>@translator.Translate(userLanguage, "Enabled")</!option>
|
|
<!option value="false" @(Model.EnableRootUserOIDC ? "" : "selected")>@translator.Translate(userLanguage, "Disabled")</!option>
|
|
</select>
|
|
</div>
|
|
}
|
|
<div class="form-group">
|
|
<label for="inputDefaultReminderEmail">@translator.Translate(userLanguage, "Root User Email Address")</label>
|
|
<input type="text" id="inputDefaultReminderEmail" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.DefaultReminderEmail">
|
|
</div>
|
|
<hr />
|
|
<div class="mb-2">
|
|
<span class="display-6">@translator.Translate(userLanguage, "Reminder Urgency Thresholds")</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputUrgentDays">@translator.Translate(userLanguage, "Urgent(Days)")</label>
|
|
<input type="number" inputmode="numeric" id="inputUrgentDays" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.ReminderUrgencyConfig.UrgentDays">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputVeryUrgentDays">@translator.Translate(userLanguage, "Very Urgent(Days)")</label>
|
|
<input type="number" inputmode="numeric" id="inputVeryUrgentDays" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.ReminderUrgencyConfig.VeryUrgentDays">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputUrgentDistance">@translator.Translate(userLanguage, "Urgent(Distance)")</label>
|
|
<input type="number" inputmode="numeric" id="inputUrgentDistance" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.ReminderUrgencyConfig.UrgentDistance">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="inputVeryUrgentDistance">@translator.Translate(userLanguage, "Very Urgent(Distance)")</label>
|
|
<input type="number" inputmode="numeric" id="inputVeryUrgentDistance" class="form-control" placeholder="@translator.Translate(userLanguage, "Not Configured")" value="@Model.ReminderUrgencyConfig.VeryUrgentDistance">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="setup-wizard-content" data-page="6" style="display:none;">
|
|
<div class="d-flex text-center align-items-center justify-content-center flex-column" style="height:100%;">
|
|
<div><span class="display-5">@translator.Translate(userLanguage, "Server Settings Saved")<span class="text-success"><i class="bi bi-check-lg"></i></span></span></div>
|
|
<div class="mt-2"><a class="btn btn-secondary me-2" onclick="loadSetupPage(0)">@translator.Translate(userLanguage, "Restart Wizard")</a><a class="btn btn-primary" onclick="returnToGarage()">@translator.Translate(userLanguage, "Return to Garage")</a></div>
|
|
</div>
|
|
</div>
|
|
<div class="setup-wizard-nav" style="display:none;">
|
|
<div class="d-flex align-items-center justify-content-between pe-2" style="height:100%;">
|
|
<a class="btn btn-prev btn-link" onclick="previousSetupPage()">@translator.Translate(userLanguage, "Back")</a>
|
|
<a class="btn btn-next btn-primary" onclick="nextSetupPage()">@translator.Translate(userLanguage, "Next")</a>
|
|
<a class="btn btn-save btn-success" onclick="saveSetup()">@translator.Translate(userLanguage, "Save")</a>
|
|
</div>
|
|
</div>
|
|
</div> |