newBuilder(); $builder->define(function ($page) { $page->title('短信管理') ->searchAttrs(['action' => '/message', 'class' => 'form-search search-panel']) ->buttons(function ($buttons) { $buttons->modal('短信配置', '/config', '', [], 'config') ->open('查看报表', '/report', [], 'report') ->batchAction('批量删除', '/remove', 'id#{key}', '确定删除吗?', ['data-scene' => 'batch']); }) ->bootScript('let scenes = {};') ->search(function ($search) { $search->input('smsid', '消息编号', '请输入消息编号') ->field(['type' => 'input', 'name' => 'scene_keyword', 'label' => '业务场景', 'class' => 'search-scene-keyword']) ->select('status', '执行结果', [0 => '失败', 1 => '成功']) ->dateRange('create_time', '发送时间', '请选择发送时间') ->hidden('source', 'system') ->submit('筛选', ['data-scene' => 'search-submit']); }) ->table('MessageData', '/message', function ($table) { $table->checkbox() ->sortInput('/sort') ->column(['field' => 'smsid', 'title' => '消息编号', 'sort' => true]) ->column(['field' => 'scene', 'title' => '业务场景', 'templet' => PageBuilder::js('function(d){ return d.scene; }')]) ->statusSwitch('/state', [ 'title' => '状态', 'activeHtml' => '成功', 'inactiveHtml' => '失败', 'text' => '成功|失败', ]) ->rows(function ($rows) { $rows->open('查看', '/detail?id={{d.id}}', '查看详情', [], 'view') ->modal('编辑', '/edit?id={{d.id}}', '编辑', [], 'edit'); }) ->toolbar(); }); }); $builder->addInitScript('window.pageReady = true;')->build(); $schema = $builder->toArray(); $searches = $this->schemaNodesOfType($schema, 'search'); $tables = $this->schemaNodesOfType($schema, 'table'); $html = $this->invokePrivate($builder, 'render'); $this->assertSame('短信管理', $schema['title']); $this->assertSame('MessageData', $tables[0]['id'] ?? null); $this->assertSame('#SortInputMessageDataTpl', $tables[0]['columns'][1]['templet'] ?? null); $this->assertSame('js', $tables[0]['columns'][3]['templet']['type'] ?? null); $this->assertSame('#toolbarMessageData', $tables[0]['columns'][5]['toolbar'] ?? null); $this->assertSame('config', $schema['buttons'][0]['auth'] ?? null); $this->assertSame('open', $schema['buttons'][1]['type'] ?? null); $this->assertSame('/report', $schema['buttons'][1]['url'] ?? null); $this->assertSame('batch-action', $schema['buttons'][2]['type'] ?? null); $this->assertSame('MessageData', $schema['buttons'][2]['attrs']['data-table-id'] ?? null); $this->assertSame('hidden', $searches[0]['fields'][4]['type'] ?? null); $this->assertSame('system', $searches[0]['fields'][4]['attrs']['value'] ?? null); $this->assertSame('submit', $searches[0]['fields'][5]['type'] ?? null); $this->assertStringContainsString('layui-card-header', $html); $this->assertStringContainsString('layui-card-table', $html); $this->assertStringContainsString('form-search', $html); $this->assertStringContainsString('class="form-search search-panel layui-form layui-form-pane"', $html); $this->assertStringContainsString('data-scene="batch"', $html); $this->assertStringContainsString('type="hidden"', $html); $this->assertStringContainsString('name="source"', $html); $this->assertStringContainsString('value="system"', $html); $this->assertStringContainsString('', $html); $this->assertStringContainsString('data-scene="search-submit"', $html); $this->assertStringContainsString('data-action="/remove"', $html); $this->assertStringContainsString('data-rule="id#{key}"', $html); $this->assertStringContainsString('data-confirm="确定删除吗?"', $html); $this->assertStringContainsString('search-scene-keyword', $html); $this->assertStringContainsString('data-url="/message"', $html); $this->assertStringContainsString('id="PageSearchForm1"', $html); $this->assertStringContainsString('data-target-search="#PageSearchForm1"', $html); $this->assertStringContainsString('id="SortInputMessageDataTpl"', $html); $this->assertStringContainsString('id="StatusSwitchMessageDataTpl"', $html); $this->assertStringContainsString('lay-filter="StatusSwitchMessageData"', $html); $this->assertStringContainsString('$.form.load("/state"', $html); $this->assertStringContainsString("else {\n \$(\"#MessageData\").trigger(\"reload\");\n }", $html); $this->assertTrue( strpos($html, 'let scenes = {};') < strpos($html, "$('#MessageData').layTable(") ); $this->assertTrue( strpos($html, "$('#MessageData').layTable(") < strpos($html, 'window.pageReady = true;') ); $this->assertStringContainsString('function(d){ return d.scene; }', $html); $this->assertStringContainsString('