diff --git a/public/static/plugs/ulthon-admin/admin-table.js b/public/static/plugs/ulthon-admin/admin-table.js index e21822a..6da3c93 100644 --- a/public/static/plugs/ulthon-admin/admin-table.js +++ b/public/static/plugs/ulthon-admin/admin-table.js @@ -489,6 +489,24 @@ extend: 'data-table-id="' + options.id + '"' }); } + + // 受控表形态清单规范化须先于引擎渲染:视图切换按钮的注入条件 + // (条目数>1)依赖它,受控分支直接复用。非受控表不 normalize。 + var layoutEntries = []; + if (options.controlled === true) { + layoutEntries = normalizeLayoutList(options.layoutList); + if (layoutEntries.length > 1) { + // 视图切换按钮(任务 15 (b),交互结构参照旧 TABLE_LAYOUT + // 实现重建):下拉条目在点击时按 layoutEntries 动态构建 + defaultToolbar.push({ + title: '视图', + layEvent: 'TABLE_LAYOUT', + icon: 'layui-icon-template-1', + extend: 'data-table-id="' + options.id + '"' + }); + } + } + if (options.defaultToolbar === undefined) { options.defaultToolbar = defaultToolbar; } @@ -679,22 +697,41 @@ '
' ); - // 形态注册:layoutList 规范化 + 当前形态(layoutDefault / 'table'; - // 形态切换 UI 在任务 15,运行期经 ua.table.setLayoutForm 切换)。 + // 形态注册:layoutList 已在 defaultToolbar 段规范化(视图按钮 + // 注入共用)。运行期切形态经 ua.table.setLayoutForm。 // options.cols 此时已过 formatCols/renderOperat/renderTrueHide, // 渲染器族与 operat 缺省值已就绪,构建上下文直接消费 - var layoutEntries = normalizeLayoutList(options.layoutList); var layoutByName = {}; $.each(layoutEntries, function (i, entry) { layoutByName[entry.name] = entry; }); + + // 默认形态解析(任务 15 (a)):优先级 localStorage 按页记忆 > + // 显式 layoutDefault / 手机端自动检测 > 'table'。手机端默认 + // card 仅当 layoutList 含 card 条目;记忆值不在 layoutList 内 + // 时忽略(防脏数据);未配 layoutList 的页面恒 table,行为 + // 零变化。layoutDefault=true 旧协议即"自动判断",与新默认 + // 行为一致,无需单独分支。 + var defaultLayoutName = 'table'; + if (layoutEntries.length > 0) { + if (options.layoutDefault && layoutByName[options.layoutDefault]) { + defaultLayoutName = options.layoutDefault; + } else if (ua.checkMobile() && layoutByName['card']) { + defaultLayoutName = 'card'; + } + var savedLayout = ua.getPageSetting('table-layout-default', ''); + if (layoutByName[savedLayout]) { + defaultLayoutName = savedLayout; + } + } + controlledLayouts[options.id] = { elem: options.elem, cols: options.cols, init: options.init, entries: layoutEntries, byName: layoutByName, - current: options.layoutDefault || 'table' + current: defaultLayoutName }; window.UA_TABLE_STORE.register(options.id, { @@ -1720,6 +1757,52 @@ _that.addClass('layui-hide'); } break; + case 'TABLE_LAYOUT': + // 视图切换下拉(任务 15 (b),交互结构参照旧 TABLE_LAYOUT + // 实现重建):按钮仅在受控表 layoutList 条目>1 时注入, + // 条目清单来自 controlledLayouts 注册表。点击条目 = + // localStorage 按页记忆 + setLayoutForm 切换(数据取自 + // store 当页状态,零网络请求) + var layoutEntryId = 'ua-layout-list-' + tableId; + var $toolbarLayoutElem = $('[lay-table-id="' + tableId + '"]').find('[lay-event="TABLE_LAYOUT"]'); + var $layoutListElem = $('#' + layoutEntryId); + if ($layoutListElem.length > 0) { + $layoutListElem.remove(); + break; + } + + var layoutCurrent = ua.table.getLayoutForm(tableId); + var layoutIcons = {table: 'layui-icon-table', card: 'layui-icon-app'}; + var layoutHtml = '
'; + $.each(controlledLayouts[tableId].entries, function (i, item) { + var itemIcon = item.icon || layoutIcons[item.name] || 'layui-icon-template-1'; + var itemClassName = item.name === layoutCurrent ? ' current' : ''; + layoutHtml += '
' + + '
' + + '
' + item.title + '
' + + '
'; + }); + layoutHtml += '
'; + + $layoutListElem = $(layoutHtml).appendTo($toolbarLayoutElem); + + $layoutListElem.on('click', '.item', function (event) { + var layoutName = $(this).data('name'); + ua.setPageSetting('table-layout-default', layoutName); + ua.table.setLayoutForm(tableId, layoutName); + $layoutListElem.remove(); + $(document).off('click.ua-table-layout'); + event.stopPropagation(); + }); + + // 点击下拉外区域收起(命名空间事件,收起时解除) + $(document).off('click.ua-table-layout').on('click.ua-table-layout', function (event) { + if (!$(event.target).closest($toolbarLayoutElem).length) { + $('#' + layoutEntryId).remove(); + $(document).off('click.ua-table-layout'); + } + }); + break; } }); },