@wxn0brp/db 0.0.6 → 0.0.7

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 (140) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/CollectionManager.d.ts +11 -10
  3. package/dist/cjs/CollectionManager.js +4 -4
  4. package/dist/cjs/action.d.ts +10 -15
  5. package/dist/cjs/action.js +6 -12
  6. package/dist/cjs/client/database.d.ts +72 -0
  7. package/dist/cjs/{remote/client → client}/database.js +10 -10
  8. package/dist/cjs/database.d.ts +10 -18
  9. package/dist/cjs/database.js +9 -17
  10. package/dist/cjs/file/find.d.ts +3 -3
  11. package/dist/cjs/file/remove.d.ts +2 -2
  12. package/dist/cjs/file/update.d.ts +2 -2
  13. package/dist/cjs/file/update.js +8 -6
  14. package/dist/cjs/index.d.ts +8 -2
  15. package/dist/cjs/index.js +2 -2
  16. package/dist/cjs/relation.d.ts +3 -3
  17. package/dist/cjs/types/arg.d.ts +7 -1
  18. package/dist/cjs/types/updater.d.ts +26 -0
  19. package/dist/cjs/types/updater.js +5 -0
  20. package/dist/cjs/utils/updateObject.d.ts +4 -5
  21. package/dist/cjs/utils/updateObject.js +135 -5
  22. package/dist/esm/CollectionManager.d.ts +11 -10
  23. package/dist/esm/CollectionManager.js +4 -4
  24. package/dist/esm/action.d.ts +10 -15
  25. package/dist/esm/action.js +6 -12
  26. package/dist/esm/client/database.d.ts +72 -0
  27. package/dist/esm/{remote/client → client}/database.js +10 -10
  28. package/dist/esm/database.d.ts +10 -18
  29. package/dist/esm/database.js +9 -17
  30. package/dist/esm/file/find.d.ts +3 -3
  31. package/dist/esm/file/remove.d.ts +2 -2
  32. package/dist/esm/file/update.d.ts +2 -2
  33. package/dist/esm/file/update.js +11 -9
  34. package/dist/esm/index.d.ts +8 -2
  35. package/dist/esm/index.js +2 -2
  36. package/dist/esm/relation.d.ts +3 -3
  37. package/dist/esm/types/arg.d.ts +7 -1
  38. package/dist/esm/types/updater.d.ts +26 -0
  39. package/dist/esm/types/updater.js +4 -0
  40. package/dist/esm/utils/updateObject.d.ts +4 -5
  41. package/dist/esm/utils/updateObject.js +135 -5
  42. package/package.json +8 -11
  43. package/dist/cjs/remote/client/database.d.ts +0 -71
  44. package/dist/cjs/remote/server/auth.d.ts +0 -31
  45. package/dist/cjs/remote/server/auth.js +0 -99
  46. package/dist/cjs/remote/server/db.d.ts +0 -2
  47. package/dist/cjs/remote/server/db.js +0 -223
  48. package/dist/cjs/remote/server/function.d.ts +0 -2
  49. package/dist/cjs/remote/server/function.js +0 -89
  50. package/dist/cjs/remote/server/graph.d.ts +0 -2
  51. package/dist/cjs/remote/server/graph.js +0 -145
  52. package/dist/cjs/remote/server/gui/css/main.css +0 -130
  53. package/dist/cjs/remote/server/gui/css/scrool.css +0 -81
  54. package/dist/cjs/remote/server/gui/css/style.css +0 -61
  55. package/dist/cjs/remote/server/gui/favicon.svg +0 -12
  56. package/dist/cjs/remote/server/gui/html/data.html +0 -15
  57. package/dist/cjs/remote/server/gui/html/main.html +0 -46
  58. package/dist/cjs/remote/server/gui/html/nav.html +0 -25
  59. package/dist/cjs/remote/server/gui/html/popup.html +0 -51
  60. package/dist/cjs/remote/server/gui/index.html +0 -49
  61. package/dist/cjs/remote/server/gui/js/api.js +0 -166
  62. package/dist/cjs/remote/server/gui/js/index.js +0 -17
  63. package/dist/cjs/remote/server/gui/js/loadHTML.js +0 -16
  64. package/dist/cjs/remote/server/gui/js/popUp.js +0 -72
  65. package/dist/cjs/remote/server/gui/js/queryApi.js +0 -51
  66. package/dist/cjs/remote/server/gui/js/queryDb.js +0 -79
  67. package/dist/cjs/remote/server/gui/js/queryGraph.js +0 -144
  68. package/dist/cjs/remote/server/gui/js/render.js +0 -64
  69. package/dist/cjs/remote/server/gui/js/templates.js +0 -31
  70. package/dist/cjs/remote/server/gui/js/utils.js +0 -36
  71. package/dist/cjs/remote/server/gui/js/vars.js +0 -9
  72. package/dist/cjs/remote/server/gui/libs/core.js +0 -176
  73. package/dist/cjs/remote/server/gui/libs/d3.v7.min.js +0 -2
  74. package/dist/cjs/remote/server/gui/libs/handlebars.min.js +0 -29
  75. package/dist/cjs/remote/server/gui/libs/json5.min.js +0 -1
  76. package/dist/cjs/remote/server/index.d.ts +0 -1
  77. package/dist/cjs/remote/server/index.js +0 -66
  78. package/dist/cjs/remote/server/initDataBases.d.ts +0 -1
  79. package/dist/cjs/remote/server/initDataBases.js +0 -25
  80. package/dist/cjs/remote/server/pathUtils.d.ts +0 -1
  81. package/dist/cjs/remote/server/pathUtils.js +0 -12
  82. package/dist/cjs/remote/server/secret.d.ts +0 -1
  83. package/dist/cjs/remote/server/secret.js +0 -25
  84. package/dist/cjs/remote/serverMgmt/index.d.ts +0 -1
  85. package/dist/cjs/remote/serverMgmt/index.js +0 -87
  86. package/dist/esm/remote/client/database.d.ts +0 -71
  87. package/dist/esm/remote/server/auth.d.ts +0 -31
  88. package/dist/esm/remote/server/auth.js +0 -87
  89. package/dist/esm/remote/server/db.d.ts +0 -2
  90. package/dist/esm/remote/server/db.js +0 -218
  91. package/dist/esm/remote/server/function.d.ts +0 -2
  92. package/dist/esm/remote/server/function.js +0 -87
  93. package/dist/esm/remote/server/graph.d.ts +0 -2
  94. package/dist/esm/remote/server/graph.js +0 -143
  95. package/dist/esm/remote/server/gui/css/main.css +0 -130
  96. package/dist/esm/remote/server/gui/css/scrool.css +0 -81
  97. package/dist/esm/remote/server/gui/css/style.css +0 -61
  98. package/dist/esm/remote/server/gui/favicon.svg +0 -12
  99. package/dist/esm/remote/server/gui/html/data.html +0 -15
  100. package/dist/esm/remote/server/gui/html/main.html +0 -46
  101. package/dist/esm/remote/server/gui/html/nav.html +0 -25
  102. package/dist/esm/remote/server/gui/html/popup.html +0 -51
  103. package/dist/esm/remote/server/gui/index.html +0 -49
  104. package/dist/esm/remote/server/gui/js/api.js +0 -166
  105. package/dist/esm/remote/server/gui/js/index.js +0 -17
  106. package/dist/esm/remote/server/gui/js/loadHTML.js +0 -16
  107. package/dist/esm/remote/server/gui/js/popUp.js +0 -72
  108. package/dist/esm/remote/server/gui/js/queryApi.js +0 -51
  109. package/dist/esm/remote/server/gui/js/queryDb.js +0 -79
  110. package/dist/esm/remote/server/gui/js/queryGraph.js +0 -144
  111. package/dist/esm/remote/server/gui/js/render.js +0 -64
  112. package/dist/esm/remote/server/gui/js/templates.js +0 -31
  113. package/dist/esm/remote/server/gui/js/utils.js +0 -36
  114. package/dist/esm/remote/server/gui/js/vars.js +0 -9
  115. package/dist/esm/remote/server/gui/libs/core.js +0 -176
  116. package/dist/esm/remote/server/gui/libs/d3.v7.min.js +0 -2
  117. package/dist/esm/remote/server/gui/libs/handlebars.min.js +0 -29
  118. package/dist/esm/remote/server/gui/libs/json5.min.js +0 -1
  119. package/dist/esm/remote/server/index.d.ts +0 -1
  120. package/dist/esm/remote/server/index.js +0 -61
  121. package/dist/esm/remote/server/initDataBases.d.ts +0 -1
  122. package/dist/esm/remote/server/initDataBases.js +0 -20
  123. package/dist/esm/remote/server/pathUtils.d.ts +0 -1
  124. package/dist/esm/remote/server/pathUtils.js +0 -6
  125. package/dist/esm/remote/server/secret.d.ts +0 -1
  126. package/dist/esm/remote/server/secret.js +0 -19
  127. package/dist/esm/remote/serverMgmt/index.d.ts +0 -1
  128. package/dist/esm/remote/serverMgmt/index.js +0 -82
  129. /package/dist/cjs/{remote/client → client}/function.d.ts +0 -0
  130. /package/dist/cjs/{remote/client → client}/function.js +0 -0
  131. /package/dist/cjs/{remote/client → client}/graph.d.ts +0 -0
  132. /package/dist/cjs/{remote/client → client}/graph.js +0 -0
  133. /package/dist/cjs/{remote/client → client}/remote.d.ts +0 -0
  134. /package/dist/cjs/{remote/client → client}/remote.js +0 -0
  135. /package/dist/esm/{remote/client → client}/function.d.ts +0 -0
  136. /package/dist/esm/{remote/client → client}/function.js +0 -0
  137. /package/dist/esm/{remote/client → client}/graph.d.ts +0 -0
  138. /package/dist/esm/{remote/client → client}/graph.js +0 -0
  139. /package/dist/esm/{remote/client → client}/remote.d.ts +0 -0
  140. /package/dist/esm/{remote/client → client}/remote.js +0 -0
