Current File : //usr/local/jetapps/var/www/jetbackup5/docroot/app/views/disasterRecovery/accounts.htm |
<div ng-controller="disasterRecoveryAccounts">
<div ng-controller="restoreMultiAccount">
<div class="row">
<div class="col-xl-5 col-lg-5 col-md-5 col-xs-12">
<div class="modal-content" style="box-shadow: none;">
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<div ng-hide="showOptions">
<h3 class="modal-title" style="border-bottom: 1px solid #e5e5e5; padding-bottom: 10px; margin-bottom: 20px;">{{ lang.t("Filters") }}</h3>
<form data-parsley-validate="" class="form-horizontal form-label-left" novalidate>
<alert-box ng-model="filteredAccountsStatus"></alert-box>
<div class="form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12">{{ lang.t("Backup Date Range") }}</label>
<div class="col-md-9 col-sm-9 col-xs-12">
<div class="input-group">
<span class="input-group-addon">{{lang.t("From")}}</span>
<input
class="form-control"
moment-picker="filters.date_start"
format="MMM Do YYYY, hh:mm A"
max-date="filters.date_end"
id="date_start"
placeholder="{{ lang.t('Any Starting Date') }}"
ng-model="filters.date_start"
ng-model-options="{ updateOn: 'blur' }" />
</div>
<div class="input-group" style="margin-bottom: 0;">
<span class="input-group-addon">{{lang.t("To")}}</span>
<input
moment-picker="filters.date_end"
format="MMM Do YYYY, hh:mm A"
min-date="filters.date_start"
max-date="today"
class="form-control"
id="date_end"
placeholder="{{ lang.t('Any Ending Date') }}"
ng-model="filters.date_end"
ng-model-options="{ updateOn: 'blur' }" />
</div>
<div>
<a href="" ng-click="filters.date_start = ''; filters.date_end = '';" style="font-weight: bold;">
<span class="fas fa-times"></span>
{{lang.t("Reset Backup Date Range")}}
</a>
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12">{{ lang.t("Backup Date Sorting") }}</label>
<div class="col-md-9 col-sm-9 col-xs-12">
<div class="pretty p-default p-round p-smooth">
<input type="radio" ng-model="filters.show_oldest" id="show_oldest_0" ng-checked="filters.show_oldest == 0" value="0" />
<div class="state p-primary"><label for="show_oldest_0">{{ lang.t("Sort by Newest") }}</label></div>
</div>
<div class="pretty p-default p-round p-smooth">
<input type="radio" ng-model="filters.show_oldest" id="show_oldest_1" ng-checked="filters.show_oldest == 1" value="1" />
<div class="state p-primary"><label for="show_oldest_1">{{ lang.t("Sort by Oldest") }}</label></div>
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12">{{ lang.t("Backup Contains") }}</label>
<div class="col-md-9 col-sm-9 col-xs-12">
<div class="row">
<div class="col-md-6" ng-repeat="type in account_types" style="margin-bottom: 3px;">
<div class="pretty p-default p-curve p-smooth">
<input aria-label="{{ type.label }} checkbox" type="checkbox" id="filter_contains_{{type.value}}" ng-checked="containsChecked(type.value, filters)" ng-click="toggleContains(type.value, filters)" ng-disabled="isContainsDisabled(type.value)" value="{{ type.value }}" />
<div aria-label="{{ type.label }} checkbox" class="state p-primary"><label for="filter_contains_{{type.value}}">{{ type.label }}</label></div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<div ng-show="showOptions">
<div style="margin-bottom: 20px;">
<h3 class="modal-title" style="border-bottom: 1px solid #e5e5e5; padding-bottom: 10px; margin-bottom: 20px;">{{ lang.t("What to Restore") }}</h3>
<form data-parsley-validate="" class="form-horizontal form-label-left" novalidate>
<div class="row">
<div class="col-md-4" ng-repeat="type in account_types" style="margin-bottom: 3px;">
<div class="pretty p-default p-curve p-smooth">
<input aria-label="{{ type.label }} checkbox" type="checkbox" id="restore_options_contains_{{type.value}}" ng-checked="containsChecked(type.value)" ng-click="toggleContains(type.value)" ng-disabled="isContainsDisabled(type.value)" value="{{ type.value }}" />
<div aria-label="{{ type.label }} checkbox" class="state p-primary"><label for="restore_options_contains_{{type.value}}">{{ type.label }}</label></div>
</div>
</div>
</div>
</form>
</div>
<div ng-show="gotItems([const.BACKUP_TYPE_ACCOUNT_CONFIG,const.BACKUP_TYPE_ACCOUNT_HOMEDIR,const.BACKUP_TYPE_ACCOUNT_EMAILS])" style="margin-bottom: 20px;">
<h3 class="modal-title" style="border-bottom: 1px solid #e5e5e5; padding-bottom: 10px; margin-bottom: 20px;">{{ lang.t("Restore Options") }}</h3>
<form data-parsley-validate="" class="form-horizontal form-label-left" novalidate>
<div ng-show="gotItems([const.BACKUP_TYPE_ACCOUNT_CONFIG]) && !account.orphan">
<div class="pretty p-default p-curve p-smooth">
<input type="checkbox" ng-model="options.terminate" id="terminate" ng-checked="options.terminate" />
<div class="state p-primary"><label for="terminate">{{ lang.t("Terminate account before restore") }}</label></div>
</div>
</div>
<div ng-show="gotItems([const.BACKUP_TYPE_ACCOUNT_HOMEDIR,const.BACKUP_TYPE_ACCOUNT_EMAILS]) && !options.terminate && !account.orphan">
<div class="pretty p-default p-curve p-smooth">
<input type="checkbox" ng-model="options.merge" id="merge" ng-checked="options.merge" />
<div class="state p-primary"><label for="merge">{{ lang.t("Merge live account data with backup data") }}</label></div>
</div>
</div>
<div ng-show="gotItems([const.BACKUP_TYPE_ACCOUNT_CONFIG])">
<div class="pretty p-default p-curve p-smooth">
<input type="checkbox" ng-model="options.suspend" id="suspend" ng-checked="options.suspend" />
<div class="state p-primary"><label for="merge">{{ lang.t("Suspend account after restore") }}</label></div>
</div>
</div>
</form>
</div>
<div ng-show="restore_conditions.length" style="margin-bottom: 20px;">
<h3 class="modal-title" style="border-bottom: 1px solid #e5e5e5; padding-bottom: 10px; margin-bottom: 20px;">{{ lang.t("Restore Conditions") }}</h3>
<form data-parsley-validate="" class="form-horizontal form-label-left" novalidate>
<div ng-repeat="condition in restore_conditions">
<div class="pretty p-default p-curve p-smooth">
<input type="checkbox" ng-model="conditions[condition._id]" id="condition_{{condition._id}}" ng-checked="conditions[condition._id]" />
<div class="state p-primary"><label for="condition_{{condition._id}}">{{ condition.condition }}</label></div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer" style="text-align: center;">
<alert-box ng-show="showOptions" ng-model="actionMessage"></alert-box>
<button ng-show="showOptions" class="btn btn-danger" type="button" ng-click="showOptions = flase;" title="{{ lang.t('Back to Filters') }}">{{ lang.t("Back to Filters") }}</button>
<button ng-show="!showOptions" class="btn btn-primary" type="button" ng-disabled="(total_accounts-excluded.length) <= 0" ng-click="showOptions = (total_accounts-excluded.length > 0)" title="{{ lang.t('Next') }}">{{ lang.t("Next") }}</button>
<button ng-show="showOptions" class="btn btn-primary" type="button" ng-click="addToQueue()" title="{{ lang.t('Restore Filtered Accounts') }}"><span class="fas fa-sync"></span> {{ lang.t("Restore Filtered Accounts") }}</button>
</div>
</div>
</div>
<div class="col-xl-7 col-lg-7 col-md-7 col-xs-12">
<div class="table-responsive">
<p style="font-size: 11px; font-weight: bold;">{{ lang.t("Why isn't my account listed?") }} <span tooltip="bottom|If a specific account isn't listed, first try adjusting your Filters. This page only displays accounts that were active during JB Config Export and are not active on this server. Some accounts may be restorable only after exiting the DR Wizard." style="cursor: pointer;" class="fas fa-info-circle"></span></p>
<table class="table table-striped content-table">
<thead>
<tr>
<th class="col-sm-3 col-md-3 col-lg-3 column-title">
{{ lang.t("Selected Backup") }}
</th>
<th class="col-sm-2 col-md-2 col-lg-2 column-title">
{{ lang.t("Username") }}
</th>
<th class="col-sm-2 col-md-2 col-lg-2 column-title">
{{ lang.t("Owner") }}
</th>
<th class="col-sm-3 col-md-3 col-lg-3 column-title">
{{ lang.t("Encryption Key") }}
</th>
<th class="col-sm-2 col-md-2 col-lg-2 column-title">
<span ng-show="exclude_loading" class="fas fa-spin fa-circle-notch"></span>
{{ lang.t("Status") }}
<a href="" class="btn btn-xs" ng-class="{ 'btn-success': exclude_type == 1, 'btn-danger': exclude_type == 0 }" ng-hide="exclude_loading" ng-click="toggleExcludeAll()">{{ exclude_type == 0 ? lang.t("Exclude All") : lang.t("Include All") }}</a>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="account in accounts track by $index" id="account_row_{{$index}}" ng-click="openActions(account)" ng-class="{ 'suspended': account.account.suspended }">
<td data-title="{{ lang.t('Selected Backup') }}" ng-hide="(action == 'lock' || action == 'unlock') && options.allbackups == 1">
{{ lang.d(account.snapshot.created, 'shorttime') }}<br />
</td>
<td data-title="{{ lang.t('Username / Nickname') }}" style="white-space: nowrap;">
{{ (account.account.virtual && account.account.nickname ? account.account.nickname : account.account.username) + (account.account.orphan ? " - (" + lang.t("Orphan") + ")" : '') }}
<span class="fas fa-info-circle" uib-tooltip-template="'accountDetails.htm'" tooltip-placement="auto" tooltip-class="backups-tooltip"></span>
</td>
<td data-title="{{ lang.t('Owner') }}">
{{ account.account.owner }}
</td>
<td data-title="{{ lang.t('Encryption Key') }}" ng-hide="action == 'lock' || action == 'unlock'">
<div ng-show="!isExcluded(account.account)">
<strong ng-show="account.snapshot.encrypted">
<span class="fas fa-lock"></span>
{{lang.t("Encrypted Backup")}}
</strong>
<div ng-show="account.snapshot.encrypted">
<div ng-show="account.account.secret_key">
<div class="text-red" style="font-weight: bold; font-size: 11px;">{{lang.t("Encryption key is stored remotely")}}</div>
<label><input type="text" class="form-control" ng-model="encryption_keys[account.account._id]" /></label>
</div>
<div ng-hide="account.account.secret_key" class="text-green" style="font-weight: bold; font-size: 11px;">{{lang.t("Encryption key is stored locally")}}</div>
</div>
<div ng-hide="account.snapshot.encrypted">-</div>
</div>
<div ng-show="isExcluded(account.account)">-</div>
</td>
<td data-title="{{ lang.t('Status') }}">
<button ng-click="toggleExclude(account.account)" ng-show="isExcluded(account.account)" class="btn btn-danger btn-xs"><span class="fas fa-times"></span> {{ lang.t("Excluded") }}</button>
<button ng-click="toggleExclude(account.account)" ng-hide="isExcluded(account.account)" class="btn btn-success btn-xs"><span class="fas fa-check"></span> {{ lang.t("Included") }}</button>
</td>
</tr>
<tr ng-hide="!loadingAccounts">
<td colspan="10">
<loading-box><span>{{ lang.t("Loading Accounts") }}</span></loading-box>
</td>
</tr>
<tr ng-hide="accounts.length > 0 || loadingAccounts">
<td colspan="10">
<span>{{ lang.t("No Accounts Found") }}</span>
</td>
</tr>
</tbody>
</table>
</div>
<pagination fetch="fetch" meta="meta"></pagination>
</div>
</div>
</div>
</div>
<script type="text/ng-template" id="accountDetails.htm">
<div style="text-align: left; padding: 10px 0;">
<h5 style="margin: 0 20px 5px 20px; font-weight: bold;">{{ lang.t("Account Details") }}</h5>
<div style="margin: 0 20px 5px 20px;">
<div><strong>{{lang.t("ID")}}</strong>: {{account.account._id}}</div>
<div><strong>{{lang.t("UUID")}}</strong>: {{account.account.uuid}}</div>
<div><strong>{{lang.t("Domain")}}</strong>: {{account.account.domain}}</div>
<div><strong>{{lang.t("Home Directory")}}</strong>: {{account.account.homedir}}</div>
<div><strong>{{lang.t("IP Address")}}</strong>: {{account.account.ip}}</div>
</div>
</div>
</script>