- Replace transfer modal/admin-post flow with reference-style AJAX export/import/template dialogs (admin-transfer.js, TransferController) - Customizer "移出模块" action, reference lazy form loading with t-notice - Common fields use reference labels, dependencies, compact/inline rows, top/bottom-only extra spacing; form header with description/reminder - Remove placement hint, template preview and legacy transfer code - Fix widget audit (current_datetime stub, honor catalog common flags) and regenerate stale golden fixtures for posts_toc, quote, posts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines
3.4 KiB
JavaScript
61 lines
3.4 KiB
JavaScript
const test = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const path = require('node:path')
|
|
|
|
const root = path.resolve(__dirname, '../..')
|
|
const core = require(path.join(root, 'assets/widgets/admin-core.js'))
|
|
const admin = fs.readFileSync(path.join(root, 'assets/widgets/admin.js'), 'utf8')
|
|
const wie = fs.readFileSync(path.join(root, 'assets/widgets/admin-transfer.js'), 'utf8')
|
|
const controller =fs.readFileSync(path.join(root, 'src/WidgetSystem/AdminFormController.php'), 'utf8')
|
|
const transfer = fs.readFileSync(path.join(root, 'src/WidgetSystem/TransferController.php'), 'utf8')
|
|
const renderer = fs.readFileSync(path.join(root, 'src/WidgetSystem/FormRenderer.php'), 'utf8')
|
|
const styles = fs.readFileSync(path.join(root, 'assets/widgets/admin.css'), 'utf8')
|
|
|
|
test('lazy widget forms resolve assigned instances across core and customizer markup', () => {
|
|
assert.equal(core.resolveWidgetNumber('widget-aksrt_widget_posts[12][title]', 'widget-aksrt_widget_posts-12', '__i__'), '12')
|
|
assert.equal(core.resolveWidgetNumber('', 'widget-aksrt_widget_posts-8', '__i__'), '8')
|
|
assert.equal(core.resolveWidgetNumber('', '', '4'), '4')
|
|
assert.equal(core.resolveWidgetNumber('', '', '__i__'), '')
|
|
assert.equal(core.resolveWidgetNumber('', 'widget-aksrt_widget_posts-0', ''), '')
|
|
assert.match(admin, /customize-control-widget_form \.aksrt-widget-form-lazy/)
|
|
})
|
|
|
|
test('lazy form AJAX failures remain retryable and instance filters match WordPress widget forms', () => {
|
|
assert.match(admin, /data\('loading', false\)/)
|
|
assert.match(controller, /apply_filters\('widget_form_callback', \$instance, \$widget\)/)
|
|
})
|
|
|
|
test('sidebar toolbars drive reference-style AJAX export, import and template modals', () => {
|
|
assert.match(wie, /widgets-holder-wrap:not\(#available-widgets\)/)
|
|
assert.match(wie, /control-section-sidebar/)
|
|
assert.match(wie, /data-aksrt-wie-action/)
|
|
assert.match(wie, /data-sidebar-id/)
|
|
assert.match(wie, /aksrt-wie-btn-delete/)
|
|
assert.match(wie, /nonce: config\.transferNonce/)
|
|
for (const action of ['export_sidebar', 'import_sidebar', 'list_templates', 'import_template']) {
|
|
assert.match(wie, new RegExp(`aksrt_widgets_${action}`))
|
|
assert.match(transfer, new RegExp(`wp_ajax_aksrt_widgets_${action}`))
|
|
}
|
|
assert.match(transfer, /check_ajax_referer\(self::NONCE, 'nonce'\)/)
|
|
assert.match(transfer, /edit_theme_options/)
|
|
assert.doesNotMatch(transfer, /aksrt_widgets_template_preview|admin_post_|admin_notices/)
|
|
assert.doesNotMatch(admin, /data-aksrt-transfer-action|aksrt-widget-customizer-remove|aksrt-widget-form-lazy__load/)
|
|
assert.match(styles, /\.aksrt-wie-modal__dialog/)
|
|
})
|
|
|
|
test('widget fields follow the current CSF compact palette and cloneable group patterns', () => {
|
|
assert.match(renderer, /aksrt-widget-palette-choice/)
|
|
assert.match(renderer, /<details class="aksrt-widget-repeater__row"/)
|
|
assert.match(renderer, /data-min-items=/)
|
|
assert.match(admin, /function updateRepeaterControls/)
|
|
assert.match(styles, /\.aksrt-widget-choices--palette/)
|
|
assert.match(styles, /\.aksrt-widget-repeater__bar/)
|
|
assert.match(styles, /\.customize-control-widget_form \.aksrt-widget-field__label/)
|
|
assert.match(admin, /if \(!response\?\.success \|\| !response\.data\?\.html\) \{/)
|
|
assert.match(admin, /t-notice/)
|
|
assert.match(styles, /\.aksrt-widget-field\.is-compact/)
|
|
assert.match(admin, /responseJSON\?\.data\?\.message/)
|
|
assert.doesNotMatch(admin, /if \(!response\?\.success\) throw new Error/)
|
|
})
|