sqlite-wasm-viewer 1.0.10 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -60,7 +60,7 @@ var DbViewerWorker = /*#__PURE__*/function () {
60
60
  case 'readSchema':
61
61
  {
62
62
  var _path = message.data.path;
63
- this.dbsByPath[_path] = new this.sqlite.oo1.OpfsDb(_path, 'c');
63
+ this.dbsByPath[_path] = new this.sqlite.oo1.OpfsDb(_path, 'w');
64
64
  var sql = "SELECT name, sql FROM sqlite_master WHERE type='table' ORDER BY name";
65
65
  var result = this.dbsByPath[_path].exec({
66
66
  sql: sql,
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ var _ExplorerView = require("./views/ExplorerView/ExplorerView");
16
16
  var _dbScanner = require("./dbScanner");
17
17
  var _EditCellView = require("./views/EditCellView/EditCellView");
18
18
  var _viewerState = require("./viewerState");
19
+ var _resizeHandler = require("./utils/resizeHandler");
19
20
  var viewer = null;
20
21
  var dbListEl = null;
21
22
  var tableViewer = null;
@@ -50,6 +51,8 @@ function showViewer() {
50
51
  hideViewer();
51
52
  };
52
53
  viewer.appendChild(closeBtn);
54
+
55
+ // Left Panel
53
56
  dbListEl = document.createElement('div');
54
57
  dbListEl.id = 'db_list';
55
58
  viewer.appendChild(dbListEl);
@@ -57,6 +60,8 @@ function showViewer() {
57
60
  // Middle Panel
58
61
  middlePanel = document.createElement('div');
59
62
  middlePanel.id = 'middle_panel';
63
+ var listResizeHandlerEl = (0, _resizeHandler.createResizeHandler)(dbListEl, middlePanel, true, viewer);
64
+ viewer.appendChild(listResizeHandlerEl);
60
65
  var tableViewEl = document.createElement('div');
61
66
  tableViewEl.id = 'table_view';
62
67
  middlePanel.appendChild(tableViewEl);
@@ -67,11 +72,13 @@ function showViewer() {
67
72
  rightPanel.id = 'right_panel';
68
73
  var executeSqlView = new _ExecuteSQLView.ExecuteSQLView(rightPanel);
69
74
  var editCellView = new _EditCellView.EditCellView(viewer, rightPanel);
75
+ var rightPanelResizeHandlerEl = (0, _resizeHandler.createResizeHandler)(middlePanel, rightPanel, false, viewer);
76
+ viewer.appendChild(rightPanelResizeHandlerEl);
70
77
  viewer.append(rightPanel);
71
78
  var worker = new Worker(new URL('./DbWorker', import.meta.url), {
72
79
  type: 'module'
73
80
  });
74
- explorerView = new _ExplorerView.ExplorerView(dbListEl);
81
+ explorerView = new _ExplorerView.ExplorerView(dbListEl, viewer);
75
82
  var collectDbFilesPromise = (0, _dbScanner.collectDbFiles)(config.isSqliteDatabase);
76
83
  var dbs = {};
77
84
  worker.onmessage = function (message) {
package/dist/styles.css CHANGED
@@ -8,7 +8,6 @@
8
8
  display: flex;
9
9
  padding: 10px;
10
10
  padding-top: 20px;
11
- gap: 8px;
12
11
  }
13
12
 
14
13
  #viewer * {
@@ -18,6 +17,7 @@
18
17
  #viewer .viewHeader {
19
18
  max-height: 20px;
20
19
  flex-basis: 20px;
20
+ flex-shrink: 0;
21
21
  line-height: 1.1rem;
22
22
  padding: 8px;
23
23
  display: flex;
@@ -34,7 +34,10 @@
34
34
  }
35
35
 
36
36
  #viewer #db_list {
37
- width: 200px;
37
+ width: 300px;
38
+ min-width: 180px;
39
+ max-width: 750px;
40
+ flex: 0 0 auto;
38
41
  padding: 5px;
39
42
  background-color: darkgray;
40
43
  display: flex;
@@ -56,9 +59,12 @@
56
59
  }
57
60
 
58
61
  #viewer #right_panel {
62
+ width: 300px;
63
+ min-width: 180px;
64
+ max-width: 500px;
65
+ flex: 0 0 auto;
59
66
  padding: 5px;
60
67
  background-color: darkgray;
61
- flex: 1;
62
68
  display: flex;
63
69
  flex-direction: column;
64
70
  gap: 5px;
@@ -67,3 +73,21 @@
67
73
  #viewer #right_panel > div {
68
74
  height: 33.33%;
69
75
  }
76
+
77
+ #viewer .resizeDragHandler {
78
+ width: 8px;
79
+ flex-shrink: 0;
80
+ cursor: col-resize;
81
+ }
82
+
83
+ #viewer .resizeDragHandler:hover::after {
84
+ border: 2px solid gray;
85
+ border-radius: 2px;
86
+ content: '';
87
+ display: block;
88
+ height: 80%;
89
+ margin: 0 auto;
90
+ position: relative;
91
+ top: 10%;
92
+ width: 0;
93
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createResizeHandler = createResizeHandler;
7
+ function createResizeHandler(leftEl, rightEl, resizeLeft, containerEl) {
8
+ var isDragging = false;
9
+ var initialWidth = 0;
10
+ var initialXPos = 0;
11
+ var lastWidth;
12
+ var controlledEl = resizeLeft ? leftEl : rightEl;
13
+ var storageWidthKey = "sqlite-wasm-viewer_".concat(controlledEl.id);
14
+ var resizeHandlerEl = document.createElement('div');
15
+ resizeHandlerEl.className = 'resizeDragHandler';
16
+ var storedWidthStr = localStorage.getItem(storageWidthKey);
17
+ if (storedWidthStr) {
18
+ controlledEl.style.width = "".concat(+storedWidthStr, "px");
19
+ }
20
+ resizeHandlerEl.addEventListener('dblclick', function () {
21
+ controlledEl.style.width = '';
22
+ localStorage.removeItem(storageWidthKey);
23
+ });
24
+ resizeHandlerEl.addEventListener('mousedown', function (event) {
25
+ isDragging = true;
26
+ containerEl.style.userSelect = 'none';
27
+ initialXPos = event.x;
28
+ initialWidth = controlledEl.offsetWidth;
29
+ lastWidth = undefined;
30
+ });
31
+ document.addEventListener('mousemove', function (event) {
32
+ if (isDragging) {
33
+ event.preventDefault();
34
+ event.stopPropagation();
35
+ var newWidth = resizeLeft ? initialWidth - initialXPos + event.clientX : initialWidth + initialXPos - event.clientX;
36
+ lastWidth = Math.max(newWidth, 0);
37
+ controlledEl.style.width = "".concat(lastWidth, "px");
38
+ }
39
+ });
40
+ document.addEventListener('mouseup', function () {
41
+ isDragging = false;
42
+ containerEl.style.userSelect = 'auto';
43
+ if (lastWidth) {
44
+ localStorage.setItem(storageWidthKey, lastWidth.toString());
45
+ }
46
+ });
47
+ return resizeHandlerEl;
48
+ }
@@ -15,12 +15,15 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _ty
15
15
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
16
16
  var EXPANDED_EXPLORER_ITEMS_KEY = 'expanded_explorer_items';
17
17
  var ExplorerView = /*#__PURE__*/function () {
18
- function ExplorerView(rootEl) {
18
+ function ExplorerView(rootEl, viewEl) {
19
19
  var _localStorage$getItem;
20
20
  _classCallCheck(this, ExplorerView);
21
21
  _defineProperty(this, "expandedItems", {});
22
22
  _defineProperty(this, "selectedItem", null);
23
+ _defineProperty(this, "showFullItemLabelTimeout", 0);
23
24
  this.dbs = [];
25
+ this.scheduleShowFullItemLabel = this.scheduleShowFullItemLabel.bind(this);
26
+ this.hideFullItemLabel = this.hideFullItemLabel.bind(this);
24
27
  var dbListHeader = document.createElement('div');
25
28
  dbListHeader.className = 'viewHeader';
26
29
  dbListHeader.innerText = 'Database List';
@@ -29,6 +32,10 @@ var ExplorerView = /*#__PURE__*/function () {
29
32
  this.containerEl.id = 'explorer_tree';
30
33
  rootEl.appendChild(this.containerEl);
31
34
  this.expandedItems = JSON.parse((_localStorage$getItem = localStorage.getItem(EXPANDED_EXPLORER_ITEMS_KEY)) !== null && _localStorage$getItem !== void 0 ? _localStorage$getItem : '{}');
35
+ this.fullItemLabelEl = document.createElement('div');
36
+ this.fullItemLabelEl.id = 'full_label';
37
+ this.fullItemLabelEl.style.display = 'none';
38
+ viewEl.appendChild(this.fullItemLabelEl);
32
39
  }
33
40
  _createClass(ExplorerView, [{
34
41
  key: "addDatabaseItem",
@@ -57,8 +64,11 @@ var ExplorerView = /*#__PURE__*/function () {
57
64
  var _this2 = this;
58
65
  var dbRoot = document.createDocumentFragment();
59
66
  var dbItem = document.createElement('div');
60
- dbItem.innerText = db.filename;
61
- dbItem.className = 'db';
67
+ this.setupCommonItemDom(dbItem);
68
+ this.setupLabelDom(dbItem, db.filename);
69
+ dbItem.classList.add('db');
70
+ dbItem.addEventListener('mouseenter', this.scheduleShowFullItemLabel);
71
+ dbItem.addEventListener('mouseleave', this.hideFullItemLabel);
62
72
  var tablesContainer = document.createElement('div');
63
73
  var isExpanded = !(this.expandedItems[db.filename] === false);
64
74
  this.buildExpandArrowDom(dbItem, tablesContainer, db, isExpanded);
@@ -76,15 +86,13 @@ var ExplorerView = /*#__PURE__*/function () {
76
86
  var _this3 = this;
77
87
  var expandArrow = document.createElement('div');
78
88
  expandArrow.className = 'expand';
79
- expandArrow.innerText = '>';
89
+ expandArrow.innerHTML = '▸';
80
90
  expandArrow.style.cursor = 'pointer';
81
91
  if (isExpanded) {
82
92
  expandArrow.classList.add('expanded');
83
93
  }
84
94
  expandArrow.onclick = function () {
85
95
  _this3.expandedItems[db.filename] = !_this3.expandedItems[db.filename];
86
-
87
- // eslint-disable-next-line no-param-reassign
88
96
  tablesContainer.style.display = _this3.expandedItems[db.filename] ? 'block' : 'none';
89
97
  expandArrow.classList.toggle('expanded');
90
98
  localStorage.setItem(EXPANDED_EXPLORER_ITEMS_KEY, JSON.stringify(_this3.expandedItems));
@@ -98,7 +106,8 @@ var ExplorerView = /*#__PURE__*/function () {
98
106
  _this$selectedItem,
99
107
  _this$selectedItem2;
100
108
  var tableItem = document.createElement('div');
101
- tableItem.className = 'table';
109
+ this.setupCommonItemDom(tableItem);
110
+ tableItem.classList.add('table');
102
111
  tableItem.onclick = function () {
103
112
  _this4.selectTable(tableItem, db);
104
113
  };
@@ -106,9 +115,7 @@ var ExplorerView = /*#__PURE__*/function () {
106
115
  this.selectedItem.tableElem = tableItem;
107
116
  tableItem.classList.add('selected');
108
117
  }
109
- var tableItemInner = document.createElement('div');
110
- tableItemInner.innerText = tableName;
111
- tableItem.appendChild(tableItemInner);
118
+ this.setupLabelDom(tableItem, tableName);
112
119
  tablesContainer.appendChild(tableItem);
113
120
  }
114
121
  }, {
@@ -131,6 +138,55 @@ var ExplorerView = /*#__PURE__*/function () {
131
138
  });
132
139
  }
133
140
  }
141
+ }, {
142
+ key: "setupCommonItemDom",
143
+ value: function setupCommonItemDom(item) {
144
+ item.classList.add('item');
145
+ item.addEventListener('mouseenter', this.scheduleShowFullItemLabel);
146
+ item.addEventListener('mouseleave', this.hideFullItemLabel);
147
+ }
148
+ }, {
149
+ key: "setupLabelDom",
150
+ value: function setupLabelDom(item, text) {
151
+ var label = document.createElement('div');
152
+ label.className = 'label';
153
+ label.innerText = text;
154
+ item.appendChild(label);
155
+ }
156
+ }, {
157
+ key: "scheduleShowFullItemLabel",
158
+ value: function scheduleShowFullItemLabel(event) {
159
+ var _this5 = this;
160
+ var item = event.target;
161
+ var label = item.querySelector('.label');
162
+ if (label && label.offsetWidth < label.scrollWidth) {
163
+ clearTimeout(this.showFullItemLabelTimeout);
164
+ this.showFullItemLabelTimeout = window.setTimeout(function () {
165
+ _this5.showFullItemLabel(item);
166
+ }, 300);
167
+ }
168
+ }
169
+ }, {
170
+ key: "hideFullItemLabel",
171
+ value: function hideFullItemLabel() {
172
+ clearTimeout(this.showFullItemLabelTimeout);
173
+ this.fullItemLabelEl.style.display = 'none';
174
+ }
175
+ }, {
176
+ key: "showFullItemLabel",
177
+ value: function showFullItemLabel(item) {
178
+ var _item$getBoundingClie = item.getBoundingClientRect(),
179
+ left = _item$getBoundingClie.left,
180
+ top = _item$getBoundingClie.top;
181
+ this.fullItemLabelEl.style.display = 'block';
182
+ this.fullItemLabelEl.style.left = "".concat(left - 1, "px");
183
+ this.fullItemLabelEl.style.top = "".concat(top - 1, "px");
184
+ this.fullItemLabelEl.style.backgroundColor = window.getComputedStyle(item).backgroundColor;
185
+ var labelNode = item.querySelector('.label').childNodes[0];
186
+ if (labelNode.nodeType === Node.TEXT_NODE) {
187
+ this.fullItemLabelEl.innerText = labelNode.textContent || '';
188
+ }
189
+ }
134
190
  }]);
135
191
  return ExplorerView;
136
192
  }();
@@ -1,21 +1,36 @@
1
1
  #explorer_tree {
2
2
  padding: 8px;
3
3
  padding-left: 20px;
4
- overflow-x: clip;
5
4
  overflow-y: auto;
6
5
  scrollbar-gutter: stable;
7
6
  }
8
7
 
8
+ #explorer_tree .item {
9
+ height: 20px;
10
+ white-space: nowrap;
11
+ text-overflow: ellipsis;
12
+ background-color: darkgray;
13
+ }
14
+
15
+ #explorer_tree .item > .label {
16
+ padding: 2px 4px;
17
+ overflow: hidden;
18
+ text-overflow: ellipsis;
19
+ }
20
+
9
21
  #explorer_tree > .db {
10
22
  position: relative;
11
- text-overflow: ellipsis;
12
- overflow-y: clip;
13
23
  }
