diff --git a/components/form.php b/components/form.php
index 9adedbd..63be154 100644
--- a/components/form.php
+++ b/components/form.php
@@ -1,5 +1,6 @@
', require __DIR__ . '/navigation-guard.php', '';
echo '';
@@ -20,7 +21,7 @@ $basePickerAccept = 'image/jpeg,image/png,image/gif,image/webp,image/bmp,image/a
- = Yii::t('app', 'Улучшить изображение') ?>
+ = Yii::t('app', 'ИИ улучшение изображений') ?>
= Yii::t('app', 'Поддерживаемые форматы') ?>:
@@ -242,9 +243,9 @@ $basePickerAccept = 'image/jpeg,image/png,image/gif,image/webp,image/bmp,image/a
catch (_) { showUploadError(genericErrorMsg); }
return;
}
- showUploadError(genericErrorMsg);
+ showUploadError(genericErrorMsg, false, xhr.status === 408 || xhr.status >= 500);
};
- xhr.onerror = () => { if (attempt === uploadAttempt && !leavingUploadPage) showUploadError(genericErrorMsg, true); };
+ xhr.onerror = () => { if (attempt === uploadAttempt && !leavingUploadPage) showUploadError(genericErrorMsg, true, true); };
xhr.send(formData);
} catch (_) { if (attempt === uploadAttempt && !leavingUploadPage) showUploadError(genericErrorMsg); }
}
@@ -308,33 +309,27 @@ $basePickerAccept = 'image/jpeg,image/png,image/gif,image/webp,image/bmp,image/a
try { await recovery.accepted({id: imageId}); redirectToTour(record); }
catch (_) { showUploadError(genericErrorMsg); }
} else {
- showUploadError(genericErrorMsg);
+ showUploadError(genericErrorMsg, false, xhr.status === 408 || xhr.status >= 500);
}
};
xhr.onerror = () => {
- if (attempt === uploadAttempt && !leavingUploadPage) showUploadError(genericErrorMsg, true);
+ if (attempt === uploadAttempt && !leavingUploadPage) showUploadError(genericErrorMsg, true, true);
};
xhr.send(formData);
}
- function showUploadError(msg, keepRecovery = false) {
+ function showUploadError(msg, keepRecovery = false, connection = false) {
if (leavingUploadPage) return;
uploadAttempt++;
if (!keepRecovery) clearRecovery();
resetUploadPending();
form.show();
- if (typeof preview !== 'undefined' && preview) {
- preview.show(); preview.showError(msg);
- if (!preview.sourceEl.getAttribute('src')) preview.sourceEl.style.display = 'none';
- }
- // Release sentinel восстанавливает scroll history. Показываем сообщение
- // после этого перехода, иначе браузер тут же возвращает верх страницы.
- window.PublicNavigationGuard.allowNavigation(() => requestAnimationFrame(() => {
- if (typeof preview !== 'undefined' && preview) preview.upscaleErrorOverlay.scrollIntoView({block: 'center', behavior: 'instant'});
- }));
fileInput.value = '';
+ window.PublicNavigationGuard.allowNavigation(() => {
+ window.ZoomzillaUploadError.show(msg, connection);
+ });
}
window.addEventListener('pagehide', () => { leavingUploadPage = true; });
window.addEventListener('pageshow', event => {
diff --git a/components/upload-error.php b/components/upload-error.php
new file mode 100644
index 0000000..9724c6f
--- /dev/null
+++ b/components/upload-error.php
@@ -0,0 +1,59 @@
+ Yii::t('app', 'Ошибка связи'),
+ 'network' => Yii::t('app', 'Не удалось загрузить изображение. Проверьте подключение к интернету и попробуйте ещё раз.'),
+ 'other' => Yii::t('app', 'Не удалось загрузить изображение'),
+ 'fallback' => Yii::t('app', 'Попробуйте ещё раз.'),
+], JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
+?>
+
+
+
diff --git a/components/upload-picker-style.php b/components/upload-picker-style.php
index 0bae544..db0c746 100644
--- a/components/upload-picker-style.php
+++ b/components/upload-picker-style.php
@@ -18,4 +18,8 @@ return <<<'CSS'
#dropzone-form [data-files-picker]::after { content: ''; position: absolute; inset: 0 -8px -14px; }
:is(#dropzone-form[data-mobile-upload], html[data-upload-device="mobile"] #dropzone-form, html[data-upload-device="android"] #dropzone-form) .dropzone-form-format-item[data-format-optional] { display: none; }
html[data-upload-device=android] #dropzone-form [data-picker-or][hidden], html[data-upload-device=android] #dropzone-form [data-files-picker][hidden] { display: block !important; }
+/* api#320: однострочный заголовок; правило общее для API и Preland, включая Android picker. */
+@media(max-width:767.98px){
+ .index-mobile-fit #dropzone-form #form-title.index-upload-heading{font-size:clamp(16px,5.2vw,22px);font-weight:400;line-height:1.25;white-space:nowrap}
+}
CSS;
diff --git a/tests/check-index-copy.php b/tests/check-index-copy.php
index 2b02475..4c797bd 100644
--- a/tests/check-index-copy.php
+++ b/tests/check-index-copy.php
@@ -8,7 +8,7 @@ ob_start();
require dirname(__DIR__) . '/components/form.php';
$html = ob_get_clean();
$expected = [
- '/id="form-title"[^>]*>(.*?)<\/div>/s' => 'Улучшить изображение',
+ '/id="form-title"[^>]*>(.*?)<\/div>/s' => 'ИИ улучшение изображений',
'/data-upload-label>(.*?)<\/span>/s' => 'Выберите фото',
'/data-files-picker hidden>(.*?)<\/a>/s' => 'Файлы (PDF и др.)',
];