diff --git a/src-web/components/EnvironmentEditDialog.tsx b/src-web/components/EnvironmentEditDialog.tsx
index 525e89b3..93969962 100644
--- a/src-web/components/EnvironmentEditDialog.tsx
+++ b/src-web/components/EnvironmentEditDialog.tsx
@@ -281,7 +281,7 @@ function SidebarButton({
},
},
{
- key: 'delete',
+ key: 'delete-environment',
variant: 'danger',
label: 'Delete',
leftSlot: ,
diff --git a/src-web/components/GlobalHooks.tsx b/src-web/components/GlobalHooks.tsx
index fdb63a76..7dee9a3e 100644
--- a/src-web/components/GlobalHooks.tsx
+++ b/src-web/components/GlobalHooks.tsx
@@ -4,6 +4,7 @@ import { useEffect } from 'react';
import { useClipboardText } from '../hooks/useClipboardText';
import { useCommandPalette } from '../hooks/useCommandPalette';
import { cookieJarsQueryKey } from '../hooks/useCookieJars';
+import { environmentsQueryKey } from '../hooks/useEnvironments';
import { foldersQueryKey } from '../hooks/useFolders';
import { useGlobalCommands } from '../hooks/useGlobalCommands';
import { grpcConnectionsQueryKey } from '../hooks/useGrpcConnections';
@@ -62,6 +63,8 @@ export function GlobalHooks() {
? httpResponsesQueryKey(model)
: model.model === 'folder'
? foldersQueryKey(model)
+ : model.model === 'environment'
+ ? environmentsQueryKey(model)
: model.model === 'grpc_connection'
? grpcConnectionsQueryKey(model)
: model.model === 'grpc_event'
@@ -96,10 +99,8 @@ export function GlobalHooks() {
queryClient.setQueryData(queryKey, (values = []) => {
const index = values.findIndex((v) => modelsEq(v, model)) ?? -1;
if (index >= 0) {
- // console.log('UPDATED', payload);
return [...values.slice(0, index), model, ...values.slice(index + 1)];
} else {
- // console.log('CREATED', payload);
return pushToFront ? [model, ...(values ?? [])] : [...(values ?? []), model];
}
});
@@ -117,6 +118,8 @@ export function GlobalHooks() {
queryClient.setQueryData(httpResponsesQueryKey(model), removeById(model));
} else if (model.model === 'folder') {
queryClient.setQueryData(foldersQueryKey(model), removeById(model));
+ } else if (model.model === 'environment') {
+ queryClient.setQueryData(environmentsQueryKey(model), removeById(model));
} else if (model.model === 'grpc_request') {
queryClient.setQueryData(grpcRequestsQueryKey(model), removeById(model));
} else if (model.model === 'grpc_connection') {
diff --git a/src-web/components/core/Editor/Editor.css b/src-web/components/core/Editor/Editor.css
index 7d78ab04..af6e0ee6 100644
--- a/src-web/components/core/Editor/Editor.css
+++ b/src-web/components/core/Editor/Editor.css
@@ -266,7 +266,7 @@
}
&.cm-completionInfo-right {
- @apply ml-1 -mt-0.5;
+ @apply ml-1 -mt-0.5 font-sans;
}
&.cm-completionInfo-right-narrow {
@@ -278,7 +278,7 @@
}
&.cm-tooltip-autocomplete {
- @apply font-mono text-editor;
+ @apply font-mono;
& > ul {
@apply p-1 max-h-[40vh];
diff --git a/src-web/components/core/Editor/genericCompletion.ts b/src-web/components/core/Editor/genericCompletion.ts
index fa6b4056..1ba136b5 100644
--- a/src-web/components/core/Editor/genericCompletion.ts
+++ b/src-web/components/core/Editor/genericCompletion.ts
@@ -20,7 +20,11 @@ export interface GenericCompletionConfig {
/**
* Complete options, always matching until the start of the line
*/
-export function genericCompletion({ options, minMatch = 1 }: GenericCompletionConfig) {
+export function genericCompletion(config?: GenericCompletionConfig) {
+ if (config == null) return [];
+
+ const { minMatch = 1, options } = config;
+
return function completions(context: CompletionContext) {
const toMatch = context.matchBefore(/.*/);
diff --git a/src-web/components/core/Editor/twig/extension.ts b/src-web/components/core/Editor/twig/extension.ts
index 95ed4c19..2c68c6fa 100644
--- a/src-web/components/core/Editor/twig/extension.ts
+++ b/src-web/components/core/Editor/twig/extension.ts
@@ -1,13 +1,13 @@
import type { LanguageSupport } from '@codemirror/language';
import { LRLanguage } from '@codemirror/language';
import { parseMixed } from '@lezer/common';
+import type { Environment, Workspace } from '../../../../lib/models';
import type { GenericCompletionConfig } from '../genericCompletion';
import { genericCompletion } from '../genericCompletion';
-import { placeholders } from './placeholder';
import { textLanguageName } from '../text/extension';
import { twigCompletion } from './completion';
+import { placeholders } from './placeholder';
import { parser as twigParser } from './twig';
-import type { Environment, Workspace } from '../../../../lib/models';
export function twig(
base: LanguageSupport,
@@ -15,25 +15,19 @@ export function twig(
workspace: Workspace | null,
autocomplete?: GenericCompletionConfig,
) {
- const variables =
- [...(workspace?.variables ?? []), ...(environment?.variables ?? [])].filter((v) => v.enabled) ??
- [];
- const completions = twigCompletion({ options: variables });
-
const language = mixLanguage(base);
- const completion = language.data.of({ autocomplete: completions });
- const completionBase = base.language.data.of({ autocomplete: completions });
- const additionalCompletion = autocomplete
- ? [base.language.data.of({ autocomplete: genericCompletion(autocomplete) })]
- : [];
+ const allVariables = [...(workspace?.variables ?? []), ...(environment?.variables ?? [])];
+ const variables = allVariables.filter((v) => v.enabled) ?? [];
+ const completions = twigCompletion({ options: variables });
return [
language,
- completion,
- completionBase,
base.support,
placeholders(variables),
- ...additionalCompletion,
+ language.data.of({ autocomplete: completions }),
+ base.language.data.of({ autocomplete: completions }),
+ language.data.of({ autocomplete: genericCompletion(autocomplete) }),
+ base.language.data.of({ autocomplete: genericCompletion(autocomplete) }),
];
}