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.
- package/README.md +169 -0
- package/index.js +3 -0
- package/package.json +27 -0
- package/sample.js +37 -0
- package/scripts/airbnb.js +73 -0
- package/scripts/airbnb2.js +74 -0
- package/scripts/airbnb2_queries.js +231 -0
- package/scripts/airbnb_queries.js +264 -0
- package/scripts/downloadFile.js +42 -0
- package/scripts/express.js +46 -0
- package/scripts/fastify.js +79 -0
- package/scripts/flights.js +75 -0
- package/scripts/flights2.js +81 -0
- package/scripts/flights2_queries.js +453 -0
- package/scripts/flights_queries.js +403 -0
- package/src/QyAcl.js +252 -0
- package/src/QyAclSaver.js +14 -0
- package/src/QyAclSaver_Worker.js +29 -0
- package/src/QyAclWriter.js +19 -0
- package/src/QyBatch.js +501 -0
- package/src/QyBinWriter.js +140 -0
- package/src/QyCD.js +61 -0
- package/src/QyCache.js +212 -0
- package/src/QyCompressor.js +60 -0
- package/src/QyCompressor_Worker.js +13 -0
- package/src/QyDB.js +122 -0
- package/src/QyDefaultOptions.js +59 -0
- package/src/QyDir.js +192 -0
- package/src/QyFetch.js +38 -0
- package/src/QyFile.js +124 -0
- package/src/QyFileContentUtils.js +175 -0
- package/src/QyFileLogger.js +58 -0
- package/src/QyIndex.js +237 -0
- package/src/QyIndexPropTree.js +92 -0
- package/src/QyIntersectNode.js +48 -0
- package/src/QyItem.js +105 -0
- package/src/QyJsonSaver.js +20 -0
- package/src/QyKVData.js +289 -0
- package/src/QyKVDataCleaner.js +17 -0
- package/src/QyKVDataCleaner_Worker.js +94 -0
- package/src/QyKVDataLoader.js +65 -0
- package/src/QyKVDataSaver.js +17 -0
- package/src/QyKVDataSaver_Worker.js +81 -0
- package/src/QyLogFileSaver.js +14 -0
- package/src/QyLogFileSaver_Worker.js +26 -0
- package/src/QyLogger.js +76 -0
- package/src/QyMessageWorker.js +41 -0
- package/src/QyMessager.js +84 -0
- package/src/QyMessager_Run.js +13 -0
- package/src/QyMod.js +15 -0
- package/src/QyOpRunner.js +73 -0
- package/src/QyQueue.js +60 -0
- package/src/QySaver.js +83 -0
- package/src/QySnapshotCompactor.js +17 -0
- package/src/QySnapshotCompactor_Worker.js +151 -0
- package/src/QySnapshotSaver.js +17 -0
- package/src/QySnapshotSaver_Worker.js +164 -0
- package/src/QySnapshots.js +354 -0
- package/src/QyStructure.js +50 -0
- package/src/QyTrigger.js +133 -0
- package/src/QyUnionNode.js +105 -0
- package/src/QyUtils.js +250 -0
- package/src/QyWorker.js +33 -0
- package/src/hackernews.js +93 -0
- package/src/rpc/evalCode.js +9 -0
- package/src/rpc/getFileContent.js +16 -0
- package/src/rpc/getSubItems.js +32 -0
- package/src/rpc/queryFiles.js +33 -0
- package/src/rpc/reloadRpc.js +1 -0
- package/src/simulate.js +114 -0
- package/src/simulate2.js +110 -0
- package/src/soc_pokec.js +43 -0
- package/static/bootstrap-5.3.8-dist/css/bootstrap.min.css +6 -0
- package/static/bootstrap-5.3.8-dist/js/bootstrap.bundle.js +6312 -0
- package/static/datafolderui/QyStyledElement.js +30 -0
- package/static/datafolderui/QyUIFolderTree.js +203 -0
- package/static/datafolderui/QyUIUtils.js +42 -0
- package/static/datafolderui/display-tree.js +108 -0
- package/static/datafolderui/explore-tree.js +122 -0
- package/static/datafolderui/folder-tree.js +5 -0
- package/static/datafolderui/hscrpt.js +25 -0
- package/static/datafolderui/index.css +6 -0
- package/static/datafolderui/index.html +20 -0
- package/static/datafolderui/json-view.js +74 -0
- package/static/datafolderui/kv-input.js +66 -0
- package/static/datafolderui/list-input.js +52 -0
- package/static/datafolderui/main-page.js +98 -0
- package/static/datafolderui/num-input.js +27 -0
- package/static/datafolderui/query-editor.js +229 -0
- package/static/datafolderui/querySelectorShadowRoot.js +24 -0
- package/static/datafolderui/resizable-input.js +67 -0
- package/static/favicon.ico +0 -0
- package/static/icons-1.13.1/font/bootstrap-icons.min.css +5 -0
- package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff +0 -0
- package/static/icons-1.13.1/font/fonts/bootstrap-icons.woff2 +0 -0
- package/static/json-view/dist/jsonview.js +433 -0
- package/static/tree.js/tree.css +106 -0
- package/static/tree.js/tree.js +374 -0
- package/static/w2ui/dist/w2ui.min.css +2 -0
- package/static/w2ui/src/less/icons/icons.json +1 -0
- package/static/w2ui/src/less/icons/preview.html +33 -0
- package/static/w2ui/src/less/icons/readme.md +15 -0
- package/static/w2ui/src/less/icons/svg/box.svg +3 -0
- package/static/w2ui/src/less/icons/svg/check.svg +3 -0
- package/static/w2ui/src/less/icons/svg/colors.svg +3 -0
- package/static/w2ui/src/less/icons/svg/columns.svg +5 -0
- package/static/w2ui/src/less/icons/svg/cross.svg +4 -0
- package/static/w2ui/src/less/icons/svg/drop.svg +6 -0
- package/static/w2ui/src/less/icons/svg/empty.svg +3 -0
- package/static/w2ui/src/less/icons/svg/eye-dropper.svg +4 -0
- package/static/w2ui/src/less/icons/svg/info.svg +8 -0
- package/static/w2ui/src/less/icons/svg/paste.svg +4 -0
- package/static/w2ui/src/less/icons/svg/pencil.svg +5 -0
- package/static/w2ui/src/less/icons/svg/plus.svg +3 -0
- package/static/w2ui/src/less/icons/svg/reload.svg +5 -0
- package/static/w2ui/src/less/icons/svg/search.svg +3 -0
- package/static/w2ui/src/less/icons/svg/settings.svg +8 -0
- package/static/w2ui/src/less/icons/w2ui-font.css +36 -0
- package/static/w2ui/src/less/icons/w2ui-font.woff +0 -0
- package/static/w2ui/src/less/src/buttons.less +184 -0
- package/static/w2ui/src/less/src/common.less +541 -0
- package/static/w2ui/src/less/src/fields.less +302 -0
- package/static/w2ui/src/less/src/form.less +319 -0
- package/static/w2ui/src/less/src/grid.less +1057 -0
- package/static/w2ui/src/less/src/icons.less +37 -0
- package/static/w2ui/src/less/src/layout.less +86 -0
- package/static/w2ui/src/less/src/mixins.less +87 -0
- package/static/w2ui/src/less/src/popup.less +277 -0
- package/static/w2ui/src/less/src/sidebar.less +343 -0
- package/static/w2ui/src/less/src/tabs.less +145 -0
- package/static/w2ui/src/less/src/toolbar.less +219 -0
- package/static/w2ui/src/less/src/tooltip.less +948 -0
- package/static/w2ui/src/less/w2ui.less +196 -0
- package/static/w2ui/src/locale/az-az.json +114 -0
- package/static/w2ui/src/locale/ba-ba.json +114 -0
- package/static/w2ui/src/locale/bg-bg.json +114 -0
- package/static/w2ui/src/locale/ca-es.json +114 -0
- package/static/w2ui/src/locale/da-dk.json +114 -0
- package/static/w2ui/src/locale/de-de.json +114 -0
- package/static/w2ui/src/locale/en-gb.json +17 -0
- package/static/w2ui/src/locale/en-us.json +17 -0
- package/static/w2ui/src/locale/es-ar.json +115 -0
- package/static/w2ui/src/locale/es-cr.json +119 -0
- package/static/w2ui/src/locale/es-es.json +114 -0
- package/static/w2ui/src/locale/es-mx.json +114 -0
- package/static/w2ui/src/locale/fr-fr.json +114 -0
- package/static/w2ui/src/locale/gl-es.json +114 -0
- package/static/w2ui/src/locale/hr-hr.json +114 -0
- package/static/w2ui/src/locale/hu-hu.json +114 -0
- package/static/w2ui/src/locale/id-id.json +114 -0
- package/static/w2ui/src/locale/it-it.json +114 -0
- package/static/w2ui/src/locale/ja-jp.json +114 -0
- package/static/w2ui/src/locale/kk-kz.json +116 -0
- package/static/w2ui/src/locale/ko-kr.json +114 -0
- package/static/w2ui/src/locale/lt-lt.json +114 -0
- package/static/w2ui/src/locale/nl-nl.json +114 -0
- package/static/w2ui/src/locale/no-no.json +114 -0
- package/static/w2ui/src/locale/pl-pl.json +114 -0
- package/static/w2ui/src/locale/pt-br.json +114 -0
- package/static/w2ui/src/locale/ru-ru.json +116 -0
- package/static/w2ui/src/locale/sk-sk.json +114 -0
- package/static/w2ui/src/locale/sl-si.json +116 -0
- package/static/w2ui/src/locale/sr-rs.json +114 -0
- package/static/w2ui/src/locale/tr-tr.json +114 -0
- package/static/w2ui/src/locale/uk-ua.json +114 -0
- package/static/w2ui/src/locale/zh-cn.json +114 -0
- package/static/w2ui/src/locale/zh-tw.json +114 -0
- package/static/w2ui/src/query.js +583 -0
- package/static/w2ui/src/readme.md +11 -0
- package/static/w2ui/src/w2base.js +311 -0
- package/static/w2ui/src/w2compat.js +207 -0
- package/static/w2ui/src/w2field.js +1854 -0
- package/static/w2ui/src/w2form.js +2411 -0
- package/static/w2ui/src/w2grid.js +8916 -0
- package/static/w2ui/src/w2layout.js +1194 -0
- package/static/w2ui/src/w2locale.js +129 -0
- package/static/w2ui/src/w2popup.js +909 -0
- package/static/w2ui/src/w2sidebar.js +1769 -0
- package/static/w2ui/src/w2tabs.js +669 -0
- package/static/w2ui/src/w2toolbar.js +1180 -0
- package/static/w2ui/src/w2tooltip.js +3134 -0
- 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,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,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);
|