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,66 @@
|
|
|
1
|
+
import {
|
|
2
|
+
h
|
|
3
|
+
} from "./hscrpt.js";
|
|
4
|
+
|
|
5
|
+
let inputEvent = new Event("input");
|
|
6
|
+
|
|
7
|
+
customElements.define("kv-input", class extends HTMLElement {
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
}
|
|
11
|
+
compose() {
|
|
12
|
+
this.classList.add("row", "align-items-center", "p-1"), this.appendChild(this.labelDiv = h("span", {
|
|
13
|
+
classList: "col-form-label col-auto"
|
|
14
|
+
}, [ this.label + ": " ])), Object.assign(this, {
|
|
15
|
+
kvElementList: []
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
get text() {
|
|
19
|
+
return `{ ${this.kvElementList.map(({
|
|
20
|
+
keyElement: t,
|
|
21
|
+
valueElement: e
|
|
22
|
+
}) => ({
|
|
23
|
+
kText: t.text.trim(),
|
|
24
|
+
vText: e.text.trim()
|
|
25
|
+
})).filter(({
|
|
26
|
+
kText: t,
|
|
27
|
+
vText: e
|
|
28
|
+
}) => t && e).map(({
|
|
29
|
+
kText: t,
|
|
30
|
+
vText: e
|
|
31
|
+
}) => t + ": " + e).join(", ")} }`;
|
|
32
|
+
}
|
|
33
|
+
set(t) {
|
|
34
|
+
var e, s, {
|
|
35
|
+
labelDiv: n,
|
|
36
|
+
kvElementList: i
|
|
37
|
+
} = this;
|
|
38
|
+
0 < i.length && (this.replaceChildren(n), i.length = 0);
|
|
39
|
+
for ([ e, s ] of Object.entries(t)) this._createKVElement(e, s.toString());
|
|
40
|
+
return this._createKVElement(), this;
|
|
41
|
+
}
|
|
42
|
+
_createKVElement(t = "", e = "") {
|
|
43
|
+
let s = this.kvElementList, n = s.length;
|
|
44
|
+
var i = () => {
|
|
45
|
+
n == s.length - 1 && this._createKVElement(), this.dispatchEvent(inputEvent);
|
|
46
|
+
};
|
|
47
|
+
this.append(h("div", {
|
|
48
|
+
style: "display:contents"
|
|
49
|
+
}, [ t = h("resizable-input", {
|
|
50
|
+
attrs: {
|
|
51
|
+
value: t
|
|
52
|
+
},
|
|
53
|
+
oninput: i
|
|
54
|
+
}), ":" ]), h("div", {
|
|
55
|
+
style: "display:contents"
|
|
56
|
+
}, [ e = h("resizable-input", {
|
|
57
|
+
attrs: {
|
|
58
|
+
value: e
|
|
59
|
+
},
|
|
60
|
+
oninput: i
|
|
61
|
+
}) ])), s.push({
|
|
62
|
+
keyElement: t,
|
|
63
|
+
valueElement: e
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
h
|
|
3
|
+
} from "./hscrpt.js";
|
|
4
|
+
|
|
5
|
+
import "./resizable-input.js";
|
|
6
|
+
|
|
7
|
+
let inputEvent = new Event("input");
|
|
8
|
+
|
|
9
|
+
customElements.define("list-input", class extends HTMLElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
compose() {
|
|
14
|
+
this.classList.add("row", "align-items-center", "p-1"), this.appendChild(this.labelDiv = h("span", {
|
|
15
|
+
classList: "col-form-label col-auto"
|
|
16
|
+
}, [ this.label + ": " ])), Object.assign(this, {
|
|
17
|
+
elementList: []
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
get text() {
|
|
21
|
+
return `[ ${this.elementList.map(t => t.text.trim()).filter(t => t).join(", ")} ]`;
|
|
22
|
+
}
|
|
23
|
+
set(t) {
|
|
24
|
+
var e, {
|
|
25
|
+
labelDiv: n,
|
|
26
|
+
elementList: s
|
|
27
|
+
} = this;
|
|
28
|
+
0 < s.length && (this.replaceChildren(n), s.length = 0);
|
|
29
|
+
for (e of t) this._createInputElement(e.toString());
|
|
30
|
+
n = t.length;
|
|
31
|
+
return (0 == n || '"**"' != t[n - 1] && "'**'" != t[n - 1]) && this._createInputElement(),
|
|
32
|
+
this;
|
|
33
|
+
}
|
|
34
|
+
_createInputElement(t = "") {
|
|
35
|
+
let e = this.elementList, n = e.length, s;
|
|
36
|
+
this.append(h("div", {
|
|
37
|
+
style: "display:contents"
|
|
38
|
+
}, [ s = h("resizable-input", {
|
|
39
|
+
attrs: {
|
|
40
|
+
value: t
|
|
41
|
+
},
|
|
42
|
+
oninput: () => {
|
|
43
|
+
var t = s.text;
|
|
44
|
+
if ("'**'" == t || '"**"' == t) {
|
|
45
|
+
for (let t = n + 1; t < e.length; ++t) this.removeChild(e[t].parentElement);
|
|
46
|
+
e.length = n + 1;
|
|
47
|
+
} else n == e.length - 1 && this._createInputElement();
|
|
48
|
+
this.dispatchEvent(inputEvent);
|
|
49
|
+
}
|
|
50
|
+
}) ])), e.push(s);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import {
|
|
2
|
+
h
|
|
3
|
+
} from "./hscrpt.js";
|
|
4
|
+
|
|
5
|
+
import "./explore-tree.js";
|
|
6
|
+
|
|
7
|
+
import "./query-editor.js";
|
|
8
|
+
|
|
9
|
+
let config = {
|
|
10
|
+
brandName: "datafolder UI",
|
|
11
|
+
tabNames: [ "Explore", "Query", "RPC", "Triggers" ]
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
customElements.define("main-page", class extends HTMLElement {
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
connectedCallback() {
|
|
19
|
+
var {
|
|
20
|
+
brandName: e,
|
|
21
|
+
tabNames: t
|
|
22
|
+
} = config;
|
|
23
|
+
this.append(this._createNav(e, t), this._createTabDivs(t));
|
|
24
|
+
let {
|
|
25
|
+
tabButtons: [ a, r ],
|
|
26
|
+
tabDivs: [ n, s ]
|
|
27
|
+
} = this;
|
|
28
|
+
bootstrap.Tab.getOrCreateInstance(a).show();
|
|
29
|
+
e = h("explore-tree");
|
|
30
|
+
n.appendChild(e);
|
|
31
|
+
let i = h("query-editor");
|
|
32
|
+
s.appendChild(i), Object.assign(this, {
|
|
33
|
+
exploreTree: e,
|
|
34
|
+
queryEditor: i
|
|
35
|
+
}), i.addEventListener("run", () => r.click());
|
|
36
|
+
t = () => this.onSizeChange();
|
|
37
|
+
document.addEventListener("DOMContentLoaded", t), window.addEventListener("resize", t),
|
|
38
|
+
r.addEventListener("shown.bs.tab", () => {
|
|
39
|
+
i.onSizeChange();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
onSizeChange() {
|
|
43
|
+
var {
|
|
44
|
+
exploreTree: e,
|
|
45
|
+
queryEditor: t
|
|
46
|
+
} = this;
|
|
47
|
+
e.onSizeChange(), t.onSizeChange();
|
|
48
|
+
}
|
|
49
|
+
_createNav(e, t) {
|
|
50
|
+
return h("nav", {
|
|
51
|
+
classList: "navbar bg-body-tertiary"
|
|
52
|
+
}, [ this._createNavBar(e, t) ]);
|
|
53
|
+
}
|
|
54
|
+
_createNavBar(e, t) {
|
|
55
|
+
return h("div", {
|
|
56
|
+
classList: "container-fluid"
|
|
57
|
+
}, [ this._createBrand(e), this._createTabButtons(t) ]);
|
|
58
|
+
}
|
|
59
|
+
_createTabButtons(e) {
|
|
60
|
+
return h("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 h("div", {
|
|
66
|
+
classList: "tab-content",
|
|
67
|
+
id: "pills-tabContent"
|
|
68
|
+
}, this.tabDivs = e.map(e => this._createTabDiv(e)));
|
|
69
|
+
}
|
|
70
|
+
_createBrand(e) {
|
|
71
|
+
return h("a", {
|
|
72
|
+
classList: "navbar-brand"
|
|
73
|
+
}, [ e ]);
|
|
74
|
+
}
|
|
75
|
+
_createTabDiv(e) {
|
|
76
|
+
return h("div", {
|
|
77
|
+
classList: "tab-pane",
|
|
78
|
+
id: "pills-" + e,
|
|
79
|
+
role: "tabpanel"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
_createTabButton(e) {
|
|
83
|
+
return h("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
|
+
}), document.body.append(h("main-page"));
|
|
93
|
+
|
|
94
|
+
import {
|
|
95
|
+
rpc
|
|
96
|
+
} from "./QyUIUtils.js";
|
|
97
|
+
|
|
98
|
+
window.rpc = rpc;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
h
|
|
3
|
+
} from "./hscrpt.js";
|
|
4
|
+
|
|
5
|
+
import "./resizable-input.js";
|
|
6
|
+
|
|
7
|
+
let eventInput = new Event("input");
|
|
8
|
+
|
|
9
|
+
customElements.define("num-input", class extends HTMLElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
compose() {
|
|
14
|
+
this.style.display = "contents", this.append(h("span", {
|
|
15
|
+
classList: "col-form-label col-auto p-2"
|
|
16
|
+
}, [ this.label + ": " ]), this.resizableInput = h("resizable-input", {
|
|
17
|
+
oninput: () => this.dispatchEvent(eventInput)
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
get text() {
|
|
21
|
+
var {
|
|
22
|
+
label: t,
|
|
23
|
+
resizableInput: e
|
|
24
|
+
} = this, e = e.text.trim();
|
|
25
|
+
return e && "0" != e ? `,${t}:` + e : "";
|
|
26
|
+
}
|
|
27
|
+
});
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
w2popup
|
|
3
|
+
} from "../w2ui/src/w2compat.js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
h
|
|
7
|
+
} from "./hscrpt.js";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
rpc
|
|
11
|
+
} from "./QyUIUtils.js";
|
|
12
|
+
|
|
13
|
+
import {} from "./list-input.js";
|
|
14
|
+
|
|
15
|
+
import {} from "./kv-input.js";
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
setWidth
|
|
19
|
+
} from "./QyUIUtils.js";
|
|
20
|
+
|
|
21
|
+
import {} from "./display-tree.js";
|
|
22
|
+
|
|
23
|
+
import {} from "./num-input.js";
|
|
24
|
+
|
|
25
|
+
let historyQueryList = [ {
|
|
26
|
+
folder: [ '"flights"', '"*"', 1, "(x) => x >= 5 && x <= 7" ],
|
|
27
|
+
value: {
|
|
28
|
+
$or: '[{ _from: "airports/BIS" }, { _to: "airports/BIS" }]'
|
|
29
|
+
},
|
|
30
|
+
view: [ '"**"' ]
|
|
31
|
+
}, {
|
|
32
|
+
folder: [ '"flights"', '"*"', 1, "(x) => x >= 1 && x <= 7" ],
|
|
33
|
+
value: {
|
|
34
|
+
$or: '[{ _from: "airports/BIS" }, { _to: "airports/BIS" }]'
|
|
35
|
+
},
|
|
36
|
+
view: [ '"Distance"' ]
|
|
37
|
+
}, {
|
|
38
|
+
folder: [ '"airbnb"', '"Loft"', '"Entire home/apt"', '"Real Bed"' ],
|
|
39
|
+
value: {
|
|
40
|
+
address: '{ street: "Porto, Porto, Portugal" }'
|
|
41
|
+
},
|
|
42
|
+
view: [ '"name"' ],
|
|
43
|
+
limit: 9,
|
|
44
|
+
cursor: 9
|
|
45
|
+
} ], eventRun = new Event("run");
|
|
46
|
+
|
|
47
|
+
customElements.define("query-editor", class extends HTMLElement {
|
|
48
|
+
constructor() {
|
|
49
|
+
super();
|
|
50
|
+
}
|
|
51
|
+
compose() {
|
|
52
|
+
this.append(h("div", {
|
|
53
|
+
classList: "btn-toolbar",
|
|
54
|
+
role: "toolbar",
|
|
55
|
+
style: {
|
|
56
|
+
"border-bottom": "1px solid #e4e4e4"
|
|
57
|
+
}
|
|
58
|
+
}, [ this._createDropDownButton(), this._createQueryInput(), this._createEditButton(), this._createRunButton(), this._createSaveButton() ]), this._createDisplayTree()),
|
|
59
|
+
this._createBody(), Object.assign(this, {
|
|
60
|
+
queryId: 0
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
onSizeChange() {
|
|
64
|
+
setWidth(this.queryInput, this.editButton.parentElement.offsetLeft - this.queryInput.parentElement.offsetLeft),
|
|
65
|
+
this.displayTree.onSizeChange();
|
|
66
|
+
}
|
|
67
|
+
get queryText() {
|
|
68
|
+
var {
|
|
69
|
+
folderList: t,
|
|
70
|
+
matchKVList: e,
|
|
71
|
+
viewList: r,
|
|
72
|
+
limitInput: s,
|
|
73
|
+
cursorInput: i
|
|
74
|
+
} = this;
|
|
75
|
+
return `{folder:${t.text},value:${e.text},view:${r.text} ${s.text} ${i.text}}`;
|
|
76
|
+
}
|
|
77
|
+
_createDisplayTree() {
|
|
78
|
+
return h("div", [ this.displayTree = h("display-tree") ]);
|
|
79
|
+
}
|
|
80
|
+
_createSaveButton() {
|
|
81
|
+
return h("div", {
|
|
82
|
+
classList: "btn-group btn-group-sm me-2",
|
|
83
|
+
role: "group"
|
|
84
|
+
}, [ h("button", {
|
|
85
|
+
classList: "btn btn-primary",
|
|
86
|
+
type: "button",
|
|
87
|
+
onclick: () => {
|
|
88
|
+
console.log("Save");
|
|
89
|
+
}
|
|
90
|
+
}, [ "Save" ]) ]);
|
|
91
|
+
}
|
|
92
|
+
_createEditButton() {
|
|
93
|
+
return h("div", {
|
|
94
|
+
classList: "btn-group btn-group-sm me-2",
|
|
95
|
+
role: "group"
|
|
96
|
+
}, [ this.editButton = h("button", {
|
|
97
|
+
classList: "btn btn-primary",
|
|
98
|
+
type: "button",
|
|
99
|
+
onclick: () => this._toggleEditor()
|
|
100
|
+
}, [ "Edit" ]) ]);
|
|
101
|
+
}
|
|
102
|
+
_createRunButton() {
|
|
103
|
+
return h("div", {
|
|
104
|
+
classList: "btn-group btn-group-sm me-2",
|
|
105
|
+
role: "group"
|
|
106
|
+
}, [ h("button", {
|
|
107
|
+
classList: "btn btn-primary",
|
|
108
|
+
type: "button",
|
|
109
|
+
onclick: () => this._queryFiles()
|
|
110
|
+
}, [ "Run" ]) ]);
|
|
111
|
+
}
|
|
112
|
+
_createQueryInput() {
|
|
113
|
+
return h("div", {
|
|
114
|
+
classList: "input-group me-auto"
|
|
115
|
+
}, [ this.queryInput = h("input", {
|
|
116
|
+
id: "queryInput",
|
|
117
|
+
type: "text",
|
|
118
|
+
classList: "form-control",
|
|
119
|
+
attrs: {
|
|
120
|
+
readonly: !0
|
|
121
|
+
}
|
|
122
|
+
}) ]);
|
|
123
|
+
}
|
|
124
|
+
_createDropDownButton() {
|
|
125
|
+
return h("div", {
|
|
126
|
+
classList: "btn-group btn-grou-sm"
|
|
127
|
+
}, [ h("button", {
|
|
128
|
+
classList: "btn btn-success dropdown-toggle",
|
|
129
|
+
type: "button",
|
|
130
|
+
"data-bs-toggle": "dropdown"
|
|
131
|
+
}, [ h("i", {
|
|
132
|
+
classList: "bi bi-clock"
|
|
133
|
+
}) ]), h("ul", {
|
|
134
|
+
classList: "dropdown-menu"
|
|
135
|
+
}, this._createHistoryDropDownList()) ]);
|
|
136
|
+
}
|
|
137
|
+
_createHistoryDropDownList() {
|
|
138
|
+
return historyQueryList.map(t => h("li", [ h("span", {
|
|
139
|
+
classList: "dropdown-item",
|
|
140
|
+
style: "cursor:pointer;",
|
|
141
|
+
onclick: () => this._setQueryFromHistory(t)
|
|
142
|
+
}, [ JSON.stringify(t) ]) ]));
|
|
143
|
+
}
|
|
144
|
+
async _queryFiles() {
|
|
145
|
+
let {
|
|
146
|
+
queryText,
|
|
147
|
+
queryId,
|
|
148
|
+
displayTree
|
|
149
|
+
} = this;
|
|
150
|
+
try {
|
|
151
|
+
eval("((x)=>x)(" + queryText + ")");
|
|
152
|
+
} catch (exception) {
|
|
153
|
+
return void displayTree.showMsg(exception.message);
|
|
154
|
+
}
|
|
155
|
+
++this.queryId;
|
|
156
|
+
let {
|
|
157
|
+
tree,
|
|
158
|
+
count
|
|
159
|
+
} = await rpc("queryFiles", queryText);
|
|
160
|
+
queryId + 1 == this.queryId && displayTree.showTree(tree, count);
|
|
161
|
+
}
|
|
162
|
+
_toggleEditor() {
|
|
163
|
+
"closed" == w2popup.status ? w2popup.open({
|
|
164
|
+
title: "Edit Query",
|
|
165
|
+
body: this._getPopupBody(),
|
|
166
|
+
blockPage: !1,
|
|
167
|
+
resizable: !0,
|
|
168
|
+
width: 700,
|
|
169
|
+
height: 290,
|
|
170
|
+
actions: {
|
|
171
|
+
Run: () => {
|
|
172
|
+
this.dispatchEvent(eventRun), this._queryFiles();
|
|
173
|
+
},
|
|
174
|
+
Save: () => {}
|
|
175
|
+
}
|
|
176
|
+
}) : w2popup.close();
|
|
177
|
+
}
|
|
178
|
+
_createBody() {
|
|
179
|
+
var {
|
|
180
|
+
folder: t,
|
|
181
|
+
value: e,
|
|
182
|
+
view: r
|
|
183
|
+
} = historyQueryList[0], s = this.body = h("div", {
|
|
184
|
+
classList: "container-fluid"
|
|
185
|
+
}), i = {
|
|
186
|
+
input: () => this._updateQueryText()
|
|
187
|
+
}, t = h("list-input", {
|
|
188
|
+
label: "folder",
|
|
189
|
+
on: i
|
|
190
|
+
}).set(t), e = h("kv-input", {
|
|
191
|
+
label: "value",
|
|
192
|
+
on: i
|
|
193
|
+
}).set(e), r = h("list-input", {
|
|
194
|
+
label: "view",
|
|
195
|
+
on: i
|
|
196
|
+
}).set(r), i = h("div", {
|
|
197
|
+
classList: "row align-items-center p-1"
|
|
198
|
+
}, [ this.limitInput = h("num-input", {
|
|
199
|
+
label: "limit",
|
|
200
|
+
on: i
|
|
201
|
+
}), this.cursorInput = h("num-input", {
|
|
202
|
+
label: "cursor",
|
|
203
|
+
on: i
|
|
204
|
+
}) ]);
|
|
205
|
+
return s.append(t, e, r, i), Object.assign(this, {
|
|
206
|
+
folderList: t,
|
|
207
|
+
matchKVList: e,
|
|
208
|
+
viewList: r
|
|
209
|
+
}), this._updateQueryText(), s;
|
|
210
|
+
}
|
|
211
|
+
_getPopupBody() {
|
|
212
|
+
return this.body || this._createBody();
|
|
213
|
+
}
|
|
214
|
+
_updateQueryText() {
|
|
215
|
+
this.queryInput.value = this.queryText;
|
|
216
|
+
}
|
|
217
|
+
_setQueryFromHistory(t) {
|
|
218
|
+
var {
|
|
219
|
+
folderList: e,
|
|
220
|
+
matchKVList: r,
|
|
221
|
+
viewList: s
|
|
222
|
+
} = this, {
|
|
223
|
+
folder: t,
|
|
224
|
+
value: i,
|
|
225
|
+
view: o
|
|
226
|
+
} = t;
|
|
227
|
+
e.set(t), r.set(i), s.set(o), this._updateQueryText();
|
|
228
|
+
}
|
|
229
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function* getShadowRootChild(e) {
|
|
2
|
+
for (var o of e.children) {
|
|
3
|
+
var t = o.shadowRoot;
|
|
4
|
+
t ? yield t : yield* getShadowRootChild(o);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function querySelectorShadowRoot(e, o) {
|
|
9
|
+
let t = e.querySelector(o);
|
|
10
|
+
if (t) return t;
|
|
11
|
+
var l = getShadowRootChild(e);
|
|
12
|
+
for (let e = l.next().value; e; e = l.next().value) if (t = e.querySelector(o)) return t;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function querySelectorAllShadowRoot(e, o) {
|
|
16
|
+
var t = [ ...e.querySelectorAll(o) ], l = getShadowRootChild(e);
|
|
17
|
+
for (let e = l.next().value; e; e = l.next().value) t.push(...e.querySelectorAll(o));
|
|
18
|
+
return t;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
Object.assign(globalThis, {
|
|
22
|
+
querySelectorShadowRoot: querySelectorShadowRoot,
|
|
23
|
+
querySelectorAllShadowRoot: querySelectorAllShadowRoot
|
|
24
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
h
|
|
3
|
+
} from "./hscrpt.js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
appendStyle
|
|
7
|
+
} from "./QyUIUtils.js";
|
|
8
|
+
|
|
9
|
+
customElements.define("resizable-input", class extends HTMLElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
compose() {
|
|
14
|
+
var t = this.getAttribute("value") || "";
|
|
15
|
+
let i, e;
|
|
16
|
+
this.append(h("div", {
|
|
17
|
+
classList: "input-container p-1"
|
|
18
|
+
}, [ i = h("span", {
|
|
19
|
+
classList: "size-span",
|
|
20
|
+
onclick: () => this._showInput()
|
|
21
|
+
}, [ t + " " ]), e = h("input", {
|
|
22
|
+
value: t,
|
|
23
|
+
id: "resizable-input" + ++id,
|
|
24
|
+
classList: "form-control",
|
|
25
|
+
style: "visibility:" + (t ? "hidden" : "visible"),
|
|
26
|
+
size: 1,
|
|
27
|
+
oninput: () => {
|
|
28
|
+
i.textContent = e.value + " ", this.dispatchEvent(eventInput);
|
|
29
|
+
},
|
|
30
|
+
onblur: () => {
|
|
31
|
+
"" != e.value && this._showSpan();
|
|
32
|
+
}
|
|
33
|
+
}) ])), Object.assign(this, {
|
|
34
|
+
sizeSpan: i,
|
|
35
|
+
input: e
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
get text() {
|
|
39
|
+
return this.input.value;
|
|
40
|
+
}
|
|
41
|
+
_showSpan() {
|
|
42
|
+
this.sizeSpan.style.visibility = "visible", this.input.style.visibility = "hidden";
|
|
43
|
+
}
|
|
44
|
+
_showInput() {
|
|
45
|
+
this.input.style.visibility = "visible", this.sizeSpan.style.visibility = "hidden",
|
|
46
|
+
this.input.focus();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
let id = 0, eventInput = new Event("input"), cssText = `
|
|
51
|
+
.input-container {
|
|
52
|
+
display: inline-grid;
|
|
53
|
+
}
|
|
54
|
+
.input-container > * {
|
|
55
|
+
/* Position input and span in the same grid cell */
|
|
56
|
+
grid-area: 1 / 1 / 2 / 2;
|
|
57
|
+
padding: 4px; /* Ensure padding matches on both */
|
|
58
|
+
font: inherit; /* Ensure font matches on both */
|
|
59
|
+
}
|
|
60
|
+
.size-span {
|
|
61
|
+
white-space: pre; /* Essential for accurate measurement */
|
|
62
|
+
}
|
|
63
|
+
input {
|
|
64
|
+
/*width: 100%; /* Input takes the width of its parent container (which the span sizes) */*/
|
|
65
|
+
}`;
|
|
66
|
+
|
|
67
|
+
appendStyle(document.head, cssText);
|
|
Binary file
|