diff --git a/App/Views/create.volt b/App/Views/create.volt
index b35d28d..b047530 100644
--- a/App/Views/create.volt
+++ b/App/Views/create.volt
@@ -18,6 +18,7 @@
+
diff --git a/Lib/Backup.php b/Lib/Backup.php
index 9f3880b..8f2deb0 100644
--- a/Lib/Backup.php
+++ b/Lib/Backup.php
@@ -41,6 +41,7 @@ class Backup extends PbxExtensionBase
private string $result_dir;
private string $progress_file;
private string $progress_file_recover;
+ private string $stage_file;
private string $config_file;
private array $options;
private string $options_recover_file;
@@ -138,6 +139,7 @@ public function __construct($id, $options = null)
$this->config_file = "{$this->dirs['backup']}/{$this->id}/config.json";
$this->options_recover_file = "{$this->dirs['backup']}/{$this->id}/options_recover.json";
$this->progress_file_recover = "{$this->dirs['backup']}/{$this->id}/progress_recover.txt";
+ $this->stage_file = "{$this->dirs['backup']}/{$this->id}/stage.txt";
if (!is_array($options) && file_exists($this->config_file)) {
$this->options = json_decode(file_get_contents($this->config_file), true) ?? [];
@@ -725,6 +727,12 @@ public static function listBackups(string $backup_dir = ''): PBXApiResult
if (file_exists($config_file)) {
$config = json_decode(file_get_contents($config_file), true);
}
+ // Фаза выполнения: 'preparing' (формирование списка файлов) или '' (архивирование).
+ $stage = '';
+ $stageFile = "{$dirs['backup']}/{$base_filename}/stage.txt";
+ if (file_exists($stageFile)) {
+ $stage = trim((string)file_get_contents($stageFile));
+ }
// Вычислим timestamp.
$arr_fname = explode('_', $base_filename);
$data = [
@@ -732,6 +740,7 @@ public static function listBackups(string $backup_dir = ''): PBXApiResult
'size' => $size,
'progress' => $progress,
'total' => $total,
+ 'stage' => $stage,
'config' => $config,
'pid' => $pid,
'id' => $base_filename,
@@ -1290,23 +1299,28 @@ private function getBatchSize(int $totalFiles): int
public function createArchive(): array
{
file_put_contents($this->errorFile, '');
+ // Переходим в фазу подготовки: сборка списка файлов и архивов модулей.
+ file_put_contents($this->stage_file, 'preparing');
if (file_exists($this->progress_file)) {
$file_data = file_get_contents($this->progress_file);
$data = explode('/', $file_data);
$this->progress = intval(trim($data[0]));
}else{
- file_put_contents($this->progress_file, '0');
+ // Изначально показываем 0/1 — чтобы percent считался как 0, а не "не определён".
+ file_put_contents($this->progress_file, '0/1');
}
if(!$this->checkDiskSpace()){
$msg = 'There is not enough free disk space.';
file_put_contents($this->errorFile, $msg);
Util::sysLogMsg(__CLASS__, $msg);
+ @unlink($this->stage_file);
return ['result' => 'ERROR', 'message' => $msg];
}
if ( ! file_exists("{$this->dirs['backup']}/{$this->id}")) {
$msg = 'Unable to create directory for the backup.';
file_put_contents($this->errorFile, $msg);
Util::sysLogMsg(__CLASS__, $msg);
+ @unlink($this->stage_file);
return ['result' => 'ERROR', 'message' => $msg];
}
$result = $this->createFileList();
@@ -1314,6 +1328,7 @@ public function createArchive(): array
$msg = 'Unable to create file list. Failed to create file.';
file_put_contents($this->errorFile, $msg);
Util::sysLogMsg(__CLASS__, $msg);
+ @unlink($this->stage_file);
return ['result' => 'ERROR', 'message' => $msg];
}
@@ -1321,6 +1336,7 @@ public function createArchive(): array
$msg = 'File list not found.';
file_put_contents($this->errorFile, $msg);
Util::sysLogMsg(__CLASS__, $msg);
+ @unlink($this->stage_file);
return ['result' => 'ERROR', 'message' => $msg];
}
$lines = file($this->file_list);
@@ -1328,11 +1344,16 @@ public function createArchive(): array
$msg = 'File list empty.';
file_put_contents($this->errorFile, $msg);
Util::sysLogMsg(__CLASS__, $msg);
+ @unlink($this->stage_file);
return ['result' => 'ERROR', 'message' => $msg];
}
$count_files = count($lines);
$batchSize = $this->getBatchSize($count_files);
file_put_contents($this->progress_file, "{$this->progress}/{$count_files}");
+ // Подготовка завершена — переходим в фазу архивации.
+ if (file_exists($this->stage_file)) {
+ unlink($this->stage_file);
+ }
$batchFiles = [];
while ($this->progress < $count_files) {
@@ -1424,7 +1445,7 @@ public function createArchive(): array
*
* @return string строки для flist.txt
*/
- private function collectModuleFiles(): string
+ private function collectModuleFiles(int &$prepDone = 0, int $prepTotal = 1): string
{
$flist = '';
$customModulesDir = $this->dirs['custom_modules'];
@@ -1484,6 +1505,9 @@ private function collectModuleFiles(): string
}
}
}
+ // Отражаем прогресс фазы подготовки: модуль обработан.
+ $prepDone++;
+ file_put_contents($this->progress_file, "{$prepDone}/{$prepTotal}");
}
return $flist;
}
@@ -1681,10 +1705,30 @@ private function createFileList(): bool
return $result;
}
+ // Считаем общее число шагов подготовки для отображения прогресса.
+ // Шаги: модули (каждый = 1 tar.gz) + find по media + find по records.
+ $moduleCount = $this->countModuleCandidates();
+ $prepTotal = $moduleCount;
+ if (($this->options['backup-sound-files'] ?? '') === '1') {
+ $prepTotal++;
+ }
+ if (($this->options['backup-records'] ?? '') === '1' && $this->remote) {
+ $prepTotal++;
+ }
+ if ($prepTotal < 1) {
+ $prepTotal = 1;
+ }
+ $prepDone = 0;
+ file_put_contents($this->progress_file, "{$prepDone}/{$prepTotal}");
+
$flist = '';
if (($this->options['backup-config'] ?? '') === '1') {
file_put_contents($this->file_list, 'backup-config:' . $this->dirs['settings_db_path'] . "\n", FILE_APPEND);
- $flist .= $this->collectModuleFiles();
+ $flist .= $this->collectModuleFiles($prepDone, $prepTotal);
+ } else {
+ // backup-config отключён — модули не сжимаем, но шаги учтены в prepTotal.
+ $prepDone += $moduleCount;
+ file_put_contents($this->progress_file, "{$prepDone}/{$prepTotal}");
}
if (($this->options['backup-cdr'] ?? '') === '1') {
file_put_contents($this->file_list, 'backup-cdr:' . $this->dirs['cdr_db_path'] . "\n", FILE_APPEND);
@@ -1699,6 +1743,8 @@ private function createFileList(): bool
foreach ($out as $filename) {
$flist .= 'backup-sound-files:' . $filename . "\n";
}
+ $prepDone++;
+ file_put_contents($this->progress_file, "{$prepDone}/{$prepTotal}");
}
if (($this->options['backup-records'] ?? '') === '1') {
if ($this->remote) {
@@ -1708,6 +1754,8 @@ private function createFileList(): bool
foreach ($out as $filename) {
$flist .= 'backup-records:' . $filename . "\n";
}
+ $prepDone++;
+ file_put_contents($this->progress_file, "{$prepDone}/{$prepTotal}");
}
}
file_put_contents($this->file_list, $flist, FILE_APPEND);
@@ -1715,6 +1763,30 @@ private function createFileList(): bool
return true;
}
+ /**
+ * Подсчитывает количество кандидатов-модулей (каталог с module.json).
+ * Используется для расчёта прогресса фазы подготовки.
+ */
+ private function countModuleCandidates(): int
+ {
+ $customModulesDir = $this->dirs['custom_modules'];
+ if (!is_dir($customModulesDir)) {
+ return 0;
+ }
+ $count = 0;
+ $entries = scandir($customModulesDir) ?: [];
+ foreach ($entries as $entry) {
+ if ($entry === '.' || $entry === '..') {
+ continue;
+ }
+ $moduleDir = "$customModulesDir/$entry";
+ if (is_dir($moduleDir) && file_exists("$moduleDir/module.json")) {
+ $count++;
+ }
+ }
+ return $count;
+ }
+
/**
* Добавляет батч обычных файлов в архив одной командой.
*
diff --git a/Messages/en.php b/Messages/en.php
index e575b73..b6051ac 100644
--- a/Messages/en.php
+++ b/Messages/en.php
@@ -44,6 +44,7 @@
'bkp_SettingsRestoredWaitReboot' => 'Settings was restored',
'bkp_UploadError' => 'Failed to load backup file',
'bkp_StopCreateBackup' => 'Cancel backup',
+ 'bkp_PreparingFileList' => 'Preparing',
'bkp_DeleteFiles' => 'Delete backup',
'bkp_RestoreBackupHeader' => 'Select restore options',
'bkp_CreateBackupHeader' => 'Select backup options',
diff --git a/Messages/ru.php b/Messages/ru.php
index 46ae847..832db2e 100644
--- a/Messages/ru.php
+++ b/Messages/ru.php
@@ -46,6 +46,7 @@
'bkp_SettingsRestoredWaitReboot' => 'Настройки восстановлены, станция перезагружается...',
'bkp_UploadError' => 'Не удалось загрузить файл бекапа',
'bkp_StopCreateBackup' => 'Отменить создание резервной копии',
+ 'bkp_PreparingFileList' => 'Подготовка',
'bkp_DeleteFiles' => 'Удалить файл бекапа',
'bkp_RestoreBackupHeader' => 'Что необходимо восстановить?',
'bkp_CreateBackupHeader' => 'Что необходимо архивировать?',
diff --git a/public/assets/js/backup-create-worker.js b/public/assets/js/backup-create-worker.js
index ce7a07e..9db4956 100644
--- a/public/assets/js/backup-create-worker.js
+++ b/public/assets/js/backup-create-worker.js
@@ -8,7 +8,7 @@
*
*/
-/* global BackupApi, globalRootUrl */
+/* global BackupApi, globalRootUrl, globalTranslate */
var backupCreateWorker = {
timeOut: 5000,
@@ -60,16 +60,15 @@ var backupCreateWorker = {
if (backupCreateWorker.waitBackupId === value.id) {
backupCreateWorker.$submitButton.hide();
backupCreateWorker.$stopCreateBackup.attr('data-value', backupCreateWorker.waitBackupId).show();
- percentOfTotal = 100 * (value.progress / value.total);
+ percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;
+ var labelText = value.stage === 'preparing' ? "".concat(globalTranslate.bkp_PreparingFileList, ": ").concat(value.progress, " / ").concat(value.total) : "".concat(value.progress, " / ").concat(value.total);
backupCreateWorker.$progressBar.progress({
- duration: value.progress,
total: value.total,
- percent: parseInt(percentOfTotal, 10),
- text: {
- active: '{value} of {total} done'
- }
+ value: value.progress,
+ percent: parseInt(percentOfTotal, 10)
});
- if (value.total === value.progress && backupCreateWorker.backupIsPreparing) {
+ backupCreateWorker.$progressBar.find('.label').text(labelText);
+ if (value.total === value.progress && value.stage !== 'preparing' && backupCreateWorker.backupIsPreparing) {
window.location = "".concat(globalRootUrl, "module-backup/index");
}
backupCreateWorker.backupIsPreparing = value.pid.length > 0;
@@ -84,4 +83,5 @@ var backupCreateWorker = {
}
}
};
+
//# sourceMappingURL=backup-create-worker.js.map
\ No newline at end of file
diff --git a/public/assets/js/backup-create-worker.js.map b/public/assets/js/backup-create-worker.js.map
index ab617f8..5e20e4d 100644
--- a/public/assets/js/backup-create-worker.js.map
+++ b/public/assets/js/backup-create-worker.js.map
@@ -1 +1 @@
-{"version":3,"file":"backup-create-worker.js","names":["backupCreateWorker","timeOut","timeOutHandle","$submitButton","$","$stopCreateBackup","waitBackupId","$progressBar","backupIsPreparing","initialize","restartWorker","window","clearTimeout","timeoutHandle","worker","BackupApi","BackupGetFilesList","cbAfterGetFiles","setTimeout","response","length","show","removeClass","hide","percentOfTotal","each","key","value","pid","id","attr","progress","total","duration","percent","parseInt","text","active","location","concat","globalRootUrl"],"sources":["src/backup-create-worker.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 12 2019\n *\n */\n\n/* global BackupApi, globalRootUrl */\n\nconst backupCreateWorker = {\n\ttimeOut: 5000,\n\ttimeOutHandle: '',\n\t$submitButton: $('#submitbutton'),\n\t$stopCreateBackup: $('#stopbackupbutton'),\n\twaitBackupId: '',\n\t$progressBar: $('#backup-progress-bar'),\n\tbackupIsPreparing: false,\n\tinitialize(waitBackupId) {\n\t\tbackupCreateWorker.waitBackupId = waitBackupId;\n\t\t// Запустим обновление статуса создания резервной копии\n\t\tbackupCreateWorker.restartWorker();\n\t},\n\trestartWorker() {\n\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\tbackupCreateWorker.worker();\n\t},\n\tworker() {\n\t\tBackupApi.BackupGetFilesList(backupCreateWorker.cbAfterGetFiles);\n\t\tbackupCreateWorker.timeoutHandle = window.setTimeout(\n\t\t\tbackupCreateWorker.worker,\n\t\t\tbackupCreateWorker.timeOut,\n\t\t);\n\t},\n\tcbAfterGetFiles(response) {\n\t\tif (response.length === 0 || response === false) {\n\t\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\t\tbackupCreateWorker.$submitButton.show();\n\t\t\tbackupCreateWorker.$submitButton.removeClass('loading');\n\t\t\tbackupCreateWorker.$stopCreateBackup.hide();\n\t\t} else {\n\t\t\t// [\"0\": {\n\t\t\t// \t\t\"date\": \"1530715058\",\n\t\t\t// \t\t\"size\": 13.66,\n\t\t\t// \t\t\"progress\": 10,\n\t\t\t// \t\t\"total\": 32,\n\t\t\t// \t\t\"config\": {\n\t\t\t// \t\t\t\"backup-config\": \"1\",\n\t\t\t// \t\t\t\"backup-records\": \"1\",\n\t\t\t// \t\t\t\"backup-cdr\": \"1\",\n\t\t\t// \t\t\t\"backup-sound-files\": \"1\"\n\t\t\t// \t\t},\n\t\t\t// \t\t\"pid\": \"\",\n\t\t\t// \t\t\"id\": \"backup_1530715058\"\n\t\t\t// }]\n\t\t\tlet percentOfTotal = 0;\n\t\t\t$.each(response, (key, value) => {\n\t\t\t\tif (backupCreateWorker.waitBackupId === '' && value.pid.length > 0) {\n\t\t\t\t\tbackupCreateWorker.waitBackupId = value.id;\n\t\t\t\t}\n\t\t\t\tif (backupCreateWorker.waitBackupId === value.id) {\n\t\t\t\t\tbackupCreateWorker.$submitButton.hide();\n\t\t\t\t\tbackupCreateWorker.$stopCreateBackup\n\t\t\t\t\t\t.attr('data-value', backupCreateWorker.waitBackupId)\n\t\t\t\t\t\t.show();\n\t\t\t\t\tpercentOfTotal = 100 * (value.progress / value.total);\n\n\t\t\t\t\tbackupCreateWorker.$progressBar.progress({\n\t\t\t\t\t\tduration: value.progress,\n\t\t\t\t\t\ttotal: value.total,\n\t\t\t\t\t\tpercent: parseInt(percentOfTotal, 10),\n\t\t\t\t\t\ttext: {\n\t\t\t\t\t\t\tactive: '{value} of {total} done',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (value.total === value.progress && backupCreateWorker.backupIsPreparing) {\n\t\t\t\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t\t\t\t}\n\t\t\t\t\tbackupCreateWorker.backupIsPreparing = (value.pid.length > 0);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (backupCreateWorker.backupIsPreparing === false) {\n\t\t\t\tbackupCreateWorker.$submitButton.show();\n\t\t\t\tbackupCreateWorker.$stopCreateBackup.hide();\n\t\t\t\tbackupCreateWorker.$submitButton.removeClass('loading');\n\t\t\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\t\t}\n\t\t}\n\t},\n};\n\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"backup-create-worker.js","names":["backupCreateWorker","timeOut","timeOutHandle","$submitButton","$","$stopCreateBackup","waitBackupId","$progressBar","backupIsPreparing","initialize","restartWorker","window","clearTimeout","timeoutHandle","worker","BackupApi","BackupGetFilesList","cbAfterGetFiles","setTimeout","response","length","show","removeClass","hide","percentOfTotal","each","key","value","pid","id","attr","total","progress","labelText","stage","concat","globalTranslate","bkp_PreparingFileList","percent","parseInt","find","text","location","globalRootUrl"],"sources":["src/backup-create-worker.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 12 2019\n *\n */\n\n/* global BackupApi, globalRootUrl, globalTranslate */\n\nconst backupCreateWorker = {\n\ttimeOut: 5000,\n\ttimeOutHandle: '',\n\t$submitButton: $('#submitbutton'),\n\t$stopCreateBackup: $('#stopbackupbutton'),\n\twaitBackupId: '',\n\t$progressBar: $('#backup-progress-bar'),\n\tbackupIsPreparing: false,\n\tinitialize(waitBackupId) {\n\t\tbackupCreateWorker.waitBackupId = waitBackupId;\n\t\t// Запустим обновление статуса создания резервной копии\n\t\tbackupCreateWorker.restartWorker();\n\t},\n\trestartWorker() {\n\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\tbackupCreateWorker.worker();\n\t},\n\tworker() {\n\t\tBackupApi.BackupGetFilesList(backupCreateWorker.cbAfterGetFiles);\n\t\tbackupCreateWorker.timeoutHandle = window.setTimeout(\n\t\t\tbackupCreateWorker.worker,\n\t\t\tbackupCreateWorker.timeOut,\n\t\t);\n\t},\n\tcbAfterGetFiles(response) {\n\t\tif (response.length === 0 || response === false) {\n\t\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\t\tbackupCreateWorker.$submitButton.show();\n\t\t\tbackupCreateWorker.$submitButton.removeClass('loading');\n\t\t\tbackupCreateWorker.$stopCreateBackup.hide();\n\t\t} else {\n\t\t\t// [\"0\": {\n\t\t\t// \t\t\"date\": \"1530715058\",\n\t\t\t// \t\t\"size\": 13.66,\n\t\t\t// \t\t\"progress\": 10,\n\t\t\t// \t\t\"total\": 32,\n\t\t\t// \t\t\"config\": {\n\t\t\t// \t\t\t\"backup-config\": \"1\",\n\t\t\t// \t\t\t\"backup-records\": \"1\",\n\t\t\t// \t\t\t\"backup-cdr\": \"1\",\n\t\t\t// \t\t\t\"backup-sound-files\": \"1\"\n\t\t\t// \t\t},\n\t\t\t// \t\t\"pid\": \"\",\n\t\t\t// \t\t\"id\": \"backup_1530715058\"\n\t\t\t// }]\n\t\t\tlet percentOfTotal = 0;\n\t\t\t$.each(response, (key, value) => {\n\t\t\t\tif (backupCreateWorker.waitBackupId === '' && value.pid.length > 0) {\n\t\t\t\t\tbackupCreateWorker.waitBackupId = value.id;\n\t\t\t\t}\n\t\t\t\tif (backupCreateWorker.waitBackupId === value.id) {\n\t\t\t\t\tbackupCreateWorker.$submitButton.hide();\n\t\t\t\t\tbackupCreateWorker.$stopCreateBackup\n\t\t\t\t\t\t.attr('data-value', backupCreateWorker.waitBackupId)\n\t\t\t\t\t\t.show();\n\t\t\t\t\tpercentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;\n\t\t\t\t\tconst labelText = value.stage === 'preparing'\n\t\t\t\t\t\t? `${globalTranslate.bkp_PreparingFileList}: ${value.progress} / ${value.total}`\n\t\t\t\t\t\t: `${value.progress} / ${value.total}`;\n\n\t\t\t\t\tbackupCreateWorker.$progressBar.progress({\n\t\t\t\t\t\ttotal: value.total,\n\t\t\t\t\t\tvalue: value.progress,\n\t\t\t\t\t\tpercent: parseInt(percentOfTotal, 10),\n\t\t\t\t\t});\n\t\t\t\t\tbackupCreateWorker.$progressBar.find('.label').text(labelText);\n\t\t\t\t\tif (value.total === value.progress\n\t\t\t\t\t\t&& value.stage !== 'preparing'\n\t\t\t\t\t\t&& backupCreateWorker.backupIsPreparing) {\n\t\t\t\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t\t\t\t}\n\t\t\t\t\tbackupCreateWorker.backupIsPreparing = (value.pid.length > 0);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (backupCreateWorker.backupIsPreparing === false) {\n\t\t\t\tbackupCreateWorker.$submitButton.show();\n\t\t\t\tbackupCreateWorker.$stopCreateBackup.hide();\n\t\t\t\tbackupCreateWorker.$submitButton.removeClass('loading');\n\t\t\t\twindow.clearTimeout(backupCreateWorker.timeoutHandle);\n\t\t\t}\n\t\t}\n\t},\n};\n\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/backup-index.js b/public/assets/js/backup-index.js
index cb6b331..2de65e1 100644
--- a/public/assets/js/backup-index.js
+++ b/public/assets/js/backup-index.js
@@ -124,7 +124,8 @@ var backupIndex = {
if (value.pid.length + value.pid_recover.length > 0) {
// Бекап в процессе.
var percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;
- $row.find('.status').html(" ".concat(parseInt(percentOfTotal, 10), " %"));
+ var stageLabel = value.stage === 'preparing' ? "".concat(globalTranslate.bkp_PreparingFileList, " ") : '';
+ $row.find('.status').html(" ".concat(stageLabel).concat(parseInt(percentOfTotal, 10), " %"));
// Кнопка стоп — обновляем только при создании или если кнопок нет.
if (isNew || $row.find('a.stop-backup').length === 0) {
var $actionsCell = $row.find('td').last();
@@ -251,4 +252,5 @@ var backupIndex = {
$(document).ready(function () {
backupIndex.initialize();
});
+
//# sourceMappingURL=backup-index.js.map
\ No newline at end of file
diff --git a/public/assets/js/backup-index.js.map b/public/assets/js/backup-index.js.map
index 16f146a..9bc43ae 100644
--- a/public/assets/js/backup-index.js.map
+++ b/public/assets/js/backup-index.js.map
@@ -1 +1 @@
-{"version":3,"file":"backup-index.js","names":["backupIndex","$templateRow","$","$dummy","$uploadButton","$progressBar","$progressBarLabel","find","$statusToggle","$body","resumable","initialize","checkStatusToggle","window","addEventListener","hide","on","e","preventDefault","id","target","closest","attr","BackupApi","BackupDownloadFile","cbAfterDownloadFile","BackupDeleteFile","cbAfterDeleteFile","BackupStop","cbAfterStopBackup","PbxApi","SystemUploadFileAttachToBtn","cbResumable","checkbox","removeClass","BackupGetFilesList","cbBackupGetFilesListAfterResponse","addClass","response","location","UserMessage","showError","globalTranslate","bkp_ErrorOnDownloadBackup","concat","globalRootUrl","show","length","needPolling","each","key","value","$row","isNew","clone","arhDate","Date","date","month","getMonth","day","getDate","hours","getHours","minutes","getMinutes","seconds","getSeconds","html","getFullYear","size","pid","pid_recover","percentOfTotal","total","progress","parseInt","$actionsCell","last","bkp_StopCreateBackup","$freshRow","index","obj","appendTo","setTimeout","idTable","DataTable","paging","searching","info","columns","orderable","type","action","params","isXML","file","undefined","checkStatusFileMerging","fileSizeMB","Math","round","api","url","onSuccess","data","freeSpaceMB","i","disk","mounted","indexOf","free_space","requiredMB","bkp_UploadError","text","bkp_UploadInProgress","percent","message","tryParseJSON","json","JSON","parse","fileID","upload_id","filePath","filename","mergingCheckWorker","document","ready"],"sources":["src/backup-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 12 2019\n *\n */\n\n/* global BackupApi, PbxApi, globalTranslate, Resumable, globalRootUrl, UserMessage, mergingCheckWorker */\n\nconst backupIndex = {\n\t$templateRow: $('#backup-template-row'),\n\t$dummy: $('#dummy-row'),\n\t$uploadButton: $('#uploadbtn'),\n\t$progressBar: $('#upload-progress-bar'),\n\t$progressBarLabel: $('#upload-progress-bar').find('.label'),\n\t$statusToggle: $('#module-status-toggle'),\n\t$body: $('body'),\n\tresumable: null,\n\tinitialize() {\n\t\tbackupIndex.checkStatusToggle();\n\t\twindow.addEventListener('ModuleStatusChanged', backupIndex.checkStatusToggle);\n\t\tbackupIndex.$progressBar.hide();\n\t\tbackupIndex.$body.on('click', 'a.download', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupDownloadFile(id,backupIndex.cbAfterDownloadFile);\n\t\t\t//window.location = `${BackupApi.backupDownloadFile}?id=${fileId}`;\n\t\t});\n\t\tbackupIndex.$body.on('click', 'a.delete', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupDeleteFile(id, backupIndex.cbAfterDeleteFile);\n\t\t});\n\t\tbackupIndex.$body.on('click', 'a.stop-backup', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupStop(id, backupIndex.cbAfterStopBackup);\n\t\t});\n\t\tPbxApi.SystemUploadFileAttachToBtn('uploadbtn',['img', 'zip', 'xml', 'csv', 'tar'], backupIndex.cbResumable);\n\t},\n\t/**\n\t * Изменение статуса кнопок при изменении статуса модуля\n\t */\n\tcheckStatusToggle() {\n\t\tif (backupIndex.$statusToggle.checkbox('is checked')) {\n\t\t\t$('.disability').removeClass('disabled');\n\t\t\tBackupApi.BackupGetFilesList(backupIndex.cbBackupGetFilesListAfterResponse);\n\t\t} else {\n\t\t\t$('.disability').addClass('disabled');\n\t\t}\n\t},\n\t/**\n\t * Коллбек перед скачиванием файла архива\n\t */\n\tcbAfterDownloadFile(response){\n\t\tif (response) {\n\t\t\twindow.location = response;\n\t\t} else {\n\t\t\tUserMessage.showError(globalTranslate.bkp_ErrorOnDownloadBackup)\n\t\t}\n\t},\n\t/**\n\t * Коллбек после удаления файла бекапа\n\t * @param response\n\t */\n\tcbAfterDeleteFile(response) {\n\t\tif (response) {\n\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t}\n\t},\n\t/**\n\t * Коллбек после остановки бекапа\n\t * @param response\n\t */\n\tcbAfterStopBackup(response) {\n\t\tif (response) {\n\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t}\n\t},\n\t/**\n\t * Обработка ответа BackupGetFilesList\n\t * @param response\n\t */\n\tcbBackupGetFilesListAfterResponse(response) {\n\t\tbackupIndex.$dummy.show();\n\t\tif (response.length === 0 || response === false) {\n\t\t\t// Нет данных — не опрашиваем бесконечно.\n\t\t\treturn;\n\t\t}\n\t\tbackupIndex.$dummy.hide();\n\t\tlet needPolling = false;\n\t\t$.each(response, (key, value) => {\n\t\t\tlet $row = $(`tr#${value.id}`);\n\t\t\tconst isNew = ($row.length === 0);\n\n\t\t\tif (isNew) {\n\t\t\t\t$row = backupIndex.$templateRow.clone();\n\t\t\t\t$row.attr('id', value.id);\n\t\t\t\t$row.addClass('backupIndex-file');\n\t\t\t}\n\n\t\t\t// Дата — обновляем только при создании строки.\n\t\t\tif (isNew) {\n\t\t\t\tconst arhDate = new Date(1000 * value.date);\n\t\t\t\tlet month = ''+(arhDate.getMonth()+1);\n\t\t\t\tlet day = ''+arhDate.getDate();\n\t\t\t\tif(month.length === 1) month = '0' + month;\n\t\t\t\tif(day.length === 1) day = '0' + day;\n\t\t\t\tlet hours = '' + arhDate.getHours();\n\t\t\t\tlet minutes = '' + arhDate.getMinutes();\n\t\t\t\tlet seconds = '' + arhDate.getSeconds();\n\t\t\t\tif (hours.length === 1) hours = '0' + hours;\n\t\t\t\tif (minutes.length === 1) minutes = '0' + minutes;\n\t\t\t\tif (seconds.length === 1) seconds = '0' + seconds;\n\t\t\t\t$row.find('.create-date').html(arhDate.getFullYear() + '.' + month + '.' + day + ' ' + hours + ':' + minutes + ':' + seconds);\n\t\t\t\t$row.find('.create-date').attr('data-order', value.date);\n\t\t\t\t$row.find('.create-date').attr('data-sort', value.date);\n\t\t\t}\n\n\t\t\t// Размер — обновляем всегда.\n\t\t\t$row.find('.file-size').html(`${value.size} MB`);\n\n\t\t\tif (value.pid.length + value.pid_recover.length > 0) {\n\t\t\t\t// Бекап в процессе.\n\t\t\t\tconst percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;\n\t\t\t\t$row.find('.status').html(` ${parseInt(percentOfTotal, 10)} %`);\n\t\t\t\t// Кнопка стоп — обновляем только при создании или если кнопок нет.\n\t\t\t\tif (isNew || $row.find('a.stop-backup').length === 0) {\n\t\t\t\t\tconst $actionsCell = $row.find('td').last();\n\t\t\t\t\t$actionsCell.html(\n\t\t\t\t\t\t``\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tneedPolling = true;\n\t\t\t} else if (isNew || $row.find('a.download').length === 0) {\n\t\t\t\t// Бекап завершён — устанавливаем кнопки действий.\n\t\t\t\t$row.find('.status').html('');\n\t\t\t\t// Восстанавливаем кнопки из шаблона.\n\t\t\t\tconst $freshRow = backupIndex.$templateRow.clone();\n\t\t\t\tconst $actionsCell = $row.find('td').last();\n\t\t\t\t$actionsCell.html($freshRow.find('td').last().html());\n\t\t\t\t$row.find('a').each((index, obj) => {\n\t\t\t\t\t$(obj).attr('href', $(obj).attr('href') + value.id);\n\t\t\t\t\t$(obj).attr('data-value', value.id);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (isNew) {\n\t\t\t\t$row.appendTo('#existing-backup-files-table');\n\t\t\t}\n\t\t});\n\n\t\tif (needPolling) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tBackupApi.BackupGetFilesList(backupIndex.cbBackupGetFilesListAfterResponse);\n\t\t\t}, 5000);\n\t\t}\n\n\t\tlet idTable = $('#existing-backup-files-table');\n\t\tif(idTable.attr('data-dt-init') !== '1'){\n\t\t\tidTable.DataTable({\n\t\t\t\t'order': [[ 1, 'dsc' ]],\n\t\t\t\tpaging: false,\n\t\t\t\tsearching: false,\n\t\t\t\tinfo: false,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{ orderable: false},\n\t\t\t\t\t{ type: 'date'},\n\t\t\t\t\tnull,\n\t\t\t\t\t{ orderable: false },\n\t\t\t\t]\n\t\t\t});\n\t\t\tidTable.attr('data-dt-init', '1');\n\t\t}\n\t},\n/**\n\t * Callback file upload with chunks\n\t * @param action\n\t * @param params\n\t */\n\tcbResumable(action, params){\n\t\tswitch (action) {\n\t\t\tcase 'fileSuccess':\n\t\t\t\tlet isXML = false;\n\t\t\t\tif (params.file.file !== undefined && params.file.file.type !== undefined) {\n\t\t\t\t\tisXML = params.file.file.type === 'text/xml';\n\t\t\t\t}\n\t\t\t\tbackupIndex.checkStatusFileMerging(params.response, isXML);\n\t\t\t\tbackupIndex.$uploadButton.removeClass('loading');\n\t\t\t\tbreak;\n\t\t\tcase 'fileAdded':\n\t\t\t\t// Проверяем свободное место перед загрузкой.\n\t\t\t\tif (params.file && params.file.file && params.file.file.size) {\n\t\t\t\t\tconst fileSizeMB = Math.round(params.file.file.size / 1024 / 1024);\n\t\t\t\t\t$.api({\n\t\t\t\t\t\turl: `${globalRootUrl}pbxcore/api/storage/list`,\n\t\t\t\t\t\ton: 'now',\n\t\t\t\t\t\tonSuccess(response) {\n\t\t\t\t\t\t\tif (response && response.data) {\n\t\t\t\t\t\t\t\tlet freeSpaceMB = 0;\n\t\t\t\t\t\t\t\t$.each(response.data, (i, disk) => {\n\t\t\t\t\t\t\t\t\tif (disk.mounted && disk.mounted.indexOf('/storage/') === 0) {\n\t\t\t\t\t\t\t\t\t\tfreeSpaceMB = parseInt(disk.free_space) || 0;\n\t\t\t\t\t\t\t\t\t\treturn false; // Берём первый storage-диск.\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst requiredMB = (fileSizeMB * 2) + 500;\n\t\t\t\t\t\t\t\tif (freeSpaceMB > 0 && freeSpaceMB < requiredMB) {\n\t\t\t\t\t\t\t\t\tUserMessage.showError(\n\t\t\t\t\t\t\t\t\t\t`${globalTranslate.bkp_UploadError}
` +\n\t\t\t\t\t\t\t\t\t\t`Free: ${freeSpaceMB} MB, required: ${requiredMB} MB`\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'uploadStart':\n\t\t\t\tbackupIndex.$uploadButton.addClass('loading');\n\t\t\t\tbackupIndex.$progressBar.show();\n\t\t\t\tbackupIndex.$progressBarLabel.text(globalTranslate.bkp_UploadInProgress);\n\t\t\t\tbreak;\n\t\t\tcase 'progress':\n\t\t\t\tbackupIndex.$progressBar.progress({\n\t\t\t\t\tpercent: params.percent,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\tbackupIndex.$progressBarLabel.text(globalTranslate.bkp_UploadError);\n\t\t\t\tbackupIndex.$uploadButton.removeClass('loading');\n\t\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}
${params.message}`);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\n\n\t\t}\n\t},\n\t/**\n\t * Запуск процесса ожидания склеивания файла после загрузки на сервер\n\t *\n\t * @param response ответ функции /pbxcore/api/upload/status\n\t */\n\tcheckStatusFileMerging(response, isXML) {\n\t\tif (response === undefined || BackupApi.tryParseJSON(response) === false) {\n\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}`);\n\t\t\treturn;\n\t\t}\n\t\tconst json = JSON.parse(response);\n\t\tif (json === undefined || json.data === undefined) {\n\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}`);\n\t\t\treturn;\n\t\t}\n\t\tconst fileID = json.data.upload_id;\n\t\tconst filePath = json.data.filename;\n\t\tmergingCheckWorker.initialize(fileID, filePath, isXML);\n\t},\n\n};\n\n\n$(document).ready(() => {\n\tbackupIndex.initialize();\n});\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"backup-index.js","names":["backupIndex","$templateRow","$","$dummy","$uploadButton","$progressBar","$progressBarLabel","find","$statusToggle","$body","resumable","initialize","checkStatusToggle","window","addEventListener","hide","on","e","preventDefault","id","target","closest","attr","BackupApi","BackupDownloadFile","cbAfterDownloadFile","BackupDeleteFile","cbAfterDeleteFile","BackupStop","cbAfterStopBackup","PbxApi","SystemUploadFileAttachToBtn","cbResumable","checkbox","removeClass","BackupGetFilesList","cbBackupGetFilesListAfterResponse","addClass","response","location","UserMessage","showError","globalTranslate","bkp_ErrorOnDownloadBackup","concat","globalRootUrl","show","length","needPolling","each","key","value","$row","isNew","clone","arhDate","Date","date","month","getMonth","day","getDate","hours","getHours","minutes","getMinutes","seconds","getSeconds","html","getFullYear","size","pid","pid_recover","percentOfTotal","total","progress","stageLabel","stage","bkp_PreparingFileList","parseInt","$actionsCell","last","bkp_StopCreateBackup","$freshRow","index","obj","appendTo","setTimeout","idTable","DataTable","paging","searching","info","columns","orderable","type","action","params","isXML","file","undefined","checkStatusFileMerging","fileSizeMB","Math","round","api","url","onSuccess","data","freeSpaceMB","i","disk","mounted","indexOf","free_space","requiredMB","bkp_UploadError","text","bkp_UploadInProgress","percent","message","tryParseJSON","json","JSON","parse","fileID","upload_id","filePath","filename","mergingCheckWorker","document","ready"],"sources":["src/backup-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 12 2019\n *\n */\n\n/* global BackupApi, PbxApi, globalTranslate, Resumable, globalRootUrl, UserMessage, mergingCheckWorker */\n\nconst backupIndex = {\n\t$templateRow: $('#backup-template-row'),\n\t$dummy: $('#dummy-row'),\n\t$uploadButton: $('#uploadbtn'),\n\t$progressBar: $('#upload-progress-bar'),\n\t$progressBarLabel: $('#upload-progress-bar').find('.label'),\n\t$statusToggle: $('#module-status-toggle'),\n\t$body: $('body'),\n\tresumable: null,\n\tinitialize() {\n\t\tbackupIndex.checkStatusToggle();\n\t\twindow.addEventListener('ModuleStatusChanged', backupIndex.checkStatusToggle);\n\t\tbackupIndex.$progressBar.hide();\n\t\tbackupIndex.$body.on('click', 'a.download', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupDownloadFile(id,backupIndex.cbAfterDownloadFile);\n\t\t\t//window.location = `${BackupApi.backupDownloadFile}?id=${fileId}`;\n\t\t});\n\t\tbackupIndex.$body.on('click', 'a.delete', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupDeleteFile(id, backupIndex.cbAfterDeleteFile);\n\t\t});\n\t\tbackupIndex.$body.on('click', 'a.stop-backup', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst id = $(e.target).closest('a').attr('data-value');\n\t\t\tBackupApi.BackupStop(id, backupIndex.cbAfterStopBackup);\n\t\t});\n\t\tPbxApi.SystemUploadFileAttachToBtn('uploadbtn',['img', 'zip', 'xml', 'csv', 'tar'], backupIndex.cbResumable);\n\t},\n\t/**\n\t * Изменение статуса кнопок при изменении статуса модуля\n\t */\n\tcheckStatusToggle() {\n\t\tif (backupIndex.$statusToggle.checkbox('is checked')) {\n\t\t\t$('.disability').removeClass('disabled');\n\t\t\tBackupApi.BackupGetFilesList(backupIndex.cbBackupGetFilesListAfterResponse);\n\t\t} else {\n\t\t\t$('.disability').addClass('disabled');\n\t\t}\n\t},\n\t/**\n\t * Коллбек перед скачиванием файла архива\n\t */\n\tcbAfterDownloadFile(response){\n\t\tif (response) {\n\t\t\twindow.location = response;\n\t\t} else {\n\t\t\tUserMessage.showError(globalTranslate.bkp_ErrorOnDownloadBackup)\n\t\t}\n\t},\n\t/**\n\t * Коллбек после удаления файла бекапа\n\t * @param response\n\t */\n\tcbAfterDeleteFile(response) {\n\t\tif (response) {\n\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t}\n\t},\n\t/**\n\t * Коллбек после остановки бекапа\n\t * @param response\n\t */\n\tcbAfterStopBackup(response) {\n\t\tif (response) {\n\t\t\twindow.location = `${globalRootUrl}module-backup/index`;\n\t\t}\n\t},\n\t/**\n\t * Обработка ответа BackupGetFilesList\n\t * @param response\n\t */\n\tcbBackupGetFilesListAfterResponse(response) {\n\t\tbackupIndex.$dummy.show();\n\t\tif (response.length === 0 || response === false) {\n\t\t\t// Нет данных — не опрашиваем бесконечно.\n\t\t\treturn;\n\t\t}\n\t\tbackupIndex.$dummy.hide();\n\t\tlet needPolling = false;\n\t\t$.each(response, (key, value) => {\n\t\t\tlet $row = $(`tr#${value.id}`);\n\t\t\tconst isNew = ($row.length === 0);\n\n\t\t\tif (isNew) {\n\t\t\t\t$row = backupIndex.$templateRow.clone();\n\t\t\t\t$row.attr('id', value.id);\n\t\t\t\t$row.addClass('backupIndex-file');\n\t\t\t}\n\n\t\t\t// Дата — обновляем только при создании строки.\n\t\t\tif (isNew) {\n\t\t\t\tconst arhDate = new Date(1000 * value.date);\n\t\t\t\tlet month = ''+(arhDate.getMonth()+1);\n\t\t\t\tlet day = ''+arhDate.getDate();\n\t\t\t\tif(month.length === 1) month = '0' + month;\n\t\t\t\tif(day.length === 1) day = '0' + day;\n\t\t\t\tlet hours = '' + arhDate.getHours();\n\t\t\t\tlet minutes = '' + arhDate.getMinutes();\n\t\t\t\tlet seconds = '' + arhDate.getSeconds();\n\t\t\t\tif (hours.length === 1) hours = '0' + hours;\n\t\t\t\tif (minutes.length === 1) minutes = '0' + minutes;\n\t\t\t\tif (seconds.length === 1) seconds = '0' + seconds;\n\t\t\t\t$row.find('.create-date').html(arhDate.getFullYear() + '.' + month + '.' + day + ' ' + hours + ':' + minutes + ':' + seconds);\n\t\t\t\t$row.find('.create-date').attr('data-order', value.date);\n\t\t\t\t$row.find('.create-date').attr('data-sort', value.date);\n\t\t\t}\n\n\t\t\t// Размер — обновляем всегда.\n\t\t\t$row.find('.file-size').html(`${value.size} MB`);\n\n\t\t\tif (value.pid.length + value.pid_recover.length > 0) {\n\t\t\t\t// Бекап в процессе.\n\t\t\t\tconst percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;\n\t\t\t\tconst stageLabel = value.stage === 'preparing'\n\t\t\t\t\t? `${globalTranslate.bkp_PreparingFileList} `\n\t\t\t\t\t: '';\n\t\t\t\t$row.find('.status').html(` ${stageLabel}${parseInt(percentOfTotal, 10)} %`);\n\t\t\t\t// Кнопка стоп — обновляем только при создании или если кнопок нет.\n\t\t\t\tif (isNew || $row.find('a.stop-backup').length === 0) {\n\t\t\t\t\tconst $actionsCell = $row.find('td').last();\n\t\t\t\t\t$actionsCell.html(\n\t\t\t\t\t\t``\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tneedPolling = true;\n\t\t\t} else if (isNew || $row.find('a.download').length === 0) {\n\t\t\t\t// Бекап завершён — устанавливаем кнопки действий.\n\t\t\t\t$row.find('.status').html('');\n\t\t\t\t// Восстанавливаем кнопки из шаблона.\n\t\t\t\tconst $freshRow = backupIndex.$templateRow.clone();\n\t\t\t\tconst $actionsCell = $row.find('td').last();\n\t\t\t\t$actionsCell.html($freshRow.find('td').last().html());\n\t\t\t\t$row.find('a').each((index, obj) => {\n\t\t\t\t\t$(obj).attr('href', $(obj).attr('href') + value.id);\n\t\t\t\t\t$(obj).attr('data-value', value.id);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (isNew) {\n\t\t\t\t$row.appendTo('#existing-backup-files-table');\n\t\t\t}\n\t\t});\n\n\t\tif (needPolling) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tBackupApi.BackupGetFilesList(backupIndex.cbBackupGetFilesListAfterResponse);\n\t\t\t}, 5000);\n\t\t}\n\n\t\tlet idTable = $('#existing-backup-files-table');\n\t\tif(idTable.attr('data-dt-init') !== '1'){\n\t\t\tidTable.DataTable({\n\t\t\t\t'order': [[ 1, 'dsc' ]],\n\t\t\t\tpaging: false,\n\t\t\t\tsearching: false,\n\t\t\t\tinfo: false,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{ orderable: false},\n\t\t\t\t\t{ type: 'date'},\n\t\t\t\t\tnull,\n\t\t\t\t\t{ orderable: false },\n\t\t\t\t]\n\t\t\t});\n\t\t\tidTable.attr('data-dt-init', '1');\n\t\t}\n\t},\n/**\n\t * Callback file upload with chunks\n\t * @param action\n\t * @param params\n\t */\n\tcbResumable(action, params){\n\t\tswitch (action) {\n\t\t\tcase 'fileSuccess':\n\t\t\t\tlet isXML = false;\n\t\t\t\tif (params.file.file !== undefined && params.file.file.type !== undefined) {\n\t\t\t\t\tisXML = params.file.file.type === 'text/xml';\n\t\t\t\t}\n\t\t\t\tbackupIndex.checkStatusFileMerging(params.response, isXML);\n\t\t\t\tbackupIndex.$uploadButton.removeClass('loading');\n\t\t\t\tbreak;\n\t\t\tcase 'fileAdded':\n\t\t\t\t// Проверяем свободное место перед загрузкой.\n\t\t\t\tif (params.file && params.file.file && params.file.file.size) {\n\t\t\t\t\tconst fileSizeMB = Math.round(params.file.file.size / 1024 / 1024);\n\t\t\t\t\t$.api({\n\t\t\t\t\t\turl: `${globalRootUrl}pbxcore/api/storage/list`,\n\t\t\t\t\t\ton: 'now',\n\t\t\t\t\t\tonSuccess(response) {\n\t\t\t\t\t\t\tif (response && response.data) {\n\t\t\t\t\t\t\t\tlet freeSpaceMB = 0;\n\t\t\t\t\t\t\t\t$.each(response.data, (i, disk) => {\n\t\t\t\t\t\t\t\t\tif (disk.mounted && disk.mounted.indexOf('/storage/') === 0) {\n\t\t\t\t\t\t\t\t\t\tfreeSpaceMB = parseInt(disk.free_space) || 0;\n\t\t\t\t\t\t\t\t\t\treturn false; // Берём первый storage-диск.\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst requiredMB = (fileSizeMB * 2) + 500;\n\t\t\t\t\t\t\t\tif (freeSpaceMB > 0 && freeSpaceMB < requiredMB) {\n\t\t\t\t\t\t\t\t\tUserMessage.showError(\n\t\t\t\t\t\t\t\t\t\t`${globalTranslate.bkp_UploadError}
` +\n\t\t\t\t\t\t\t\t\t\t`Free: ${freeSpaceMB} MB, required: ${requiredMB} MB`\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'uploadStart':\n\t\t\t\tbackupIndex.$uploadButton.addClass('loading');\n\t\t\t\tbackupIndex.$progressBar.show();\n\t\t\t\tbackupIndex.$progressBarLabel.text(globalTranslate.bkp_UploadInProgress);\n\t\t\t\tbreak;\n\t\t\tcase 'progress':\n\t\t\t\tbackupIndex.$progressBar.progress({\n\t\t\t\t\tpercent: params.percent,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\tbackupIndex.$progressBarLabel.text(globalTranslate.bkp_UploadError);\n\t\t\t\tbackupIndex.$uploadButton.removeClass('loading');\n\t\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}
${params.message}`);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\n\n\t\t}\n\t},\n\t/**\n\t * Запуск процесса ожидания склеивания файла после загрузки на сервер\n\t *\n\t * @param response ответ функции /pbxcore/api/upload/status\n\t */\n\tcheckStatusFileMerging(response, isXML) {\n\t\tif (response === undefined || BackupApi.tryParseJSON(response) === false) {\n\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}`);\n\t\t\treturn;\n\t\t}\n\t\tconst json = JSON.parse(response);\n\t\tif (json === undefined || json.data === undefined) {\n\t\t\tUserMessage.showError(`${globalTranslate.bkp_UploadError}`);\n\t\t\treturn;\n\t\t}\n\t\tconst fileID = json.data.upload_id;\n\t\tconst filePath = json.data.filename;\n\t\tmergingCheckWorker.initialize(fileID, filePath, isXML);\n\t},\n\n};\n\n\n$(document).ready(() => {\n\tbackupIndex.initialize();\n});\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/src/backup-create-worker.js b/public/assets/js/src/backup-create-worker.js
index c56df12..7b80303 100644
--- a/public/assets/js/src/backup-create-worker.js
+++ b/public/assets/js/src/backup-create-worker.js
@@ -6,7 +6,7 @@
*
*/
-/* global BackupApi, globalRootUrl */
+/* global BackupApi, globalRootUrl, globalTranslate */
const backupCreateWorker = {
timeOut: 5000,
@@ -63,17 +63,20 @@ const backupCreateWorker = {
backupCreateWorker.$stopCreateBackup
.attr('data-value', backupCreateWorker.waitBackupId)
.show();
- percentOfTotal = 100 * (value.progress / value.total);
+ percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;
+ const labelText = value.stage === 'preparing'
+ ? `${globalTranslate.bkp_PreparingFileList}: ${value.progress} / ${value.total}`
+ : `${value.progress} / ${value.total}`;
backupCreateWorker.$progressBar.progress({
- duration: value.progress,
total: value.total,
+ value: value.progress,
percent: parseInt(percentOfTotal, 10),
- text: {
- active: '{value} of {total} done',
- },
});
- if (value.total === value.progress && backupCreateWorker.backupIsPreparing) {
+ backupCreateWorker.$progressBar.find('.label').text(labelText);
+ if (value.total === value.progress
+ && value.stage !== 'preparing'
+ && backupCreateWorker.backupIsPreparing) {
window.location = `${globalRootUrl}module-backup/index`;
}
backupCreateWorker.backupIsPreparing = (value.pid.length > 0);
diff --git a/public/assets/js/src/backup-index.js b/public/assets/js/src/backup-index.js
index 7cbe652..944efb5 100644
--- a/public/assets/js/src/backup-index.js
+++ b/public/assets/js/src/backup-index.js
@@ -124,7 +124,10 @@ const backupIndex = {
if (value.pid.length + value.pid_recover.length > 0) {
// Бекап в процессе.
const percentOfTotal = value.total > 0 ? 100 * (value.progress / value.total) : 0;
- $row.find('.status').html(` ${parseInt(percentOfTotal, 10)} %`);
+ const stageLabel = value.stage === 'preparing'
+ ? `${globalTranslate.bkp_PreparingFileList} `
+ : '';
+ $row.find('.status').html(` ${stageLabel}${parseInt(percentOfTotal, 10)} %`);
// Кнопка стоп — обновляем только при создании или если кнопок нет.
if (isNew || $row.find('a.stop-backup').length === 0) {
const $actionsCell = $row.find('td').last();