datafolder 1.0.0

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.
Files changed (182) hide show
  1. package/README.md +169 -0
  2. package/index.js +3 -0
  3. package/package.json +27 -0
  4. package/sample.js +37 -0
  5. package/scripts/airbnb.js +73 -0
  6. package/scripts/airbnb2.js +74 -0
  7. package/scripts/airbnb2_queries.js +231 -0
  8. package/scripts/airbnb_queries.js +264 -0
  9. package/scripts/downloadFile.js +42 -0
  10. package/scripts/express.js +46 -0
  11. package/scripts/fastify.js +79 -0
  12. package/scripts/flights.js +75 -0
  13. package/scripts/flights2.js +81 -0
  14. package/scripts/flights2_queries.js +453 -0
  15. package/scripts/flights_queries.js +403 -0
  16. package/src/QyAcl.js +252 -0
  17. package/src/QyAclSaver.js +14 -0
  18. package/src/QyAclSaver_Worker.js +29 -0
  19. package/src/QyAclWriter.js +19 -0
  20. package/src/QyBatch.js +501 -0
  21. package/src/QyBinWriter.js +140 -0
  22. package/src/QyCD.js +61 -0
  23. package/src/QyCache.js +212 -0
  24. package/src/QyCompressor.js +60 -0
  25. package/src/QyCompressor_Worker.js +13 -0
  26. package/src/QyDB.js +122 -0
  27. package/src/QyDefaultOptions.js +59 -0
  28. package/src/QyDir.js +192 -0
  29. package/src/QyFetch.js +38 -0
  30. package/src/QyFile.js +124 -0
  31. package/src/QyFileContentUtils.js +175 -0
  32. package/src/QyFileLogger.js +58 -0
  33. package/src/QyIndex.js +237 -0
  34. package/src/QyIndexPropTree.js +92 -0
  35. package/src/QyIntersectNode.js +48 -0
  36. package/src/QyItem.js +105 -0
  37. package/src/QyJsonSaver.js +20 -0
  38. package/src/QyKVData.js +289 -0
  39. package/src/QyKVDataCleaner.js +17 -0
  40. package/src/QyKVDataCleaner_Worker.js +94 -0
  41. package/src/QyKVDataLoader.js +65 -0
  42. package/src/QyKVDataSaver.js +17 -0
  43. package/src/QyKVDataSaver_Worker.js +81 -0
  44. package/src/QyLogFileSaver.js +14 -0
  45. package/src/QyLogFileSaver_Worker.js +26 -0
  46. package/src/QyLogger.js +76 -0
  47. package/src/QyMessageWorker.js +41 -0
  48. package/src/QyMessager.js +84 -0
  49. package/src/QyMessager_Run.js +13 -0
  50. package/src/QyMod.js +15 -0
  51. package/src/QyOpRunner.js +73 -0
  52. package/src/QyQueue.js +60 -0
  53. package/src/QySaver.js +83 -0
  54. package/src/QySnapshotCompactor.js +17 -0
  55. package/src/QySnapshotCompactor_Worker.js +151 -0
  56. package/src/QySnapshotSaver.js +17 -0
  57. package/src/QySnapshotSaver_Worker.js +164 -0
  58. package/src/QySnapshots.js +354 -0
  59. package/src/QyStructure.js +50 -0
  60. package/src/QyTrigger.js +133 -0
  61. package/src/QyUnionNode.js +105 -0
  62. package/src/QyUtils.js +250 -0
  63. package/src/QyWorker.js +33 -0
  64. package/src/hackernews.js +93 -0
  65. package/src/rpc/evalCode.js +9 -0
  66. package/src/rpc/getFileContent.js +16 -0
  67. package/src/rpc/getSubItems.js +32 -0
  68. package/src/rpc/queryFiles.js +33 -0
  69. package/src/rpc/reloadRpc.js +1 -0
  70. package/src/simulate.js +114 -0
  71. package/src/simulate2.js +110 -0
  72. package/src/soc_pokec.js +43 -0
  73. package/static/bootstrap-5.3.8-dist/css/bootstrap.min.css +6 -0
  74. package/static/bootstrap-5.3.8-dist/js/bootstrap.bundle.js +6312 -0
  75. package/static/datafolderui/QyStyledElement.js +30 -0
  76. package/static/datafolderui/QyUIFolderTree.js +203 -0
  77. package/static/datafolderui/QyUIUtils.js +42 -0
  78. package/static/datafolderui/display-tree.js +108 -0
  79. package/static/datafolderui/explore-tree.js +122 -0
  80. package/static/datafolderui/folder-tree.js +5 -0
  81. package/static/datafolderui/hscrpt.js +25 -0
  82. package/static/datafolderui/index.css +6 -0
  83. package/static/datafolderui/index.html +20 -0
  84. package/static/datafolderui/json-view.js +74 -0
  85. package/static/datafolderui/kv-input.js +66 -0
  86. package/static/datafolderui/list-input.js +52 -0
  87. package/static/datafolderui/main-page.js +98 -0
  88. package/static/datafolderui/num-input.js +27 -0
  89. package/static/datafolderui/query-editor.js +229 -0
  90. package/static/datafolderui/querySelectorShadowRoot.js +24 -0
  91. package/static/datafolderui/resizable-input.js +67 -0
  92. package/static/favicon.ico +0 -0
  93. package/static/icons-1.13.1/font/bootstrap-icons.min.css +5 -0
  94. package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff +0 -0
  95. package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff2 +0 -0
  96. package/static/json-view/dist/jsonview.js +433 -0
  97. package/static/tree.js/tree.css +106 -0
  98. package/static/tree.js/tree.js +374 -0
  99. package/static/w2ui/dist/w2ui.min.css +2 -0
  100. package/static/w2ui/src/less/icons/icons.json +1 -0
  101. package/static/w2ui/src/less/icons/preview.html +33 -0
  102. package/static/w2ui/src/less/icons/readme.md +15 -0
  103. package/static/w2ui/src/less/icons/svg/box.svg +3 -0
  104. package/static/w2ui/src/less/icons/svg/check.svg +3 -0
  105. package/static/w2ui/src/less/icons/svg/colors.svg +3 -0
  106. package/static/w2ui/src/less/icons/svg/columns.svg +5 -0
  107. package/static/w2ui/src/less/icons/svg/cross.svg +4 -0
  108. package/static/w2ui/src/less/icons/svg/drop.svg +6 -0
  109. package/static/w2ui/src/less/icons/svg/empty.svg +3 -0
  110. package/static/w2ui/src/less/icons/svg/eye-dropper.svg +4 -0
  111. package/static/w2ui/src/less/icons/svg/info.svg +8 -0
  112. package/static/w2ui/src/less/icons/svg/paste.svg +4 -0
  113. package/static/w2ui/src/less/icons/svg/pencil.svg +5 -0
  114. package/static/w2ui/src/less/icons/svg/plus.svg +3 -0
  115. package/static/w2ui/src/less/icons/svg/reload.svg +5 -0
  116. package/static/w2ui/src/less/icons/svg/search.svg +3 -0
  117. package/static/w2ui/src/less/icons/svg/settings.svg +8 -0
  118. package/static/w2ui/src/less/icons/w2ui-font.css +36 -0
  119. package/static/w2ui/src/less/icons/w2ui-font.woff +0 -0
  120. package/static/w2ui/src/less/src/buttons.less +184 -0
  121. package/static/w2ui/src/less/src/common.less +541 -0
  122. package/static/w2ui/src/less/src/fields.less +302 -0
  123. package/static/w2ui/src/less/src/form.less +319 -0
  124. package/static/w2ui/src/less/src/grid.less +1057 -0
  125. package/static/w2ui/src/less/src/icons.less +37 -0
  126. package/static/w2ui/src/less/src/layout.less +86 -0
  127. package/static/w2ui/src/less/src/mixins.less +87 -0
  128. package/static/w2ui/src/less/src/popup.less +277 -0
  129. package/static/w2ui/src/less/src/sidebar.less +343 -0
  130. package/static/w2ui/src/less/src/tabs.less +145 -0
  131. package/static/w2ui/src/less/src/toolbar.less +219 -0
  132. package/static/w2ui/src/less/src/tooltip.less +948 -0
  133. package/static/w2ui/src/less/w2ui.less +196 -0
  134. package/static/w2ui/src/locale/az-az.json +114 -0
  135. package/static/w2ui/src/locale/ba-ba.json +114 -0
  136. package/static/w2ui/src/locale/bg-bg.json +114 -0
  137. package/static/w2ui/src/locale/ca-es.json +114 -0
  138. package/static/w2ui/src/locale/da-dk.json +114 -0
  139. package/static/w2ui/src/locale/de-de.json +114 -0
  140. package/static/w2ui/src/locale/en-gb.json +17 -0
  141. package/static/w2ui/src/locale/en-us.json +17 -0
  142. package/static/w2ui/src/locale/es-ar.json +115 -0
  143. package/static/w2ui/src/locale/es-cr.json +119 -0
  144. package/static/w2ui/src/locale/es-es.json +114 -0
  145. package/static/w2ui/src/locale/es-mx.json +114 -0
  146. package/static/w2ui/src/locale/fr-fr.json +114 -0
  147. package/static/w2ui/src/locale/gl-es.json +114 -0
  148. package/static/w2ui/src/locale/hr-hr.json +114 -0
  149. package/static/w2ui/src/locale/hu-hu.json +114 -0
  150. package/static/w2ui/src/locale/id-id.json +114 -0
  151. package/static/w2ui/src/locale/it-it.json +114 -0
  152. package/static/w2ui/src/locale/ja-jp.json +114 -0
  153. package/static/w2ui/src/locale/kk-kz.json +116 -0
  154. package/static/w2ui/src/locale/ko-kr.json +114 -0
  155. package/static/w2ui/src/locale/lt-lt.json +114 -0
  156. package/static/w2ui/src/locale/nl-nl.json +114 -0
  157. package/static/w2ui/src/locale/no-no.json +114 -0
  158. package/static/w2ui/src/locale/pl-pl.json +114 -0
  159. package/static/w2ui/src/locale/pt-br.json +114 -0
  160. package/static/w2ui/src/locale/ru-ru.json +116 -0
  161. package/static/w2ui/src/locale/sk-sk.json +114 -0
  162. package/static/w2ui/src/locale/sl-si.json +116 -0
  163. package/static/w2ui/src/locale/sr-rs.json +114 -0
  164. package/static/w2ui/src/locale/tr-tr.json +114 -0
  165. package/static/w2ui/src/locale/uk-ua.json +114 -0
  166. package/static/w2ui/src/locale/zh-cn.json +114 -0
  167. package/static/w2ui/src/locale/zh-tw.json +114 -0
  168. package/static/w2ui/src/query.js +583 -0
  169. package/static/w2ui/src/readme.md +11 -0
  170. package/static/w2ui/src/w2base.js +311 -0
  171. package/static/w2ui/src/w2compat.js +207 -0
  172. package/static/w2ui/src/w2field.js +1854 -0
  173. package/static/w2ui/src/w2form.js +2411 -0
  174. package/static/w2ui/src/w2grid.js +8916 -0
  175. package/static/w2ui/src/w2layout.js +1194 -0
  176. package/static/w2ui/src/w2locale.js +129 -0
  177. package/static/w2ui/src/w2popup.js +909 -0
  178. package/static/w2ui/src/w2sidebar.js +1769 -0
  179. package/static/w2ui/src/w2tabs.js +669 -0
  180. package/static/w2ui/src/w2toolbar.js +1180 -0
  181. package/static/w2ui/src/w2tooltip.js +3134 -0
  182. package/static/w2ui/src/w2utils.js +2457 -0
