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,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