| /* |
| * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /** |
| * @unrestricted |
| */ |
| Resources.DatabaseTableView = class extends UI.SimpleView { |
| constructor(database, tableName) { |
| super(Common.UIString('Database')); |
| |
| this.database = database; |
| this.tableName = tableName; |
| |
| this.element.classList.add('storage-view', 'table'); |
| |
| this._visibleColumnsSetting = Common.settings.createSetting('databaseTableViewVisibleColumns', {}); |
| |
| this.refreshButton = new UI.ToolbarButton(Common.UIString('Refresh'), 'largeicon-refresh'); |
| this.refreshButton.addEventListener(UI.ToolbarButton.Events.Click, this._refreshButtonClicked, this); |
| this._visibleColumnsInput = new UI.ToolbarInput(Common.UIString('Visible columns'), '', 1); |
| this._visibleColumnsInput.addEventListener(UI.ToolbarInput.Event.TextChanged, this._onVisibleColumnsChanged, this); |
| } |
| |
| /** |
| * @override |
| */ |
| wasShown() { |
| this.update(); |
| } |
| |
| /** |
| * @override |
| * @return {!Array.<!UI.ToolbarItem>} |
| */ |
| syncToolbarItems() { |
| return [this.refreshButton, this._visibleColumnsInput]; |
| } |
| |
| /** |
| * @param {string} tableName |
| * @return {string} |
| */ |
| _escapeTableName(tableName) { |
| return tableName.replace(/\"/g, '""'); |
| } |
| |
| update() { |
| this.database.executeSql( |
| 'SELECT rowid, * FROM "' + this._escapeTableName(this.tableName) + '"', this._queryFinished.bind(this), |
| this._queryError.bind(this)); |
| } |
| |
| _queryFinished(columnNames, values) { |
| this.detachChildWidgets(); |
| this.element.removeChildren(); |
| |
| this._dataGrid = DataGrid.SortableDataGrid.create(columnNames, values); |
| this._visibleColumnsInput.setVisible(!!this._dataGrid); |
| if (!this._dataGrid) { |
| this._emptyWidget = new UI.EmptyWidget(ls`The "${this.tableName}"\ntable is empty.`); |
| this._emptyWidget.show(this.element); |
| return; |
| } |
| this._dataGrid.setStriped(true); |
| this._dataGrid.asWidget().show(this.element); |
| this._dataGrid.autoSizeColumns(5); |
| |
| this._columnsMap = new Map(); |
| for (let i = 1; i < columnNames.length; ++i) { |
| this._columnsMap.set(columnNames[i], String(i)); |
| } |
| this._lastVisibleColumns = ''; |
| const visibleColumnsText = this._visibleColumnsSetting.get()[this.tableName] || ''; |
| this._visibleColumnsInput.setValue(visibleColumnsText); |
| this._onVisibleColumnsChanged(); |
| } |
| |
| _onVisibleColumnsChanged() { |
| if (!this._dataGrid) { |
| return; |
| } |
| const text = this._visibleColumnsInput.value(); |
| const parts = text.split(/[\s,]+/); |
| const matches = new Set(); |
| const columnsVisibility = {}; |
| columnsVisibility['0'] = true; |
| for (let i = 0; i < parts.length; ++i) { |
| const part = parts[i]; |
| if (this._columnsMap.has(part)) { |
| matches.add(part); |
| columnsVisibility[this._columnsMap.get(part)] = true; |
| } |
| } |
| const newVisibleColumns = matches.valuesArray().sort().join(', '); |
| if (newVisibleColumns.length === 0) { |
| for (const v of this._columnsMap.values()) { |
| columnsVisibility[v] = true; |
| } |
| } |
| if (newVisibleColumns === this._lastVisibleColumns) { |
| return; |
| } |
| const visibleColumnsRegistry = this._visibleColumnsSetting.get(); |
| visibleColumnsRegistry[this.tableName] = text; |
| this._visibleColumnsSetting.set(visibleColumnsRegistry); |
| this._dataGrid.setColumnsVisiblity(columnsVisibility); |
| this._lastVisibleColumns = newVisibleColumns; |
| } |
| |
| _queryError(error) { |
| this.detachChildWidgets(); |
| this.element.removeChildren(); |
| |
| const errorMsgElement = createElement('div'); |
| errorMsgElement.className = 'storage-table-error'; |
| errorMsgElement.textContent = ls`An error occurred trying to\nread the "${this.tableName}" table.`; |
| this.element.appendChild(errorMsgElement); |
| } |
| |
| /** |
| * @param {!Common.Event} event |
| */ |
| _refreshButtonClicked(event) { |
| this.update(); |
| } |
| }; |