Files
cloudron-box/dashboard/public/views/settings.html

353 lines
18 KiB
HTML
Raw Normal View History

<!-- Modal update -->
<div class="modal fade" id="updateModal" tabindex="-1" role="dialog">
2020-11-11 21:10:43 +01:00
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">{{ 'settings.updateDialog.title' | tr }} <b>{{config.update.box.version}}</b> </h4>
</div>
<div class="modal-body">
<div ng-hide="installedApps | canUpdate">
2020-11-11 21:10:43 +01:00
<p>{{ 'settings.updateDialog.blockingApps' | tr }}</p>
<ul>
2022-01-16 18:29:32 -08:00
<li ng-repeat="app in installedApps | inProgressApps">{{app.fqdn}}</li>
2020-11-11 21:10:43 +01:00
</ul>
<span>{{ 'settings.updateDialog.blockingAppsInfo' | tr }}</span>
<br/>
<br/>
</div>
2019-05-12 13:08:40 -07:00
<div ng-show="installedApps | canUpdate">
2020-11-11 21:10:43 +01:00
<p class="text-danger" ng-show="config.update.box.unstable">{{ 'settings.updateDialog.unstableWarning' | tr }}</p>
<p>{{ 'settings.updateDialog.changes' | tr }}:</p>
<ul>
<li ng-repeat="change in config.update.box.changelog" ng-bind-html="change | markdown2html"></li>
</ul>
<br/>
<p ng-show="update.error.generic" class="text-danger">{{ update.error.generic }}</p>
</div>
2020-11-11 21:10:43 +01:00
</div>
<div class="modal-footer">
<label ng-show="installedApps | canUpdate" class="checkbox-inline pull-left">
2020-11-11 21:10:43 +01:00
<input type="checkbox" ng-model="update.skipBackup">{{ 'settings.updateDialog.skipBackupCheckbox' | tr }}
</label>
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'main.dialog.cancel' | tr }}</button>
<button type="button" class="btn" ng-show="installedApps | canUpdate" ng-class="config.update.box.unstable ? 'btn-danger' : 'btn-success'" ng-click="update.startUpdate()" ng-disabled="update.busy"><i class="fa fa-circle-notch fa-spin" ng-show="update.busy"></i> {{ 'settings.updateDialog.updateAction' | tr }}</button>
2020-11-11 21:10:43 +01:00
</div>
</div>
2020-11-11 21:10:43 +01:00
</div>
</div>
<!-- modal update schedule config -->
<div class="modal fade" id="updateScheduleModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
2020-11-11 21:10:43 +01:00
<h4 class="modal-title">{{ 'settings.updateScheduleDialog.title' | tr }}</h4>
</div>
<div class="modal-body">
<form name="updateScheduleForm" role="form" novalidate ng-submit="updateSchedule.submit()" autocomplete="off">
<fieldset>
<p class="has-error text-center" ng-show="updateSchedule.error">{{ updateSchedule.error.generic }}</p>
<div class="form-group">
2020-11-11 21:10:43 +01:00
<p ng-bind-html=" 'settings.updateScheduleDialog.description' | tr "></p>
2020-07-29 20:14:30 -07:00
<div class="radio">
<label>
2020-11-11 21:10:43 +01:00
<input type="radio" ng-model="updateSchedule.type" value="never"> {{ 'settings.updateScheduleDialog.disableCheckbox' | tr }}
2020-07-29 20:14:30 -07:00
</label>
</div>
<div class="radio">
<label>
2020-11-11 21:10:43 +01:00
<input type="radio" ng-model="updateSchedule.type" value="pattern"> {{ 'settings.updateScheduleDialog.enableCheckbox' | tr }}
<span class="label label-danger" ng-show="updateSchedule.type === 'pattern' && !updateSchedule.isScheduleValid()">{{ 'settings.updateScheduleDialog.selectOne' | tr }}</span>
2020-07-29 20:14:30 -07:00
</label>
</div>
<div>
<div style="margin-left: 20px;">
<div class="col-md-5">
2020-11-11 21:10:43 +01:00
{{ 'settings.updateScheduleDialog.days' | tr }}: <multiselect class="input-sm stretch" ng-model="updateSchedule.days" ng-disabled="updateSchedule.type !== 'pattern'" options="a.name for a in cronDays" data-multiple="true"></multiselect>
2020-07-29 20:14:30 -07:00
</div>
2020-07-29 20:14:30 -07:00
<div class="col-md-5">
2020-11-11 21:10:43 +01:00
{{ 'settings.updateScheduleDialog.hours' | tr }}: <multiselect class="input-sm stretch" ng-model="updateSchedule.hours" ng-disabled="updateSchedule.type !== 'pattern'" options="a.name for a in cronHours" data-multiple="true"></multiselect>
2020-07-29 20:14:30 -07:00
</div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
<div class="modal-footer ">
2020-11-11 21:10:43 +01:00
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'main.dialog.cancel' | tr }}</button>
<button type="submit" class="btn btn-outline btn-success pull-right" ng-click="updateSchedule.submit()" ng-disabled="updateSchedule.$invalid || updateSchedule.busy"><i class="fa fa-circle-notch fa-spin" ng-show="updateSchedule.busy"></i><span> {{ 'main.dialog.save' | tr }}</span></button>
</div>
</div>
</div>
</div>
2019-10-22 22:31:38 -07:00
<!-- Modal registry config -->
<div class="modal fade" id="registryConfigModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
2020-11-11 21:10:43 +01:00
<h4 class="modal-title">{{ 'settings.privateDockerRegistryDialog.title' | tr }}</h4>
2019-10-22 22:31:38 -07:00
</div>
<div class="modal-body">
<p class="has-error text-center" ng-show="registryConfig.error">{{ registryConfig.error }}</p>
<div class="form-group">
<label class="control-label" for="registryConfigProvider">{{ 'settings.registryConfig.provider' | tr }} <sup><a ng-href="https://docs.cloudron.io/settings/#private-docker-registry" class="help" target="_blank"><i class="fa fa-question-circle"></i></a></sup></label>
<select class="form-control" id="registryConfigProvider" ng-model="registryConfig.provider" ng-options="a.value as a.name for a in registryConfigProviders"></select>
</div>
<div uib-collapse="registryConfig.provider === 'noop'">
2019-10-22 22:31:38 -07:00
<form name="registryConfigForm" role="form" novalidate ng-submit="registryConfig.submit()" autocomplete="off">
<fieldset>
<div class="form-group">
2020-11-11 21:10:43 +01:00
<label class="control-label" for="registryConfigServerAddress">{{ 'settings.privateDockerRegistry.server' | tr }}</label>
<input type="text" class="form-control" ng-model="registryConfig.serverAddress" id="registryConfigServerAddress" name="serveraddress" ng-disabled="registryConfig.busy" placeholder="docker.io" ng-required>
2019-10-22 22:31:38 -07:00
</div>
<div class="form-group">
2020-11-11 21:10:43 +01:00
<label class="control-label" for="registryConfigUsername">{{ 'settings.privateDockerRegistry.username' | tr }}</label>
<input type="text" class="form-control" ng-model="registryConfig.username" id="registryConfigUsername" name="registryUsername" ng-disabled="registryConfig.busy" ng-required>
2019-10-23 06:11:27 -07:00
</div>
2019-10-22 22:31:38 -07:00
2019-10-23 06:11:27 -07:00
<div class="form-group">
2020-11-11 21:10:43 +01:00
<label class="control-label" for="registryConfigEmail">{{ 'settings.privateDockerRegistryDialog.email' | tr }}</label>
<input type="text" class="form-control" ng-model="registryConfig.email" id="registryConfigEmail" name="registryEmail" ng-disabled="registryConfig.busy">
2019-10-23 06:11:27 -07:00
</div>
<div class="form-group">
2020-11-11 21:10:43 +01:00
<label class="control-label" for="registryConfigPassword">{{ 'settings.privateDockerRegistryDialog.passwordToken' | tr }}</label>
<input type="password" class="form-control" ng-model="registryConfig.password" id="registryConfigPassword" name="registryPassword" ng-disabled="registryConfig.busy" ng-required password-reveal>
2019-10-23 06:11:27 -07:00
</div>
2019-10-22 22:31:38 -07:00
</fieldset>
</form>
</div>
2019-10-22 22:31:38 -07:00
</div>
<div class="modal-footer">
2020-11-11 21:10:43 +01:00
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'main.dialog.cancel' | tr }}</button>
<button type="button" class="btn btn-success" ng-click="registryConfig.submit()" ng-disabled="registryConfigForm.$invalid || registryConfig.busy"><i class="fa fa-circle-notch fa-spin" ng-show="registryConfig.busy"></i> {{ 'main.dialog.save' | tr }}</button>
2019-10-22 22:31:38 -07:00
</div>
</div>
</div>
</div>
2018-01-22 13:01:38 -08:00
<div class="content">
<h1 class="section-header">{{ 'settings.title' | tr }}</h1>
2018-01-22 13:01:38 -08:00
<h3 class="section-header" ng-show="user.isAtLeastOwner && !config.isDemo">{{ 'settings.appstoreAccount.title' | tr }}</h3>
2018-01-22 13:01:38 -08:00
2020-03-07 10:00:32 -08:00
<div class="card" style="margin-bottom: 15px;" ng-show="user.isAtLeastOwner && !config.isDemo">
<div ng-show="subscriptionBusy" style="height: 155px;">
<div class="row">
<div class="col-xs-12 text-center">
<h2><i class="fa fa-circle-notch fa-spin"></i></h2>
</div>
2018-01-22 13:01:38 -08:00
</div>
</div>
<div ng-show="!subscriptionBusy">
2018-01-22 13:01:38 -08:00
<div class="row">
2020-11-11 21:10:43 +01:00
<div class="col-xs-12">{{ 'settings.appstoreAccount.description' | tr }}</div>
2018-01-22 13:01:38 -08:00
</div>
<br/>
<div class="row" ng-show="!subscription">
<div class="col-xs-12 text-center">
2020-11-11 21:10:43 +01:00
<a class="btn btn-success" ng-href="/#/appstore">{{ 'settings.appstoreAccount.setupAction' | tr }}</a>
</div>
2018-01-22 13:01:38 -08:00
</div>
<div class="row" ng-show="subscription && !subscription.externalCustomer">
<div class="col-xs-6">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.appstoreAccount.email' | tr }}</span>
</div>
<div class="col-xs-6 text-right">
<a ng-href="{{ config.consoleServerOrigin }}?email={{ subscription.emailEncoded }}" target="_blank">{{ subscription.email }} <i ng-show="!subscription.emailVerified" class="fas fa-exclamation-triangle text-danger" uib-tooltip="{{ 'settings.appstoreAccount.emailNotVerified' | tr }}"></i></a>
</div>
2018-01-22 13:01:38 -08:00
</div>
<div class="row" ng-show="subscription">
<div class="col-xs-6">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.appstoreAccount.cloudronId' | tr }}</span>
</div>
<div class="col-xs-6 text-right">
<span>{{ subscription.cloudronId }}</span>
</div>
</div>
<div class="row" ng-show="subscription">
<div class="col-xs-6">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.appstoreAccount.subscription' | tr }}</span>
</div>
<div class="col-xs-6 text-right">
<span>{{ subscription.plan.name }}</span>
</div>
</div>
<div class="row" ng-show="subscription">
<div class="col-xs-12 text-right">
2020-11-11 21:10:43 +01:00
<b class="text-danger" ng-show="subscription.cancel_at">{{ 'settings.appstoreAccount.subscriptionEndsAt' | tr }} {{ (subscription.cancel_at*1000) | prettyShortDate }}</b>
</div>
</div>
2018-01-22 13:01:38 -08:00
<br/>
<div class="row" ng-show="subscription">
<div class="col-xs-12">
2020-11-11 21:10:43 +01:00
<a class="btn btn-success pull-right" ng-click="openSubscriptionSetup()">{{ subscription.plan.id === 'free' ? ('settings.appstoreAccount.subscriptionSetupAction' | tr) : (subscription.cancel_at ? ('settings.appstoreAccount.subscriptionReactivateAction' | tr) : ('settings.appstoreAccount.subscriptionChangeAction' | tr)) }} </a>
</div>
2018-01-22 13:01:38 -08:00
</div>
</div>
2018-01-22 13:01:38 -08:00
</div>
<h3 class="section-header">{{ 'settings.timezone.title' | tr }}</h3>
2020-01-07 21:41:45 +01:00
<div class="card" style="margin-bottom: 15px;">
<div class="row">
2020-01-08 21:41:06 +01:00
<div class="col-md-8">
2020-11-20 18:09:09 +01:00
<p ng-bind-html=" 'settings.timezone.description' | tr:{ timeZone: timeZone.currentTimeZone.display } "></p>
2020-01-07 21:41:45 +01:00
<p class="text-danger" ng-show="timeZone.error"><br/>{{ timeZone.error }}</p>
</div>
2020-01-08 21:41:06 +01:00
<div class="col-md-4">
2020-01-08 20:35:00 +01:00
<multiselect class="pull-right" ng-model="timeZone.timeZone" ng-disabled="timeZone.busy" options="tz.id for tz in timeZone.availableTimeZones" data-multiple="false" filter-after-rows="5" scroll-after-rows="10"></multiselect>
2020-01-07 21:41:45 +01:00
</div>
</div>
<br/>
2020-01-07 21:41:45 +01:00
<div class="row">
2020-11-11 21:10:43 +01:00
<div class="col-md-12 text-right">
<button class="btn btn-outline btn-primary pull-right" ng-click="timeZone.submit()" ng-disabled="timeZone.busy || timeZone.timeZone === timeZone.currentTimeZone"><i class="fa fa-circle-notch fa-spin" ng-show="timeZone.busy"></i> {{ 'main.dialog.save' | tr }}</button>
2020-01-07 21:41:45 +01:00
</div>
</div>
</div>
2020-01-07 21:41:45 +01:00
<h3 class="section-header">{{ 'settings.language.title' | tr }}</h3>
2020-11-18 00:10:29 +01:00
<div class="card" style="margin-bottom: 15px;">
<div class="row">
<div class="col-md-8">
<p>{{ 'settings.language.description' | tr }}</p>
</div>
<div class="col-md-4">
2020-11-20 18:09:09 +01:00
<multiselect class="pull-right" ng-model="language.language" ng-disabled="language.busy" options="lang.display for lang in language.availableLanguages" data-multiple="false" filter-after-rows="5" scroll-after-rows="10"></multiselect>
2020-11-18 00:10:29 +01:00
</div>
</div>
<br/>
<div class="row">
<div class="col-md-12 text-right">
<button class="btn btn-outline btn-primary pull-right" ng-click="language.submit()" ng-disabled="language.busy || language.language === language.currentLanguage"><i class="fa fa-circle-notch fa-spin" ng-show="language.busy"></i> {{ 'main.dialog.save' | tr }}</button>
</div>
</div>
</div>
<h3 class="section-header">
{{ 'settings.updates.title' | tr }}
<div class="btn-group btn-group-sm pull-right">
<button type="button" class="btn btn-small btn-default dropdown-toggle" ng-show="update.tasks.length" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" uib-tooltip="{{ 'settings.updates.showLogsAction' | tr }}">
<i class="fas fa-align-left"></i> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li ng-repeat="task in update.tasks">
<a ng-href="/logs.html?taskId={{task.id}}" target="_blank" class="text-right">
{{ task.ts | prettyLongDate }} <i class="fa" style="margin-left: 20px" ng-class="{ 'status-active fa-check-circle': !task.active && task.success, 'fa-circle-notch fa-spin': task.active, 'status-error fa-times-circle': !task.active && !task.success }"></i>
</a>
</li>
</ul>
</div>
</h3>
2018-01-22 13:01:38 -08:00
<div class="card" style="margin-bottom: 15px;">
<div class="row">
<div class="col-md-12">
2024-09-08 16:35:08 +02:00
<span ng-bind-html=" 'settings.updates.description' | tr "></span>
</div>
</div>
<br/>
<div class="row">
2024-09-16 10:29:35 +02:00
<div class="col-xs-4">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.updates.version' | tr }}</span>
</div>
2024-09-16 10:29:35 +02:00
<div class="col-xs-8 text-right">
2021-05-18 14:38:06 -07:00
v{{ config.version }} ({{ config.ubuntuVersion }})
</div>
</div>
2018-01-22 13:01:38 -08:00
2024-09-08 16:35:08 +02:00
<div class="row">
2024-09-16 10:29:35 +02:00
<div class="col-xs-4">
2024-09-08 16:35:08 +02:00
<span class="text-muted">{{ 'settings.updates.schedule' | tr }}</span>
</div>
2024-09-16 10:29:35 +02:00
<div class="col-xs-8 text-right" style="text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
2024-09-08 16:35:08 +02:00
<span ng-show="updateSchedule.currentPattern !== 'never'">{{ prettyAutoUpdateSchedule(updateSchedule.currentPattern) }}</span>
<span ng-show="updateSchedule.currentPattern === 'never'">{{ 'settings.updates.disabled' | tr }}</span>
</div>
</div>
<div class="row">
<br/>
<div ng-if="update.busy" class="col-md-12" style="margin-bottom: 10px;">
<div class="progress progress-striped active animateMe">
<div class="progress-bar progress-bar-success" role="progressbar" style="width: {{ update.percent }}%"></div>
2020-03-18 21:31:51 -07:00
</div>
</div>
</div>
2018-01-22 13:01:38 -08:00
<div class="row" ng-show="update.busy">
<div class="col-md-12">
<p >{{ update.message }}</p>
</div>
</div>
2020-03-18 21:31:51 -07:00
<div class="row">
<div class="col-md-12">
2020-11-11 21:10:43 +01:00
<button class="btn btn-outline btn-primary pull-right" ng-click="updateSchedule.show()">{{ 'settings.updates.changeScheduleAction' | tr }}</button>
2021-01-13 16:55:45 -08:00
<button class="btn btn-default pull-right" ng-show="(!config.update.box || config.update.box.version === config.version) && !update.busy" ng-disabled="update.checking" ng-click="update.checkNow()"><i class="fa fa-circle-notch fa-spin" ng-show="update.checking"></i> {{ 'settings.updates.checkForUpdatesAction' | tr }}</button>
<button ng-class="config.update.box.unstable ? 'btn btn-danger pull-right' : 'btn btn-success pull-right'" ng-show="config.update.box && config.update.box.version !== config.version && !update.busy" ng-click="update.show()">{{ 'settings.updates.updateAvailableAction' | tr }}</button>
2020-11-11 21:10:43 +01:00
<button class="btn btn-danger pull-right" ng-show="config.update.box && update.busy" ng-click="update.stopUpdate()">{{ 'settings.updates.stopUpdateAction' | tr }}</button>
2018-01-22 13:01:38 -08:00
</div>
</div>
2018-01-22 13:01:38 -08:00
</div>
<h3 class="section-header">{{ 'settings.privateDockerRegistry.title' | tr }}</h3>
2019-10-22 22:31:38 -07:00
<div class="card" style="margin-bottom: 15px;">
<div class="row">
<div class="col-xs-12">
2020-11-12 23:13:52 +01:00
<span ng-bind-html="'settings.privateDockerRegistry.description' | tr:{ customAppsLink: 'https://docs.cloudron.io/custom-apps/tutorial/' }"></span>
2019-10-22 22:31:38 -07:00
</div>
</div>
2019-10-22 22:31:38 -07:00
<br/>
<div class="row" ng-show="registryConfig.currentConfig.provider !== 'noop'">
2019-10-22 22:31:38 -07:00
<div class="col-xs-6">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.privateDockerRegistry.server' | tr }}</span>
2019-10-22 22:31:38 -07:00
</div>
<div class="col-xs-6 text-right">
<span>{{ registryConfig.currentConfig.serverAddress || ('settings.privateDockerRegistry.serverNotSet' | tr) }}</span>
2019-10-22 22:31:38 -07:00
</div>
</div>
<div class="row" ng-show="registryConfig.currentConfig.provider !== 'noop'">
2019-10-22 22:31:38 -07:00
<div class="col-xs-6">
2020-11-11 21:10:43 +01:00
<span class="text-muted">{{ 'settings.privateDockerRegistry.username' | tr }}</span>
2019-10-22 22:31:38 -07:00
</div>
<div class="col-xs-6 text-right">
2020-11-11 21:10:43 +01:00
<span>{{ registryConfig.currentConfig.username || registryConfig.currentConfig.email || ('settings.privateDockerRegistry.usernameNotSet' | tr) }}</span>
2019-10-22 22:31:38 -07:00
</div>
</div>
2019-10-22 22:31:38 -07:00
<br/>
<div class="row">
2019-10-22 22:31:38 -07:00
<div class="col-xs-12">
2020-11-11 21:10:43 +01:00
<button class="btn btn-primary pull-right" ng-click="registryConfig.show()">{{ 'settings.privateDockerRegistry.configureAction' | tr }}</button>
2019-10-22 22:31:38 -07:00
</div>
</div>
</div>
2018-01-22 13:01:38 -08:00
</div>