ComponentSystem.register('mirrors-table', { template: `
`, data() { return { allColumns: mirrorsTableColumns, columns: mirrorsTableColumns, originalData: mirrorsTableData, data: mirrorsTableData.slice(), rawFilterOptions: mirrorsTableFilterSelectOptions, selectedColumnFilters: [], selectedRowFilters: [], selectedCellStatuses: ['supported', 'unsupported', 'incompatible'], cellStatusEnabled: true, activeTableFilters: {}, } }, created() { const allKeys = this._flattenFilterKeys(this.filterOptions) this.selectedColumnFilters = allKeys.slice() this.selectedRowFilters = Array.isArray(this.originalData) ? this.originalData.map((r) => r.name) : [] this._debouncedUpdateColumns = debounce(this._updateColumns.bind(this), 120) this._debouncedUpdateRows = debounce(this._updateRows.bind(this), 120) this._updateColumns() this._updateRows() }, computed: { isMobile() { return window.matchMedia('(max-width: 768px)').matches }, localeFlags() { const p = (window && window.location && window.location.pathname) || '' return { isZhHant: p.includes('/zh-Hant'), isEn: p.includes('/en'), } }, globalConfig() { const f = this.localeFlags return { animation: { include: ['expand', 'fade'], exclude: [] }, table: f.isZhHant ? { empty: '\u66AB\u7121\u6578\u64DA', loadingText: '\u6B63\u5728\u8F09\u5165\u4E2D\uFF0C\u8ACB\u7A0D\u5F8C', loadingMoreText: '\u9EDE\u64CA\u8F09\u5165\u66F4\u591A', filterInputPlaceholder: '\u8ACB\u8F38\u5165\u5185\u5BB9\uFF08\u7121\u9ED8\u8A8D\u503C\uFF09', sortAscendingOperationText: '\u9EDE\u64CA\u5347\u5E8F', sortCancelOperationText: '\u9EDE\u64CA\u53D6\u6D88\u6392\u5E8F', sortDescendingOperationText: '\u9EDE\u64CA\u964D\u5E8F', clearFilterResultButtonText: '\u6E05\u7A7A\u7BE9\u9078', columnConfigButtonText: '\u884C\u914D\u7F6E', columnConfigTitleText: '\u8868\u683C\u884C\u914D\u7F6E', columnConfigDescriptionText: '\u8ACB\u9078\u64C7\u9700\u8981\u5728\u8868\u683C\u4E2D\u986F\u793A\u7684\u6578\u64DA\u884C', confirmText: '\u78BA\u8A8D', cancelText: '\u53D6\u6D88', resetText: '\u91CD\u7F6E', selectAllText: '\u5168\u9078', searchResultText: '\u641C\u5C0B"{result}"\uFF0C\u627E\u5230{count}\u9805\u7D50\u679C', } : f.isEn ? { empty: 'Empty Data', loadingText: 'loading...', loadingMoreText: 'loading more', filterInputPlaceholder: '', sortAscendingOperationText: 'click to sort ascending', sortCancelOperationText: 'click to cancel sorting', sortDescendingOperationText: 'click to sort descending', clearFilterResultButtonText: 'Clear', columnConfigButtonText: 'Column Config', columnConfigTitleText: 'Table Column Config', columnConfigDescriptionText: 'Please select columns to show them in the table', confirmText: 'Confirm', cancelText: 'Cancel', resetText: 'Reset', selectAllText: 'Select All', searchResultText: 'Search "{result}". Found no items. | Search "{result}". Found 1 item. | Search "{result}". Found {count} items.', } : undefined, select: f.isZhHant ? { empty: '\u66AB\u7121\u6578\u64DA', loadingText: '\u8F09\u5165\u4E2D', placeholder: '\u8ACB\u9078\u64C7', } : f.isEn ? { empty: 'Empty Data', loadingText: 'loading...', placeholder: 'please select', } : undefined, } }, selectPlaceholder() { const f = this.localeFlags return f.isZhHant ? '选择要显示的列' : f.isEn ? 'Select columns to show' : '选择要显示的列' }, rowSelectPlaceholder() { const f = this.localeFlags return f.isZhHant ? '筛选显示的镜像' : f.isEn ? 'Filter mirrors to show' : '筛选显示的镜像' }, rowFilterOptions() { const f = this.localeFlags const arr = Array.isArray(this.originalData) ? this.originalData.map((r) => ({ value: r.name, label: r.name, iconName: r.icon })) : [] const head = { value: '__all__', label: f.isZhHant ? '全選' : f.isEn ? 'Select All' : '全选', checkAll: true } return [head].concat(arr) }, rowFilterOptionsRendered() { return Array.isArray(this.rowFilterOptions) ? this.rowFilterOptions.map((o) => this._mapOptionForRow(o)) : [] }, statusLabels() { const f = this.localeFlags return { supported: f.isZhHant ? '支援' : f.isEn ? 'Supported' : '支持', unsupported: f.isZhHant ? '不支援' : f.isEn ? 'Unsupported' : '不支持', incompatible: f.isZhHant ? '不相容' : f.isEn ? 'Incompatible' : '不兼容', } }, showSupported() { return Array.isArray(this.selectedCellStatuses) && this.selectedCellStatuses.includes('supported') }, showUnsupported() { return Array.isArray(this.selectedCellStatuses) && this.selectedCellStatuses.includes('unsupported') }, showIncompatible() { return Array.isArray(this.selectedCellStatuses) && this.selectedCellStatuses.includes('incompatible') }, filterOptions() { return Array.isArray(this.rawFilterOptions) ? this.rawFilterOptions.map((o) => this._mapOptionForFilter(o)) : [] }, }, methods: { _mapOptionForRow(opt) { const prefix = '/assets/images/icon/mirrors/' const copy = Object.assign({}, opt) if (copy.iconName) copy.prefixIcon = prefix + copy.iconName copy.content = function (h, ctx) { const option = (ctx && ctx.option) || copy const children = [] if (option.iconName) { children.push(h('img', { src: prefix + option.iconName, width: 16, height: 16, style: 'vertical-align: middle' })) } children.push(h('span', { style: option.iconName ? 'margin-left: 8px' : '' }, option.label || option.value || '')) return h('div', { style: 'display: flex; align-items: center' }, children) } return copy }, _mapOptionForFilter(opt) { const prefix = '/assets/images/icon/' const copy = Object.assign({}, opt) if (copy.iconName) copy.prefixIcon = prefix + copy.iconName copy.content = function (h, ctx) { const option = (ctx && ctx.option) || copy const children = [] if (option.iconName) { children.push(h('img', { src: prefix + option.iconName, width: 16, height: 16, style: 'vertical-align: middle' })) } children.push(h('span', { style: option.iconName ? 'margin-left: 8px' : '' }, option.label || option.value || '')) return h('div', { style: 'display: flex; align-items: center' }, children) } if (Array.isArray(copy.children)) { copy.children = copy.children.map((c) => this._mapOptionForFilter(c)) } return copy }, dataChange(data) { try { const hasColumnFilters = this.activeTableFilters && Object.keys(this.activeTableFilters).length > 0 const hasRowFilters = Array.isArray(this.selectedRowFilters) && this.selectedRowFilters.length > 0 if (hasColumnFilters || hasRowFilters) { return } this.data = data } catch (e) { console.error('mirrors-table dataChange error', e) } }, onFilterChange() { if (this._debouncedUpdateColumns) this._debouncedUpdateColumns() else this._updateColumns() }, onRowFilterChange() { try { if (Array.isArray(this.selectedRowFilters) && this.selectedRowFilters.includes('__all__')) { this.selectedRowFilters = Array.isArray(this.originalData) ? this.originalData.map((r) => r.name) : [] } } catch (e) { console.error('mirrors-table onRowFilterChange error', e) } if (this._debouncedUpdateRows) this._debouncedUpdateRows() else this._updateRows() }, onCellStatusChange() { if (this._debouncedUpdateRows) this._debouncedUpdateRows() else this._updateRows() }, onTableFilterChange(filters) { try { this.activeTableFilters = filters || {} if (this._debouncedUpdateRows) this._debouncedUpdateRows() else this._updateRows() } catch (e) { console.error('mirrors-table onTableFilterChange error', e) } }, _updateColumns() { try { const keys = new Set(this.selectedColumnFilters || []) this.columns = this.allColumns.filter((col) => col.colKey === 'name' || keys.has(col.colKey)) } catch (e) { this.columns = this.allColumns } }, _updateRows() { try { this._computeFilteredData() } catch (e) { console.error('mirrors-table _updateRows error', e) this.data = this.originalData.slice() } }, _computeFilteredData() { try { let rows = Array.isArray(this.originalData) ? this.originalData.slice() : [] if (Array.isArray(this.selectedRowFilters) && this.selectedRowFilters.length) { const names = new Set(this.selectedRowFilters || []) rows = rows.filter((r) => names.has(r.name)) } const filters = this.activeTableFilters || {} const filterKeys = Object.keys(filters) if (filterKeys.length) { rows = rows.filter((row) => { for (let i = 0; i < filterKeys.length; i++) { const key = filterKeys[i] let value = filters[key] if (Array.isArray(value)) value = value.length ? value[0] : undefined if (!value) continue const cell = Object.prototype.hasOwnProperty.call(row, key) ? row[key] : undefined if (value === 'supported') { if (cell !== true) return false } else if (value === 'unsupported') { if (cell !== false) return false } else if (value === 'incompatible') { if (cell !== 'incompatible') return false } else { continue } } return true }) } this.data = rows } catch (e) { console.error('mirrors-table _computeFilteredData error', e) this.data = this.originalData.slice() } }, _flattenFilterKeys(options) { const set = new Set() options.forEach((opt) => { if (opt.group && Array.isArray(opt.children)) { opt.children.forEach((child) => { if (child && child.value) set.add(child.value) }) } else if (Array.isArray(opt.children)) { opt.children.forEach((child) => { if (child && child.value) set.add(child.value) }) } else if (opt.value) { set.add(opt.value) } }) return Array.from(set) }, }, })