Files
grafana/public/app/features/expressions/components/sqlCompletionProvider.ts
Kristina 5bfed408ed SQL Expressions: Enable Auto-complete (#106511)
* First draft autocomplete

* Better naming

* Change suggestion to table/column population

* Remove all suggestions, just use table/column population but trigger on space

* Gate feature flag behind a feature flag

* Reorganize and add function list

* Add blurb about autocomplete to docs

* Update public/app/features/expressions/utils/metaSqlExpr.ts

Co-authored-by: Alex Spencer <52186778+alexjonspencer1@users.noreply.github.com>

* Add try catch, remove promise resolve

---------

Co-authored-by: Alex Spencer <52186778+alexjonspencer1@users.noreply.github.com>
2025-07-23 16:49:58 -05:00

47 lines
1.4 KiB
TypeScript

import { SelectableValue } from '@grafana/data';
import { ColumnDefinition, LanguageCompletionProvider, TableDefinition, TableIdentifier } from '@grafana/plugin-ui';
import { config } from '@grafana/runtime';
import { ALLOWED_FUNCTIONS } from '../utils/metaSqlExpr';
interface CompletionProviderGetterArgs {
getFields: (t: TableIdentifier) => Promise<ColumnDefinition[]>;
refIds: Array<SelectableValue<string>>;
}
export const getSqlCompletionProvider: (args: CompletionProviderGetterArgs) => LanguageCompletionProvider =
(args) => (monaco, language) => ({
...language,
triggerCharacters: [' '],
tables: {
resolve: async () => {
const refIdsToTableDefs = args.refIds.map((refId) => {
const tableDef: TableDefinition = {
name: refId.label || refId.value || '',
completion: refId.label || refId.value || '',
};
return tableDef;
});
return refIdsToTableDefs;
},
},
columns: {
resolve: async (t?: TableIdentifier) => {
if (config.featureToggles.sqlExpressionsColumnAutoComplete) {
try {
return await args.getFields({ table: t?.table });
} catch {
return [];
}
} else {
return [];
}
},
},
supportedFunctions: () => {
return ALLOWED_FUNCTIONS.map((func) => {
return { id: func, name: func };
});
},
});