@@ -1,166 +0,0 @@
1
- const databaseGetMetaFunc = {
2
- async loadDbList(serverId){
3
- const server = serversMeta[serverId];
4
- if(!server) return;
5
- const res = await fetch(server.url + "getDbList", {
6
- method: "POST",
7
- headers: {
8
- "Content-Type": "application/json",
9
- "Authorization": server.token
10
- },
11
- }).then(res => res.json());
12
-
13
- if(res.err){
14
- alert(res.msg);
15
- return;
16
- }
17
- serversData[serverId] = {};
18
- const dbObj = serversData[serverId];
19
- res.result.forEach(db => {
20
- dbObj[db.name] = {
21
- collections: [],
22
- type: db.type
23
- };
24
- });
25
- return dbObj;
26
- },
27
-
28
- async loginToDb(serverUrl, serverName, login, password){
29
- if(!serverUrl.endsWith("/")) serverUrl += "/";
30
- const res = await fetch(serverUrl + "login", {
31
- method: "POST",
32
- headers: {
33
- "Content-Type": "application/json"
34
- },
35
- body: JSON.stringify({ login, password })
36
- }).then(res => res.json());
37
- if(res.err){
38
- alert(res.msg);
39
- return false;
40
- }
41
-
42
- const id = Object.keys(serversMeta).length + 1;
43
- serversMeta[id] = {
44
- url: serverUrl,
45
- token: res.token,
46
- name: serverName,
47
- login
48
- }
49
- return id;
50
- },
51
-
52
- async getDbTables(serverId, dbName){
53
- const server = serversMeta[serverId];
54
- if(!server) return;
55
-
56
- const res = await fetch(server.url + "db/" + getSelectedDatabase().type + "/getCollections", {
57
- method: "POST",
58
- headers: {
59
- "Content-Type": "application/json",
60
- "Authorization": server.token
61
- },
62
- body: JSON.stringify({ db: dbName })
63
- }).then(res => res.json());
64
- if(res.err){
65
- alert(res.msg);
66
- return;
67
- }
68
-
69
- serversData[serverId][dbName].collections = res.result;
70
- return res.result;
71
- },
72
-
73
- getAll(){
74
- const out = [];
75
- Object.keys(serversMeta).forEach(id => {
76
- const server = serversMeta[id];
77
- out.push({
78
- id,
79
- name: server.name,
80
- saved: server.saved,
81
- url: server.url,
82
- login: server.login,
83
- })
84
- });
85
-
86
- const savedServers = JSON.parse(localStorage.getItem("servers") || "[]");
87
- savedServers.forEach(server => {
88
- if(out.find(s => s.name == server.name)) return;
89
- out.push({
90
- id: -1,
91
- name: server.name,
92
- url: server.url,
93
- saved: true,
94
- })
95
- });
96
-
97
- return out;
98
- }
99
- }
100
-
101
- const storageControler = {
102
- addServerStorage(id){
103
- let servers = JSON.parse(localStorage.getItem("servers") || "[]");
104
- const server = serversMeta[id];
105
- if(!server.url.endsWith("/")) server.url += "/";
106
- servers.push({
107
- name: server.name,
108
- url: server.url,
109
- });
110
- servers.sort((a, b) => a.name.localeCompare(b.name));
111
- localStorage.setItem("servers", JSON.stringify(servers));
112
- },
113
-
114
- removeServerStorage(serverId, serverData=null){
115
- let servers = JSON.parse(localStorage.getItem("servers"));
116
- if(!servers) servers = [];
117
- const server = serverData || serversMeta[serverId];
118
- server.saved = false;
119
-
120
- const index = servers.findIndex(({ name, url }) => name == server.name && url == server.url);
121
- if(index > -1) servers.splice(index, 1);
122
-
123
- localStorage.setItem("servers", JSON.stringify(servers));
124
- },
125
-
126
- async getServersFromStorage(){
127
- let servers = JSON.parse(localStorage.getItem("servers"));
128
- if(!servers) return;
129
-
130
- for(let server of servers){
131
- const serverId = await popupFunc.addServer(server);
132
- if(serverId){
133
- serversMeta[serverId].saved = true;
134
- }
135
- await new Promise(resolve => setTimeout(resolve, 1000));
136
- }
137
- renderFunc.renderServerList();
138
- },
139
- }
140
-
141
- const menageServers = {
142
- toggleServer(id, name="", url=""){
143
- let server = serversMeta[id];
144
- if(!server){
145
- if(id != -1) return;
146
- const servers = JSON.parse(localStorage.getItem("servers") || "[]");
147
- if(!servers) return;
148
- storageControler.removeServerStorage(-1, { name, url });
149
- document.querySelector("#popUpContainer #menageServers #cancel-btn").click();
150
- setTimeout(() => {
151
- popupFunc.showMgmtServers();
152
- }, 1000);
153
- return;
154
- }
155
-
156
- if(server.saved){
157
- storageControler.removeServerStorage(id);
158
- server.saved = false;
159
- document.querySelector("#menageServers__" + id).innerHTML = "Add to saved";
160
- }else{
161
- storageControler.addServerStorage(id);
162
- server.saved = true;
163
- document.querySelector("#menageServers__" + id).innerHTML = "Remove from saved";
164
- }
165
- }
166
- }
@@ -1,17 +0,0 @@
1
- const navPos = document.querySelector("nav");
2
-
3
- function selectTable(server, db, table){
4
- vars.selectedServer = server;
5
- vars.selectedDb = db;
6
- vars.selectedTable = table;
7
- renderFunc.updateQueryStyle();
8
- }
9
-
10
- new AutoUpdater(vars, "selectedServer", "#selected-server", data => data ? serversMeta[data]?.name + " >" : "-");
11
- new AutoUpdater(vars, "selectedDb", "#selected-database", data => data ? data + " >" : "-");
12
- new AutoUpdater(vars, "selectedTable", "#selected-table", data => data ? data : "-");
13
-
14
- document.querySelector("#nav__toggle").addEventListener("click", () => {
15
- navPos.style.left = navPos.style.left == "0px" ? "-" +navPos.clientWidth + "px" : "0px";
16
- });
17
- storageControler.getServersFromStorage().then(renderFunc.renderServerList);
@@ -1,16 +0,0 @@
1
- function loadHTML(){
2
- const templateDiv = document.querySelector("#templates");
3
- const appDiv = document.querySelector("#app");
4
- [
5
- "data",
6
- "nav",
7
- "popup",
8
- ].forEach(file => {
9
- const html = cw.get(`html/${file}.html`);
10
- templateDiv.innerHTML += html;
11
- });
12
-
13
- appDiv.innerHTML += cw.get("html/main.html");
14
- }
15
-
16
- loadHTML();
@@ -1,72 +0,0 @@
1
- const popupDiv = document.querySelector("#popUpContainer");
2
-
3
- const popupFunc = {
4
- async addServer(data={}){
5
- return new Promise((resolve, reject) => {
6
- let { url, name, login, pass } = data;
7
- const popup = document.createElement("div");
8
- popup.id = "addServer";
9
- popup.innerHTML = templates.addServer(data);
10
-
11
- const urlInput = popup.querySelector("#url");
12
- const nameInput = popup.querySelector("#name");
13
- const loginInput = popup.querySelector("#login");
14
- const passInput = popup.querySelector("#pass");
15
- urlInput.value = url || "";
16
- nameInput.value = name || "";
17
- loginInput.value = login || "";
18
- passInput.value = pass || "";
19
-
20
- async function loginFunc(){
21
- url = urlInput.value;
22
- name = nameInput.value;
23
- login = loginInput.value;
24
- pass = passInput.value;
25
- if(!url || !name || !login || !pass){
26
- alert("All fields are required");
27
- return;
28
- }
29
- const serverId = await databaseGetMetaFunc.loginToDb(url, name, login, pass);
30
- if(!serverId) return;
31
-
32
- resolve(serverId);
33
- popup.fadeOut(() => popup.remove());
34
- }
35
-
36
- popup.querySelector("#login-btn").addEventListener("click", loginFunc);
37
- passInput.addEventListener("keydown", (e) => {
38
- if(e.key == "Enter") loginFunc();
39
- });
40
-
41
- popup.querySelector("#cancel-btn").addEventListener("click", () => {
42
- resolve(false);
43
- popup.fadeOut(() => popup.remove());
44
- });
45
-
46
- popupDiv.appendChild(popup);
47
- popup.fadeIn();
48
- });
49
- },
50
-
51
- async showAddServer(){
52
- const res = await popupFunc.addServer();
53
- if(!res) return;
54
- renderFunc.renderServerList();
55
- document.querySelector("#popUpContainer #menageServers #cancel-btn").click();
56
- await new Promise(resolve => setTimeout(resolve, 1000));
57
- popupFunc.showMgmtServers();
58
- },
59
-
60
- showMgmtServers(){
61
- const div = document.createElement("div");
62
- div.id = "menageServers";
63
- const servers = databaseGetMetaFunc.getAll();
64
- div.innerHTML = templates.menageServers({ serversList: servers });
65
- popupDiv.appendChild(div);
66
- div.fadeIn();
67
-
68
- div.querySelector("#cancel-btn").addEventListener("click", () => {
69
- div.fadeOut(() => div.remove());
70
- });
71
- }
72
- }
@@ -1,51 +0,0 @@
1
- const dbActionUtils = {
2
- async query(data, path){
3
- if(!vars.selectedServer) return false;
4
- if(!vars.selectedDb) return false;
5
- if(!vars.selectedTable) return false;
6
-
7
- const body = {
8
- db: vars.selectedDb,
9
- collection: vars.selectedTable,
10
- ...data
11
- }
12
-
13
- const server = serversMeta[vars.selectedServer];
14
- const res = await fetch(server.url + "db/" + path, {
15
- method: "POST",
16
- headers: {
17
- "Content-Type": "application/json",
18
- "Authorization": server.token
19
- },
20
- body: JSON.stringify(body)
21
- }).then(res => res.json());
22
- if(res.err){
23
- alert(res.msg);
24
- return false;
25
- }
26
-
27
- return res.result;
28
- }
29
- }
30
-
31
- const dbActions = {
32
- async find(query, context=undefined, opts=undefined){
33
- const body = {
34
- search: query,
35
- context,
36
- opts
37
- }
38
-
39
- return await dbActionUtils.query(body, "database/find");
40
- },
41
- }
42
-
43
- const graphActions = {
44
- async find(node){
45
- return await dbActionUtils.query({ node }, "graph/find");
46
- },
47
-
48
- async getAll(){
49
- return await dbActionUtils.query({}, "graph/getAll");
50
- },
51
- }
@@ -1,79 +0,0 @@
1
- const queryDbFunc = {
2
- queryInput: document.querySelector("#query"),
3
- queryTypeSelect: document.querySelector("#query-type"),
4
- queryContextInput: document.querySelector("#query-context"),
5
- queryContextLabel: document.querySelector("#query-context-label"),
6
- queryOptsInput: document.querySelector("#query-opts"),
7
-
8
- renderData(){
9
- if(!db_data || db_data.length == 0){
10
- data_output.innerHTML = "<p>No data</p>";
11
- return;
12
- }
13
- data_output.innerHTML = templates.tableData({ data: db_data });
14
- },
15
-
16
- init(){
17
- document.querySelector("#query-db-btn").addEventListener("click", async () => {
18
- let query = queryDbFunc.queryInput.value.trim();
19
- let type = queryDbFunc.queryTypeSelect.value.trim();
20
- let context = queryDbFunc.queryContextInput.value.trim();
21
- let opts = queryDbFunc.queryOptsInput.value.trim();
22
-
23
- if(!query) query = "{}";
24
- if(!type) type = "json";
25
- if(!context) context = "{}";
26
- if(!opts) opts = "{}";
27
-
28
- switch(type){
29
- case "js-function":
30
- try{
31
- (new Function("return " + query))();
32
- }catch{
33
- return alert("Invalid query context");
34
- }
35
- break;
36
- case "json5":
37
- if(!query.startsWith("{")) query = "{" + query + "}";
38
- query = JSON5.parse(query);
39
- break;
40
- case "json":
41
- query = JSON.parse(query);
42
- break;
43
- }
44
-
45
- context = JSON5.parse(context);
46
- opts = JSON5.parse(opts);
47
- if(!context) context = {};
48
- if(!opts) opts = {};
49
-
50
- const data = await dbActions.find(query, context, opts);
51
- if(!data) return;
52
- db_data = data;
53
- queryDbFunc.renderData();
54
- });
55
-
56
- queryDbFunc.queryTypeSelect.addEventListener("change", () => {
57
- queryDbFunc.queryContextLabel.style.display = queryTypeSelect.value == "js-function" ? "block" : "none";
58
- });
59
-
60
- document.querySelector("#sortData").addEventListener("click", () => {
61
- const sortKey = prompt("Enter key to sort by:");
62
- if(!sortKey) return;
63
- queryDbFunc.sortData(sortKey);
64
- });
65
- },
66
-
67
- sortData(key){
68
- db_data.sort((a, b) => {
69
- const aValue = a[key] !== undefined ? a[key] : "";
70
- const bValue = b[key] !== undefined ? b[key] : "";
71
- if(aValue > bValue) return 1;
72
- if(aValue < bValue) return -1;
73
- return 0;
74
- });
75
- this.renderData();
76
- }
77
- }
78
-
79
- queryDbFunc.init();
@@ -1,144 +0,0 @@
1
- const queryGraphFunc = {
2
- queryInput: document.querySelector("#query-graph-node"),
3
- outputMethodSelect: document.querySelector("#query-graph-output-method"),
4
-
5
- init(){
6
- document.querySelector("#query-graph-btn").addEventListener("click", async () => {
7
- const node = queryGraphFunc.queryInput.value.trim();
8
- const edges = await graphActions.find(node);
9
- db_data = edges;
10
- queryGraphFunc.displayEdges();
11
- });
12
-
13
- document.querySelector("#query-graph-all-btn").addEventListener("click", async () => {
14
- const edges = await graphActions.getAll();
15
- db_data = edges;
16
- queryGraphFunc.displayEdges();
17
- });
18
- },
19
-
20
- displayEdges(){
21
- const method = queryGraphFunc.outputMethodSelect.value;
22
-
23
- switch(method){
24
- case "table":
25
- if(!db_data || db_data.length == 0){
26
- data_output.innerHTML = "<p>No data</p>";
27
- return;
28
- }
29
- data_output.innerHTML = templates.tableData({ data: db_data });
30
- break;
31
- case "graph":
32
- queryGraphFunc.displayEdgesGraph();
33
- break;
34
- }
35
- },
36
-
37
- displayEdgesGraph(){
38
- if(!db_data || db_data.length == 0){
39
- data_output.innerHTML = "<p>No data</p>";
40
- return;
41
- }
42
- data_output.innerHTML = "";
43
- const { nodes, links } = queryGraphFunc.transformData(db_data);
44
-
45
- const div = document.createElement("div");
46
- div.style.height = "500px";
47
- div.style.width = "99%";
48
- data_output.appendChild(div);
49
-
50
- const width = div.clientWidth;
51
- const height = div.clientHeight;
52
-
53
- const zoom = d3.zoom()
54
- .scaleExtent([0.1, 4])
55
- .on("zoom", (event) => {
56
- g.attr("transform", event.transform);
57
- })
58
-
59
- const svg = d3.create("svg")
60
- .attr("width", width)
61
- .attr("height", height)
62
- .call(zoom);
63
-
64
- const g = svg.append("g");
65
-
66
- const simulation = d3.forceSimulation(nodes)
67
- .force("link", d3.forceLink().id(d => d.id).distance(90))
68
- .force("charge", d3.forceManyBody().strength(-90))
69
- .force("center", d3.forceCenter(width / 2, height / 2))
70
- .force("collision", d3.forceCollide().radius(50))
71
- .force("gravity", d3.forceManyBody().strength(20));
72
-
73
- const link = g.append("g")
74
- .attr("class", "links")
75
- .selectAll("line")
76
- .data(links)
77
- .enter().append("line")
78
- .attr("stroke-width", 2)
79
- .style("stroke", "var(--accent)");
80
-
81
- const node = g.append("g")
82
- .attr("class", "nodes")
83
- .selectAll("g")
84
- .data(nodes)
85
- .enter().append("g");
86
-
87
- node.append("circle")
88
- .attr("r", 8)
89
- .attr("fill", "var(--accent)");
90
-
91
- node.append("text")
92
- .attr("dx", 12)
93
- .attr("dy", ".35em")
94
- .attr("fill", "var(--txt)")
95
- .text(d => d.id)
96
- .style("cursor", "pointer")
97
- .on("click", function(event, d) {
98
- queryGraphFunc.copyToClipboard(d.id);
99
- });
100
-
101
- simulation
102
- .nodes(nodes)
103
- .on("tick", () => {
104
- link.attr("x1", d => d.source.x)
105
- .attr("y1", d => d.source.y)
106
- .attr("x2", d => d.target.x)
107
- .attr("y2", d => d.target.y);
108
-
109
- node.attr("transform", d => `translate(${d.x},${d.y})`);
110
- });
111
-
112
- simulation.force("link").links(links);
113
- div.appendChild(svg.node());
114
-
115
- const resetView = document.createElement("button");
116
- resetView.innerText = "Reset view";
117
- resetView.addEventListener("click", () => {
118
- svg.transition().duration(750)
119
- .call(zoom.transform, d3.zoomIdentity);
120
- });
121
- data_output.appendChild(resetView);
122
- },
123
-
124
- transformData(inputData){
125
- const nodesSet = new Set();
126
-
127
- const links = inputData.map(({ a, b }) => {
128
- nodesSet.add(a);
129
- nodesSet.add(b);
130
- return { source: a, target: b };
131
- });
132
-
133
- const nodes = Array.from(nodesSet).map(id => ({ id }));
134
- return { nodes, links };
135
- },
136
-
137
- copyToClipboard(text){
138
- navigator.clipboard.writeText(text).then(() => alert("Copied in clipboard!")).catch(() => {
139
- alert("Failed to copy in clipboard. Manually select and copy it:\n" + text);
140
- });
141
- },
142
- }
143
-
144
- queryGraphFunc.init();
@@ -1,64 +0,0 @@
1
- const databaseServerList = document.querySelector("#database-server-list");
2
- const data_output = document.querySelector("#data-output");
3
- const queryDivDb = document.querySelector("#query-div-db");
4
- const queryDivGraph = document.querySelector("#query-div-graph");
5
-
6
- const renderFunc = {
7
- renderServerList(){
8
- const serversList = [];
9
- Object.keys(serversMeta).forEach(id => {
10
- serversList.push({
11
- id,
12
- name: serversMeta[id].name,
13
- saved: serversMeta[id].saved || false
14
- });
15
- })
16
- databaseServerList.innerHTML = templates.databasesList({ serversList });
17
-
18
- Object.keys(serversMeta).forEach(id => {
19
- renderFunc.rednerServer(id);
20
- })
21
- },
22
-
23
- async rednerServer(id){
24
- const server = serversMeta[id];
25
- if(!server) return;
26
- const nav = document.querySelector("#database-nav-"+id);
27
- nav.innerHTML = "";
28
-
29
- const dbsObj = await databaseGetMetaFunc.loadDbList(id);
30
- const dbsArray = [];
31
- Object.keys(dbsObj).forEach(db => {
32
- dbsArray.push({
33
- serverId: id,
34
- name: db
35
- });
36
- })
37
- nav.innerHTML = templates.databaseNav({ dbs: dbsArray });
38
- },
39
-
40
- async renderTables(serverId, dbName){
41
- const nav = document.querySelector("#database-nav-"+serverId+"-"+dbName);
42
- nav.innerHTML = "";
43
- vars.selectedServer = serverId;
44
- vars.selectedDb = dbName;
45
- vars.selectedTable = null;
46
- renderFunc.updateQueryStyle();
47
- const tables = await databaseGetMetaFunc.getDbTables(serverId, dbName);
48
- nav.innerHTML = templates.databasesTables({ tables, server: serverId, db: dbName });
49
- },
50
-
51
- updateQueryStyle(){
52
- const dbType = getSelectedDatabase().type;
53
- switch(dbType){
54
- case "database":
55
- queryDivDb.style.display = "block";
56
- queryDivGraph.style.display = "none";
57
- break;
58
- case "graph":
59
- queryDivDb.style.display = "none";
60
- queryDivGraph.style.display = "block";
61
- break;
62
- }
63
- },
64
- }
@@ -1,31 +0,0 @@
1
- const templatesUtils = {
2
- load(id){
3
- const templateEle = document.querySelector("#"+id);
4
- const html = templateEle.innerHTML;
5
- const template = Handlebars.compile(html);
6
- templateEle.remove();
7
- return template;
8
- }
9
- }
10
-
11
- Handlebars.registerHelper("isObject", function (value){
12
- return typeof value === "object" && value !== null;
13
- });
14
-
15
- Handlebars.registerHelper("json5", function (context){
16
- const json5 = JSON5.stringify(context, null, 4);
17
- return json5.substring(1, json5.length - 1);
18
- });
19
-
20
- Handlebars.registerHelper("br", function(height){
21
- return new Handlebars.SafeString(`<div style="height: ${height}px;"></div>`);
22
- });
23
-
24
- const templates = {
25
- databasesList: templatesUtils.load("databases-list-template"),
26
- databaseNav: templatesUtils.load("database-nav-template"),
27
- databasesTables: templatesUtils.load("databases-tables-template"),
28
- tableData: templatesUtils.load("table-data-template"),
29
- addServer: templatesUtils.load("addServer-template"),
30
- menageServers: templatesUtils.load("menageServers-template"),
31
- }
@@ -1,36 +0,0 @@
1
- class AutoUpdater{
2
- constructor(obj, key, selector, updateCB){
3
- this.obj = obj;
4
- this.key = key;
5
- this.element = document.querySelector(selector);
6
- this.updateCB = updateCB;
7
- this.init();
8
- }
9
-
10
- init(){
11
- this.updateElement();
12
- this.watch();
13
- }
14
-
15
- updateElement(){
16
- let value = this.obj[this.key];
17
- const formattedValue = this.updateCB ? this.updateCB(value) : value;
18
- this.element.innerHTML = formattedValue;
19
- }
20
-
21
- watch(){
22
- let currentValue = this.obj[this.key];
23
-
24
- Object.defineProperty(this.obj, this.key, {
25
- set: (newValue) => {
26
- currentValue = newValue;
27
- this.updateElement();
28
- },
29
- get: () => currentValue
30
- });
31
- }
32
- }
33
-
34
- function getSelectedDatabase(){
35
- return serversData[vars.selectedServer][vars.selectedDb];
36
- }
@@ -1,9 +0,0 @@
1
- let serversData = {};
2
- let serversMeta = {};
3
- let db_data = [];
4
-
5
- const vars = {
6
- selectedServer: null,
7
- selectedDb: null,
8
- selectedTable: null,
9
- }