@@ -0,0 +1,30 @@
1
+ import {
2
+ appendStyle
3
+ } from "./QyUIUtils.js";
4
+
5
+ class QyStyledElement extends HTMLElement {
6
+ constructor(e, t) {
7
+ super(), Array.isArray(e) && (t = e, e = void 0);
8
+ var n = this.attachShadow({
9
+ mode: "open"
10
+ });
11
+ if (t) for (var l of t) {
12
+ var r = document.createElement("link");
13
+ r.setAttribute("rel", "stylesheet"), r.setAttribute("href", l), n.appendChild(r);
14
+ }
15
+ e && appendStyle(n, e);
16
+ }
17
+ }
18
+
19
+ function defineStyledElement(e, t, n) {
20
+ customElements.define(e, class extends QyStyledElement {
21
+ constructor() {
22
+ super(t, n);
23
+ }
24
+ });
25
+ }
26
+
27
+ export {
28
+ QyStyledElement,
29
+ defineStyledElement
30
+ };
@@ -0,0 +1,203 @@
1
+ import {
2
+ w2layout
3
+ } from "../w2ui/src/w2compat.js";
4
+
5
+ import {
6
+ h
7
+ } from "./hscrpt.js";
8
+
9
+ import {
10
+ setHeight
11
+ } from "./QyUIUtils.js";
12
+
13
+ import "./folder-tree.js";
14
+
15
+ import "./json-view.js";
16
+
17
+ class QyUIFolderTree extends HTMLElement {
18
+ constructor() {
19
+ super();
20
+ }
21
+ connectedCallback() {
22
+ this.parentDiv = this.parentElement;
23
+ var e = new w2layout({
24
+ box: this.parentDiv,
25
+ name: "layout_" + this.parentDiv.id,
26
+ panels: [ {
27
+ type: "left",
28
+ size: 300,
29
+ resizable: !0
30
+ }, {
31
+ type: "main"
32
+ }, {
33
+ type: "bottom",
34
+ size: 10
35
+ } ]
36
+ }), t = (e.el("left").append(this._createToolbar(), this._createFolderTree()),
37
+ e.el("main"));
38
+ t.append(this._createPathUL(), this._createJsonViewDiv()), e.el("bottom").append(this._createMsgSpan()),
39
+ Object.assign(this, {
40
+ layout: e,
41
+ mainDiv: t,
42
+ selectedHierarchy: {},
43
+ fileContentMap: {},
44
+ namePath: []
45
+ }), e.on("resize:done", () => this.onSizeChange());
46
+ }
47
+ onSizeChange() {
48
+ var {
49
+ parentDiv: e,
50
+ folderTreeDiv: t,
51
+ jsonViewDiv: s,
52
+ mainDiv: i
53
+ } = this;
54
+ setHeight(e, document.body.clientHeight - e.offsetTop), setHeight(t, i.clientHeight - t.offsetTop - 1),
55
+ setHeight(s, i.clientHeight - s.offsetTop - 1), this._updateContentDisplay();
56
+ }
57
+ showMsg(e) {
58
+ this.msgSpan.innerText = e;
59
+ }
60
+ _updateContentDisplay() {
61
+ var e = this.selectedElement;
62
+ e ? this._showSelected(e) : this._deleteJsonTree();
63
+ }
64
+ _deleteJsonTree() {
65
+ var e = this.jsonTree;
66
+ e && (jsonview.destroy(e), this.jsonTree = void 0);
67
+ }
68
+ _createMsgSpan() {
69
+ return this.msgSpan = h("span");
70
+ }
71
+ _createJsonViewDiv() {
72
+ return h("json-view", [ this.jsonViewDiv = h("div", {
73
+ style: {
74
+ overflow: "auto"
75
+ }
76
+ }) ]);
77
+ }
78
+ _createPathUL() {
79
+ return this.pathUL = h("ul", {
80
+ classList: "nav nav-tabs"
81
+ });
82
+ }
83
+ _createSearchIcon() {
84
+ return h("div", {
85
+ classList: "btn-group btn-group-sm",
86
+ role: "group"
87
+ }, [ h("button", {
88
+ classList: "btn btn-outline-success",
89
+ type: "submit"
90
+ }, [ h("i", {
91
+ classList: "bi bi-search"
92
+ }) ]) ]);
93
+ }
94
+ _createSearchInput() {
95
+ return h("div", {
96
+ classList: "input-group"
97
+ }, [ h("input", {
98
+ id: "searchInput_" + this.parentDiv.id,
99
+ type: "text",
100
+ classList: "form-control",
101
+ style: {
102
+ width: "150px"
103
+ }
104
+ }) ]);
105
+ }
106
+ _createToolbar() {
107
+ return this.toolbarDiv = h("div", {
108
+ classList: "btn-toolbar",
109
+ role: "toolbar",
110
+ style: "border-bottom: 1px solid #e4e4e4"
111
+ }, [ this._createSearchInput(), this._createSearchIcon() ]), this.toolbarDiv;
112
+ }
113
+ _createFolderTree() {
114
+ var e = h("folder-tree", [ this.folderTreeDiv = h("div", {
115
+ style: {
116
+ overflow: "auto"
117
+ }
118
+ }) ]);
119
+ return this.folderTree = new Tree(this.folderTreeDiv, {
120
+ navigate: !0
121
+ }), this.folderTree.on("select", e => {
122
+ this.clickSrc || (this.clickSrc = "folderTree", this._updateHierarchy(e)),
123
+ this.selectedElement != e && (this.selectedElement = e, this._updateContentDisplay()),
124
+ "folderTree" == this.clickSrc && (this.clickSrc = void 0);
125
+ }), e;
126
+ }
127
+ _showSelected(e) {
128
+ "file" == e.dataset.type ? this._showSelectedFile(e) : this._showSelectedDir(e);
129
+ }
130
+ _showSelectedFile(e) {
131
+ this._showJson(this.fileContentMap[e.dataset.fileContentKey]);
132
+ }
133
+ _showSelectedDir(e) {
134
+ "false" != e.parentElement.dataset.loaded ? this._showJson(e.dataset) : this._showJson({
135
+ loaded: !1
136
+ });
137
+ }
138
+ _showJson(e) {
139
+ this._deleteJsonTree();
140
+ e = jsonview.create(e);
141
+ jsonview.render(e, this.jsonViewDiv), jsonview.expand(e), this.jsonTree = e;
142
+ }
143
+ _updateHierarchy(e) {
144
+ var {
145
+ folderTree: t,
146
+ selectedHierarchy: s
147
+ } = this, t = t.hierarchy(e).reverse();
148
+ this.namePath = t.map(e => e.textContent), Object.assign(s, t), this._updatePathTabs();
149
+ }
150
+ _onPathTabsClick(t) {
151
+ var {
152
+ clickSrc: e,
153
+ rootFolder: s,
154
+ selectedHierarchy: i,
155
+ folderTree: r
156
+ } = this;
157
+ s.parentElement.open = !0;
158
+ for (let e = 0; e < t; ++e) i[e].parentElement.open = !0;
159
+ s = i[t];
160
+ "tab" == e && s.scrollIntoView({
161
+ block: "center"
162
+ }), r.select(s);
163
+ }
164
+ _createPathTab(e, t) {
165
+ t = h("span", {
166
+ classList: "nav-link",
167
+ "data-bs-toggle": "tab",
168
+ role: "tab",
169
+ style: "cursor:pointer",
170
+ onclick: () => {
171
+ this.clickSrc || (this.clickSrc = "tab"), this._onPathTabsClick(e),
172
+ "tab" == this.clickSrc && (this.clickSrc = void 0);
173
+ }
174
+ }, [ t ]);
175
+ this.pathUL.append(h("li", {
176
+ classList: "nav-item"
177
+ }, [ t ]));
178
+ }
179
+ _updatePathTabs() {
180
+ var {
181
+ namePath: s,
182
+ pathUL: e
183
+ } = this, i = e.children, r = s.length;
184
+ let a = 0 < r;
185
+ for (let t = 0; t < r; ++t) {
186
+ if (t >= i.length) {
187
+ for (let e = t; e < r; ++e) this._createPathTab(e, s[e]);
188
+ break;
189
+ }
190
+ var o = i[t].children[0], n = s[t];
191
+ o.innerText != n && (o.innerText = n, a = !1);
192
+ }
193
+ if (!a) for (;r < i.length; ) e.removeChild(e.lastElementChild);
194
+ 0 < r && i[r - 1].children[0].click();
195
+ }
196
+ _resetPathTabs() {
197
+ this.pathUL.replaceChildren();
198
+ }
199
+ }
200
+
201
+ export {
202
+ QyUIFolderTree
203
+ };
@@ -0,0 +1,42 @@
1
+ async function rpc(e, n, o) {
2
+ var t = `/rpc/${e}?args=` + encodeURIComponent(JSON.stringify(n));
3
+ let i;
4
+ if (o) {
5
+ let t;
6
+ "object" == typeof o ? (t = "application/json", o = JSON.stringify(o)) : t = "text/plain",
7
+ i = {
8
+ method: "POST",
9
+ headers: {
10
+ "Content-Type": t
11
+ },
12
+ body: o
13
+ };
14
+ }
15
+ try {
16
+ var a = await fetch(t, i);
17
+ if (a.ok) return await a.json();
18
+ console.error("Response status: " + a.status);
19
+ } catch (t) {
20
+ console.error(`Calling ${e} with ${n} failed:`, t);
21
+ }
22
+ }
23
+
24
+ function setHeight(t, e) {
25
+ t.style.height = e + "px";
26
+ }
27
+
28
+ function setWidth(t, e) {
29
+ t.style.width = e + "px";
30
+ }
31
+
32
+ function appendStyle(t, e) {
33
+ var n = document.createElement("style");
34
+ n.textContent = e, t.appendChild(n);
35
+ }
36
+
37
+ export {
38
+ rpc,
39
+ setHeight,
40
+ setWidth,
41
+ appendStyle
42
+ };
@@ -0,0 +1,108 @@
1
+ import {
2
+ h
3
+ } from "./hscrpt.js";
4
+
5
+ import {
6
+ rpc
7
+ } from "./QyUIUtils.js";
8
+
9
+ import {
10
+ QyUIFolderTree
11
+ } from "./QyUIFolderTree.js";
12
+
13
+ customElements.define("display-tree", class extends QyUIFolderTree {
14
+ constructor() {
15
+ super();
16
+ }
17
+ connectedCallback() {
18
+ super.connectedCallback(), this._appendToolbar();
19
+ var e = this.folderTree;
20
+ this.rootFolder = e.folder({
21
+ name: "/",
22
+ open: !0
23
+ }), e.select(this.rootFolder);
24
+ }
25
+ showTree(e, t) {
26
+ this._resetTree(), this._resetPathTabs(), this.countSpan.innerText = t,
27
+ this.msgSpan.innerText = "Total " + t, this.rootFolder = this.folderTree.folder({
28
+ name: "/",
29
+ open: !0
30
+ }), this._constructFolderTree(this.rootFolder, e), this.folderTree.select(this.rootFolder),
31
+ this.tree = e;
32
+ }
33
+ _appendToolbar() {
34
+ this.toolbarDiv.append(this._createCountSpan());
35
+ }
36
+ _createCountSpan() {
37
+ return this.countSpan = h("span", {
38
+ classList: "btn btn-success ms-auto"
39
+ }, [ "0" ]);
40
+ }
41
+ _resetTree() {
42
+ this._deleteJsonTree();
43
+ var {
44
+ rootFolder: e,
45
+ countSpan: t,
46
+ msgSpan: r
47
+ } = this;
48
+ t.innerText = "0", r.innerText = "", e && (e.parentElement.remove(), Object.assign(this, {
49
+ rootFolder: void 0,
50
+ fileContentMap: {}
51
+ }));
52
+ }
53
+ async _queryFiles() {
54
+ let {
55
+ countSpan,
56
+ queryEditor
57
+ } = this, {
58
+ queryText
59
+ } = queryEditor;
60
+ try {
61
+ eval("((x)=>x)(" + queryText + ")");
62
+ } catch (exception) {
63
+ return void (countSpan.innerText = exception.message);
64
+ }
65
+ let {
66
+ queryId
67
+ } = this, {
68
+ tree,
69
+ count
70
+ } = (++this.queryId, await rpc("queryFiles", queryText));
71
+ queryId + 1 == this.queryId && this.showTree(tree, count);
72
+ }
73
+ _constructFolderTree(e, t) {
74
+ var {
75
+ folderTree: r,
76
+ fileContentMap: o
77
+ } = this, s = e.dataset, {
78
+ fullPathHash: t,
79
+ subdirMap: n,
80
+ fileMap: i
81
+ } = t;
82
+ if (t && (s.fullPathHash = t), n) {
83
+ var a, t = Object.keys(n).sort();
84
+ for (a of t) {
85
+ var l = r.folder({
86
+ name: a
87
+ }, e);
88
+ this._constructFolderTree(l, n[a]);
89
+ }
90
+ t = t.length;
91
+ 0 < t && (s.subdirCount = t);
92
+ }
93
+ if (i) {
94
+ var c, t = Object.keys(i).sort();
95
+ for (c of t) {
96
+ var {
97
+ fileContent: d,
98
+ fileContentKey: h
99
+ } = i[c];
100
+ o[r.file({
101
+ name: c
102
+ }, e).dataset.fileContentKey = h] = d;
103
+ }
104
+ t = t.length;
105
+ 0 < t && (s.fileCount = t);
106
+ }
107
+ }
108
+ });
@@ -0,0 +1,122 @@
1
+ import {
2
+ rpc
3
+ } from "./QyUIUtils.js";
4
+
5
+ import {
6
+ QyUIFolderTree
7
+ } from "./QyUIFolderTree.js";
8
+
9
+ import {
10
+ h
11
+ } from "./hscrpt.js";
12
+
13
+ let config = {
14
+ showHiddenFolder: !1
15
+ };
16
+
17
+ customElements.define("explore-tree", class extends QyUIFolderTree {
18
+ constructor() {
19
+ super();
20
+ }
21
+ connectedCallback() {
22
+ super.connectedCallback();
23
+ var e = config.showHiddenFolder, t = (this._appendToolbar(e), this.checkTooltip = new bootstrap.Tooltip(this.checkLabel),
24
+ this).folderTree, o = (t.on("fetch", async e => {
25
+ await this._loadSubItems(e), e.resolve(), e == this.selectedElement && this._showSelectedDir(e);
26
+ }), t.asyncFolder({
27
+ name: "/",
28
+ open: !0
29
+ }));
30
+ Object.assign(this, {
31
+ showHiddenFolder: e,
32
+ rootFolder: o
33
+ }), t.select(o);
34
+ }
35
+ _appendToolbar(e) {
36
+ this.toolbarDiv.append(this._createShowHiddenCheck(e));
37
+ }
38
+ _createShowHiddenCheck(e) {
39
+ return h("div", {
40
+ classList: "btn-group btn-group-sm ms-1",
41
+ role: "group"
42
+ }, [ h("input", {
43
+ type: "checkbox",
44
+ classList: "btn-check",
45
+ id: "showHiddenFolderCheck",
46
+ checked: e,
47
+ onchange: () => this._toggleShowHiddenFolder()
48
+ }), this.checkLabel = h("label", {
49
+ classList: "btn btn-outline-primary",
50
+ "data-bs-toggle": "tooltip",
51
+ "data-bs-placement": "top",
52
+ "data-bs-title": "Show hidden folder",
53
+ attrs: {
54
+ for: "showHiddenFolderCheck"
55
+ }
56
+ }, [ h("i", {
57
+ classList: "bi bi-window-plus"
58
+ }) ]) ]);
59
+ }
60
+ _toggleShowHiddenFolder() {
61
+ var {
62
+ showHiddenFolder: e,
63
+ rootHiddenFolder: t,
64
+ checkTooltip: o
65
+ } = this;
66
+ this.showHiddenFolder = !e, t && (t.parentElement.hidden = e), o.setContent({
67
+ ".tooltip-inner": (e ? "Show" : "Hide") + " hidden folder"
68
+ });
69
+ }
70
+ async _showSelectedFile(e) {
71
+ var t, o = e.dataset, {
72
+ namePath: n,
73
+ fileContentMap: i
74
+ } = this;
75
+ let l;
76
+ l = o.fileContentKey ? i[o.fileContentKey] : ({
77
+ fileContent: n,
78
+ fileContentKey: t
79
+ } = await this._getFileContent(n), i[o.fileContentKey = t] = n), e == this.selectedElement && this._showJson(l);
80
+ }
81
+ async _loadSubItems(t) {
82
+ var o = t.dataset, {
83
+ namePath: n,
84
+ folderTree: i,
85
+ rootFolder: l,
86
+ showHiddenFolder: s
87
+ } = this, n = await this._getSubItems(n);
88
+ if (n) {
89
+ var {
90
+ fullPathHash: n,
91
+ subdirList: d,
92
+ fileList: r
93
+ } = n;
94
+ n && (o.fullPathHash = n);
95
+ let e;
96
+ if (0 < d.length) {
97
+ for (var a of d) t == l && "%" == a ? e = !0 : i.asyncFolder({
98
+ name: a
99
+ }, t);
100
+ o.subdirCount = d.length;
101
+ }
102
+ if (e && ((n = i.asyncFolder({
103
+ name: "%"
104
+ }, t)).parentElement.hidden = !s, this.rootHiddenFolder = n), 0 < r.length) {
105
+ for (var h of r) i.file({
106
+ name: h
107
+ }, t);
108
+ o.fileCount = r.length;
109
+ }
110
+ }
111
+ }
112
+ _getSubItems(e) {
113
+ return rpc("getSubItems", {
114
+ dirPath: e
115
+ });
116
+ }
117
+ _getFileContent(e) {
118
+ return rpc("getFileContent", {
119
+ filePath: e
120
+ });
121
+ }
122
+ });
@@ -0,0 +1,5 @@
1
+ import {
2
+ defineStyledElement
3
+ } from "./QyStyledElement.js";
4
+
5
+ defineStyledElement("folder-tree", [ "../tree.js/tree.css" ]);
@@ -0,0 +1,25 @@
1
+ function h(t, e, r) {
2
+ Array.isArray(e) && (r = e, e = {});
3
+ var s, i = document.createElement(t);
4
+ for (s in e) {
5
+ var o = e[s];
6
+ if ("style" === s) i.style = toStyleStr(o); else if ("classList" === s) i.classList = toClassList(o); else if (s.startsWith("data-") || s.startsWith("aria-")) i.setAttribute(s, o); else if ("attrs" === s) for (var n in o) i.setAttribute(n, o[n]); else if ("on" === s) for (var a in o) i.addEventListener(a, o[a]); else i[s] = o;
7
+ }
8
+ if ("function" == typeof i.compose && i.compose(), r) {
9
+ var f, l = i.shadowRoot || i;
10
+ for (f of r.filter(t => null != t)) l.appendChild("string" == typeof f ? document.createTextNode(f) : f);
11
+ }
12
+ return i;
13
+ }
14
+
15
+ function toStyleStr(t) {
16
+ return "string" == typeof t ? t : Object.entries(t).map(([ t, e ]) => t + ":" + e).join(";");
17
+ }
18
+
19
+ function toClassList(t) {
20
+ return "string" == typeof t ? t : t.join(" ");
21
+ }
22
+
23
+ export {
24
+ h
25
+ };
@@ -0,0 +1,6 @@
1
+ * {
2
+ font-size: 14px;
3
+ }
4
+ body {
5
+ height: 100vh;
6
+ }
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <title>datafolder UI</title>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <!-- <link rel="stylesheet" href="../bulma/css/bulma.min.css" /> -->
8
+ <link rel="stylesheet" href="../w2ui/dist/w2ui.min.css" id="mainCSS" />
9
+ <link rel="stylesheet" href="../bootstrap-5.3.8-dist/css/bootstrap.min.css" />
10
+ <link rel="stylesheet" href="../icons-1.13.1/font/bootstrap-icons.min.css" />
11
+ <link rel="stylesheet" href="index.css" />
12
+ </head>
13
+ <body>
14
+ <script src="./querySelectorShadowRoot.js"></script>
15
+ <script src="../tree.js/tree.js"></script>
16
+ <script src="../json-view/dist/jsonview.js"></script>
17
+ <script src="../bootstrap-5.3.8-dist/js/bootstrap.bundle.js"></script>
18
+ <script type="module" src="main-page.js"></script>
19
+ </body>
20
+ </html>
@@ -0,0 +1,74 @@
1
+ import {
2
+ defineStyledElement
3
+ } from "./QyStyledElement.js";
4
+
5
+ let cssText = `
6
+ .json-container {
7
+ font-family: "Open Sans";
8
+ font-size: 14px;
9
+ background-color: #fff;
10
+ color: gray;
11
+ box-sizing: border-box;
12
+ }
13
+ .json-container .line {
14
+ margin: 4px 0;
15
+ display: flex;
16
+ justify-content: flex-start;
17
+ }
18
+ .json-container .caret-icon {
19
+ width: 18px;
20
+ text-align: center;
21
+ cursor: pointer;
22
+ }
23
+ .json-container .empty-icon {
24
+ width: 18px;
25
+ }
26
+ .json-container .json-type {
27
+ margin-right: 4px;
28
+ margin-left: 4px;
29
+ }
30
+ .json-container .json-key {
31
+ color: #444;
32
+ margin-right: 4px;
33
+ margin-left: 4px;
34
+ }
35
+ .json-container .json-index {
36
+ margin-right: 4px;
37
+ margin-left: 4px;
38
+ }
39
+ .json-container .json-value {
40
+ margin-left: 8px;
41
+ }
42
+ .json-container .json-number {
43
+ color: #f9ae58;
44
+ }
45
+ .json-container .json-boolean {
46
+ color: #ec5f66;
47
+ }
48
+ .json-container .json-string {
49
+ color: #86b25c;
50
+ }
51
+ .json-container .json-size {
52
+ margin-right: 4px;
53
+ margin-left: 4px;
54
+ }
55
+ .json-container .hidden {
56
+ display: none;
57
+ }
58
+ .json-container .fas {
59
+ display: inline-block;
60
+ border-style: solid;
61
+ width: 0;
62
+ height: 0;
63
+ }
64
+ .json-container .fa-caret-down {
65
+ border-width: 6px 5px 0 5px;
66
+ border-color: gray rgba(0, 0, 0, 0);
67
+ }
68
+ .json-container .fa-caret-right {
69
+ border-width: 5px 0 5px 6px;
70
+ border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) gray;
71
+ }
72
+ `;
73
+
74
+ defineStyledElement("json-view", cssText);