@matdata/yasgui 5.10.1 → 5.12.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 (137) hide show
  1. package/build/ts/src/PersistentConfig.d.ts +14 -0
  2. package/build/ts/src/PersistentConfig.js +52 -0
  3. package/build/ts/src/PersistentConfig.js.map +1 -1
  4. package/build/ts/src/Tab.d.ts +17 -0
  5. package/build/ts/src/Tab.js +374 -16
  6. package/build/ts/src/Tab.js.map +1 -1
  7. package/build/ts/src/TabContextMenu.d.ts +1 -0
  8. package/build/ts/src/TabContextMenu.js +17 -0
  9. package/build/ts/src/TabContextMenu.js.map +1 -1
  10. package/build/ts/src/TabElements.d.ts +3 -0
  11. package/build/ts/src/TabElements.js +97 -28
  12. package/build/ts/src/TabElements.js.map +1 -1
  13. package/build/ts/src/TabSettingsModal.d.ts +2 -0
  14. package/build/ts/src/TabSettingsModal.js +160 -19
  15. package/build/ts/src/TabSettingsModal.js.map +1 -1
  16. package/build/ts/src/ThemeManager.d.ts +3 -0
  17. package/build/ts/src/ThemeManager.js +11 -1
  18. package/build/ts/src/ThemeManager.js.map +1 -1
  19. package/build/ts/src/index.d.ts +4 -0
  20. package/build/ts/src/index.js +6 -0
  21. package/build/ts/src/index.js.map +1 -1
  22. package/build/ts/src/queryManagement/QueryBrowser.d.ts +64 -0
  23. package/build/ts/src/queryManagement/QueryBrowser.js +914 -0
  24. package/build/ts/src/queryManagement/QueryBrowser.js.map +1 -0
  25. package/build/ts/src/queryManagement/SaveManagedQueryModal.d.ts +55 -0
  26. package/build/ts/src/queryManagement/SaveManagedQueryModal.js +451 -0
  27. package/build/ts/src/queryManagement/SaveManagedQueryModal.js.map +1 -0
  28. package/build/ts/src/queryManagement/WorkspaceSettingsForm.d.ts +16 -0
  29. package/build/ts/src/queryManagement/WorkspaceSettingsForm.js +452 -0
  30. package/build/ts/src/queryManagement/WorkspaceSettingsForm.js.map +1 -0
  31. package/build/ts/src/queryManagement/backends/BaseGitProviderClient.d.ts +19 -0
  32. package/build/ts/src/queryManagement/backends/BaseGitProviderClient.js +77 -0
  33. package/build/ts/src/queryManagement/backends/BaseGitProviderClient.js.map +1 -0
  34. package/build/ts/src/queryManagement/backends/BitbucketProviderClient.d.ts +16 -0
  35. package/build/ts/src/queryManagement/backends/BitbucketProviderClient.js +269 -0
  36. package/build/ts/src/queryManagement/backends/BitbucketProviderClient.js.map +1 -0
  37. package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.d.ts +26 -0
  38. package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.js +93 -0
  39. package/build/ts/src/queryManagement/backends/GitWorkspaceBackend.js.map +1 -0
  40. package/build/ts/src/queryManagement/backends/GiteaProviderClient.d.ts +14 -0
  41. package/build/ts/src/queryManagement/backends/GiteaProviderClient.js +244 -0
  42. package/build/ts/src/queryManagement/backends/GiteaProviderClient.js.map +1 -0
  43. package/build/ts/src/queryManagement/backends/GithubProviderClient.d.ts +14 -0
  44. package/build/ts/src/queryManagement/backends/GithubProviderClient.js +252 -0
  45. package/build/ts/src/queryManagement/backends/GithubProviderClient.js.map +1 -0
  46. package/build/ts/src/queryManagement/backends/GitlabProviderClient.d.ts +16 -0
  47. package/build/ts/src/queryManagement/backends/GitlabProviderClient.js +246 -0
  48. package/build/ts/src/queryManagement/backends/GitlabProviderClient.js.map +1 -0
  49. package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.d.ts +21 -0
  50. package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.js +175 -0
  51. package/build/ts/src/queryManagement/backends/InMemoryWorkspaceBackend.js.map +1 -0
  52. package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.d.ts +28 -0
  53. package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.js +687 -0
  54. package/build/ts/src/queryManagement/backends/SparqlWorkspaceBackend.js.map +1 -0
  55. package/build/ts/src/queryManagement/backends/WorkspaceBackend.d.ts +15 -0
  56. package/build/ts/src/queryManagement/backends/WorkspaceBackend.js +2 -0
  57. package/build/ts/src/queryManagement/backends/WorkspaceBackend.js.map +1 -0
  58. package/build/ts/src/queryManagement/backends/errors.d.ts +7 -0
  59. package/build/ts/src/queryManagement/backends/errors.js +18 -0
  60. package/build/ts/src/queryManagement/backends/errors.js.map +1 -0
  61. package/build/ts/src/queryManagement/backends/getWorkspaceBackend.d.ts +8 -0
  62. package/build/ts/src/queryManagement/backends/getWorkspaceBackend.js +114 -0
  63. package/build/ts/src/queryManagement/backends/getWorkspaceBackend.js.map +1 -0
  64. package/build/ts/src/queryManagement/backends/gitRemote.d.ts +5 -0
  65. package/build/ts/src/queryManagement/backends/gitRemote.js +40 -0
  66. package/build/ts/src/queryManagement/backends/gitRemote.js.map +1 -0
  67. package/build/ts/src/queryManagement/browserFilter.d.ts +2 -0
  68. package/build/ts/src/queryManagement/browserFilter.js +7 -0
  69. package/build/ts/src/queryManagement/browserFilter.js.map +1 -0
  70. package/build/ts/src/queryManagement/index.d.ts +13 -0
  71. package/build/ts/src/queryManagement/index.js +14 -0
  72. package/build/ts/src/queryManagement/index.js.map +1 -0
  73. package/build/ts/src/queryManagement/normalizeQueryFilename.d.ts +1 -0
  74. package/build/ts/src/queryManagement/normalizeQueryFilename.js +10 -0
  75. package/build/ts/src/queryManagement/normalizeQueryFilename.js.map +1 -0
  76. package/build/ts/src/queryManagement/openManagedQuery.d.ts +15 -0
  77. package/build/ts/src/queryManagement/openManagedQuery.js +27 -0
  78. package/build/ts/src/queryManagement/openManagedQuery.js.map +1 -0
  79. package/build/ts/src/queryManagement/saveManagedQuery.d.ts +20 -0
  80. package/build/ts/src/queryManagement/saveManagedQuery.js +109 -0
  81. package/build/ts/src/queryManagement/saveManagedQuery.js.map +1 -0
  82. package/build/ts/src/queryManagement/textHash.d.ts +2 -0
  83. package/build/ts/src/queryManagement/textHash.js +13 -0
  84. package/build/ts/src/queryManagement/textHash.js.map +1 -0
  85. package/build/ts/src/queryManagement/types.d.ts +76 -0
  86. package/build/ts/src/queryManagement/types.js +2 -0
  87. package/build/ts/src/queryManagement/types.js.map +1 -0
  88. package/build/ts/src/queryManagement/validateWorkspaceConfig.d.ts +6 -0
  89. package/build/ts/src/queryManagement/validateWorkspaceConfig.js +33 -0
  90. package/build/ts/src/queryManagement/validateWorkspaceConfig.js.map +1 -0
  91. package/build/ts/src/version.d.ts +1 -1
  92. package/build/ts/src/version.js +1 -1
  93. package/build/yasgui.min.css +10 -1
  94. package/build/yasgui.min.css.map +3 -3
  95. package/build/yasgui.min.js +398 -172
  96. package/build/yasgui.min.js.map +4 -4
  97. package/package.json +1 -1
  98. package/src/PersistentConfig.ts +76 -0
  99. package/src/Tab.ts +434 -22
  100. package/src/TabContextMenu.ts +10 -0
  101. package/src/TabElements.scss +46 -7
  102. package/src/TabElements.ts +95 -27
  103. package/src/TabSettingsModal.scss +102 -5
  104. package/src/TabSettingsModal.ts +194 -25
  105. package/src/ThemeManager.ts +18 -1
  106. package/src/endpointSelect.scss +2 -3
  107. package/src/github-dark-theme.scss +167 -0
  108. package/src/index.scss +4 -0
  109. package/src/index.ts +11 -0
  110. package/src/queryManagement/QueryBrowser.scss +418 -0
  111. package/src/queryManagement/QueryBrowser.ts +1079 -0
  112. package/src/queryManagement/SaveManagedQueryModal.scss +245 -0
  113. package/src/queryManagement/SaveManagedQueryModal.ts +554 -0
  114. package/src/queryManagement/WorkspaceSettingsForm.ts +546 -0
  115. package/src/queryManagement/backends/BaseGitProviderClient.ts +124 -0
  116. package/src/queryManagement/backends/BitbucketProviderClient.ts +403 -0
  117. package/src/queryManagement/backends/GitWorkspaceBackend.ts +96 -0
  118. package/src/queryManagement/backends/GiteaProviderClient.ts +316 -0
  119. package/src/queryManagement/backends/GithubProviderClient.ts +319 -0
  120. package/src/queryManagement/backends/GitlabProviderClient.ts +327 -0
  121. package/src/queryManagement/backends/InMemoryWorkspaceBackend.ts +175 -0
  122. package/src/queryManagement/backends/SparqlWorkspaceBackend.ts +729 -0
  123. package/src/queryManagement/backends/WorkspaceBackend.ts +41 -0
  124. package/src/queryManagement/backends/errors.ts +28 -0
  125. package/src/queryManagement/backends/getWorkspaceBackend.ts +132 -0
  126. package/src/queryManagement/backends/gitRemote.ts +54 -0
  127. package/src/queryManagement/browserFilter.ts +8 -0
  128. package/src/queryManagement/index.ts +15 -0
  129. package/src/queryManagement/normalizeQueryFilename.ts +8 -0
  130. package/src/queryManagement/openManagedQuery.ts +31 -0
  131. package/src/queryManagement/saveManagedQuery.ts +135 -0
  132. package/src/queryManagement/textHash.ts +15 -0
  133. package/src/queryManagement/types.ts +85 -0
  134. package/src/queryManagement/validateWorkspaceConfig.ts +40 -0
  135. package/src/tab.scss +4 -14
  136. package/src/themes.scss +54 -63
  137. package/src/version.ts +1 -1
