@matdata/yasgui 5.10.0 → 5.11.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 +6 -2
- package/build/ts/src/PersistentConfig.d.ts +10 -0
- package/build/ts/src/PersistentConfig.js +40 -0
- package/build/ts/src/PersistentConfig.js.map +1 -1
- package/build/ts/src/Tab.d.ts +17 -0
- package/build/ts/src/Tab.js +372 -15
- package/build/ts/src/Tab.js.map +1 -1
- package/build/ts/src/TabContextMenu.d.ts +1 -0
- package/build/ts/src/TabContextMenu.js +17 -0
- package/build/ts/src/TabContextMenu.js.map +1 -1
- package/build/ts/src/TabElements.d.ts +3 -0
- package/build/ts/src/TabElements.js +97 -28
- package/build/ts/src/TabElements.js.map +1 -1
- package/build/ts/src/TabSettingsModal.d.ts +2 -0
- package/build/ts/src/TabSettingsModal.js +44 -19
- package/build/ts/src/TabSettingsModal.js.map +1 -1
- package/build/ts/src/index.d.ts +3 -0
- package/build/ts/src/index.js +4 -0
- package/build/ts/src/index.js.map +1 -1
- package/build/ts/src/queryManagement/QueryBrowser.d.ts +64 -0
- package/build/ts/src/queryManagement/QueryBrowser.js +914 -0
- package/build/ts/src/queryManagement/QueryBrowser.js.map +1 -0
- package/build/ts/src/queryManagement/SaveManagedQueryModal.d.ts +55 -0
- package/build/ts/src/queryManagement/SaveManagedQueryModal.js +451 -0
- package/build/ts/src/queryManagement/SaveManagedQueryModal.js.map +1 -0
- package/build/ts/src/queryManagement/WorkspaceSettingsForm.d.ts +16 -0
- package/build/ts/src/queryManagement/WorkspaceSettingsForm.js +452 -0
- package/build/ts/src/queryManagement/WorkspaceSettingsForm.js.map +1 -0
- package/build/ts/src/queryManagement/backends/BaseGitProviderClient.d.ts +19 -0
- package/build/ts/src/queryManagement/backends/BaseGitProviderClient.js +77 -0
- package/build/ts/src/queryManagement/backends/BaseGitProviderClient.js.map +1 -0
- package/build/ts/src/queryManagement/backends/BitbucketProviderClient.d.ts +16 -0
- package/build/ts/src/queryManagement/backends/BitbucketProviderClient.js +269 -0
- package/build/ts/src/queryManagement/backends/BitbucketProviderClient.js.map +1 -0
- package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.d.ts +26 -0
- package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.js +93 -0
- package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.js.map +1 -0
- package/build/ts/src/queryManagement/backends/GiteaProviderClient.d.ts +14 -0
- package/build/ts/src/queryManagement/backends/GiteaProviderClient.js +244 -0
- package/build/ts/src/queryManagement/backends/GiteaProviderClient.js.map +1 -0
- package/build/ts/src/queryManagement/backends/GithubProviderClient.d.ts +14 -0
- package/build/ts/src/queryManagement/backends/GithubProviderClient.js +252 -0
- package/build/ts/src/queryManagement/backends/GithubProviderClient.js.map +1 -0
- package/build/ts/src/queryManagement/backends/GitlabProviderClient.d.ts +16 -0
- package/build/ts/src/queryManagement/backends/GitlabProviderClient.js +246 -0
- package/build/ts/src/queryManagement/backends/GitlabProviderClient.js.map +1 -0
- package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.d.ts +21 -0
- package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.js +175 -0
- package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.js.map +1 -0
- package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.d.ts +28 -0
- package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.js +687 -0
- package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.js.map +1 -0
- package/build/ts/src/queryManagement/backends/WorkspaceBackend.d.ts +15 -0
- package/build/ts/src/queryManagement/backends/WorkspaceBackend.js +2 -0
- package/build/ts/src/queryManagement/backends/WorkspaceBackend.js.map +1 -0
- package/build/ts/src/queryManagement/backends/errors.d.ts +7 -0
- package/build/ts/src/queryManagement/backends/errors.js +18 -0
- package/build/ts/src/queryManagement/backends/errors.js.map +1 -0
- package/build/ts/src/queryManagement/backends/getWorkspaceBackend.d.ts +8 -0
- package/build/ts/src/queryManagement/backends/getWorkspaceBackend.js +114 -0
- package/build/ts/src/queryManagement/backends/getWorkspaceBackend.js.map +1 -0
- package/build/ts/src/queryManagement/backends/gitRemote.d.ts +5 -0
- package/build/ts/src/queryManagement/backends/gitRemote.js +40 -0
- package/build/ts/src/queryManagement/backends/gitRemote.js.map +1 -0
- package/build/ts/src/queryManagement/browserFilter.d.ts +2 -0
- package/build/ts/src/queryManagement/browserFilter.js +7 -0
- package/build/ts/src/queryManagement/browserFilter.js.map +1 -0
- package/build/ts/src/queryManagement/index.d.ts +13 -0
- package/build/ts/src/queryManagement/index.js +14 -0
- package/build/ts/src/queryManagement/index.js.map +1 -0
- package/build/ts/src/queryManagement/normalizeQueryFilename.d.ts +1 -0
- package/build/ts/src/queryManagement/normalizeQueryFilename.js +10 -0
- package/build/ts/src/queryManagement/normalizeQueryFilename.js.map +1 -0
- package/build/ts/src/queryManagement/openManagedQuery.d.ts +15 -0
- package/build/ts/src/queryManagement/openManagedQuery.js +27 -0
- package/build/ts/src/queryManagement/openManagedQuery.js.map +1 -0
- package/build/ts/src/queryManagement/saveManagedQuery.d.ts +20 -0
- package/build/ts/src/queryManagement/saveManagedQuery.js +109 -0
- package/build/ts/src/queryManagement/saveManagedQuery.js.map +1 -0
- package/build/ts/src/queryManagement/textHash.d.ts +2 -0
- package/build/ts/src/queryManagement/textHash.js +13 -0
- package/build/ts/src/queryManagement/textHash.js.map +1 -0
- package/build/ts/src/queryManagement/types.d.ts +76 -0
- package/build/ts/src/queryManagement/types.js +2 -0
- package/build/ts/src/queryManagement/types.js.map +1 -0
- package/build/ts/src/queryManagement/validateWorkspaceConfig.d.ts +6 -0
- package/build/ts/src/queryManagement/validateWorkspaceConfig.js +33 -0
- package/build/ts/src/queryManagement/validateWorkspaceConfig.js.map +1 -0
- package/build/ts/src/version.d.ts +1 -1
- package/build/ts/src/version.js +1 -1
- package/build/yasgui.min.css +10 -1
- package/build/yasgui.min.css.map +3 -3
- package/build/yasgui.min.js +398 -172
- package/build/yasgui.min.js.map +4 -4
- package/package.json +1 -1
- package/src/PersistentConfig.ts +61 -0
- package/src/Tab.ts +431 -20
- package/src/TabContextMenu.ts +10 -0
- package/src/TabElements.scss +46 -7
- package/src/TabElements.ts +95 -27
- package/src/TabSettingsModal.scss +102 -5
- package/src/TabSettingsModal.ts +48 -25
- package/src/endpointSelect.scss +2 -3
- package/src/index.scss +4 -0
- package/src/index.ts +7 -0
- package/src/queryManagement/QueryBrowser.scss +418 -0
- package/src/queryManagement/QueryBrowser.ts +1079 -0
- package/src/queryManagement/SaveManagedQueryModal.scss +245 -0
- package/src/queryManagement/SaveManagedQueryModal.ts +554 -0
- package/src/queryManagement/WorkspaceSettingsForm.ts +546 -0
- package/src/queryManagement/backends/BaseGitProviderClient.ts +124 -0
- package/src/queryManagement/backends/BitbucketProviderClient.ts +403 -0
- package/src/queryManagement/backends/GitWorkspaceBackend.ts +96 -0
- package/src/queryManagement/backends/GiteaProviderClient.ts +316 -0
- package/src/queryManagement/backends/GithubProviderClient.ts +319 -0
- package/src/queryManagement/backends/GitlabProviderClient.ts +327 -0
- package/src/queryManagement/backends/InMemoryWorkspaceBackend.ts +175 -0
- package/src/queryManagement/backends/SparqlWorkspaceBackend.ts +729 -0
- package/src/queryManagement/backends/WorkspaceBackend.ts +41 -0
- package/src/queryManagement/backends/errors.ts +28 -0
- package/src/queryManagement/backends/getWorkspaceBackend.ts +132 -0
- package/src/queryManagement/backends/gitRemote.ts +54 -0
- package/src/queryManagement/browserFilter.ts +8 -0
- package/src/queryManagement/index.ts +15 -0
- package/src/queryManagement/normalizeQueryFilename.ts +8 -0
- package/src/queryManagement/openManagedQuery.ts +31 -0
- package/src/queryManagement/saveManagedQuery.ts +135 -0
- package/src/queryManagement/textHash.ts +15 -0
- package/src/queryManagement/types.ts +85 -0
- package/src/queryManagement/validateWorkspaceConfig.ts +40 -0
- package/src/tab.scss +4 -14
- package/src/themes.scss +14 -23
- package/src/version.ts +1 -1
package/README.md
CHANGED
|
@@ -285,13 +285,17 @@ For more details, see **[User Guide - Querying Local Endpoints](./docs/user-guid
|
|
|
285
285
|
We welcome contributions! To get started:
|
|
286
286
|
|
|
287
287
|
1. Fork the repository
|
|
288
|
-
2. Clone and install: `npm
|
|
288
|
+
2. Clone and install: `PUPPETEER_SKIP_DOWNLOAD=1 npm ci`
|
|
289
289
|
3. Run dev server: `npm run dev`
|
|
290
290
|
4. Make your changes
|
|
291
291
|
5. Run tests: `npm test`
|
|
292
292
|
6. Submit a pull request
|
|
293
293
|
|
|
294
|
-
For detailed contribution guidelines, see
|
|
294
|
+
**📋 For detailed contribution guidelines, including our plugin development policy, see [CONTRIBUTING.md](./CONTRIBUTING.md).**
|
|
295
|
+
|
|
296
|
+
Additional resources:
|
|
297
|
+
- **[Developer Guide](./docs/developer-guide.md)** - API reference and integration guide
|
|
298
|
+
- **[Plugin Development](./docs/developer-guide.md#plugin-development)** - How to create plugins
|
|
295
299
|
|
|
296
300
|
---
|
|
297
301
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Yasgui, { EndpointButton, EndpointConfig } from "./";
|
|
2
2
|
import * as Tab from "./Tab";
|
|
3
|
+
import type { WorkspaceConfig } from "./queryManagement/types";
|
|
3
4
|
export declare var storageNamespace: string;
|
|
4
5
|
export interface PersistedJson {
|
|
5
6
|
endpointHistory: string[];
|
|
@@ -16,6 +17,8 @@ export interface PersistedJson {
|
|
|
16
17
|
autoCaptureEnabled?: boolean;
|
|
17
18
|
customEndpointButtons?: EndpointButton[];
|
|
18
19
|
endpointConfigs?: EndpointConfig[];
|
|
20
|
+
workspaces?: WorkspaceConfig[];
|
|
21
|
+
activeWorkspaceId?: string;
|
|
19
22
|
theme?: "light" | "dark";
|
|
20
23
|
orientation?: "vertical" | "horizontal";
|
|
21
24
|
showSnippetsBar?: boolean;
|
|
@@ -60,6 +63,13 @@ export default class PersistentConfig {
|
|
|
60
63
|
addOrUpdateEndpoint(endpoint: string, updates: Partial<Omit<EndpointConfig, "endpoint">>): void;
|
|
61
64
|
getEndpointConfig(endpoint: string): EndpointConfig | undefined;
|
|
62
65
|
deleteEndpointConfig(endpoint: string): void;
|
|
66
|
+
getWorkspaces(): WorkspaceConfig[];
|
|
67
|
+
getWorkspace(workspaceId: string): WorkspaceConfig | undefined;
|
|
68
|
+
setWorkspaces(workspaces: WorkspaceConfig[]): void;
|
|
69
|
+
addOrUpdateWorkspace(workspace: WorkspaceConfig): void;
|
|
70
|
+
deleteWorkspace(workspaceId: string): void;
|
|
71
|
+
getActiveWorkspaceId(): string | undefined;
|
|
72
|
+
setActiveWorkspaceId(workspaceId: string | undefined): void;
|
|
63
73
|
static clear(): void;
|
|
64
74
|
getPersistedConfig(): PersistedJson;
|
|
65
75
|
updatePersistedConfig(config: Partial<PersistedJson>): void;
|
|
@@ -11,6 +11,8 @@ function getDefaults() {
|
|
|
11
11
|
autoCaptureEnabled: true,
|
|
12
12
|
customEndpointButtons: [],
|
|
13
13
|
endpointConfigs: [],
|
|
14
|
+
workspaces: [],
|
|
15
|
+
activeWorkspaceId: undefined,
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
export default class PersistentConfig {
|
|
@@ -166,6 +168,44 @@ export default class PersistentConfig {
|
|
|
166
168
|
const filtered = configs.filter((c) => c.endpoint !== endpoint);
|
|
167
169
|
this.setEndpointConfigs(filtered);
|
|
168
170
|
}
|
|
171
|
+
getWorkspaces() {
|
|
172
|
+
return this.persistedJson.workspaces || [];
|
|
173
|
+
}
|
|
174
|
+
getWorkspace(workspaceId) {
|
|
175
|
+
return this.getWorkspaces().find((w) => w.id === workspaceId);
|
|
176
|
+
}
|
|
177
|
+
setWorkspaces(workspaces) {
|
|
178
|
+
this.persistedJson.workspaces = workspaces;
|
|
179
|
+
this.toStorage();
|
|
180
|
+
}
|
|
181
|
+
addOrUpdateWorkspace(workspace) {
|
|
182
|
+
const workspaces = this.getWorkspaces();
|
|
183
|
+
const existingIndex = workspaces.findIndex((w) => w.id === workspace.id);
|
|
184
|
+
const now = new Date().toISOString();
|
|
185
|
+
if (existingIndex >= 0) {
|
|
186
|
+
const existing = workspaces[existingIndex];
|
|
187
|
+
workspaces[existingIndex] = Object.assign(Object.assign(Object.assign({}, existing), workspace), { createdAt: existing.createdAt || workspace.createdAt || now, updatedAt: now });
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
workspaces.push(Object.assign(Object.assign({}, workspace), { createdAt: workspace.createdAt || now, updatedAt: now }));
|
|
191
|
+
}
|
|
192
|
+
this.setWorkspaces(workspaces);
|
|
193
|
+
}
|
|
194
|
+
deleteWorkspace(workspaceId) {
|
|
195
|
+
const workspaces = this.getWorkspaces();
|
|
196
|
+
const filtered = workspaces.filter((w) => w.id !== workspaceId);
|
|
197
|
+
this.setWorkspaces(filtered);
|
|
198
|
+
if (this.getActiveWorkspaceId() === workspaceId) {
|
|
199
|
+
this.setActiveWorkspaceId(undefined);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
getActiveWorkspaceId() {
|
|
203
|
+
return this.persistedJson.activeWorkspaceId;
|
|
204
|
+
}
|
|
205
|
+
setActiveWorkspaceId(workspaceId) {
|
|
206
|
+
this.persistedJson.activeWorkspaceId = workspaceId;
|
|
207
|
+
this.toStorage();
|
|
208
|
+
}
|
|
169
209
|
static clear() {
|
|
170
210
|
const storage = new YStorage(storageNamespace);
|
|
171
211
|
storage.removeNamespace();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistentConfig.js","sourceRoot":"","sources":["../../../../../packages/yasgui/src/PersistentConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PersistentConfig.js","sourceRoot":"","sources":["../../../../../packages/yasgui/src/PersistentConfig.ts"],"names":[],"mappings":"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"}
|
package/build/ts/src/Tab.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { default as Yasr, Parser, PersistentConfig as YasrPersistentConfig } fro
|
|
|
4
4
|
import * as shareLink from "./linkUtils";
|
|
5
5
|
import "./tab.scss";
|
|
6
6
|
import { default as Yasgui, YasguiRequestConfig } from "./";
|
|
7
|
+
import type { ManagedTabMetadata } from "./queryManagement/types";
|
|
7
8
|
export interface PersistedJsonYasr extends YasrPersistentConfig {
|
|
8
9
|
responseSummary: Parser.ResponseSummary;
|
|
9
10
|
}
|
|
@@ -20,6 +21,7 @@ export interface PersistedJson {
|
|
|
20
21
|
};
|
|
21
22
|
requestConfig: YasguiRequestConfig;
|
|
22
23
|
orientation?: "vertical" | "horizontal";
|
|
24
|
+
managedQuery?: ManagedTabMetadata;
|
|
23
25
|
}
|
|
24
26
|
export interface Tab {
|
|
25
27
|
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
@@ -66,6 +68,16 @@ export declare class Tab extends EventEmitter {
|
|
|
66
68
|
name(): string;
|
|
67
69
|
getPersistedJson(): PersistedJson;
|
|
68
70
|
getId(): string;
|
|
71
|
+
getManagedQueryMetadata(): ManagedTabMetadata | undefined;
|
|
72
|
+
setManagedQueryMetadata(metadata: ManagedTabMetadata | undefined): void;
|
|
73
|
+
isManagedQueryTab(): boolean;
|
|
74
|
+
hasUnsavedManagedChanges(): boolean;
|
|
75
|
+
private getDefaultSaveModalValues;
|
|
76
|
+
private getManagedQueryIdFromMetadata;
|
|
77
|
+
private versionRefFromVersionTag;
|
|
78
|
+
private getQueryTextForSave;
|
|
79
|
+
saveManagedQueryOrSaveAsManagedQuery(): Promise<void>;
|
|
80
|
+
saveAsManagedQuery(): Promise<void>;
|
|
69
81
|
private draw;
|
|
70
82
|
hide(): void;
|
|
71
83
|
show(): void;
|
|
@@ -74,6 +86,7 @@ export declare class Tab extends EventEmitter {
|
|
|
74
86
|
private detachKeyboardListeners;
|
|
75
87
|
select(): void;
|
|
76
88
|
close(): void;
|
|
89
|
+
private closeNow;
|
|
77
90
|
getQuery(): any;
|
|
78
91
|
setQuery(query: string): this;
|
|
79
92
|
getRequestConfig(): YasguiRequestConfig;
|
|
@@ -101,6 +114,8 @@ export declare class Tab extends EventEmitter {
|
|
|
101
114
|
getShareObject(): shareLink.ShareConfigObject;
|
|
102
115
|
private getTabListEl;
|
|
103
116
|
setName(newName: string): this;
|
|
117
|
+
private suggestManagedFilenameFromName;
|
|
118
|
+
renameTab(newName: string): Promise<void>;
|
|
104
119
|
hasResults(): boolean;
|
|
105
120
|
getName(): string;
|
|
106
121
|
query(): Promise<any>;
|
|
@@ -109,6 +124,8 @@ export declare class Tab extends EventEmitter {
|
|
|
109
124
|
private ensureOAuth2TokenValid;
|
|
110
125
|
private getStaticRequestConfig;
|
|
111
126
|
private initYasqe;
|
|
127
|
+
private updateSaveButtonVisibility;
|
|
128
|
+
private initSaveManagedQueryIcon;
|
|
112
129
|
private destroyYasqe;
|
|
113
130
|
handleYasqeBlur: (yasqe: Yasqe) => void;
|
|
114
131
|
handleYasqeQuery: (yasqe: Yasqe) => void;
|
package/build/ts/src/Tab.js
CHANGED
|
@@ -18,25 +18,29 @@ import EndpointSelect from "./endpointSelect";
|
|
|
18
18
|
import "./tab.scss";
|
|
19
19
|
import { getRandomId, default as Yasgui } from "./";
|
|
20
20
|
import * as OAuth2Utils from "./OAuth2Utils";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<rect x="2" y="12" width="20" height="10" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
28
|
-
</svg>`;
|
|
29
|
-
const OVERFLOW_ICON = `<svg viewBox="0 0 24 24" fill="currentColor">
|
|
30
|
-
<circle cx="5" cy="12" r="2"/>
|
|
31
|
-
<circle cx="12" cy="12" r="2"/>
|
|
32
|
-
<circle cx="19" cy="12" r="2"/>
|
|
33
|
-
</svg>`;
|
|
21
|
+
import { hashQueryText } from "./queryManagement/textHash";
|
|
22
|
+
import SaveManagedQueryModal from "./queryManagement/SaveManagedQueryModal";
|
|
23
|
+
import { saveManagedQuery } from "./queryManagement/saveManagedQuery";
|
|
24
|
+
import { getWorkspaceBackend } from "./queryManagement/backends/getWorkspaceBackend";
|
|
25
|
+
import { asWorkspaceBackendError } from "./queryManagement/backends/errors";
|
|
26
|
+
import { normalizeQueryFilename } from "./queryManagement/normalizeQueryFilename";
|
|
34
27
|
export class Tab extends EventEmitter {
|
|
35
28
|
constructor(yasgui, conf) {
|
|
36
29
|
super();
|
|
37
30
|
this.endpointButtonConfigs = [];
|
|
38
31
|
this.handleKeyDown = (event) => {
|
|
39
32
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
33
|
+
if (event.defaultPrevented)
|
|
34
|
+
return;
|
|
35
|
+
const saveModalOpen = !!document.querySelector(".saveManagedQueryModalOverlay.open");
|
|
36
|
+
if (!saveModalOpen) {
|
|
37
|
+
const isSaveShortcut = (event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey && event.key.toLowerCase() === "s";
|
|
38
|
+
if (isSaveShortcut) {
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
void this.saveManagedQueryOrSaveAsManagedQuery();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
40
44
|
if (event.key === "F11") {
|
|
41
45
|
event.preventDefault();
|
|
42
46
|
if (this.yasqe) {
|
|
@@ -220,6 +224,205 @@ WHERE {
|
|
|
220
224
|
getId() {
|
|
221
225
|
return this.persistentJson.id;
|
|
222
226
|
}
|
|
227
|
+
getManagedQueryMetadata() {
|
|
228
|
+
return this.persistentJson.managedQuery;
|
|
229
|
+
}
|
|
230
|
+
setManagedQueryMetadata(metadata) {
|
|
231
|
+
if (metadata) {
|
|
232
|
+
this.persistentJson.managedQuery = metadata;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
delete this.persistentJson.managedQuery;
|
|
236
|
+
}
|
|
237
|
+
this.emit("change", this, this.persistentJson);
|
|
238
|
+
}
|
|
239
|
+
isManagedQueryTab() {
|
|
240
|
+
return !!this.persistentJson.managedQuery;
|
|
241
|
+
}
|
|
242
|
+
hasUnsavedManagedChanges() {
|
|
243
|
+
const meta = this.getManagedQueryMetadata();
|
|
244
|
+
if (!meta)
|
|
245
|
+
return false;
|
|
246
|
+
if (!meta.lastSavedTextHash)
|
|
247
|
+
return false;
|
|
248
|
+
try {
|
|
249
|
+
const current = this.yasqe ? this.yasqe.getValue() : this.persistentJson.yasqe.value;
|
|
250
|
+
const currentHash = hashQueryText(current);
|
|
251
|
+
return currentHash !== meta.lastSavedTextHash;
|
|
252
|
+
}
|
|
253
|
+
catch (_a) {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
getDefaultSaveModalValues() {
|
|
258
|
+
var _a;
|
|
259
|
+
const meta = this.getManagedQueryMetadata();
|
|
260
|
+
if (!meta)
|
|
261
|
+
return { name: this.name() };
|
|
262
|
+
if (meta.backendType !== "git")
|
|
263
|
+
return { workspaceId: meta.workspaceId };
|
|
264
|
+
const path = (_a = meta.queryRef) === null || _a === void 0 ? void 0 : _a.path;
|
|
265
|
+
if (!path)
|
|
266
|
+
return { workspaceId: meta.workspaceId };
|
|
267
|
+
const parts = path.split("/");
|
|
268
|
+
const filename = parts.pop();
|
|
269
|
+
const folderPath = parts.join("/");
|
|
270
|
+
return {
|
|
271
|
+
workspaceId: meta.workspaceId,
|
|
272
|
+
folderPath,
|
|
273
|
+
filename,
|
|
274
|
+
name: this.name(),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
getManagedQueryIdFromMetadata(meta) {
|
|
278
|
+
var _a, _b;
|
|
279
|
+
if (meta.backendType === "git")
|
|
280
|
+
return (_a = meta.queryRef) === null || _a === void 0 ? void 0 : _a.path;
|
|
281
|
+
return (_b = meta.queryRef) === null || _b === void 0 ? void 0 : _b.managedQueryIri;
|
|
282
|
+
}
|
|
283
|
+
versionRefFromVersionTag(backendType, versionTag) {
|
|
284
|
+
if (!versionTag)
|
|
285
|
+
return undefined;
|
|
286
|
+
if (backendType === "git")
|
|
287
|
+
return { commitSha: versionTag };
|
|
288
|
+
return { managedQueryVersionIri: versionTag };
|
|
289
|
+
}
|
|
290
|
+
getQueryTextForSave() {
|
|
291
|
+
try {
|
|
292
|
+
if (this.yasqe)
|
|
293
|
+
return this.yasqe.getValue();
|
|
294
|
+
}
|
|
295
|
+
catch (_a) {
|
|
296
|
+
}
|
|
297
|
+
return this.persistentJson.yasqe.value;
|
|
298
|
+
}
|
|
299
|
+
saveManagedQueryOrSaveAsManagedQuery() {
|
|
300
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
301
|
+
const meta = this.getManagedQueryMetadata();
|
|
302
|
+
if (!meta) {
|
|
303
|
+
yield this.saveAsManagedQuery();
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const queryId = this.getManagedQueryIdFromMetadata(meta);
|
|
307
|
+
if (!queryId) {
|
|
308
|
+
yield this.saveAsManagedQuery();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const workspace = this.yasgui.persistentConfig.getWorkspace(meta.workspaceId);
|
|
312
|
+
if (!workspace) {
|
|
313
|
+
window.alert("Selected workspace no longer exists");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const backend = getWorkspaceBackend(workspace, { persistentConfig: this.yasgui.persistentConfig });
|
|
317
|
+
const expectedVersionTag = (() => {
|
|
318
|
+
var _a, _b;
|
|
319
|
+
if (!(meta === null || meta === void 0 ? void 0 : meta.lastSavedVersionRef))
|
|
320
|
+
return undefined;
|
|
321
|
+
if (meta.backendType === "git")
|
|
322
|
+
return (_a = meta.lastSavedVersionRef) === null || _a === void 0 ? void 0 : _a.commitSha;
|
|
323
|
+
return (_b = meta.lastSavedVersionRef) === null || _b === void 0 ? void 0 : _b.managedQueryVersionIri;
|
|
324
|
+
})();
|
|
325
|
+
try {
|
|
326
|
+
yield backend.writeQuery(queryId, this.getQueryTextForSave(), { expectedVersionTag });
|
|
327
|
+
}
|
|
328
|
+
catch (e) {
|
|
329
|
+
const err = asWorkspaceBackendError(e);
|
|
330
|
+
if (err.code === "CONFLICT") {
|
|
331
|
+
if (meta.backendType === "git") {
|
|
332
|
+
try {
|
|
333
|
+
const latest = yield backend.readQuery(queryId);
|
|
334
|
+
const latestHash = hashQueryText(latest.queryText);
|
|
335
|
+
if (meta.lastSavedTextHash && meta.lastSavedTextHash === latestHash && latest.versionTag) {
|
|
336
|
+
yield backend.writeQuery(queryId, this.getQueryTextForSave(), { expectedVersionTag: latest.versionTag });
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
window.alert("Save conflict. Resolve the conflict externally (e.g., pull/rebase/merge) and then try saving again.");
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (_a) {
|
|
344
|
+
window.alert("Save conflict. Resolve the conflict externally (e.g., pull/rebase/merge) and then try saving again.");
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
window.alert("Save conflict. Refresh the query and try again.");
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
window.alert(err.message);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const read = yield backend.readQuery(queryId);
|
|
357
|
+
const lastSavedTextHash = hashQueryText(read.queryText);
|
|
358
|
+
const lastSavedVersionRef = this.versionRefFromVersionTag(meta.backendType, read.versionTag);
|
|
359
|
+
this.setManagedQueryMetadata(Object.assign(Object.assign({}, meta), { lastSavedTextHash,
|
|
360
|
+
lastSavedVersionRef }));
|
|
361
|
+
this.yasgui.queryBrowser.invalidateAndRefresh(meta.workspaceId);
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
saveAsManagedQuery() {
|
|
365
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
366
|
+
const modal = new SaveManagedQueryModal(this.yasgui);
|
|
367
|
+
const defaults = this.getDefaultSaveModalValues();
|
|
368
|
+
let result;
|
|
369
|
+
try {
|
|
370
|
+
const modalDefaults = {
|
|
371
|
+
workspaceId: defaults.workspaceId,
|
|
372
|
+
folderPath: defaults.folderPath || "",
|
|
373
|
+
name: defaults.name || this.name(),
|
|
374
|
+
};
|
|
375
|
+
if (defaults.filename)
|
|
376
|
+
modalDefaults.filename = defaults.filename;
|
|
377
|
+
result = yield modal.show(modalDefaults);
|
|
378
|
+
}
|
|
379
|
+
catch (_a) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const workspace = this.yasgui.persistentConfig.getWorkspace(result.workspaceId);
|
|
383
|
+
if (!workspace) {
|
|
384
|
+
window.alert("Selected workspace no longer exists");
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const backend = getWorkspaceBackend(workspace, { persistentConfig: this.yasgui.persistentConfig });
|
|
388
|
+
const meta = this.getManagedQueryMetadata();
|
|
389
|
+
const expectedVersionTag = (() => {
|
|
390
|
+
var _a, _b;
|
|
391
|
+
if (!(meta === null || meta === void 0 ? void 0 : meta.lastSavedVersionRef))
|
|
392
|
+
return undefined;
|
|
393
|
+
if (meta.backendType === "git")
|
|
394
|
+
return (_a = meta.lastSavedVersionRef) === null || _a === void 0 ? void 0 : _a.commitSha;
|
|
395
|
+
return (_b = meta.lastSavedVersionRef) === null || _b === void 0 ? void 0 : _b.managedQueryVersionIri;
|
|
396
|
+
})();
|
|
397
|
+
try {
|
|
398
|
+
modal.notifySaveInProgress();
|
|
399
|
+
const { managedMetadata } = yield saveManagedQuery({
|
|
400
|
+
backend,
|
|
401
|
+
backendType: workspace.type,
|
|
402
|
+
workspaceId: workspace.id,
|
|
403
|
+
workspaceIri: workspace.type === "sparql" ? workspace.workspaceIri : undefined,
|
|
404
|
+
folderPath: result.folderPath,
|
|
405
|
+
name: result.name,
|
|
406
|
+
filename: result.filename,
|
|
407
|
+
queryText: this.getQueryTextForSave(),
|
|
408
|
+
associatedEndpoint: workspace.type === "sparql" ? this.getEndpoint() : undefined,
|
|
409
|
+
message: result.message,
|
|
410
|
+
expectedVersionTag,
|
|
411
|
+
});
|
|
412
|
+
modal.notifySaveComplete();
|
|
413
|
+
this.setManagedQueryMetadata(managedMetadata);
|
|
414
|
+
if (result.name && result.name.trim()) {
|
|
415
|
+
this.setName(result.name.trim());
|
|
416
|
+
}
|
|
417
|
+
this.yasgui.queryBrowser.invalidateAndRefresh(workspace.id);
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
modal.notifySaveComplete();
|
|
421
|
+
const err = asWorkspaceBackendError(e);
|
|
422
|
+
window.alert(err.message);
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
}
|
|
223
426
|
draw() {
|
|
224
427
|
if (this.rootEl)
|
|
225
428
|
return;
|
|
@@ -281,6 +484,23 @@ WHERE {
|
|
|
281
484
|
this.yasgui.selectTabId(this.persistentJson.id);
|
|
282
485
|
}
|
|
283
486
|
close() {
|
|
487
|
+
if (this.isManagedQueryTab() && this.hasUnsavedManagedChanges()) {
|
|
488
|
+
const wantsSave = window.confirm("This managed query has unsaved changes. Save before closing?");
|
|
489
|
+
if (wantsSave) {
|
|
490
|
+
void this.saveManagedQueryOrSaveAsManagedQuery().then(() => {
|
|
491
|
+
if (!this.hasUnsavedManagedChanges()) {
|
|
492
|
+
this.closeNow();
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
const discard = window.confirm("Discard changes and close the tab?");
|
|
498
|
+
if (!discard)
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
this.closeNow();
|
|
502
|
+
}
|
|
503
|
+
closeNow() {
|
|
284
504
|
this.detachKeyboardListeners();
|
|
285
505
|
if (this.yasqe)
|
|
286
506
|
this.yasqe.abortQuery();
|
|
@@ -342,7 +562,9 @@ WHERE {
|
|
|
342
562
|
if (!this.orientationToggleButton)
|
|
343
563
|
return;
|
|
344
564
|
this.orientationToggleButton.innerHTML =
|
|
345
|
-
this.currentOrientation === "vertical"
|
|
565
|
+
this.currentOrientation === "vertical"
|
|
566
|
+
? '<i class="fas fa-grip-lines-vertical"></i>'
|
|
567
|
+
: '<i class="fas fa-grip-lines"></i>';
|
|
346
568
|
this.orientationToggleButton.title =
|
|
347
569
|
this.currentOrientation === "vertical" ? "Switch to horizontal layout" : "Switch to vertical layout";
|
|
348
570
|
}
|
|
@@ -465,7 +687,7 @@ WHERE {
|
|
|
465
687
|
if (!this.endpointOverflowButton) {
|
|
466
688
|
this.endpointOverflowButton = document.createElement("button");
|
|
467
689
|
addClass(this.endpointOverflowButton, "endpointOverflowBtn");
|
|
468
|
-
this.endpointOverflowButton.innerHTML =
|
|
690
|
+
this.endpointOverflowButton.innerHTML = '<i class="fas fa-ellipsis-vertical"></i>';
|
|
469
691
|
this.endpointOverflowButton.title = "More endpoints";
|
|
470
692
|
this.endpointOverflowButton.setAttribute("aria-label", "More endpoint options");
|
|
471
693
|
this.endpointOverflowButton.setAttribute("aria-haspopup", "true");
|
|
@@ -615,6 +837,95 @@ WHERE {
|
|
|
615
837
|
this.emit("change", this, this.persistentJson);
|
|
616
838
|
return this;
|
|
617
839
|
}
|
|
840
|
+
suggestManagedFilenameFromName(name) {
|
|
841
|
+
const trimmed = name.trim();
|
|
842
|
+
const safe = trimmed.replace(/[\\/]/g, "-");
|
|
843
|
+
return normalizeQueryFilename(safe);
|
|
844
|
+
}
|
|
845
|
+
renameTab(newName) {
|
|
846
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
847
|
+
var _a;
|
|
848
|
+
const nextName = newName.trim();
|
|
849
|
+
if (!nextName)
|
|
850
|
+
return;
|
|
851
|
+
if (nextName === this.name())
|
|
852
|
+
return;
|
|
853
|
+
const meta = this.getManagedQueryMetadata();
|
|
854
|
+
if (!meta) {
|
|
855
|
+
this.setName(nextName);
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
858
|
+
const workspace = this.yasgui.persistentConfig.getWorkspace(meta.workspaceId);
|
|
859
|
+
if (!workspace) {
|
|
860
|
+
window.alert("Selected workspace no longer exists");
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
863
|
+
const backend = getWorkspaceBackend(workspace, { persistentConfig: this.yasgui.persistentConfig });
|
|
864
|
+
if (meta.backendType === "sparql") {
|
|
865
|
+
const queryId = this.getManagedQueryIdFromMetadata(meta);
|
|
866
|
+
if (!queryId)
|
|
867
|
+
return;
|
|
868
|
+
if (!backend.renameQuery) {
|
|
869
|
+
window.alert("This workspace does not support renaming queries");
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
try {
|
|
873
|
+
this.getTabListEl().setAsRenaming(true);
|
|
874
|
+
yield backend.renameQuery(queryId, nextName);
|
|
875
|
+
this.setName(nextName);
|
|
876
|
+
this.yasgui.queryBrowser.invalidateAndRefresh(meta.workspaceId);
|
|
877
|
+
}
|
|
878
|
+
catch (e) {
|
|
879
|
+
const err = asWorkspaceBackendError(e);
|
|
880
|
+
window.alert(err.message);
|
|
881
|
+
}
|
|
882
|
+
finally {
|
|
883
|
+
this.getTabListEl().setAsRenaming(false);
|
|
884
|
+
}
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
887
|
+
const oldPath = (_a = meta.queryRef) === null || _a === void 0 ? void 0 : _a.path;
|
|
888
|
+
if (!oldPath) {
|
|
889
|
+
this.setName(nextName);
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
const parts = oldPath.split("/").filter(Boolean);
|
|
893
|
+
const oldFilename = parts.pop() || oldPath;
|
|
894
|
+
const folderPrefix = parts.join("/");
|
|
895
|
+
const newFilename = this.suggestManagedFilenameFromName(nextName);
|
|
896
|
+
const newPath = folderPrefix ? `${folderPrefix}/${newFilename}` : newFilename;
|
|
897
|
+
if (newPath === oldPath) {
|
|
898
|
+
this.setName(nextName);
|
|
899
|
+
return;
|
|
900
|
+
}
|
|
901
|
+
try {
|
|
902
|
+
this.getTabListEl().setAsRenaming(true);
|
|
903
|
+
yield backend.writeQuery(newPath, this.getQueryTextForSave(), {
|
|
904
|
+
message: `Rename ${oldFilename} to ${newFilename}`,
|
|
905
|
+
});
|
|
906
|
+
if (!backend.deleteQuery) {
|
|
907
|
+
window.alert("This workspace does not support deleting queries, so the old file could not be removed.");
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
yield backend.deleteQuery(oldPath);
|
|
911
|
+
}
|
|
912
|
+
const read = yield backend.readQuery(newPath);
|
|
913
|
+
const lastSavedTextHash = hashQueryText(read.queryText);
|
|
914
|
+
const lastSavedVersionRef = this.versionRefFromVersionTag("git", read.versionTag);
|
|
915
|
+
this.setManagedQueryMetadata(Object.assign(Object.assign({}, meta), { queryRef: Object.assign(Object.assign({}, meta.queryRef), { path: newPath }), lastSavedTextHash,
|
|
916
|
+
lastSavedVersionRef }));
|
|
917
|
+
this.setName(nextName);
|
|
918
|
+
this.yasgui.queryBrowser.invalidateAndRefresh(meta.workspaceId);
|
|
919
|
+
}
|
|
920
|
+
catch (e) {
|
|
921
|
+
const err = asWorkspaceBackendError(e);
|
|
922
|
+
window.alert(err.message);
|
|
923
|
+
}
|
|
924
|
+
finally {
|
|
925
|
+
this.getTabListEl().setAsRenaming(false);
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
}
|
|
618
929
|
hasResults() {
|
|
619
930
|
var _a;
|
|
620
931
|
return !!((_a = this.yasr) === null || _a === void 0 ? void 0 : _a.results);
|
|
@@ -761,6 +1072,16 @@ WHERE {
|
|
|
761
1072
|
}
|
|
762
1073
|
return processedReqConfig;
|
|
763
1074
|
} });
|
|
1075
|
+
const existingExtraKeys = yasqeConf.extraKeys;
|
|
1076
|
+
const mergedExtraKeys = existingExtraKeys && typeof existingExtraKeys === "object" ? Object.assign({}, existingExtraKeys) : {};
|
|
1077
|
+
mergedExtraKeys["Ctrl-S"] = () => {
|
|
1078
|
+
const saveModalOpen = !!document.querySelector(".saveManagedQueryModalOverlay.open");
|
|
1079
|
+
if (saveModalOpen)
|
|
1080
|
+
return;
|
|
1081
|
+
void this.saveManagedQueryOrSaveAsManagedQuery();
|
|
1082
|
+
};
|
|
1083
|
+
mergedExtraKeys["Cmd-S"] = mergedExtraKeys["Ctrl-S"];
|
|
1084
|
+
yasqeConf.extraKeys = mergedExtraKeys;
|
|
764
1085
|
if (!yasqeConf.hintConfig) {
|
|
765
1086
|
yasqeConf.hintConfig = {};
|
|
766
1087
|
}
|
|
@@ -771,6 +1092,10 @@ WHERE {
|
|
|
771
1092
|
throw new Error("Expected a wrapper element before instantiating yasqe");
|
|
772
1093
|
}
|
|
773
1094
|
this.yasqe = new Yasqe(this.yasqeWrapperEl, yasqeConf);
|
|
1095
|
+
this.yasqe.on("saveManagedQuery", () => {
|
|
1096
|
+
void this.saveManagedQueryOrSaveAsManagedQuery();
|
|
1097
|
+
});
|
|
1098
|
+
this.updateSaveButtonVisibility();
|
|
774
1099
|
this.yasqe.on("blur", this.handleYasqeBlur);
|
|
775
1100
|
this.yasqe.on("query", this.handleYasqeQuery);
|
|
776
1101
|
this.yasqe.on("queryBefore", this.handleYasqeQueryBefore);
|
|
@@ -781,6 +1106,38 @@ WHERE {
|
|
|
781
1106
|
this.yasqe.on("queryResponse", this.handleQueryResponse);
|
|
782
1107
|
this.attachYasqeMouseHandler();
|
|
783
1108
|
}
|
|
1109
|
+
updateSaveButtonVisibility() {
|
|
1110
|
+
if (!this.yasqe)
|
|
1111
|
+
return;
|
|
1112
|
+
const workspaces = this.yasgui.persistentConfig.getWorkspaces();
|
|
1113
|
+
const hasWorkspaces = workspaces && workspaces.length > 0;
|
|
1114
|
+
this.yasqe.setSaveButtonVisible(hasWorkspaces);
|
|
1115
|
+
}
|
|
1116
|
+
initSaveManagedQueryIcon() {
|
|
1117
|
+
if (!this.yasqe)
|
|
1118
|
+
return;
|
|
1119
|
+
const wrapper = this.yasqe.getWrapperElement();
|
|
1120
|
+
const buttons = wrapper === null || wrapper === void 0 ? void 0 : wrapper.querySelector(".yasqe_buttons");
|
|
1121
|
+
if (!buttons)
|
|
1122
|
+
return;
|
|
1123
|
+
if (buttons.querySelector(".yasqe_saveManagedQueryButton"))
|
|
1124
|
+
return;
|
|
1125
|
+
const queryBtn = buttons.querySelector(".yasqe_queryButton");
|
|
1126
|
+
if (!queryBtn)
|
|
1127
|
+
return;
|
|
1128
|
+
const saveBtn = document.createElement("button");
|
|
1129
|
+
saveBtn.type = "button";
|
|
1130
|
+
saveBtn.className = "yasqe_saveManagedQueryButton";
|
|
1131
|
+
saveBtn.title = "Save managed query";
|
|
1132
|
+
saveBtn.setAttribute("aria-label", "Save managed query");
|
|
1133
|
+
saveBtn.innerHTML = '<i class="fas fa-save" aria-hidden="true"></i>';
|
|
1134
|
+
saveBtn.addEventListener("click", (e) => {
|
|
1135
|
+
e.preventDefault();
|
|
1136
|
+
e.stopPropagation();
|
|
1137
|
+
void this.saveManagedQueryOrSaveAsManagedQuery();
|
|
1138
|
+
});
|
|
1139
|
+
buttons.insertBefore(saveBtn, queryBtn);
|
|
1140
|
+
}
|
|
784
1141
|
destroyYasqe() {
|
|
785
1142
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
786
1143
|
(_a = this.yasqe) === null || _a === void 0 ? void 0 : _a.off("blur", this.handleYasqeBlur);
|