backupNow.htm
1 year ago
callSupport.htm
1 year ago
deleteBackup.htm
1 year ago
downloadBackup.htm
1 year ago
downloadBackupLog.htm
1 year ago
editBackupNotes.htm
1 year ago
exportBackup.htm
1 year ago
extractBackup.htm
1 year ago
fileManager.htm
10 months ago
importBackup.htm
1 year ago
lockBackup.htm
1 year ago
manageBackupJob.htm
1 year ago
manageDestination.htm
1 year ago
manageSchedule.htm
1 year ago
quickStart.htm
1 year ago
restoreBackup.htm
1 year ago
showExtractedPath.htm
1 year ago
viewLog.htm
1 year ago
manageBackupJob.htm
249 lines
| 1 | <div class="modal-header"> |
| 2 | <div class="modal-main-title"> |
| 3 | <h1 class="modal-title fs-5" id="jobManageModal"> |
| 4 | {{ jobID ? lang.t("Edit Job") : lang.t("Create New Job") }} |
| 5 | </h1> |
| 6 | </div> |
| 7 | <button type="button" class="btn-close" ng-click="cancel()" aria-label="Close"></button> |
| 8 | </div> |
| 9 | |
| 10 | <div class="modal-body"> |
| 11 | |
| 12 | <div class="jb-loading-screen" ng-if="loading"> |
| 13 | <p class="jb-loading-text"> |
| 14 | Loading<span class="jb-dots"><span></span><span></span><span></span></span> |
| 15 | </p> |
| 16 | </div> |
| 17 | <div id="job-form-wrapper" ng-show="!loading"> |
| 18 | <div class="form-group row"> |
| 19 | <label for="jobName" class="col-sm-3 col-form-label jb-label">{{ lang.t("Job Name") }}</label> |
| 20 | <div class="col-sm-9"> |
| 21 | <input type="text" class="form-control jb-input jb-grey-0" id="jobName" ng-model="saveData.name" name="name"> |
| 22 | <p class="pd-3">{{ lang.t("Give your backup job a clear, descriptive name (e.g., 'Daily Backups' or 'Database Only'). This name is for internal reference only.") }}</p> |
| 23 | </div> |
| 24 | </div> |
| 25 | |
| 26 | <div class="form-group row selectDestinations"> |
| 27 | <label for="destinations" class="col-sm-3 col-form-label jb-label">{{ lang.t("Destinations") }}</label> |
| 28 | <div class="col-sm-9"> |
| 29 | <div id="destinations" class="pd-3"> |
| 30 | <div ng-repeat="destination in destinations" ng-if="!destination.read_only" class="d-flex align-items-center mb-2"> |
| 31 | <span class="switch-main"> |
| 32 | <label class="switch"> |
| 33 | <input type="checkbox" |
| 34 | ng-model="destination.selected" |
| 35 | ng-change="toggleDestination(destination._id)" |
| 36 | ng-checked="isDestinationChecked(destination._id)" |
| 37 | id="destination_{{destination._id}}"> |
| 38 | <span class="slider round"></span> |
| 39 | </label> |
| 40 | </span> |
| 41 | <label for="destination_{{destination._id}}" class="ml-10">{{ destination.name }}</label> |
| 42 | <span class="ml-10" ng-if="destination.read_only">{{ lang.t("[Read-only]") }}</span> |
| 43 | </div> |
| 44 | </div> |
| 45 | <p class="pd-3">{{ lang.t("Enable one or more destinations to store backups when this job runs. Don’t see your destination? Make sure it’s enabled in the Destinations tab.") }}</p> |
| 46 | </div> |
| 47 | </div> |
| 48 | |
| 49 | <div class="form-group row backup_contains"> |
| 50 | <label class="col-sm-3 col-form-label jb-label">{{ lang.t("Backup Contains") }}</label> |
| 51 | <div class="col-sm-9"> |
| 52 | |
| 53 | <!-- Checkbox for Files (Home Directory) --> |
| 54 | <div class="pd-3 d-flex align-items-center"> |
| 55 | <span class="switch-main"> |
| 56 | <label class="switch"> |
| 57 | <input id="switch_files" type="checkbox" ng-model="saveData.contains_files" ng-change="toggleBackupOption()"> |
| 58 | <span class="slider round"></span> |
| 59 | </label> |
| 60 | </span> |
| 61 | <label for="switch_files" class="ml-10">{{ lang.t("Files") }}</label> |
| 62 | <span class="switch-main ml-10" ng-show="saveData.contains_files"> |
| 63 | <label class="switch"> |
| 64 | <input id="switch_is_files_excluded" type="checkbox" ng-model="saveData.is_files_excluded" ng-change="toggleBackupOption()"> |
| 65 | <span class="slider round"></span> |
| 66 | </label> |
| 67 | </span> |
| 68 | <label for="switch_is_files_excluded" class="ml-10" ng-show="saveData.contains_files">{{ lang.t("Exclude Folders/Files") }}</label> |
| 69 | </div> |
| 70 | |
| 71 | <div class="col-sm-9"> |
| 72 | <div class="mt-2" id="excludeFilesWrapper"> |
| 73 | |
| 74 | <textarea ng-show="saveData.is_files_excluded" class="form-control" id="exclude_files" rows="5" |
| 75 | ng-model="excludeFilesInput" |
| 76 | placeholder="{{ lang.t('Enter paths to exclude, one per line (e.g., /wp-content/cache/*)') }}"> |
| 77 | </textarea> |
| 78 | <small ng-show="saveData.is_files_excluded" class="text-muted mt-1 d-block"> |
| 79 | {{ lang.t('You can use wildcards like * to exclude multiple files or folders.') }} |
| 80 | </small> |
| 81 | |
| 82 | </div> |
| 83 | </div> |
| 84 | |
| 85 | <!-- Checkbox for Database --> |
| 86 | <div class="pd-3 d-flex align-items-center"> |
| 87 | <span class="switch-main"> |
| 88 | <label class="switch"> |
| 89 | <input id="switch_database" type="checkbox" ng-model="saveData.contains_database" ng-change="toggleBackupOption('database')"> |
| 90 | <span class="slider round"></span> |
| 91 | </label> |
| 92 | </span> |
| 93 | <label for="switch_database" class="ml-10">{{ lang.t("Database") }}</label> |
| 94 | <span class="switch-main ml-10" ng-show="saveData.contains_database"> |
| 95 | <label class="switch"> |
| 96 | <input id="switch_is_tables_excluded" type="checkbox" ng-model="saveData.is_tables_excluded" ng-change="toggleBackupOption('is_tables_excluded')"> |
| 97 | <span class="slider round"></span> |
| 98 | </label> |
| 99 | </span> |
| 100 | <label for="switch_is_tables_excluded" class="ml-10" ng-show="saveData.contains_database">{{ lang.t("Exclude Database Tables") }}</label> |
| 101 | </div> |
| 102 | |
| 103 | <div class="col-sm-9"> |
| 104 | <div class="mt-2" id="excludeTablesWrapper"> |
| 105 | <select class="form-select form-select-lg" |
| 106 | id="exclude_tables" |
| 107 | multiple |
| 108 | ng-model="database_excludes" |
| 109 | ng-options="table as table.name for table in databaseTables" |
| 110 | ng-show="saveData.is_tables_excluded" |
| 111 | ng-disabled="!saveData.is_tables_excluded" |
| 112 | aria-label="{{ lang.t('Select tables to exclude') }}"> |
| 113 | <option ng-if="databaseTables.length === 0" disabled>{{ lang.t('No tables available') }}</option> |
| 114 | </select> |
| 115 | <small ng-show="saveData.is_tables_excluded" class="text-muted mt-1 d-block"> |
| 116 | {{ lang.t('Hold down the Ctrl (Windows) or Command (Mac) key to select multiple tables. Excluding a table will backup the structure of the table, not the content of the table.') }} |
| 117 | </small> |
| 118 | </div> |
| 119 | </div> |
| 120 | <p class="pd-3">{{ lang.t("By default, all site files and database tables are included. You can customize what’s excluded in this job by toggling the Exclude Files or Exclude Tables option. Common Exclusions are enabled by default regardless of your selections for optimal performance; you can adjust this behavior in Settings.") }}</p> |
| 121 | </div> |
| 122 | </div> |
| 123 | |
| 124 | <!-- EOF Backup contains --> |
| 125 | |
| 126 | <div class="form-group row selectSchedules"> |
| 127 | <label for="schedules" class="col-sm-3 col-form-label jb-label">{{ lang.t("Schedules") }}</label> |
| 128 | <div id="schedules" class="col-sm-9"> |
| 129 | <div ng-repeat="schedule in schedules" class="pd-3 d-flex align-items-center"> |
| 130 | <div class="col-xl-5 col-sm-5 d-flex align-items-center"> |
| 131 | <span class="switch-main"> |
| 132 | <label class="switch"> |
| 133 | <input type="checkbox" |
| 134 | ng-model="schedule.selected" |
| 135 | ng-change="toggleSchedule(schedule)" |
| 136 | ng-checked="isScheduleChecked(schedule._id)" |
| 137 | id="schedule_{{schedule._id}}"> |
| 138 | <span class="slider round"></span> |
| 139 | </label> |
| 140 | </span> |
| 141 | <label for="schedule_{{schedule._id}}" class="ml-10">{{ schedule.name }}</label> |
| 142 | </div> |
| 143 | <div ng-show="schedule.selected" class="col-sm-5 col-xl-7 col-lg-7 d-flex schedule_retention_wrapper align-items-center schedule_retention_{{schedule._id}}"> |
| 144 | <div class="col-sm-4 col-lg-5 col-xl-3 col-md-5"> |
| 145 | <label for="schedule_retention_{{schedule._id}}">{{ lang.t("Retention") }}:</label> |
| 146 | </div> |
| 147 | <div class="col-sm-6"> |
| 148 | <div class="input-group"> |
| 149 | <button type="button" class="btn btn-secondary" |
| 150 | ng-click="changeRetain(schedule, -1)"> |
| 151 | - |
| 152 | </button> |
| 153 | <input id="schedule_retention_{{schedule._id}}" |
| 154 | name="schedule_retention[{{schedule._id}}]" |
| 155 | class="form-control text-center" |
| 156 | type="number" |
| 157 | min="0" |
| 158 | max="999" |
| 159 | placeholder="0" |
| 160 | ng-model="schedule.retain" |
| 161 | ng-change="updateScheduleRetain(schedule)"> |
| 162 | <button type="button" class="btn btn-secondary" |
| 163 | ng-click="changeRetain(schedule, 1)"> |
| 164 | + |
| 165 | </button> |
| 166 | </div> |
| 167 | |
| 168 | </div> |
| 169 | </div> |
| 170 | </div> |
| 171 | <div class="pd-3"> |
| 172 | <p>{{ lang.t("Select one or more schedules to automate this backup job. Set the minimum number of backups to retain under each schedule (e.g., keep 7 daily backups).") }}</p> |
| 173 | </div> |
| 174 | </div> |
| 175 | </div> |
| 176 | <!-- EOF Schdules --> |
| 177 | |
| 178 | <div class="form-group row schedules_time_row"> |
| 179 | <label for="schedule_time" class="col-sm-3 col-form-label jb-label">{{ lang.t("Schedule Time") }}</label> |
| 180 | <div class="col-sm-9"> |
| 181 | <div class="col-sm-4"> |
| 182 | <div class="input-group position-relative" moment-picker="saveData.schedule_time" format="HH:mm" show-header="false"> |
| 183 | <input type="text" |
| 184 | class="form-control text-center pr-5" |
| 185 | id="schedule_time" |
| 186 | name="schedule_time" |
| 187 | placeholder="{{ lang.t('Pick a time') }}" |
| 188 | ng-model="saveData.schedule_time" |
| 189 | ng-model-options="{ updateOn: 'blur' }" |
| 190 | style="border-radius: 5px;" /> |
| 191 | |
| 192 | <!-- Clock icon moved to the right --> |
| 193 | <span class="position-absolute clock-icon" |
| 194 | style="right: 10px; top: 50%; transform: translateY(-50%); cursor: pointer;"> |
| 195 | <em aria-hidden="true" class="far fa-clock text-muted"></em> |
| 196 | </span> |
| 197 | </div> |
| 198 | </div> |
| 199 | <div class="pd-3"> |
| 200 | <p>{{ lang.t("Define the time of day the backup job should run, based on the schedules you selected. If no schedule is enabled, the job must be run manually. Old backups will be automatically cleaned based on your retention settings.") }}</p> |
| 201 | </div> |
| 202 | </div> |
| 203 | </div> |
| 204 | |
| 205 | <div class="form-group row backup_monitor"> |
| 206 | <label for="backup_monitor" class="col-sm-3 col-form-label jb-label">{{ lang.t("Backup Monitor") }}</label> |
| 207 | <div class="col-sm-9"> |
| 208 | <div class="col-1"> |
| 209 | <input type="text" class="form-control mb-3 text-center" |
| 210 | name="backup_monitor" |
| 211 | id="backup_monitor" |
| 212 | ng-model="saveData.job_monitor" |
| 213 | min="0" |
| 214 | max="99" |
| 215 | string-to-number |
| 216 | validate-field="int" |
| 217 | placeholder="0"> |
| 218 | </div> |
| 219 | <p>{{ lang.t("Get alerts if backups haven’t run for a specified number of days. Configure the alert email in Settings > Notification.") }}</p> |
| 220 | </div> |
| 221 | </div> |
| 222 | |
| 223 | </div> |
| 224 | </div> |
| 225 | |
| 226 | <div class="form-group row justify-content-center"> |
| 227 | <div class="col-11 error-messages" ng-if="formErrors.length > 0"> |
| 228 | <div class="alert alert-danger" role="alert"> |
| 229 | <ul class="mb-0"> |
| 230 | <li ng-repeat="error in formErrors">{{ error }}</li> |
| 231 | </ul> |
| 232 | </div> |
| 233 | </div> |
| 234 | </div> |
| 235 | |
| 236 | <div class="modal-footer"> |
| 237 | <button class="btn btn-secondary cancel_btn" type="button" ng-click="cancel()"> |
| 238 | {{ lang.t("Cancel") }} |
| 239 | </button> |
| 240 | <button |
| 241 | class="btn btn-primary apply_btn" |
| 242 | type="button" |
| 243 | ng-click="ok()" |
| 244 | ng-disabled="saving"> |
| 245 | <span class="spinner-border spinner-border-sm me-2" role="status" aria-hidden="true" ng-show="saving"></span> |
| 246 | {{ lang.t("Save") }} |
| 247 | </button> |
| 248 | |
| 249 | </div> |