14
24
 
15
25
  #explorer_tree .expand {
16
26
  position: absolute;
17
- top: 0;
18
- left: -15px;
27
+ top: 1px;
28
+ left: -20px;
29
+ width: 20px;
30
+ height: 20px;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
19
34
  transition: all .1s ease-in;
20
35
  }
21
36
 
@@ -25,15 +40,19 @@
25
40
 
26
41
  #explorer_tree .table {
27
42
  margin-left: 20px;
28
- height: 20px;
29
43
  cursor: pointer;
30
44
  }
31
45
 
32
- #explorer_tree .table > div {
33
- text-overflow: ellipsis;
34
- overflow-x: hidden;
35
- }
36
-
37
46
  #explorer_tree .table.selected {
38
47
  background-color: rgb(128, 128, 128);
48
+ }
49
+
50
+ #viewer #full_label {
51
+ position: absolute;
52
+ pointer-events: none;
53
+ z-index: 99999;
54
+ border: 1px solid gray;
55
+ background-color: darkgray;
56
+ padding: 2px 4px;
57
+ border-radius: 2px;
39
58
  }
@@ -123,6 +123,12 @@ var TableView = /*#__PURE__*/function () {
123
123
  };
124
124
  revertBtn.setAttribute('disabled', '');
125
125
  this.viewHeader.appendChild(revertBtn);
