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 |