2018-03-30 15:12:34 +02:00
<!-- 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" > × < / 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 | readyToUpdate" >
< p > {{ 'settings.updateDialog.blockingApps' | tr }}< / p >
< ul >
< li ng-repeat = "app in installedApps | inProgressApps" > {{app.location}}< / li >
< / ul >
< span > {{ 'settings.updateDialog.blockingAppsInfo' | tr }}< / span >
< br / >
< br / >
< / div >
2019-05-12 13:08:40 -07:00
2020-11-11 21:10:43 +01:00
< div ng-show = "installedApps | readyToUpdate" >
< 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 >
2018-03-30 15:12:34 +02:00
< / div >
2020-11-11 21:10:43 +01:00
< / div >
< div class = "modal-footer" >
< label class = "checkbox-inline pull-left" >
< 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-class = "config.update.box.unstable ? 'btn-danger' : 'btn-success'" ng-click = "update.startUpdate()" ng-disabled = "update.busy" ng-show = "(installedApps | readyToUpdate)" > < i class = "fa fa-circle-notch fa-spin" ng-show = "update.busy" > < / i > {{ 'settings.updateDialog.updateAction' | tr }}< / button >
< / div >
2018-03-30 15:12:34 +02:00
< / div >
2020-11-11 21:10:43 +01:00
< / div >
2018-03-30 15:12:34 +02:00
< / div >
2020-07-29 15:24:26 -07:00
<!-- 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 >
2020-07-29 15:24:26 -07:00
< / 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 15:24:26 -07:00
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 15:24:26 -07:00
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 >
2020-07-29 15:24:26 -07:00
< / 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 >
2020-07-29 15:24:26 -07:00
< / 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" >
< form name = "registryConfigForm" role = "form" novalidate ng-submit = "registryConfig.submit()" autocomplete = "off" >
< fieldset >
< p class = "has-error text-center" ng-show = "registryConfig.error" > {{ registryConfig.error }}< / p >
< div class = "form-group" >
2020-11-11 21:10:43 +01:00
< label class = "control-label" for = "registryConfigServerAddress" > {{ 'settings.privateDockerRegistry.server' | tr }}< / label >
2019-11-17 11:39:42 -08:00
< 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 >
2019-10-23 06:11:27 -07:00
< input type = "text" class = "form-control" ng-model = "registryConfig.username" id = "registryConfigUsername" name = "username" ng-disabled = "registryConfig.busy" ng-required >
< / 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 >
2019-11-07 23:04:02 -08:00
< input type = "text" class = "form-control" ng-model = "registryConfig.email" id = "registryConfigEmail" name = "email" 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 >
2019-11-07 23:04:02 -08:00
< input type = "password" class = "form-control" ng-model = "registryConfig.password" id = "registryConfigPassword" name = "password" ng-disabled = "registryConfig.busy" ng-required >
2019-10-23 06:11:27 -07:00
< / div >
2019-10-22 22:31:38 -07:00
< / 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 = "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" >
< div class = "text-left" >
2020-10-28 16:17:14 +01:00
< h1 > {{ 'settings.title' | tr }}< / h1 >
2018-01-22 13:01:38 -08:00
< / div >
2020-03-07 10:00:32 -08:00
< div class = "text-left" ng-show = "user.isAtLeastOwner && !config.isDemo" >
2020-11-11 21:10:43 +01:00
< h3 > {{ 'settings.appstoreAccount.title' | tr }}< / h3 >
2018-01-22 13:01:38 -08:00
< / div >
2020-03-07 10:00:32 -08:00
< div class = "card" style = "margin-bottom: 15px;" ng-show = "user.isAtLeastOwner && !config.isDemo" >
2019-05-06 11:39:45 +02:00
< div ng-show = "subscriptionBusy" >
2018-03-14 23:28:36 +01:00
< div class = "row" >
2019-05-06 11:39:45 +02:00
< 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 >
2019-05-06 11:39:45 +02:00
< / 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 >
2019-05-06 11:39:45 +02:00
< 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 >
2019-05-06 11:39:45 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-06 11:39:45 +02:00
< 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.email' | tr }}< / span >
2019-05-06 11:39:45 +02:00
< / div >
< div class = "col-xs-6 text-right" >
< a ng-href = "{{ config.webServerOrigin + '/console.html#/userprofile?email=' + subscription.emailEncoded }}" target = "_blank" > {{ subscription.email }}< / a >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-06 11:39:45 +02:00
< 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 >
2019-05-06 11:39:45 +02:00
< / 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 >
2019-05-06 11:39:45 +02:00
< / 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 >
2019-05-06 11:39:45 +02:00
< / div >
2019-03-06 15:54:51 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< br / >
2019-05-06 11:39:45 +02:00
< 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 >
2019-05-06 11:39:45 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-06 11:39:45 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-01-07 21:41:45 +01:00
< div class = "text-left" >
2020-11-11 21:10:43 +01:00
< h3 > {{ 'settings.timezone.title' | tr }}< / h3 >
2020-01-07 21:41:45 +01:00
< / div >
< 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 >
2020-01-08 13:01:31 +01:00
< 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 >
2020-03-06 11:40:30 -08:00
< / div >
2020-01-07 21:41:45 +01:00
2020-11-18 00:10:29 +01:00
< div class = "text-left" >
< h3 > {{ 'settings.language.title' | tr }}< / h3 >
< / div >
< 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 >
2018-01-22 13:01:38 -08:00
< div class = "text-left" >
2020-11-11 21:10:43 +01:00
< h3 > {{ 'settings.updates.title' | tr }}< / h3 >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "card" style = "margin-bottom: 15px;" >
2020-07-29 15:24:26 -07:00
< div class = "row" >
2020-09-29 16:38:31 +02:00
< div class = "col-md-12" >
2020-12-06 11:32:09 -08:00
< span ng-show = "updateSchedule.currentPattern !== 'never'" > {{ 'settings.updates.currentSchedule' | tr }} < b > {{ prettyAutoUpdateSchedule(updateSchedule.currentPattern) }}< / b > < / span >
2020-11-11 21:10:43 +01:00
< span ng-show = "updateSchedule.currentPattern === 'never'" ng-bind-html = " 'settings.updates.autoUpdateDisabled' | tr " > < / span >
2020-09-29 16:38:31 +02:00
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-xs-6" >
2020-11-11 21:10:43 +01:00
< span class = "text-muted" > {{ 'settings.updates.version' | tr }}< / span >
2020-09-29 16:38:31 +02:00
< / div >
< div class = "col-xs-6 text-right" >
v{{ config.version }}
< / div >
2020-07-29 15:24:26 -07:00
< / div >
2018-01-22 13:01:38 -08:00
2020-07-29 15:24:26 -07:00
< 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 >
2020-07-29 15:24:26 -07:00
< / div >
2018-01-22 13:01:38 -08:00
2020-12-02 18:29:02 +01:00
< div class = "row" ng-show = "update.busy" >
< div class = "col-md-12" >
< p > {{ update.message }}< / p >
< p class = "has-error" ng-show = "update.errorMessage" > {{ update.errorMessage }}. < a ng-class = "warning" ng-href = "/logs.html?taskId={{update.taskId}}" target = "_blank" > {{ 'settings.updates.showLogsAction' | tr }}< / a > < / p >
2020-07-29 15:24:26 -07:00
< / div >
2020-12-02 18:29:02 +01:00
< / div >
2020-03-18 21:31:51 -07:00
2020-12-02 18:29:02 +01: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 >
< button class = "btn btn-default pull-right" ng-show = "!config.update.box && !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 && !update.busy" ng-click = "update.show()" > {{ 'settings.updates.updateAvailableAction' | tr }}< / button >
< 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 >
2020-07-29 15:24:26 -07:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-04-27 22:38:09 +02:00
2019-10-22 22:31:38 -07:00
< div class = "text-left" >
2020-11-11 21:10:43 +01:00
< h3 > {{ 'settings.privateDockerRegistry.title' | tr }}< / h3 >
2019-10-22 22:31:38 -07:00
< / div >
< 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 >
2020-02-13 15:30:31 +01:00
2019-10-22 22:31:38 -07:00
< br / >
2020-02-13 15:30:31 +01:00
2020-02-13 16:34:37 +01:00
< div class = "row" ng-hide = "config.features.privateDockerRegistry" >
2020-02-13 15:30:31 +01:00
< div class = "col-xs-12" >
2020-11-11 21:10:43 +01:00
{{ 'settings.privateDockerRegistry.subscriptionRequired' | tr }} < a href = "" class = "pull-right" ng-click = "openSubscriptionSetup()" > {{ 'settings.privateDockerRegistry.setupSubscriptionAction' | tr }}< / a >
2020-02-13 15:30:31 +01:00
< / div >
< / div >
2020-02-13 16:34:37 +01:00
< div class = "row" ng-show = "config.features.privateDockerRegistry" >
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" >
2019-11-07 23:04:02 -08:00
< span > {{ registryConfig.currentConfig.serverAddress || 'Not set' }}< / span >
2019-10-22 22:31:38 -07:00
< / div >
< / div >
2020-02-13 15:30:31 +01:00
2020-02-13 16:34:37 +01:00
< div class = "row" ng-show = "config.features.privateDockerRegistry" >
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 >
2020-02-13 15:30:31 +01:00
< / div >
2019-10-22 22:31:38 -07:00
< br / >
2020-02-13 15:30:31 +01:00
2020-02-13 16:34:37 +01:00
< div class = "row" ng-show = "config.features.privateDockerRegistry" >
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 >