| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| 11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
| 12 * | 12 * |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 24 */ | 24 */ |
| 25 | |
| 26 /** | 25 /** |
| 27 * @constructor | 26 * @unrestricted |
| 28 * @extends {WebInspector.SimpleView} | |
| 29 */ | 27 */ |
| 30 WebInspector.DatabaseTableView = function(database, tableName) | 28 WebInspector.DatabaseTableView = class extends WebInspector.SimpleView { |
| 31 { | 29 constructor(database, tableName) { |
| 32 WebInspector.SimpleView.call(this, WebInspector.UIString("Database")); | 30 super(WebInspector.UIString('Database')); |
| 33 | 31 |
| 34 this.database = database; | 32 this.database = database; |
| 35 this.tableName = tableName; | 33 this.tableName = tableName; |
| 36 | 34 |
| 37 this.element.classList.add("storage-view", "table"); | 35 this.element.classList.add('storage-view', 'table'); |
| 38 | 36 |
| 39 this._visibleColumnsSetting = WebInspector.settings.createSetting("databaseT
ableViewVisibleColumns", {}); | 37 this._visibleColumnsSetting = WebInspector.settings.createSetting('databaseT
ableViewVisibleColumns', {}); |
| 40 | 38 |
| 41 this.refreshButton = new WebInspector.ToolbarButton(WebInspector.UIString("R
efresh"), "refresh-toolbar-item"); | 39 this.refreshButton = new WebInspector.ToolbarButton(WebInspector.UIString('R
efresh'), 'refresh-toolbar-item'); |
| 42 this.refreshButton.addEventListener("click", this._refreshButtonClicked, thi
s); | 40 this.refreshButton.addEventListener('click', this._refreshButtonClicked, thi
s); |
| 43 this._visibleColumnsInput = new WebInspector.ToolbarInput(WebInspector.UIStr
ing("Visible columns"), 1); | 41 this._visibleColumnsInput = new WebInspector.ToolbarInput(WebInspector.UIStr
ing('Visible columns'), 1); |
| 44 this._visibleColumnsInput.addEventListener(WebInspector.ToolbarInput.Event.T
extChanged, this._onVisibleColumnsChanged, this); | 42 this._visibleColumnsInput.addEventListener( |
| 43 WebInspector.ToolbarInput.Event.TextChanged, this._onVisibleColumnsChang
ed, this); |
| 44 } |
| 45 |
| 46 /** |
| 47 * @override |
| 48 */ |
| 49 wasShown() { |
| 50 this.update(); |
| 51 } |
| 52 |
| 53 /** |
| 54 * @override |
| 55 * @return {!Array.<!WebInspector.ToolbarItem>} |
| 56 */ |
| 57 syncToolbarItems() { |
| 58 return [this.refreshButton, this._visibleColumnsInput]; |
| 59 } |
| 60 |
| 61 /** |
| 62 * @param {string} tableName |
| 63 * @return {string} |
| 64 */ |
| 65 _escapeTableName(tableName) { |
| 66 return tableName.replace(/\"/g, '""'); |
| 67 } |
| 68 |
| 69 update() { |
| 70 this.database.executeSql( |
| 71 'SELECT rowid, * FROM "' + this._escapeTableName(this.tableName) + '"',
this._queryFinished.bind(this), |
| 72 this._queryError.bind(this)); |
| 73 } |
| 74 |
| 75 _queryFinished(columnNames, values) { |
| 76 this.detachChildWidgets(); |
| 77 this.element.removeChildren(); |
| 78 |
| 79 this._dataGrid = WebInspector.SortableDataGrid.create(columnNames, values); |
| 80 this._visibleColumnsInput.setVisible(!!this._dataGrid); |
| 81 if (!this._dataGrid) { |
| 82 this._emptyWidget = |
| 83 new WebInspector.EmptyWidget(WebInspector.UIString('The “%s”\ntable is
empty.', this.tableName)); |
| 84 this._emptyWidget.show(this.element); |
| 85 return; |
| 86 } |
| 87 this._dataGrid.asWidget().show(this.element); |
| 88 this._dataGrid.autoSizeColumns(5); |
| 89 |
| 90 this._columnsMap = new Map(); |
| 91 for (var i = 1; i < columnNames.length; ++i) |
| 92 this._columnsMap.set(columnNames[i], String(i)); |
| 93 this._lastVisibleColumns = ''; |
| 94 var visibleColumnsText = this._visibleColumnsSetting.get()[this.tableName] |
| ''; |
| 95 this._visibleColumnsInput.setValue(visibleColumnsText); |
| 96 this._onVisibleColumnsChanged(); |
| 97 } |
| 98 |
| 99 _onVisibleColumnsChanged() { |
| 100 if (!this._dataGrid) |
| 101 return; |
| 102 var text = this._visibleColumnsInput.value(); |
| 103 var parts = text.split(/[\s,]+/); |
| 104 var matches = new Set(); |
| 105 var columnsVisibility = {}; |
| 106 columnsVisibility['0'] = true; |
| 107 for (var i = 0; i < parts.length; ++i) { |
| 108 var part = parts[i]; |
| 109 if (this._columnsMap.has(part)) { |
| 110 matches.add(part); |
| 111 columnsVisibility[this._columnsMap.get(part)] = true; |
| 112 } |
| 113 } |
| 114 var newVisibleColumns = matches.valuesArray().sort().join(', '); |
| 115 if (newVisibleColumns.length === 0) { |
| 116 for (var v of this._columnsMap.values()) |
| 117 columnsVisibility[v] = true; |
| 118 } |
| 119 if (newVisibleColumns === this._lastVisibleColumns) |
| 120 return; |
| 121 var visibleColumnsRegistry = this._visibleColumnsSetting.get(); |
| 122 visibleColumnsRegistry[this.tableName] = text; |
| 123 this._visibleColumnsSetting.set(visibleColumnsRegistry); |
| 124 this._dataGrid.setColumnsVisiblity(columnsVisibility); |
| 125 this._lastVisibleColumns = newVisibleColumns; |
| 126 } |
| 127 |
| 128 _queryError(error) { |
| 129 this.detachChildWidgets(); |
| 130 this.element.removeChildren(); |
| 131 |
| 132 var errorMsgElement = createElement('div'); |
| 133 errorMsgElement.className = 'storage-table-error'; |
| 134 errorMsgElement.textContent = |
| 135 WebInspector.UIString('An error occurred trying to\nread the “%s” table.
', this.tableName); |
| 136 this.element.appendChild(errorMsgElement); |
| 137 } |
| 138 |
| 139 _refreshButtonClicked(event) { |
| 140 this.update(); |
| 141 } |
| 45 }; | 142 }; |
| 46 | |
| 47 WebInspector.DatabaseTableView.prototype = { | |
| 48 wasShown: function() | |
| 49 { | |
| 50 this.update(); | |
| 51 }, | |
| 52 | |
| 53 /** | |
| 54 * @override | |
| 55 * @return {!Array.<!WebInspector.ToolbarItem>} | |
| 56 */ | |
| 57 syncToolbarItems: function() | |
| 58 { | |
| 59 return [this.refreshButton, this._visibleColumnsInput]; | |
| 60 }, | |
| 61 | |
| 62 /** | |
| 63 * @param {string} tableName | |
| 64 * @return {string} | |
| 65 */ | |
| 66 _escapeTableName: function(tableName) | |
| 67 { | |
| 68 return tableName.replace(/\"/g, "\"\""); | |
| 69 }, | |
| 70 | |
| 71 update: function() | |
| 72 { | |
| 73 this.database.executeSql("SELECT rowid, * FROM \"" + this._escapeTableNa
me(this.tableName) + "\"", this._queryFinished.bind(this), this._queryError.bind
(this)); | |
| 74 }, | |
| 75 | |
| 76 _queryFinished: function(columnNames, values) | |
| 77 { | |
| 78 this.detachChildWidgets(); | |
| 79 this.element.removeChildren(); | |
| 80 | |
| 81 this._dataGrid = WebInspector.SortableDataGrid.create(columnNames, value
s); | |
| 82 this._visibleColumnsInput.setVisible(!!this._dataGrid); | |
| 83 if (!this._dataGrid) { | |
| 84 this._emptyWidget = new WebInspector.EmptyWidget(WebInspector.UIStri
ng("The “%s”\ntable is empty.", this.tableName)); | |
| 85 this._emptyWidget.show(this.element); | |
| 86 return; | |
| 87 } | |
| 88 this._dataGrid.asWidget().show(this.element); | |
| 89 this._dataGrid.autoSizeColumns(5); | |
| 90 | |
| 91 this._columnsMap = new Map(); | |
| 92 for (var i = 1; i < columnNames.length; ++i) | |
| 93 this._columnsMap.set(columnNames[i], String(i)); | |
| 94 this._lastVisibleColumns = ""; | |
| 95 var visibleColumnsText = this._visibleColumnsSetting.get()[this.tableNam
e] || ""; | |
| 96 this._visibleColumnsInput.setValue(visibleColumnsText); | |
| 97 this._onVisibleColumnsChanged(); | |
| 98 }, | |
| 99 | |
| 100 _onVisibleColumnsChanged: function() | |
| 101 { | |
| 102 if (!this._dataGrid) | |
| 103 return; | |
| 104 var text = this._visibleColumnsInput.value(); | |
| 105 var parts = text.split(/[\s,]+/); | |
| 106 var matches = new Set(); | |
| 107 var columnsVisibility = {}; | |
| 108 columnsVisibility["0"] = true; | |
| 109 for (var i = 0; i < parts.length; ++i) { | |
| 110 var part = parts[i]; | |
| 111 if (this._columnsMap.has(part)) { | |
| 112 matches.add(part); | |
| 113 columnsVisibility[this._columnsMap.get(part)] = true; | |
| 114 } | |
| 115 } | |
| 116 var newVisibleColumns = matches.valuesArray().sort().join(", "); | |
| 117 if (newVisibleColumns.length === 0) { | |
| 118 for (var v of this._columnsMap.values()) | |
| 119 columnsVisibility[v] = true; | |
| 120 } | |
| 121 if (newVisibleColumns === this._lastVisibleColumns) | |
| 122 return; | |
| 123 var visibleColumnsRegistry = this._visibleColumnsSetting.get(); | |
| 124 visibleColumnsRegistry[this.tableName] = text; | |
| 125 this._visibleColumnsSetting.set(visibleColumnsRegistry); | |
| 126 this._dataGrid.setColumnsVisiblity(columnsVisibility); | |
| 127 this._lastVisibleColumns = newVisibleColumns; | |
| 128 }, | |
| 129 | |
| 130 _queryError: function(error) | |
| 131 { | |
| 132 this.detachChildWidgets(); | |
| 133 this.element.removeChildren(); | |
| 134 | |
| 135 var errorMsgElement = createElement("div"); | |
| 136 errorMsgElement.className = "storage-table-error"; | |
| 137 errorMsgElement.textContent = WebInspector.UIString("An error occurred t
rying to\nread the “%s” table.", this.tableName); | |
| 138 this.element.appendChild(errorMsgElement); | |
| 139 }, | |
| 140 | |
| 141 _refreshButtonClicked: function(event) | |
| 142 { | |
| 143 this.update(); | |
| 144 }, | |
| 145 | |
| 146 __proto__: WebInspector.SimpleView.prototype | |
| 147 }; | |
| OLD | NEW |