126
+ var dropTableBtn = document.createElement('button');
127
+ dropTableBtn.innerText = 'Delete table';
128
+ dropTableBtn.onclick = function () {
129
+ _this2.deleteTable();
130
+ };
131
+ this.viewHeader.appendChild(dropTableBtn);
126
132
  this.rootElement.appendChild(this.viewHeader);
127
133
  this.container = document.createElement('div');
128
134
  this.container.id = 'table_container';
@@ -158,23 +164,24 @@ var TableView = /*#__PURE__*/function () {
158
164
  columnHeader.innerHTML = column;
159
165
  var filterFieldCell = document.createElement('th');
160
166
  filterFieldCell.className = 'columnFilterCell';
161
- var filterField = document.createElement('input');
167
+ var filterInput = document.createElement('input');
162
168
  if (_this3.model.fitlers[column]) {
163
- filterField.value = _this3.model.fitlers[column];
169
+ filterInput.value = _this3.model.fitlers[column];
164
170
  }
165
- filterField.onkeydown = function (event) {
171
+ filterInput.onkeydown = function (event) {
166
172
  if (event.key === 'Escape') {
167
- filterField.value = '';
173
+ filterInput.value = '';
168
174
  _this3.model.fitlers[column] = '';
169
175
  _this3.scheduleUpdate();
170
176
  }
171
177
  };
172
- filterField.oninput = function () {
173
- _this3.model.fitlers[column] = filterField.value;
178
+ filterInput.oninput = function () {
179
+ _this3.model.fitlers[column] = filterInput.value;
174
180
  _this3.scheduleUpdate();
175
181
  };
176
- filterField.placeholder = 'Filter';
177
- filterFieldCell.appendChild(filterField);
182
+ filterInput.onmouseover = function () {};
183
+ filterInput.placeholder = 'Filter';
184
+ filterFieldCell.appendChild(filterInput);
178
185
  _this3.headerRow.appendChild(columnHeader);
179
186
  columnHeader.appendChild(filterFieldCell);
180
187
  });
@@ -238,6 +245,26 @@ var TableView = /*#__PURE__*/function () {
238
245
  this.requestRows(true);
239
246
  _viewerState.ViewerState.instance.setHasChanges(false);
240
247
  }
248
+ }, {
249
+ key: "deleteTable",
250
+ value: function deleteTable() {
251
+ if (!_viewerState.ViewerState.instance.selectedTable) {
252
+ return;
253
+ }
254
+ if (!_viewerState.ViewerState.instance.hasChanges) {
255
+ var _this$queryRunner;
256
+ (_this$queryRunner = this.queryRunner) === null || _this$queryRunner === void 0 ? void 0 : _this$queryRunner.runQuery({
257
+ sql: 'SAVEPOINT "RESTOREPOINT"',
258
+ parameters: []
259
+ });
260
+ }
261
+ var sql = "DROP TABLE \"".concat(_viewerState.ViewerState.instance.selectedTable.tableName, "\";");
262
+ this.queryRunner.runQuery({
263
+ sql: sql,
264
+ parameters: []
265
+ });
266
+ _viewerState.ViewerState.instance.setHasChanges(true);
267
+ }
241
268
  }, {
242
269
  key: "scheduleUpdate",
243
270
  value: function scheduleUpdate() {
@@ -54,6 +54,10 @@
54
54
  padding-top: 5px;
55
55
  }
56
56
 
57
+ #table_container .columnFilterCell input {
58
+ width: calc(100% - 8px);
59
+ }
60
+
57
61
  #table_container td, #table_container .columnHeaderCell {
58
62
  border: 1px solid lightgray;
59
63
  }
@@ -66,14 +70,12 @@
66
70
  #table_container td div {
67
71
  height: 40px;
68
72
  box-sizing: border-box;
69
- display: -webkit-box;
70
73
  padding: 4px;
71
74
  text-overflow: ellipsis;
72
75
  overflow: hidden;
73
76
  white-space: pre;
74
- -webkit-line-clamp: 2;
75
- -webkit-box-orient: vertical;
76
- line-height: 1.2em;
77
+ font-size: 15px;
78
+ line-height: 1.1em;
77
79
  }
78
80
 
79
81
  #table_container .nullValue {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sqlite-wasm-viewer",
3
- "version": "1.0.10",
3
+ "version": "1.0.13",
4
4
  "description": "An SQLite OPFS database viewer that enables database inspection and SQL command execution.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -52,4 +52,4 @@
52
52
  "peerDependencies": {
53
53
  "@sqlite.org/sqlite-wasm": "^3.x.x"
54
54
  }
55
- }
55
+ }