mirror of
https://github.com/apache/superset.git
synced 2026-05-23 16:55:19 +00:00
Copilot flagged two stragglers on editors.md where the previous file-by-file conversion stopped halfway. Sweeping for the same pattern across the active content tree found 76 bare relative internal links total — 14 in this PR's already-modified files (Copilot's two plus twelve more) and 62 in unchanged files. Why the build doesn't catch this ───────────────────────────────── `onBrokenLinks: 'throw'` (set in this PR) only validates *file-based* markdown references — links whose URL ends in `.md` / `.mdx`. Those go through Docusaurus's file resolver, which can prove the target exists. Bare relative URL paths like `[Foo](../foo)` skip that resolver entirely; Docusaurus emits them as raw hrefs. The browser then resolves them against the *current* page URL, and for trailing-slash routes that almost always lands in the wrong directory. Page navigates client-side and 404s. The linkinator job in CI *can* catch these, but it's `continue-on-error: true` so findings are advisory. What this commit does ────────────────────── 1. Fix all 76 bare relative internal links across the active docs tree by appending `.md` to each one (preserving anchors / query strings). All 76 targets resolved to real files; no link targets changed, only the form of the reference. 2. Fix the component-page generator. 54 of the 76 bare links lived in two auto-generated index files (`components/ui/index.mdx` and `components/design-system/index.mdx`). The next regeneration would have undone the manual fixes without this. The two emission sites in `generate-superset-components.mjs` now emit `.md`-suffixed links; comment at the call site explains why. 3. Add `docs/scripts/lint-docs-links.mjs` — fast source-level linter that scans `.md`/`.mdx` files under the active content trees (skipping `versioned_docs/` snapshots) and fails if it finds any markdown link whose URL starts with `./` or `../` and does not end in `.md`/`.mdx`. Excludes asset paths (.png, .json, etc.) and ignores fenced code blocks. Wired up as `yarn lint:docs-links`. 4. Add a `Lint docs links` step to `superset-docs-verify.yml`, running before the build step so PRs that introduce the pattern fail in seconds rather than at build-time / not at all. Blocking, not advisory — exactly the gap linkinator's `continue-on-error` leaves open. Verified ──────── - `yarn lint:docs-links` exits 0 on the cleaned tree - Re-introducing one bare link makes the linter report the exact file:line with the offending URL, exit code 1 - All 76 originally-flagged targets resolved to real `.md` / `.mdx` files; only the form of the reference changed
163 lines
6.7 KiB
Markdown
163 lines
6.7 KiB
Markdown
---
|
|
title: SQL Lab
|
|
sidebar_position: 1
|
|
---
|
|
|
|
<!--
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
-->
|
|
|
|
# SQL Lab Extension Points
|
|
|
|
SQL Lab provides 4 extension points where extensions can contribute custom UI components. Each area serves a specific purpose and supports different types of customizations. These areas will evolve over time as new features are added to SQL Lab.
|
|
|
|
## Layout Overview
|
|
|
|
```
|
|
┌──────────┬─────────────────────────────────────────┬─────────────┐
|
|
│ │ │ │
|
|
│ │ │ │
|
|
│ │ Editor │ │
|
|
│ │ │ │
|
|
│ Left │ │ Right │
|
|
│ Sidebar ├─────────────────────────────────────────┤ Sidebar │
|
|
│ │ │ │
|
|
│ │ Panels │ │
|
|
│ │ │ │
|
|
│ │ │ │
|
|
│ │ │ │
|
|
└──────────┴─────────────────────────────────────────┴─────────────┘
|
|
```
|
|
|
|
| Extension Point | ID | Views | Menus | Description |
|
|
| ----------------- | --------------------- | ----- | ----- | ---------------------------------------------- |
|
|
| **Left Sidebar** | `sqllab.leftSidebar` | — | ✓ | Menu actions for the database explorer |
|
|
| **Editor** | `sqllab.editor` | ✓\* | ✓ | Custom editors + toolbar actions |
|
|
| **Right Sidebar** | `sqllab.rightSidebar` | ✓ | — | Custom panels (AI assistants, query analysis) |
|
|
| **Panels** | `sqllab.panels` | ✓ | ✓ | Custom tabs + toolbar actions (data profiling) |
|
|
|
|
\*Editor views are contributed via [Editor Contributions](./editors.md), not standard view contributions.
|
|
|
|
## Customization Types
|
|
|
|
### Views
|
|
|
|
Extensions can add custom views (React components) to **Right Sidebar** and **Panels**. Views appear as new panels or tabs in their respective areas.
|
|
|
|
### Menus
|
|
|
|
Extensions can add toolbar actions to **Left Sidebar**, **Editor**, and **Panels**. Menu contributions support:
|
|
|
|
```
|
|
┌───────────────────────────────────────────────────────────────┐
|
|
│ [Button] [Button] [•••] │
|
|
├───────────────────────────────────────────────────────────────┤
|
|
│ Area Content │
|
|
└───────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
| Action Type | Location | Use Case |
|
|
| --------------------- | ---------------- | ----------------------------------------------------- |
|
|
| **Primary Actions** | Toolbar buttons | Frequently used actions (e.g., run, refresh, add new) |
|
|
| **Secondary Actions** | 3-dot menu (•••) | Less common actions (e.g., export, settings) |
|
|
|
|
### Custom Editors
|
|
|
|
Extensions can replace the default SQL editor with custom implementations (Monaco, CodeMirror, etc.). See [Editor Contributions](./editors.md) for details.
|
|
|
|
## Examples
|
|
|
|
### Adding a Panel
|
|
|
|
This example adds a "Data Profiler" panel to SQL Lab:
|
|
|
|
```typescript
|
|
import React from 'react';
|
|
import { views } from '@apache-superset/core';
|
|
import DataProfilerPanel from './DataProfilerPanel';
|
|
|
|
views.registerView(
|
|
{ id: 'my-extension.data-profiler', name: 'Data Profiler' },
|
|
'sqllab.panels',
|
|
() => <DataProfilerPanel />,
|
|
);
|
|
```
|
|
|
|
### Adding Actions to the Editor
|
|
|
|
This example adds primary, secondary, and context actions to the editor:
|
|
|
|
```typescript
|
|
import { commands, menus, sqlLab } from '@apache-superset/core';
|
|
|
|
commands.registerCommand(
|
|
{ id: 'my-extension.format', title: 'Format Query', icon: 'FormatPainterOutlined' },
|
|
async () => {
|
|
const tab = sqlLab.getCurrentTab();
|
|
if (tab) {
|
|
const editor = await tab.getEditor();
|
|
// Format the SQL query
|
|
}
|
|
},
|
|
);
|
|
|
|
commands.registerCommand(
|
|
{ id: 'my-extension.explain', title: 'Explain Query' },
|
|
async () => {
|
|
const tab = sqlLab.getCurrentTab();
|
|
if (tab) {
|
|
const editor = await tab.getEditor();
|
|
// Show query explanation
|
|
}
|
|
},
|
|
);
|
|
|
|
commands.registerCommand(
|
|
{ id: 'my-extension.copy-as-cte', title: 'Copy as CTE' },
|
|
async () => {
|
|
const tab = sqlLab.getCurrentTab();
|
|
if (tab) {
|
|
const editor = await tab.getEditor();
|
|
// Copy selected text as CTE
|
|
}
|
|
},
|
|
);
|
|
|
|
menus.registerMenuItem(
|
|
{ view: 'builtin.editor', command: 'my-extension.format' },
|
|
'sqllab.editor',
|
|
'primary',
|
|
);
|
|
menus.registerMenuItem(
|
|
{ view: 'builtin.editor', command: 'my-extension.explain' },
|
|
'sqllab.editor',
|
|
'secondary',
|
|
);
|
|
menus.registerMenuItem(
|
|
{ view: 'builtin.editor', command: 'my-extension.copy-as-cte' },
|
|
'sqllab.editor',
|
|
'context',
|
|
);
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
- **[Contribution Types](../contribution-types.md)** - Learn about other contribution types (commands, menus)
|
|
- **[Development](../development.md)** - Set up your development environment
|
|
- **[Quick Start](../quick-start.md)** - Build a complete extension
|