@@ -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,10 +17,14 @@ 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;
22
25
  disabledDevButtons?: string[];
26
+ codeMirrorThemeLight?: string;
27
+ codeMirrorThemeDark?: string;
23
28
  }
24
29
  export default class PersistentConfig {
25
30
  private persistedJson;
@@ -55,11 +60,20 @@ export default class PersistentConfig {
55
60
  setCustomEndpointButtons(buttons: EndpointButton[]): void;
56
61
  getShowSnippetsBar(): boolean | undefined;
57
62
  setShowSnippetsBar(show: boolean): void;
63
+ getCodeMirrorTheme(mode: "light" | "dark"): string | undefined;
64
+ setCodeMirrorTheme(mode: "light" | "dark", theme: string): void;
58
65
  getEndpointConfigs(): EndpointConfig[];
59
66
  setEndpointConfigs(configs: EndpointConfig[]): void;
60
67
  addOrUpdateEndpoint(endpoint: string, updates: Partial<Omit<EndpointConfig, "endpoint">>): void;
61
68
  getEndpointConfig(endpoint: string): EndpointConfig | undefined;
62
69
  deleteEndpointConfig(endpoint: string): void;
70
+ getWorkspaces(): WorkspaceConfig[];
71
+ getWorkspace(workspaceId: string): WorkspaceConfig | undefined;
72
+ setWorkspaces(workspaces: WorkspaceConfig[]): void;
73
+ addOrUpdateWorkspace(workspace: WorkspaceConfig): void;
74
+ deleteWorkspace(workspaceId: string): void;
75
+ getActiveWorkspaceId(): string | undefined;
76
+ setActiveWorkspaceId(workspaceId: string | undefined): void;
63
77
  static clear(): void;
64
78
  getPersistedConfig(): PersistedJson;
65
79
  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 {
@@ -135,6 +137,18 @@ export default class PersistentConfig {
135
137
  this.persistedJson.showSnippetsBar = show;
136
138
  this.toStorage();
137
139
  }
140
+ getCodeMirrorTheme(mode) {
141
+ return mode === "dark" ? this.persistedJson.codeMirrorThemeDark : this.persistedJson.codeMirrorThemeLight;
142
+ }
143
+ setCodeMirrorTheme(mode, theme) {
144
+ if (mode === "dark") {
145
+ this.persistedJson.codeMirrorThemeDark = theme;
146
+ }
147
+ else {
148
+ this.persistedJson.codeMirrorThemeLight = theme;
149
+ }
150
+ this.toStorage();
151
+ }
138
152
  getEndpointConfigs() {
139
153
  return this.persistedJson.endpointConfigs || [];
140
154
  }
@@ -166,6 +180,44 @@ export default class PersistentConfig {
166
180
  const filtered = configs.filter((c) => c.endpoint !== endpoint);
167
181
  this.setEndpointConfigs(filtered);
168
182
  }
183
+ getWorkspaces() {
184
+ return this.persistedJson.workspaces || [];
185
+ }
186
+ getWorkspace(workspaceId) {
187
+ return this.getWorkspaces().find((w) => w.id === workspaceId);
188
+ }
189
+ setWorkspaces(workspaces) {
190
+ this.persistedJson.workspaces = workspaces;
191
+ this.toStorage();
192
+ }
193
+ addOrUpdateWorkspace(workspace) {
194
+ const workspaces = this.getWorkspaces();
195
+ const existingIndex = workspaces.findIndex((w) => w.id === workspace.id);
196
+ const now = new Date().toISOString();
197
+ if (existingIndex >= 0) {
198
+ const existing = workspaces[existingIndex];
199
+ workspaces[existingIndex] = Object.assign(Object.assign(Object.assign({}, existing), workspace), { createdAt: existing.createdAt || workspace.createdAt || now, updatedAt: now });
200
+ }
201
+ else {
202
+ workspaces.push(Object.assign(Object.assign({}, workspace), { createdAt: workspace.createdAt || now, updatedAt: now }));
203
+ }
204
+ this.setWorkspaces(workspaces);
205
+ }
206
+ deleteWorkspace(workspaceId) {
207
+ const workspaces = this.getWorkspaces();
208
+ const filtered = workspaces.filter((w) => w.id !== workspaceId);
209
+ this.setWorkspaces(filtered);
210
+ if (this.getActiveWorkspaceId() === workspaceId) {
211
+ this.setActiveWorkspaceId(undefined);
212
+ }
213
+ }
214
+ getActiveWorkspaceId() {
215
+ return this.persistedJson.activeWorkspaceId;
216
+ }
217
+ setActiveWorkspaceId(workspaceId) {
218
+ this.persistedJson.activeWorkspaceId = workspaceId;
219
+ this.toStorage();
220
+ }
169
221
  static clear() {
170
222
  const storage = new YStorage(storageNamespace);
171
223
  storage.removeNamespace();
@@ -1 +1 @@
1
- {"version":3,"file":"PersistentConfig.js","sourceRoot":"","sources":["../../../../../packages/yasgui/src/PersistentConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PersistentConfig.js","sourceRoot":"","sources":["../../../../../packages/yasgui/src/PersistentConfig.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -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
- const HORIZONTAL_LAYOUT_ICON = `<svg viewBox="0 0 24 24">
22
- <rect x="2" y="4" width="9" height="16" stroke="currentColor" stroke-width="2" fill="none"/>
23
- <rect x="13" y="4" width="9" height="16" stroke="currentColor" stroke-width="2" fill="none"/>
24
- </svg>`;
25
- const VERTICAL_LAYOUT_ICON = `<svg viewBox="0 0 24 24">
26
- <rect x="2" y="2" width="20" height="8" stroke="currentColor" stroke-width="2" fill="none"/>
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" ? HORIZONTAL_LAYOUT_ICON : VERTICAL_LAYOUT_ICON;
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 = OVERFLOW_ICON;
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);
@@ -737,7 +1048,8 @@ WHERE {
737
1048
  }
738
1049
  initYasqe() {
739
1050
  const currentTheme = this.yasgui.getTheme();
740
- const cmTheme = currentTheme === "dark" ? "material-palenight" : "default";
1051
+ const storedCmTheme = this.yasgui.persistentConfig.getCodeMirrorTheme(currentTheme);
1052
+ const cmTheme = storedCmTheme || (currentTheme === "dark" ? "github-dark" : "default");
741
1053
  const yasqeConf = Object.assign(Object.assign({}, this.yasgui.config.yasqe), { theme: cmTheme, value: this.persistentJson.yasqe.value, editorHeight: this.persistentJson.yasqe.editorHeight ? this.persistentJson.yasqe.editorHeight : undefined, persistenceId: null, consumeShareLink: null, createShareableLink: () => this.getShareableLink(), showSnippetsBar: this.yasgui.config.showSnippetsBar !== false, requestConfig: () => {
742
1054
  const processedReqConfig = Object.assign(Object.assign({ acceptHeaderGraph: "text/turtle", acceptHeaderSelect: "application/sparql-results+json" }, mergeWith({}, this.persistentJson.requestConfig, this.getStaticRequestConfig(), function customizer(objValue, srcValue) {
743
1055
  if (Array.isArray(objValue) || Array.isArray(srcValue)) {
@@ -761,6 +1073,16 @@ WHERE {
761
1073
  }
762
1074
  return processedReqConfig;
763
1075
  } });
1076
+ const existingExtraKeys = yasqeConf.extraKeys;
1077
+ const mergedExtraKeys = existingExtraKeys && typeof existingExtraKeys === "object" ? Object.assign({}, existingExtraKeys) : {};
1078
+ mergedExtraKeys["Ctrl-S"] = () => {
1079
+ const saveModalOpen = !!document.querySelector(".saveManagedQueryModalOverlay.open");
1080
+ if (saveModalOpen)
1081
+ return;
1082
+ void this.saveManagedQueryOrSaveAsManagedQuery();
1083
+ };
1084
+ mergedExtraKeys["Cmd-S"] = mergedExtraKeys["Ctrl-S"];
1085
+ yasqeConf.extraKeys = mergedExtraKeys;
764
1086
  if (!yasqeConf.hintConfig) {
765
1087
  yasqeConf.hintConfig = {};
766
1088
  }
@@ -771,6 +1093,10 @@ WHERE {
771
1093
  throw new Error("Expected a wrapper element before instantiating yasqe");
772
1094
  }
773
1095
  this.yasqe = new Yasqe(this.yasqeWrapperEl, yasqeConf);
1096
+ this.yasqe.on("saveManagedQuery", () => {
1097
+ void this.saveManagedQueryOrSaveAsManagedQuery();
1098
+ });
1099
+ this.updateSaveButtonVisibility();
774
1100
  this.yasqe.on("blur", this.handleYasqeBlur);
775
1101
  this.yasqe.on("query", this.handleYasqeQuery);
776
1102
  this.yasqe.on("queryBefore", this.handleYasqeQueryBefore);
@@ -781,6 +1107,38 @@ WHERE {
781
1107
  this.yasqe.on("queryResponse", this.handleQueryResponse);
782
1108
  this.attachYasqeMouseHandler();
783
1109
  }
1110
+ updateSaveButtonVisibility() {
1111
+ if (!this.yasqe)
1112
+ return;
1113
+ const workspaces = this.yasgui.persistentConfig.getWorkspaces();
1114
+ const hasWorkspaces = workspaces && workspaces.length > 0;
1115
+ this.yasqe.setSaveButtonVisible(hasWorkspaces);
1116
+ }
1117
+ initSaveManagedQueryIcon() {
1118
+ if (!this.yasqe)
1119
+ return;
1120
+ const wrapper = this.yasqe.getWrapperElement();
1121
+ const buttons = wrapper === null || wrapper === void 0 ? void 0 : wrapper.querySelector(".yasqe_buttons");
1122
+ if (!buttons)
1123
+ return;
1124
+ if (buttons.querySelector(".yasqe_saveManagedQueryButton"))
1125
+ return;
1126
+ const queryBtn = buttons.querySelector(".yasqe_queryButton");
1127
+ if (!queryBtn)
1128
+ return;
1129
+ const saveBtn = document.createElement("button");
1130
+ saveBtn.type = "button";
1131
+ saveBtn.className = "yasqe_saveManagedQueryButton";
1132
+ saveBtn.title = "Save managed query";
1133
+ saveBtn.setAttribute("aria-label", "Save managed query");
1134
+ saveBtn.innerHTML = '<i class="fas fa-save" aria-hidden="true"></i>';
1135
+ saveBtn.addEventListener("click", (e) => {
1136
+ e.preventDefault();
1137
+ e.stopPropagation();
1138
+ void this.saveManagedQueryOrSaveAsManagedQuery();
1139
+ });
1140
+ buttons.insertBefore(saveBtn, queryBtn);
1141
+ }
784
1142
  destroyYasqe() {
785
1143
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
786
1144
  (_a = this.yasqe) === null || _a === void 0 ? void 0 : _a.off("blur", this.handleYasqeBlur);