fix(profile): match account submit buttons

This commit is contained in:
2026-10-05 19:54:00 +08:00
parent 0a52bf36f9
commit 0cf4639d95
4 changed files with 52 additions and 53 deletions
+1 -14
View File
@@ -647,7 +647,7 @@
position: relative;
z-index: 0;
margin-top: 120px;
padding: 18px 15px 0;
padding: 18px 15px;
}
.aksrt-settings-modal__fields { padding: 0 2px; }
@@ -685,19 +685,6 @@
.aksrt-settings-modal .pwd-strength__text.level-medium { color: var(--color-warning, #f59e0b); }
.aksrt-settings-modal .pwd-strength__text.level-strong { color: var(--color-success, #10b981); }
.aksrt-settings-modal .aksrt-captcha-wrap { margin: 12px 0 8px; }
.aksrt-settings-modal__footer {
margin: 0 -15px;
padding: 12px 15px 15px;
border-top: 1px solid var(--main-border-color, var(--color-line, rgba(50, 50, 50, .12)));
border-radius: 0 0 var(--main-radius, 8px) var(--main-radius, 8px);
}
.aksrt-settings-modal__footer > .but {
display: block;
width: 100%;
min-height: 46px;
margin: 0;
}
.aksrt-settings-modal__footer > .but:disabled { opacity: .5; cursor: wait; }
@media (max-width: 768px) {
.aksrt-modal-runtime.aksrt-user-settings-modal.aksrt-modal-runtime--bottom .aksrt-modal-runtime__dialog {
+43 -36
View File
@@ -40,6 +40,11 @@
if (window.AKSRTCaptcha) window.AKSRTCaptcha.reset(scene, scope);
}
function setSettingsSubmitLabel(button, text) {
var label = button && button.querySelector('[data-aksrt-settings-submit-label]');
if (label) label.textContent = text;
}
/* ==================== Dashboard 导航 ==================== */
function initDashboardNavigation() {
if (document.documentElement.dataset.aksrtUserCenterNavigationInitialized === 'true') return;
@@ -907,7 +912,8 @@
fm.addEventListener('submit', function(e) {
e.preventDefault();
var btn = fm.querySelector('[type=submit]');
var orig = btn ? btn.textContent : '';
var submitLabel = btn && btn.querySelector('[data-aksrt-settings-submit-label]');
var orig = submitLabel ? submitLabel.textContent : '';
var toastId = fid === 'pwd-form'
? 'aksrt-settings-password-toast'
: 'aksrt-settings-email-toast';
@@ -924,40 +930,40 @@
return;
}
}
if (btn) { btn.disabled = true; btn.textContent = i18n.submitting || '提交中...'; }
notyf(i18n.submitting || '正在提交…', 'load', '', toastId);
var scene = fid === 'pwd-form' ? 'change_password' : 'change_email';
runCaptcha(scene, fm).then(function(captchaPayload) {
if (captchaPayload === null) {
if (btn) { btn.disabled = false; btn.textContent = orig; }
return null;
}
if (container.dataset && container.dataset.aksrtSettingsModalClosed === 'true') return null;
var modalShell = fm.closest('.aksrt-user-settings-modal');
if (modalShell && modalShell.dataset.aksrtSettingsModalClosed === 'true') return null;
var d = new FormData(fm);
d.set('action', act);
d.set('_settings_nonce', settingsNonce);
Object.keys(captchaPayload || {}).forEach(function(key) { d.set(key, captchaPayload[key]); });
return fetch(ajaxUrl, { method: 'POST', credentials: 'same-origin', body: d });
})
if (btn) { btn.disabled = true; setSettingsSubmitLabel(btn, i18n.submitting || '提交中...'); }
notyf(i18n.submitting || '正在提交…', 'load', '', toastId);
var scene = fid === 'pwd-form' ? 'change_password' : 'change_email';
runCaptcha(scene, fm).then(function(captchaPayload) {
if (captchaPayload === null) {
if (btn) { btn.disabled = false; setSettingsSubmitLabel(btn, orig); }
return null;
}
if (container.dataset && container.dataset.aksrtSettingsModalClosed === 'true') return null;
var modalShell = fm.closest('.aksrt-user-settings-modal');
if (modalShell && modalShell.dataset.aksrtSettingsModalClosed === 'true') return null;
var d = new FormData(fm);
d.set('action', act);
d.set('_settings_nonce', settingsNonce);
Object.keys(captchaPayload || {}).forEach(function(key) { d.set(key, captchaPayload[key]); });
return fetch(ajaxUrl, { method: 'POST', credentials: 'same-origin', body: d });
})
.then(function(r) { return r ? r.json() : null; })
.then(function(r) {
if (!r) return;
if (btn) { btn.disabled = false; btn.textContent = orig; }
if (r.success) {
notyf((r.data && r.data.message) || '操作成功', 'success', 5, toastId);
var activeModal = window.AksrtModalRuntime && window.AksrtModalRuntime.getActive();
if (activeModal && activeModal.classList.contains('aksrt-user-settings-modal') && activeModal.contains(fm)) {
window.AksrtModalRuntime.close('settings-submit');
if (btn) { btn.disabled = false; setSettingsSubmitLabel(btn, orig); }
if (r.success) {
notyf((r.data && r.data.message) || '操作成功', 'success', 5, toastId);
var activeModal = window.AksrtModalRuntime && window.AksrtModalRuntime.getActive();
if (activeModal && activeModal.classList.contains('aksrt-user-settings-modal') && activeModal.contains(fm)) {
window.AksrtModalRuntime.close('settings-submit');
}
if (r.data && r.data.redirect_to) setTimeout(function() { window.location.href = r.data.redirect_to; }, 2500);
} else {
notyf((r.data && r.data.message) || i18n.operationFailed || '操作失败', 'danger', 5, toastId);
}
if (r.data && r.data.redirect_to) setTimeout(function() { window.location.href = r.data.redirect_to; }, 2500);
} else {
notyf((r.data && r.data.message) || i18n.operationFailed || '操作失败', 'danger', 5, toastId);
}
})
})
.catch(function() {
if (btn) { btn.disabled = false; btn.textContent = orig; }
if (btn) { btn.disabled = false; setSettingsSubmitLabel(btn, orig); }
notyf(i18n.networkError || '网络错误', 'danger', 5, toastId);
})
.finally(function() {
@@ -1207,10 +1213,11 @@
return;
}
var submitBtn = form.querySelector('[type="submit"]');
var submitIdleText = submitBtn ? submitBtn.textContent : '';
var submitLabel = submitBtn && submitBtn.querySelector('[data-aksrt-settings-submit-label]');
var submitIdleText = submitLabel ? submitLabel.textContent : '';
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.textContent = '绑定中...';
submitBtn.disabled = true;
setSettingsSubmitLabel(submitBtn, '绑定中...');
}
function doBind(captcha) {
var toastId = 'aksrt-settings-phone-bind-toast';
@@ -1240,14 +1247,14 @@
notyf((res.json && (res.json.message || res.json.error)) || '绑定失败', 'danger', 5, toastId);
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.textContent = submitIdleText;
setSettingsSubmitLabel(submitBtn, submitIdleText);
}
})
.catch(function () {
notyf('网络错误', 'danger', 5, toastId);
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.textContent = '确认绑定';
setSettingsSubmitLabel(submitBtn, submitIdleText);
}
});
}
@@ -1255,7 +1262,7 @@
if (captchaPayload === null) {
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.textContent = submitIdleText;
setSettingsSubmitLabel(submitBtn, submitIdleText);
}
return null;
}
@@ -97,7 +97,7 @@ $render_row = static function (string $icon, string $title, string $value, strin
<div class="modal-field modal-field--code"><label for="pwd-code"><?php esc_html_e('当前邮箱验证码', 'aksrt'); ?></label><div class="code-input-group"><input type="text" id="pwd-code" name="email_code" maxlength="6" inputmode="numeric" pattern="[0-9]*" placeholder="<?php esc_attr_e('6位数字验证码', 'aksrt'); ?>" required><button type="button" class="but hollow code-send-btn" id="pwd-send-code"><?php esc_html_e('发送到当前邮箱', 'aksrt'); ?></button></div></div>
<?php aksrt_render_captcha('change_password'); ?>
</div>
<div class="aksrt-settings-modal__footer"><button type="submit" class="but jb-blue padding-lg btn-block" id="pwd-submit"><?php esc_html_e('确认修改', 'aksrt'); ?></button></div>
<button type="submit" class="but jb-blue padding-lg btn-block" id="pwd-submit"><i class="fa fas fa-check" aria-hidden="true"></i> <span data-aksrt-settings-submit-label><?php esc_html_e('确认提交', 'aksrt'); ?></span></button>
</form>
</div>
</template>
@@ -117,7 +117,7 @@ $render_row = static function (string $icon, string $title, string $value, strin
<div class="modal-field modal-field--code"><label for="email-code"><?php esc_html_e('新邮箱验证码', 'aksrt'); ?></label><div class="code-input-group"><input type="text" id="email-code" name="email_code" maxlength="6" inputmode="numeric" pattern="[0-9]*" placeholder="<?php esc_attr_e('6位数字验证码', 'aksrt'); ?>" required><button type="button" class="but hollow code-send-btn" id="email-send-code"><?php esc_html_e('发送到新邮箱', 'aksrt'); ?></button></div><p class="settings-hint settings-hint--bottom"><?php esc_html_e('验证码将发送到你填写的新邮箱,验证通过后才会正式切换。', 'aksrt'); ?></p></div>
<?php aksrt_render_captcha('change_email'); ?>
</div>
<div class="aksrt-settings-modal__footer"><button type="submit" class="but jb-blue padding-lg btn-block" id="email-submit"><?php echo esc_html($account_email !== '' ? __('确认更改', 'aksrt') : __('确认绑定', 'aksrt')); ?></button></div>
<button type="submit" class="but jb-blue padding-lg btn-block" id="email-submit"><i class="fa fas fa-check" aria-hidden="true"></i> <span data-aksrt-settings-submit-label><?php esc_html_e('确认提交', 'aksrt'); ?></span></button>
</form>
</div>
</template>
@@ -136,7 +136,7 @@ $render_row = static function (string $icon, string $title, string $value, strin
<div class="modal-field modal-field--code"><label for="bind-phone-code"><?php esc_html_e('短信验证码', 'aksrt'); ?></label><div class="code-input-group"><input type="text" id="bind-phone-code" name="code" maxlength="6" inputmode="numeric" autocomplete="one-time-code" required placeholder="<?php esc_attr_e('请输入验证码', 'aksrt'); ?>"><button type="button" class="but hollow code-send-btn" data-aksrt-sms-trigger data-aksrt-sms-scene="bind_phone" data-aksrt-sms-phone="#bind-phone-input"><?php esc_html_e('获取验证码', 'aksrt'); ?></button></div></div>
<?php if (function_exists('aksrt_render_captcha')) : ?><?php aksrt_render_captcha('bind_phone'); ?><?php endif; ?>
</div>
<div class="aksrt-settings-modal__footer"><button type="submit" class="but jb-blue padding-lg btn-block"><?php echo esc_html($account_phone !== '' ? __('确认修改', 'aksrt') : __('确认绑定', 'aksrt')); ?></button></div>
<button type="submit" class="but jb-blue padding-lg btn-block"><i class="fa fas fa-check" aria-hidden="true"></i> <span data-aksrt-settings-submit-label><?php esc_html_e('确认提交', 'aksrt'); ?></span></button>
</form>
</div>
</template>
@@ -490,6 +490,9 @@ test('profile routes load versioned leaf styles and settings dialogs use the sha
assert.match(settingsAccount, /template data-aksrt-settings-modal-template="password"/);
assert.match(settingsAccount, /template data-aksrt-settings-modal-template="email"/);
assert.match(settingsAccount, /template data-aksrt-settings-modal-template="phone"/);
const settingsSubmitButtons = settingsAccount.match(/<button type="submit" class="but jb-blue padding-lg btn-block"[^>]*><i class="fa fas fa-check" aria-hidden="true"><\/i> <span data-aksrt-settings-submit-label><\?php esc_html_e\('确认提交', 'aksrt'\); \?><\/span><\/button>/g) || [];
assert.equal(settingsSubmitButtons.length, 3, 'password, email, and phone dialogs use the reference submit button with the FA5 icon');
assert.doesNotMatch(settingsAccount, /aksrt-settings-modal__footer|确认修改|确认更改|确认绑定/);
assert.ok(settingsAccount.indexOf('绑定邮箱') < settingsAccount.indexOf('绑定手机'));
assert.ok(settingsAccount.indexOf('绑定手机') < settingsAccount.indexOf("require __DIR__ . '/settings-bindings.php'"));
assert.ok(settingsAccount.indexOf("require __DIR__ . '/settings-bindings.php'") < settingsAccount.indexOf('账户密码'));
@@ -503,6 +506,8 @@ test('profile routes load versioned leaf styles and settings dialogs use the sha
assert.match(userCenterJs, /onContent: function \(_, session\)/);
assert.match(userCenterJs, /aksrt:modal:close[\s\S]*?resetSettingsModal\(shell\)/);
assert.match(userCenterJs, /resetCaptcha\(scene, form\)/);
assert.match(userCenterJs, /function setSettingsSubmitLabel\(button, text\)[\s\S]*?label\.textContent = text/);
assert.match(userCenterJs, /setSettingsSubmitLabel\(submitBtn, submitIdleText\)/);
assert.match(userCenterJs, /aksrt_change_password/);
assert.match(userCenterJs, /aksrt_change_email/);
assert.match(userCenterJs, /AksrtModalRuntime\.close\('settings-submit'\)/);