diff --git a/superset-core/src/superset_core/extensions/types.py b/superset-core/src/superset_core/extensions/types.py index a75c3425e43..82f4d5a85eb 100644 --- a/superset-core/src/superset_core/extensions/types.py +++ b/superset-core/src/superset_core/extensions/types.py @@ -88,6 +88,10 @@ class ContributionConfig(BaseModel): default_factory=dict, description="Menu contributions by scope and location", ) + editors: list[dict[str, Any]] = Field( + default_factory=list, + description="Editor contributions", + ) class BaseExtension(BaseModel): diff --git a/superset-frontend/packages/superset-core/src/api/editors.ts b/superset-frontend/packages/superset-core/src/api/editors.ts index 94871105a31..d2b63d2beca 100644 --- a/superset-frontend/packages/superset-core/src/api/editors.ts +++ b/superset-frontend/packages/superset-core/src/api/editors.ts @@ -294,6 +294,10 @@ export interface EditorKeyword { meta?: string; /** Sorting priority; higher scores appear first in the completion list */ score?: number; + /** Short supplementary text such as a type signature or the full value when truncated */ + detail?: string; + /** Longer documentation content as an HTML string, shown in a documentation popup */ + documentation?: string; } /** diff --git a/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts b/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts index 9aa7dcdacfd..60c6d5095f5 100644 --- a/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts +++ b/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.test.ts @@ -295,7 +295,7 @@ test('returns column keywords among selected tables', async () => { ); }); -test('returns long keywords with docText', async () => { +test('returns long keywords with detail', async () => { const expectLongKeywordDbId = 2; const longKeyword = 'veryveryveryveryverylongtablename'; const dbFunctionNamesApiRoute = `glob:*/api/v1/database/${expectLongKeywordDbId}/function_names/`; @@ -335,7 +335,7 @@ test('returns long keywords with docText', async () => { expect.objectContaining({ name: longKeyword, value: longKeyword, - docText: longKeyword, + detail: longKeyword, }), ), ); diff --git a/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts b/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts index 19801df7e38..52c0cd818b0 100644 --- a/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts +++ b/superset-frontend/src/SqlLab/components/EditorWrapper/useKeywords.ts @@ -55,7 +55,7 @@ const { useQueryState: useTablesQueryState } = tableEndpoints.tables; const getHelperText = (value: string) => value.length > 30 && { - docText: value, + detail: value, }; const extensionsRegistry = getExtensionsRegistry(); diff --git a/superset-frontend/src/core/editors/AceEditorProvider.tsx b/superset-frontend/src/core/editors/AceEditorProvider.tsx index c52d0f93332..89c8a579117 100644 --- a/superset-frontend/src/core/editors/AceEditorProvider.tsx +++ b/superset-frontend/src/core/editors/AceEditorProvider.tsx @@ -189,6 +189,8 @@ const toAceKeyword = (keyword: EditorKeyword): AceCompleterKeyword => ({ value: keyword.value ?? keyword.name, score: keyword.score ?? 0, meta: keyword.meta ?? '', + docText: keyword.detail, + docHTML: keyword.documentation, }); /** diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx index 6129ef0f2f5..4c3d0fa13aa 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.test.tsx @@ -184,13 +184,13 @@ test('passes keywords as objects to SQLEditorWithValidation for autocomplete', ( expect(keyword).toHaveProperty('meta'); }); - // Verify column keywords specifically have docHTML for rich tooltips + // Verify column keywords specifically have documentation for rich tooltips const columnKeywords = keywords.filter( (k: Record) => k.meta === 'column', ); expect(columnKeywords.length).toBe(2); // We passed 2 columns columnKeywords.forEach((keyword: Record) => { - expect(keyword).toHaveProperty('docHTML'); + expect(keyword).toHaveProperty('documentation'); }); }); diff --git a/superset-frontend/src/explore/controlUtils/getColumnKeywords.test.tsx b/superset-frontend/src/explore/controlUtils/getColumnKeywords.test.tsx index 59782ba94df..003f01e367b 100644 --- a/superset-frontend/src/explore/controlUtils/getColumnKeywords.test.tsx +++ b/superset-frontend/src/explore/controlUtils/getColumnKeywords.test.tsx @@ -31,7 +31,7 @@ test('returns HTML for a column tooltip', () => { expect(getColumnKeywords([expected])).toContainEqual({ name: expected.column_name, value: expected.column_name, - docHTML: expect.stringContaining(expected.description), + documentation: expect.stringContaining(expected.description), score: 50, meta: 'column', }); diff --git a/superset-frontend/src/explore/controlUtils/getColumnKeywords.tsx b/superset-frontend/src/explore/controlUtils/getColumnKeywords.tsx index a6ace5ae01a..584d91f02ff 100644 --- a/superset-frontend/src/explore/controlUtils/getColumnKeywords.tsx +++ b/superset-frontend/src/explore/controlUtils/getColumnKeywords.tsx @@ -34,7 +34,7 @@ export function getColumnKeywords(columns: ColumnMeta[]) { }) => ({ name: verbose_name || column_name, value: column_name, - docHTML: getTooltipHTML({ + documentation: getTooltipHTML({ title: column_name, body: `type: ${type || 'unknown'}
${description ? `description: ${description}` : ''}`, footer: is_certified ? t('Certified by %s', certified_by) : undefined,