From f30742c2fbabdfbcb03c649d7c1e7b718b097ed3 Mon Sep 17 00:00:00 2001 From: Panfilov Konstantin Date: Sat, 24 Oct 2026 10:59:20 +0300 Subject: [PATCH] =?UTF-8?q?preland#18=20#19:=20popup=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=BE=D0=B4=D0=BD=D0=BE=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D0=98=D0=98-=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/form.php | 25 +++++-------- components/upload-error.php | 59 ++++++++++++++++++++++++++++++ components/upload-picker-style.php | 4 ++ tests/check-index-copy.php | 2 +- 4 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 components/upload-error.php 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
-
+
:
@@ -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 и др.)', ];