class InterfaceDataTable extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); this.data = []; this.filteredData = []; this.selectedRows = new Set(); this.searchKeyword = ''; } connectedCallback() { this.render(); this.addEventListeners(); this.updateProductFilter(); } setData(data) { this.data = data; this.updateProductFilter(); this.renderTable(); } setSearchKeyword(keyword) { this.searchKeyword = keyword.toLowerCase(); this.updateProductFilter(); this.renderTable(); } updateProductFilter() { const headerTools = document.querySelector('header-tools'); if (headerTools) { const selectedProduct = headerTools.selectedProduct; this.filterData(selectedProduct); } else { // 如果没有找到 header-tools 组件,显示所有数据 this.filteredData = [...this.data]; } } filterData(selectedProduct) { // 首先根据构型过滤 let filteredByProduct = selectedProduct && selectedProduct !== '' ? this.data.filter(item => item.ProductName === selectedProduct) : [...this.data]; // 然后根据搜索关键词过滤 if (this.searchKeyword) { this.filteredData = filteredByProduct.filter(item => item.ATAName.toLowerCase().includes(this.searchKeyword) || item.ModelStructName.toLowerCase().includes(this.searchKeyword) || item.InterfaceName.toLowerCase().includes(this.searchKeyword) ); } else { this.filteredData = filteredByProduct; } } getSelectedRows() { return Array.from(this.selectedRows); } addEventListeners() { this.shadowRoot.addEventListener('click', (e) => { const row = e.target.closest('tr'); if (!row) return; if (e.target.type === 'checkbox') { const id = row.dataset.id; if (e.target.checked) { this.selectedRows.add(id); } else { this.selectedRows.delete(id); } this.updateSelectedRows(); } }); // 监听构型变化事件 document.addEventListener('product-change', () => { this.updateProductFilter(); this.renderTable(); }); // 监听搜索事件 document.addEventListener('search', (e) => { this.setSearchKeyword(e.detail.keyword); }); } updateSelectedRows() { const checkboxes = this.shadowRoot.querySelectorAll('input[type="checkbox"]'); checkboxes.forEach(checkbox => { checkbox.checked = this.selectedRows.has(checkbox.closest('tr').dataset.id); }); } renderTable() { const tbody = this.shadowRoot.querySelector('tbody'); tbody.innerHTML = ''; this.filteredData.forEach(item => { const tr = document.createElement('tr'); tr.dataset.id = `${item.ProductName}-${item.ATAName}-${item.ModelStructName}-${item.InterfaceName}`; tr.innerHTML = `
构型 | ATA章节 | 模型结构体名 | 接口 | 接口类型 | 是否可选 | 是否为数组 | 第一维大小 | 第二维大小 | 备注 | 操作 |
---|