datafolder 1.0.5 → 1.0.6
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 +4 -1
- package/data/sampleDataFolder/qykv/history/acl/1_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/2_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/3_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/4_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/history/acl/5_acl.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/1/1_vL.txt +10 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/2/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/3/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/1_vL.txt +1 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/4/2_vL.txt +9 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_pM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_prefixPM.txt +0 -0
- package/data/sampleDataFolder/qykv/snapshot/5/1_vL.txt +55 -0
- package/data/sampleDataFolder/qykv/snapshot/info/1.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/2.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/3.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/4.json +1 -0
- package/data/sampleDataFolder/qykv/snapshot/info/5.json +1 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/change.txt +58 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/stderr.txt +11 -0
- package/data/sampleDataFolder/qylog/2026/02/15/08/stdout.txt +36 -0
- package/package.json +1 -1
- package/sample.js +19 -19
- package/src/QyAcl.js +44 -44
- package/src/QyAclSaver_Worker.js +2 -2
- package/src/QyAclWriter.js +1 -1
- package/src/QyBatch.js +1 -3
- package/src/QyBinWriter.js +65 -66
- package/src/QyCD.js +63 -27
- package/src/QyCache.js +33 -33
- package/src/QyDB.js +4 -30
- package/src/QyDefaultOptions.js +2 -1
- package/src/QyFetch.js +4 -22
- package/src/QyFileLogger.js +2 -2
- package/src/QyKVData.js +159 -183
- package/src/QyKVDataCleaner_Worker.js +15 -14
- package/src/QyKVDataSaver_Worker.js +16 -16
- package/src/QyLogFileSaver.js +1 -1
- package/src/QyLogFileSaver_Worker.js +2 -2
- package/src/QyMod.js +7 -7
- package/src/QyOpRunner.js +19 -16
- package/src/QySnapshotCompactor_Worker.js +37 -36
- package/src/QySnapshotSaver_Worker.js +2 -2
- package/src/QySnapshots.js +141 -139
- package/src/QyUnionNode.js +2 -2
- package/src/rpc/evalCode.js +4 -4
- package/src/rpc/getFileContent.js +4 -4
- package/src/rpc/getSubItems.js +12 -12
- package/src/rpc/queryFiles.js +1 -1
- package/static/codemirror.bundle/editor.bundle.js +27906 -0
- package/static/datafolderui/QyUIFolderTree.js +121 -145
- package/static/datafolderui/QyUIUtils.js +9 -4
- package/static/datafolderui/code-mirror.js +35 -0
- package/static/datafolderui/display-tree.js +52 -86
- package/static/datafolderui/explore-tree.js +66 -81
- package/static/datafolderui/index.css +7 -0
- package/static/datafolderui/index.html +1 -0
- package/static/datafolderui/main-page.js +34 -55
- package/static/datafolderui/query-editor.js +178 -198
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
-
rpc as
|
|
2
|
+
rpc as f
|
|
3
3
|
} from "./QyUIUtils.js";
|
|
4
4
|
|
|
5
5
|
import {
|
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
} from "./QyUIFolderTree.js";
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
|
-
h as
|
|
10
|
+
h as l
|
|
11
11
|
} from "./hscrpt.js";
|
|
12
12
|
|
|
13
|
-
let
|
|
13
|
+
let n = {
|
|
14
14
|
showHiddenFolder: !1
|
|
15
15
|
};
|
|
16
16
|
|
|
@@ -20,32 +20,25 @@ customElements.define("explore-tree", class extends e {
|
|
|
20
20
|
}
|
|
21
21
|
connectedCallback() {
|
|
22
22
|
super.connectedCallback();
|
|
23
|
-
var e =
|
|
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 o("div", {
|
|
23
|
+
var e = n.showHiddenFolder, t = ((t = this).toolbarDiv.append(((n, e) => l("div", {
|
|
40
24
|
classList: "btn-group btn-group-sm ms-1",
|
|
41
25
|
role: "group"
|
|
42
|
-
}, [
|
|
26
|
+
}, [ l("input", {
|
|
43
27
|
type: "checkbox",
|
|
44
28
|
classList: "btn-check",
|
|
45
29
|
id: "showHiddenFolderCheck",
|
|
46
30
|
checked: e,
|
|
47
|
-
onchange: () =>
|
|
48
|
-
|
|
31
|
+
onchange: () => {
|
|
32
|
+
var e = n, {
|
|
33
|
+
showHiddenFolder: t,
|
|
34
|
+
rootHiddenFolder: o,
|
|
35
|
+
checkTooltip: l
|
|
36
|
+
} = e;
|
|
37
|
+
e.showHiddenFolder = !t, o && (o.parentElement.hidden = t), l.setContent({
|
|
38
|
+
".tooltip-inner": (t ? "Show" : "Hide") + " hidden folder"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}), n.checkLabel = l("label", {
|
|
49
42
|
classList: "btn btn-outline-primary",
|
|
50
43
|
"data-bs-toggle": "tooltip",
|
|
51
44
|
"data-bs-placement": "top",
|
|
@@ -53,70 +46,62 @@ customElements.define("explore-tree", class extends e {
|
|
|
53
46
|
attrs: {
|
|
54
47
|
for: "showHiddenFolderCheck"
|
|
55
48
|
}
|
|
56
|
-
}, [
|
|
49
|
+
}, [ l("i", {
|
|
57
50
|
classList: "bi bi-window-plus"
|
|
58
|
-
}) ]) ])
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
}) ]) ]))(t, e)), this.checkTooltip = new bootstrap.Tooltip(this.checkLabel),
|
|
52
|
+
this).folderTree, o = (t.on("fetch", async e => {
|
|
53
|
+
var t = this, o = e, l = o.dataset, {
|
|
54
|
+
namePath: n,
|
|
55
|
+
folderTree: s,
|
|
56
|
+
rootFolder: i,
|
|
57
|
+
showHiddenFolder: d
|
|
58
|
+
} = t;
|
|
59
|
+
if (n = await (e => f("getSubItems", {
|
|
60
|
+
dirPath: e
|
|
61
|
+
}))(n)) {
|
|
62
|
+
var {
|
|
63
|
+
fullPathHash: n,
|
|
64
|
+
subdirList: r,
|
|
65
|
+
fileList: a
|
|
66
|
+
} = n;
|
|
67
|
+
n && (l.fullPathHash = n);
|
|
68
|
+
let e;
|
|
69
|
+
if (0 < r.length) {
|
|
70
|
+
for (var h of r) o == i && "%" == h ? e = !0 : s.asyncFolder({
|
|
71
|
+
name: h
|
|
72
|
+
}, o);
|
|
73
|
+
l.subdirCount = r.length;
|
|
74
|
+
}
|
|
75
|
+
if (e && ((n = s.asyncFolder({
|
|
76
|
+
name: "%"
|
|
77
|
+
}, o)).parentElement.hidden = !d, t.rootHiddenFolder = n), 0 < a.length) {
|
|
78
|
+
for (var c of a) s.file({
|
|
79
|
+
name: c
|
|
80
|
+
}, o);
|
|
81
|
+
l.fileCount = a.length;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
await 0, e.resolve(), e == this.selectedElement && this.showSelectedDir(e);
|
|
85
|
+
}), t.asyncFolder({
|
|
86
|
+
name: "/",
|
|
87
|
+
open: !0
|
|
88
|
+
}));
|
|
89
|
+
Object.assign(this, {
|
|
62
90
|
showHiddenFolder: e,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
} = this;
|
|
66
|
-
this.showHiddenFolder = !e, t && (t.parentElement.hidden = e), o.setContent({
|
|
67
|
-
".tooltip-inner": (e ? "Show" : "Hide") + " hidden folder"
|
|
68
|
-
});
|
|
91
|
+
rootFolder: o
|
|
92
|
+
}), t.select(o);
|
|
69
93
|
}
|
|
70
|
-
async
|
|
94
|
+
async showSelectedFile(e) {
|
|
71
95
|
var t, o = e.dataset, {
|
|
72
|
-
namePath:
|
|
96
|
+
namePath: l,
|
|
73
97
|
fileContentMap: n
|
|
74
98
|
} = this;
|
|
75
|
-
let
|
|
76
|
-
|
|
77
|
-
fileContent:
|
|
99
|
+
let s;
|
|
100
|
+
s = o.fileContentKey ? n[o.fileContentKey] : ({
|
|
101
|
+
fileContent: l,
|
|
78
102
|
fileContentKey: t
|
|
79
|
-
} = await
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
var o = t.dataset, {
|
|
83
|
-
namePath: s,
|
|
84
|
-
folderTree: n,
|
|
85
|
-
rootFolder: i,
|
|
86
|
-
showHiddenFolder: l
|
|
87
|
-
} = this, s = await this._getSubItems(s);
|
|
88
|
-
if (s) {
|
|
89
|
-
var {
|
|
90
|
-
fullPathHash: s,
|
|
91
|
-
subdirList: d,
|
|
92
|
-
fileList: r
|
|
93
|
-
} = s;
|
|
94
|
-
s && (o.fullPathHash = s);
|
|
95
|
-
let e;
|
|
96
|
-
if (0 < d.length) {
|
|
97
|
-
for (var a of d) t == i && "%" == a ? e = !0 : n.asyncFolder({
|
|
98
|
-
name: a
|
|
99
|
-
}, t);
|
|
100
|
-
o.subdirCount = d.length;
|
|
101
|
-
}
|
|
102
|
-
if (e && ((s = n.asyncFolder({
|
|
103
|
-
name: "%"
|
|
104
|
-
}, t)).parentElement.hidden = !l, this.rootHiddenFolder = s), 0 < r.length) {
|
|
105
|
-
for (var h of r) n.file({
|
|
106
|
-
name: h
|
|
107
|
-
}, t);
|
|
108
|
-
o.fileCount = r.length;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
_getSubItems(e) {
|
|
113
|
-
return t("getSubItems", {
|
|
114
|
-
dirPath: e
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
_getFileContent(e) {
|
|
118
|
-
return t("getFileContent", {
|
|
119
|
-
filePath: e
|
|
120
|
-
});
|
|
103
|
+
} = await f("getFileContent", {
|
|
104
|
+
filePath: l
|
|
105
|
+
}), n[o.fileContentKey = t] = l), e == this.selectedElement && this.showContent(s);
|
|
121
106
|
}
|
|
122
107
|
});
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
<script src="../tree.js/tree.js"></script>
|
|
16
16
|
<script src="../json-view/dist/jsonview.js"></script>
|
|
17
17
|
<script src="../bootstrap-5.3.8-dist/js/bootstrap.bundle.js"></script>
|
|
18
|
+
<script src="../codemirror.bundle/editor.bundle.js"></script>
|
|
18
19
|
<script type="module" src="main-page.js"></script>
|
|
19
20
|
</body>
|
|
20
21
|
</html>
|
|
@@ -6,7 +6,7 @@ import "./explore-tree.js";
|
|
|
6
6
|
|
|
7
7
|
import "./query-editor.js";
|
|
8
8
|
|
|
9
|
-
let
|
|
9
|
+
let l = {
|
|
10
10
|
brandName: "datafolder UI",
|
|
11
11
|
tabNames: [ "Explore", "Query", "RPC", "Triggers" ]
|
|
12
12
|
};
|
|
@@ -19,24 +19,46 @@ customElements.define("main-page", class extends HTMLElement {
|
|
|
19
19
|
var {
|
|
20
20
|
brandName: e,
|
|
21
21
|
tabNames: t
|
|
22
|
-
} =
|
|
23
|
-
this.append(
|
|
22
|
+
} = l;
|
|
23
|
+
this.append(o("nav", {
|
|
24
|
+
classList: "navbar bg-body-tertiary"
|
|
25
|
+
}, [ ((e, t, a) => o("div", {
|
|
26
|
+
classList: "container-fluid"
|
|
27
|
+
}, [ (e => o("a", {
|
|
28
|
+
classList: "navbar-brand"
|
|
29
|
+
}, [ e ]))(t), ((e, t) => o("ul", {
|
|
30
|
+
classList: "nav nav-pills me-auto mb-2 mb-lg-0"
|
|
31
|
+
}, e.tabButtons = t.map(e => o("button", {
|
|
32
|
+
classList: "nav-link",
|
|
33
|
+
id: `pills-${e}-tab`,
|
|
34
|
+
"data-bs-toggle": "pill",
|
|
35
|
+
"data-bs-target": "#pills-" + e,
|
|
36
|
+
type: "button",
|
|
37
|
+
role: "tab"
|
|
38
|
+
}, [ e ]))))(e, a) ]))(this, e, t) ]), o("div", {
|
|
39
|
+
classList: "tab-content",
|
|
40
|
+
id: "pills-tabContent"
|
|
41
|
+
}, this.tabDivs = t.map(e => o("div", {
|
|
42
|
+
classList: "tab-pane",
|
|
43
|
+
id: "pills-" + e,
|
|
44
|
+
role: "tabpanel"
|
|
45
|
+
}))));
|
|
24
46
|
let {
|
|
25
|
-
tabButtons: [ a,
|
|
26
|
-
tabDivs: [
|
|
47
|
+
tabButtons: [ a, s ],
|
|
48
|
+
tabDivs: [ n, i ]
|
|
27
49
|
} = this;
|
|
28
50
|
bootstrap.Tab.getOrCreateInstance(a).show();
|
|
29
51
|
e = o("explore-tree");
|
|
30
|
-
|
|
31
|
-
let
|
|
32
|
-
|
|
52
|
+
n.appendChild(e);
|
|
53
|
+
let r = o("query-editor");
|
|
54
|
+
i.appendChild(r), Object.assign(this, {
|
|
33
55
|
exploreTree: e,
|
|
34
|
-
queryEditor:
|
|
35
|
-
}),
|
|
56
|
+
queryEditor: r
|
|
57
|
+
}), r.addEventListener("run", () => s.click());
|
|
36
58
|
t = () => this.onSizeChange();
|
|
37
59
|
document.addEventListener("DOMContentLoaded", t), window.addEventListener("resize", t),
|
|
38
|
-
|
|
39
|
-
|
|
60
|
+
s.addEventListener("shown.bs.tab", () => {
|
|
61
|
+
r.onSizeChange();
|
|
40
62
|
});
|
|
41
63
|
}
|
|
42
64
|
onSizeChange() {
|
|
@@ -46,49 +68,6 @@ customElements.define("main-page", class extends HTMLElement {
|
|
|
46
68
|
} = this;
|
|
47
69
|
e.onSizeChange(), t.onSizeChange();
|
|
48
70
|
}
|
|
49
|
-
_createNav(e, t) {
|
|
50
|
-
return o("nav", {
|
|
51
|
-
classList: "navbar bg-body-tertiary"
|
|
52
|
-
}, [ this._createNavBar(e, t) ]);
|
|
53
|
-
}
|
|
54
|
-
_createNavBar(e, t) {
|
|
55
|
-
return o("div", {
|
|
56
|
-
classList: "container-fluid"
|
|
57
|
-
}, [ this._createBrand(e), this._createTabButtons(t) ]);
|
|
58
|
-
}
|
|
59
|
-
_createTabButtons(e) {
|
|
60
|
-
return o("ul", {
|
|
61
|
-
classList: "nav nav-pills me-auto mb-2 mb-lg-0"
|
|
62
|
-
}, this.tabButtons = e.map(e => this._createTabButton(e)));
|
|
63
|
-
}
|
|
64
|
-
_createTabDivs(e) {
|
|
65
|
-
return o("div", {
|
|
66
|
-
classList: "tab-content",
|
|
67
|
-
id: "pills-tabContent"
|
|
68
|
-
}, this.tabDivs = e.map(e => this._createTabDiv(e)));
|
|
69
|
-
}
|
|
70
|
-
_createBrand(e) {
|
|
71
|
-
return o("a", {
|
|
72
|
-
classList: "navbar-brand"
|
|
73
|
-
}, [ e ]);
|
|
74
|
-
}
|
|
75
|
-
_createTabDiv(e) {
|
|
76
|
-
return o("div", {
|
|
77
|
-
classList: "tab-pane",
|
|
78
|
-
id: "pills-" + e,
|
|
79
|
-
role: "tabpanel"
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
_createTabButton(e) {
|
|
83
|
-
return o("button", {
|
|
84
|
-
classList: "nav-link",
|
|
85
|
-
id: `pills-${e}-tab`,
|
|
86
|
-
"data-bs-toggle": "pill",
|
|
87
|
-
"data-bs-target": "#pills-" + e,
|
|
88
|
-
type: "button",
|
|
89
|
-
role: "tab"
|
|
90
|
-
}, [ e ]);
|
|
91
|
-
}
|
|
92
71
|
}), document.body.append(o("main-page"));
|
|
93
72
|
|
|
94
73
|
import {
|