mirror of
https://github.com/apache/superset.git
synced 2026-05-13 03:45:12 +00:00
Compare commits
237 Commits
cherry-pic
...
revert-352
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07af6c7880 | ||
|
|
027b25e6b8 | ||
|
|
b652fab042 | ||
|
|
77a5969dc1 | ||
|
|
fb9032c05c | ||
|
|
7a9dbfe879 | ||
|
|
0de78d8203 | ||
|
|
abc2d46fed | ||
|
|
927cc1cda1 | ||
|
|
7f3840557a | ||
|
|
0defcb604b | ||
|
|
94686ddfbe | ||
|
|
ec322dfd8d | ||
|
|
cb88d886c7 | ||
|
|
608e3baf43 | ||
|
|
b6f6b75348 | ||
|
|
a5ad1d186c | ||
|
|
db88d80b3f | ||
|
|
4b71adaa9c | ||
|
|
5fbda3af40 | ||
|
|
bc0c40c80e | ||
|
|
f030d658c5 | ||
|
|
e85337c543 | ||
|
|
fe7f8062f3 | ||
|
|
dce74014da | ||
|
|
619b341cad | ||
|
|
9b6876be62 | ||
|
|
c601341520 | ||
|
|
78faaee685 | ||
|
|
4027bad1d6 | ||
|
|
ce55cc7dd7 | ||
|
|
48e1b1ff2c | ||
|
|
5ec8f9d886 | ||
|
|
ecb3ac68ff | ||
|
|
076e477fd4 | ||
|
|
1e4bc6ee78 | ||
|
|
db178cf527 | ||
|
|
5901320933 | ||
|
|
23bb4f88c0 | ||
|
|
4130b92966 | ||
|
|
38297edc6b | ||
|
|
0c8f326258 | ||
|
|
127f6b3d66 | ||
|
|
ea519a77b5 | ||
|
|
6cb3ef9f5d | ||
|
|
a889ae75fc | ||
|
|
b60be9655f | ||
|
|
fd6da21ce0 | ||
|
|
1bf112a57a | ||
|
|
1f530d45cb | ||
|
|
1187902e68 | ||
|
|
ad3eff9e90 | ||
|
|
3e554674ff | ||
|
|
dced2f8564 | ||
|
|
05c6a1bf20 | ||
|
|
c193d6d6a1 | ||
|
|
fb840b8e71 | ||
|
|
d0cc6f115b | ||
|
|
966e231f94 | ||
|
|
a66737cb05 | ||
|
|
bc6859a99d | ||
|
|
133e686224 | ||
|
|
7d0a472d1e | ||
|
|
c2534f9155 | ||
|
|
088ecdd0bf | ||
|
|
e1a2e4843a | ||
|
|
15e8ffee1e | ||
|
|
19ddcb7e5c | ||
|
|
36daa2dc3f | ||
|
|
7fd5a7668b | ||
|
|
95333e34b1 | ||
|
|
a9fb853e3e | ||
|
|
dea9068647 | ||
|
|
3416bd1479 | ||
|
|
e729b2dbb4 | ||
|
|
06261f262b | ||
|
|
454ed1883f | ||
|
|
b42060c880 | ||
|
|
7bf16d805d | ||
|
|
529adebe1b | ||
|
|
eb4351af83 | ||
|
|
5a2411fa64 | ||
|
|
078c1701f4 | ||
|
|
a7d349a5c6 | ||
|
|
7a20a65a4d | ||
|
|
912ed2ba80 | ||
|
|
fedb3ca941 | ||
|
|
42b15b6840 | ||
|
|
2f64343186 | ||
|
|
65376c7baf | ||
|
|
4c2b27e7f0 | ||
|
|
15e4e8df94 | ||
|
|
c5f220a9ff | ||
|
|
b05def1a8a | ||
|
|
da7f6efea8 | ||
|
|
1c2b9db4f0 | ||
|
|
0fce5ecfa5 | ||
|
|
385471c34d | ||
|
|
bef1f4d045 | ||
|
|
5a3182ce21 | ||
|
|
9efb80dbf4 | ||
|
|
a20b236809 | ||
|
|
4e969d19d1 | ||
|
|
876257fb94 | ||
|
|
472e599f91 | ||
|
|
d826e90395 | ||
|
|
c65cb284e6 | ||
|
|
bc54b7970a | ||
|
|
ce74ae095d | ||
|
|
9424538bb1 | ||
|
|
031fb4b5a8 | ||
|
|
7fb7ac8bef | ||
|
|
569a7b33a5 | ||
|
|
59df0d6f15 | ||
|
|
2e4ccffc11 | ||
|
|
2e51d02806 | ||
|
|
8406a827dd | ||
|
|
ea0a77daaf | ||
|
|
e5e3ddb24e | ||
|
|
7320ad9a0a | ||
|
|
3dbe593a4a | ||
|
|
61f359d565 | ||
|
|
e77ff267a1 | ||
|
|
c426723275 | ||
|
|
d2a1d86561 | ||
|
|
0cd0b37983 | ||
|
|
a6b4ff9847 | ||
|
|
a81282adeb | ||
|
|
3ba3c09c47 | ||
|
|
3081c7fb62 | ||
|
|
fa5b0d7281 | ||
|
|
1444ef36b9 | ||
|
|
15d2f22eb4 | ||
|
|
355d7e1ee5 | ||
|
|
448a28545b | ||
|
|
cefd046ea0 | ||
|
|
b0d3f0f0d4 | ||
|
|
b7a193d53e | ||
|
|
0a75bac2a1 | ||
|
|
0de5b28716 | ||
|
|
b5ae402c12 | ||
|
|
682cdcc3e0 | ||
|
|
5dba59b6a4 | ||
|
|
71242dc6dd | ||
|
|
b2f8803486 | ||
|
|
744fa1f54c | ||
|
|
f0ff972f0e | ||
|
|
ba838b6aeb | ||
|
|
6a4b1df3a2 | ||
|
|
0a76f84142 | ||
|
|
9bcc62f210 | ||
|
|
322442d5be | ||
|
|
92879e6b32 | ||
|
|
fad3cb3162 | ||
|
|
4d040006b6 | ||
|
|
6e7cb521ba | ||
|
|
bc9ec6ac63 | ||
|
|
b9cbf2e766 | ||
|
|
d183969744 | ||
|
|
4695be5cc5 | ||
|
|
c1a3606774 | ||
|
|
175835138c | ||
|
|
077724c2d2 | ||
|
|
6b69dc42dc | ||
|
|
c5a84c0985 | ||
|
|
dc7a8844eb | ||
|
|
54f071138c | ||
|
|
812374b31b | ||
|
|
e463743fcf | ||
|
|
1d9e17df14 | ||
|
|
bcf156c969 | ||
|
|
ebfb14c353 | ||
|
|
7946ec003f | ||
|
|
665a11f821 | ||
|
|
5566eb8dd6 | ||
|
|
836540e8c9 | ||
|
|
b558b34faf | ||
|
|
30c72ba0a3 | ||
|
|
d8a3d29ad9 | ||
|
|
53ce530a46 | ||
|
|
06264f07fb | ||
|
|
ce3b93d8a0 | ||
|
|
b74a244950 | ||
|
|
ab58b0a8a3 | ||
|
|
659db162d6 | ||
|
|
cb24737825 | ||
|
|
97b35a4640 | ||
|
|
54af1cb2c8 | ||
|
|
b8c2f7db47 | ||
|
|
4701e78f1f | ||
|
|
b89b0bdf5d | ||
|
|
47414e18d4 | ||
|
|
9c9588cce6 | ||
|
|
471d9fe737 | ||
|
|
b381992a75 | ||
|
|
1204507d68 | ||
|
|
c7779578f9 | ||
|
|
b225432c55 | ||
|
|
547f297171 | ||
|
|
5c3c2599db | ||
|
|
a8be5a5a0c | ||
|
|
e1234b2264 | ||
|
|
75af53dc3d | ||
|
|
0a45a89786 | ||
|
|
2b2cc96f11 | ||
|
|
59c01e016d | ||
|
|
3895b8b127 | ||
|
|
da8c0f94e6 | ||
|
|
6908a733a0 | ||
|
|
e8e1466185 | ||
|
|
ff1f7b64e2 | ||
|
|
63bb1d55a4 | ||
|
|
c568d463b9 | ||
|
|
179a6f2cfe | ||
|
|
695a20d009 | ||
|
|
e908775fb2 | ||
|
|
af05396227 | ||
|
|
277f03c207 | ||
|
|
48699a7194 | ||
|
|
b7d076bfee | ||
|
|
009b99bfbb | ||
|
|
b45141b2a1 | ||
|
|
4683a0827d | ||
|
|
ffb617a4c8 | ||
|
|
9de1706baa | ||
|
|
a95566f114 | ||
|
|
a82e310600 | ||
|
|
691926f0e1 | ||
|
|
a42185cd3b | ||
|
|
89eb7b207c | ||
|
|
f99022b242 | ||
|
|
f8b9e3ace4 | ||
|
|
9cbe5a90b8 | ||
|
|
f7fe617f4c | ||
|
|
e6c8343fd0 | ||
|
|
6969f2cf7a | ||
|
|
852adaa6cc |
10
.claude/commands/js-to-ts.md
Normal file
10
.claude/commands/js-to-ts.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# JavaScript to TypeScript Migration Command
|
||||
|
||||
## Usage
|
||||
```
|
||||
/js-to-ts <core-filename>
|
||||
```
|
||||
- `<core-filename>` - Path to CORE file relative to `superset-frontend/` (e.g., `src/utils/common.js`, `src/middleware/loggerMiddleware.js`)
|
||||
|
||||
## Agent Instructions
|
||||
**See:** [../projects/js-to-ts/AGENT.md](../projects/js-to-ts/AGENT.md) for complete migration guide.
|
||||
684
.claude/projects/js-to-ts/AGENT.md
Normal file
684
.claude/projects/js-to-ts/AGENT.md
Normal file
@@ -0,0 +1,684 @@
|
||||
# JavaScript to TypeScript Migration Agent Guide
|
||||
|
||||
**Complete technical reference for converting JavaScript/JSX files to TypeScript/TSX in Apache Superset frontend.**
|
||||
|
||||
**Agent Role:** Atomic migration unit - migrate the core file + ALL related tests/mocks as one cohesive unit. Use `git mv` to preserve history, NO `git commit`. NO global import changes. Report results upon completion.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Migration Principles
|
||||
|
||||
1. **Atomic migration units** - Core file + all related tests/mocks migrate together
|
||||
2. **Zero `any` types** - Use proper TypeScript throughout
|
||||
3. **Leverage existing types** - Reuse established definitions
|
||||
4. **Type inheritance** - Derivatives extend base component types
|
||||
5. **Strategic placement** - File types for maximum discoverability
|
||||
6. **Surgical improvements** - Enhance existing types during migration
|
||||
|
||||
---
|
||||
|
||||
## Step 0: Dependency Check (MANDATORY)
|
||||
|
||||
**Command:**
|
||||
```bash
|
||||
grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" superset-frontend/{filename}
|
||||
```
|
||||
|
||||
**Decision:**
|
||||
- ✅ No matches → Proceed with atomic migration (core + tests + mocks)
|
||||
- ❌ Matches found → EXIT with dependency report (see format below)
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Identify Related Files (REQUIRED)
|
||||
|
||||
**Atomic Migration Scope:**
|
||||
For core file `src/utils/example.js`, also migrate:
|
||||
- `src/utils/example.test.js` / `src/utils/example.test.jsx`
|
||||
- `src/utils/example.spec.js` / `src/utils/example.spec.jsx`
|
||||
- `src/utils/__mocks__/example.js`
|
||||
- Any other related test/mock files found by pattern matching
|
||||
|
||||
**Find all related test and mock files:**
|
||||
```bash
|
||||
# Pattern-based search for related files
|
||||
basename=$(basename {filename} .js)
|
||||
dirname=$(dirname superset-frontend/{filename})
|
||||
|
||||
# Find test files
|
||||
find "$dirname" -name "${basename}.test.js" -o -name "${basename}.test.jsx"
|
||||
find "$dirname" -name "${basename}.spec.js" -o -name "${basename}.spec.jsx"
|
||||
|
||||
# Find mock files
|
||||
find "$dirname" -name "__mocks__/${basename}.js"
|
||||
find "$dirname" -name "${basename}.mock.js"
|
||||
```
|
||||
|
||||
**Migration Requirement:** All discovered related files MUST be migrated together as one atomic unit.
|
||||
|
||||
**Test File Creation:** If NO test files exist for the core file, CREATE a minimal test file using the following pattern:
|
||||
- Location: Same directory as core file
|
||||
- Name: `{basename}.test.ts` (e.g., `DebouncedMessageQueue.test.ts`)
|
||||
- Content: Basic test structure importing and testing the main functionality
|
||||
- Use proper TypeScript types in test file
|
||||
|
||||
---
|
||||
|
||||
## 🗺️ Type Reference Map
|
||||
|
||||
### From `@superset-ui/core`
|
||||
```typescript
|
||||
// Data & Query
|
||||
QueryFormData, QueryData, JsonObject, AnnotationData, AdhocMetric
|
||||
LatestQueryFormData, GenericDataType, DatasourceType, ExtraFormData
|
||||
DataMaskStateWithId, NativeFilterScope, NativeFiltersState, NativeFilterTarget
|
||||
|
||||
// UI & Theme
|
||||
FeatureFlagMap, LanguagePack, ColorSchemeConfig, SequentialSchemeConfig
|
||||
```
|
||||
|
||||
### From `@superset-ui/chart-controls`
|
||||
```typescript
|
||||
Dataset, ColumnMeta, ControlStateMapping
|
||||
```
|
||||
|
||||
### From Local Types (`src/types/`)
|
||||
```typescript
|
||||
// Authentication
|
||||
User, UserWithPermissionsAndRoles, BootstrapUser, PermissionsAndRoles
|
||||
|
||||
// Dashboard
|
||||
Dashboard, DashboardState, DashboardInfo, DashboardLayout, LayoutItem
|
||||
ComponentType, ChartConfiguration, ActiveFilters
|
||||
|
||||
// Charts
|
||||
Chart, ChartState, ChartStatus, ChartLinkedDashboard, Slice, SaveActionType
|
||||
|
||||
// Data
|
||||
Datasource, Database, Owner, Role
|
||||
|
||||
// UI Components
|
||||
TagType, FavoriteStatus, Filter, ImportResourceName
|
||||
```
|
||||
|
||||
### From Domain Types
|
||||
```typescript
|
||||
// src/dashboard/types.ts
|
||||
RootState, ChartsState, DatasourcesState, FilterBarOrientation
|
||||
ChartCrossFiltersConfig, ActiveTabs, MenuKeys
|
||||
|
||||
// src/explore/types.ts
|
||||
ExplorePageInitialData, ExplorePageState, ExploreResponsePayload, OptionSortType
|
||||
|
||||
// src/SqlLab/types.ts
|
||||
[SQL Lab specific types]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Type Organization Strategy
|
||||
|
||||
### Type Placement Hierarchy
|
||||
|
||||
1. **Component-Colocated** (90% of cases)
|
||||
```typescript
|
||||
// Same file as component
|
||||
interface MyComponentProps {
|
||||
title: string;
|
||||
onClick: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
2. **Feature-Shared**
|
||||
```typescript
|
||||
// src/[domain]/components/[Feature]/types.ts
|
||||
export interface FilterConfiguration {
|
||||
filterId: string;
|
||||
targets: NativeFilterTarget[];
|
||||
}
|
||||
```
|
||||
|
||||
3. **Domain-Wide**
|
||||
```typescript
|
||||
// src/[domain]/types.ts
|
||||
export interface ExploreFormData extends QueryFormData {
|
||||
viz_type: string;
|
||||
}
|
||||
```
|
||||
|
||||
4. **Global**
|
||||
```typescript
|
||||
// src/types/[TypeName].ts
|
||||
export interface ApiResponse<T> {
|
||||
result: T;
|
||||
count?: number;
|
||||
}
|
||||
```
|
||||
|
||||
### Type Discovery Commands
|
||||
```bash
|
||||
# Search existing types before creating
|
||||
find superset-frontend/src -name "types.ts" -exec grep -l "[TypeConcept]" {} \;
|
||||
grep -r "interface.*Props\|type.*Props" superset-frontend/src/
|
||||
```
|
||||
|
||||
### Derivative Component Patterns
|
||||
|
||||
**Rule:** Components that extend others should extend their type interfaces.
|
||||
|
||||
```typescript
|
||||
// ✅ Base component type
|
||||
interface SelectProps {
|
||||
value: string | number;
|
||||
options: SelectOption[];
|
||||
onChange: (value: string | number) => void;
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
// ✅ Derivative extends base
|
||||
interface ChartSelectProps extends SelectProps {
|
||||
charts: Chart[];
|
||||
onChartSelect: (chart: Chart) => void;
|
||||
}
|
||||
|
||||
// ✅ Derivative with modified props
|
||||
interface DatabaseSelectProps extends Omit<SelectProps, 'value' | 'onChange'> {
|
||||
value: number; // Narrowed type
|
||||
onChange: (databaseId: number) => void; // Specific signature
|
||||
}
|
||||
```
|
||||
|
||||
**Common Patterns:**
|
||||
- **Extension:** `extends BaseProps` - adds new props
|
||||
- **Omission:** `Omit<BaseProps, 'prop'>` - removes props
|
||||
- **Modification:** `Omit<BaseProps, 'prop'> & { prop: NewType }` - changes prop type
|
||||
- **Restriction:** Override with narrower types (union → specific)
|
||||
|
||||
---
|
||||
|
||||
## 📋 Migration Recipe
|
||||
|
||||
### Step 2: File Conversion
|
||||
```bash
|
||||
# Use git mv to preserve history
|
||||
git mv component.js component.ts
|
||||
git mv Component.jsx Component.tsx
|
||||
```
|
||||
|
||||
### Step 3: Import & Type Setup
|
||||
```typescript
|
||||
// Import order (enforced by linting)
|
||||
import { FC, ReactNode } from 'react';
|
||||
import { JsonObject, QueryFormData } from '@superset-ui/core';
|
||||
import { Dataset } from '@superset-ui/chart-controls';
|
||||
import type { Dashboard } from 'src/types/Dashboard';
|
||||
```
|
||||
|
||||
### Step 4: Function & Component Typing
|
||||
```typescript
|
||||
// Functions with proper parameter/return types
|
||||
export function processData(
|
||||
data: Dataset[],
|
||||
config: JsonObject
|
||||
): ProcessedData[] {
|
||||
// implementation
|
||||
}
|
||||
|
||||
// Component props with inheritance
|
||||
interface ComponentProps extends BaseProps {
|
||||
data: Chart[];
|
||||
onSelect: (id: number) => void;
|
||||
}
|
||||
|
||||
const Component: FC<ComponentProps> = ({ data, onSelect }) => {
|
||||
// implementation
|
||||
};
|
||||
```
|
||||
|
||||
### Step 5: State & Redux Typing
|
||||
```typescript
|
||||
// Hooks with specific types
|
||||
const [data, setData] = useState<Chart[]>([]);
|
||||
const [selected, setSelected] = useState<number | null>(null);
|
||||
|
||||
// Redux with existing RootState
|
||||
const mapStateToProps = (state: RootState) => ({
|
||||
charts: state.charts,
|
||||
user: state.user,
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Type Debugging Strategies (Real-World Learnings)
|
||||
|
||||
### The Evolution of Type Approaches
|
||||
When you hit type errors, follow this debugging evolution:
|
||||
|
||||
#### 1. ❌ Idealized Union Types (First Attempt)
|
||||
```typescript
|
||||
// Looks clean but doesn't match reality
|
||||
type DatasourceInput = Datasource | QueryEditor;
|
||||
```
|
||||
**Problem**: Real calling sites pass variations, not exact types.
|
||||
|
||||
#### 2. ❌ Overly Precise Types (Second Attempt)
|
||||
```typescript
|
||||
// Tried to match exact calling signatures
|
||||
type DatasourceInput =
|
||||
| IDatasource // From DatasourcePanel
|
||||
| (QueryEditor & { columns: ColumnMeta[] }); // From SaveQuery
|
||||
```
|
||||
**Problem**: Too rigid, doesn't handle legacy variations.
|
||||
|
||||
#### 3. ✅ Flexible Interface (Final Solution)
|
||||
```typescript
|
||||
// Captures what the function actually needs
|
||||
interface DatasourceInput {
|
||||
name?: string | null; // Allow null for compatibility
|
||||
datasource_name?: string | null; // Legacy variations
|
||||
columns?: any[]; // Multiple column types accepted
|
||||
database?: { id?: number };
|
||||
// ... other optional properties
|
||||
}
|
||||
```
|
||||
**Success**: Works with all calling sites, focuses on function needs.
|
||||
|
||||
### Type Debugging Process
|
||||
1. **Start with compilation errors** - they show exact mismatches
|
||||
2. **Examine actual usage** - look at calling sites, not idealized types
|
||||
3. **Build flexible interfaces** - capture what functions need, not rigid contracts
|
||||
4. **Iterate based on downstream validation** - let calling sites guide your types
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Anti-Patterns to Avoid
|
||||
|
||||
```typescript
|
||||
// ❌ Never use any
|
||||
const obj: any = {};
|
||||
|
||||
// ✅ Use proper types
|
||||
const obj: Record<string, JsonObject> = {};
|
||||
|
||||
// ❌ Don't recreate base component props
|
||||
interface ChartSelectProps {
|
||||
value: string; // Duplicated from SelectProps
|
||||
onChange: () => void; // Duplicated from SelectProps
|
||||
charts: Chart[]; // New prop
|
||||
}
|
||||
|
||||
// ✅ Inherit and extend
|
||||
interface ChartSelectProps extends SelectProps {
|
||||
charts: Chart[]; // Only new props
|
||||
}
|
||||
|
||||
// ❌ Don't create ad-hoc type variations
|
||||
interface UserInfo {
|
||||
name: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
// ✅ Extend existing types (DRY principle)
|
||||
import { User } from 'src/types/bootstrapTypes';
|
||||
type UserDisplayInfo = Pick<User, 'firstName' | 'lastName' | 'email'>;
|
||||
|
||||
// ❌ Don't create overly rigid unions
|
||||
type StrictInput = ExactTypeA | ExactTypeB;
|
||||
|
||||
// ✅ Create flexible interfaces for function parameters
|
||||
interface FlexibleInput {
|
||||
// Focus on what the function actually needs
|
||||
commonProperty: string;
|
||||
optionalVariations?: any; // Allow for legacy variations
|
||||
}
|
||||
```
|
||||
|
||||
## 📍 DRY Type Guidelines (WHERE TYPES BELONG)
|
||||
|
||||
### Type Placement Rules
|
||||
**CRITICAL**: Type variations must live close to where they belong, not scattered across files.
|
||||
|
||||
#### ✅ Proper Type Organization
|
||||
```typescript
|
||||
// ❌ Don't create one-off interfaces in utility files
|
||||
// src/utils/datasourceUtils.ts
|
||||
interface DatasourceInput { /* custom interface */ } // Wrong!
|
||||
|
||||
// ✅ Use existing types or extend them in their proper domain
|
||||
// src/utils/datasourceUtils.ts
|
||||
import { IDatasource } from 'src/explore/components/DatasourcePanel';
|
||||
import { QueryEditor } from 'src/SqlLab/types';
|
||||
|
||||
// Create flexible interface that references existing types
|
||||
interface FlexibleDatasourceInput {
|
||||
// Properties that actually exist across variations
|
||||
}
|
||||
```
|
||||
|
||||
#### Type Location Hierarchy
|
||||
1. **Domain Types**: `src/{domain}/types.ts` (dashboard, explore, SqlLab)
|
||||
2. **Component Types**: Co-located with components
|
||||
3. **Global Types**: `src/types/` directory
|
||||
4. **Utility Types**: Only when they truly don't belong elsewhere
|
||||
|
||||
#### ✅ DRY Type Patterns
|
||||
```typescript
|
||||
// ✅ Extend existing domain types
|
||||
interface SaveQueryData extends Pick<QueryEditor, 'sql' | 'dbId' | 'catalog'> {
|
||||
columns: ColumnMeta[]; // Add what's needed
|
||||
}
|
||||
|
||||
// ✅ Create flexible interfaces for cross-domain utilities
|
||||
interface CrossDomainInput {
|
||||
// Common properties that exist across different source types
|
||||
name?: string | null; // Accommodate legacy null values
|
||||
// Only include properties the function actually uses
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PropTypes Auto-Generation (Elegant Approach)
|
||||
|
||||
**IMPORTANT**: Superset has `babel-plugin-typescript-to-proptypes` configured to automatically generate PropTypes from TypeScript interfaces. Use this instead of manual PropTypes duplication!
|
||||
|
||||
### ❌ Manual PropTypes Duplication (Avoid This)
|
||||
```typescript
|
||||
export interface MyComponentProps {
|
||||
title: string;
|
||||
count?: number;
|
||||
}
|
||||
|
||||
// 8+ lines of manual PropTypes duplication 😱
|
||||
const propTypes = PropTypes.shape({
|
||||
title: PropTypes.string.isRequired,
|
||||
count: PropTypes.number,
|
||||
});
|
||||
|
||||
export default propTypes;
|
||||
```
|
||||
|
||||
### ✅ Auto-Generated PropTypes (Use This)
|
||||
```typescript
|
||||
import { InferProps } from 'prop-types';
|
||||
|
||||
export interface MyComponentProps {
|
||||
title: string;
|
||||
count?: number;
|
||||
}
|
||||
|
||||
// Single validator function - babel plugin auto-generates PropTypes! ✨
|
||||
export default function MyComponentValidator(props: MyComponentProps) {
|
||||
return null; // PropTypes auto-assigned by babel-plugin-typescript-to-proptypes
|
||||
}
|
||||
|
||||
// Optional: For consumers needing PropTypes type inference
|
||||
export type MyComponentPropsInferred = InferProps<typeof MyComponentValidator>;
|
||||
```
|
||||
|
||||
### Migration Pattern for Type-Only Files
|
||||
|
||||
**When migrating type-only files with manual PropTypes:**
|
||||
|
||||
1. **Keep the TypeScript interfaces** (single source of truth)
|
||||
2. **Replace manual PropTypes** with validator function
|
||||
3. **Remove PropTypes imports** and manual shape definitions
|
||||
4. **Add InferProps import** if type inference needed
|
||||
|
||||
**Example Migration:**
|
||||
```typescript
|
||||
// Before: 25+ lines with manual PropTypes duplication
|
||||
export interface AdhocFilterType { /* ... */ }
|
||||
const adhocFilterTypePropTypes = PropTypes.oneOfType([...]);
|
||||
|
||||
// After: 3 lines with auto-generation
|
||||
export interface AdhocFilterType { /* ... */ }
|
||||
export default function AdhocFilterValidator(props: { filter: AdhocFilterType }) {
|
||||
return null; // Auto-generated PropTypes by babel plugin
|
||||
}
|
||||
```
|
||||
|
||||
### Component PropTypes Pattern
|
||||
|
||||
**For React components, the babel plugin works automatically:**
|
||||
|
||||
```typescript
|
||||
interface ComponentProps {
|
||||
title: string;
|
||||
onClick: () => void;
|
||||
}
|
||||
|
||||
const MyComponent: FC<ComponentProps> = ({ title, onClick }) => {
|
||||
// Component implementation
|
||||
};
|
||||
|
||||
// PropTypes automatically generated by babel plugin - no manual work needed!
|
||||
export default MyComponent;
|
||||
```
|
||||
|
||||
### Auto-Generation Benefits
|
||||
|
||||
- ✅ **Single source of truth**: TypeScript interfaces drive PropTypes
|
||||
- ✅ **No duplication**: Eliminate 15-20 lines of manual PropTypes code
|
||||
- ✅ **Automatic updates**: Changes to TypeScript automatically update PropTypes
|
||||
- ✅ **Type safety**: Compile-time checking ensures PropTypes match interfaces
|
||||
- ✅ **Backward compatibility**: Existing JavaScript components continue working
|
||||
|
||||
### Babel Plugin Configuration
|
||||
|
||||
The plugin is already configured in `babel.config.js`:
|
||||
```javascript
|
||||
['babel-plugin-typescript-to-proptypes', { loose: true }]
|
||||
```
|
||||
|
||||
**No additional setup required** - just use TypeScript interfaces and the plugin handles the rest!
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Test File Migration Patterns
|
||||
|
||||
### Test File Priority
|
||||
- **Always migrate test files** alongside production files
|
||||
- **Test files are often leaf nodes** - good starting candidates
|
||||
- **Create tests if missing** - Leverage new TypeScript types for better test coverage
|
||||
|
||||
### Test-Specific Type Patterns
|
||||
```typescript
|
||||
// Mock interfaces for testing
|
||||
interface MockStore {
|
||||
getState: () => Partial<RootState>; // Partial allows minimal mocking
|
||||
}
|
||||
|
||||
// Type-safe mocking for complex objects
|
||||
const mockDashboardInfo: Partial<DashboardInfo> as DashboardInfo = {
|
||||
id: 123,
|
||||
json_metadata: '{}',
|
||||
};
|
||||
|
||||
// Sinon stub typing
|
||||
let postStub: sinon.SinonStub;
|
||||
beforeEach(() => {
|
||||
postStub = sinon.stub(SupersetClient, 'post');
|
||||
});
|
||||
|
||||
// Use stub reference instead of original method
|
||||
expect(postStub.callCount).toBe(1);
|
||||
expect(postStub.getCall(0).args[0].endpoint).toMatch('/api/');
|
||||
```
|
||||
|
||||
### Test Migration Recipe
|
||||
1. **Migrate production file first** (if both need migration)
|
||||
2. **Update test imports** to point to `.ts/.tsx` files
|
||||
3. **Add proper mock typing** using `Partial<T> as T` pattern
|
||||
4. **Fix stub typing** - Use stub references, not original methods
|
||||
5. **Verify all tests pass** with TypeScript compilation
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Type Conflict Resolution
|
||||
|
||||
### Multiple Type Definitions Issue
|
||||
**Problem**: Same type name defined in multiple files causes compilation errors.
|
||||
|
||||
**Example**: `DashboardInfo` defined in both:
|
||||
- `src/dashboard/reducers/types.ts` (minimal)
|
||||
- `src/dashboard/components/Header/types.ts` (different shape)
|
||||
- `src/dashboard/types.ts` (complete - used by RootState)
|
||||
|
||||
### Resolution Strategy
|
||||
1. **Identify the authoritative type**:
|
||||
```bash
|
||||
# Find which type is used by RootState/main interfaces
|
||||
grep -r "DashboardInfo" src/dashboard/types.ts
|
||||
```
|
||||
|
||||
2. **Use import from authoritative source**:
|
||||
```typescript
|
||||
// ✅ Import from main domain types
|
||||
import { RootState, DashboardInfo } from 'src/dashboard/types';
|
||||
|
||||
// ❌ Don't import from component-specific files
|
||||
import { DashboardInfo } from 'src/dashboard/components/Header/types';
|
||||
```
|
||||
|
||||
3. **Mock complex types in tests**:
|
||||
```typescript
|
||||
// For testing - provide minimal required fields
|
||||
const mockInfo: Partial<DashboardInfo> as DashboardInfo = {
|
||||
id: 123,
|
||||
json_metadata: '{}',
|
||||
// Only provide fields actually used in test
|
||||
};
|
||||
```
|
||||
|
||||
### Type Hierarchy Discovery Commands
|
||||
```bash
|
||||
# Find all definitions of a type
|
||||
grep -r "interface.*TypeName\|type.*TypeName" src/
|
||||
|
||||
# Find import usage patterns
|
||||
grep -r "import.*TypeName" src/
|
||||
|
||||
# Check what RootState uses
|
||||
grep -A 10 -B 10 "TypeName" src/*/types.ts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Agent Constraints (CRITICAL)
|
||||
|
||||
1. **Use git mv** - Run `git mv file.js file.ts` to preserve git history, but NO `git commit`
|
||||
2. **NO global import changes** - Don't update imports across codebase
|
||||
3. **Type files OK** - Can modify existing type files to improve/align types
|
||||
4. **Single-File TypeScript Validation** (CRITICAL) - tsc has known issues with multi-file compilation:
|
||||
- **Core Issue**: TypeScript's `tsc` has documented problems validating multiple files simultaneously in complex projects
|
||||
- **Solution**: ALWAYS validate files one at a time using individual `tsc` calls
|
||||
- **Command Pattern**: `cd superset-frontend && npx tscw --noEmit --allowJs --composite false --project tsconfig.json {single-file-path}`
|
||||
- **Why**: Multi-file validation can produce false positives, miss real errors, and conflict during parallel agent execution
|
||||
5. **Downstream Impact Validation** (CRITICAL) - Your migration affects calling sites:
|
||||
- **Find downstream files**: `find superset-frontend/src -name "*.tsx" -o -name "*.ts" | xargs grep -l "your-core-filename" 2>/dev/null || echo "No files found"`
|
||||
- **Validate each downstream file individually**: `cd superset-frontend && npx tscw --noEmit --allowJs --composite false --project tsconfig.json {each-downstream-file}`
|
||||
- **Fix type mismatches** you introduced in calling sites
|
||||
- **NEVER ignore downstream errors** - they indicate your types don't match reality
|
||||
6. **Avoid Project-Wide Validation During Migration**:
|
||||
- **NEVER use `npm run type`** during parallel agent execution - produces unreliable results
|
||||
- **Single-file validation is authoritative** - trust individual file checks over project-wide scans
|
||||
6. **ESLint validation** - Run `npm run eslint -- --fix {file}` for each migrated file to auto-fix formatting/linting issues
|
||||
6. Zero `any` types - use proper TypeScript types
|
||||
7. Search existing types before creating new ones
|
||||
8. Follow patterns from this guide
|
||||
|
||||
---
|
||||
|
||||
## Success Report Format
|
||||
|
||||
```
|
||||
SUCCESS: Atomic Migration of {core-filename}
|
||||
|
||||
## Files Migrated (Atomic Unit)
|
||||
- Core: {core-filename} → {core-filename.ts/tsx}
|
||||
- Tests: {list-of-test-files} → {list-of-test-files.ts/tsx} OR "CREATED: {basename}.test.ts"
|
||||
- Mocks: {list-of-mock-files} → {list-of-mock-files.ts}
|
||||
- Type files modified: {list-of-type-files}
|
||||
|
||||
## Types Created/Improved
|
||||
- {TypeName}: {location} ({scope}) - {rationale}
|
||||
- {ExistingType}: enhanced in {location} - {improvement-description}
|
||||
|
||||
## Documentation Recommendations
|
||||
- ADD_TO_DIRECTORY: {TypeName} - {reason}
|
||||
- NO_DOCUMENTATION: {TypeName} - {reason}
|
||||
|
||||
## Quality Validation
|
||||
- **Single-File TypeScript Validation**: ✅ PASS - Core files individually validated
|
||||
- Core file: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {core-file}`
|
||||
- Test files: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {test-file}` (if exists)
|
||||
- **Downstream Impact Check**: ✅ PASS - Found {N} files importing this module, all validate individually
|
||||
- Downstream files: {list-of-files-that-import-your-module}
|
||||
- Individual validation: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {each-downstream-file}`
|
||||
- **ESLint validation**: ✅ PASS (using `npm run eslint -- --fix {files}` to auto-fix formatting)
|
||||
- **Zero any types**: ✅ PASS
|
||||
- **Local imports resolved**: ✅ PASS
|
||||
- **Functionality preserved**: ✅ PASS
|
||||
- **Tests pass** (if test file): ✅ PASS
|
||||
- **Follow-up action required**: {YES/NO}
|
||||
|
||||
## Validation Strategy Notes
|
||||
- **Single-file approach used**: Avoided multi-file tsc validation due to known TypeScript compilation issues
|
||||
- **Project-wide validation skipped**: `npm run type` not used during parallel migration to prevent false positives
|
||||
|
||||
## Migration Learnings
|
||||
- Type conflicts encountered: {describe any multiple type definitions}
|
||||
- Mock patterns used: {describe test mocking approaches}
|
||||
- Import hierarchy decisions: {note authoritative type sources used}
|
||||
- PropTypes strategy: {AUTO_GENERATED via babel plugin | MANUAL_DUPLICATION_REMOVED | N/A}
|
||||
|
||||
## Improvement Suggestions for Documentation
|
||||
- AGENT.md enhancement: {suggest additions to migration guide}
|
||||
- Common pattern identified: {note reusable patterns for future migrations}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependency Block Report Format
|
||||
|
||||
```
|
||||
DEPENDENCY_BLOCK: Cannot migrate {filename}
|
||||
|
||||
## Blocking Dependencies
|
||||
- {path}: {type} - {usage} - {priority}
|
||||
|
||||
## Impact Analysis
|
||||
- Estimated types: {number}
|
||||
- Expected locations: {list}
|
||||
- Cross-domain: {YES/NO}
|
||||
|
||||
## Recommended Order
|
||||
{ordered-list}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Quick Reference
|
||||
|
||||
**Type Utilities:**
|
||||
- `Record<K, V>` - Object with specific key/value types
|
||||
- `Partial<T>` - All properties optional
|
||||
- `Pick<T, K>` - Subset of properties
|
||||
- `Omit<T, K>` - Exclude specific properties
|
||||
- `NonNullable<T>` - Exclude null/undefined
|
||||
|
||||
**Event Types:**
|
||||
- `MouseEvent<HTMLButtonElement>`
|
||||
- `ChangeEvent<HTMLInputElement>`
|
||||
- `FormEvent<HTMLFormElement>`
|
||||
|
||||
**React Types:**
|
||||
- `FC<Props>` - Functional component
|
||||
- `ReactNode` - Any renderable content
|
||||
- `CSSProperties` - Style objects
|
||||
|
||||
---
|
||||
|
||||
**Remember:** Every type should add value and clarity. The goal is meaningful type safety that catches bugs and improves developer experience.
|
||||
199
.claude/projects/js-to-ts/COORDINATOR.md
Normal file
199
.claude/projects/js-to-ts/COORDINATOR.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# JS-to-TS Coordinator Workflow
|
||||
|
||||
**Role:** Strategic migration coordination - select leaf-node files, trigger agents, review results, handle integration, manage dependencies.
|
||||
|
||||
---
|
||||
|
||||
## 1. Core File Selection Strategy
|
||||
|
||||
**Target ONLY Core Files**: Coordinators identify core files (production code), agents handle related tests/mocks atomically.
|
||||
|
||||
**File Analysis Commands**:
|
||||
```bash
|
||||
# Find CORE files with no JS/JSX dependencies (exclude tests/mocks) - SIZE PRIORITIZED
|
||||
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | xargs wc -l | sort -n | head -20
|
||||
|
||||
# Alternative: Get file sizes in lines with paths
|
||||
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | while read file; do
|
||||
lines=$(wc -l < "$file")
|
||||
echo "$lines $file"
|
||||
done | sort -n | head -20
|
||||
|
||||
# Check dependencies for core files only (start with smallest)
|
||||
for file in <core-files-sorted-by-size>; do
|
||||
echo "=== $file ($(wc -l < "$file") lines) ==="
|
||||
grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" "$file" || echo "✅ LEAF CANDIDATE"
|
||||
done
|
||||
|
||||
# Identify heavily imported files (migrate last)
|
||||
grep -r "from.*utils/common" superset-frontend/src/ | wc -l
|
||||
|
||||
# Quick leaf analysis with size priority
|
||||
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | head -30 | while read file; do
|
||||
deps=$(grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" "$file" | wc -l)
|
||||
lines=$(wc -l < "$file")
|
||||
if [ "$deps" -eq 0 ]; then
|
||||
echo "✅ LEAF: $lines lines - $file"
|
||||
fi
|
||||
done | sort -n
|
||||
```
|
||||
|
||||
**Priority Order** (Smallest files first for easier wins):
|
||||
1. **Small leaf files** (<50 lines) - No JS/JSX imports, quick TypeScript conversion
|
||||
2. **Medium leaf files** (50-200 lines) - Self-contained utilities and helpers
|
||||
3. **Small dependency files** (<100 lines) - Import only already-migrated files
|
||||
4. **Larger components** (200+ lines) - Complex but well-contained functionality
|
||||
5. **Core foundational files** (utils/common.js, controls.jsx) - migrate last regardless of size
|
||||
|
||||
**Size-First Benefits**:
|
||||
- Faster completion builds momentum
|
||||
- Earlier validation of migration patterns
|
||||
- Easier rollback if issues arise
|
||||
- Better success rate for agent learning
|
||||
|
||||
**Migration Unit**: Each agent call migrates:
|
||||
- 1 core file (primary target)
|
||||
- All related `*.test.js/jsx` files
|
||||
- All related `*.mock.js` files
|
||||
- All related `__mocks__/` files
|
||||
|
||||
---
|
||||
|
||||
## 2. Task Creation & Agent Control
|
||||
|
||||
### Task Triggering
|
||||
When triggering the `/js-to-ts` command:
|
||||
- **Task Title**: Use the core filename as the task title (e.g., "DebouncedMessageQueue.js migration", "hostNamesConfig.js migration")
|
||||
- **Task Description**: Include the full relative path to help agent locate the file
|
||||
- **Reference**: Point agent to [AGENT.md](./AGENT.md) for technical instructions
|
||||
|
||||
### Post-Processing Workflow
|
||||
After each agent completes:
|
||||
|
||||
1. **Review Agent Report**: Always read and analyze the complete agent report
|
||||
2. **Share Summary**: Provide user with key highlights from agent's work:
|
||||
- Files migrated (core + tests/mocks)
|
||||
- Types created or improved
|
||||
- Any validation issues or coordinator actions needed
|
||||
3. **Quality Assessment**: Evaluate agent's TypeScript implementation against criteria:
|
||||
- ✅ **Type Usage**: Proper types used, no `any` types
|
||||
- ✅ **Type Filing**: Types placed in correct hierarchy (component → feature → domain → global)
|
||||
- ✅ **Side Effects**: No unintended changes to other files
|
||||
- ✅ **Import Alignment**: Proper .ts/.tsx import extensions
|
||||
4. **Integration Decision**:
|
||||
- **COMMIT**: If agent work is complete and high quality
|
||||
- **FIX & COMMIT**: If minor issues need coordinator fixes
|
||||
- **ROLLBACK**: If major issues require complete rework
|
||||
5. **Next Action**: Ask user preference - commit this work or trigger next migration
|
||||
|
||||
---
|
||||
|
||||
## 3. Integration Decision Framework
|
||||
|
||||
**Automatic Integration** ✅:
|
||||
- `npm run type` passes without errors
|
||||
- Agent created clean TypeScript with proper types
|
||||
- Types appropriately filed in hierarchy
|
||||
|
||||
**Coordinator Integration** (Fix Side-Effects) 🔧:
|
||||
- `npm run type` fails BUT agent's work is high quality
|
||||
- Good type usage, proper patterns, well-organized
|
||||
- Side-effects are manageable TypeScript compilation errors
|
||||
- **Coordinator Action**: Integrate the change, then fix global compilation issues
|
||||
|
||||
**Rollback Only** ❌:
|
||||
- Agent introduced `any` types or poor type choices
|
||||
- Types poorly organized or conflicting with existing patterns
|
||||
- Fundamental approach issues requiring complete rework
|
||||
|
||||
**Integration Process**:
|
||||
1. **Review**: Agent already used `git mv` to preserve history
|
||||
2. **Fix Side-Effects**: Update dependent files with proper import extensions
|
||||
3. **Resolve Types**: Fix any cascading type issues across codebase
|
||||
4. **Validate**: Ensure `npm run type` passes after fixes
|
||||
|
||||
---
|
||||
|
||||
## 4. Common Integration Patterns
|
||||
|
||||
**Common Side-Effects (Expect These)**:
|
||||
- **Type import conflicts**: Multiple definitions of same type name
|
||||
- **Mock object typing**: Tests need complete type satisfaction
|
||||
- **Stub method references**: Use stub vars instead of original methods
|
||||
|
||||
**Coordinator Fixes (Standard Process)**:
|
||||
1. **Import Resolution**:
|
||||
```bash
|
||||
# Find authoritative type source
|
||||
grep -r "TypeName" src/*/types.ts
|
||||
# Import from domain types (src/dashboard/types.ts) not component types
|
||||
```
|
||||
|
||||
2. **Test Mock Completion**:
|
||||
```typescript
|
||||
// Use Partial<T> as T pattern for minimal mocking
|
||||
const mockDashboard: Partial<DashboardInfo> as DashboardInfo = {
|
||||
id: 123,
|
||||
json_metadata: '{}',
|
||||
};
|
||||
```
|
||||
|
||||
3. **Stub Reference Fixes**:
|
||||
```typescript
|
||||
// ✅ Use stub variable
|
||||
expect(postStub.callCount).toBe(1);
|
||||
// ❌ Don't use original method
|
||||
expect(SupersetClient.post.callCount).toBe(1);
|
||||
```
|
||||
|
||||
4. **Validation Commands**:
|
||||
```bash
|
||||
npm run type # TypeScript compilation
|
||||
npm test -- filename # Test functionality
|
||||
git status # Should show rename, not add/delete
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. File Categories for Planning
|
||||
|
||||
### Leaf Files (Start Here)
|
||||
**Self-contained files with minimal JS/JSX dependencies**:
|
||||
- Test files (80 files) - Usually only import the file being tested
|
||||
- Utility files without internal dependencies
|
||||
- Components importing only external libraries
|
||||
|
||||
### Heavily Imported Files (Migrate Last)
|
||||
**Core files that many others depend on**:
|
||||
- `utils/common.js` - Core utility functions
|
||||
- `utils/reducerUtils.js` - Redux helpers
|
||||
- `@superset-ui/core` equivalent files
|
||||
- Major state management files (`explore/store.js`, `dashboard/actions/`)
|
||||
|
||||
### Complex Components (Middle Priority)
|
||||
**Large files requiring careful type analysis**:
|
||||
- `components/Datasource/DatasourceEditor.jsx` (1,809 lines)
|
||||
- `explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx` (1,031 lines)
|
||||
- `explore/components/ExploreViewContainer/index.jsx` (911 lines)
|
||||
|
||||
---
|
||||
|
||||
## 6. Success Metrics & Continuous Improvement
|
||||
|
||||
**Per-File Gates**:
|
||||
- ✅ `npm run type` passes after each migration
|
||||
- ✅ Zero `any` types introduced
|
||||
- ✅ All imports properly typed
|
||||
- ✅ Types filed in correct hierarchy
|
||||
|
||||
**Linear Scheduling**:
|
||||
When agents report `DEPENDENCY_BLOCK`:
|
||||
- Queue dependencies in linear order
|
||||
- Process one file at a time to avoid conflicts
|
||||
- Handle cascading type changes between files
|
||||
|
||||
**After Each Migration**:
|
||||
1. **Update guides** with new patterns discovered
|
||||
2. **Document coordinator fixes** that become common
|
||||
3. **Enhance agent instructions** based on recurring issues
|
||||
4. **Track success metrics** - automatic vs coordinator integration rates
|
||||
76
.claude/projects/js-to-ts/PROJECT.md
Normal file
76
.claude/projects/js-to-ts/PROJECT.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# JavaScript to TypeScript Migration Project
|
||||
|
||||
Progressive migration of 219 JS/JSX files to TypeScript in Apache Superset frontend.
|
||||
|
||||
## 📁 Project Documentation
|
||||
|
||||
- **[AGENT.md](./AGENT.md)** - Complete technical migration guide for agents (includes type reference, patterns, validation)
|
||||
- **[COORDINATOR.md](./COORDINATOR.md)** - Strategic workflow for coordinators (file selection, task management, integration)
|
||||
|
||||
## 🎯 Quick Start
|
||||
|
||||
**For Agents:** Read [AGENT.md](./AGENT.md) for complete migration instructions
|
||||
**For Coordinators:** Read [COORDINATOR.md](./COORDINATOR.md) for workflow and [AGENT.md](./AGENT.md) for supervision
|
||||
|
||||
**Command:** `/js-to-ts <filename>` - See [../../commands/js-to-ts.md](../../commands/js-to-ts.md)
|
||||
|
||||
## 📊 Migration Progress
|
||||
|
||||
**Scope**: 219 files total (112 JS + 107 JSX)
|
||||
- Production files: 139 (63%)
|
||||
- Test files: 80 (37%)
|
||||
|
||||
**Strategy**: Leaf-first migration with dependency-aware coordination
|
||||
|
||||
### Completed Migrations ✅
|
||||
|
||||
1. **roundDecimal** - `plugins/legacy-plugin-chart-map-box/src/utils/roundDecimal.js`
|
||||
- Migrated core + test files
|
||||
- Added proper TypeScript function signature with optional precision parameter
|
||||
- All tests pass
|
||||
|
||||
2. **timeGrainSqlaAnimationOverrides** - `src/explore/controlPanels/timeGrainSqlaAnimationOverrides.js`
|
||||
- Migrated to TypeScript with ControlPanelState and Dataset types
|
||||
- Added TimeGrainOverrideState interface for return type
|
||||
- Used type guards for safe property access
|
||||
|
||||
3. **DebouncedMessageQueue** - `src/utils/DebouncedMessageQueue.js`
|
||||
- Migrated to TypeScript with proper generics
|
||||
- Created DebouncedMessageQueueOptions interface
|
||||
- **CREATED test file** with 4 comprehensive test cases
|
||||
- Excellent class property typing with private/readonly modifiers
|
||||
|
||||
**Files Migrated**: 3/219 (1.4%)
|
||||
**Tests Created**: 2 (roundDecimal had existing, DebouncedMessageQueue created)
|
||||
|
||||
### Next Candidates (Leaf Nodes) 🎯
|
||||
|
||||
**Identified leaf files with no JS/JSX dependencies:**
|
||||
- `src/utils/hostNamesConfig.js` - Domain configuration utility
|
||||
- `src/explore/controlPanels/Separator.js` - Control panel configuration
|
||||
- `src/middleware/loggerMiddleware.js` - Logging middleware
|
||||
|
||||
**Migration Quality**: All completed migrations have:
|
||||
- ✅ Zero `any` types
|
||||
- ✅ Proper TypeScript compilation
|
||||
- ✅ ESLint validation passed
|
||||
- ✅ Test coverage (created where missing)
|
||||
|
||||
---
|
||||
|
||||
## 📈 Success Metrics
|
||||
|
||||
**Per-File Gates**:
|
||||
- ✅ `npm run type` passes after each migration
|
||||
- ✅ Zero `any` types introduced
|
||||
- ✅ All imports properly typed
|
||||
- ✅ Types filed in correct hierarchy
|
||||
|
||||
**Overall Progress**:
|
||||
- **Automatic Integration Rate**: 100% (3/3 migrations required no coordinator fixes)
|
||||
- **Test Coverage**: Improved (1 new test file created)
|
||||
- **Type Safety**: Enhanced with proper interfaces and generics
|
||||
|
||||
---
|
||||
|
||||
*This is a claudette-managed progressive refactor. All documentation and coordination resources are organized under `.claude/projects/js-to-ts/`*
|
||||
@@ -1,5 +1,5 @@
|
||||
# Keep this in sync with the base image in the main Dockerfile (ARG PY_VER)
|
||||
FROM python:3.11.13-bookworm AS base
|
||||
FROM python:3.11.13-trixie AS base
|
||||
|
||||
# Install system dependencies that Superset needs
|
||||
# This layer will be cached across Codespace sessions
|
||||
|
||||
10
.github/CODEOWNERS
vendored
10
.github/CODEOWNERS
vendored
@@ -30,3 +30,13 @@
|
||||
|
||||
**/*.geojson @villebro @rusackas
|
||||
/superset-frontend/plugins/legacy-plugin-chart-country-map/ @villebro @rusackas
|
||||
|
||||
# Notify PMC members of changes to extension-related files
|
||||
|
||||
/superset-core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset-extensions-cli/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset/core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset/extensions/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset-frontend/src/packages/superset-core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset-frontend/src/core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
/superset-frontend/src/extensions/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
|
||||
|
||||
19
.github/actions/change-detector/action.yml
vendored
19
.github/actions/change-detector/action.yml
vendored
@@ -1,24 +1,27 @@
|
||||
name: 'Change Detector'
|
||||
description: 'Detects file changes for pull request and push events'
|
||||
name: Change Detector
|
||||
description: Detects file changes for pull request and push events
|
||||
inputs:
|
||||
token:
|
||||
description: 'GitHub token for authentication'
|
||||
description: GitHub token for authentication
|
||||
required: true
|
||||
outputs:
|
||||
python:
|
||||
description: 'Whether Python-related files were changed'
|
||||
description: Whether Python-related files were changed
|
||||
value: ${{ steps.change-detector.outputs.python }}
|
||||
frontend:
|
||||
description: 'Whether frontend-related files were changed'
|
||||
description: Whether frontend-related files were changed
|
||||
value: ${{ steps.change-detector.outputs.frontend }}
|
||||
docker:
|
||||
description: 'Whether docker-related files were changed'
|
||||
description: Whether docker-related files were changed
|
||||
value: ${{ steps.change-detector.outputs.docker }}
|
||||
docs:
|
||||
description: 'Whether docs-related files were changed'
|
||||
description: Whether docs-related files were changed
|
||||
value: ${{ steps.change-detector.outputs.docs }}
|
||||
superset-extensions-cli:
|
||||
description: Whether superset-extensions-cli package-related files were changed
|
||||
value: ${{ steps.change-detector.outputs.superset-extensions-cli }}
|
||||
runs:
|
||||
using: 'composite'
|
||||
using: composite
|
||||
steps:
|
||||
- name: Detect file changes
|
||||
id: change-detector
|
||||
|
||||
70
.github/workflows/bashlib.sh
vendored
70
.github/workflows/bashlib.sh
vendored
@@ -182,6 +182,76 @@ cypress-run-all() {
|
||||
kill $flaskProcessId
|
||||
}
|
||||
|
||||
playwright-install() {
|
||||
cd "$GITHUB_WORKSPACE/superset-frontend"
|
||||
|
||||
say "::group::Install Playwright browsers"
|
||||
npx playwright install --with-deps chromium
|
||||
# Create output directories for test results and debugging
|
||||
mkdir -p playwright-results
|
||||
mkdir -p test-results
|
||||
say "::endgroup::"
|
||||
}
|
||||
|
||||
playwright-run() {
|
||||
local APP_ROOT=$1
|
||||
|
||||
# Start Flask from the project root (same as Cypress)
|
||||
cd "$GITHUB_WORKSPACE"
|
||||
local flasklog="${HOME}/flask-playwright.log"
|
||||
local port=8081
|
||||
PLAYWRIGHT_BASE_URL="http://localhost:${port}"
|
||||
if [ -n "$APP_ROOT" ]; then
|
||||
export SUPERSET_APP_ROOT=$APP_ROOT
|
||||
PLAYWRIGHT_BASE_URL=${PLAYWRIGHT_BASE_URL}${APP_ROOT}/
|
||||
fi
|
||||
export PLAYWRIGHT_BASE_URL
|
||||
|
||||
nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null &
|
||||
local flaskProcessId=$!
|
||||
|
||||
# Ensure cleanup on exit
|
||||
trap "kill $flaskProcessId 2>/dev/null || true" EXIT
|
||||
|
||||
# Wait for server to be ready with health check
|
||||
local timeout=60
|
||||
say "Waiting for Flask server to start on port $port..."
|
||||
while [ $timeout -gt 0 ]; do
|
||||
if curl -f ${PLAYWRIGHT_BASE_URL}/health >/dev/null 2>&1; then
|
||||
say "Flask server is ready"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
timeout=$((timeout - 1))
|
||||
done
|
||||
|
||||
if [ $timeout -eq 0 ]; then
|
||||
echo "::error::Flask server failed to start within 60 seconds"
|
||||
echo "::group::Flask startup log"
|
||||
cat "$flasklog"
|
||||
echo "::endgroup::"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Change to frontend directory for Playwright execution
|
||||
cd "$GITHUB_WORKSPACE/superset-frontend"
|
||||
|
||||
say "::group::Run Playwright tests"
|
||||
echo "Running Playwright with baseURL: ${PLAYWRIGHT_BASE_URL}"
|
||||
npx playwright test auth/login --reporter=github --output=playwright-results
|
||||
local status=$?
|
||||
say "::endgroup::"
|
||||
|
||||
# After job is done, print out Flask log for debugging
|
||||
echo "::group::Flask log for Playwright run"
|
||||
cat "$flasklog"
|
||||
echo "::endgroup::"
|
||||
# make sure the program exits
|
||||
kill $flaskProcessId
|
||||
|
||||
return $status
|
||||
}
|
||||
|
||||
eyes-storybook-dependencies() {
|
||||
say "::group::install eyes-storyook dependencies"
|
||||
sudo apt-get update -y && sudo apt-get -y install gconf-service ca-certificates libxshmfence-dev fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libglib2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libnspr4 libnss3 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release xdg-utils libappindicator1
|
||||
|
||||
2
.github/workflows/bump-python-package.yml
vendored
2
.github/workflows/bump-python-package.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: true
|
||||
ref: master
|
||||
|
||||
2
.github/workflows/cancel_duplicates.yml
vendored
2
.github/workflows/cancel_duplicates.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
if: steps.check_queued.outputs.count >= 20
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Cancel duplicate workflow runs
|
||||
if: steps.check_queued.outputs.count >= 20
|
||||
|
||||
2
.github/workflows/check-python-deps.yml
vendored
2
.github/workflows/check-python-deps.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Check and notify
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
|
||||
2
.github/workflows/claude.yml
vendored
2
.github/workflows/claude.yml
vendored
@@ -71,7 +71,7 @@ jobs:
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
||||
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Check for file changes
|
||||
id: check
|
||||
|
||||
4
.github/workflows/dependency-review.yml
vendored
4
.github/workflows/dependency-review.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout Repository"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: "Dependency Review"
|
||||
uses: actions/dependency-review-action@v4
|
||||
continue-on-error: true
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: "Checkout Repository"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
|
||||
8
.github/workflows/docker.yml
vendored
8
.github/workflows/docker.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
steps:
|
||||
- id: set_matrix
|
||||
run: |
|
||||
MATRIX_CONFIG=$(if [ "${{ github.event_name }}" == "pull_request" ]; then echo '["dev", "lean"]'; else echo '["dev", "lean", "py310", "websocket", "dockerize", "py311"]'; fi)
|
||||
MATRIX_CONFIG=$(if [ "${{ github.event_name }}" == "pull_request" ]; then echo '["dev", "lean"]'; else echo '["dev", "lean", "py310", "websocket", "dockerize", "py311", "py312"]'; fi)
|
||||
echo "matrix_config=${MATRIX_CONFIG}" >> $GITHUB_OUTPUT
|
||||
echo $GITHUB_OUTPUT
|
||||
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
docker history $IMAGE_TAG
|
||||
|
||||
- name: docker-compose sanity check
|
||||
if: (steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker) && (matrix.build_preset == 'dev' || matrix.build_preset == 'lean')
|
||||
if: (steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker) && matrix.build_preset == 'dev'
|
||||
shell: bash
|
||||
run: |
|
||||
export SUPERSET_BUILD_TARGET=${{ matrix.build_preset }}
|
||||
@@ -117,7 +117,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Check for file changes
|
||||
|
||||
2
.github/workflows/embedded-sdk-release.yml
vendored
2
.github/workflows/embedded-sdk-release.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
run:
|
||||
working-directory: superset-embedded-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './superset-embedded-sdk/.nvmrc'
|
||||
|
||||
2
.github/workflows/embedded-sdk-test.yml
vendored
2
.github/workflows/embedded-sdk-test.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
run:
|
||||
working-directory: superset-embedded-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './superset-embedded-sdk/.nvmrc'
|
||||
|
||||
10
.github/workflows/ephemeral-env-pr-close.yml
vendored
10
.github/workflows/ephemeral-env-pr-close.yml
vendored
@@ -1,4 +1,10 @@
|
||||
name: Cleanup ephemeral envs (PR close)
|
||||
name: Cleanup ephemeral envs (PR close) [DEPRECATED]
|
||||
|
||||
# ⚠️ DEPRECATION NOTICE ⚠️
|
||||
# This workflow is deprecated and will be removed in a future version.
|
||||
# The new Superset Showtime workflow handles cleanup automatically.
|
||||
# See .github/workflows/showtime.yml and showtime-cleanup.yml for replacements.
|
||||
# Migration guide: https://github.com/mistercrunch/superset-showtime
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
@@ -71,5 +77,5 @@ jobs:
|
||||
issue_number: ${{ github.event.number }},
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: 'Ephemeral environment shutdown and build artifacts deleted.'
|
||||
body: '⚠️ **DEPRECATED WORKFLOW** - Ephemeral environment shutdown and build artifacts deleted. Please migrate to the new Superset Showtime system for future PRs.'
|
||||
})
|
||||
|
||||
21
.github/workflows/ephemeral-env.yml
vendored
21
.github/workflows/ephemeral-env.yml
vendored
@@ -1,4 +1,12 @@
|
||||
name: Ephemeral env workflow
|
||||
name: Ephemeral env workflow [DEPRECATED]
|
||||
|
||||
# ⚠️ DEPRECATION NOTICE ⚠️
|
||||
# This workflow is deprecated and will be removed in a future version.
|
||||
# Please use the new Superset Showtime workflow instead:
|
||||
# - Use label "🎪 trigger-start" instead of "testenv-up"
|
||||
# - Showtime provides better reliability and easier management
|
||||
# - See .github/workflows/showtime.yml for the replacement
|
||||
# - Migration guide: https://github.com/mistercrunch/superset-showtime
|
||||
|
||||
# Example manual trigger:
|
||||
# gh workflow run ephemeral-env.yml --ref fix_ephemerals --field label_name="testenv-up" --field issue_number=666
|
||||
@@ -126,8 +134,11 @@ jobs:
|
||||
throw new Error("Issue number is not available.");
|
||||
}
|
||||
|
||||
const body = `@${user} Processing your ephemeral environment request [here](${workflowUrl}).` +
|
||||
` Action: **${action}**.` +
|
||||
const body = `⚠️ **DEPRECATED WORKFLOW** ⚠️\n\n@${user} This workflow is deprecated! Please use the new **Superset Showtime** system instead:\n\n` +
|
||||
`- Replace "testenv-up" label with "🎪 trigger-start"\n` +
|
||||
`- Better reliability and easier management\n` +
|
||||
`- See https://github.com/mistercrunch/superset-showtime for details\n\n` +
|
||||
`Processing your ephemeral environment request [here](${workflowUrl}). Action: **${action}**.` +
|
||||
` More information on [how to use or configure ephemeral environments]` +
|
||||
`(https://superset.apache.org/docs/contributing/howtos/#github-ephemeral-environments)`;
|
||||
|
||||
@@ -149,7 +160,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ needs.ephemeral-env-label.outputs.sha }} : ${{steps.get-sha.outputs.sha}} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: ${{ needs.ephemeral-env-label.outputs.sha }}
|
||||
persist-credentials: false
|
||||
@@ -209,7 +220,7 @@ jobs:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
4
.github/workflows/generate-FOSSA-report.yml
vendored
4
.github/workflows/generate-FOSSA-report.yml
vendored
@@ -27,12 +27,12 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: "temurin"
|
||||
java-version: "11"
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/issue_creation.yml
vendored
2
.github/workflows/issue_creation.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
2
.github/workflows/latest-release-tag.yml
vendored
2
.github/workflows/latest-release-tag.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
4
.github/workflows/license-check.yml
vendored
4
.github/workflows/license-check.yml
vendored
@@ -15,12 +15,12 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '11'
|
||||
|
||||
2
.github/workflows/pr-lint.yml
vendored
2
.github/workflows/pr-lint.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
2
.github/workflows/pre-commit.yml
vendored
2
.github/workflows/pre-commit.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
python-version: ["current", "previous", "next"]
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
2
.github/workflows/prefer-typescript.yml
vendored
2
.github/workflows/prefer-typescript.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
name: Bump version and publish package(s)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
# pulls all commits (needed for lerna / semantic release to correctly version)
|
||||
fetch-depth: 0
|
||||
|
||||
50
.github/workflows/showtime-cleanup.yml
vendored
Normal file
50
.github/workflows/showtime-cleanup.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
name: 🎪 Showtime Cleanup
|
||||
|
||||
# Scheduled cleanup of expired environments
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 */6 * * *' # Every 6 hours
|
||||
|
||||
# Manual trigger for testing
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
max_age_hours:
|
||||
description: 'Maximum age in hours before cleanup'
|
||||
required: false
|
||||
default: '48'
|
||||
type: string
|
||||
|
||||
# Common environment variables
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_REGION: ${{ vars.AWS_REGION || 'us-west-2' }}
|
||||
GITHUB_ORG: ${{ github.repository_owner }}
|
||||
GITHUB_REPO: ${{ github.event.repository.name }}
|
||||
|
||||
jobs:
|
||||
cleanup-expired:
|
||||
name: Clean up expired showtime environments
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Install Superset Showtime
|
||||
run: pip install superset-showtime
|
||||
|
||||
- name: Cleanup expired environments
|
||||
run: |
|
||||
MAX_AGE="${{ github.event.inputs.max_age_hours || '48' }}"
|
||||
|
||||
# Validate max_age is numeric
|
||||
if [[ ! "$MAX_AGE" =~ ^[0-9]+$ ]]; then
|
||||
echo "❌ Invalid max_age_hours format: $MAX_AGE (must be numeric)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Cleaning up environments older than ${MAX_AGE}h"
|
||||
python -m showtime cleanup --older-than "${MAX_AGE}h"
|
||||
179
.github/workflows/showtime-trigger.yml
vendored
Normal file
179
.github/workflows/showtime-trigger.yml
vendored
Normal file
@@ -0,0 +1,179 @@
|
||||
name: 🎪 Superset Showtime
|
||||
|
||||
# Ultra-simple: just sync on any PR state change
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [labeled, unlabeled, synchronize, closed]
|
||||
|
||||
# Manual testing
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
pr_number:
|
||||
description: 'PR number to sync'
|
||||
required: true
|
||||
type: number
|
||||
sha:
|
||||
description: 'Specific SHA to deploy (optional, defaults to latest)'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
# Common environment variables for all jobs (non-sensitive only)
|
||||
env:
|
||||
AWS_REGION: us-west-2
|
||||
GITHUB_ORG: ${{ github.repository_owner }}
|
||||
GITHUB_REPO: ${{ github.event.repository.name }}
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
name: 🎪 Sync PR to desired state
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 90
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Security Check - Authorize Maintainers Only
|
||||
id: auth
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
script: |
|
||||
const actor = context.actor;
|
||||
console.log(`🔍 Checking authorization for ${actor}`);
|
||||
|
||||
// Early exit for workflow_dispatch - assume authorized since it's manually triggered
|
||||
if (context.eventName === 'workflow_dispatch') {
|
||||
console.log(`✅ Workflow dispatch event - assuming authorized for ${actor}`);
|
||||
core.setOutput('authorized', 'true');
|
||||
return;
|
||||
}
|
||||
|
||||
const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
username: actor
|
||||
});
|
||||
|
||||
console.log(`📊 Permission level for ${actor}: ${permission.permission}`);
|
||||
const authorized = ['write', 'admin'].includes(permission.permission);
|
||||
|
||||
// If this is a synchronize event from unauthorized user, check if Showtime is active and set blocked label
|
||||
if (!authorized && context.eventName === 'pull_request_target' && context.payload.action === 'synchronize') {
|
||||
console.log(`🔒 Synchronize event detected - checking if Showtime is active`);
|
||||
|
||||
// Check if PR has any circus tent labels (Showtime is in use)
|
||||
const { data: issue } = await github.rest.issues.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.payload.pull_request.number
|
||||
});
|
||||
|
||||
const hasCircusLabels = issue.labels.some(label => label.name.startsWith('🎪 '));
|
||||
|
||||
if (hasCircusLabels) {
|
||||
console.log(`🎪 Circus labels found - setting blocked label to prevent auto-deployment`);
|
||||
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.payload.pull_request.number,
|
||||
labels: ['🎪 🔒 showtime-blocked']
|
||||
});
|
||||
|
||||
console.log(`✅ Blocked label set - Showtime will detect and skip operations`);
|
||||
} else {
|
||||
console.log(`ℹ️ No circus labels found - Showtime not in use, skipping block`);
|
||||
}
|
||||
}
|
||||
|
||||
if (!authorized) {
|
||||
console.log(`🚨 Unauthorized user ${actor} - skipping all operations`);
|
||||
core.setOutput('authorized', 'false');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`✅ Authorized maintainer: ${actor}`);
|
||||
core.setOutput('authorized', 'true');
|
||||
|
||||
- name: Install Superset Showtime
|
||||
if: steps.auth.outputs.authorized == 'true'
|
||||
run: |
|
||||
echo "::notice::Maintainer ${{ github.actor }} triggered deploy for PR ${{ github.event.pull_request.number || github.event.inputs.pr_number }}"
|
||||
pip install --upgrade superset-showtime
|
||||
showtime version
|
||||
|
||||
- name: Check what actions are needed
|
||||
if: steps.auth.outputs.authorized == 'true'
|
||||
id: check
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Bulletproof PR number extraction
|
||||
if [[ -n "${{ github.event.pull_request.number }}" ]]; then
|
||||
PR_NUM="${{ github.event.pull_request.number }}"
|
||||
elif [[ -n "${{ github.event.inputs.pr_number }}" ]]; then
|
||||
PR_NUM="${{ github.event.inputs.pr_number }}"
|
||||
else
|
||||
echo "❌ No PR number found in event or inputs"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Using PR number: $PR_NUM"
|
||||
|
||||
# Run sync check-only with optional SHA override
|
||||
if [[ -n "${{ github.event.inputs.sha }}" ]]; then
|
||||
OUTPUT=$(python -m showtime sync $PR_NUM --check-only --sha "${{ github.event.inputs.sha }}")
|
||||
else
|
||||
OUTPUT=$(python -m showtime sync $PR_NUM --check-only)
|
||||
fi
|
||||
echo "$OUTPUT"
|
||||
|
||||
# Extract the outputs we need for conditional steps
|
||||
BUILD=$(echo "$OUTPUT" | grep "build_needed=" | cut -d'=' -f2)
|
||||
SYNC=$(echo "$OUTPUT" | grep "sync_needed=" | cut -d'=' -f2)
|
||||
PR_NUM_OUT=$(echo "$OUTPUT" | grep "pr_number=" | cut -d'=' -f2)
|
||||
TARGET_SHA=$(echo "$OUTPUT" | grep "target_sha=" | cut -d'=' -f2)
|
||||
|
||||
echo "build_needed=$BUILD" >> $GITHUB_OUTPUT
|
||||
echo "sync_needed=$SYNC" >> $GITHUB_OUTPUT
|
||||
echo "pr_number=$PR_NUM_OUT" >> $GITHUB_OUTPUT
|
||||
echo "target_sha=$TARGET_SHA" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Checkout PR code (only if build needed)
|
||||
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: ${{ steps.check.outputs.target_sha }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Docker Environment (only if build needed)
|
||||
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
|
||||
uses: ./.github/actions/setup-docker
|
||||
with:
|
||||
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
|
||||
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
build: "true"
|
||||
install-docker-compose: "false"
|
||||
|
||||
- name: Execute sync (handles everything)
|
||||
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.sync_needed == 'true'
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
run: |
|
||||
PR_NUM="${{ steps.check.outputs.pr_number }}"
|
||||
TARGET_SHA="${{ steps.check.outputs.target_sha }}"
|
||||
if [[ -n "$TARGET_SHA" ]]; then
|
||||
python -m showtime sync $PR_NUM --sha "$TARGET_SHA"
|
||||
else
|
||||
python -m showtime sync $PR_NUM
|
||||
fi
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Superset CLI tests
|
||||
name: Superset App CLI tests
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
4
.github/workflows/superset-docs-deploy.yml
vendored
4
.github/workflows/superset-docs-deploy.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
node-version-file: './docs/.nvmrc'
|
||||
- name: Setup Python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
- uses: actions/setup-java@v4
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '21'
|
||||
|
||||
4
.github/workflows/superset-docs-verify.yml
vendored
4
.github/workflows/superset-docs-verify.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
name: Link Checking
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
# Do not bump this linkinator-action version without opening
|
||||
# an ASF Infra ticket to allow the new version first!
|
||||
- uses: JustinBeckwith/linkinator-action@v1.11.0
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
working-directory: docs
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
6
.github/workflows/superset-e2e.yml
vendored
6
.github/workflows/superset-e2e.yml
vendored
@@ -69,21 +69,21 @@ jobs:
|
||||
# Conditional checkout based on context
|
||||
- name: Checkout for push or pull_request event
|
||||
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||
- name: Checkout using ref (workflow_dispatch)
|
||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: ${{ github.event.inputs.ref }}
|
||||
submodules: recursive
|
||||
- name: Checkout using PR ID (workflow_dispatch)
|
||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
||||
|
||||
64
.github/workflows/superset-extensions-cli.yml
vendored
Normal file
64
.github/workflows/superset-extensions-cli.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
name: Superset Extensions CLI Package Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "[0-9].[0-9]*"
|
||||
pull_request:
|
||||
types: [synchronize, opened, reopened, ready_for_review]
|
||||
|
||||
# cancel previous workflow jobs for PRs
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test-superset-extensions-cli-package:
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["previous", "current", "next"]
|
||||
defaults:
|
||||
run:
|
||||
working-directory: superset-extensions-cli
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Check for file changes
|
||||
id: check
|
||||
uses: ./.github/actions/change-detector/
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Setup Python
|
||||
if: steps.check.outputs.superset-extensions-cli
|
||||
uses: ./.github/actions/setup-backend/
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
requirements-type: dev
|
||||
|
||||
- name: Run pytest with coverage
|
||||
if: steps.check.outputs.superset-extensions-cli
|
||||
run: |
|
||||
pytest --cov=superset_extensions_cli --cov-report=xml --cov-report=term-missing --cov-report=html -v --tb=short
|
||||
|
||||
- name: Upload coverage reports to Codecov
|
||||
if: steps.check.outputs.superset-extensions-cli
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
file: ./coverage.xml
|
||||
flags: superset-extensions-cli
|
||||
name: superset-extensions-cli-coverage
|
||||
fail_ci_if_error: false
|
||||
|
||||
- name: Upload HTML coverage report
|
||||
if: steps.check.outputs.superset-extensions-cli
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: superset-extensions-cli-coverage-html
|
||||
path: htmlcov/
|
||||
14
.github/workflows/superset-frontend.yml
vendored
14
.github/workflows/superset-frontend.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
should-run: ${{ steps.check.outputs.frontend }}
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
fetch-depth: 0
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
git show -s --format=raw HEAD
|
||||
docker buildx build \
|
||||
-t $TAG \
|
||||
--cache-from=type=registry,ref=apache/superset-cache:3.10-slim-bookworm \
|
||||
--cache-from=type=registry,ref=apache/superset-cache:3.10-slim-trixie \
|
||||
--target superset-node-ci \
|
||||
.
|
||||
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Download Docker Image Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: docker-image
|
||||
|
||||
@@ -101,7 +101,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Download Coverage Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
pattern: coverage-artifacts-*
|
||||
path: coverage/
|
||||
@@ -127,7 +127,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Download Docker Image Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: docker-image
|
||||
|
||||
@@ -143,7 +143,7 @@ jobs:
|
||||
- name: tsc
|
||||
run: |
|
||||
docker run --rm $TAG bash -c \
|
||||
"npm run type"
|
||||
"npm run plugins:build && npm run type"
|
||||
|
||||
validate-frontend:
|
||||
needs: frontend-build
|
||||
@@ -151,7 +151,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Download Docker Image Artifact
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: docker-image
|
||||
|
||||
|
||||
2
.github/workflows/superset-helm-lint.yml
vendored
2
.github/workflows/superset-helm-lint.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
2
.github/workflows/superset-helm-release.yml
vendored
2
.github/workflows/superset-helm-release.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: ${{ inputs.ref || github.ref_name }}
|
||||
persist-credentials: true
|
||||
|
||||
141
.github/workflows/superset-playwright.yml
vendored
Normal file
141
.github/workflows/superset-playwright.yml
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
name: Playwright E2E Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "[0-9].[0-9]*"
|
||||
pull_request:
|
||||
types: [synchronize, opened, reopened, ready_for_review]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
description: 'The branch or tag to checkout'
|
||||
required: false
|
||||
default: ''
|
||||
pr_id:
|
||||
description: 'The pull request ID to checkout'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
playwright-tests:
|
||||
runs-on: ubuntu-22.04
|
||||
# Allow workflow to succeed even if tests fail during shadow mode
|
||||
continue-on-error: true
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
browser: ["chromium"]
|
||||
app_root: ["", "/app/prefix"]
|
||||
env:
|
||||
SUPERSET_ENV: development
|
||||
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
REDIS_PORT: 16379
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
env:
|
||||
POSTGRES_USER: superset
|
||||
POSTGRES_PASSWORD: superset
|
||||
ports:
|
||||
- 15432:5432
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
# -------------------------------------------------------
|
||||
# Conditional checkout based on context (same as Cypress workflow)
|
||||
- name: Checkout for push or pull_request event
|
||||
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||
- name: Checkout using ref (workflow_dispatch)
|
||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: ${{ github.event.inputs.ref }}
|
||||
submodules: recursive
|
||||
- name: Checkout using PR ID (workflow_dispatch)
|
||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
||||
submodules: recursive
|
||||
# -------------------------------------------------------
|
||||
- name: Check for file changes
|
||||
id: check
|
||||
uses: ./.github/actions/change-detector/
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Setup Python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
- name: Setup postgres
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: setup-postgres
|
||||
- name: Import test data
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: testdata
|
||||
- name: Setup Node.js
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: './superset-frontend/.nvmrc'
|
||||
- name: Install npm dependencies
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: npm-install
|
||||
- name: Build javascript packages
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: build-instrumented-assets
|
||||
- name: Install Playwright
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: playwright-install
|
||||
- name: Run Playwright
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
env:
|
||||
NODE_OPTIONS: "--max-old-space-size=4096"
|
||||
with:
|
||||
run: playwright-run ${{ matrix.app_root }}
|
||||
- name: Set safe app root
|
||||
if: failure()
|
||||
id: set-safe-app-root
|
||||
run: |
|
||||
APP_ROOT="${{ matrix.app_root }}"
|
||||
SAFE_APP_ROOT=${APP_ROOT//\//_}
|
||||
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
|
||||
- name: Upload Playwright Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
path: |
|
||||
${{ github.workspace }}/superset-frontend/playwright-results/
|
||||
${{ github.workspace }}/superset-frontend/test-results/
|
||||
name: playwright-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -99,7 +99,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -152,7 +152,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -108,7 +108,7 @@ jobs:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
4
.github/workflows/superset-translations.yml
vendored
4
.github/workflows/superset-translations.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
|
||||
2
.github/workflows/superset-websocket.yml
vendored
2
.github/workflows/superset-websocket.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Install dependencies
|
||||
|
||||
2
.github/workflows/supersetbot.yml
vendored
2
.github/workflows/supersetbot.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
});
|
||||
|
||||
- name: "Checkout ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
6
.github/workflows/tag-release.yml
vendored
6
.github/workflows/tag-release.yml
vendored
@@ -42,12 +42,12 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
matrix:
|
||||
build_preset: ["dev", "lean", "py310", "websocket", "dockerize", "py311"]
|
||||
build_preset: ["dev", "lean", "py310", "websocket", "dockerize", "py311", "py312"]
|
||||
fail-fast: false
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -107,7 +107,7 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
2
.github/workflows/tech-debt.yml
vendored
2
.github/workflows/tech-debt.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
name: Generate Reports
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
2
.github/workflows/welcome-new-users.yml
vendored
2
.github/workflows/welcome-new-users.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Welcome Message
|
||||
uses: actions/first-interaction@v2
|
||||
uses: actions/first-interaction@v3
|
||||
continue-on-error: true
|
||||
with:
|
||||
repo-token: ${{ github.token }}
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -43,7 +43,7 @@ _modules
|
||||
_static
|
||||
build
|
||||
app.db
|
||||
apache_superset.egg-info/
|
||||
*.egg-info/
|
||||
changelog.sh
|
||||
dist
|
||||
dump.rdb
|
||||
@@ -130,7 +130,7 @@ superset/static/stats/statistics.html
|
||||
|
||||
# LLM-related
|
||||
CLAUDE.local.md
|
||||
PROJECT.md
|
||||
.aider*
|
||||
.claude_rc*
|
||||
.env.local
|
||||
PROJECT.md
|
||||
|
||||
@@ -23,7 +23,9 @@ repos:
|
||||
rev: v1.15.0
|
||||
hooks:
|
||||
- id: mypy
|
||||
name: mypy (main)
|
||||
args: [--check-untyped-defs]
|
||||
exclude: ^superset-extensions-cli/
|
||||
additional_dependencies: [
|
||||
types-simplejson,
|
||||
types-python-dateutil,
|
||||
@@ -38,6 +40,10 @@ repos:
|
||||
types-paramiko,
|
||||
types-Markdown,
|
||||
]
|
||||
- id: mypy
|
||||
name: mypy (superset-extensions-cli)
|
||||
args: [--check-untyped-defs]
|
||||
files: ^superset-extensions-cli/
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v5.0.0
|
||||
hooks:
|
||||
@@ -54,25 +60,25 @@ repos:
|
||||
args: ["--markdown-linebreak-ext=md"]
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: eslint-frontend
|
||||
name: eslint (frontend)
|
||||
entry: ./scripts/eslint.sh
|
||||
language: system
|
||||
pass_filenames: true
|
||||
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
|
||||
- id: eslint-docs
|
||||
name: eslint (docs)
|
||||
entry: bash -c 'cd docs && FILES=$(echo "$@" | sed "s|docs/||g") && yarn eslint --fix --ext .js,.jsx,.ts,.tsx --quiet $FILES'
|
||||
language: system
|
||||
pass_filenames: true
|
||||
files: ^docs/.*\.(js|jsx|ts|tsx)$
|
||||
- id: type-checking-frontend
|
||||
name: Type-Checking (Frontend)
|
||||
entry: ./scripts/check-type.js package=superset-frontend excludeDeclarationDir=cypress-base
|
||||
language: system
|
||||
files: ^superset-frontend\/.*\.(js|jsx|ts|tsx)$
|
||||
exclude: ^superset-frontend/cypress-base\/
|
||||
require_serial: true
|
||||
- id: eslint-frontend
|
||||
name: eslint (frontend)
|
||||
entry: ./scripts/eslint.sh
|
||||
language: system
|
||||
pass_filenames: true
|
||||
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
|
||||
- id: eslint-docs
|
||||
name: eslint (docs)
|
||||
entry: bash -c 'cd docs && FILES=$(echo "$@" | sed "s|docs/||g") && yarn eslint --fix --ext .js,.jsx,.ts,.tsx --quiet $FILES'
|
||||
language: system
|
||||
pass_filenames: true
|
||||
files: ^docs/.*\.(js|jsx|ts|tsx)$
|
||||
- id: type-checking-frontend
|
||||
name: Type-Checking (Frontend)
|
||||
entry: ./scripts/check-type.js package=superset-frontend excludeDeclarationDir=cypress-base
|
||||
language: system
|
||||
files: ^superset-frontend\/.*\.(js|jsx|ts|tsx)$
|
||||
exclude: ^superset-frontend/cypress-base\/
|
||||
require_serial: true
|
||||
# blacklist unsafe functions like make_url (see #19526)
|
||||
- repo: https://github.com/skorokithakis/blacklist-pre-commit-hook
|
||||
rev: e2f070289d8eddcaec0b580d3bde29437e7c8221
|
||||
@@ -94,21 +100,21 @@ repos:
|
||||
args: [--fix]
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: pylint
|
||||
name: pylint with custom Superset plugins
|
||||
entry: bash
|
||||
language: system
|
||||
types: [python]
|
||||
exclude: ^(tests/|superset/migrations/|scripts/|RELEASING/|docker/)
|
||||
args:
|
||||
- -c
|
||||
- |
|
||||
TARGET_BRANCH=${GITHUB_BASE_REF:-master}
|
||||
git fetch origin "$TARGET_BRANCH"
|
||||
BASE=$(git merge-base origin/"$TARGET_BRANCH" HEAD)
|
||||
files=$(git diff --name-only --diff-filter=ACM "$BASE"..HEAD | grep '^superset/.*\.py$' || true)
|
||||
if [ -n "$files" ]; then
|
||||
pylint --rcfile=.pylintrc --load-plugins=superset.extensions.pylint --reports=no $files
|
||||
else
|
||||
echo "No Python files to lint."
|
||||
fi
|
||||
- id: pylint
|
||||
name: pylint with custom Superset plugins
|
||||
entry: bash
|
||||
language: system
|
||||
types: [python]
|
||||
exclude: ^(tests/|superset/migrations/|scripts/|RELEASING/|docker/)
|
||||
args:
|
||||
- -c
|
||||
- |
|
||||
TARGET_BRANCH=${GITHUB_BASE_REF:-master}
|
||||
git fetch origin "$TARGET_BRANCH"
|
||||
BASE=$(git merge-base origin/"$TARGET_BRANCH" HEAD)
|
||||
files=$(git diff --name-only --diff-filter=ACM "$BASE"..HEAD | grep '^superset/.*\.py$' || true)
|
||||
if [ -n "$files" ]; then
|
||||
pylint --rcfile=.pylintrc --load-plugins=superset.extensions.pylint --reports=no $files
|
||||
else
|
||||
echo "No Python files to lint."
|
||||
fi
|
||||
|
||||
@@ -32,6 +32,8 @@ apache_superset.egg-info
|
||||
# json and csv in general cannot have comments
|
||||
.*json
|
||||
.*csv
|
||||
# jinja templates often need to be as-is
|
||||
.*j2
|
||||
# Generated doc files
|
||||
env/*
|
||||
docs/.htaccess*
|
||||
@@ -71,6 +73,7 @@ ibm-db2.svg
|
||||
postgresql.svg
|
||||
snowflake.svg
|
||||
ydb.svg
|
||||
loading.svg
|
||||
|
||||
# docs-related
|
||||
erd.puml
|
||||
|
||||
@@ -47,5 +47,5 @@ under the License.
|
||||
- [4.1.1](./CHANGELOG/4.1.1.md)
|
||||
- [4.1.2](./CHANGELOG/4.1.2.md)
|
||||
- [4.1.3](./CHANGELOG/4.1.3.md)
|
||||
- [4.1.4](./CHANGELOG/4.1.4.md)
|
||||
- [5.0.0](./CHANGELOG/5.0.0.md)
|
||||
- [6.0.0](./CHANGELOG/6.0.0.md)
|
||||
|
||||
33
CHANGELOG/4.1.4.md
Normal file
33
CHANGELOG/4.1.4.md
Normal file
@@ -0,0 +1,33 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
## Change Log
|
||||
|
||||
### 4.1.4 (Thu Jul 24 08:30:04 2025 -0300)
|
||||
|
||||
**Database Migrations**
|
||||
|
||||
**Features**
|
||||
|
||||
**Fixes**
|
||||
- [#34289](https://github.com/apache/superset/pull/34289) fix: Saved queries list break if one query can't be parsed (@michael-s-molina)
|
||||
- [#33059](https://github.com/apache/superset/pull/33059) fix: Adds missing __init__ file to commands/logs (@michael-s-molina)
|
||||
|
||||
**Others**
|
||||
- [#32236](https://github.com/apache/superset/pull/32236) chore(deps): bump cryptography from 43.0.3 to 44.0.1 (@dependabot[bot])
|
||||
@@ -1,895 +0,0 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
## Change Log
|
||||
|
||||
### 6.0 (Mon Sep 22 12:40:16 2025 -0400)
|
||||
|
||||
**Database Migrations**
|
||||
|
||||
- [#34560](https://github.com/apache/superset/pull/34560) feat: Implement UI-based system theme administration (@mistercrunch)
|
||||
- [#34521](https://github.com/apache/superset/pull/34521) chore: use logger on all migrations (@villebro)
|
||||
- [#34345](https://github.com/apache/superset/pull/34345) chore: proper current_app.config proxy usage (@mistercrunch)
|
||||
- [#34182](https://github.com/apache/superset/pull/34182) feat: add a theme CRUD page to manage themes (@mistercrunch)
|
||||
- [#34292](https://github.com/apache/superset/pull/34292) chore: move some rules from ruff -> pylint (@mistercrunch)
|
||||
- [#33682](https://github.com/apache/superset/pull/33682) fix: Dataset currency (@Vitor-Avila)
|
||||
- [#33564](https://github.com/apache/superset/pull/33564) chore: remove sqlparse (@betodealmeida)
|
||||
- [#33303](https://github.com/apache/superset/pull/33303) fix: `metric.currency` should be JSON, not string (@betodealmeida)
|
||||
- [#33155](https://github.com/apache/superset/pull/33155) chore: migrate to more db migration utils (@eschutho)
|
||||
- [#33072](https://github.com/apache/superset/pull/33072) chore: use create table util (@eschutho)
|
||||
- [#33116](https://github.com/apache/superset/pull/33116) feat(explore): X-axis sort by specific metric when more than 1 metric is set (@kgabryje)
|
||||
- [#32852](https://github.com/apache/superset/pull/32852) chore: update migrations to use utils (@sadpandajoe)
|
||||
- [#32759](https://github.com/apache/superset/pull/32759) fix(migrations): fix foreign keys to match FAB 4.6.0 tables (@Antonio-RiveroMartnez)
|
||||
- [#32680](https://github.com/apache/superset/pull/32680) feat: DB migration for dataset folders (@betodealmeida)
|
||||
- [#32352](https://github.com/apache/superset/pull/32352) fix(dev/ci): pre-commit fixes galore (@rusackas)
|
||||
|
||||
**Features**
|
||||
|
||||
- [#34732](https://github.com/apache/superset/pull/34732) feat: completely migrate from DeprecatedThemeColors to Antd semantic tokens (@mistercrunch)
|
||||
- [#29573](https://github.com/apache/superset/pull/29573) feat(api): Added uuid filed support to dataset, chart, dashboard API (@dankor)
|
||||
- [#34712](https://github.com/apache/superset/pull/34712) feat: replace react-color with AntD ColorPicker for theming support (@mistercrunch)
|
||||
- [#34678](https://github.com/apache/superset/pull/34678) feat(extension): Add extension for chart header (@justinpark)
|
||||
- [#34658](https://github.com/apache/superset/pull/34658) feat(sqllab): improve SaveDatasetModal design with proper theme spacing (@kasiazjc)
|
||||
- [#27086](https://github.com/apache/superset/pull/27086) feat(filter_state): Added @api and @has_access_api to all methods of filter_state API. (@xneg)
|
||||
- [#34663](https://github.com/apache/superset/pull/34663) feat: add @sadpandajoe to migrations CODEOWNERS (@mistercrunch)
|
||||
- [#34655](https://github.com/apache/superset/pull/34655) feat(dashboard): change chart background option from "White" to "Solid" (@kasiazjc)
|
||||
- [#34561](https://github.com/apache/superset/pull/34561) feat: Tiled screenshots in Playwright reports (@kgabryje)
|
||||
- [#34434](https://github.com/apache/superset/pull/34434) feat: Add ESLint rule to enforce sentence case in button text (@sadpandajoe)
|
||||
- [#34322](https://github.com/apache/superset/pull/34322) feat(deckgl): add selected cross-filter indication (@DamianPendrak)
|
||||
- [#34373](https://github.com/apache/superset/pull/34373) feat(docker): Add pytest support to docker-compose-light.yml (@mistercrunch)
|
||||
- [#34375](https://github.com/apache/superset/pull/34375) feat(timeshift): Add support for date range timeshifts (@msyavuz)
|
||||
- [#34319](https://github.com/apache/superset/pull/34319) feat: Enable drilling in embedded (@Vitor-Avila)
|
||||
- [#34406](https://github.com/apache/superset/pull/34406) feat: Add configurable query identifiers for Mixed Timeseries charts (@yousoph)
|
||||
- [#34416](https://github.com/apache/superset/pull/34416) feat: add runtime custom font loading via configuration (@mistercrunch)
|
||||
- [#34409](https://github.com/apache/superset/pull/34409) feat(codespaces): auto-setup Python venv with dependencies (@mistercrunch)
|
||||
- [#34206](https://github.com/apache/superset/pull/34206) feat(i18n): update Spanish translations (messages.po) (@cbausaonebox)
|
||||
- [#34376](https://github.com/apache/superset/pull/34376) feat: Add GitHub Codespaces support with docker-compose-light (@mistercrunch)
|
||||
- [#34383](https://github.com/apache/superset/pull/34383) feat(charts): Enable async buildQuery support for complex chart logic (@mistercrunch)
|
||||
- [#34380](https://github.com/apache/superset/pull/34380) feat: allow creating dataset without exploring (@betodealmeida)
|
||||
- [#34379](https://github.com/apache/superset/pull/34379) feat: focus on text input when modal opens (@betodealmeida)
|
||||
- [#34359](https://github.com/apache/superset/pull/34359) feat: read column metadata (@betodealmeida)
|
||||
- [#34273](https://github.com/apache/superset/pull/34273) feat(theming): Align embedded sdk with theme configs (@gabotorresruiz)
|
||||
- [#34324](https://github.com/apache/superset/pull/34324) feat: introducing a docker-compose-light.yml for lighter development (@mistercrunch)
|
||||
- [#34308](https://github.com/apache/superset/pull/34308) feat(timeseries): enhance 'Series Limit' to support grouping the long tail (@mistercrunch)
|
||||
- [#34294](https://github.com/apache/superset/pull/34294) feat: re-order CRUD list view action buttons (@mistercrunch)
|
||||
- [#34290](https://github.com/apache/superset/pull/34290) feat: make `SupersetClient` retry on 502-504 (@betodealmeida)
|
||||
- [#34258](https://github.com/apache/superset/pull/34258) feat(docker): do not include chromium (headless browser) by default in Dockerfile (@mistercrunch)
|
||||
- [#34194](https://github.com/apache/superset/pull/34194) feat: introduce comprehensive LLM context guides for AI-powered development (@mistercrunch)
|
||||
- [#34207](https://github.com/apache/superset/pull/34207) feat(docs): migrate ESLint to v9 (@hainenber)
|
||||
- [#34231](https://github.com/apache/superset/pull/34231) feat: add Claude Code GitHub Action integration (@mistercrunch)
|
||||
- [#34204](https://github.com/apache/superset/pull/34204) feat(deckgl): add support for OpenStreetMap as our new default and make "tile-providers" more configurable FIX (@plavacquery)
|
||||
- [#33569](https://github.com/apache/superset/pull/33569) feat(pivot-table-chart): Download as pivoted excel (@mdusmanalvi)
|
||||
- [#34156](https://github.com/apache/superset/pull/34156) feat(snowflake): Support Snowflake private keys w/o passphrase (@junyoneyama)
|
||||
- [#33953](https://github.com/apache/superset/pull/33953) feat(i18n): add Catalan (ca) translations (@cbausaonebox)
|
||||
- [#34177](https://github.com/apache/superset/pull/34177) feat: removing dup logic in sqla/models.py and models/helpers.py (@mistercrunch)
|
||||
- [#34144](https://github.com/apache/superset/pull/34144) feat(theming): Introduce bootstrap-driven Superset theme configurations (@gabotorresruiz)
|
||||
- [#32870](https://github.com/apache/superset/pull/32870) feat(filter panel): hide filter panel on all dashboard by default. (@SBIN2010)
|
||||
- [#34119](https://github.com/apache/superset/pull/34119) feat(i18n): load language pack asynchronously (@mistercrunch)
|
||||
- [#34140](https://github.com/apache/superset/pull/34140) feat: improve Doris catalog support (@betodealmeida)
|
||||
- [#34017](https://github.com/apache/superset/pull/34017) feat(deckgl): add new color controls with color breakpoints (@DamianPendrak)
|
||||
- [#33603](https://github.com/apache/superset/pull/33603) feat(deckgl): add support for OpenStreetMap as our new default and make "tile-providers" more configurable (@plavacquery)
|
||||
- [#33769](https://github.com/apache/superset/pull/33769) feat(deck-gl): Enable individual deck.gl layer selection in FilterScope tree (@richardfogaca)
|
||||
- [#34095](https://github.com/apache/superset/pull/34095) feat: Don't show the row limit warning for embedded dashboards by default (@Vitor-Avila)
|
||||
- [#33517](https://github.com/apache/superset/pull/33517) feat(viz-type): Ag grid table plugin Integration (@amaannawab923)
|
||||
- [#33789](https://github.com/apache/superset/pull/33789) feat(deckgl): add cross-filters to deck.gl charts (@DamianPendrak)
|
||||
- [#33170](https://github.com/apache/superset/pull/33170) feat(filter): Add Slider Range Inputs Option for Numerical Range Filters (@payose)
|
||||
- [#33716](https://github.com/apache/superset/pull/33716) feat(plugin-chart-echarts): add Gantt Chart plugin (@Quatters)
|
||||
- [#34023](https://github.com/apache/superset/pull/34023) feat(flag): Added feature_flag for superset security_views (@alexandrusoare)
|
||||
- [#33809](https://github.com/apache/superset/pull/33809) feat: Add confirmation modal for unsaved changes (@gabotorresruiz)
|
||||
- [#33947](https://github.com/apache/superset/pull/33947) feat(Table): Add infrastructure to override time shifts (@msyavuz)
|
||||
- [#33929](https://github.com/apache/superset/pull/33929) feat(db): remove Rockset DB support (@hainenber)
|
||||
- [#33781](https://github.com/apache/superset/pull/33781) feat(Dashboard): Row limit warning in dashboards (@msyavuz)
|
||||
- [#33631](https://github.com/apache/superset/pull/33631) feat(User Registrations): Migrate user registrations fab view (@msyavuz)
|
||||
- [#33871](https://github.com/apache/superset/pull/33871) feat(charts): Add row limit control to box plot chart (@DamianPendrak)
|
||||
- [#33863](https://github.com/apache/superset/pull/33863) feat(Icons): Add HistoryOutlined (@msyavuz)
|
||||
- [#33851](https://github.com/apache/superset/pull/33851) feat(theming): improving theme docs and configuration (@mistercrunch)
|
||||
- [#31590](https://github.com/apache/superset/pull/31590) feat(theming): land Ant Design v5 overhaul — dynamic themes, real dark mode + massive styling refactor (@mistercrunch)
|
||||
- [#33847](https://github.com/apache/superset/pull/33847) feat: initial Dremio sqlglot dialect (@betodealmeida)
|
||||
- [#33829](https://github.com/apache/superset/pull/33829) feat(extension): Added extension point for Time Filters (@alexandrusoare)
|
||||
- [#33656](https://github.com/apache/superset/pull/33656) feat(chart): add toggle for percentage metric calculation mode in Table chart (@LevisNgigi)
|
||||
- [#33709](https://github.com/apache/superset/pull/33709) feat(DatasourceEditor): Format sql shortcut and bigger table (@msyavuz)
|
||||
- [#33729](https://github.com/apache/superset/pull/33729) feat: x axis interval control to show ALL ticks on timeseries charts (@rusackas)
|
||||
- [#32610](https://github.com/apache/superset/pull/32610) feat(clickhouse): allow dynamic schema (@codenamelxl)
|
||||
- [#33634](https://github.com/apache/superset/pull/33634) feat(MixedTimeSeries): Add onlyTotal and Sort Series to Mixed TimeSeries (@nilmonto)
|
||||
- [#33443](https://github.com/apache/superset/pull/33443) feat(Dataset): editor improvements - run in sqllab (@rebenitez1802)
|
||||
- [#33620](https://github.com/apache/superset/pull/33620) feat(UserInfo): Migrate User Info FAB to React (@EnxDev)
|
||||
- [#33301](https://github.com/apache/superset/pull/33301) feat(List Groups): Migrate List Groups FAB to React (@EnxDev)
|
||||
- [#32887](https://github.com/apache/superset/pull/32887) feat(database): add SingleStore engine specification (@AdalbertMemSQL)
|
||||
- [#33434](https://github.com/apache/superset/pull/33434) feat: Python 3.12 support (@rad-pat)
|
||||
- [#33560](https://github.com/apache/superset/pull/33560) feat: use sqlglot to validate adhoc subquery (@betodealmeida)
|
||||
- [#33542](https://github.com/apache/superset/pull/33542) feat(sqllab): use sqlglot instead of sqlparse (@betodealmeida)
|
||||
- [#33614](https://github.com/apache/superset/pull/33614) feat: current_user_rls_rules Jinja macro (@Vitor-Avila)
|
||||
- [#33525](https://github.com/apache/superset/pull/33525) feat: implement CVAS/CTAS in sqlglot (@betodealmeida)
|
||||
- [#33524](https://github.com/apache/superset/pull/33524) feat: implement RLS in sqlglot (@betodealmeida)
|
||||
- [#33518](https://github.com/apache/superset/pull/33518) feat: implement CTEs logic in sqlglot (@betodealmeida)
|
||||
- [#33298](https://github.com/apache/superset/pull/33298) feat(Action Logs): Migrate Action Log FAB to React (@EnxDev)
|
||||
- [#33473](https://github.com/apache/superset/pull/33473) feat: use sqlglot to set limit (@betodealmeida)
|
||||
- [#33456](https://github.com/apache/superset/pull/33456) feat: implement limit extraction in sqlglot (@betodealmeida)
|
||||
- [#32707](https://github.com/apache/superset/pull/32707) feat(stack by dimension): add a stack by dimension dropdown list (@jpchev)
|
||||
- [#33451](https://github.com/apache/superset/pull/33451) feat(chart): add dynamicQueryObjectCount property to Chart Metadata (@DamianPendrak)
|
||||
- [#33348](https://github.com/apache/superset/pull/33348) feat(Pie Chart): threshold for Other (@Quatters)
|
||||
- [#33357](https://github.com/apache/superset/pull/33357) feat(Table Chart): Row limit Increase , Backend Sorting , Backend Search , Excel/CSV Improvements (@amaannawab923)
|
||||
- [#33340](https://github.com/apache/superset/pull/33340) feat: Run SQL on DataSourceEditor implementation (@rebenitez1802)
|
||||
- [#33099](https://github.com/apache/superset/pull/33099) feat: add metric name for big number chart types #33013 (@fardin-developer)
|
||||
- [#29580](https://github.com/apache/superset/pull/29580) feat: Persian translations (@CodeWithEmad)
|
||||
- [#33208](https://github.com/apache/superset/pull/33208) feat(maps): Adding Republic of Serbia to country maps (@rusackas)
|
||||
- [#33192](https://github.com/apache/superset/pull/33192) feat(i18n): Frontend add zh_TW Option (@bestlong)
|
||||
- [#33198](https://github.com/apache/superset/pull/33198) feat(maps): Adding Ivory Coast / Côte d'Ivoire (@rusackas)
|
||||
- [#32695](https://github.com/apache/superset/pull/32695) feat(country-map): fix France Regions IDF region code - Fixes #32627 (@tarraschk)
|
||||
- [#33043](https://github.com/apache/superset/pull/33043) feat(Select): Select all and Deselect all that works on visible items while searching (@msyavuz)
|
||||
- [#33054](https://github.com/apache/superset/pull/33054) feat(Native Filters): Exclude Filter Values (@amaannawab923)
|
||||
- [#32882](https://github.com/apache/superset/pull/32882) feat(List Users): Migrate List Users FAB to React (@EnxDev)
|
||||
- [#29827](https://github.com/apache/superset/pull/29827) feat(lang): update Italian language (@WLCFaro)
|
||||
- [#33104](https://github.com/apache/superset/pull/33104) feat(explore): Integrate dataset panel with Folders feature (@eschutho)
|
||||
- [#28751](https://github.com/apache/superset/pull/28751) feat: catalogs for DuckDB (@betodealmeida)
|
||||
- [#32520](https://github.com/apache/superset/pull/32520) feat: dataset folders (backend) (@betodealmeida)
|
||||
- [#33096](https://github.com/apache/superset/pull/33096) feat(Native Filters): Configure creatable filter behavior (@geido)
|
||||
- [#33000](https://github.com/apache/superset/pull/33000) feat: optimize catalog permission sync (@betodealmeida)
|
||||
- [#32975](https://github.com/apache/superset/pull/32975) feat(charts): add subtitle option and metric customization controls (@LevisNgigi)
|
||||
- [#30134](https://github.com/apache/superset/pull/30134) feat: Allow superset to be deployed under a prefixed URL (@martyngigg)
|
||||
- [#33046](https://github.com/apache/superset/pull/33046) feat: add a title prop to the dashboard link in CRUD LIST view (@mistercrunch)
|
||||
- [#30833](https://github.com/apache/superset/pull/30833) feat(tags): Export and Import Functionality for Superset Dashboards and Charts (@asher-lab)
|
||||
- [#32997](https://github.com/apache/superset/pull/32997) feat: Add getDataMask function to embedded SDK (@kgabryje)
|
||||
- [#31331](https://github.com/apache/superset/pull/31331) feat(embedding-sdk): emit data-mask events through embedded sdk to iframe parent (@MohamedHalat)
|
||||
- [#32432](https://github.com/apache/superset/pull/32432) feat(List Roles): Migrate FAB view to React (@EnxDev)
|
||||
- [#30760](https://github.com/apache/superset/pull/30760) feat: add latest partition support for BigQuery (@mistercrunch)
|
||||
- [#32900](https://github.com/apache/superset/pull/32900) feat: Enable passing a permalink to cache_dashboard_screenshot endpoint (@kgabryje)
|
||||
- [#28605](https://github.com/apache/superset/pull/28605) feat(plugins): Make comparison values on BigNumberPeriodOverPeriod toggleable (@mkramer5454)
|
||||
- [#32814](https://github.com/apache/superset/pull/32814) feat(chart controls): Add "%d.%m.%Y" time format option (@Quatters)
|
||||
- [#32767](https://github.com/apache/superset/pull/32767) feat: Add Aggregation Method for Big Number with Trendline (@LevisNgigi)
|
||||
- [#32770](https://github.com/apache/superset/pull/32770) feat: Add current_user_roles() Jinja macro (@bmaquet)
|
||||
- [#32781](https://github.com/apache/superset/pull/32781) feat(Jinja): to_datetime filter (@Vitor-Avila)
|
||||
- [#32721](https://github.com/apache/superset/pull/32721) feat(FormModal): Specialized Modal component for forms (@alexandrusoare)
|
||||
- [#32735](https://github.com/apache/superset/pull/32735) feat(embedded): Force a specific referrerPolicy for the iframe request (@Vitor-Avila)
|
||||
- [#32731](https://github.com/apache/superset/pull/32731) feat(where_in): Support returning None if filter_values return None (@Vitor-Avila)
|
||||
- [#32702](https://github.com/apache/superset/pull/32702) feat(file uploads): List only allowed schemas in the file uploads dialog (@Vitor-Avila)
|
||||
- [#32670](https://github.com/apache/superset/pull/32670) feat: Implement sparse import for ImportAssetsCommand (@withnale)
|
||||
- [#32682](https://github.com/apache/superset/pull/32682) feat(docs): Adding Kapa.ai integration (@rusackas)
|
||||
- [#32662](https://github.com/apache/superset/pull/32662) feat: add a note to install cors-related dependency when using ENABLE_CORS (@mistercrunch)
|
||||
- [#32546](https://github.com/apache/superset/pull/32546) feat: `OAuth2StoreTokenCommand` (@betodealmeida)
|
||||
- [#32366](https://github.com/apache/superset/pull/32366) feat(reports): removing index column (@SkinnyPigeon)
|
||||
- [#32170](https://github.com/apache/superset/pull/32170) feat(charts): add two new boxplot parameter sets (@sfirke)
|
||||
- [#32510](https://github.com/apache/superset/pull/32510) feat(slack): adds rate limit error handler for Slack client (@Usiel)
|
||||
- [#32509](https://github.com/apache/superset/pull/32509) feat(KustoKQL): Update KQL alchemy version and update timegrain expressions (@ag-ramachandran)
|
||||
- [#32506](https://github.com/apache/superset/pull/32506) feat: make user agent customizable (@villebro)
|
||||
- [#32317](https://github.com/apache/superset/pull/32317) feat(flag flip): Setting Horizontal Filters to True by default. (@rusackas)
|
||||
- [#32121](https://github.com/apache/superset/pull/32121) feat: security, user group support (@dpgaspar)
|
||||
- [#31996](https://github.com/apache/superset/pull/31996) feat: cache the frontend's bootstrap data (@mistercrunch)
|
||||
- [#32048](https://github.com/apache/superset/pull/32048) feat: improve GSheets OAuth2 (@betodealmeida)
|
||||
- [#32231](https://github.com/apache/superset/pull/32231) feat: Update database permissions in async mode (@Vitor-Avila)
|
||||
- [#31726](https://github.com/apache/superset/pull/31726) feat(filter): adding inputs to Numerical Range Filter (@alexandrusoare)
|
||||
- [#31506](https://github.com/apache/superset/pull/31506) feat(i18n): Add polish to default language (@EmmanuelCbd)
|
||||
- [#32403](https://github.com/apache/superset/pull/32403) feat: default ports for SSH tunnel (@betodealmeida)
|
||||
- [#32358](https://github.com/apache/superset/pull/32358) feat: Adding the option and feature to enable borders with color, opacity and width control on heatmaps along with white borders on emphasis (@Dev10-34)
|
||||
- [#32339](https://github.com/apache/superset/pull/32339) feat: allow importing encrypted_extra (@betodealmeida)
|
||||
- [#32264](https://github.com/apache/superset/pull/32264) feat(number-format): adds memory data transfer rates in binary and decimal format (@tshallenberger)
|
||||
- [#32261](https://github.com/apache/superset/pull/32261) feat(type-checking): Add type-checking pre-commit hooks (@alveifbklsiu259)
|
||||
- [#32228](https://github.com/apache/superset/pull/32228) feat: recursive metric definitions (@betodealmeida)
|
||||
- [#32189](https://github.com/apache/superset/pull/32189) feat(dropdown accessibility): Wrap dropdown triggers with buttons for accessibility (@msyavuz)
|
||||
- [#31998](https://github.com/apache/superset/pull/31998) feat: Add parseJson Handlebars Helper to Support Processing Nested JSON Data (@AdrianKoszalka)
|
||||
- [#31998](https://github.com/apache/superset/pull/31998) feat: Add parseJson Handlebars Helper to Support Processing Nested JSON Data (@AdrianKoszalka)
|
||||
- [#32041](https://github.com/apache/superset/pull/32041) feat: add TDengine.py driver to db_engine (@DuanKuanJun)
|
||||
|
||||
**Fixes**
|
||||
|
||||
- [#35212](https://github.com/apache/superset/pull/35212) fix(SQLPopover): Use correct component (@msyavuz)
|
||||
- [#35179](https://github.com/apache/superset/pull/35179) fix: bug in tooltip timeseries chart in calculated total with annotation layer (@SBIN2010)
|
||||
- [#34999](https://github.com/apache/superset/pull/34999) fix: Bump pandas to 2.1.4 for python 3.12 (@rad-pat)
|
||||
- [#35076](https://github.com/apache/superset/pull/35076) fix(Funnel): onInit overridden row_limit to default value on save chart (@SBIN2010)
|
||||
- [#35189](https://github.com/apache/superset/pull/35189) fix(gantt-chart): fix Y-axis label visibility in dark theme (@LevisNgigi)
|
||||
- [#35155](https://github.com/apache/superset/pull/35155) fix(CrudThemeProvider): Optimized theme loading logic (@marunrun)
|
||||
- [#35168](https://github.com/apache/superset/pull/35168) fix(embedded): resolve theme context error in Loading component (@marunrun)
|
||||
- [#35151](https://github.com/apache/superset/pull/35151) fix(viz): resolve dark mode compatibility issues in BigNumber and Heatmap (@mistercrunch)
|
||||
- [#35144](https://github.com/apache/superset/pull/35144) fix: import bug template params (@SBIN2010)
|
||||
- [#35142](https://github.com/apache/superset/pull/35142) fix(deck.gl): restore legend display for Polygon charts with linear palette and fixed color schemes (@sadpandajoe)
|
||||
- [#35124](https://github.com/apache/superset/pull/35124) fix: Remove emotion-rgba from dependencies and codebase (@eschutho)
|
||||
- [#35057](https://github.com/apache/superset/pull/35057) fix(ListView): implement AntD pagination for ListView component (@gabotorresruiz)
|
||||
- [#35114](https://github.com/apache/superset/pull/35114) fix(theming): Lighter text colors on dark mode (@msyavuz)
|
||||
- [#33055](https://github.com/apache/superset/pull/33055) fix: Bump FAB to 5.X (@dpgaspar)
|
||||
- [#35105](https://github.com/apache/superset/pull/35105) fix: SQL Lab tab events (@michael-s-molina)
|
||||
- [#35095](https://github.com/apache/superset/pull/35095) fix: page size options 'all' correct in table and remove PAGE_SIZE_OPTIONS in handlebars (@SBIN2010)
|
||||
- [#35086](https://github.com/apache/superset/pull/35086) fix(pie): fixes pie chart other click error (@cbum-dev)
|
||||
- [#35090](https://github.com/apache/superset/pull/35090) fix(theming): replace error color with bolt icon for local themes (@gabotorresruiz)
|
||||
- [#35094](https://github.com/apache/superset/pull/35094) fix(templates): Restores templates files accidentally removed (@rebenitez1802)
|
||||
- [#35096](https://github.com/apache/superset/pull/35096) fix(settingsMenu): Version (@rebenitez1802)
|
||||
- [#34694](https://github.com/apache/superset/pull/34694) fix(drill-to-detail): ensure axis label filters map to original column names (@LisaHusband)
|
||||
- [#35072](https://github.com/apache/superset/pull/35072) fix(timeshifts): Add missing feature flag to enum (@msyavuz)
|
||||
- [#34558](https://github.com/apache/superset/pull/34558) fix(Table Chart): render null dates properly (@nicob3y)
|
||||
- [#35064](https://github.com/apache/superset/pull/35064) fix(table): table search input placeholder (@SBIN2010)
|
||||
- [#35007](https://github.com/apache/superset/pull/35007) fix(tests): one of integration test in TestSqlaTableModel does not support MySQL "concat" (@catpineapple)
|
||||
- [#35001](https://github.com/apache/superset/pull/35001) fix(dashboard): normalize spacings and background colors (@gabotorresruiz)
|
||||
- [#34828](https://github.com/apache/superset/pull/34828) fix(theming): Icons in ExecutionLogList and Country map chart tooltip theme consistency (@rebenitez1802)
|
||||
- [#35036](https://github.com/apache/superset/pull/35036) fix: mixed timeseries chart add legend margin (@SBIN2010)
|
||||
- [#34973](https://github.com/apache/superset/pull/34973) fix(chart): change "No query." to "Query cannot be loaded" in Multi Layer Deck.gl Chart (@DamianPendrak)
|
||||
- [#35005](https://github.com/apache/superset/pull/35005) fix: display legend mixed timeseries chart (@SBIN2010)
|
||||
- [#34662](https://github.com/apache/superset/pull/34662) fix(sql): Add Impala dialect support to sqlglot parser (@rusackas)
|
||||
- [#34987](https://github.com/apache/superset/pull/34987) fix(theming): more visual bugs (@msyavuz)
|
||||
- [#35017](https://github.com/apache/superset/pull/35017) fix(RoleListEditModal): display user's other properties in table (@msyavuz)
|
||||
- [#35011](https://github.com/apache/superset/pull/35011) fix: doris genericDataType modify (@catpineapple)
|
||||
- [#34870](https://github.com/apache/superset/pull/34870) fix(deps): expand pyarrow version range to <19 (@sha174n)
|
||||
- [#34995](https://github.com/apache/superset/pull/34995) fix(tests): resolve AlertReportModal checkmark test failures (@sadpandajoe)
|
||||
- [#34874](https://github.com/apache/superset/pull/34874) fix(ui-core): Invalid postTransform process (@justinpark)
|
||||
- [#34781](https://github.com/apache/superset/pull/34781) fix(sqllab): autocomplete and delete tabs (@justinpark)
|
||||
- [#34803](https://github.com/apache/superset/pull/34803) fix(error-handling): jinja2 error handling improvements (@gabotorresruiz)
|
||||
- [#34991](https://github.com/apache/superset/pull/34991) fix(databricks): string escaper v2 (@Vitor-Avila)
|
||||
- [#34760](https://github.com/apache/superset/pull/34760) fix(charts): Handle virtual dataset names without schema prefix correctly (@rusackas)
|
||||
- [#34761](https://github.com/apache/superset/pull/34761) fix(echarts): Display NULL values in categorical x-axis for bar charts (@rusackas)
|
||||
- [#34918](https://github.com/apache/superset/pull/34918) fix(ChartCreation): Translate chart description (@msyavuz)
|
||||
- [#34978](https://github.com/apache/superset/pull/34978) fix: playwright feature flag evaluation (@dpgaspar)
|
||||
- [#34989](https://github.com/apache/superset/pull/34989) fix(TimeTable): use type-only export for TableChartProps to resolve webpack warnings (@gabotorresruiz)
|
||||
- [#34975](https://github.com/apache/superset/pull/34975) fix(dashboard): table charts render correctly after tab switch and refresh (@gabotorresruiz)
|
||||
- [#34895](https://github.com/apache/superset/pull/34895) fix: Athena quoting (@betodealmeida)
|
||||
- [#34909](https://github.com/apache/superset/pull/34909) fix: revert mistake setting TALISMAN_ENABLED=False (@mistercrunch)
|
||||
- [#34868](https://github.com/apache/superset/pull/34868) fix(theming): fix TimeTable chart issues (@gabotorresruiz)
|
||||
- [#34850](https://github.com/apache/superset/pull/34850) fix: complete theme management system import/export (@mistercrunch)
|
||||
- [#34887](https://github.com/apache/superset/pull/34887) fix: Improve table layout and column sizing (@kgabryje)
|
||||
- [#34724](https://github.com/apache/superset/pull/34724) fix(drilling): drill by pagination works with MSSQL data source, cont. (@sfirke)
|
||||
- [#34900](https://github.com/apache/superset/pull/34900) fix: Filter bar orientation submenu should not be highlighted (@kgabryje)
|
||||
- [#34864](https://github.com/apache/superset/pull/34864) fix(ConfirmStatusChange): remove deprecated event.persist() to fix headless browser crashes (@sadpandajoe)
|
||||
- [#34878](https://github.com/apache/superset/pull/34878) fix(tests): Improve MessageChannel mocking to prevent worker force exits (@sadpandajoe)
|
||||
- [#34858](https://github.com/apache/superset/pull/34858) fix: SelectControl default sort numeric choices by value (@kgabryje)
|
||||
- [#34869](https://github.com/apache/superset/pull/34869) fix: Undefined error when viewing query in Explore + visual fixes (@kgabryje)
|
||||
- [#34871](https://github.com/apache/superset/pull/34871) fix(tests): Mock MessageChannel to prevent Jest hanging from rc-overflow (@sadpandajoe)
|
||||
- [#34855](https://github.com/apache/superset/pull/34855) fix: Remove the underline from the right section of main menu (@kgabryje)
|
||||
- [#34854](https://github.com/apache/superset/pull/34854) fix: DB icon sizes in database add modal (@kgabryje)
|
||||
- [#34843](https://github.com/apache/superset/pull/34843) fix(dashboard): Anchor link positions (@kgabryje)
|
||||
- [#34846](https://github.com/apache/superset/pull/34846) fix(sqllab): Missing executed sql value in the result table (@justinpark)
|
||||
- [#34665](https://github.com/apache/superset/pull/34665) fix: Avoid dataset drill request if no perm (@Vitor-Avila)
|
||||
- [#34782](https://github.com/apache/superset/pull/34782) fix: Add dataset ID to file name on exports (@Vitor-Avila)
|
||||
- [#34795](https://github.com/apache/superset/pull/34795) fix(theming): explore chart type style fixes, nav right menu spacing fixed (@rebenitez1802)
|
||||
- [#34801](https://github.com/apache/superset/pull/34801) fix: make `get_image()` always return `BytesIO` (@betodealmeida)
|
||||
- [#34798](https://github.com/apache/superset/pull/34798) fix: Unexpected overflow ellipsis dots after status icon in Dashboard list (@kgabryje)
|
||||
- [#34815](https://github.com/apache/superset/pull/34815) fix(echarts): Series labels hard to read in dark mode (@kgabryje)
|
||||
- [#34809](https://github.com/apache/superset/pull/34809) fix(Icons): Add missing data-test and aria-label attributes to custom icons (@sadpandajoe)
|
||||
- [#34790](https://github.com/apache/superset/pull/34790) fix(DetailsPanel): Applied filters colors (@msyavuz)
|
||||
- [#34812](https://github.com/apache/superset/pull/34812) fix(native-filters): Low contrast of empty state in dark mode (@kgabryje)
|
||||
- [#34811](https://github.com/apache/superset/pull/34811) fix: Low contrast in viz creator selected tag in dark mode (@kgabryje)
|
||||
- [#34814](https://github.com/apache/superset/pull/34814) fix: Remove border around textarea in dashboard edit mode (@kgabryje)
|
||||
- [#34799](https://github.com/apache/superset/pull/34799) fix: Misaligned global controls in Table chart (@kgabryje)
|
||||
- [#34777](https://github.com/apache/superset/pull/34777) fix(dashboard): enable undo/redo buttons for layout changes (@gabotorresruiz)
|
||||
- [#34679](https://github.com/apache/superset/pull/34679) fix: Check migration status before initializing database-dependent features (@mistercrunch)
|
||||
- [#34719](https://github.com/apache/superset/pull/34719) fix: default value in run-server.sh (@prochac)
|
||||
- [#32640](https://github.com/apache/superset/pull/32640) fix: catch no table error (@eschutho)
|
||||
- [#34793](https://github.com/apache/superset/pull/34793) fix(PivotExcelExport): select correct chart for export (@msyavuz)
|
||||
- [#34780](https://github.com/apache/superset/pull/34780) fix(tests): make SingleStore test_adjust_engine_params version-agnostic (@sadpandajoe)
|
||||
- [#34791](https://github.com/apache/superset/pull/34791) fix(webpack): Bump webpack dev-server to handle Errors on Firefox where error object is not defined (@amaannawab923)
|
||||
- [#34765](https://github.com/apache/superset/pull/34765) fix(sqllab): Fix save query modal closing prematurely on new tabs (@rusackas)
|
||||
- [#34051](https://github.com/apache/superset/pull/34051) fix(translations): Fix translation of time-related strings like "7 seconds ago", "a minute ago", etc (@PolinaFam)
|
||||
- [#34769](https://github.com/apache/superset/pull/34769) fix: Fix TypeError in Slice.get() method when using filter_by() with BinaryExpression (@sadpandajoe)
|
||||
- [#34743](https://github.com/apache/superset/pull/34743) fix(duckdb): Add support for DuckDB-specific numeric types (@rusackas)
|
||||
- [#34683](https://github.com/apache/superset/pull/34683) fix(sqllab): Invisible grid table due to the invalid height (@justinpark)
|
||||
- [#34757](https://github.com/apache/superset/pull/34757) fix: Users can't skip column sync when saving virtual datasets (@michael-s-molina)
|
||||
- [#34720](https://github.com/apache/superset/pull/34720) fix(sqllab): Reduce flushing caused by ID updates (@justinpark)
|
||||
- [#34758](https://github.com/apache/superset/pull/34758) fix(saved_query): Copy link to clipboard before redirect to edit (#34567) (@justinpark)
|
||||
- [#34756](https://github.com/apache/superset/pull/34756) fix(RightMenu): Move RightMenu carets to the right side (@msyavuz)
|
||||
- [#34705](https://github.com/apache/superset/pull/34705) fix: Highlight outline of numerical range and time range filters (@kgabryje)
|
||||
- [#34676](https://github.com/apache/superset/pull/34676) fix(theming): Some visual issues (@rebenitez1802)
|
||||
- [#34660](https://github.com/apache/superset/pull/34660) fix: Table chart server side pagination not working on dashboard (@kgabryje)
|
||||
- [#34708](https://github.com/apache/superset/pull/34708) fix(dashboard): Remove Tab from Dashboard Confirm Modal themed (@rebenitez1802)
|
||||
- [#34706](https://github.com/apache/superset/pull/34706) fix(dashboard): Titles tooltip flickering (@rebenitez1802)
|
||||
- [#34654](https://github.com/apache/superset/pull/34654) fix: centralize cache timeout -1 logic to prevent caching (@dpgaspar)
|
||||
- [#34686](https://github.com/apache/superset/pull/34686) fix(ag-grid): Fix broken string column filters in AG Grid Table V2 (@amaannawab923)
|
||||
- [#34418](https://github.com/apache/superset/pull/34418) fix(dashboard): update cross filter scoping chart id references during dashboard import (@trentontrees)
|
||||
- [#34690](https://github.com/apache/superset/pull/34690) fix(deck.gl): add webpack rule to define module global for deck.gl charts (@richardfogaca)
|
||||
- [#34698](https://github.com/apache/superset/pull/34698) fix: Invalid error tooltip if control label is function (@kgabryje)
|
||||
- [#34671](https://github.com/apache/superset/pull/34671) fix: Bar chart crash when switching from Big Number (@kgabryje)
|
||||
- [#34680](https://github.com/apache/superset/pull/34680) fix(bootstrapData): Missing application_root data throws an error (@justinpark)
|
||||
- [#34675](https://github.com/apache/superset/pull/34675) fix(theming): Fix ag-grid theming regression in SQL Lab (@mistercrunch)
|
||||
- [#34672](https://github.com/apache/superset/pull/34672) fix(row_level_security): Correct api response code for update (@msyavuz)
|
||||
- [#34585](https://github.com/apache/superset/pull/34585) fix(theming): Theming visual fixes p5 (@msyavuz)
|
||||
- [#34664](https://github.com/apache/superset/pull/34664) fix(csv_tests): Import from utils (@msyavuz)
|
||||
- [#34511](https://github.com/apache/superset/pull/34511) fix(sqllab): show actual execution duration in Query History (@rusackas)
|
||||
- [#34395](https://github.com/apache/superset/pull/34395) fix(superset-ui-core): Include appRoot in endpoint of SupersetClientClass.postForm action (@martyngigg)
|
||||
- [#34304](https://github.com/apache/superset/pull/34304) fix(presto): return proper data type for column (@betodealmeida)
|
||||
- [#32340](https://github.com/apache/superset/pull/32340) fix(security): grant TableSchemaView to only sql_lab role (@codenamelxl)
|
||||
- [#33503](https://github.com/apache/superset/pull/33503) fix: activity table delta time (@natilehrer)
|
||||
- [#33202](https://github.com/apache/superset/pull/33202) fix(open-api): Add missing FormatQueryPayloadSchema and DashboardScreenshotPostSchema to open-api component schemas (@dogfootruler-kr)
|
||||
- [#32405](https://github.com/apache/superset/pull/32405) fix(daos/tag): prevent non-unique tags getting created along with unique ones (@hainenber)
|
||||
- [#21083](https://github.com/apache/superset/pull/21083) fix(install): set SUPERSET_VERSION_RC at the right time (@Joel-Haeberli)
|
||||
- [#34645](https://github.com/apache/superset/pull/34645) fix(webpack): webpack warnings (@gabotorresruiz)
|
||||
- [#34005](https://github.com/apache/superset/pull/34005) fix: update Russian translations (@PolinaFam)
|
||||
- [#34644](https://github.com/apache/superset/pull/34644) fix: Fix Slice import on has_drill_by_access (@Vitor-Avila)
|
||||
- [#34641](https://github.com/apache/superset/pull/34641) fix: Slack channels and Color Palettes search (@Vitor-Avila)
|
||||
- [#34584](https://github.com/apache/superset/pull/34584) fix(initialization): prevent startup failures when database tables don't exist (@eschutho)
|
||||
- [#34625](https://github.com/apache/superset/pull/34625) fix: Remove deprecated @types/classnames package (@rusackas)
|
||||
- [#34602](https://github.com/apache/superset/pull/34602) fix(Dashboards): Tabs highlight and dataset contrast in darkmode issues (@rebenitez1802)
|
||||
- [#34620](https://github.com/apache/superset/pull/34620) fix: Use labels in Drill to Detail (@Vitor-Avila)
|
||||
- [#34636](https://github.com/apache/superset/pull/34636) fix(DatabaseModal): Don't set activeKey to undefined repeatedly (@msyavuz)
|
||||
- [#33843](https://github.com/apache/superset/pull/33843) fix: Reset description height to zero when chart is not expanded (@abhinav-1305)
|
||||
- [#34239](https://github.com/apache/superset/pull/34239) fix(Heatmap): addin x axis label rotation (@SBIN2010)
|
||||
- [#34598](https://github.com/apache/superset/pull/34598) fix(db_engine_specs): generate correct boolean filter SQL syntax for Athena compatibility (@oscep)
|
||||
- [#34582](https://github.com/apache/superset/pull/34582) fix(Timeshift): Determine temporal column correctly (@msyavuz)
|
||||
- [#34175](https://github.com/apache/superset/pull/34175) fix(Table chart): fix percentage metric column (@LevisNgigi)
|
||||
- [#34508](https://github.com/apache/superset/pull/34508) fix: update copy text for better capitalization and abbreviation standards (@yousoph)
|
||||
- [#34507](https://github.com/apache/superset/pull/34507) fix(theming): More theming bugs/regressions (@msyavuz)
|
||||
- [#34545](https://github.com/apache/superset/pull/34545) fix: Avoid null `scrollLeft` in `VirtualTable` (@Vitor-Avila)
|
||||
- [#34528](https://github.com/apache/superset/pull/34528) fix(explore): Fix missing await for async buildV1ChartDataPayload calls (@mistercrunch)
|
||||
- [#34512](https://github.com/apache/superset/pull/34512) fix(sqllab): prevent strings with angle brackets from being hidden (@rusackas)
|
||||
- [#34520](https://github.com/apache/superset/pull/34520) fix: docs eslint command (@villebro)
|
||||
- [#34438](https://github.com/apache/superset/pull/34438) fix: Update table chart configuration labels to sentence case (@yousoph)
|
||||
- [#34435](https://github.com/apache/superset/pull/34435) fix(pie chart): Total now positioned correctly with all Legend positions, and respects theming (@rusackas)
|
||||
- [#34436](https://github.com/apache/superset/pull/34436) fix(echarts): resolve bar chart X-axis time formatting stuck on adaptive (@rusackas)
|
||||
- [#34424](https://github.com/apache/superset/pull/34424) fix(theming): Visual bugs p-3 (@msyavuz)
|
||||
- [#34431](https://github.com/apache/superset/pull/34431) fix: time grain and DB dropdowns (@betodealmeida)
|
||||
- [#34137](https://github.com/apache/superset/pull/34137) fix(dashboard): adds dependent filter select first value fixes (@ObservabilityTeam)
|
||||
- [#34433](https://github.com/apache/superset/pull/34433) fix(migrations): prevent theme seeding before themes table exists (@mistercrunch)
|
||||
- [#34412](https://github.com/apache/superset/pull/34412) fix: prevent anonymous code in Postgres (@betodealmeida)
|
||||
- [#31495](https://github.com/apache/superset/pull/31495) fix(sunburst): Fix sunburst chart cross-filter logic (@gerbermichi)
|
||||
- [#34389](https://github.com/apache/superset/pull/34389) fix(theme-list): reorder buttons to place import leftmost (@mistercrunch)
|
||||
- [#34178](https://github.com/apache/superset/pull/34178) fix: Console errors from various sources (@msyavuz)
|
||||
- [#34390](https://github.com/apache/superset/pull/34390) fix(charts): Fix unquoted 'Others' literal in series limit GROUP BY clause (@mistercrunch)
|
||||
- [#34296](https://github.com/apache/superset/pull/34296) fix(big number with trendline): running 2 identical queries for no good reason (@mistercrunch)
|
||||
- [#34381](https://github.com/apache/superset/pull/34381) fix: rate limiting issues with example data hosted on github.com (@mistercrunch)
|
||||
- [#34339](https://github.com/apache/superset/pull/34339) fix: prevent theme initialization errors during fresh installs (@mistercrunch)
|
||||
- [#34360](https://github.com/apache/superset/pull/34360) fix: use catalog name on generated queries (@betodealmeida)
|
||||
- [#34374](https://github.com/apache/superset/pull/34374) fix: subquery alias in RLS (@betodealmeida)
|
||||
- [#34351](https://github.com/apache/superset/pull/34351) fix(PivotTable): Render html in cells if allowRenderHtml is true (@msyavuz)
|
||||
- [#34318](https://github.com/apache/superset/pull/34318) fix(NavBar): Add brand text back (@geido)
|
||||
- [#34268](https://github.com/apache/superset/pull/34268) fix(cartodiagram): add missing locales for rendering echarts (@jansule)
|
||||
- [#34305](https://github.com/apache/superset/pull/34305) fix(npm): more reliable execution of `npm run update-maps` (@rusackas)
|
||||
- [#34300](https://github.com/apache/superset/pull/34300) fix: preserve correct column order when table layout is changed with time comparison enabled (@payose)
|
||||
- [#33084](https://github.com/apache/superset/pull/33084) fix: enhance disallowed SQL functions list for improved security (@sha174n)
|
||||
- [#34303](https://github.com/apache/superset/pull/34303) fix: return 422 on invalid SQL (@betodealmeida)
|
||||
- [#34237](https://github.com/apache/superset/pull/34237) fix(theming): Fix visual regressions from theming P7 (@EnxDev)
|
||||
- [#34299](https://github.com/apache/superset/pull/34299) fix: address numerous long-standing console errors (python & web) (@mistercrunch)
|
||||
- [#34293](https://github.com/apache/superset/pull/34293) fix: Hide View in SQL Lab for users without access (@Vitor-Avila)
|
||||
- [#34233](https://github.com/apache/superset/pull/34233) fix(chart-download): ensure full table or handlebar chart is captured in image export (@fardin-developer)
|
||||
- [#34213](https://github.com/apache/superset/pull/34213) fix(charting): correctly categorize numeric columns with NULL values (@LisaHusband)
|
||||
- [#34235](https://github.com/apache/superset/pull/34235) fix(sqllab_export): manually encode CSV output to support utf-8-sig (@Habeeb556)
|
||||
- [#34275](https://github.com/apache/superset/pull/34275) fix: fix the pre-commit hook for tsc (@mistercrunch)
|
||||
- [#34244](https://github.com/apache/superset/pull/34244) fix(deckgl): fix deck.gl color breakpoints Control (@DamianPendrak)
|
||||
- [#34279](https://github.com/apache/superset/pull/34279) fix(theming): Visual regressions p2 (@msyavuz)
|
||||
- [#34253](https://github.com/apache/superset/pull/34253) fix(theming): Theming visual fixes (@msyavuz)
|
||||
- [#34272](https://github.com/apache/superset/pull/34272) fix: build issues on master with 'npm run dev' (@mistercrunch)
|
||||
- [#34259](https://github.com/apache/superset/pull/34259) fix: Missing ownState and isCached props in Chart.jsx (@kgabryje)
|
||||
- [#34126](https://github.com/apache/superset/pull/34126) fix: database model Collapse state (@SBIN2010)
|
||||
- [#34193](https://github.com/apache/superset/pull/34193) fix: bug when updating dashboard (@SBIN2010)
|
||||
- [#34224](https://github.com/apache/superset/pull/34224) fix(Chart): Calculate chart height correctly (@msyavuz)
|
||||
- [#34229](https://github.com/apache/superset/pull/34229) fix(theming): World map tooltip color (@msyavuz)
|
||||
- [#34199](https://github.com/apache/superset/pull/34199) fix: proper handling of boolean filters with snowflake (@mistercrunch)
|
||||
- [#33933](https://github.com/apache/superset/pull/33933) fix(dashboard): Fix subitem selection on dashboard download menu (@tahvane1)
|
||||
- [#34218](https://github.com/apache/superset/pull/34218) fix(theming): Superset theme configurations correctly applying to charts (@gabotorresruiz)
|
||||
- [#34192](https://github.com/apache/superset/pull/34192) fix: dataset endpoint `/rowlevelsecurity/related/tables` doesn't apply filters as expected (@mistercrunch)
|
||||
- [#33450](https://github.com/apache/superset/pull/33450) fix(chart): update geographical info for latvia (@eriks47)
|
||||
- [#34188](https://github.com/apache/superset/pull/34188) fix(theming): Remove leftover antd5 prefix (@msyavuz)
|
||||
- [#34181](https://github.com/apache/superset/pull/34181) fix(sqllab): database ID (@betodealmeida)
|
||||
- [#34180](https://github.com/apache/superset/pull/34180) fix(databricks): string escaper (@betodealmeida)
|
||||
- [#33955](https://github.com/apache/superset/pull/33955) fix(sqllab): pass DB id instead of name (@betodealmeida)
|
||||
- [#34171](https://github.com/apache/superset/pull/34171) fix(DrillBy): make drill by work with multi metric charts (@msyavuz)
|
||||
- [#34147](https://github.com/apache/superset/pull/34147) fix: adding and removing tags does not work in control panel properties modal (@SBIN2010)
|
||||
- [#34118](https://github.com/apache/superset/pull/34118) fix: frontend translation framework crashes on string errors (@mistercrunch)
|
||||
- [#34153](https://github.com/apache/superset/pull/34153) fix(dataset): trigger `onChange` when switching to physical dataset to clear SQL (@ongdisheng)
|
||||
- [#34112](https://github.com/apache/superset/pull/34112) fix(DatabaseModal): Resolve Connect button issue for SQLAlchemy URI database connections (@EnxDev)
|
||||
- [#34127](https://github.com/apache/superset/pull/34127) fix: Apply metric d3format when currency config is {} for table charts (@Vitor-Avila)
|
||||
- [#33974](https://github.com/apache/superset/pull/33974) fix(i18n): Update Japanese translations (@aikawa-ohno)
|
||||
- [#34114](https://github.com/apache/superset/pull/34114) fix(screenshots): Change default for `SCREENSHOT_PLAYWRIGHT_WAIT_EVENT` to `domcontentloaded` (@rusackas)
|
||||
- [#34115](https://github.com/apache/superset/pull/34115) fix: make flask-cors a core dependency (@mistercrunch)
|
||||
- [#34108](https://github.com/apache/superset/pull/34108) fix: improve login page placement and width (@mistercrunch)
|
||||
- [#34113](https://github.com/apache/superset/pull/34113) fix(UI): Adjust background color for Dashboard, Tabs, and ListView component (@EnxDev)
|
||||
- [#32734](https://github.com/apache/superset/pull/32734) fix: upload data model Collapse state (@SBIN2010)
|
||||
- [#34103](https://github.com/apache/superset/pull/34103) fix(deps): Revert "chore(deps): update @deck.gl/aggregation-layers requirement from ^9.0.38 to ^9.1.12 in /superset-frontend/plugins/legacy-preset-chart-deckgl" (@DamianPendrak)
|
||||
- [#34098](https://github.com/apache/superset/pull/34098) fix: Apply metric d3format from dataset when currency config is {} (@Vitor-Avila)
|
||||
- [#34049](https://github.com/apache/superset/pull/34049) fix(translations): Fix language switching behavior when default language is not English (@PolinaFam)
|
||||
- [#34090](https://github.com/apache/superset/pull/34090) fix(deps) : Revert "chore(deps-dev): bump webpack-dev-server from 4.15.2 to 5.2.1 (@msyavuz)
|
||||
- [#34080](https://github.com/apache/superset/pull/34080) fix: Support metric currency as dict during import (@Vitor-Avila)
|
||||
- [#34014](https://github.com/apache/superset/pull/34014) fix(Table): Allow timeshifts to be overriden (@msyavuz)
|
||||
- [#34066](https://github.com/apache/superset/pull/34066) fix(styles): Remove custom z-indexes (@msyavuz)
|
||||
- [#33954](https://github.com/apache/superset/pull/33954) fix(chart controls): remove duplicated descriptions for chart controls (@Quatters)
|
||||
- [#34031](https://github.com/apache/superset/pull/34031) fix(styling): various minor visual tweaks and adjustments (@mistercrunch)
|
||||
- [#33971](https://github.com/apache/superset/pull/33971) fix(dashboard): prevent crash on invalid CSS selectors in CSS templates (@HarshithGamini)
|
||||
- [#33958](https://github.com/apache/superset/pull/33958) fix: Dashboard native filter fixes (@Vitor-Avila)
|
||||
- [#34016](https://github.com/apache/superset/pull/34016) fix(handlebars): remove serverPaginationControlSetRow from control pa… (@LisaHusband)
|
||||
- [#33977](https://github.com/apache/superset/pull/33977) fix(explore): Change dataset icon on explore to match datasets view (@xavier-GitHub76)
|
||||
- [#33949](https://github.com/apache/superset/pull/33949) fix: Theme logo links to external superset site (@martimors)
|
||||
- [#33939](https://github.com/apache/superset/pull/33939) fix(dremio): apply same fix as for drill to solve alias ambiguity (@mistercrunch)
|
||||
- [#33942](https://github.com/apache/superset/pull/33942) fix(rls): removing unnecessary wrapper (@lohart13)
|
||||
- [#32849](https://github.com/apache/superset/pull/32849) fix(plugin-chart-echarts): correct label position for Negative Values bar chart (@SBIN2010)
|
||||
- [#32857](https://github.com/apache/superset/pull/32857) fix: add suffix to Drill labels to avoid collision (@fhyy)
|
||||
- [#33916](https://github.com/apache/superset/pull/33916) fix: Consider default catalog when getting tables and view lists (@Vitor-Avila)
|
||||
- [#33923](https://github.com/apache/superset/pull/33923) fix(fe/user_info): resolve visual oddities in User Info page (@hainenber)
|
||||
- [#33898](https://github.com/apache/superset/pull/33898) fix(theming): Fix visual regressions from theming P6 (@EnxDev)
|
||||
- [#33846](https://github.com/apache/superset/pull/33846) fix: Correct state handling in CSS Template modal (@abhinav-1305)
|
||||
- [#33826](https://github.com/apache/superset/pull/33826) fix(DatabaseModal): Improve database modal validation and fix visual Issues (@EnxDev)
|
||||
- [#33834](https://github.com/apache/superset/pull/33834) fix(native filters): Make the Apply button available after click on Clear All (@Vitor-Avila)
|
||||
- [#33833](https://github.com/apache/superset/pull/33833) fix(api): Added uuid as a valid search column (@withnale)
|
||||
- [#33867](https://github.com/apache/superset/pull/33867) fix(logo): fix logo url typo (@LevisNgigi)
|
||||
- [#33849](https://github.com/apache/superset/pull/33849) fix: sqlglot linter (@betodealmeida)
|
||||
- [#33764](https://github.com/apache/superset/pull/33764) fix: use risingwave as the sqlalchemy_uri_placeholder prefix for RisingWave engine (@hzxa21)
|
||||
- [#33830](https://github.com/apache/superset/pull/33830) fix: Consider last data point for Big Number comparison lag (@Vitor-Avila)
|
||||
- [#33821](https://github.com/apache/superset/pull/33821) fix: Set time filter's isExtra to false when saving as new chart (@Vitor-Avila)
|
||||
- [#28737](https://github.com/apache/superset/pull/28737) fix: ensure numeric values for extra metadata_cache_timeout payloads (@kidusmakonnen)
|
||||
- [#33763](https://github.com/apache/superset/pull/33763) fix: select star (@betodealmeida)
|
||||
- [#33673](https://github.com/apache/superset/pull/33673) fix: clarify GUEST_TOKEN_JWT_AUDIENCE usage in the SDK (@schollz)
|
||||
- [#33694](https://github.com/apache/superset/pull/33694) fix(chart): set tab name as chart name (@anthonyhungnguyen)
|
||||
- [#33727](https://github.com/apache/superset/pull/33727) fix: typo in SQL dialect map (@betodealmeida)
|
||||
- [#33700](https://github.com/apache/superset/pull/33700) fix(compose): environment entries in compose*.yml override values in docker/.env (@denodo-research-labs)
|
||||
- [#33693](https://github.com/apache/superset/pull/33693) fix: Do not convert dataset changed_on to UTC (@Vitor-Avila)
|
||||
- [#33679](https://github.com/apache/superset/pull/33679) fix: optimize catalog permission sync when importing dashboards (@arafoperata)
|
||||
- [#33626](https://github.com/apache/superset/pull/33626) fix: Update dataset's last modified date from column/metric update (@Vitor-Avila)
|
||||
- [#33195](https://github.com/apache/superset/pull/33195) fix(sqllab): save datasets with template parameters (@ethan-l-geotab)
|
||||
- [#33577](https://github.com/apache/superset/pull/33577) fix(Security): Apply permissions to the AllEntities list/get_objects API endpoint (@Vitor-Avila)
|
||||
- [#33519](https://github.com/apache/superset/pull/33519) fix: add query identifier to legend items in mixed time series charts (@fardin-developer)
|
||||
- [#33407](https://github.com/apache/superset/pull/33407) fix(big number with trendline): add None option to the aggregation method dropdown (@LevisNgigi)
|
||||
- [#33586](https://github.com/apache/superset/pull/33586) fix: correct typos (@castodius)
|
||||
- [#33559](https://github.com/apache/superset/pull/33559) fix(Radar): Radar chart normalisation (@amaannawab923)
|
||||
- [#33516](https://github.com/apache/superset/pull/33516) fix: text => JSON migration util (@betodealmeida)
|
||||
- [#33543](https://github.com/apache/superset/pull/33543) fix(Select): Add buttonStyle prop for backward compatibility (@geido)
|
||||
- [#33521](https://github.com/apache/superset/pull/33521) fix(CI): adding explicit allowable licenses for python dependencies (@rusackas)
|
||||
- [#33501](https://github.com/apache/superset/pull/33501) fix: optimize Explore popovers rendering (@mistercrunch)
|
||||
- [#33494](https://github.com/apache/superset/pull/33494) fix(table): table ui fixes (@amaannawab923)
|
||||
- [#33475](https://github.com/apache/superset/pull/33475) fix(dependabot): adds required schedule to uv updates (@rusackas)
|
||||
- [#33467](https://github.com/apache/superset/pull/33467) fix(NativeFilters): Apply existing values (@geido)
|
||||
- [#33412](https://github.com/apache/superset/pull/33412) fix: loading examples in CI returns http error "too many requests" (@mistercrunch)
|
||||
- [#33356](https://github.com/apache/superset/pull/33356) fix(embedded): handle SUPERSET_APP_ROOT in embedded dashboard URLs (@irodriguez-nebustream)
|
||||
- [#33384](https://github.com/apache/superset/pull/33384) fix: Persist catalog change during dataset update + validation fixes (@Vitor-Avila)
|
||||
- [#33271](https://github.com/apache/superset/pull/33271) fix: Exclude Filter Values (@amaannawab923)
|
||||
- [#33363](https://github.com/apache/superset/pull/33363) fix: bump FAB to 4.6.3 (@dpgaspar)
|
||||
- [#33338](https://github.com/apache/superset/pull/33338) fix: show only filterable columns on filter dropdown (@betodealmeida)
|
||||
- [#33254](https://github.com/apache/superset/pull/33254) fix: `Unexpected input(s) 'depth'` CI warnings (@hamirmahal)
|
||||
- [#33196](https://github.com/apache/superset/pull/33196) fix(chart): Restore subheader used in bignumber with trendline (@LevisNgigi)
|
||||
- [#33205](https://github.com/apache/superset/pull/33205) fix(Native Filters): Keep default filter values when configuring creatable behavior (@geido)
|
||||
- [#33205](https://github.com/apache/superset/pull/33205) fix(Native Filters): Keep default filter values when configuring creatable behavior (@geido)
|
||||
- [#33172](https://github.com/apache/superset/pull/33172) fix: subheader should show as subtitle (@eschutho)
|
||||
- [#33142](https://github.com/apache/superset/pull/33142) fix: add folders to import schema (@eschutho)
|
||||
- [#33141](https://github.com/apache/superset/pull/33141) fix: app icon should not use subdirectory (@eschutho)
|
||||
- [#33126](https://github.com/apache/superset/pull/33126) fix(plugin-chart-table): Don't render redundant items in column config when time comparison is enabled (@kgabryje)
|
||||
- [#33124](https://github.com/apache/superset/pull/33124) fix: `master` builds are failing while trying to push report to cypress (@mistercrunch)
|
||||
- [#33100](https://github.com/apache/superset/pull/33100) fix(OAuth2): Update connection should not fail if connection is missing OAuth2 token (@Vitor-Avila)
|
||||
- [#33114](https://github.com/apache/superset/pull/33114) fix: Broken menu links to datasets and sql lab (@kgabryje)
|
||||
- [#33092](https://github.com/apache/superset/pull/33092) fix: CI file change detector to handle large PRs (@mistercrunch)
|
||||
- [#33095](https://github.com/apache/superset/pull/33095) fix: Broken Python tests on master after merging prefix branch (@martyngigg)
|
||||
- [#33063](https://github.com/apache/superset/pull/33063) fix(docs): Update quickstart.mdx to reflect latest version tag (@clayheaton)
|
||||
- [#33060](https://github.com/apache/superset/pull/33060) fix(list roles): dont send invalid querystrings (@landryb)
|
||||
- [#32990](https://github.com/apache/superset/pull/32990) fix(frontend): add missing antd-5 icon to import (@trentlavoie)
|
||||
- [#32866](https://github.com/apache/superset/pull/32866) fix: make packages PEP 625 compliant (@sadpandajoe)
|
||||
- [#32848](https://github.com/apache/superset/pull/32848) fix: Bump FAB to 4.6.1 (@michael-s-molina)
|
||||
- [#32801](https://github.com/apache/superset/pull/32801) fix(docs): scrollable table of content right bar in Superset docs (@hainenber)
|
||||
- [#32732](https://github.com/apache/superset/pull/32732) fix(asf): Revert "Revert "fix(asf): moving notifications to the top of `.asf.yaml`"" (@rusackas)
|
||||
- [#32730](https://github.com/apache/superset/pull/32730) fix(asf): Revert "fix(asf): moving notifications to the top of `.asf.yaml`" (@rusackas)
|
||||
- [#32728](https://github.com/apache/superset/pull/32728) fix(docs): Another CSP hole for run.app to allow Kapa AI (@rusackas)
|
||||
- [#32727](https://github.com/apache/superset/pull/32727) fix(docs): poking ANOTHER hole in the CSP for the AI bot. (@rusackas)
|
||||
- [#32726](https://github.com/apache/superset/pull/32726) fix(asf): moving notifications to the top of `.asf.yaml` (@rusackas)
|
||||
- [#32724](https://github.com/apache/superset/pull/32724) fix(docs): allow recaptcha in CSP (@rusackas)
|
||||
- [#32713](https://github.com/apache/superset/pull/32713) fix(docs): Fixes scrolling issue with AI widget on docs site (@rusackas)
|
||||
- [#32703](https://github.com/apache/superset/pull/32703) fix(repo): re-enable GitHub Discussions (@rusackas)
|
||||
- [#32704](https://github.com/apache/superset/pull/32704) fix(docs): poking a CSP hole for Kapa AI widget (@rusackas)
|
||||
- [#32571](https://github.com/apache/superset/pull/32571) fix(no-restricted-imports): Fix overrides and include no-fa-icons-usage (@geido)
|
||||
- [#32658](https://github.com/apache/superset/pull/32658) fix(sync perms): Avoid UnboundLocalError during perm sync for DBs that don't support catalogs (@Vitor-Avila)
|
||||
- [#32381](https://github.com/apache/superset/pull/32381) fix(sqllab): Grid header menu (@justinpark)
|
||||
- [#32553](https://github.com/apache/superset/pull/32553) fix(comp/async-ace-editor): proper import of `ace-builds` (@hainenber)
|
||||
- [#32525](https://github.com/apache/superset/pull/32525) fix: always extract query source from request (@villebro)
|
||||
- [#32481](https://github.com/apache/superset/pull/32481) fix(docker compose): replace port 8088 with 9000 (@jpchev)
|
||||
- [#32401](https://github.com/apache/superset/pull/32401) fix: prevent nested transactions (@betodealmeida)
|
||||
- [#32377](https://github.com/apache/superset/pull/32377) fix: ephemeral CI fetching task ENI (@dpgaspar)
|
||||
- [#32333](https://github.com/apache/superset/pull/32333) fix(eslint-hook): ensure eslint hook receives arguments (@alveifbklsiu259)
|
||||
- [#32274](https://github.com/apache/superset/pull/32274) fix(sec): resolve Dependabot security alerts (@hainenber)
|
||||
- [#32018](https://github.com/apache/superset/pull/32018) fix: false negative on critical security related to eslint-plugin-translation-vars (@mistercrunch)
|
||||
|
||||
**Others**
|
||||
|
||||
- [#35176](https://github.com/apache/superset/pull/35176) chore: bump sqlglot to 27.15.2 (@betodealmeida)
|
||||
- [#34838](https://github.com/apache/superset/pull/34838) chore: bump FAB to 4.8.1 (@dpgaspar)
|
||||
- [#34800](https://github.com/apache/superset/pull/34800) chore: Add instruction for LLMs to use antd theme tokens (@kgabryje)
|
||||
- [#34693](https://github.com/apache/superset/pull/34693) chore(deps): downgrade pyarrow to v16 (@drummerwolli)
|
||||
- [#34701](https://github.com/apache/superset/pull/34701) docs: CVEs added to 5.0.0 and 4.1.3 documentation (@sha174n)
|
||||
- [#34606](https://github.com/apache/superset/pull/34606) refactor: Migrate ExploreChartPanel to typescript (@justinpark)
|
||||
- [#32663](https://github.com/apache/superset/pull/32663) chore: add more csv tests (@eschutho)
|
||||
- [#34653](https://github.com/apache/superset/pull/34653) chore: Increase memory limit on webpack ts checker plugin (@kgabryje)
|
||||
- [#34460](https://github.com/apache/superset/pull/34460) chore(deps-dev): bump eslint-import-resolver-typescript from 3.7.0 to 4.4.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#34581](https://github.com/apache/superset/pull/34581) chore(deps): bump tmp from 0.2.1 to 0.2.4 in /superset-frontend/cypress-base (@dependabot[bot])
|
||||
- [#34646](https://github.com/apache/superset/pull/34646) chore(deps): bump tmp and inquirer in /superset-frontend (@dependabot[bot])
|
||||
- [#34536](https://github.com/apache/superset/pull/34536) chore: Refactor Menu.Item and cleanup console errors (@geido)
|
||||
- [#34481](https://github.com/apache/superset/pull/34481) chore(deps): bump googleapis from 130.0.0 to 154.1.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34442](https://github.com/apache/superset/pull/34442) chore: add tests to DatabaseConnectionForm/EncryptedField (@sadpandajoe)
|
||||
- [#34450](https://github.com/apache/superset/pull/34450) chore(deps): bump ws and @types/ws in /superset-websocket (@dependabot[bot])
|
||||
- [#34448](https://github.com/apache/superset/pull/34448) chore(deps-dev): bump @types/node from 22.10.3 to 24.1.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#33889](https://github.com/apache/superset/pull/33889) chore(helm): bump app version to 5.0.0 (@brandon-kaplan)
|
||||
- [#34452](https://github.com/apache/superset/pull/34452) chore(deps-dev): bump globals from 16.0.0 to 16.3.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#34453](https://github.com/apache/superset/pull/34453) chore(deps): update re-resizable requirement from ^6.10.1 to ^6.11.2 in /superset-frontend/packages/superset-ui-core (@dependabot[bot])
|
||||
- [#34468](https://github.com/apache/superset/pull/34468) chore(deps): update @deck.gl/aggregation-layers requirement from ^9.1.13 to ^9.1.14 in /superset-frontend/plugins/legacy-preset-chart-deckgl (@dependabot[bot])
|
||||
- [#34464](https://github.com/apache/superset/pull/34464) chore(deps-dev): bump @babel/runtime-corejs3 from 7.26.7 to 7.28.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#34462](https://github.com/apache/superset/pull/34462) chore(deps-dev): update jest requirement from ^30.0.4 to ^30.0.5 in /superset-frontend/plugins/plugin-chart-pivot-table (@dependabot[bot])
|
||||
- [#34451](https://github.com/apache/superset/pull/34451) chore(deps-dev): update @types/prop-types requirement from ^15.7.2 to ^15.7.15 in /superset-frontend/packages/superset-ui-core (@dependabot[bot])
|
||||
- [#34457](https://github.com/apache/superset/pull/34457) chore(deps-dev): update jest requirement from ^30.0.4 to ^30.0.5 in /superset-frontend/packages/generator-superset (@dependabot[bot])
|
||||
- [#34461](https://github.com/apache/superset/pull/34461) chore(deps): bump @deck.gl/react from 9.1.13 to 9.1.14 in /superset-frontend (@dependabot[bot])
|
||||
- [#34501](https://github.com/apache/superset/pull/34501) chore(deps-dev): update jest requirement from ^30.0.4 to ^30.0.5 in /superset-frontend/plugins/plugin-chart-handlebars (@dependabot[bot])
|
||||
- [#34472](https://github.com/apache/superset/pull/34472) chore(deps): bump @babel/runtime from 7.26.10 to 7.28.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#34454](https://github.com/apache/superset/pull/34454) chore(deps-dev): bump eslint-config-prettier from 10.1.5 to 10.1.8 in /superset-websocket (@dependabot[bot])
|
||||
- [#34474](https://github.com/apache/superset/pull/34474) chore(deps): bump react-draggable from 4.4.6 to 4.5.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34483](https://github.com/apache/superset/pull/34483) chore(deps): bump react-lines-ellipsis from 0.15.4 to 0.16.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#34492](https://github.com/apache/superset/pull/34492) chore(deps-dev): bump eslint from 9.31.0 to 9.32.0 in /docs (@dependabot[bot])
|
||||
- [#34493](https://github.com/apache/superset/pull/34493) chore(deps-dev): bump typescript-eslint from 8.37.0 to 8.38.0 in /docs (@dependabot[bot])
|
||||
- [#34502](https://github.com/apache/superset/pull/34502) chore(deps): update react requirement from ^19.1.0 to ^19.1.1 in /superset-frontend/plugins/legacy-plugin-chart-chord (@dependabot[bot])
|
||||
- [#34487](https://github.com/apache/superset/pull/34487) chore(deps): bump @rjsf/validator-ajv8 from 5.24.9 to 5.24.12 in /superset-frontend (@dependabot[bot])
|
||||
- [#34489](https://github.com/apache/superset/pull/34489) chore(deps-dev): bump @babel/preset-react from 7.26.3 to 7.27.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#34496](https://github.com/apache/superset/pull/34496) chore(deps-dev): bump eslint-plugin-prettier from 5.5.1 to 5.5.3 in /docs (@dependabot[bot])
|
||||
- [#34544](https://github.com/apache/superset/pull/34544) chore: Rename dataset creation buttons (@Vitor-Avila)
|
||||
- [#34515](https://github.com/apache/superset/pull/34515) chore(core): Add drawer to core ui components (@justinpark)
|
||||
- [#34444](https://github.com/apache/superset/pull/34444) chore(deps): update gh-pages requirement from ^6.2.0 to ^6.3.0 in /superset-frontend/packages/superset-ui-demo (@dependabot[bot])
|
||||
- [#34478](https://github.com/apache/superset/pull/34478) chore(deps-dev): bump @types/classnames from 2.3.0 to 2.3.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#34482](https://github.com/apache/superset/pull/34482) chore(deps): bump dom-to-image-more from 3.5.0 to 3.6.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34480](https://github.com/apache/superset/pull/34480) chore(deps): bump @deck.gl/core from 9.1.13 to 9.1.14 in /superset-frontend (@dependabot[bot])
|
||||
- [#34484](https://github.com/apache/superset/pull/34484) chore(deps-dev): bump tsx from 4.19.4 to 4.20.3 in /superset-frontend (@dependabot[bot])
|
||||
- [#34485](https://github.com/apache/superset/pull/34485) chore(deps-dev): bump @babel/compat-data from 7.27.2 to 7.28.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34494](https://github.com/apache/superset/pull/34494) chore(deps): bump less from 4.3.0 to 4.4.0 in /docs (@dependabot[bot])
|
||||
- [#34495](https://github.com/apache/superset/pull/34495) chore(deps): bump antd from 5.26.3 to 5.26.7 in /docs (@dependabot[bot])
|
||||
- [#34497](https://github.com/apache/superset/pull/34497) chore(deps-dev): bump @eslint/js from 9.31.0 to 9.32.0 in /docs (@dependabot[bot])
|
||||
- [#34498](https://github.com/apache/superset/pull/34498) chore(deps): bump swagger-ui-react from 5.26.0 to 5.27.1 in /docs (@dependabot[bot])
|
||||
- [#34499](https://github.com/apache/superset/pull/34499) chore(deps-dev): bump eslint-config-prettier from 10.1.5 to 10.1.8 in /docs (@dependabot[bot])
|
||||
- [#34500](https://github.com/apache/superset/pull/34500) chore(deps-dev): bump webpack from 5.99.9 to 5.101.0 in /docs (@dependabot[bot])
|
||||
- [#34459](https://github.com/apache/superset/pull/34459) chore(deps): bump actions/first-interaction from 1 to 2 (@dependabot[bot])
|
||||
- [#34393](https://github.com/apache/superset/pull/34393) chore: update chart list e2e and component tests (@sadpandajoe)
|
||||
- [#34039](https://github.com/apache/superset/pull/34039) chore(deps-dev): update jest requirement from ^30.0.2 to ^30.0.4 in /superset-frontend/packages/generator-superset (@dependabot[bot])
|
||||
- [#34432](https://github.com/apache/superset/pull/34432) chore: Change button labels to sentence case (@kasiazjc)
|
||||
- [#34429](https://github.com/apache/superset/pull/34429) chore: Add bottom border to top navigation menu (@kasiazjc)
|
||||
- [#30119](https://github.com/apache/superset/pull/30119) build(deps): bump reselect from 4.1.7 to 5.1.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#31534](https://github.com/apache/superset/pull/31534) chore(deps): bump d3-scale from 3.3.0 to 4.0.2 in /superset-frontend/packages/superset-ui-core (@dependabot[bot])
|
||||
- [#34391](https://github.com/apache/superset/pull/34391) docs(development): fix comment in the dockerfile (@harikirank)
|
||||
- [#34387](https://github.com/apache/superset/pull/34387) docs(development): fix typo in the dockerfile (@harikirank)
|
||||
- [#34335](https://github.com/apache/superset/pull/34335) chore(deps): bump cookie and @types/cookie in /superset-websocket (@dependabot[bot])
|
||||
- [#34326](https://github.com/apache/superset/pull/34326) build(deps): update `ag-grid` to non-breaking major v34 (@hainenber)
|
||||
- [#34341](https://github.com/apache/superset/pull/34341) docs(development): fix 2 typos in the dockerfile (@harikirank)
|
||||
- [#34371](https://github.com/apache/superset/pull/34371) chore: bump BigQuery dialect to 1.15.0 (@betodealmeida)
|
||||
- [#34317](https://github.com/apache/superset/pull/34317) style(FastVizSwitcher): Adjust padding for FastVizSwitcher selector (@EnxDev)
|
||||
- [#34311](https://github.com/apache/superset/pull/34311) style(chart): restyle table pagination (@imcewen02)
|
||||
- [#34302](https://github.com/apache/superset/pull/34302) chore: bump sqlglot to latest version (27.3.0) (@betodealmeida)
|
||||
- [#34270](https://github.com/apache/superset/pull/34270) chore: improve sqlglot parsing (@betodealmeida)
|
||||
- [#34288](https://github.com/apache/superset/pull/34288) chore: remove supposedly dev dep `html-webpack-plugin` from lockfile (@hainenber)
|
||||
- [#33997](https://github.com/apache/superset/pull/33997) chore(deps-dev): bump prettier from 3.5.3 to 3.6.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#34285](https://github.com/apache/superset/pull/34285) chore(deps): bump axios from 1.10.0 to 1.11.0 in /docs (@dependabot[bot])
|
||||
- [#34067](https://github.com/apache/superset/pull/34067) style(Button): Vertically align icons across all buttons (@EnxDev)
|
||||
- [#34146](https://github.com/apache/superset/pull/34146) chore(docker): use editable mode in docker images (@mistercrunch)
|
||||
- [#34262](https://github.com/apache/superset/pull/34262) chore(deps-dev): bump form-data from 4.0.0 to 4.0.4 in /superset-embedded-sdk (@dependabot[bot])
|
||||
- [#34263](https://github.com/apache/superset/pull/34263) chore(deps): bump form-data from 4.0.0 to 4.0.4 in /docs (@dependabot[bot])
|
||||
- [#34265](https://github.com/apache/superset/pull/34265) chore(deps): bump form-data from 4.0.1 to 4.0.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#34215](https://github.com/apache/superset/pull/34215) chore(deps): bump on-headers and morgan in /superset-websocket/utils/client-ws-app (@dependabot[bot])
|
||||
- [#34216](https://github.com/apache/superset/pull/34216) chore(deps): bump on-headers and compression in /superset-frontend (@dependabot[bot])
|
||||
- [#34217](https://github.com/apache/superset/pull/34217) chore: Updates files related to 4.1.3 release (@sadpandajoe)
|
||||
- [#33736](https://github.com/apache/superset/pull/33736) style(helm): Minor reformatting of helm chart templates (@dnskr)
|
||||
- [#34179](https://github.com/apache/superset/pull/34179) chore(Oracle): Update oracle column length to 128 (@msyavuz)
|
||||
- [#34163](https://github.com/apache/superset/pull/34163) docs(development): Fix typo in the documentation (@harikirank)
|
||||
- [#34149](https://github.com/apache/superset/pull/34149) chore(Tags): Sort tags by name if possible (@msyavuz)
|
||||
- [#34145](https://github.com/apache/superset/pull/34145) docs: remove duplicated line in `Running tests with act` section (@ongdisheng)
|
||||
- [#34125](https://github.com/apache/superset/pull/34125) build(dev-deps): clean up deprecated Babel proposal plugins (@hainenber)
|
||||
- [#34138](https://github.com/apache/superset/pull/34138) chore(deps): bump flask-cors from 4.0.2 to 6.0.0 (@dependabot[bot])
|
||||
- [#34139](https://github.com/apache/superset/pull/34139) chore: remove unnecessary disables (@betodealmeida)
|
||||
- [#33990](https://github.com/apache/superset/pull/33990) chore(deps): bump react-json-tree from 0.17.0 to 0.20.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#33486](https://github.com/apache/superset/pull/33486) chore(deps): bump react-error-boundary from 5.0.0 to 6.0.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34093](https://github.com/apache/superset/pull/34093) chore: clean up more flask/jinja html views (@mistercrunch)
|
||||
- [#34097](https://github.com/apache/superset/pull/34097) chore: Improve performance to load chart's save modal (@Vitor-Avila)
|
||||
- [#34079](https://github.com/apache/superset/pull/34079) chore: Improve performance to load the chart properties modal (@Vitor-Avila)
|
||||
- [#34104](https://github.com/apache/superset/pull/34104) chore(deps-dev): bump webpack-dev-server from 4.15.2 to 5.2.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#34057](https://github.com/apache/superset/pull/34057) chore: move auth e2e tests to component tests (@sadpandajoe)
|
||||
- [#34042](https://github.com/apache/superset/pull/34042) chore(deps): bump @fontsource/inter from 5.1.1 to 5.2.6 in /superset-frontend (@dependabot[bot])
|
||||
- [#34029](https://github.com/apache/superset/pull/34029) chore(deps): bump ioredis from 4.28.5 to 5.6.1 in /superset-websocket (@dependabot[bot])
|
||||
- [#34075](https://github.com/apache/superset/pull/34075) chore: Use select_columns on chart's dashboard filter (@Vitor-Avila)
|
||||
- [#34028](https://github.com/apache/superset/pull/34028) chore: refactor react-syntax-highlither to handle dark themes (@mistercrunch)
|
||||
- [#34056](https://github.com/apache/superset/pull/34056) chore: remove some of the deprecated theme.colors.* (@mistercrunch)
|
||||
- [#34059](https://github.com/apache/superset/pull/34059) chore(deps): bump tar-fs from 2.1.2 to 3.1.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#32928](https://github.com/apache/superset/pull/32928) chore(deps): update yeoman-generator requirement from ^7.4.0 to ^7.5.1 in /superset-frontend/packages/generator-superset (@dependabot[bot])
|
||||
- [#32949](https://github.com/apache/superset/pull/32949) chore(deps): bump react from 17.0.2 to 19.1.0 in /superset-frontend/plugins/legacy-plugin-chart-chord (@dependabot[bot])
|
||||
- [#33481](https://github.com/apache/superset/pull/33481) chore(deps-dev): update fork-ts-checker-webpack-plugin requirement from ^9.0.2 to ^9.1.0 in /superset-frontend/packages/superset-ui-demo (@dependabot[bot])
|
||||
- [#33485](https://github.com/apache/superset/pull/33485) chore(deps): update @deck.gl/aggregation-layers requirement from ^9.0.38 to ^9.1.12 in /superset-frontend/plugins/legacy-preset-chart-deckgl (@dependabot[bot])
|
||||
- [#32946](https://github.com/apache/superset/pull/32946) chore(deps-dev): bump webpack-dev-server from 4.15.2 to 5.2.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33986](https://github.com/apache/superset/pull/33986) chore(deps-dev): bump @types/jest from 29.5.14 to 30.0.0 in /superset-frontend/plugins/plugin-chart-handlebars (@dependabot[bot])
|
||||
- [#33496](https://github.com/apache/superset/pull/33496) chore(deps-dev): bump yeoman-test from 8.3.0 to 10.1.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33995](https://github.com/apache/superset/pull/33995) chore(deps): bump @storybook/addon-actions from 8.1.11 to 9.0.8 in /superset-frontend/packages/superset-ui-demo (@dependabot[bot])
|
||||
- [#32441](https://github.com/apache/superset/pull/32441) chore(deps): update @types/d3-scale requirement from ^4.0.8 to ^4.0.9 in /superset-frontend/plugins/plugin-chart-word-cloud (@dependabot[bot])
|
||||
- [#32082](https://github.com/apache/superset/pull/32082) chore(deps): update dompurify requirement from ^3.2.4 to ^3.2.6 in /superset-frontend/plugins/legacy-preset-chart-nvd3 (@dependabot[bot])
|
||||
- [#32945](https://github.com/apache/superset/pull/32945) chore(deps): bump remark-gfm from 3.0.1 to 4.0.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#32953](https://github.com/apache/superset/pull/32953) chore(deps): bump @ant-design/icons from 5.6.1 to 6.0.0 in /docs (@dependabot[bot])
|
||||
- [#32439](https://github.com/apache/superset/pull/32439) chore(deps-dev): bump typescript from 5.6.2 to 5.7.3 in /superset-websocket (@dependabot[bot])
|
||||
- [#32080](https://github.com/apache/superset/pull/32080) chore(deps-dev): update @types/lodash requirement from ^4.17.16 to ^4.17.20 in /superset-frontend/packages/superset-ui-core (@dependabot[bot])
|
||||
- [#33991](https://github.com/apache/superset/pull/33991) chore(deps-dev): bump cheerio from 1.0.0-rc.10 to 1.1.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#33989](https://github.com/apache/superset/pull/33989) chore(deps-dev): bump webpack-visualizer-plugin2 from 1.1.0 to 1.2.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#32093](https://github.com/apache/superset/pull/32093) chore(deps-dev): update fs-extra requirement from ^11.2.0 to ^11.3.0 in /superset-frontend/packages/generator-superset (@dependabot[bot])
|
||||
- [#32077](https://github.com/apache/superset/pull/32077) chore(deps): update @types/geojson requirement from ^7946.0.15 to ^7946.0.16 in /superset-frontend/plugins/legacy-preset-chart-deckgl (@dependabot[bot])
|
||||
- [#31560](https://github.com/apache/superset/pull/31560) chore(deps): bump @emotion/styled from 11.3.0 to 11.14.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34034](https://github.com/apache/superset/pull/34034) chore(deps-dev): update jest requirement from ^30.0.2 to ^30.0.4 in /superset-frontend/plugins/plugin-chart-handlebars (@dependabot[bot])
|
||||
- [#34036](https://github.com/apache/superset/pull/34036) chore(deps-dev): update jest requirement from ^30.0.2 to ^30.0.4 in /superset-frontend/plugins/plugin-chart-pivot-table (@dependabot[bot])
|
||||
- [#34037](https://github.com/apache/superset/pull/34037) chore(deps-dev): update @types/lodash requirement from ^4.17.16 to ^4.17.20 in /superset-frontend/plugins/plugin-chart-handlebars (@dependabot[bot])
|
||||
- [#34038](https://github.com/apache/superset/pull/34038) chore(deps-dev): update @babel/types requirement from ^7.26.9 to ^7.28.0 in /superset-frontend/plugins/plugin-chart-pivot-table (@dependabot[bot])
|
||||
- [#34043](https://github.com/apache/superset/pull/34043) chore(deps): bump ace-builds from 1.43.0 to 1.43.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#34008](https://github.com/apache/superset/pull/34008) chore(deps): bump mapbox-gl from 2.15.0 to 3.13.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34035](https://github.com/apache/superset/pull/34035) chore(deps-dev): bump @types/lodash from 4.17.13 to 4.17.20 in /superset-websocket (@dependabot[bot])
|
||||
- [#33992](https://github.com/apache/superset/pull/33992) chore(deps): bump @emotion/styled from 11.14.0 to 11.14.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33987](https://github.com/apache/superset/pull/33987) chore(deps-dev): bump @applitools/eyes-storybook from 3.53.4 to 3.55.6 in /superset-frontend (@dependabot[bot])
|
||||
- [#34033](https://github.com/apache/superset/pull/34033) chore(deps-dev): bump prettier from 3.4.2 to 3.6.2 in /superset-websocket (@dependabot[bot])
|
||||
- [#34041](https://github.com/apache/superset/pull/34041) chore(deps): bump swagger-ui-react from 5.25.3 to 5.26.0 in /docs (@dependabot[bot])
|
||||
- [#33979](https://github.com/apache/superset/pull/33979) build(dev-deps): upgrade Jest to major version v30 (@hainenber)
|
||||
- [#34004](https://github.com/apache/superset/pull/34004) chore(deps): bump hot-shots from 10.2.1 to 11.1.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#34003](https://github.com/apache/superset/pull/34003) chore(deps-dev): bump @docusaurus/tsconfig from 3.8.0 to 3.8.1 in /docs (@dependabot[bot])
|
||||
- [#34002](https://github.com/apache/superset/pull/34002) chore(deps): bump ace-builds from 1.41.0 to 1.43.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#34001](https://github.com/apache/superset/pull/34001) chore(deps): bump swagger-ui-react from 5.25.2 to 5.25.3 in /docs (@dependabot[bot])
|
||||
- [#34000](https://github.com/apache/superset/pull/34000) chore(deps-dev): bump eslint from 9.27.0 to 9.30.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#33985](https://github.com/apache/superset/pull/33985) chore(deps-dev): bump @babel/cli from 7.26.4 to 7.27.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#33999](https://github.com/apache/superset/pull/33999) chore(deps): bump actions/cache from 3 to 4 (@dependabot[bot])
|
||||
- [#33982](https://github.com/apache/superset/pull/33982) chore(deps): bump antd from 5.25.1 to 5.26.3 in /docs (@dependabot[bot])
|
||||
- [#33967](https://github.com/apache/superset/pull/33967) chore: replace `querystring` usage with native `URLSearchParams` API (@hainenber)
|
||||
- [#33972](https://github.com/apache/superset/pull/33972) docs: Fix typo in UPDATING.md regarding translations in version 5.0.0 (@hugo19941994)
|
||||
- [#33887](https://github.com/apache/superset/pull/33887) chore(build): refactor plugin build script to remove unused stanzas (@hainenber)
|
||||
- [#32891](https://github.com/apache/superset/pull/32891) docs: pypi-installation on Ubuntu 24.04 and statsd package for event-logging (@125m125)
|
||||
- [#33934](https://github.com/apache/superset/pull/33934) chore(translations): Update FR language (@Eric-Brison)
|
||||
- [#33927](https://github.com/apache/superset/pull/33927) build(be/deps): upgrade `urllib3` to major v2 (@hainenber)
|
||||
- [#33936](https://github.com/apache/superset/pull/33936) docs(security): add Q&A related to CVE scans to FAQ (@sfirke)
|
||||
- [#33910](https://github.com/apache/superset/pull/33910) chore(superset-embedded-sdk): bump version for theming (@msyavuz)
|
||||
- [#33909](https://github.com/apache/superset/pull/33909) style(AsyncAceEditor): make Ace gutter line color theme-aware (@EnxDev)
|
||||
- [#33872](https://github.com/apache/superset/pull/33872) chore(docs): bump references to docker image versions upon release of 5.0.0 (@sfirke)
|
||||
- [#33869](https://github.com/apache/superset/pull/33869) chore: Updates files related to 5.0.0 release (@michael-s-molina)
|
||||
- [#33868](https://github.com/apache/superset/pull/33868) build(be/deps): replace `importlib_metadata` usage with native Python 3.10+ `importlib.metadata` (@hainenber)
|
||||
- [#33854](https://github.com/apache/superset/pull/33854) build(dev-deps): update `fetch-mock` to v11 (@hainenber)
|
||||
- [#33853](https://github.com/apache/superset/pull/33853) build(deps): remove legacy browser polyfills (@hainenber)
|
||||
- [#33866](https://github.com/apache/superset/pull/33866) chore(Icons): Add UsergroupAddOutlined icon (@EnxDev)
|
||||
- [#33850](https://github.com/apache/superset/pull/33850) style(menu): Reduce bottom border width of menu item (@EnxDev)
|
||||
- [#33848](https://github.com/apache/superset/pull/33848) chore: use mysql dialect for Pinot (@betodealmeida)
|
||||
- [#33790](https://github.com/apache/superset/pull/33790) refactor: rename docker-compose files and update references (@polRk)
|
||||
- [#33670](https://github.com/apache/superset/pull/33670) docs: Update STANDARD_ROLES.md, delete 7 permissions "RowLevelSecurityFiltersModelView" (@xavier-GitHub76)
|
||||
- [#33642](https://github.com/apache/superset/pull/33642) chore(deps-dev): bump @docusaurus/module-type-aliases from 3.7.0 to 3.8.0 in /docs (@dependabot[bot])
|
||||
- [#33818](https://github.com/apache/superset/pull/33818) chore(docs): resolve 3 vulnerabilities (@hainenber)
|
||||
- [#33795](https://github.com/apache/superset/pull/33795) chore(🦾): bump python flask-caching subpackage(s) (@github-actions[bot])
|
||||
- [#33798](https://github.com/apache/superset/pull/33798) chore(🦾): bump python sqlglot 26.17.1 -> 26.28.1 (@github-actions[bot])
|
||||
- [#33792](https://github.com/apache/superset/pull/33792) chore(🦾): bump python flask-session subpackage(s) (@github-actions[bot])
|
||||
- [#33793](https://github.com/apache/superset/pull/33793) chore(🦾): bump python shillelagh subpackage(s) (@github-actions[bot])
|
||||
- [#33799](https://github.com/apache/superset/pull/33799) chore(🦾): bump python flask-wtf subpackage(s) (@github-actions[bot])
|
||||
- [#33797](https://github.com/apache/superset/pull/33797) chore(🦾): bump python flask subpackage(s) (@github-actions[bot])
|
||||
- [#33796](https://github.com/apache/superset/pull/33796) chore(🦾): bump python click 8.2.0 -> 8.2.1 (@github-actions[bot])
|
||||
- [#33800](https://github.com/apache/superset/pull/33800) chore(🦾): bump python flask-compress subpackage(s) (@github-actions[bot])
|
||||
- [#32587](https://github.com/apache/superset/pull/32587) refactor(Menu): Use items prop instead of deprecated Menu.Item HOC (@msyavuz)
|
||||
- [#26803](https://github.com/apache/superset/pull/26803) chore: add pylint rule for SQL importing (SIP-117) (@betodealmeida)
|
||||
- [#33396](https://github.com/apache/superset/pull/33396) chore(Accessibility): Improve keyboard navigation and screen access (@geido)
|
||||
- [#33767](https://github.com/apache/superset/pull/33767) chore: auto-focus modal input when deleting assets (@betodealmeida)
|
||||
- [#33696](https://github.com/apache/superset/pull/33696) chore: Convert alert and report cypress tests to component tests (@sadpandajoe)
|
||||
- [#33643](https://github.com/apache/superset/pull/33643) chore(deps-dev): bump webpack from 5.99.8 to 5.99.9 in /docs (@dependabot[bot])
|
||||
- [#33645](https://github.com/apache/superset/pull/33645) chore(deps-dev): bump @docusaurus/tsconfig from 3.7.0 to 3.8.0 in /docs (@dependabot[bot])
|
||||
- [#33650](https://github.com/apache/superset/pull/33650) chore(deps-dev): bump @typescript-eslint/parser from 8.29.0 to 8.33.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#33721](https://github.com/apache/superset/pull/33721) docs: fix typo and improve alt text in README (@lourduradjou)
|
||||
- [#33715](https://github.com/apache/superset/pull/33715) chore: delete remaining Enzyme tests (@mistercrunch)
|
||||
- [#33714](https://github.com/apache/superset/pull/33714) docs: clarify how `requirements/` should be modified (@mistercrunch)
|
||||
- [#33704](https://github.com/apache/superset/pull/33704) chore: remove unused parameter (@betodealmeida)
|
||||
- [#33701](https://github.com/apache/superset/pull/33701) chore: update sqlglot dialect map (@betodealmeida)
|
||||
- [#33661](https://github.com/apache/superset/pull/33661) chore: simplify query cleanup using dict.pop instead of suppressing exception (@dpgaspar)
|
||||
- [#33568](https://github.com/apache/superset/pull/33568) chore: 100% test coverage for SQL parsing (@betodealmeida)
|
||||
- [#33665](https://github.com/apache/superset/pull/33665) docs: add HPE to users list (@anmol-hpe)
|
||||
- [#33662](https://github.com/apache/superset/pull/33662) docs: CVE-2025-48912 added to 4.1.2 (@sha174n)
|
||||
- [#33619](https://github.com/apache/superset/pull/33619) chore: make DB syntax errors 400 (@betodealmeida)
|
||||
- [#33622](https://github.com/apache/superset/pull/33622) chore(deps-dev): bump fastify from 4.29.0 to 4.29.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33607](https://github.com/apache/superset/pull/33607) chore: bump FAB to 4.7.0 (@dpgaspar)
|
||||
- [#33474](https://github.com/apache/superset/pull/33474) chore: remove parse_sql (@betodealmeida)
|
||||
- [#33515](https://github.com/apache/superset/pull/33515) chore: sql/parse cleanup (@betodealmeida)
|
||||
- [#33567](https://github.com/apache/superset/pull/33567) chore(alerts & reports): increase Playwright timeout from 30 -> 60 seconds (@sfirke)
|
||||
- [#33566](https://github.com/apache/superset/pull/33566) docs(docker build): add more packages needed for production features (@sfirke)
|
||||
- [#33478](https://github.com/apache/superset/pull/33478) chore(deps-dev): bump eslint-config-prettier from 9.1.0 to 10.1.5 in /superset-websocket (@dependabot[bot])
|
||||
- [#33489](https://github.com/apache/superset/pull/33489) chore(deps-dev): bump babel-loader from 9.2.1 to 10.0.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#33488](https://github.com/apache/superset/pull/33488) chore(deps): bump less-loader from 11.1.4 to 12.3.0 in /docs (@dependabot[bot])
|
||||
- [#33477](https://github.com/apache/superset/pull/33477) chore(deps-dev): bump eslint from 9.17.0 to 9.27.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#33457](https://github.com/apache/superset/pull/33457) chore: remove is_select_query (@betodealmeida)
|
||||
- [#33549](https://github.com/apache/superset/pull/33549) chore: remove useless-suppression (@betodealmeida)
|
||||
- [#33539](https://github.com/apache/superset/pull/33539) chore(Icons): Additional Ant Design Icons (@geido)
|
||||
- [#33469](https://github.com/apache/superset/pull/33469) chore(fab): bumped fab from 4.6.3 to 4.6.4 (@alexandrusoare)
|
||||
- [#33498](https://github.com/apache/superset/pull/33498) chore(deps): bump ace-builds from 1.37.5 to 1.41.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#33476](https://github.com/apache/superset/pull/33476) chore(deps): bump debug from 4.4.0 to 4.4.1 in /superset-websocket/utils/client-ws-app (@dependabot[bot])
|
||||
- [#33491](https://github.com/apache/superset/pull/33491) chore(deps-dev): bump eslint-config-prettier from 10.1.2 to 10.1.5 in /docs (@dependabot[bot])
|
||||
- [#33492](https://github.com/apache/superset/pull/33492) chore(deps-dev): bump webpack from 5.99.7 to 5.99.8 in /docs (@dependabot[bot])
|
||||
- [#33490](https://github.com/apache/superset/pull/33490) chore(deps): bump antd from 5.24.9 to 5.25.1 in /docs (@dependabot[bot])
|
||||
- [#33499](https://github.com/apache/superset/pull/33499) chore(deps-dev): bump @babel/preset-env from 7.26.7 to 7.27.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#33458](https://github.com/apache/superset/pull/33458) docs: added europace to INTHEWILD.md (@Bierbarbar)
|
||||
- [#33472](https://github.com/apache/superset/pull/33472) docs(installation): show example of extending Docker image (@sfirke)
|
||||
- [#32948](https://github.com/apache/superset/pull/32948) chore(deps): bump express from 4.21.2 to 5.1.0 in /superset-websocket/utils/client-ws-app (@dependabot[bot])
|
||||
- [#33278](https://github.com/apache/superset/pull/33278) chore(🦾): bump python shillelagh subpackage(s) (@github-actions[bot])
|
||||
- [#33435](https://github.com/apache/superset/pull/33435) docs: CVEs fixed on 4.1.2 (@sha174n)
|
||||
- [#33397](https://github.com/apache/superset/pull/33397) chore: Add missing ECharts tags (@DamianPendrak)
|
||||
- [#30878](https://github.com/apache/superset/pull/30878) docs: fix for role sync issues in case of custom OAuth2 configuration (@ved-kashyap-samsung)
|
||||
- [#33319](https://github.com/apache/superset/pull/33319) chore(deps): bump antd from 5.24.5 to 5.24.9 in /docs (@dependabot[bot])
|
||||
- [#33378](https://github.com/apache/superset/pull/33378) chore: regenerate `openapi.json` (@betodealmeida)
|
||||
- [#33279](https://github.com/apache/superset/pull/33279) chore(🦾): bump python markdown 3.7 -> 3.8 (@github-actions[bot])
|
||||
- [#33370](https://github.com/apache/superset/pull/33370) chore(🦾): bump python sshtunnel subpackage(s) (@github-actions[bot])
|
||||
- [#33371](https://github.com/apache/superset/pull/33371) chore(🦾): bump python cryptography 44.0.2 -> 44.0.3 (@github-actions[bot])
|
||||
- [#33369](https://github.com/apache/superset/pull/33369) chore(🦾): bump python humanize 4.12.2 -> 4.12.3 (@github-actions[bot])
|
||||
- [#33368](https://github.com/apache/superset/pull/33368) chore(🦾): bump python sqlglot 26.16.2 -> 26.16.4 (@github-actions[bot])
|
||||
- [#33318](https://github.com/apache/superset/pull/33318) chore(deps): bump swagger-ui-react from 5.20.2 to 5.21.0 in /docs (@dependabot[bot])
|
||||
- [#33323](https://github.com/apache/superset/pull/33323) chore(deps-dev): update ts-loader requirement from ^9.5.1 to ^9.5.2 in /superset-frontend/packages/superset-ui-demo (@dependabot[bot])
|
||||
- [#33311](https://github.com/apache/superset/pull/33311) chore(deps): bump uuid from 11.0.2 to 11.1.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#33312](https://github.com/apache/superset/pull/33312) chore(deps-dev): bump @eslint/js from 9.17.0 to 9.25.1 in /superset-websocket (@dependabot[bot])
|
||||
- [#33317](https://github.com/apache/superset/pull/33317) chore(deps): bump less from 4.2.2 to 4.3.0 in /docs (@dependabot[bot])
|
||||
- [#33350](https://github.com/apache/superset/pull/33350) docs(docker-builds.mdx): clarify dockerize images (@jdorel)
|
||||
- [#33315](https://github.com/apache/superset/pull/33315) chore(deps-dev): bump eslint-config-prettier from 10.1.1 to 10.1.2 in /docs (@dependabot[bot])
|
||||
- [#33320](https://github.com/apache/superset/pull/33320) chore(deps-dev): bump typescript from 5.8.2 to 5.8.3 in /docs (@dependabot[bot])
|
||||
- [#33314](https://github.com/apache/superset/pull/33314) chore(deps-dev): bump eslint-plugin-react from 7.37.4 to 7.37.5 in /docs (@dependabot[bot])
|
||||
- [#33316](https://github.com/apache/superset/pull/33316) chore(deps-dev): bump webpack from 5.98.0 to 5.99.7 in /docs (@dependabot[bot])
|
||||
- [#33321](https://github.com/apache/superset/pull/33321) chore(deps): bump @rjsf/validator-ajv8 from 5.24.1 to 5.24.9 in /superset-frontend (@dependabot[bot])
|
||||
- [#33332](https://github.com/apache/superset/pull/33332) chore(deps-dev): bump @babel/plugin-transform-runtime from 7.25.9 to 7.27.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33333](https://github.com/apache/superset/pull/33333) chore(deps): bump react-intersection-observer from 9.15.1 to 9.16.0 in /superset-frontend (@dependabot[bot])
|
||||
- [#31476](https://github.com/apache/superset/pull/31476) chore(deps): Upgrade pyarrow to 18.1.0 (@phillipleblanc)
|
||||
- [#33277](https://github.com/apache/superset/pull/33277) chore(🦾): bump python importlib-metadata 8.6.1 -> 8.7.0 (@github-actions[bot])
|
||||
- [#33280](https://github.com/apache/superset/pull/33280) chore(🦾): bump python mako 1.3.9 -> 1.3.10 (@github-actions[bot])
|
||||
- [#33281](https://github.com/apache/superset/pull/33281) chore(🦾): bump python pyparsing 3.2.2 -> 3.2.3 (@github-actions[bot])
|
||||
- [#33257](https://github.com/apache/superset/pull/33257) chore(🦾): bump python celery 5.4.0 -> 5.5.2 (@github-actions[bot])
|
||||
- [#33259](https://github.com/apache/superset/pull/33259) chore(🦾): bump python packaging 24.2 -> 25.0 (@github-actions[bot])
|
||||
- [#33260](https://github.com/apache/superset/pull/33260) chore(🦾): bump python deprecation subpackage(s) (@github-actions[bot])
|
||||
- [#33262](https://github.com/apache/superset/pull/33262) chore(🦾): bump python python-dotenv 1.0.1 -> 1.1.0 (@github-actions[bot])
|
||||
- [#33263](https://github.com/apache/superset/pull/33263) chore(🦾): bump python pandas subpackage(s) (@github-actions[bot])
|
||||
- [#33266](https://github.com/apache/superset/pull/33266) chore(🦾): bump python sqlglot 26.11.1 -> 26.16.2 (@github-actions[bot])
|
||||
- [#33265](https://github.com/apache/superset/pull/33265) chore(🦾): bump python gunicorn subpackage(s) (@github-actions[bot])
|
||||
- [#33258](https://github.com/apache/superset/pull/33258) chore(🦾): bump python croniter subpackage(s) (@github-actions[bot])
|
||||
- [#33236](https://github.com/apache/superset/pull/33236) chore: add some utils tests (@eschutho)
|
||||
- [#33137](https://github.com/apache/superset/pull/33137) docs(installation): compare installation methods (@sfirke)
|
||||
- [#33210](https://github.com/apache/superset/pull/33210) docs: Add note on SQL execution security considerations (@sha174n)
|
||||
- [#30047](https://github.com/apache/superset/pull/30047) docs: improve documentation(docs): clarify URL encoding requirement for connection strings (@kalai-logicsoft)
|
||||
- [#33197](https://github.com/apache/superset/pull/33197) chore(deps-dev): bump http-proxy-middleware from 2.0.7 to 2.0.9 in /superset-frontend (@dependabot[bot])
|
||||
- [#33173](https://github.com/apache/superset/pull/33173) docs: add a high-level architecture diagram to the docs (@mistercrunch)
|
||||
- [#33102](https://github.com/apache/superset/pull/33102) chore(deps): bump @babel/runtime from 7.17.2 to 7.27.0 in /superset-frontend/cypress-base (@dependabot[bot])
|
||||
- [#29828](https://github.com/apache/superset/pull/29828) chore(translations): Update PT-BR language (partial) (@felipegranado)
|
||||
- [#33079](https://github.com/apache/superset/pull/33079) chore: Update INTHEWILD.md (@Pedro-Gato)
|
||||
- [#33074](https://github.com/apache/superset/pull/33074) chore: Added Formbricks to INTHEWILD.md (@jobenjada)
|
||||
- [#32941](https://github.com/apache/superset/pull/32941) chore(deps-dev): bump lerna from 8.1.9 to 8.2.1 in /superset-frontend (@dependabot[bot])
|
||||
- [#33045](https://github.com/apache/superset/pull/33045) docs: clarify docker-compose-image-tag instructions (@mistercrunch)
|
||||
- [#33061](https://github.com/apache/superset/pull/33061) chore(helm): bump appVersion to 4.1.2 (@villebro)
|
||||
- [#33028](https://github.com/apache/superset/pull/33028) chore(deps): bump estree-util-value-to-estree from 3.1.1 to 3.3.3 in /docs (@dependabot[bot])
|
||||
- [#33018](https://github.com/apache/superset/pull/33018) docs: add WinWin Network(马上赢) to users list (@Ookong)
|
||||
- [#32890](https://github.com/apache/superset/pull/32890) refactor(IconButton): Refactor IconButton to use Ant Design 5 Card (@Sameerali0)
|
||||
- [#32999](https://github.com/apache/superset/pull/32999) docs: Update documentation about publishing a dashboard (@hverlin)
|
||||
- [#33001](https://github.com/apache/superset/pull/33001) chore(Databricks): Display older Databricks driver as legacy (@Vitor-Avila)
|
||||
- [#32922](https://github.com/apache/superset/pull/32922) chore: bump marshmallow-sqlalchemy to 1.4.0 (@mistercrunch)
|
||||
- [#32952](https://github.com/apache/superset/pull/32952) chore(deps-dev): bump eslint-config-prettier from 10.0.2 to 10.1.1 in /docs (@dependabot[bot])
|
||||
- [#32951](https://github.com/apache/superset/pull/32951) chore(deps): bump antd from 5.24.2 to 5.24.5 in /docs (@dependabot[bot])
|
||||
- [#32950](https://github.com/apache/superset/pull/32950) chore(deps): bump swagger-ui-react from 5.20.0 to 5.20.2 in /docs (@dependabot[bot])
|
||||
- [#32939](https://github.com/apache/superset/pull/32939) chore(deps-dev): bump @babel/compat-data from 7.26.5 to 7.26.8 in /superset-frontend (@dependabot[bot])
|
||||
- [#32937](https://github.com/apache/superset/pull/32937) chore(deps-dev): bump css-minimizer-webpack-plugin from 7.0.0 to 7.0.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#32927](https://github.com/apache/superset/pull/32927) chore(deps): update @types/react-redux requirement from ^7.1.10 to ^7.1.34 in /superset-frontend/plugins/plugin-chart-echarts (@dependabot[bot])
|
||||
- [#32925](https://github.com/apache/superset/pull/32925) chore(deps-dev): bump @typescript-eslint/parser from 8.19.0 to 8.29.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#32924](https://github.com/apache/superset/pull/32924) chore(deps-dev): bump ts-jest from 29.2.5 to 29.3.1 in /superset-websocket (@dependabot[bot])
|
||||
- [#32585](https://github.com/apache/superset/pull/32585) chore(reports): add task for slack channels warm-up (@Usiel)
|
||||
- [#32888](https://github.com/apache/superset/pull/32888) refactor(jinja macro): Update current_user_roles() macro to fetch roles from existing get_user_roles() method (@bmaquet)
|
||||
- [#32901](https://github.com/apache/superset/pull/32901) chore(🦾): bump python grpcio 1.68.0 -> 1.71.0 (@github-actions[bot])
|
||||
- [#32880](https://github.com/apache/superset/pull/32880) refactor(Icons): Add typing support and improve structure (@geido)
|
||||
- [#32860](https://github.com/apache/superset/pull/32860) chore: Removes unused file (@michael-s-molina)
|
||||
- [#32822](https://github.com/apache/superset/pull/32822) docs: added a link to badge releases (@Radovenchyk)
|
||||
- [#32831](https://github.com/apache/superset/pull/32831) chore: updating files for release 4.1.2 (@sadpandajoe)
|
||||
- [#32826](https://github.com/apache/superset/pull/32826) chore(🦾): bump python humanize 4.12.1 -> 4.12.2 (@github-actions[bot])
|
||||
- [#32827](https://github.com/apache/superset/pull/32827) chore(🦾): bump python pyparsing 3.2.1 -> 3.2.2 (@github-actions[bot])
|
||||
- [#32828](https://github.com/apache/superset/pull/32828) chore(🦾): bump python shillelagh subpackage(s) (@github-actions[bot])
|
||||
- [#32825](https://github.com/apache/superset/pull/32825) chore(🦾): bump python click-option-group 0.5.6 -> 0.5.7 (@github-actions[bot])
|
||||
- [#32744](https://github.com/apache/superset/pull/32744) chore(🦾): bump python flask-appbuilder subpackage(s) (@github-actions[bot])
|
||||
- [#32749](https://github.com/apache/superset/pull/32749) chore: replaced the workflow badge link (@Radovenchyk)
|
||||
- [#32742](https://github.com/apache/superset/pull/32742) chore(🦾): bump python slack-sdk 3.34.0 -> 3.35.0 (@github-actions[bot])
|
||||
- [#31255](https://github.com/apache/superset/pull/31255) chore(🦾): bump python shillelagh subpackage(s) (@github-actions[bot])
|
||||
- [#32743](https://github.com/apache/superset/pull/32743) chore(🦾): bump python celery subpackage(s) (@github-actions[bot])
|
||||
- [#32711](https://github.com/apache/superset/pull/32711) chore(lang): update and fix french translations (@CharlesNkdl)
|
||||
- [#31251](https://github.com/apache/superset/pull/31251) chore(🦾): bump python flask-appbuilder subpackage(s) (@github-actions[bot])
|
||||
- [#32112](https://github.com/apache/superset/pull/32112) refactor(Icons): Replaces custom icons with Ant Design 5 icons (@EnxDev)
|
||||
- [#31247](https://github.com/apache/superset/pull/31247) chore(🦾): bump python greenlet (@github-actions[bot])
|
||||
- [#32686](https://github.com/apache/superset/pull/32686) chore(helm): bump postgresql image tag in helm values (@mPyKen)
|
||||
- [#32714](https://github.com/apache/superset/pull/32714) chore(asf): Another `.asf.yaml` touch-up. (@rusackas)
|
||||
- [#32689](https://github.com/apache/superset/pull/32689) chore(docs): touching up AI styling/text (@rusackas)
|
||||
- [#32712](https://github.com/apache/superset/pull/32712) chore(asf): trying to fix `.asf.yaml` again to re-enable Discussions (@rusackas)
|
||||
- [#32710](https://github.com/apache/superset/pull/32710) chore(asf): Removing notifications from `.asf.yaml` - they still don't work :( (@rusackas)
|
||||
- [#32709](https://github.com/apache/superset/pull/32709) chore(asf): fixing(?) `.asf.yaml` (@rusackas)
|
||||
- [#32690](https://github.com/apache/superset/pull/32690) docs(api): correct attribute `name` instead of `table` for GET table_metadata in openapi.json (@hainenber)
|
||||
- [#32688](https://github.com/apache/superset/pull/32688) build(dev-deps): bump prettier to v3.5.3 and follow-up refactor (@hainenber)
|
||||
- [#32697](https://github.com/apache/superset/pull/32697) chore: add Oxylabs to INTHEWILD.md (@rytis-ulys)
|
||||
- [#32407](https://github.com/apache/superset/pull/32407) chore(docs): remove customized "Edit this page on GitHub" button (@hainenber)
|
||||
- [#32580](https://github.com/apache/superset/pull/32580) chore(deps): bump jinja2 from 3.1.5 to 3.1.6 in /superset/translations (@dependabot[bot])
|
||||
- [#32668](https://github.com/apache/superset/pull/32668) docs: add Hometogo to users list (@PedroMartinSteenstrup)
|
||||
- [#32623](https://github.com/apache/superset/pull/32623) chore(examples): Touching up Vehicle Sales a bit (@rusackas)
|
||||
- [#32485](https://github.com/apache/superset/pull/32485) chore: simplify user impersonation (@betodealmeida)
|
||||
- [#32641](https://github.com/apache/superset/pull/32641) chore: add unique option to index migration utils (@villebro)
|
||||
- [#32575](https://github.com/apache/superset/pull/32575) chore(🦾): bump python paramiko 3.5.0 -> 3.5.1 (@github-actions[bot])
|
||||
- [#32639](https://github.com/apache/superset/pull/32639) chore(🦾): bump python croniter 5.0.1 -> 6.0.0 (@github-actions[bot])
|
||||
- [#32637](https://github.com/apache/superset/pull/32637) chore(🦾): bump python flask-session subpackage(s) (@github-actions[bot])
|
||||
- [#32638](https://github.com/apache/superset/pull/32638) chore(🦾): bump python celery subpackage(s) (@github-actions[bot])
|
||||
- [#32636](https://github.com/apache/superset/pull/32636) chore(🦾): bump python importlib-metadata 8.5.0 -> 8.6.1 (@github-actions[bot])
|
||||
- [#32635](https://github.com/apache/superset/pull/32635) chore(🦾): bump python simplejson 3.19.3 -> 3.20.1 (@github-actions[bot])
|
||||
- [#32634](https://github.com/apache/superset/pull/32634) chore(🦾): bump python flask-caching 2.3.0 -> 2.3.1 (@github-actions[bot])
|
||||
- [#32629](https://github.com/apache/superset/pull/32629) chore(🦾): bump python sshtunnel subpackage(s) (@github-actions[bot])
|
||||
- [#32596](https://github.com/apache/superset/pull/32596) chore: fix precommit for eslint (@mistercrunch)
|
||||
- [#32596](https://github.com/apache/superset/pull/32596) chore: fix precommit for eslint (@mistercrunch)
|
||||
- [#32631](https://github.com/apache/superset/pull/32631) chore(🦾): bump python sqlparse 0.5.2 -> 0.5.3 (@github-actions[bot])
|
||||
- [#32628](https://github.com/apache/superset/pull/32628) chore(🦾): bump python greenlet 3.0.3 -> 3.1.1 (@github-actions[bot])
|
||||
- [#32632](https://github.com/apache/superset/pull/32632) chore(🦾): bump python humanize 4.11.0 -> 4.12.1 (@github-actions[bot])
|
||||
- [#32630](https://github.com/apache/superset/pull/32630) chore(🦾): bump python nh3 0.2.19 -> 0.2.21 (@github-actions[bot])
|
||||
- [#32578](https://github.com/apache/superset/pull/32578) chore(🦾): bump python flask-migrate subpackage(s) (@github-actions[bot])
|
||||
- [#32577](https://github.com/apache/superset/pull/32577) chore(🦾): bump python pyparsing 3.2.0 -> 3.2.1 (@github-actions[bot])
|
||||
- [#32581](https://github.com/apache/superset/pull/32581) chore(deps-dev): bump axios from 1.7.7 to 1.8.2 in /superset-embedded-sdk (@dependabot[bot])
|
||||
- [#32582](https://github.com/apache/superset/pull/32582) chore(deps): bump axios from 1.7.8 to 1.8.2 in /docs (@dependabot[bot])
|
||||
- [#32583](https://github.com/apache/superset/pull/32583) chore(deps-dev): bump axios from 1.7.9 to 1.8.2 in /superset-frontend (@dependabot[bot])
|
||||
- [#32603](https://github.com/apache/superset/pull/32603) chore(deps): bump @babel/runtime-corejs3 from 7.26.9 to 7.26.10 in /docs (@dependabot[bot])
|
||||
- [#32598](https://github.com/apache/superset/pull/32598) chore(deps): bump @babel/helpers from 7.24.5 to 7.26.10 in /docs (@dependabot[bot])
|
||||
- [#32604](https://github.com/apache/superset/pull/32604) chore(deps): bump @babel/runtime from 7.26.9 to 7.26.10 in /docs (@dependabot[bot])
|
||||
- [#32607](https://github.com/apache/superset/pull/32607) docs(analytics): actually USING Matomo to track page views/changes (@rusackas)
|
||||
- [#32605](https://github.com/apache/superset/pull/32605) docs: fix typo in ephemeral envs docs (@mistercrunch)
|
||||
- [#32600](https://github.com/apache/superset/pull/32600) docs: add information about ephemeral environments (@mistercrunch)
|
||||
- [#32597](https://github.com/apache/superset/pull/32597) chore: bump postgresql from 15 to 16 (@RealGreenDragon)
|
||||
- [#32602](https://github.com/apache/superset/pull/32602) chore(deps): bump @babel/helpers from 7.17.2 to 7.26.10 in /superset-frontend/cypress-base (@dependabot[bot])
|
||||
- [#32576](https://github.com/apache/superset/pull/32576) chore(🦾): bump python slack-sdk 3.33.4 -> 3.34.0 (@github-actions[bot])
|
||||
- [#32579](https://github.com/apache/superset/pull/32579) chore(🦾): bump python pandas subpackage(s) (@github-actions[bot])
|
||||
- [#32573](https://github.com/apache/superset/pull/32573) chore(🦾): bump python cryptography 43.0.3 -> 44.0.2 (@mistercrunch)
|
||||
- [#32561](https://github.com/apache/superset/pull/32561) chore(docs): Add Flowbird to users list (@EmmanuelCbd)
|
||||
- [#32545](https://github.com/apache/superset/pull/32545) refactor(input): Remove leftover direct usage of Ant Design input (@msyavuz)
|
||||
- [#32550](https://github.com/apache/superset/pull/32550) chore: bump node to v20.18.3 (@villebro)
|
||||
- [#32547](https://github.com/apache/superset/pull/32547) docs: add Canonical to INTHEWILD.md (@personofnorank)
|
||||
- [#32544](https://github.com/apache/superset/pull/32544) chore(Ant Design): Remove unnecessary exports from version 4 (@geido)
|
||||
- [#31770](https://github.com/apache/superset/pull/31770) chore: add logging to index error (@betodealmeida)
|
||||
- [#32529](https://github.com/apache/superset/pull/32529) chore: Caching the Slack channels list (@Vitor-Avila)
|
||||
- [#32527](https://github.com/apache/superset/pull/32527) chore(ci): use npm/yarn lock files where possible (@villebro)
|
||||
- [#32448](https://github.com/apache/superset/pull/32448) chore(deps-dev): bump eslint-config-prettier from 8.10.0 to 10.0.2 in /docs (@dependabot[bot])
|
||||
- [#32437](https://github.com/apache/superset/pull/32437) chore(deps-dev): bump globals from 15.9.0 to 16.0.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#32456](https://github.com/apache/superset/pull/32456) chore(deps): bump markdown-to-jsx from 7.7.3 to 7.7.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#32517](https://github.com/apache/superset/pull/32517) chore(ci): show more failed pre-commit context (@villebro)
|
||||
- [#32470](https://github.com/apache/superset/pull/32470) chore(deps-dev): update @babel/types requirement from ^7.26.3 to ^7.26.9 in /superset-frontend/plugins/plugin-chart-pivot-table (@dependabot[bot])
|
||||
- [#32503](https://github.com/apache/superset/pull/32503) chore(deps-dev): bump @typescript-eslint/eslint-plugin from 8.19.0 to 8.26.0 in /superset-websocket (@dependabot[bot])
|
||||
- [#32501](https://github.com/apache/superset/pull/32501) chore: enable dependabot using uv for auto-bumping python packages (@mistercrunch)
|
||||
- [#30657](https://github.com/apache/superset/pull/30657) chore: various markdown warnings resolved (@CodeWithEmad)
|
||||
- [#32453](https://github.com/apache/superset/pull/32453) chore(deps): bump @deck.gl/react from 9.1.0 to 9.1.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#32460](https://github.com/apache/superset/pull/32460) chore(deps-dev): bump @babel/types from 7.26.7 to 7.26.9 in /superset-frontend (@dependabot[bot])
|
||||
- [#32461](https://github.com/apache/superset/pull/32461) chore(deps): bump @rjsf/utils from 5.24.1 to 5.24.3 in /superset-frontend (@dependabot[bot])
|
||||
- [#32462](https://github.com/apache/superset/pull/32462) chore(deps): bump chrono-node from 2.7.7 to 2.7.8 in /superset-frontend (@dependabot[bot])
|
||||
- [#32440](https://github.com/apache/superset/pull/32440) chore(deps-dev): bump @types/jsonwebtoken from 9.0.6 to 9.0.9 in /superset-websocket (@dependabot[bot])
|
||||
- [#32454](https://github.com/apache/superset/pull/32454) chore(deps): bump swagger-ui-react from 5.19.0 to 5.20.0 in /docs (@dependabot[bot])
|
||||
- [#32476](https://github.com/apache/superset/pull/32476) chore(deps-dev): bump @types/lodash from 4.17.14 to 4.17.16 in /superset-frontend (@dependabot[bot])
|
||||
- [#32447](https://github.com/apache/superset/pull/32447) chore(deps): bump antd from 5.24.1 to 5.24.2 in /docs (@dependabot[bot])
|
||||
- [#32449](https://github.com/apache/superset/pull/32449) chore(deps-dev): bump webpack from 5.97.1 to 5.98.0 in /docs (@dependabot[bot])
|
||||
- [#32452](https://github.com/apache/superset/pull/32452) chore(deps-dev): bump typescript from 5.1.6 to 5.8.2 in /docs (@dependabot[bot])
|
||||
- [#32087](https://github.com/apache/superset/pull/32087) chore(deps-dev): bump @docusaurus/tsconfig from 3.6.3 to 3.7.0 in /docs (@dependabot[bot])
|
||||
- [#32421](https://github.com/apache/superset/pull/32421) docs: add SingleStore to the users list (@tjain-singlestore)
|
||||
- [#32385](https://github.com/apache/superset/pull/32385) docs(config): fill in commonly connection string for Oracle, Presto and SQL Server databases (@hainenber)
|
||||
- [#32322](https://github.com/apache/superset/pull/32322) build(deps): bump major versions for `math-expression-evaluator` and `fetch-mock` + clean up obsolete dev/override packages (@hainenber)
|
||||
- [#32393](https://github.com/apache/superset/pull/32393) chore(docs): fix typos (@omahs)
|
||||
- [#32396](https://github.com/apache/superset/pull/32396) docs: add shipmnts to users list (@ekansh-shipmnts)
|
||||
- [#32380](https://github.com/apache/superset/pull/32380) chore(docs): update instructions for pypi distribution (@sadpandajoe)
|
||||
- [#32379](https://github.com/apache/superset/pull/32379) docs(intro): broaden link to installation options (@sfirke)
|
||||
- [#32334](https://github.com/apache/superset/pull/32334) chore: Upgrade AG Grid to use tree shaking (@kgabryje)
|
||||
- [#32365](https://github.com/apache/superset/pull/32365) chore(cleanup): removing accidentally committed package/lock files. (@rusackas)
|
||||
- [#32313](https://github.com/apache/superset/pull/32313) refactor(DrillDetailTableControls): Upgrade DrillDetailTableControls component to Ant Design 5 (@EnxDev)
|
||||
- [#32363](https://github.com/apache/superset/pull/32363) chore(tests): converting enzyme to RTL, part 3 (@rusackas)
|
||||
- [#32314](https://github.com/apache/superset/pull/32314) refactor(DatabaseSelector): Changes the imported types from antd-4 to antdv-5 (@EnxDev)
|
||||
- [#32349](https://github.com/apache/superset/pull/32349) chore(docs): Fix typo in security.mdx (@amineBouilzmin)
|
||||
- [#32323](https://github.com/apache/superset/pull/32323) ci(type-checking): run type-checking-frontend hook sequentially (@alveifbklsiu259)
|
||||
- [#32341](https://github.com/apache/superset/pull/32341) chore(build): reduce Lodash usage in `superset-frontend` (@hainenber)
|
||||
- [#32302](https://github.com/apache/superset/pull/32302) chore(duckdb): Bump duckdb-engine, duckdb versions (@guenp)
|
||||
- [#32330](https://github.com/apache/superset/pull/32330) chore(deps): bump swagger-ui-react from 5.18.2 to 5.19.0 in /docs (@dependabot[bot])
|
||||
- [#32329](https://github.com/apache/superset/pull/32329) chore(deps): bump antd from 5.22.7 to 5.24.1 in /docs (@dependabot[bot])
|
||||
- [#32327](https://github.com/apache/superset/pull/32327) chore(deps): bump @docsearch/react from 3.8.2 to 3.9.0 in /docs (@dependabot[bot])
|
||||
- [#32319](https://github.com/apache/superset/pull/32319) chore(readme): updating video on Readme page. (@rusackas)
|
||||
- [#32326](https://github.com/apache/superset/pull/32326) chore(docs): Add RIADVICE to companies using Superset (@GhaziTriki)
|
||||
- [#31921](https://github.com/apache/superset/pull/31921) docs: various enhancements across `/docs` workspace (@hainenber)
|
||||
- [#32066](https://github.com/apache/superset/pull/32066) chore(deps): bump core-js from 3.39.0 to 3.40.0 in /superset-frontend/packages/superset-ui-demo (@dependabot[bot])
|
||||
- [#32088](https://github.com/apache/superset/pull/32088) chore(deps-dev): bump @docusaurus/module-type-aliases from 3.6.3 to 3.7.0 in /docs (@dependabot[bot])
|
||||
- [#32316](https://github.com/apache/superset/pull/32316) chore(code owners): adding @mistercrunch to cypress/e2e code owners (@rusackas)
|
||||
- [#32226](https://github.com/apache/superset/pull/32226) chore(tests): Trying to kill enzyme, part 2 (more RTL!) (@rusackas)
|
||||
- [#32090](https://github.com/apache/superset/pull/32090) chore(deps-dev): bump typescript from 5.7.2 to 5.7.3 in /docs (@dependabot[bot])
|
||||
- [#32103](https://github.com/apache/superset/pull/32103) chore(deps-dev): bump @babel/preset-env from 7.26.0 to 7.26.7 in /superset-frontend (@dependabot[bot])
|
||||
- [#32259](https://github.com/apache/superset/pull/32259) chore(be/deps): add comments for un-greppable Python dependencies (@hainenber)
|
||||
- [#32270](https://github.com/apache/superset/pull/32270) chore(deps): bump dompurify from 3.2.3 to 3.2.4 in /superset-frontend (@dependabot[bot])
|
||||
- [#32243](https://github.com/apache/superset/pull/32243) build(fe/dev-deps): remove unused `esbuild` dev deps (@hainenber)
|
||||
- [#32236](https://github.com/apache/superset/pull/32236) chore(deps): bump cryptography from 43.0.3 to 44.0.1 (@dependabot[bot])
|
||||
- [#32142](https://github.com/apache/superset/pull/32142) docs(api): Improve api documentation for dashboard endpoints(filter_state, permalink, embedded) (@msyavuz)
|
||||
- [#32235](https://github.com/apache/superset/pull/32235) chore(backend): replace insecure `shortid` usage for native filter migration with native `uuid` Python implementation (@hainenber)
|
||||
- [#32207](https://github.com/apache/superset/pull/32207) chore: Working toward killing enzyme and cleaning up test noise. (@rusackas)
|
||||
- [#31634](https://github.com/apache/superset/pull/31634) chore(fe): migrate 4 Enzyme-based tests to RTL (@hainenber)
|
||||
- [#32180](https://github.com/apache/superset/pull/32180) docs: Permissions 'can this form get on UserInfoEditView' and 'can this form get on UserInfoEditView' are not associated with Aplha and Gamma by default (@xavier-GitHub76)
|
||||
- [#32192](https://github.com/apache/superset/pull/32192) chore(ci): consolidate Node version reference in CI to associated `.nvmrc` (@hainenber)
|
||||
- [#32010](https://github.com/apache/superset/pull/32010) chore: migrating easy-to-migrate AntD vanilla components (@mistercrunch)
|
||||
- [#32206](https://github.com/apache/superset/pull/32206) docs(docker-compose): remove extra backticks (@jonathanmv)
|
||||
- [#31973](https://github.com/apache/superset/pull/31973) refactor(Popover): Upgrade Popover to Antd5 (@alexandrusoare)
|
||||
- [#31972](https://github.com/apache/superset/pull/31972) refactor(Dropdown): Migrate Dropdown to Ant Design 5 (@msyavuz)
|
||||
- [#32188](https://github.com/apache/superset/pull/32188) docs(typo): PostgresQL corrected to PostgreSQL (@0xasritha)
|
||||
- [#32157](https://github.com/apache/superset/pull/32157) chore: add query context data tests (@eschutho)
|
||||
- [#32085](https://github.com/apache/superset/pull/32085) chore(deps): bump less from 4.2.1 to 4.2.2 in /docs (@dependabot[bot])
|
||||
- [#32171](https://github.com/apache/superset/pull/32171) docs: fix typo in docker compose (@ChrisChinchilla)
|
||||
- [#31999](https://github.com/apache/superset/pull/31999) docs: incorrect psycopg2 package in k8s install instructions (@bensku)
|
||||
65
Dockerfile
65
Dockerfile
@@ -18,7 +18,7 @@
|
||||
######################################################################
|
||||
# Node stage to deal with static asset construction
|
||||
######################################################################
|
||||
ARG PY_VER=3.11.13-slim-bookworm
|
||||
ARG PY_VER=3.11.13-slim-trixie
|
||||
|
||||
# If BUILDPLATFORM is null, set it to 'amd64' (or leave as is otherwise).
|
||||
ARG BUILDPLATFORM=${BUILDPLATFORM:-amd64}
|
||||
@@ -29,7 +29,7 @@ ARG BUILD_TRANSLATIONS="false"
|
||||
######################################################################
|
||||
# superset-node-ci used as a base for building frontend assets and CI
|
||||
######################################################################
|
||||
FROM --platform=${BUILDPLATFORM} node:20-bookworm-slim AS superset-node-ci
|
||||
FROM --platform=${BUILDPLATFORM} node:20-trixie-slim AS superset-node-ci
|
||||
ARG BUILD_TRANSLATIONS
|
||||
ENV BUILD_TRANSLATIONS=${BUILD_TRANSLATIONS}
|
||||
ARG DEV_MODE="false" # Skip frontend build in dev mode
|
||||
@@ -64,7 +64,7 @@ RUN --mount=type=bind,source=./superset-frontend/package.json,target=./package.j
|
||||
--mount=type=bind,source=./superset-frontend/package-lock.json,target=./package-lock.json \
|
||||
--mount=type=cache,target=/root/.cache \
|
||||
--mount=type=cache,target=/root/.npm \
|
||||
if [ "$DEV_MODE" = "false" ]; then \
|
||||
if [ "${DEV_MODE}" = "false" ]; then \
|
||||
npm ci; \
|
||||
else \
|
||||
echo "Skipping 'npm ci' in dev mode"; \
|
||||
@@ -80,7 +80,7 @@ FROM superset-node-ci AS superset-node
|
||||
|
||||
# Build the frontend if not in dev mode
|
||||
RUN --mount=type=cache,target=/root/.npm \
|
||||
if [ "$DEV_MODE" = "false" ]; then \
|
||||
if [ "${DEV_MODE}" = "false" ]; then \
|
||||
echo "Running 'npm run ${BUILD_CMD}'"; \
|
||||
npm run ${BUILD_CMD}; \
|
||||
else \
|
||||
@@ -91,11 +91,10 @@ RUN --mount=type=cache,target=/root/.npm \
|
||||
COPY superset/translations /app/superset/translations
|
||||
|
||||
# Build translations if enabled, then cleanup localization files
|
||||
RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
|
||||
RUN if [ "${BUILD_TRANSLATIONS}" = "true" ]; then \
|
||||
npm run build-translation; \
|
||||
fi; \
|
||||
rm -rf /app/superset/translations/*/*/*.po; \
|
||||
rm -rf /app/superset/translations/*/*/*.mo;
|
||||
rm -rf /app/superset/translations/*/*/*.[po,mo];
|
||||
|
||||
|
||||
######################################################################
|
||||
@@ -106,10 +105,10 @@ FROM python:${PY_VER} AS python-base
|
||||
ARG SUPERSET_HOME="/app/superset_home"
|
||||
ENV SUPERSET_HOME=${SUPERSET_HOME}
|
||||
|
||||
RUN mkdir -p $SUPERSET_HOME
|
||||
RUN mkdir -p ${SUPERSET_HOME}
|
||||
RUN useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash superset \
|
||||
&& chmod -R 1777 $SUPERSET_HOME \
|
||||
&& chown -R superset:superset $SUPERSET_HOME
|
||||
&& chmod -R 1777 ${SUPERSET_HOME} \
|
||||
&& chown -R superset:superset ${SUPERSET_HOME}
|
||||
|
||||
# Some bash scripts needed throughout the layers
|
||||
COPY --chmod=755 docker/*.sh /app/docker/
|
||||
@@ -134,17 +133,19 @@ RUN --mount=type=cache,target=/root/.cache/uv \
|
||||
. /app/.venv/bin/activate && /app/docker/pip-install.sh --requires-build-essential -r requirements/translations.txt
|
||||
|
||||
COPY superset/translations/ /app/translations_mo/
|
||||
RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
|
||||
RUN if [ "${BUILD_TRANSLATIONS}" = "true" ]; then \
|
||||
pybabel compile -d /app/translations_mo | true; \
|
||||
fi; \
|
||||
rm -f /app/translations_mo/*/*/*.po; \
|
||||
rm -f /app/translations_mo/*/*/*.json;
|
||||
rm -f /app/translations_mo/*/*/*.[po,json]
|
||||
|
||||
######################################################################
|
||||
# Python APP common layer
|
||||
######################################################################
|
||||
FROM python-base AS python-common
|
||||
|
||||
# Build arg to pre-populate examples DuckDB file
|
||||
ARG LOAD_EXAMPLES_DUCKDB="false"
|
||||
|
||||
ENV SUPERSET_HOME="/app/superset_home" \
|
||||
HOME="/app/superset_home" \
|
||||
SUPERSET_ENV="production" \
|
||||
@@ -170,11 +171,11 @@ RUN mkdir -p \
|
||||
ARG INCLUDE_CHROMIUM="false"
|
||||
ARG INCLUDE_FIREFOX="false"
|
||||
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
|
||||
if [ "$INCLUDE_CHROMIUM" = "true" ] || [ "$INCLUDE_FIREFOX" = "true" ]; then \
|
||||
if [ "${INCLUDE_CHROMIUM}" = "true" ] || [ "${INCLUDE_FIREFOX}" = "true" ]; then \
|
||||
uv pip install playwright && \
|
||||
playwright install-deps && \
|
||||
if [ "$INCLUDE_CHROMIUM" = "true" ]; then playwright install chromium; fi && \
|
||||
if [ "$INCLUDE_FIREFOX" = "true" ]; then playwright install firefox; fi; \
|
||||
if [ "${INCLUDE_CHROMIUM}" = "true" ]; then playwright install chromium; fi && \
|
||||
if [ "${INCLUDE_FIREFOX}" = "true" ]; then playwright install firefox; fi; \
|
||||
else \
|
||||
echo "Skipping browser installation"; \
|
||||
fi
|
||||
@@ -196,6 +197,18 @@ RUN /app/docker/apt-install.sh \
|
||||
libecpg-dev \
|
||||
libldap2-dev
|
||||
|
||||
# Pre-load examples DuckDB file if requested
|
||||
RUN if [ "$LOAD_EXAMPLES_DUCKDB" = "true" ]; then \
|
||||
mkdir -p /app/data && \
|
||||
echo "Downloading pre-built examples.duckdb..." && \
|
||||
curl -L -o /app/data/examples.duckdb \
|
||||
"https://raw.githubusercontent.com/apache-superset/examples-data/master/examples.duckdb" && \
|
||||
chown -R superset:superset /app/data; \
|
||||
else \
|
||||
mkdir -p /app/data && \
|
||||
chown -R superset:superset /app/data; \
|
||||
fi
|
||||
|
||||
# Copy compiled things from previous stages
|
||||
COPY --from=superset-node /app/superset/static/assets superset/static/assets
|
||||
|
||||
@@ -219,6 +232,10 @@ FROM python-common AS lean
|
||||
|
||||
# Install Python dependencies using docker/pip-install.sh
|
||||
COPY requirements/base.txt requirements/
|
||||
|
||||
# Copy superset-core package needed for editable install in base.txt
|
||||
COPY superset-core superset-core
|
||||
|
||||
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
|
||||
/app/docker/pip-install.sh --requires-build-essential -r requirements/base.txt
|
||||
# Install the superset package
|
||||
@@ -241,6 +258,11 @@ RUN /app/docker/apt-install.sh \
|
||||
|
||||
# Copy development requirements and install them
|
||||
COPY requirements/*.txt requirements/
|
||||
|
||||
# Copy local packages needed for editable installs in development.txt
|
||||
COPY superset-core superset-core
|
||||
COPY superset-extensions-cli superset-extensions-cli
|
||||
|
||||
# Install Python dependencies using docker/pip-install.sh
|
||||
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
|
||||
/app/docker/pip-install.sh --requires-build-essential -r requirements/development.txt
|
||||
@@ -258,6 +280,15 @@ USER superset
|
||||
######################################################################
|
||||
FROM lean AS ci
|
||||
USER root
|
||||
RUN uv pip install .[postgres]
|
||||
RUN uv pip install .[postgres,duckdb]
|
||||
USER superset
|
||||
CMD ["/app/docker/entrypoints/docker-ci.sh"]
|
||||
|
||||
######################################################################
|
||||
# Showtime image - lean + DuckDB for examples database
|
||||
######################################################################
|
||||
FROM lean AS showtime
|
||||
USER root
|
||||
RUN uv pip install .[duckdb]
|
||||
USER superset
|
||||
CMD ["/app/docker/entrypoints/docker-ci.sh"]
|
||||
|
||||
35
LLMS.md
35
LLMS.md
@@ -15,9 +15,11 @@ Apache Superset is a data visualization platform with Flask/Python backend and R
|
||||
|
||||
### Testing Strategy Migration
|
||||
- **Prefer unit tests** over integration tests
|
||||
- **Prefer integration tests** over Cypress end-to-end tests
|
||||
- **Cypress is last resort** - Actively moving away from Cypress
|
||||
- **Prefer integration tests** over end-to-end tests
|
||||
- **Use Playwright for E2E tests** - Migrating from Cypress
|
||||
- **Cypress is deprecated** - Will be removed once migration is completed
|
||||
- **Use Jest + React Testing Library** for component testing
|
||||
- **Use `test()` instead of `describe()`** - Follow [avoid nesting when testing](https://kentcdodds.com/blog/avoid-nesting-when-youre-testing) principles
|
||||
|
||||
### Backend Type Safety
|
||||
- **Add type hints** - All new Python code needs proper typing
|
||||
@@ -68,6 +70,10 @@ superset/
|
||||
- **New files require ASF license headers** - When creating new code files, include the standard Apache Software Foundation license header
|
||||
- **LLM instruction files are excluded** - Files like LLMS.md, CLAUDE.md, etc. are in `.rat-excludes` to avoid header token overhead
|
||||
|
||||
### Code Comments
|
||||
- **Avoid time-specific language** - Don't use words like "now", "currently", "today" in code comments as they become outdated
|
||||
- **Write timeless comments** - Comments should remain accurate regardless of when they're read
|
||||
|
||||
## Documentation Requirements
|
||||
|
||||
- **docs/**: Update for any user-facing changes
|
||||
@@ -106,6 +112,18 @@ superset/
|
||||
npm run test # All tests
|
||||
npm run test -- filename.test.tsx # Single file
|
||||
|
||||
# E2E Tests (Playwright - NEW)
|
||||
npm run playwright:test # All Playwright tests
|
||||
npm run playwright:ui # Interactive UI mode
|
||||
npm run playwright:headed # See browser during tests
|
||||
npx playwright test tests/auth/login.spec.ts # Single file
|
||||
npm run playwright:debug tests/auth/login.spec.ts # Debug specific file
|
||||
|
||||
# E2E Tests (Cypress - DEPRECATED)
|
||||
cd superset-frontend/cypress-base
|
||||
npm run cypress-run-chrome # All Cypress tests (headless)
|
||||
npm run cypress-debug # Interactive Cypress UI
|
||||
|
||||
# Backend
|
||||
pytest # All tests
|
||||
pytest tests/unit_tests/specific_test.py # Single file
|
||||
@@ -135,6 +153,19 @@ curl -f http://localhost:8088/health || echo "❌ Setup required - see https://s
|
||||
- **Use negation operator**: `~Model.field` instead of `== False` to avoid ruff E712 errors
|
||||
- **Example**: `~Model.is_active` instead of `Model.is_active == False`
|
||||
|
||||
## Pull Request Guidelines
|
||||
|
||||
**When creating pull requests:**
|
||||
|
||||
1. **Read the current PR template**: Always check `.github/PULL_REQUEST_TEMPLATE.md` for the latest format
|
||||
2. **Use the template sections**: Include all sections from the template (SUMMARY, BEFORE/AFTER, TESTING INSTRUCTIONS, ADDITIONAL INFORMATION)
|
||||
3. **Follow PR title conventions**: Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
|
||||
- Format: `type(scope): description`
|
||||
- Example: `fix(dashboard): load charts correctly`
|
||||
- Types: `fix`, `feat`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`
|
||||
|
||||
**Important**: Always reference the actual template file at `.github/PULL_REQUEST_TEMPLATE.md` instead of using cached content, as the template may be updated over time.
|
||||
|
||||
## Pre-commit Validation
|
||||
|
||||
**Use pre-commit hooks for quality validation:**
|
||||
|
||||
2
Makefile
2
Makefile
@@ -91,7 +91,7 @@ js-format:
|
||||
cd superset-frontend; npm run prettier
|
||||
|
||||
flask-app:
|
||||
flask run -p 8088 --with-threads --reload --debugger
|
||||
flask run -p 8088 --reload --debugger
|
||||
|
||||
node-app:
|
||||
cd superset-frontend; npm run dev-server
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
FROM python:3.10-slim-bookworm
|
||||
FROM python:3.10-slim-trixie
|
||||
|
||||
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash superset
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
FROM python:3.10-slim-bookworm
|
||||
FROM python:3.10-slim-trixie
|
||||
|
||||
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash superset
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
FROM python:3.10-slim-bookworm
|
||||
FROM python:3.10-slim-trixie
|
||||
ARG VERSION
|
||||
|
||||
RUN git clone --depth 1 --branch ${VERSION} https://github.com/apache/superset.git /superset
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
FROM python:3.10-slim-bookworm
|
||||
FROM python:3.10-slim-trixie
|
||||
|
||||
RUN apt-get update -y
|
||||
RUN apt-get install -y \
|
||||
|
||||
@@ -469,6 +469,10 @@ an account first if you don't have one, and reference your username
|
||||
while requesting access to push packages.
|
||||
|
||||
```bash
|
||||
# Run this first to make sure you are uploading the right version.
|
||||
# Pypi does not allow you to delete or retract once uplaoded.
|
||||
twine check dist/*
|
||||
|
||||
twine upload dist/*
|
||||
```
|
||||
|
||||
@@ -518,6 +522,8 @@ takes the version (ie `3.1.1`), the git reference (any SHA, tag or branch
|
||||
reference), and whether to force the `latest` Docker tag on the
|
||||
generated images.
|
||||
|
||||
**NOTE:** If the docker image isn't built, you'll need to run this [GH action](https://github.com/apache/superset/actions/workflows/tag-release.yml) where you provide it the tag sha.
|
||||
|
||||
### Npm Release
|
||||
|
||||
You might want to publish the latest @superset-ui release to npm
|
||||
|
||||
@@ -22,8 +22,9 @@ under the License.
|
||||
This file documents any backwards-incompatible changes in Superset and
|
||||
assists people when migrating to a new version.
|
||||
|
||||
## 6.0.0
|
||||
## Next
|
||||
- [33055](https://github.com/apache/superset/pull/33055): Upgrades Flask-AppBuilder to 5.0.0. The AUTH_OID authentication type has been deprecated and is no longer available as an option in Flask-AppBuilder. OpenID (OID) is considered a deprecated authentication protocol - if you are using AUTH_OID, you will need to migrate to an alternative authentication method such as OAuth, LDAP, or database authentication before upgrading.
|
||||
- [35062](https://github.com/apache/superset/pull/35062): Changed the function signature of `setupExtensions` to `setupCodeOverrides` with options as arguments.
|
||||
- [34871](https://github.com/apache/superset/pull/34871): Fixed Jest test hanging issue from Ant Design v5 upgrade. MessageChannel is now mocked in test environment to prevent rc-overflow from causing Jest to hang. Test environment only - no production impact.
|
||||
- [34782](https://github.com/apache/superset/pull/34782): Dataset exports now include the dataset ID in their file name (similar to charts and dashboards). If managing assets as code, make sure to rename existing dataset YAMLs to include the ID (and avoid duplicated files).
|
||||
- [34536](https://github.com/apache/superset/pull/34536): The `ENVIRONMENT_TAG_CONFIG` color values have changed to support only Ant Design semantic colors. Update your `superset_config.py`:
|
||||
|
||||
@@ -28,6 +28,7 @@ x-superset-image: &superset-image apachesuperset.docker.scarf.sh/apache/superset
|
||||
x-superset-volumes:
|
||||
&superset-volumes # /app/pythonpath_docker will be appended to the PYTHONPATH in the final container
|
||||
- ./docker:/app/docker
|
||||
- ./superset-core:/app/superset-core
|
||||
- superset_home:/app/superset_home
|
||||
|
||||
services:
|
||||
|
||||
@@ -71,12 +71,13 @@ x-common-build: &common-build
|
||||
context: .
|
||||
target: ${SUPERSET_BUILD_TARGET:-dev} # can use `dev` (default) or `lean`
|
||||
cache_from:
|
||||
- apache/superset-cache:3.10-slim-bookworm
|
||||
- apache/superset-cache:3.10-slim-trixie
|
||||
args:
|
||||
DEV_MODE: "true"
|
||||
INCLUDE_CHROMIUM: ${INCLUDE_CHROMIUM:-false}
|
||||
INCLUDE_FIREFOX: ${INCLUDE_FIREFOX:-false}
|
||||
BUILD_TRANSLATIONS: ${BUILD_TRANSLATIONS:-false}
|
||||
LOAD_EXAMPLES_DUCKDB: ${LOAD_EXAMPLES_DUCKDB:-true}
|
||||
|
||||
services:
|
||||
db-light:
|
||||
@@ -91,9 +92,7 @@ services:
|
||||
- db_home_light:/var/lib/postgresql/data
|
||||
- ./docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
|
||||
environment:
|
||||
# Override database name to avoid conflicts
|
||||
POSTGRES_DB: superset_light
|
||||
# Increase max connections for test runs
|
||||
command: postgres -c max_connections=200
|
||||
|
||||
superset-light:
|
||||
@@ -106,7 +105,6 @@ services:
|
||||
<<: *common-build
|
||||
command: ["/app/docker/docker-bootstrap.sh", "app"]
|
||||
restart: unless-stopped
|
||||
# No host port mapping - accessed via webpack dev server proxy
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
user: *superset-user
|
||||
@@ -115,16 +113,13 @@ services:
|
||||
condition: service_completed_successfully
|
||||
volumes: *superset-volumes
|
||||
environment:
|
||||
# Override DB connection for light service
|
||||
DATABASE_HOST: db-light
|
||||
DATABASE_DB: superset_light
|
||||
POSTGRES_DB: superset_light
|
||||
EXAMPLES_HOST: db-light
|
||||
EXAMPLES_DB: superset_light
|
||||
EXAMPLES_USER: superset
|
||||
EXAMPLES_PASSWORD: superset
|
||||
# Use light-specific config that disables Redis
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "duckdb:////app/data/examples.duckdb"
|
||||
SUPERSET_CONFIG_PATH: /app/docker/pythonpath_dev/superset_config_docker_light.py
|
||||
GITHUB_HEAD_REF: ${GITHUB_HEAD_REF:-}
|
||||
GITHUB_SHA: ${GITHUB_SHA:-}
|
||||
|
||||
superset-init-light:
|
||||
build:
|
||||
@@ -135,21 +130,16 @@ services:
|
||||
required: true
|
||||
- path: docker/.env-local # optional override
|
||||
required: false
|
||||
user: *superset-user
|
||||
depends_on:
|
||||
db-light:
|
||||
condition: service_started
|
||||
user: *superset-user
|
||||
volumes: *superset-volumes
|
||||
environment:
|
||||
# Override DB connection for light service
|
||||
DATABASE_HOST: db-light
|
||||
DATABASE_DB: superset_light
|
||||
POSTGRES_DB: superset_light
|
||||
EXAMPLES_HOST: db-light
|
||||
EXAMPLES_DB: superset_light
|
||||
EXAMPLES_USER: superset
|
||||
EXAMPLES_PASSWORD: superset
|
||||
# Use light-specific config that disables Redis
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "duckdb:////app/data/examples.duckdb"
|
||||
SUPERSET_CONFIG_PATH: /app/docker/pythonpath_dev/superset_config_docker_light.py
|
||||
healthcheck:
|
||||
disable: true
|
||||
@@ -172,8 +162,11 @@ services:
|
||||
SCARF_ANALYTICS: "${SCARF_ANALYTICS:-}"
|
||||
# configuring the dev-server to use the host.docker.internal to connect to the backend
|
||||
superset: "http://superset-light:8088"
|
||||
# Webpack dev server configuration
|
||||
WEBPACK_DEVSERVER_HOST: "${WEBPACK_DEVSERVER_HOST:-127.0.0.1}"
|
||||
WEBPACK_DEVSERVER_PORT: "${WEBPACK_DEVSERVER_PORT:-9000}"
|
||||
ports:
|
||||
- "127.0.0.1:${NODE_PORT:-9001}:9000" # Parameterized port
|
||||
- "${NODE_PORT:-9001}:9000" # Parameterized port, accessible on all interfaces
|
||||
command: ["/app/docker/docker-frontend.sh"]
|
||||
env_file:
|
||||
- path: docker/.env # default
|
||||
@@ -199,15 +192,12 @@ services:
|
||||
user: *superset-user
|
||||
volumes: *superset-volumes
|
||||
environment:
|
||||
# Test-specific database configuration
|
||||
DATABASE_HOST: db-light
|
||||
DATABASE_DB: test
|
||||
POSTGRES_DB: test
|
||||
# Point to test database
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@db-light:5432/test
|
||||
# Use the light test config that doesn't require Redis
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "duckdb:////app/data/examples.duckdb"
|
||||
SUPERSET_CONFIG: superset_test_config_light
|
||||
# Python path includes test directory
|
||||
PYTHONPATH: /app/pythonpath:/app/docker/pythonpath_dev:/app
|
||||
|
||||
volumes:
|
||||
|
||||
@@ -33,7 +33,7 @@ x-common-build: &common-build
|
||||
context: .
|
||||
target: dev
|
||||
cache_from:
|
||||
- apache/superset-cache:3.10-slim-bookworm
|
||||
- apache/superset-cache:3.10-slim-trixie
|
||||
|
||||
services:
|
||||
redis:
|
||||
|
||||
@@ -29,19 +29,22 @@ x-superset-volumes: &superset-volumes
|
||||
# /app/pythonpath_docker will be appended to the PYTHONPATH in the final container
|
||||
- ./docker:/app/docker
|
||||
- ./superset:/app/superset
|
||||
- ./superset-core:/app/superset-core
|
||||
- ./superset-frontend:/app/superset-frontend
|
||||
- superset_home:/app/superset_home
|
||||
- ./tests:/app/tests
|
||||
- superset_data:/app/data
|
||||
x-common-build: &common-build
|
||||
context: .
|
||||
target: ${SUPERSET_BUILD_TARGET:-dev} # can use `dev` (default) or `lean`
|
||||
cache_from:
|
||||
- apache/superset-cache:3.10-slim-bookworm
|
||||
- apache/superset-cache:3.10-slim-trixie
|
||||
args:
|
||||
DEV_MODE: "true"
|
||||
INCLUDE_CHROMIUM: ${INCLUDE_CHROMIUM:-false}
|
||||
INCLUDE_FIREFOX: ${INCLUDE_FIREFOX:-false}
|
||||
BUILD_TRANSLATIONS: ${BUILD_TRANSLATIONS:-false}
|
||||
LOAD_EXAMPLES_DUCKDB: ${LOAD_EXAMPLES_DUCKDB:-true}
|
||||
|
||||
services:
|
||||
nginx:
|
||||
@@ -107,6 +110,8 @@ services:
|
||||
superset-init:
|
||||
condition: service_completed_successfully
|
||||
volumes: *superset-volumes
|
||||
environment:
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "duckdb:////app/data/examples.duckdb"
|
||||
|
||||
superset-websocket:
|
||||
container_name: superset_websocket
|
||||
@@ -158,6 +163,8 @@ services:
|
||||
condition: service_started
|
||||
user: *superset-user
|
||||
volumes: *superset-volumes
|
||||
environment:
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "duckdb:////app/data/examples.duckdb"
|
||||
healthcheck:
|
||||
disable: true
|
||||
|
||||
@@ -269,3 +276,5 @@ volumes:
|
||||
external: false
|
||||
redis:
|
||||
external: false
|
||||
superset_data:
|
||||
external: false
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
# Ensure this script is run as root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
if [[ ${EUID} -ne 0 ]]; then
|
||||
echo "This script must be run as root" >&2
|
||||
exit 1
|
||||
fi
|
||||
@@ -42,7 +42,7 @@ echo -e "${GREEN}Installing packages: $@${RESET}"
|
||||
apt-get install -yqq --no-install-recommends "$@"
|
||||
|
||||
echo -e "${GREEN}Autoremoving unnecessary packages...${RESET}"
|
||||
apt-get autoremove -y
|
||||
apt-get autoremove -yqq --purge
|
||||
|
||||
echo -e "${GREEN}Cleaning up package cache and metadata...${RESET}"
|
||||
apt-get clean
|
||||
|
||||
@@ -21,8 +21,15 @@ set -eo pipefail
|
||||
# Make python interactive
|
||||
if [ "$DEV_MODE" == "true" ]; then
|
||||
if [ "$(whoami)" = "root" ] && command -v uv > /dev/null 2>&1; then
|
||||
echo "Reinstalling the app in editable mode"
|
||||
uv pip install -e .
|
||||
# Always ensure superset-core is available
|
||||
echo "Installing superset-core in editable mode"
|
||||
uv pip install --no-deps -e /app/superset-core
|
||||
|
||||
# Only reinstall the main app for non-worker processes
|
||||
if [ "$1" != "worker" ] && [ "$1" != "beat" ]; then
|
||||
echo "Reinstalling the app in editable mode"
|
||||
uv pip install -e .
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
REQUIREMENTS_LOCAL="/app/docker/requirements-local.txt"
|
||||
@@ -34,7 +41,8 @@ if [ "$CYPRESS_CONFIG" == "true" ]; then
|
||||
export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset_cypress
|
||||
PORT=8081
|
||||
fi
|
||||
if [[ "$DATABASE_DIALECT" == postgres* ]] && [ "$(whoami)" = "root" ]; then
|
||||
# Skip postgres requirements installation for workers to avoid conflicts
|
||||
if [[ "$DATABASE_DIALECT" == postgres* ]] && [ "$(whoami)" = "root" ] && [ "$1" != "worker" ] && [ "$1" != "beat" ]; then
|
||||
# older images may not have the postgres dev requirements installed
|
||||
echo "Installing postgres requirements"
|
||||
if command -v uv > /dev/null 2>&1; then
|
||||
@@ -72,7 +80,7 @@ case "${1}" in
|
||||
;;
|
||||
app)
|
||||
echo "Starting web app (using development server)..."
|
||||
flask run -p $PORT --with-threads --reload --debugger --host=0.0.0.0
|
||||
flask run -p $PORT --reload --debugger --without-threads --host=0.0.0.0
|
||||
;;
|
||||
app-gunicorn)
|
||||
echo "Starting web app..."
|
||||
|
||||
@@ -69,6 +69,8 @@ echo_step "3" "Complete" "Setting up roles and perms"
|
||||
if [ "$SUPERSET_LOAD_EXAMPLES" = "yes" ]; then
|
||||
# Load some data to play with
|
||||
echo_step "4" "Starting" "Loading examples"
|
||||
|
||||
|
||||
# If Cypress run which consumes superset_test_config – load required data for tests
|
||||
if [ "$CYPRESS_CONFIG" == "true" ]; then
|
||||
superset load_examples --load-test-data
|
||||
|
||||
@@ -38,14 +38,14 @@ for arg in "$@"; do
|
||||
done
|
||||
|
||||
# Install build-essential if required
|
||||
if $REQUIRES_BUILD_ESSENTIAL; then
|
||||
if ${REQUIRES_BUILD_ESSENTIAL}; then
|
||||
echo "Installing build-essential for package builds..."
|
||||
apt-get update -qq \
|
||||
&& apt-get install -yqq --no-install-recommends build-essential
|
||||
fi
|
||||
|
||||
# Choose whether to use pip cache
|
||||
if $USE_CACHE; then
|
||||
if ${USE_CACHE}; then
|
||||
echo "Using pip cache..."
|
||||
uv pip install "${ARGS[@]}"
|
||||
else
|
||||
@@ -54,7 +54,7 @@ else
|
||||
fi
|
||||
|
||||
# Remove build-essential if it was installed
|
||||
if $REQUIRES_BUILD_ESSENTIAL; then
|
||||
if ${REQUIRES_BUILD_ESSENTIAL}; then
|
||||
echo "Removing build-essential to keep the image lean..."
|
||||
apt-get autoremove -yqq --purge build-essential \
|
||||
&& apt-get clean \
|
||||
|
||||
@@ -49,12 +49,18 @@ SQLALCHEMY_DATABASE_URI = (
|
||||
f"{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_DB}"
|
||||
)
|
||||
|
||||
SQLALCHEMY_EXAMPLES_URI = (
|
||||
f"{DATABASE_DIALECT}://"
|
||||
f"{EXAMPLES_USER}:{EXAMPLES_PASSWORD}@"
|
||||
f"{EXAMPLES_HOST}:{EXAMPLES_PORT}/{EXAMPLES_DB}"
|
||||
# Use environment variable if set, otherwise construct from components
|
||||
# This MUST take precedence over any other configuration
|
||||
SQLALCHEMY_EXAMPLES_URI = os.getenv(
|
||||
"SUPERSET__SQLALCHEMY_EXAMPLES_URI",
|
||||
(
|
||||
f"{DATABASE_DIALECT}://"
|
||||
f"{EXAMPLES_USER}:{EXAMPLES_PASSWORD}@"
|
||||
f"{EXAMPLES_HOST}:{EXAMPLES_PORT}/{EXAMPLES_DB}"
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
REDIS_HOST = os.getenv("REDIS_HOST", "redis")
|
||||
REDIS_PORT = os.getenv("REDIS_PORT", "6379")
|
||||
REDIS_CELERY_DB = os.getenv("REDIS_CELERY_DB", "0")
|
||||
@@ -132,7 +138,7 @@ try:
|
||||
from superset_config_docker import * # noqa: F403
|
||||
|
||||
logger.info(
|
||||
f"Loaded your Docker configuration at [{superset_config_docker.__file__}]"
|
||||
"Loaded your Docker configuration at [%s]", superset_config_docker.__file__
|
||||
)
|
||||
except ImportError:
|
||||
logger.info("Using default Docker config...")
|
||||
|
||||
180
docs/README.md
180
docs/README.md
@@ -21,3 +21,183 @@ This is the public documentation site for Superset, built using
|
||||
[Docusaurus 3](https://docusaurus.io/). See
|
||||
[CONTRIBUTING.md](../CONTRIBUTING.md#documentation) for documentation on
|
||||
contributing to documentation.
|
||||
|
||||
## Version Management
|
||||
|
||||
The Superset documentation site uses Docusaurus versioning with three independent versioned sections:
|
||||
|
||||
- **Main Documentation** (`/docs/`) - Core Superset documentation
|
||||
- **Developer Portal** (`/developer_portal/`) - Developer guides and tutorials
|
||||
- **Component Playground** (`/components/`) - Interactive component examples (currently disabled)
|
||||
|
||||
Each section maintains its own version history and can be versioned independently.
|
||||
|
||||
### Creating a New Version
|
||||
|
||||
To create a new version for any section, use the Docusaurus version command with the appropriate plugin ID or use our automated scripts:
|
||||
|
||||
#### Using Automated Scripts (Required)
|
||||
|
||||
**⚠️ Important:** Always use these custom commands instead of the native Docusaurus commands. These scripts ensure that both the Docusaurus versioning system AND the `versions-config.json` file are updated correctly.
|
||||
|
||||
```bash
|
||||
# Main Documentation
|
||||
yarn version:add:docs 1.2.0
|
||||
|
||||
# Developer Portal
|
||||
yarn version:add:developer_portal 1.2.0
|
||||
|
||||
# Component Playground (when enabled)
|
||||
yarn version:add:components 1.2.0
|
||||
```
|
||||
|
||||
**Do NOT use** the native Docusaurus commands directly (`yarn docusaurus docs:version`), as they will:
|
||||
- ❌ Create version files but NOT update `versions-config.json`
|
||||
- ❌ Cause versions to not appear in dropdown menus
|
||||
- ❌ Require manual fixes to synchronize the configuration
|
||||
|
||||
### Managing Versions
|
||||
|
||||
#### With Automated Scripts
|
||||
The automated scripts handle all configuration updates automatically. No manual editing required!
|
||||
|
||||
#### Manual Configuration
|
||||
If creating versions manually, you'll need to:
|
||||
|
||||
1. **Update `versions-config.json`** (or `docusaurus.config.ts` if not using dynamic config):
|
||||
- Add version to `onlyIncludeVersions` array
|
||||
- Add version metadata to `versions` object
|
||||
- Update `lastVersion` if needed
|
||||
|
||||
2. **Files Created by Versioning**:
|
||||
When a new version is created, Docusaurus generates:
|
||||
- **Versioned docs folder**: `[section]_versioned_docs/version-X.X.X/`
|
||||
- **Versioned sidebars**: `[section]_versioned_sidebars/version-X.X.X-sidebars.json`
|
||||
- **Versions list**: `[section]_versions.json`
|
||||
|
||||
Note: For main docs, the prefix is omitted (e.g., `versioned_docs/` instead of `docs_versioned_docs/`)
|
||||
|
||||
3. **Important**: After adding a version, restart the development server to see changes:
|
||||
```bash
|
||||
yarn stop
|
||||
yarn start
|
||||
```
|
||||
|
||||
### Removing a Version
|
||||
|
||||
#### Using Automated Scripts (Recommended)
|
||||
```bash
|
||||
# Main Documentation
|
||||
yarn version:remove:docs 1.0.0
|
||||
|
||||
# Developer Portal
|
||||
yarn version:remove:developer_portal 1.0.0
|
||||
|
||||
# Component Playground
|
||||
yarn version:remove:components 1.0.0
|
||||
```
|
||||
|
||||
#### Manual Removal
|
||||
To manually remove a version:
|
||||
|
||||
1. **Delete the version folder** from the appropriate location:
|
||||
- Main docs: `versioned_docs/version-X.X.X/` (no prefix for main)
|
||||
- Developer Portal: `developer_portal_versioned_docs/version-X.X.X/`
|
||||
- Components: `components_versioned_docs/version-X.X.X/`
|
||||
|
||||
2. **Delete the version metadata file**:
|
||||
- Main docs: `versioned_sidebars/version-X.X.X-sidebars.json` (no prefix)
|
||||
- Developer Portal: `developer_portal_versioned_sidebars/version-X.X.X-sidebars.json`
|
||||
- Components: `components_versioned_sidebars/version-X.X.X-sidebars.json`
|
||||
|
||||
3. **Update the versions list file**:
|
||||
- Main docs: `versions.json`
|
||||
- Developer Portal: `developer_portal_versions.json`
|
||||
- Components: `components_versions.json`
|
||||
|
||||
4. **Update configuration**:
|
||||
- If using dynamic config: Update `versions-config.json`
|
||||
- If using static config: Update `docusaurus.config.ts`
|
||||
|
||||
5. **Restart the server** to see changes
|
||||
|
||||
### Version Configuration Examples
|
||||
|
||||
#### Main Documentation (default plugin)
|
||||
```typescript
|
||||
docs: {
|
||||
includeCurrentVersion: true,
|
||||
lastVersion: 'current', // Makes /docs/ show Next version
|
||||
onlyIncludeVersions: ['current', '1.1.0', '1.0.0'],
|
||||
versions: {
|
||||
current: {
|
||||
label: 'Next',
|
||||
path: '', // Empty path for default routing
|
||||
banner: 'unreleased',
|
||||
},
|
||||
'1.1.0': {
|
||||
label: '1.1.0',
|
||||
path: '1.1.0',
|
||||
banner: 'none',
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
#### Developer Portal & Components (custom plugins)
|
||||
```typescript
|
||||
{
|
||||
id: 'developer_portal',
|
||||
path: 'developer_portal',
|
||||
routeBasePath: 'developer_portal',
|
||||
includeCurrentVersion: true,
|
||||
lastVersion: '1.1.0', // Default version
|
||||
onlyIncludeVersions: ['current', '1.1.0', '1.0.0'],
|
||||
versions: {
|
||||
current: {
|
||||
label: 'Next',
|
||||
path: 'next',
|
||||
banner: 'unreleased',
|
||||
},
|
||||
'1.1.0': {
|
||||
label: '1.1.0',
|
||||
path: '1.1.0',
|
||||
banner: 'none',
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Version naming**: Use semantic versioning (e.g., 1.0.0, 1.1.0, 2.0.0)
|
||||
2. **Version banners**: Use `'unreleased'` for development versions, `'none'` for stable releases
|
||||
3. **Limit displayed versions**: Use `onlyIncludeVersions` to show only relevant versions
|
||||
4. **Test locally**: Always test version changes locally before deploying
|
||||
5. **Independent versioning**: Each section can have different version numbers and release cycles
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
#### Version Not Showing After Creation
|
||||
|
||||
If you accidentally used `yarn docusaurus docs:version` instead of `yarn version:add`:
|
||||
1. **Problem**: The version files were created but `versions-config.json` wasn't updated
|
||||
2. **Solution**: Either:
|
||||
- Revert the changes: `git restore versions.json && rm -rf versioned_docs/ versioned_sidebars/`
|
||||
- Then use the correct command: `yarn version:add:docs <version>`
|
||||
|
||||
For other issues:
|
||||
- **Restart the server**: Changes to version configuration require a server restart
|
||||
- **Check config file**: Ensure `versions-config.json` includes the new version
|
||||
- **Verify files exist**: Check that versioned docs folder was created
|
||||
|
||||
#### Broken Links in Versioned Documentation
|
||||
When creating a new version, links in the documentation are preserved as-is. Common issues:
|
||||
- **Cross-section links**: Links between sections (e.g., from developer_portal to docs) need to be version-aware
|
||||
- **Absolute vs relative paths**: Use relative paths within the same section
|
||||
- **Version-specific URLs**: Update hardcoded URLs to use version variables
|
||||
|
||||
To fix broken links:
|
||||
1. Use `type: 'doc'` with `docId` for version-aware navigation in navbar
|
||||
2. Use relative paths within the same documentation section
|
||||
3. Test all versions after creation to identify broken links
|
||||
|
||||
105
docs/components/chart-components/bar-chart.md
Normal file
105
docs/components/chart-components/bar-chart.md
Normal file
@@ -0,0 +1,105 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: Bar Chart
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Bar Chart Component
|
||||
|
||||
The Bar Chart component is used to visualize categorical data with rectangular bars.
|
||||
|
||||
## Props
|
||||
|
||||
| Prop | Type | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `data` | `array` | `[]` | Array of data objects to visualize |
|
||||
| `width` | `number` | `800` | Width of the chart in pixels |
|
||||
| `height` | `number` | `600` | Height of the chart in pixels |
|
||||
| `xField` | `string` | - | Field name for x-axis values |
|
||||
| `yField` | `string` | - | Field name for y-axis values |
|
||||
| `colorField` | `string` | - | Field name for color encoding |
|
||||
| `colorScheme` | `string` | `'supersetColors'` | Color scheme to use |
|
||||
| `showLegend` | `boolean` | `true` | Whether to show the legend |
|
||||
| `showGrid` | `boolean` | `true` | Whether to show grid lines |
|
||||
| `labelPosition` | `string` | `'top'` | Position of bar labels: 'top', 'middle', 'bottom' |
|
||||
|
||||
## Examples
|
||||
|
||||
### Basic Bar Chart
|
||||
|
||||
```jsx
|
||||
import { BarChart } from '@superset-ui/chart-components';
|
||||
|
||||
const data = [
|
||||
{ category: 'A', value: 10 },
|
||||
{ category: 'B', value: 20 },
|
||||
{ category: 'C', value: 15 },
|
||||
{ category: 'D', value: 25 },
|
||||
];
|
||||
|
||||
function Example() {
|
||||
return (
|
||||
<BarChart
|
||||
data={data}
|
||||
width={800}
|
||||
height={400}
|
||||
xField="category"
|
||||
yField="value"
|
||||
colorScheme="supersetColors"
|
||||
/>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
### Grouped Bar Chart
|
||||
|
||||
```jsx
|
||||
import { BarChart } from '@superset-ui/chart-components';
|
||||
|
||||
const data = [
|
||||
{ category: 'A', group: 'Group 1', value: 10 },
|
||||
{ category: 'A', group: 'Group 2', value: 15 },
|
||||
{ category: 'B', group: 'Group 1', value: 20 },
|
||||
{ category: 'B', group: 'Group 2', value: 25 },
|
||||
{ category: 'C', group: 'Group 1', value: 15 },
|
||||
{ category: 'C', group: 'Group 2', value: 10 },
|
||||
];
|
||||
|
||||
function Example() {
|
||||
return (
|
||||
<BarChart
|
||||
data={data}
|
||||
width={800}
|
||||
height={400}
|
||||
xField="category"
|
||||
yField="value"
|
||||
colorField="group"
|
||||
colorScheme="supersetColors"
|
||||
/>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use bar charts when comparing quantities across categories
|
||||
- Sort bars by value for better readability, unless there's a natural order to the categories
|
||||
- Use consistent colors for the same categories across different charts
|
||||
- Consider using horizontal bar charts when category labels are long
|
||||
59
docs/components/index.md
Normal file
59
docs/components/index.md
Normal file
@@ -0,0 +1,59 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: Component Library
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Superset Component Library
|
||||
|
||||
Welcome to the Apache Superset Component Library documentation. This section provides comprehensive documentation for all the UI components, chart components, and layout components used in Superset.
|
||||
|
||||
## What is the Component Library?
|
||||
|
||||
The Component Library is a collection of reusable UI components that are used to build the Superset user interface. These components are designed to be consistent, accessible, and easy to use.
|
||||
|
||||
## Component Categories
|
||||
|
||||
The Component Library is organized into the following categories:
|
||||
|
||||
### UI Components
|
||||
|
||||
Basic UI components like buttons, inputs, dropdowns, and other form elements.
|
||||
|
||||
### Chart Components
|
||||
|
||||
Visualization components used to render different types of charts and graphs.
|
||||
|
||||
### Layout Components
|
||||
|
||||
Components used for page layout, such as containers, grids, and navigation elements.
|
||||
|
||||
## Versioning
|
||||
|
||||
The Component Library documentation follows its own versioning scheme, independent from the main Superset documentation. This allows us to update the component documentation as the components evolve, without affecting the main documentation.
|
||||
|
||||
## Getting Started
|
||||
|
||||
Browse the sidebar to explore the different components available in the library. Each component documentation includes:
|
||||
|
||||
- Component description and purpose
|
||||
- Props and configuration options
|
||||
- Usage examples
|
||||
- Best practices
|
||||
113
docs/components/layout-components/grid.md
Normal file
113
docs/components/layout-components/grid.md
Normal file
@@ -0,0 +1,113 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: Grid
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Grid Component
|
||||
|
||||
The Grid component provides a flexible layout system for arranging content in rows and columns.
|
||||
|
||||
## Props
|
||||
|
||||
| Prop | Type | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `gutter` | `number` or `[number, number]` | `0` | Grid spacing between items, can be a single number or [horizontal, vertical] |
|
||||
| `columns` | `number` | `12` | Number of columns in the grid |
|
||||
| `justify` | `string` | `'start'` | Horizontal alignment: 'start', 'center', 'end', 'space-between', 'space-around' |
|
||||
| `align` | `string` | `'top'` | Vertical alignment: 'top', 'middle', 'bottom' |
|
||||
| `wrap` | `boolean` | `true` | Whether to wrap items when they overflow |
|
||||
|
||||
### Row Props
|
||||
|
||||
| Prop | Type | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `gutter` | `number` or `[number, number]` | `0` | Spacing between items in the row |
|
||||
| `justify` | `string` | `'start'` | Horizontal alignment for this row |
|
||||
| `align` | `string` | `'top'` | Vertical alignment for this row |
|
||||
|
||||
### Col Props
|
||||
|
||||
| Prop | Type | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `span` | `number` | - | Number of columns the grid item spans |
|
||||
| `offset` | `number` | `0` | Number of columns the grid item is offset |
|
||||
| `xs`, `sm`, `md`, `lg`, `xl` | `number` or `object` | - | Responsive props for different screen sizes |
|
||||
|
||||
## Examples
|
||||
|
||||
### Basic Grid
|
||||
|
||||
```jsx
|
||||
import { Grid, Row, Col } from '@superset-ui/core';
|
||||
|
||||
function Example() {
|
||||
return (
|
||||
<Grid>
|
||||
<Row gutter={16}>
|
||||
<Col span={8}>
|
||||
<div>Column 1</div>
|
||||
</Col>
|
||||
<Col span={8}>
|
||||
<div>Column 2</div>
|
||||
</Col>
|
||||
<Col span={8}>
|
||||
<div>Column 3</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Grid>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
### Responsive Grid
|
||||
|
||||
```jsx
|
||||
import { Grid, Row, Col } from '@superset-ui/core';
|
||||
|
||||
function Example() {
|
||||
return (
|
||||
<Grid>
|
||||
<Row gutter={[16, 24]}>
|
||||
<Col xs={24} sm={12} md={8} lg={6}>
|
||||
<div>Responsive Column 1</div>
|
||||
</Col>
|
||||
<Col xs={24} sm={12} md={8} lg={6}>
|
||||
<div>Responsive Column 2</div>
|
||||
</Col>
|
||||
<Col xs={24} sm={12} md={8} lg={6}>
|
||||
<div>Responsive Column 3</div>
|
||||
</Col>
|
||||
<Col xs={24} sm={12} md={8} lg={6}>
|
||||
<div>Responsive Column 4</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Grid>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use the Grid system for complex layouts that need to be responsive
|
||||
- Specify column widths for different screen sizes to ensure proper responsive behavior
|
||||
- Use gutters to create appropriate spacing between grid items
|
||||
- Keep the grid structure consistent throughout your application
|
||||
- Consider using the grid system for dashboard layouts to ensure consistent spacing and alignment
|
||||
35
docs/components/test.mdx
Normal file
35
docs/components/test.mdx
Normal file
@@ -0,0 +1,35 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: Test
|
||||
---
|
||||
|
||||
import { StoryExample } from '../src/components/StorybookWrapper';
|
||||
|
||||
# Test
|
||||
|
||||
This is a test using our custom StorybookWrapper component.
|
||||
|
||||
<StoryExample
|
||||
component={() => (
|
||||
<div style={{ padding: '10px', background: '#f0f0f0', borderRadius: '4px' }}>
|
||||
This is a simple example component
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
146
docs/components/ui-components/button.mdx
Normal file
146
docs/components/ui-components/button.mdx
Normal file
@@ -0,0 +1,146 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: Button Component
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
import { StoryExample, StoryWithControls } from '../../src/components/StorybookWrapper';
|
||||
import { Button } from '../../../superset-frontend/packages/superset-ui-core/src/components/Button';
|
||||
|
||||
# Button Component
|
||||
|
||||
The Button component is a fundamental UI element used throughout Superset for user interactions.
|
||||
|
||||
## Basic Usage
|
||||
|
||||
The default button with primary styling:
|
||||
<StoryExample
|
||||
component={() => (
|
||||
<Button buttonStyle="primary" onClick={() => console.log('Clicked!')}>
|
||||
Click Me
|
||||
</Button>
|
||||
)}
|
||||
/>
|
||||
|
||||
## Interactive Example
|
||||
|
||||
<StoryWithControls
|
||||
component={({ buttonStyle, buttonSize, label, disabled }) => (
|
||||
<Button
|
||||
buttonStyle={buttonStyle}
|
||||
buttonSize={buttonSize}
|
||||
disabled={disabled}
|
||||
onClick={() => console.log('Clicked!')}
|
||||
>
|
||||
{label}
|
||||
</Button>
|
||||
)}
|
||||
props={{
|
||||
buttonStyle: 'primary',
|
||||
buttonSize: 'default',
|
||||
label: 'Click Me',
|
||||
disabled: false
|
||||
}}
|
||||
controls={[
|
||||
{
|
||||
name: 'buttonStyle',
|
||||
label: 'Button Style',
|
||||
type: 'select',
|
||||
options: ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'default', 'link', 'dashed']
|
||||
},
|
||||
{
|
||||
name: 'buttonSize',
|
||||
label: 'Button Size',
|
||||
type: 'select',
|
||||
options: ['default', 'small', 'xsmall']
|
||||
},
|
||||
{
|
||||
name: 'label',
|
||||
label: 'Button Text',
|
||||
type: 'text'
|
||||
},
|
||||
{
|
||||
name: 'disabled',
|
||||
label: 'Disabled',
|
||||
type: 'boolean'
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
## Props
|
||||
|
||||
| Prop | Type | Default | Description |
|
||||
|------|------|---------|-------------|
|
||||
| `buttonStyle` | `'primary' \| 'secondary' \| 'tertiary' \| 'success' \| 'warning' \| 'danger' \| 'default' \| 'link' \| 'dashed'` | `'default'` | Button style |
|
||||
| `buttonSize` | `'default' \| 'small' \| 'xsmall'` | `'default'` | Button size |
|
||||
| `disabled` | `boolean` | `false` | Whether the button is disabled |
|
||||
| `cta` | `boolean` | `false` | Whether the button is a call-to-action button |
|
||||
| `tooltip` | `ReactNode` | - | Tooltip content |
|
||||
| `placement` | `TooltipProps['placement']` | - | Tooltip placement |
|
||||
| `onClick` | `function` | - | Callback when button is clicked |
|
||||
| `href` | `string` | - | Turns button into an anchor link |
|
||||
| `target` | `string` | - | Target attribute for anchor links |
|
||||
|
||||
## Usage
|
||||
|
||||
```jsx
|
||||
import Button from 'src/components/Button';
|
||||
|
||||
function MyComponent() {
|
||||
return (
|
||||
<Button
|
||||
buttonStyle="primary"
|
||||
onClick={() => console.log('Button clicked')}
|
||||
>
|
||||
Click Me
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Button Styles
|
||||
|
||||
Superset provides a variety of button styles for different purposes:
|
||||
|
||||
- **Primary**: Used for primary actions
|
||||
- **Secondary**: Used for secondary actions
|
||||
- **Tertiary**: Used for less important actions
|
||||
- **Success**: Used for successful or confirming actions
|
||||
- **Warning**: Used for actions that require caution
|
||||
- **Danger**: Used for destructive actions
|
||||
- **Link**: Used for navigation
|
||||
- **Dashed**: Used for adding new items or features
|
||||
|
||||
## Button Sizes
|
||||
|
||||
Buttons come in three sizes:
|
||||
|
||||
- **Default**: Standard size for most use cases
|
||||
- **Small**: Compact size for tight spaces
|
||||
- **XSmall**: Extra small size for very limited spaces
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use primary buttons for the main action in a form or page
|
||||
- Use secondary buttons for alternative actions
|
||||
- Use danger buttons for destructive actions
|
||||
- Limit the number of primary buttons on a page to avoid confusion
|
||||
- Use consistent button styles throughout your application
|
||||
- Add tooltips to buttons when their purpose might not be immediately clear
|
||||
1
docs/components/versions.json
Normal file
1
docs/components/versions.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
1
docs/components_versions.json
Normal file
1
docs/components_versions.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
477
docs/developer_portal/api/frontend.md
Normal file
477
docs/developer_portal/api/frontend.md
Normal file
@@ -0,0 +1,477 @@
|
||||
---
|
||||
title: Frontend API Reference
|
||||
sidebar_position: 1
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Frontend API Reference
|
||||
|
||||
The `@apache-superset/core` package provides comprehensive APIs for frontend extension development. All APIs are organized into logical namespaces for easy discovery and use.
|
||||
|
||||
## Core API
|
||||
|
||||
The core namespace provides fundamental extension functionality.
|
||||
|
||||
### registerView
|
||||
|
||||
Registers a new view or panel in the specified contribution point.
|
||||
|
||||
```typescript
|
||||
core.registerView(
|
||||
id: string,
|
||||
component: React.ComponentType
|
||||
): Disposable
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```typescript
|
||||
const panel = context.core.registerView('my-extension.panel', () => (
|
||||
<MyPanelComponent />
|
||||
));
|
||||
```
|
||||
|
||||
### getActiveView
|
||||
|
||||
Gets the currently active view in a contribution area.
|
||||
|
||||
```typescript
|
||||
core.getActiveView(area: string): View | undefined
|
||||
```
|
||||
|
||||
## Commands API
|
||||
|
||||
Manages command registration and execution.
|
||||
|
||||
### registerCommand
|
||||
|
||||
Registers a new command that can be triggered by menus, shortcuts, or programmatically.
|
||||
|
||||
```typescript
|
||||
commands.registerCommand(
|
||||
id: string,
|
||||
handler: CommandHandler
|
||||
): Disposable
|
||||
|
||||
interface CommandHandler {
|
||||
title: string;
|
||||
icon?: string;
|
||||
execute: (...args: any[]) => any;
|
||||
isEnabled?: (...args: any[]) => boolean;
|
||||
}
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```typescript
|
||||
const cmd = context.commands.registerCommand('my-extension.analyze', {
|
||||
title: 'Analyze Query',
|
||||
icon: 'BarChartOutlined',
|
||||
execute: () => {
|
||||
const query = context.sqlLab.getCurrentQuery();
|
||||
// Perform analysis
|
||||
},
|
||||
isEnabled: () => {
|
||||
return context.sqlLab.hasActiveEditor();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### executeCommand
|
||||
|
||||
Executes a registered command by ID.
|
||||
|
||||
```typescript
|
||||
commands.executeCommand(id: string, ...args: any[]): Promise<any>
|
||||
```
|
||||
|
||||
## SQL Lab API
|
||||
|
||||
Provides access to SQL Lab functionality and events.
|
||||
|
||||
### Query Access
|
||||
|
||||
```typescript
|
||||
// Get current tab
|
||||
sqlLab.getCurrentTab(): Tab | undefined
|
||||
|
||||
// Get all tabs
|
||||
sqlLab.getTabs(): Tab[]
|
||||
|
||||
// Get current query
|
||||
sqlLab.getCurrentQuery(): string
|
||||
|
||||
// Get selected text
|
||||
sqlLab.getSelectedText(): string | undefined
|
||||
```
|
||||
|
||||
### Database Access
|
||||
|
||||
```typescript
|
||||
// Get available databases
|
||||
sqlLab.getDatabases(): Database[]
|
||||
|
||||
// Get database by ID
|
||||
sqlLab.getDatabase(id: number): Database | undefined
|
||||
|
||||
// Get schemas for database
|
||||
sqlLab.getSchemas(databaseId: number): Promise<string[]>
|
||||
|
||||
// Get tables for schema
|
||||
sqlLab.getTables(
|
||||
databaseId: number,
|
||||
schema: string
|
||||
): Promise<Table[]>
|
||||
```
|
||||
|
||||
### Events
|
||||
|
||||
```typescript
|
||||
// Query execution events
|
||||
sqlLab.onDidQueryRun: Event<QueryResult>
|
||||
sqlLab.onDidQueryStop: Event<QueryResult>
|
||||
sqlLab.onDidQueryFail: Event<QueryError>
|
||||
|
||||
// Editor events
|
||||
sqlLab.onDidChangeEditorContent: Event<string>
|
||||
sqlLab.onDidChangeSelection: Event<Selection>
|
||||
|
||||
// Tab events
|
||||
sqlLab.onDidChangeActiveTab: Event<Tab>
|
||||
sqlLab.onDidCloseTab: Event<Tab>
|
||||
sqlLab.onDidChangeTabTitle: Event<{tab: Tab, title: string}>
|
||||
|
||||
// Panel events
|
||||
sqlLab.onDidOpenPanel: Event<Panel>
|
||||
sqlLab.onDidClosePanel: Event<Panel>
|
||||
sqlLab.onDidChangeActivePanel: Event<Panel>
|
||||
```
|
||||
|
||||
**Event Usage Example:**
|
||||
```typescript
|
||||
const disposable = context.sqlLab.onDidQueryRun((result) => {
|
||||
console.log('Query executed:', result.query);
|
||||
console.log('Rows returned:', result.rowCount);
|
||||
console.log('Execution time:', result.executionTime);
|
||||
});
|
||||
|
||||
// Remember to dispose when done
|
||||
context.subscriptions.push(disposable);
|
||||
```
|
||||
|
||||
## Authentication API
|
||||
|
||||
Handles authentication and security tokens.
|
||||
|
||||
### getCSRFToken
|
||||
|
||||
Gets the current CSRF token for API requests.
|
||||
|
||||
```typescript
|
||||
authentication.getCSRFToken(): Promise<string>
|
||||
```
|
||||
|
||||
### getCurrentUser
|
||||
|
||||
Gets information about the current user.
|
||||
|
||||
```typescript
|
||||
authentication.getCurrentUser(): User
|
||||
|
||||
interface User {
|
||||
id: number;
|
||||
username: string;
|
||||
email: string;
|
||||
roles: Role[];
|
||||
permissions: Permission[];
|
||||
}
|
||||
```
|
||||
|
||||
### hasPermission
|
||||
|
||||
Checks if the current user has a specific permission.
|
||||
|
||||
```typescript
|
||||
authentication.hasPermission(permission: string): boolean
|
||||
```
|
||||
|
||||
## Extensions API
|
||||
|
||||
Manages extension lifecycle and inter-extension communication.
|
||||
|
||||
### getExtension
|
||||
|
||||
Gets information about an installed extension.
|
||||
|
||||
```typescript
|
||||
extensions.getExtension(id: string): Extension | undefined
|
||||
|
||||
interface Extension {
|
||||
id: string;
|
||||
name: string;
|
||||
version: string;
|
||||
isActive: boolean;
|
||||
metadata: ExtensionMetadata;
|
||||
}
|
||||
```
|
||||
|
||||
### getActiveExtensions
|
||||
|
||||
Gets all currently active extensions.
|
||||
|
||||
```typescript
|
||||
extensions.getActiveExtensions(): Extension[]
|
||||
```
|
||||
|
||||
### Events
|
||||
|
||||
```typescript
|
||||
// Extension lifecycle events
|
||||
extensions.onDidActivateExtension: Event<Extension>
|
||||
extensions.onDidDeactivateExtension: Event<Extension>
|
||||
```
|
||||
|
||||
## UI Components
|
||||
|
||||
Import pre-built UI components from `@apache-superset/core`:
|
||||
|
||||
```typescript
|
||||
import {
|
||||
Button,
|
||||
Select,
|
||||
Input,
|
||||
Table,
|
||||
Modal,
|
||||
Alert,
|
||||
Tabs,
|
||||
Card,
|
||||
Dropdown,
|
||||
Menu,
|
||||
Tooltip,
|
||||
Icon,
|
||||
// ... many more
|
||||
} from '@apache-superset/core';
|
||||
```
|
||||
|
||||
### Example Component Usage
|
||||
|
||||
```typescript
|
||||
import { Button, Alert } from '@apache-superset/core';
|
||||
|
||||
function MyExtensionPanel() {
|
||||
return (
|
||||
<div>
|
||||
<Alert
|
||||
message="Extension Loaded"
|
||||
description="Your extension is ready to use"
|
||||
type="success"
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
onClick={() => console.log('Clicked!')}
|
||||
>
|
||||
Execute Action
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Storage API
|
||||
|
||||
Provides persistent storage for extension data.
|
||||
|
||||
### Local Storage
|
||||
|
||||
```typescript
|
||||
// Store data
|
||||
storage.local.set(key: string, value: any): Promise<void>
|
||||
|
||||
// Retrieve data
|
||||
storage.local.get(key: string): Promise<any>
|
||||
|
||||
// Remove data
|
||||
storage.local.remove(key: string): Promise<void>
|
||||
|
||||
// Clear all extension data
|
||||
storage.local.clear(): Promise<void>
|
||||
```
|
||||
|
||||
### Workspace Storage
|
||||
|
||||
Workspace storage is shared across all users for collaborative features.
|
||||
|
||||
```typescript
|
||||
storage.workspace.set(key: string, value: any): Promise<void>
|
||||
storage.workspace.get(key: string): Promise<any>
|
||||
storage.workspace.remove(key: string): Promise<void>
|
||||
```
|
||||
|
||||
## Network API
|
||||
|
||||
Utilities for making API calls to Superset.
|
||||
|
||||
### fetch
|
||||
|
||||
Enhanced fetch with CSRF token handling.
|
||||
|
||||
```typescript
|
||||
network.fetch(url: string, options?: RequestInit): Promise<Response>
|
||||
```
|
||||
|
||||
### API Client
|
||||
|
||||
Type-safe API client for Superset endpoints.
|
||||
|
||||
```typescript
|
||||
// Get chart data
|
||||
network.api.charts.get(id: number): Promise<Chart>
|
||||
|
||||
// Query database
|
||||
network.api.sqlLab.execute(
|
||||
databaseId: number,
|
||||
query: string
|
||||
): Promise<QueryResult>
|
||||
|
||||
// Get datasets
|
||||
network.api.datasets.list(): Promise<Dataset[]>
|
||||
```
|
||||
|
||||
## Utility Functions
|
||||
|
||||
### Formatting
|
||||
|
||||
```typescript
|
||||
// Format numbers
|
||||
utils.formatNumber(value: number, format?: string): string
|
||||
|
||||
// Format dates
|
||||
utils.formatDate(date: Date, format?: string): string
|
||||
|
||||
// Format SQL
|
||||
utils.formatSQL(sql: string): string
|
||||
```
|
||||
|
||||
### Validation
|
||||
|
||||
```typescript
|
||||
// Validate SQL syntax
|
||||
utils.validateSQL(sql: string): ValidationResult
|
||||
|
||||
// Check if valid database ID
|
||||
utils.isValidDatabaseId(id: any): boolean
|
||||
```
|
||||
|
||||
## TypeScript Types
|
||||
|
||||
Import common types for type safety:
|
||||
|
||||
```typescript
|
||||
import type {
|
||||
Database,
|
||||
Dataset,
|
||||
Chart,
|
||||
Dashboard,
|
||||
Query,
|
||||
QueryResult,
|
||||
Tab,
|
||||
Panel,
|
||||
User,
|
||||
Role,
|
||||
Permission,
|
||||
ExtensionContext,
|
||||
Disposable,
|
||||
Event,
|
||||
// ... more types
|
||||
} from '@apache-superset/core';
|
||||
```
|
||||
|
||||
## Extension Context
|
||||
|
||||
The context object passed to your extension's `activate` function:
|
||||
|
||||
```typescript
|
||||
interface ExtensionContext {
|
||||
// Subscription management
|
||||
subscriptions: Disposable[];
|
||||
|
||||
// Extension metadata
|
||||
extensionId: string;
|
||||
extensionPath: string;
|
||||
|
||||
// API namespaces
|
||||
core: CoreAPI;
|
||||
commands: CommandsAPI;
|
||||
sqlLab: SqlLabAPI;
|
||||
authentication: AuthenticationAPI;
|
||||
extensions: ExtensionsAPI;
|
||||
storage: StorageAPI;
|
||||
network: NetworkAPI;
|
||||
utils: UtilsAPI;
|
||||
|
||||
// Logging
|
||||
logger: Logger;
|
||||
}
|
||||
```
|
||||
|
||||
## Event Handling
|
||||
|
||||
Events follow the VS Code pattern with subscribe/dispose:
|
||||
|
||||
```typescript
|
||||
// Subscribe to event
|
||||
const disposable = sqlLab.onDidQueryRun((result) => {
|
||||
// Handle event
|
||||
});
|
||||
|
||||
// Dispose when done
|
||||
disposable.dispose();
|
||||
|
||||
// Or add to context for automatic cleanup
|
||||
context.subscriptions.push(disposable);
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always dispose subscriptions** to prevent memory leaks
|
||||
2. **Use TypeScript** for better IDE support and type safety
|
||||
3. **Handle errors gracefully** with try-catch blocks
|
||||
4. **Check permissions** before sensitive operations
|
||||
5. **Use provided UI components** for consistency
|
||||
6. **Cache API responses** when appropriate
|
||||
7. **Validate user input** before processing
|
||||
|
||||
## Version Compatibility
|
||||
|
||||
The frontend API follows semantic versioning:
|
||||
|
||||
- **Major version**: Breaking changes
|
||||
- **Minor version**: New features, backward compatible
|
||||
- **Patch version**: Bug fixes
|
||||
|
||||
Check compatibility in your `extension.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"engines": {
|
||||
"@apache-superset/core": "^1.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
348
docs/developer_portal/architecture/overview.md
Normal file
348
docs/developer_portal/architecture/overview.md
Normal file
@@ -0,0 +1,348 @@
|
||||
---
|
||||
title: Architecture Overview
|
||||
sidebar_position: 1
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Extension Architecture Overview
|
||||
|
||||
The Superset extension architecture is designed to be modular, secure, and performant. This document provides a comprehensive overview of how extensions work and interact with the Superset host application.
|
||||
|
||||
## Core Principles
|
||||
|
||||
### 1. Lean Core
|
||||
Superset's core remains minimal, with features delegated to extensions wherever possible. Built-in features use the same APIs as external extensions, ensuring API quality through dogfooding.
|
||||
|
||||
### 2. Explicit Contribution Points
|
||||
All extension points are clearly defined and documented. Extensions declare their capabilities in metadata files, enabling predictable lifecycle management.
|
||||
|
||||
### 3. Versioned APIs
|
||||
Public interfaces follow semantic versioning, ensuring backward compatibility and safe evolution of the platform.
|
||||
|
||||
### 4. Lazy Loading
|
||||
Extensions load only when needed, minimizing performance impact and resource consumption.
|
||||
|
||||
### 5. Composability
|
||||
Architecture patterns and APIs are reusable across different Superset modules, promoting consistency.
|
||||
|
||||
### 6. Community-Driven
|
||||
The system evolves based on real-world feedback, with new extension points added as needs emerge.
|
||||
|
||||
## System Architecture
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Superset Host Application"
|
||||
Core[Core Application]
|
||||
API[Extension APIs]
|
||||
Loader[Extension Loader]
|
||||
Manager[Extension Manager]
|
||||
end
|
||||
|
||||
subgraph "Core Packages"
|
||||
FrontendCore["@apache-superset/core<br/>(Frontend)"]
|
||||
BackendCore["apache-superset-core<br/>(Backend)"]
|
||||
CLI["apache-superset-extensions-cli"]
|
||||
end
|
||||
|
||||
subgraph "Extension"
|
||||
Metadata[extension.json]
|
||||
Frontend[Frontend Code]
|
||||
Backend[Backend Code]
|
||||
Bundle[.supx Bundle]
|
||||
end
|
||||
|
||||
Core --> API
|
||||
API --> FrontendCore
|
||||
API --> BackendCore
|
||||
Loader --> Manager
|
||||
Manager --> Bundle
|
||||
Frontend --> FrontendCore
|
||||
Backend --> BackendCore
|
||||
CLI --> Bundle
|
||||
```
|
||||
|
||||
## Key Components
|
||||
|
||||
### Host Application
|
||||
|
||||
The Superset host application provides:
|
||||
|
||||
- **Extension APIs**: Well-defined interfaces for extensions to interact with Superset
|
||||
- **Extension Manager**: Handles lifecycle, activation, and deactivation
|
||||
- **Module Loader**: Dynamically loads extension code using Webpack Module Federation
|
||||
- **Security Context**: Manages permissions and sandboxing for extensions
|
||||
|
||||
### Core Packages
|
||||
|
||||
#### @apache-superset/core (Frontend)
|
||||
- Shared UI components and utilities
|
||||
- TypeScript type definitions
|
||||
- Frontend API implementations
|
||||
- Event system and command registry
|
||||
|
||||
#### apache-superset-core (Backend)
|
||||
- Python base classes and utilities
|
||||
- Database access APIs
|
||||
- Security and permission helpers
|
||||
- REST API registration
|
||||
|
||||
#### apache-superset-extensions-cli
|
||||
- Project scaffolding
|
||||
- Build and bundling tools
|
||||
- Development server
|
||||
- Package management
|
||||
|
||||
### Extension Structure
|
||||
|
||||
Each extension consists of:
|
||||
|
||||
- **Metadata** (`extension.json`): Declares capabilities and requirements
|
||||
- **Frontend**: React components and TypeScript code
|
||||
- **Backend**: Python modules and API endpoints
|
||||
- **Assets**: Styles, images, and other resources
|
||||
- **Bundle** (`.supx`): Packaged distribution format
|
||||
|
||||
## Module Federation
|
||||
|
||||
Extensions use Webpack Module Federation for dynamic loading:
|
||||
|
||||
```javascript
|
||||
// Extension webpack.config.js
|
||||
new ModuleFederationPlugin({
|
||||
name: 'my_extension',
|
||||
filename: 'remoteEntry.[contenthash].js',
|
||||
exposes: {
|
||||
'./index': './src/index.tsx',
|
||||
},
|
||||
externals: {
|
||||
'@apache-superset/core': 'superset',
|
||||
},
|
||||
shared: {
|
||||
react: { singleton: true },
|
||||
'react-dom': { singleton: true },
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
This allows:
|
||||
- **Independent builds**: Extensions compile separately from Superset
|
||||
- **Shared dependencies**: Common libraries like React aren't duplicated
|
||||
- **Dynamic loading**: Extensions load at runtime without rebuilding Superset
|
||||
- **Version compatibility**: Extensions declare compatible core versions
|
||||
|
||||
## Extension Lifecycle
|
||||
|
||||
### 1. Registration
|
||||
```typescript
|
||||
// Extension registered with host
|
||||
extensionManager.register({
|
||||
name: 'my-extension',
|
||||
version: '1.0.0',
|
||||
manifest: manifestData
|
||||
});
|
||||
```
|
||||
|
||||
### 2. Activation
|
||||
```typescript
|
||||
// activate() called when extension loads
|
||||
export function activate(context: ExtensionContext) {
|
||||
// Register contributions
|
||||
const disposables = [];
|
||||
|
||||
// Add panel
|
||||
disposables.push(
|
||||
context.core.registerView('my-panel', MyPanel)
|
||||
);
|
||||
|
||||
// Register command
|
||||
disposables.push(
|
||||
context.commands.registerCommand('my-command', {
|
||||
execute: () => { /* ... */ }
|
||||
})
|
||||
);
|
||||
|
||||
// Store for cleanup
|
||||
context.subscriptions.push(...disposables);
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Runtime
|
||||
- Extension responds to events
|
||||
- Provides UI components when requested
|
||||
- Executes commands when triggered
|
||||
- Accesses APIs as needed
|
||||
|
||||
### 4. Deactivation
|
||||
```typescript
|
||||
// Automatic cleanup of registered items
|
||||
export function deactivate() {
|
||||
// context.subscriptions automatically disposed
|
||||
// Additional cleanup if needed
|
||||
}
|
||||
```
|
||||
|
||||
## Contribution Types
|
||||
|
||||
### Views
|
||||
Extensions can add panels and UI components:
|
||||
|
||||
```json
|
||||
{
|
||||
"views": {
|
||||
"sqllab.panels": [{
|
||||
"id": "my-panel",
|
||||
"name": "My Panel",
|
||||
"icon": "ToolOutlined"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Commands
|
||||
Define executable actions:
|
||||
|
||||
```json
|
||||
{
|
||||
"commands": [{
|
||||
"command": "my-extension.run",
|
||||
"title": "Run Analysis",
|
||||
"icon": "PlayCircleOutlined"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### Menus
|
||||
Add items to existing menus:
|
||||
|
||||
```json
|
||||
{
|
||||
"menus": {
|
||||
"sqllab.editor": {
|
||||
"primary": [{
|
||||
"command": "my-extension.run",
|
||||
"when": "editorHasSelection"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### API Endpoints
|
||||
Register backend REST endpoints:
|
||||
|
||||
```python
|
||||
from superset_core.api import rest_api
|
||||
|
||||
@rest_api.route('/my-endpoint')
|
||||
def my_endpoint():
|
||||
return {'data': 'value'}
|
||||
```
|
||||
|
||||
## Security Model
|
||||
|
||||
### Permissions
|
||||
- Extensions run with user's permissions
|
||||
- No elevation of privileges
|
||||
- Access controlled by Superset's RBAC
|
||||
|
||||
### Sandboxing
|
||||
- Frontend code runs in browser context
|
||||
- Backend code runs in Python process
|
||||
- Future: Optional sandboxed execution
|
||||
|
||||
### Validation
|
||||
- Manifest validation on upload
|
||||
- Signature verification (future)
|
||||
- Dependency scanning
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### Lazy Loading
|
||||
- Extensions load only when features are accessed
|
||||
- Code splitting for large extensions
|
||||
- Cached after first load
|
||||
|
||||
### Bundle Optimization
|
||||
- Tree shaking removes unused code
|
||||
- Minification reduces size
|
||||
- Compression for network transfer
|
||||
|
||||
### Resource Management
|
||||
- Automatic cleanup on deactivation
|
||||
- Memory leak prevention
|
||||
- Event listener management
|
||||
|
||||
## Development vs Production
|
||||
|
||||
### Development Mode
|
||||
```python
|
||||
# superset_config.py
|
||||
ENABLE_EXTENSIONS = True
|
||||
LOCAL_EXTENSIONS = ['/path/to/extension']
|
||||
```
|
||||
- Hot reloading
|
||||
- Source maps
|
||||
- Debug logging
|
||||
|
||||
### Production Mode
|
||||
- Optimized bundles
|
||||
- Cached assets
|
||||
- Performance monitoring
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### Planned Features
|
||||
- Enhanced sandboxing
|
||||
- Extension marketplace
|
||||
- Inter-extension communication
|
||||
- Theme contributions
|
||||
- Chart type extensions
|
||||
|
||||
### API Expansion
|
||||
- Dashboard extensions
|
||||
- Database connector API
|
||||
- Security provider interface
|
||||
- Workflow automation
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
- ✅ Use TypeScript for type safety
|
||||
- ✅ Follow semantic versioning
|
||||
- ✅ Handle errors gracefully
|
||||
- ✅ Clean up resources properly
|
||||
- ✅ Document your extension
|
||||
|
||||
### Don'ts
|
||||
- ❌ Access private APIs
|
||||
- ❌ Modify global state directly
|
||||
- ❌ Block the main thread
|
||||
- ❌ Store sensitive data insecurely
|
||||
- ❌ Assume API stability in 0.x versions
|
||||
|
||||
## Learn More
|
||||
|
||||
- [API Reference](../api/frontend)
|
||||
- [Development Guide](../getting-started)
|
||||
- [Security Guidelines](./security)
|
||||
- [Performance Optimization](./performance)
|
||||
466
docs/developer_portal/cli/overview.md
Normal file
466
docs/developer_portal/cli/overview.md
Normal file
@@ -0,0 +1,466 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
---
|
||||
title: CLI Documentation
|
||||
sidebar_position: 1
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
# Superset Extensions CLI
|
||||
|
||||
The `apache-superset-extensions-cli` provides command-line tools for creating, developing, and packaging Superset extensions.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install apache-superset-extensions-cli
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
### init
|
||||
|
||||
Creates a new extension project with the standard folder structure.
|
||||
|
||||
```bash
|
||||
superset-extensions init <extension-name> [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--template <template>`: Use a specific template (default: basic)
|
||||
- `--author <name>`: Set the author name
|
||||
- `--description <text>`: Set the extension description
|
||||
- `--with-backend`: Include backend code structure
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
superset-extensions init my-extension \
|
||||
--author "John Doe" \
|
||||
--description "Adds custom analytics to SQL Lab" \
|
||||
--with-backend
|
||||
```
|
||||
|
||||
**Generated Structure:**
|
||||
```
|
||||
my-extension/
|
||||
├── extension.json
|
||||
├── frontend/
|
||||
│ ├── src/
|
||||
│ │ └── index.tsx
|
||||
│ ├── package.json
|
||||
│ ├── tsconfig.json
|
||||
│ └── webpack.config.js
|
||||
├── backend/
|
||||
│ ├── src/
|
||||
│ │ └── my_extension/
|
||||
│ │ ├── __init__.py
|
||||
│ │ └── entrypoint.py
|
||||
│ ├── tests/
|
||||
│ ├── pyproject.toml
|
||||
│ └── requirements.txt
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### dev
|
||||
|
||||
Starts the development server with hot reloading.
|
||||
|
||||
```bash
|
||||
superset-extensions dev [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--port <port>`: Development server port (default: 9001)
|
||||
- `--host <host>`: Development server host (default: localhost)
|
||||
- `--no-watch`: Disable file watching
|
||||
- `--verbose`: Show detailed output
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
# Start development server
|
||||
superset-extensions dev
|
||||
|
||||
# Output:
|
||||
⚙️ Building frontend assets...
|
||||
✅ Frontend rebuilt
|
||||
✅ Backend files synced
|
||||
✅ Manifest updated
|
||||
👀 Watching for changes...
|
||||
```
|
||||
|
||||
### build
|
||||
|
||||
Builds the extension for production.
|
||||
|
||||
```bash
|
||||
superset-extensions build [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--mode <mode>`: Build mode (development | production)
|
||||
- `--analyze`: Generate bundle analysis
|
||||
- `--source-maps`: Include source maps
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
# Production build
|
||||
superset-extensions build --mode production
|
||||
|
||||
# With analysis
|
||||
superset-extensions build --analyze
|
||||
```
|
||||
|
||||
### bundle
|
||||
|
||||
Creates a `.supx` package for distribution.
|
||||
|
||||
```bash
|
||||
superset-extensions bundle [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--output <path>`: Output directory (default: current)
|
||||
- `--sign`: Sign the package (requires certificate)
|
||||
- `--compress`: Compression level (0-9, default: 6)
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
# Create bundle
|
||||
superset-extensions bundle
|
||||
|
||||
# Creates: my-extension-1.0.0.supx
|
||||
```
|
||||
|
||||
### validate
|
||||
|
||||
Validates extension configuration and structure.
|
||||
|
||||
```bash
|
||||
superset-extensions validate [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--fix`: Auto-fix common issues
|
||||
- `--strict`: Enable strict validation
|
||||
|
||||
**Checks:**
|
||||
- Valid extension.json syntax
|
||||
- Required files present
|
||||
- Dependency versions
|
||||
- Module exports
|
||||
- TypeScript configuration
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
superset-extensions validate --strict
|
||||
|
||||
# Output:
|
||||
✅ extension.json valid
|
||||
✅ Frontend structure valid
|
||||
✅ Backend structure valid
|
||||
⚠️ Warning: Missing LICENSE file
|
||||
✅ Validation passed with warnings
|
||||
```
|
||||
|
||||
### test
|
||||
|
||||
Runs extension tests.
|
||||
|
||||
```bash
|
||||
superset-extensions test [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--coverage`: Generate coverage report
|
||||
- `--watch`: Run in watch mode
|
||||
- `--frontend-only`: Run only frontend tests
|
||||
- `--backend-only`: Run only backend tests
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
# Run all tests
|
||||
superset-extensions test --coverage
|
||||
|
||||
# Watch mode for frontend
|
||||
superset-extensions test --frontend-only --watch
|
||||
```
|
||||
|
||||
### publish
|
||||
|
||||
Publishes extension to a registry (future feature).
|
||||
|
||||
```bash
|
||||
superset-extensions publish [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--registry <url>`: Registry URL
|
||||
- `--token <token>`: Authentication token
|
||||
- `--dry-run`: Simulate publish
|
||||
|
||||
## Configuration
|
||||
|
||||
### Project Configuration
|
||||
|
||||
The CLI reads configuration from multiple sources:
|
||||
|
||||
1. **extension.json** - Extension metadata
|
||||
2. **package.json** - Frontend dependencies
|
||||
3. **pyproject.toml** - Backend configuration
|
||||
4. **.extensionrc** - CLI-specific settings
|
||||
|
||||
### .extensionrc Example
|
||||
|
||||
```json
|
||||
{
|
||||
"dev": {
|
||||
"port": 9001,
|
||||
"host": "localhost",
|
||||
"autoReload": true
|
||||
},
|
||||
"build": {
|
||||
"mode": "production",
|
||||
"sourceMaps": false,
|
||||
"optimization": true
|
||||
},
|
||||
"test": {
|
||||
"coverage": true,
|
||||
"threshold": {
|
||||
"statements": 80,
|
||||
"branches": 70,
|
||||
"functions": 80,
|
||||
"lines": 80
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Templates
|
||||
|
||||
### Available Templates
|
||||
|
||||
- **basic**: Simple extension with frontend only
|
||||
- **full-stack**: Frontend and backend components
|
||||
- **sql-panel**: SQL Lab panel extension
|
||||
- **api-only**: Backend API extension
|
||||
- **chart-plugin**: Custom chart visualization
|
||||
|
||||
### Using Templates
|
||||
|
||||
```bash
|
||||
# Use specific template
|
||||
superset-extensions init my-chart --template chart-plugin
|
||||
|
||||
# List available templates
|
||||
superset-extensions init --list-templates
|
||||
```
|
||||
|
||||
### Custom Templates
|
||||
|
||||
Create custom templates in `~/.superset-extensions/templates/`:
|
||||
|
||||
```
|
||||
~/.superset-extensions/templates/
|
||||
└── my-template/
|
||||
├── template.json
|
||||
└── files/
|
||||
└── ... template files ...
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### 1. Create Extension
|
||||
|
||||
```bash
|
||||
superset-extensions init awesome-feature
|
||||
cd awesome-feature
|
||||
```
|
||||
|
||||
### 2. Install Dependencies
|
||||
|
||||
```bash
|
||||
# Frontend
|
||||
cd frontend && npm install
|
||||
|
||||
# Backend (if applicable)
|
||||
cd ../backend && pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 3. Configure Superset
|
||||
|
||||
```python
|
||||
# superset_config.py
|
||||
ENABLE_EXTENSIONS = True
|
||||
LOCAL_EXTENSIONS = [
|
||||
"/path/to/awesome-feature"
|
||||
]
|
||||
```
|
||||
|
||||
### 4. Start Development
|
||||
|
||||
```bash
|
||||
# Terminal 1: Extension dev server
|
||||
superset-extensions dev
|
||||
|
||||
# Terminal 2: Superset
|
||||
superset run -p 8088 --reload
|
||||
```
|
||||
|
||||
### 5. Test Changes
|
||||
|
||||
Make changes to your code and see them reflected immediately in Superset.
|
||||
|
||||
### 6. Build and Package
|
||||
|
||||
```bash
|
||||
# Validate
|
||||
superset-extensions validate
|
||||
|
||||
# Test
|
||||
superset-extensions test
|
||||
|
||||
# Build
|
||||
superset-extensions build --mode production
|
||||
|
||||
# Bundle
|
||||
superset-extensions bundle
|
||||
```
|
||||
|
||||
### 7. Deploy
|
||||
|
||||
Upload the `.supx` file to your Superset instance.
|
||||
|
||||
## Environment Variables
|
||||
|
||||
The CLI respects these environment variables:
|
||||
|
||||
- `SUPERSET_EXTENSIONS_DEV_PORT`: Development server port
|
||||
- `SUPERSET_EXTENSIONS_DEV_HOST`: Development server host
|
||||
- `SUPERSET_BASE_URL`: Superset instance URL
|
||||
- `NODE_ENV`: Node environment (development/production)
|
||||
- `PYTHONPATH`: Python module search path
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
#### Port Already in Use
|
||||
|
||||
```bash
|
||||
# Use different port
|
||||
superset-extensions dev --port 9002
|
||||
```
|
||||
|
||||
#### Module Federation Errors
|
||||
|
||||
```bash
|
||||
# Rebuild with clean cache
|
||||
rm -rf dist/ node_modules/.cache
|
||||
superset-extensions build
|
||||
```
|
||||
|
||||
#### Python Import Errors
|
||||
|
||||
```bash
|
||||
# Ensure virtual environment is activated
|
||||
source venv/bin/activate
|
||||
superset-extensions dev
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
|
||||
Enable verbose output for troubleshooting:
|
||||
|
||||
```bash
|
||||
# Verbose output
|
||||
superset-extensions dev --verbose
|
||||
|
||||
# Debug webpack
|
||||
DEBUG=webpack:* superset-extensions build
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Version Control**: Commit `extension.json` but not `dist/`
|
||||
2. **Dependencies**: Pin versions in package.json
|
||||
3. **Testing**: Write tests for critical functionality
|
||||
4. **Documentation**: Keep README.md updated
|
||||
5. **Validation**: Run validate before bundling
|
||||
6. **Semantic Versioning**: Follow semver for releases
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Custom Webpack Configuration
|
||||
|
||||
Extend the default webpack config:
|
||||
|
||||
```javascript
|
||||
// webpack.config.js
|
||||
const baseConfig = require('./webpack.base.config');
|
||||
|
||||
module.exports = {
|
||||
...baseConfig,
|
||||
// Custom modifications
|
||||
resolve: {
|
||||
...baseConfig.resolve,
|
||||
alias: {
|
||||
'@': path.resolve(__dirname, 'src'),
|
||||
},
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
### CI/CD Integration
|
||||
|
||||
```yaml
|
||||
# .github/workflows/extension.yml
|
||||
name: Extension CI
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- uses: actions/setup-python@v2
|
||||
|
||||
- name: Install CLI
|
||||
run: pip install apache-superset-extensions-cli
|
||||
|
||||
- name: Validate
|
||||
run: superset-extensions validate --strict
|
||||
|
||||
- name: Test
|
||||
run: superset-extensions test --coverage
|
||||
|
||||
- name: Build
|
||||
run: superset-extensions build --mode production
|
||||
|
||||
- name: Bundle
|
||||
run: superset-extensions bundle
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
- **Documentation**: [Developer Portal](../)
|
||||
- **Examples**: [GitHub Repository](https://github.com/apache/superset/tree/master/extensions)
|
||||
- **Issues**: [GitHub Issues](https://github.com/apache/superset/issues)
|
||||
- **Community**: [Slack Channel](https://apache-superset.slack.com)
|
||||
464
docs/developer_portal/examples/index.md
Normal file
464
docs/developer_portal/examples/index.md
Normal file
@@ -0,0 +1,464 @@
|
||||
---
|
||||
title: Extension Examples
|
||||
sidebar_position: 1
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Extension Examples
|
||||
|
||||
Learn from real-world extension implementations that showcase different capabilities of the Superset extension system.
|
||||
|
||||
## Dataset References Panel
|
||||
|
||||
A SQL Lab panel that analyzes queries and displays information about referenced tables.
|
||||
|
||||
### Features
|
||||
- Parses SQL to extract table references
|
||||
- Shows table owners and permissions
|
||||
- Displays last partition information
|
||||
- Provides row count estimates
|
||||
|
||||
### Key Implementation
|
||||
|
||||
```typescript
|
||||
// Parse SQL and extract tables
|
||||
function extractTables(sql: string): TableReference[] {
|
||||
const tables = [];
|
||||
const tableRegex = /FROM\s+(\w+\.?\w+)/gi;
|
||||
let match;
|
||||
|
||||
while ((match = tableRegex.exec(sql)) !== null) {
|
||||
tables.push({
|
||||
schema: match[1].split('.')[0],
|
||||
table: match[1].split('.')[1] || match[1],
|
||||
});
|
||||
}
|
||||
|
||||
return tables;
|
||||
}
|
||||
|
||||
// Register panel
|
||||
export function activate(context: ExtensionContext) {
|
||||
const panel = context.core.registerView('dataset-references.panel', () => (
|
||||
<DatasetReferencesPanel />
|
||||
));
|
||||
|
||||
// Listen for query changes
|
||||
const listener = context.sqlLab.onDidChangeEditorContent((content) => {
|
||||
const tables = extractTables(content);
|
||||
updatePanelWithTables(tables);
|
||||
});
|
||||
|
||||
context.subscriptions.push(panel, listener);
|
||||
}
|
||||
```
|
||||
|
||||
### Manifest
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "dataset-references",
|
||||
"contributions": {
|
||||
"views": {
|
||||
"sqllab.panels": [{
|
||||
"id": "dataset-references.panel",
|
||||
"name": "Dataset References",
|
||||
"icon": "DatabaseOutlined",
|
||||
"location": "right"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Query Optimizer
|
||||
|
||||
Analyzes SQL queries and suggests optimizations.
|
||||
|
||||
### Features
|
||||
- Detects missing indexes
|
||||
- Suggests query rewrites
|
||||
- Identifies expensive operations
|
||||
- Provides execution plan analysis
|
||||
|
||||
### Implementation Highlights
|
||||
|
||||
```typescript
|
||||
// Register optimization command
|
||||
const optimizeCommand = context.commands.registerCommand('query-optimizer.analyze', {
|
||||
title: 'Analyze Query Performance',
|
||||
icon: 'ThunderboltOutlined',
|
||||
execute: async () => {
|
||||
const query = context.sqlLab.getCurrentQuery();
|
||||
const database = context.sqlLab.getCurrentDatabase();
|
||||
|
||||
// Get execution plan
|
||||
const plan = await getExecutionPlan(database.id, query);
|
||||
|
||||
// Analyze and suggest improvements
|
||||
const suggestions = analyzeExecutionPlan(plan);
|
||||
|
||||
// Show results in panel
|
||||
showOptimizationResults(suggestions);
|
||||
}
|
||||
});
|
||||
|
||||
// Add to editor menu
|
||||
"menus": {
|
||||
"sqllab.editor": {
|
||||
"primary": [{
|
||||
"command": "query-optimizer.analyze",
|
||||
"when": "editorHasContent"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Natural Language to SQL
|
||||
|
||||
Converts natural language questions to SQL queries using LLM integration.
|
||||
|
||||
### Features
|
||||
- Natural language input
|
||||
- Context-aware SQL generation
|
||||
- Query validation
|
||||
- History tracking
|
||||
|
||||
### Key Components
|
||||
|
||||
```typescript
|
||||
// Backend API endpoint
|
||||
@rest_api.route('/nl2sql/generate')
|
||||
def generate_sql(prompt: str, context: dict):
|
||||
# Use LLM to generate SQL
|
||||
sql = llm_client.generate(
|
||||
prompt=prompt,
|
||||
schema=context['schema'],
|
||||
examples=context['examples']
|
||||
)
|
||||
|
||||
# Validate generated SQL
|
||||
validation = validate_sql(sql)
|
||||
|
||||
return {
|
||||
'sql': sql,
|
||||
'valid': validation.is_valid,
|
||||
'errors': validation.errors
|
||||
}
|
||||
```
|
||||
|
||||
```typescript
|
||||
// Frontend integration
|
||||
function NL2SQLPanel() {
|
||||
const [prompt, setPrompt] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const generateSQL = async () => {
|
||||
setLoading(true);
|
||||
|
||||
const response = await context.network.api.post('/extensions/nl2sql/generate', {
|
||||
prompt,
|
||||
context: {
|
||||
database: context.sqlLab.getCurrentDatabase(),
|
||||
schema: await context.sqlLab.getCurrentSchema(),
|
||||
}
|
||||
});
|
||||
|
||||
if (response.valid) {
|
||||
// Insert SQL into editor
|
||||
context.sqlLab.insertText(response.sql);
|
||||
}
|
||||
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Input.TextArea
|
||||
value={prompt}
|
||||
onChange={(e) => setPrompt(e.target.value)}
|
||||
placeholder="Describe what data you want..."
|
||||
/>
|
||||
<Button onClick={generateSQL} loading={loading}>
|
||||
Generate SQL
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Schema Visualizer
|
||||
|
||||
Interactive database schema visualization.
|
||||
|
||||
### Features
|
||||
- Visual ERD diagram
|
||||
- Table relationships
|
||||
- Column details on hover
|
||||
- Export to image
|
||||
|
||||
### Implementation
|
||||
|
||||
```typescript
|
||||
import { Graph } from '@antv/g6';
|
||||
|
||||
function SchemaVisualizer() {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const [graph, setGraph] = useState<Graph>();
|
||||
|
||||
useEffect(() => {
|
||||
if (!containerRef.current) return;
|
||||
|
||||
const g = new Graph({
|
||||
container: containerRef.current,
|
||||
layout: {
|
||||
type: 'dagre',
|
||||
rankdir: 'LR',
|
||||
},
|
||||
defaultNode: {
|
||||
type: 'sql-table-node',
|
||||
},
|
||||
defaultEdge: {
|
||||
type: 'sql-relation-edge',
|
||||
},
|
||||
});
|
||||
|
||||
setGraph(g);
|
||||
loadSchemaData(g);
|
||||
|
||||
return () => g.destroy();
|
||||
}, []);
|
||||
|
||||
const loadSchemaData = async (g: Graph) => {
|
||||
const tables = await context.sqlLab.getTables();
|
||||
const nodes = tables.map(table => ({
|
||||
id: table.name,
|
||||
label: table.name,
|
||||
columns: table.columns,
|
||||
}));
|
||||
|
||||
const edges = extractRelationships(tables);
|
||||
|
||||
g.data({ nodes, edges });
|
||||
g.render();
|
||||
};
|
||||
|
||||
return <div ref={containerRef} style={{ height: '100%' }} />;
|
||||
}
|
||||
```
|
||||
|
||||
## SQL Formatter
|
||||
|
||||
Formats and beautifies SQL code with customizable rules.
|
||||
|
||||
### Features
|
||||
- Multiple formatting styles
|
||||
- Custom rule configuration
|
||||
- Batch formatting
|
||||
- Format on save
|
||||
|
||||
### Simple Implementation
|
||||
|
||||
```typescript
|
||||
import { format } from 'sql-formatter';
|
||||
|
||||
const formatCommand = context.commands.registerCommand('sql-formatter.format', {
|
||||
title: 'Format SQL',
|
||||
execute: () => {
|
||||
const sql = context.sqlLab.getCurrentQuery();
|
||||
|
||||
const formatted = format(sql, {
|
||||
language: 'sql',
|
||||
indent: ' ',
|
||||
uppercase: true,
|
||||
linesBetweenQueries: 2,
|
||||
});
|
||||
|
||||
context.sqlLab.replaceQuery(formatted);
|
||||
}
|
||||
});
|
||||
|
||||
// Auto-format on save
|
||||
context.sqlLab.onWillSaveQuery((event) => {
|
||||
if (context.storage.local.get('autoFormat')) {
|
||||
const formatted = format(event.query);
|
||||
event.waitUntil(Promise.resolve(formatted));
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Query History Search
|
||||
|
||||
Enhanced query history with advanced search and filtering.
|
||||
|
||||
### Features
|
||||
- Full-text search
|
||||
- Filter by date, user, database
|
||||
- Query statistics
|
||||
- Export capabilities
|
||||
|
||||
### UI Component
|
||||
|
||||
```typescript
|
||||
function QueryHistoryPanel() {
|
||||
const [queries, setQueries] = useState<Query[]>([]);
|
||||
const [filters, setFilters] = useState<Filters>({});
|
||||
|
||||
useEffect(() => {
|
||||
loadQueries();
|
||||
}, [filters]);
|
||||
|
||||
const loadQueries = async () => {
|
||||
const history = await context.network.api.get('/api/v1/query', {
|
||||
params: {
|
||||
...filters,
|
||||
page_size: 100,
|
||||
}
|
||||
});
|
||||
|
||||
setQueries(history.result);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<SearchFilters onChange={setFilters} />
|
||||
<Table
|
||||
dataSource={queries}
|
||||
columns={[
|
||||
{ title: 'Query', dataIndex: 'sql', ellipsis: true },
|
||||
{ title: 'Database', dataIndex: 'database' },
|
||||
{ title: 'Status', dataIndex: 'status' },
|
||||
{ title: 'Duration', dataIndex: 'duration' },
|
||||
{ title: 'User', dataIndex: 'user' },
|
||||
{
|
||||
title: 'Actions',
|
||||
render: (query) => (
|
||||
<Button
|
||||
icon={<CopyOutlined />}
|
||||
onClick={() => context.sqlLab.insertText(query.sql)}
|
||||
/>
|
||||
),
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Git Integration
|
||||
|
||||
Version control for SQL queries and dashboards.
|
||||
|
||||
### Features
|
||||
- Save queries to Git
|
||||
- Track changes
|
||||
- Collaborative editing
|
||||
- Branch management
|
||||
|
||||
### Backend Integration
|
||||
|
||||
```python
|
||||
from git import Repo
|
||||
|
||||
class GitExtension:
|
||||
def __init__(self, repo_path):
|
||||
self.repo = Repo(repo_path)
|
||||
|
||||
def save_query(self, query, message):
|
||||
# Save query to file
|
||||
path = f"queries/{query.name}.sql"
|
||||
with open(path, 'w') as f:
|
||||
f.write(query.sql)
|
||||
|
||||
# Commit to Git
|
||||
self.repo.index.add([path])
|
||||
self.repo.index.commit(message)
|
||||
|
||||
return {
|
||||
'status': 'success',
|
||||
'commit': self.repo.head.commit.hexsha
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices from Examples
|
||||
|
||||
### 1. User Experience
|
||||
- Provide clear feedback for async operations
|
||||
- Handle errors gracefully
|
||||
- Include loading states
|
||||
- Add keyboard shortcuts
|
||||
|
||||
### 2. Performance
|
||||
- Debounce expensive operations
|
||||
- Cache API responses
|
||||
- Use virtual scrolling for large lists
|
||||
- Lazy load heavy components
|
||||
|
||||
### 3. Integration
|
||||
- Respect Superset's theme
|
||||
- Use provided UI components
|
||||
- Follow existing UX patterns
|
||||
- Integrate with existing menus
|
||||
|
||||
### 4. Code Organization
|
||||
```
|
||||
extension/
|
||||
├── frontend/
|
||||
│ ├── src/
|
||||
│ │ ├── components/ # UI components
|
||||
│ │ ├── hooks/ # Custom hooks
|
||||
│ │ ├── services/ # API services
|
||||
│ │ ├── utils/ # Utilities
|
||||
│ │ └── index.tsx # Entry point
|
||||
│ └── tests/
|
||||
├── backend/
|
||||
│ ├── src/
|
||||
│ │ ├── api/ # REST endpoints
|
||||
│ │ ├── models/ # Data models
|
||||
│ │ ├── services/ # Business logic
|
||||
│ │ └── entrypoint.py
|
||||
│ └── tests/
|
||||
```
|
||||
|
||||
### 5. Testing
|
||||
```typescript
|
||||
// Test example
|
||||
describe('DatasetReferences', () => {
|
||||
it('should extract tables from SQL', () => {
|
||||
const sql = 'SELECT * FROM users JOIN orders ON users.id = orders.user_id';
|
||||
const tables = extractTables(sql);
|
||||
|
||||
expect(tables).toEqual([
|
||||
{ schema: 'public', table: 'users' },
|
||||
{ schema: 'public', table: 'orders' },
|
||||
]);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## Learn More
|
||||
|
||||
- [API Reference](../api/frontend)
|
||||
- [Architecture Overview](../architecture/overview)
|
||||
- [Getting Started Guide](../getting-started)
|
||||
- [CLI Documentation](../cli/overview)
|
||||
248
docs/developer_portal/getting-started/index.md
Normal file
248
docs/developer_portal/getting-started/index.md
Normal file
@@ -0,0 +1,248 @@
|
||||
---
|
||||
title: Getting Started
|
||||
sidebar_position: 2
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Getting Started with Extensions
|
||||
|
||||
This guide will walk you through creating, developing, and deploying your first Superset extension.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, make sure you have:
|
||||
|
||||
- **Node.js 16+** and npm/yarn installed
|
||||
- **Python 3.9+** and pip installed
|
||||
- **Superset** running locally or access to a Superset instance
|
||||
- **Git** for version control
|
||||
- Basic knowledge of React and TypeScript
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Install the CLI
|
||||
|
||||
First, install the Superset Extensions CLI globally:
|
||||
|
||||
```bash
|
||||
pip install apache-superset-extensions-cli
|
||||
```
|
||||
|
||||
### 2. Create Your First Extension
|
||||
|
||||
Use the CLI to scaffold a new extension project:
|
||||
|
||||
```bash
|
||||
superset-extensions init my-first-extension
|
||||
cd my-first-extension
|
||||
```
|
||||
|
||||
This creates the following structure:
|
||||
|
||||
```
|
||||
my-first-extension/
|
||||
├── extension.json # Extension metadata
|
||||
├── frontend/ # Frontend code
|
||||
│ ├── src/
|
||||
│ │ └── index.tsx # Main entry point
|
||||
│ ├── package.json
|
||||
│ └── webpack.config.js
|
||||
├── backend/ # Backend code (optional)
|
||||
│ ├── src/
|
||||
│ └── requirements.txt
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### 3. Configure Your Extension
|
||||
|
||||
Edit `extension.json` to define your extension's capabilities:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "my-first-extension",
|
||||
"version": "1.0.0",
|
||||
"description": "My first Superset extension",
|
||||
"author": "Your Name",
|
||||
"frontend": {
|
||||
"contributions": {
|
||||
"views": {
|
||||
"sqllab.panels": [
|
||||
{
|
||||
"id": "my-extension.main",
|
||||
"name": "My Panel",
|
||||
"icon": "ToolOutlined"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Develop Your Extension
|
||||
|
||||
Edit `frontend/src/index.tsx` to implement your extension:
|
||||
|
||||
```typescript
|
||||
import React from 'react';
|
||||
import { ExtensionContext } from '@apache-superset/core';
|
||||
|
||||
export function activate(context: ExtensionContext) {
|
||||
// Register your panel component
|
||||
const panel = context.core.registerView('my-extension.main', () => (
|
||||
<div style={{ padding: 20 }}>
|
||||
<h2>Hello from My Extension!</h2>
|
||||
<p>This is my first Superset extension.</p>
|
||||
</div>
|
||||
));
|
||||
|
||||
// Clean up on deactivation
|
||||
context.subscriptions.push(panel);
|
||||
}
|
||||
|
||||
export function deactivate() {
|
||||
// Cleanup code if needed
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Test Locally
|
||||
|
||||
Enable development mode in your Superset configuration:
|
||||
|
||||
```python
|
||||
# superset_config.py
|
||||
ENABLE_EXTENSIONS = True
|
||||
LOCAL_EXTENSIONS = [
|
||||
"/path/to/my-first-extension"
|
||||
]
|
||||
```
|
||||
|
||||
Run the development server:
|
||||
|
||||
```bash
|
||||
# In your extension directory
|
||||
superset-extensions dev
|
||||
|
||||
# In a separate terminal, start Superset
|
||||
superset run -p 8088 --with-threads --reload
|
||||
```
|
||||
|
||||
Your extension will now appear in SQL Lab!
|
||||
|
||||
### 6. Build and Package
|
||||
|
||||
When ready to distribute your extension:
|
||||
|
||||
```bash
|
||||
superset-extensions build
|
||||
superset-extensions bundle
|
||||
```
|
||||
|
||||
This creates a `my-first-extension-1.0.0.supx` file that can be uploaded to any Superset instance.
|
||||
|
||||
### 7. Deploy
|
||||
|
||||
Upload your extension via the Superset UI or API:
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8088/api/v1/extensions/import/ \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-F "file=@my-first-extension-1.0.0.supx"
|
||||
```
|
||||
|
||||
## What's Next?
|
||||
|
||||
Now that you have a basic extension working, explore:
|
||||
|
||||
- [Extension Architecture](../architecture/overview) - Understand how extensions work
|
||||
- [API Reference](../api/frontend) - Learn about available APIs
|
||||
- [Examples](../examples) - See more complex extension examples
|
||||
- [Best Practices](./best-practices) - Learn extension development best practices
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Adding a SQL Lab Panel
|
||||
|
||||
```typescript
|
||||
const panel = context.core.registerView('my-extension.panel', () => (
|
||||
<MyPanelComponent />
|
||||
));
|
||||
```
|
||||
|
||||
### Registering Commands
|
||||
|
||||
```typescript
|
||||
const command = context.commands.registerCommand('my-extension.run', {
|
||||
title: 'Run My Command',
|
||||
execute: () => {
|
||||
// Command logic
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Listening to Events
|
||||
|
||||
```typescript
|
||||
const listener = context.sqlLab.onDidQueryRun((query) => {
|
||||
console.log('Query executed:', query);
|
||||
});
|
||||
```
|
||||
|
||||
### Adding Menu Items
|
||||
|
||||
```json
|
||||
{
|
||||
"menus": {
|
||||
"sqllab.editor": {
|
||||
"primary": [{
|
||||
"command": "my-extension.run",
|
||||
"when": "editorHasSelection"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Extension Not Loading
|
||||
|
||||
- Ensure `ENABLE_EXTENSIONS = True` in your config
|
||||
- Check the browser console for errors
|
||||
- Verify the extension path in `LOCAL_EXTENSIONS`
|
||||
|
||||
### Module Not Found Errors
|
||||
|
||||
- Run `npm install` in the frontend directory
|
||||
- Check that `@apache-superset/core` is properly externalized
|
||||
|
||||
### Build Failures
|
||||
|
||||
- Ensure all dependencies are installed
|
||||
- Check webpack.config.js for proper Module Federation setup
|
||||
- Verify extension.json is valid JSON
|
||||
|
||||
## Get Help
|
||||
|
||||
- Join the [Superset Slack](https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI1TY1Pm~y_RnSiUAN0jqQ)
|
||||
- Ask questions on [GitHub Discussions](https://github.com/apache/superset/discussions)
|
||||
- Report issues on [GitHub Issues](https://github.com/apache/superset/issues)
|
||||
126
docs/developer_portal/index.md
Normal file
126
docs/developer_portal/index.md
Normal file
@@ -0,0 +1,126 @@
|
||||
---
|
||||
title: Developer Portal
|
||||
sidebar_position: 1
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Superset Developer Portal
|
||||
|
||||
Welcome to the Apache Superset Developer Portal! This is your comprehensive guide to extending and customizing Superset through our new extension architecture.
|
||||
|
||||
## What are Superset Extensions?
|
||||
|
||||
Superset Extensions provide a powerful way to enhance and customize Apache Superset without modifying the core codebase. Following the successful model pioneered by VS Code, our extension architecture enables developers to:
|
||||
|
||||
- **Add custom features** to SQL Lab and other Superset modules
|
||||
- **Create reusable components** that can be shared across organizations
|
||||
- **Integrate external tools** and services seamlessly
|
||||
- **Customize workflows** to match your team's specific needs
|
||||
|
||||
## Why Extensions?
|
||||
|
||||
As Superset has grown, we've recognized the need for a more modular architecture that allows:
|
||||
|
||||
- **Innovation without fragmentation** - Build features without forking the codebase
|
||||
- **Community-driven development** - Share and reuse extensions across organizations
|
||||
- **Stable APIs** - Develop against versioned, well-documented interfaces
|
||||
- **Rapid iteration** - Deploy custom features without waiting for core releases
|
||||
|
||||
## Key Features
|
||||
|
||||
### 🎯 Well-Defined Extension Points
|
||||
|
||||
Extensions can contribute to specific areas of Superset:
|
||||
- SQL Lab panels (left, right, bottom, editor)
|
||||
- Custom commands and menu items
|
||||
- Status bar components
|
||||
- API endpoints and backend functionality
|
||||
|
||||
### 🔧 Modern Development Experience
|
||||
|
||||
- **CLI tools** for scaffolding, building, and packaging
|
||||
- **Hot reloading** during development
|
||||
- **TypeScript support** with full type safety
|
||||
- **Module Federation** for dynamic loading
|
||||
|
||||
### 📦 Simple Distribution
|
||||
|
||||
- Package extensions as `.supx` files
|
||||
- Upload via REST API or UI
|
||||
- Automatic activation and lifecycle management
|
||||
- Version compatibility checking
|
||||
|
||||
## Getting Started
|
||||
|
||||
Ready to build your first extension? Check out our [Getting Started Guide](./getting-started) to:
|
||||
|
||||
1. Set up your development environment
|
||||
2. Create your first extension
|
||||
3. Test it locally
|
||||
4. Package and deploy it
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
Our extension architecture is built on several key principles:
|
||||
|
||||
- **Lean Core**: Keep Superset's core minimal and delegate features to extensions
|
||||
- **Explicit APIs**: Clear, versioned interfaces for extension interactions
|
||||
- **Lazy Loading**: Extensions load only when needed for optimal performance
|
||||
- **Security First**: Extensions run with appropriate permissions and sandboxing
|
||||
|
||||
Learn more in our [Architecture Documentation](./architecture/overview).
|
||||
|
||||
## Current Status
|
||||
|
||||
The extension architecture is currently in active development. The initial focus is on SQL Lab extensions, with plans to expand to:
|
||||
|
||||
- Dashboard extensions
|
||||
- Chart plugins (enhanced from current system)
|
||||
- Database connectors
|
||||
- Security providers
|
||||
|
||||
## Example: Dataset References Extension
|
||||
|
||||
See the extension system in action with our Dataset References example, which adds a SQL Lab panel showing:
|
||||
|
||||
- Tables referenced in queries
|
||||
- Table owners for permission requests
|
||||
- Last available partitions
|
||||
- Estimated row counts
|
||||
|
||||
## Join the Community
|
||||
|
||||
- **Contribute**: Help shape the future of Superset extensions
|
||||
- **Share**: Publish your extensions for others to use
|
||||
- **Learn**: Explore extensions built by the community
|
||||
|
||||
## Quick Links
|
||||
|
||||
- [Getting Started Guide](./getting-started)
|
||||
- [Extension Architecture](./architecture/overview)
|
||||
- [API Reference](./api/frontend)
|
||||
- [CLI Documentation](./cli/overview)
|
||||
- [Examples](./examples)
|
||||
|
||||
---
|
||||
|
||||
*The Superset extension architecture is inspired by the successful model of VS Code Extensions, bringing similar flexibility and power to the data exploration domain.*
|
||||
59
docs/developer_portal/sidebars.js
Normal file
59
docs/developer_portal/sidebars.js
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
developerPortalSidebar: [
|
||||
'index',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Getting Started',
|
||||
items: [
|
||||
'getting-started/index',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Architecture',
|
||||
items: [
|
||||
'architecture/overview',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'API Reference',
|
||||
items: [
|
||||
'api/frontend',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'CLI',
|
||||
items: [
|
||||
'cli/overview',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Examples',
|
||||
items: [
|
||||
'examples/index',
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
1
docs/developer_portal/versions.json
Normal file
1
docs/developer_portal/versions.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
1
docs/developer_portal_versions.json
Normal file
1
docs/developer_portal_versions.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
@@ -12,7 +12,7 @@ Users can configure automated alerts and reports to send dashboards or charts to
|
||||
- *Alerts* are sent when a SQL condition is reached
|
||||
- *Reports* are sent on a schedule
|
||||
|
||||
Alerts and reports are disabled by default. To turn them on, you need to do some setup, described here.
|
||||
Alerts and reports are disabled by default. To turn them on, you'll need to change configuration settings and install a suitable headless browser in your environment.
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -35,16 +35,14 @@ Screenshots will be taken but no messages actually sent as long as `ALERT_REPORT
|
||||
|
||||
#### In your `Dockerfile`
|
||||
|
||||
- You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported.
|
||||
> If you choose Chrome, you must also change the value of `WEBDRIVER_TYPE` to `"chrome"` in your `superset_config.py`.
|
||||
You'll need to extend the Superset image to include a headless browser. Your options include:
|
||||
- Use Playwright with Chrome: this is the recommended approach as of version 4.1.x or greater. A working example of a Dockerfile that installs these tools is provided under "Building your own production Docker image" on the [Docker Builds](/docs/installation/docker-builds#building-your-own-production-docker-image) page. Read the code comments there as you'll also need to change a feature flag in your config.
|
||||
- Use Firefox: you'll need to install geckodriver and Firefox.
|
||||
- Use Chrome without Playwright: you'll need to install Chrome and set the value of `WEBDRIVER_TYPE` to `"chrome"` in your `superset_config.py`.
|
||||
|
||||
Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the *dev* docker image if you are following [Installing Superset Locally](/docs/installation/docker-compose/).
|
||||
All you need to do is add the required config variables described in this guide (See `Detailed Config`).
|
||||
In Superset versions prior to 4.1, users installed Firefox or Chrome and that was documented here.
|
||||
|
||||
If you are running a non-dev docker image, e.g., a stable release like `apache/superset:3.1.0`, that image does not include a headless browser. Only the `superset_worker` container needs this headless browser to browse to the target chart or dashboard.
|
||||
You can either install and configure the headless browser - see "Custom Dockerfile" section below - or when deploying via `docker compose`, modify your `docker-compose.yml` file to use a dev image for the worker container and a stable release image for the `superset_app` container.
|
||||
|
||||
*Note*: In this context, a "dev image" is the same application software as its corresponding non-dev image, just bundled with additional tools. So an image like `3.1.0-dev` is identical to `3.1.0` when it comes to stability, functionality, and running in production. The actual "in-development" versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version `0.0.0-dev` within the Superset UI.
|
||||
Only the worker container needs the browser.
|
||||
|
||||
### Slack integration
|
||||
|
||||
@@ -67,22 +65,6 @@ To send alerts and reports to Slack channels, you need to create a new Slack App
|
||||
|
||||
Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use `alerts` instead of `#alerts`.
|
||||
|
||||
#### Large Slack Workspaces (10k+ channels)
|
||||
|
||||
For workspaces with many channels, fetching the complete channel list can take several minutes and may encounter Slack API rate limits. Add the following to your `superset_config.py`:
|
||||
|
||||
```python
|
||||
from datetime import timedelta
|
||||
|
||||
# Increase cache timeout to reduce API calls
|
||||
# Default: 1 day (86400 seconds)
|
||||
SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds())
|
||||
|
||||
# Increase retry count for rate limit errors
|
||||
# Default: 2
|
||||
SLACK_API_RATE_LIMIT_RETRY_COUNT = 5
|
||||
```
|
||||
|
||||
### Kubernetes-specific
|
||||
|
||||
- You must have a `celery beat` pod running. If you're using the chart included in the GitHub repository under [helm/superset](https://github.com/apache/superset/tree/master/helm/superset), you need to put `supersetCeleryBeat.enabled = true` in your values override.
|
||||
@@ -168,8 +150,8 @@ SMTP_MAIL_FROM = "noreply@youremail.com"
|
||||
EMAIL_REPORTS_SUBJECT_PREFIX = "[Superset] " # optional - overwrites default value in config.py of "[Report] "
|
||||
|
||||
# WebDriver configuration
|
||||
# If you use Firefox, you can stick with default values
|
||||
# If you use Chrome, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS
|
||||
# If you use Firefox or Playwright with Chrome, you can stick with default values
|
||||
# If you use Chrome and are *not* using Playwright, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS
|
||||
WEBDRIVER_TYPE = "chrome"
|
||||
WEBDRIVER_OPTION_ARGS = [
|
||||
"--force-device-scale-factor=2.0",
|
||||
@@ -235,62 +217,6 @@ def alert_dynamic_minimal_interval(**kwargs) -> int:
|
||||
ALERT_MINIMUM_INTERVAL = alert_dynamic_minimal_interval
|
||||
```
|
||||
|
||||
## Custom Dockerfile
|
||||
|
||||
If you're running the dev version of a released Superset image, like `apache/superset:3.1.0-dev`, you should be set with the above.
|
||||
|
||||
But if you're building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient.
|
||||
Here's how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome.
|
||||
|
||||
### Using Firefox
|
||||
|
||||
```docker
|
||||
FROM apache/superset:3.1.0
|
||||
|
||||
USER root
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends -y firefox-esr
|
||||
|
||||
ENV GECKODRIVER_VERSION=0.29.0
|
||||
RUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz && \
|
||||
tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O > /usr/bin/geckodriver && \
|
||||
chmod 755 /usr/bin/geckodriver && \
|
||||
rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz
|
||||
|
||||
RUN pip install --no-cache gevent psycopg2 redis
|
||||
|
||||
USER superset
|
||||
```
|
||||
|
||||
### Using Chrome
|
||||
|
||||
```docker
|
||||
FROM apache/superset:3.1.0
|
||||
|
||||
USER root
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y wget zip libaio1
|
||||
|
||||
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
|
||||
wget -O google-chrome-stable_current_amd64.deb -q http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROMEDRIVER_VERSION}-1_amd64.deb && \
|
||||
apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \
|
||||
rm -f google-chrome-stable_current_amd64.deb
|
||||
|
||||
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
|
||||
wget -q https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip && \
|
||||
unzip -j chromedriver-linux64.zip -d /usr/bin && \
|
||||
chmod 755 /usr/bin/chromedriver && \
|
||||
rm -f chromedriver-linux64.zip
|
||||
|
||||
RUN pip install --no-cache gevent psycopg2 redis
|
||||
|
||||
USER superset
|
||||
```
|
||||
|
||||
Don't forget to set `WEBDRIVER_TYPE` and `WEBDRIVER_OPTION_ARGS` in your config if you use Chrome.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
There are many reasons that reports might not be working. Try these steps to check for specific issues.
|
||||
@@ -309,9 +235,7 @@ This is the best source of information about the problem. In a docker compose d
|
||||
|
||||
To take a screenshot, the worker visits the dashboard or chart using a headless browser, then takes a screenshot. If you are able to send a chart as CSV or text but can't send as PNG, your problem may lie with the browser.
|
||||
|
||||
Superset docker images that have a tag ending with `-dev` have the Firefox headless browser and geckodriver already installed. You can test that these are installed and in the proper path by entering your Superset worker and running `firefox --headless` and then `geckodriver`. Both commands should start those applications.
|
||||
|
||||
If you are handling the installation of that software on your own, or wish to use Chromium instead, do your own verification to ensure that the headless browser opens successfully in the worker environment.
|
||||
If you are handling the installation of the headless browser on your own, do your own verification to ensure that the headless browser opens successfully in the worker environment.
|
||||
|
||||
### Send a test email
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ are compatible with Superset.
|
||||
| [IBM Netezza Performance Server](/docs/configuration/databases#ibm-netezza-performance-server) | `pip install nzalchemy` | `netezza+nzpy://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [MySQL](/docs/configuration/databases#mysql) | `pip install mysqlclient` | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [OceanBase](/docs/configuration/databases#oceanbase) | `pip install oceanbase_py` | `oceanbase://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [Oracle](/docs/configuration/databases#oracle) | `pip install cx_Oracle` | `oracle://<username>:<password>@<hostname>:<port>` |
|
||||
| [Oracle](/docs/configuration/databases#oracle) | `pip install oracledb` | `oracle://<username>:<password>@<hostname>:<port>` |
|
||||
| [Parseable](/docs/configuration/databases#parseable) | `pip install sqlalchemy-parseable` | `parseable://<UserName>:<DBPassword>@<Database Host>/<Stream Name>` |
|
||||
| [PostgreSQL](/docs/configuration/databases#postgres) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [Presto](/docs/configuration/databases#presto) | `pip install pyhive` | `presto://{username}:{password}@{hostname}:{port}/{database}` |
|
||||
|
||||
@@ -10,8 +10,15 @@ version: 1
|
||||
## Jinja Templates
|
||||
|
||||
SQL Lab and Explore supports [Jinja templating](https://jinja.palletsprojects.com/en/2.11.x/) in queries.
|
||||
To enable templating, the `ENABLE_TEMPLATE_PROCESSING` [feature flag](/docs/configuration/configuring-superset#feature-flags) needs to be enabled in
|
||||
`superset_config.py`. When templating is enabled, python code can be embedded in virtual datasets and
|
||||
To enable templating, the `ENABLE_TEMPLATE_PROCESSING` [feature flag](/docs/configuration/configuring-superset#feature-flags) needs to be enabled in `superset_config.py`.
|
||||
|
||||
> #### ⚠️ Security Warning
|
||||
>
|
||||
> While powerful, this feature executes template code on the server. Within the Superset security model, this is **intended functionality**, as users with permissions to edit charts and virtual datasets are considered **trusted users**.
|
||||
>
|
||||
> If you grant these permissions to untrusted users, this feature can be exploited as a **Server-Side Template Injection (SSTI)** vulnerability. Do not enable `ENABLE_TEMPLATE_PROCESSING` unless you fully understand and accept the associated security risks.
|
||||
|
||||
When templating is enabled, python code can be embedded in virtual datasets and
|
||||
in Custom SQL in the filter and metric controls in Explore. By default, the following variables are
|
||||
made available in the Jinja context:
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ version: 1
|
||||
# Theming Superset
|
||||
|
||||
:::note
|
||||
apache-superset>=6.0
|
||||
`apache-superset>=6.0`
|
||||
:::
|
||||
|
||||
Superset now rides on **Ant Design v5's token-based theming**.
|
||||
@@ -165,6 +165,206 @@ Or in the CRUD interface theme JSON:
|
||||
|
||||
This feature works with the stock Docker image - no custom build required!
|
||||
|
||||
## ECharts Configuration Overrides
|
||||
|
||||
:::note
|
||||
Available since Superset 6.0
|
||||
:::
|
||||
|
||||
Superset provides fine-grained control over ECharts visualizations through theme-level configuration overrides. This allows you to customize the appearance and behavior of all ECharts-based charts without modifying individual chart configurations.
|
||||
|
||||
### Global ECharts Overrides
|
||||
|
||||
Apply settings to all ECharts visualizations using `echartsOptionsOverrides`:
|
||||
|
||||
```python
|
||||
THEME_DEFAULT = {
|
||||
"token": {
|
||||
"colorPrimary": "#2893B3",
|
||||
# ... other Ant Design tokens
|
||||
},
|
||||
"echartsOptionsOverrides": {
|
||||
"grid": {
|
||||
"left": "10%",
|
||||
"right": "10%",
|
||||
"top": "15%",
|
||||
"bottom": "15%"
|
||||
},
|
||||
"tooltip": {
|
||||
"backgroundColor": "rgba(0, 0, 0, 0.8)",
|
||||
"borderColor": "#ccc",
|
||||
"textStyle": {
|
||||
"color": "#fff"
|
||||
}
|
||||
},
|
||||
"legend": {
|
||||
"textStyle": {
|
||||
"fontSize": 14,
|
||||
"fontWeight": "bold"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Chart-Specific Overrides
|
||||
|
||||
Target specific chart types using `echartsOptionsOverridesByChartType`:
|
||||
|
||||
```python
|
||||
THEME_DEFAULT = {
|
||||
"token": {
|
||||
"colorPrimary": "#2893B3",
|
||||
# ... other tokens
|
||||
},
|
||||
"echartsOptionsOverridesByChartType": {
|
||||
"echarts_pie": {
|
||||
"legend": {
|
||||
"orient": "vertical",
|
||||
"right": 10,
|
||||
"top": "center"
|
||||
}
|
||||
},
|
||||
"echarts_timeseries": {
|
||||
"xAxis": {
|
||||
"axisLabel": {
|
||||
"rotate": 45,
|
||||
"fontSize": 12
|
||||
}
|
||||
},
|
||||
"dataZoom": [{
|
||||
"type": "slider",
|
||||
"show": True,
|
||||
"start": 0,
|
||||
"end": 100
|
||||
}]
|
||||
},
|
||||
"echarts_bubble": {
|
||||
"grid": {
|
||||
"left": "15%",
|
||||
"bottom": "20%"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### UI Configuration
|
||||
|
||||
You can also configure ECharts overrides through the theme CRUD interface:
|
||||
|
||||
```json
|
||||
{
|
||||
"token": {
|
||||
"colorPrimary": "#2893B3"
|
||||
},
|
||||
"echartsOptionsOverrides": {
|
||||
"grid": {
|
||||
"left": "10%",
|
||||
"right": "10%"
|
||||
},
|
||||
"tooltip": {
|
||||
"backgroundColor": "rgba(0, 0, 0, 0.8)"
|
||||
}
|
||||
},
|
||||
"echartsOptionsOverridesByChartType": {
|
||||
"echarts_pie": {
|
||||
"legend": {
|
||||
"orient": "vertical",
|
||||
"right": 10
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Override Precedence
|
||||
|
||||
The system applies overrides in the following order (last wins):
|
||||
|
||||
1. **Base ECharts theme** - Default Superset styling
|
||||
2. **Plugin options** - Chart-specific configurations
|
||||
3. **Global overrides** - `echartsOptionsOverrides`
|
||||
4. **Chart-specific overrides** - `echartsOptionsOverridesByChartType[chartType]`
|
||||
|
||||
This ensures chart-specific overrides take precedence over global ones.
|
||||
|
||||
### Common Chart Types
|
||||
|
||||
Available chart types for `echartsOptionsOverridesByChartType`:
|
||||
|
||||
- `echarts_timeseries` - Time series/line charts
|
||||
- `echarts_pie` - Pie and donut charts
|
||||
- `echarts_bubble` - Bubble/scatter charts
|
||||
- `echarts_funnel` - Funnel charts
|
||||
- `echarts_gauge` - Gauge charts
|
||||
- `echarts_radar` - Radar charts
|
||||
- `echarts_boxplot` - Box plot charts
|
||||
- `echarts_treemap` - Treemap charts
|
||||
- `echarts_sunburst` - Sunburst charts
|
||||
- `echarts_graph` - Network/graph charts
|
||||
- `echarts_sankey` - Sankey diagrams
|
||||
- `echarts_heatmap` - Heatmaps
|
||||
- `echarts_mixed_timeseries` - Mixed time series
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Start with global overrides** for consistent styling across all charts
|
||||
2. **Use chart-specific overrides** for unique requirements per visualization type
|
||||
3. **Test thoroughly** as overrides use deep merge - nested objects are combined, but arrays are completely replaced
|
||||
4. **Document your overrides** to help team members understand custom styling
|
||||
5. **Consider performance** - complex overrides may impact chart rendering speed
|
||||
|
||||
### Example: Corporate Branding
|
||||
|
||||
```python
|
||||
# Complete corporate theme with ECharts customization
|
||||
THEME_DEFAULT = {
|
||||
"token": {
|
||||
"colorPrimary": "#1B4D3E",
|
||||
"fontFamily": "Corporate Sans, Arial, sans-serif"
|
||||
},
|
||||
"echartsOptionsOverrides": {
|
||||
"grid": {
|
||||
"left": "8%",
|
||||
"right": "8%",
|
||||
"top": "12%",
|
||||
"bottom": "12%"
|
||||
},
|
||||
"textStyle": {
|
||||
"fontFamily": "Corporate Sans, Arial, sans-serif"
|
||||
},
|
||||
"title": {
|
||||
"textStyle": {
|
||||
"color": "#1B4D3E",
|
||||
"fontSize": 18,
|
||||
"fontWeight": "bold"
|
||||
}
|
||||
}
|
||||
},
|
||||
"echartsOptionsOverridesByChartType": {
|
||||
"echarts_timeseries": {
|
||||
"xAxis": {
|
||||
"axisLabel": {
|
||||
"color": "#666",
|
||||
"fontSize": 11
|
||||
}
|
||||
}
|
||||
},
|
||||
"echarts_pie": {
|
||||
"legend": {
|
||||
"textStyle": {
|
||||
"fontSize": 12
|
||||
},
|
||||
"itemGap": 20
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This feature provides powerful theming capabilities while maintaining the flexibility of ECharts' extensive configuration options.
|
||||
|
||||
## Advanced Features
|
||||
|
||||
- **System Themes**: Manage system-wide default and dark themes via UI or configuration
|
||||
|
||||
@@ -620,10 +620,10 @@ See [how tos](/docs/contributing/howtos#linting)
|
||||
|
||||
:::tip
|
||||
`act` compatibility of Superset's GHAs is not fully tested. Running `act` locally may or may not
|
||||
work for different actions, and may require fine tunning and local secret-handling.
|
||||
work for different actions, and may require fine tuning and local secret-handling.
|
||||
For those more intricate GHAs that are tricky to run locally, we recommend iterating
|
||||
directly on GHA's infrastructure, by pushing directly on a branch and monitoring GHA logs.
|
||||
For more targetted iteration, see the `gh workflow run --ref {BRANCH}` subcommand of the GitHub CLI.
|
||||
For more targeted iteration, see the `gh workflow run --ref {BRANCH}` subcommand of the GitHub CLI.
|
||||
:::
|
||||
|
||||
For automation and CI/CD, Superset makes extensive use of GitHub Actions (GHA). You
|
||||
@@ -631,7 +631,7 @@ can find all of the workflows and other assets under the `.github/` folder. This
|
||||
|
||||
- running the backend unit test suites (`tests/`)
|
||||
- running the frontend test suites (`superset-frontend/src/**.*.test.*`)
|
||||
- running our Cypress end-to-end tests (`superset-frontend/cypress-base/`)
|
||||
- running our Playwright end-to-end tests (`superset-frontend/playwright/`) and legacy Cypress tests (`superset-frontend/cypress-base/`)
|
||||
- linting the codebase, including all Python, Typescript and Javascript, yaml and beyond
|
||||
- checking for all sorts of other rules conventions
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ Committers may also update title to reflect the issue/PR content if the author-p
|
||||
|
||||
If the PR passes CI tests and does not have any `need:` labels, it is ready for review, add label `review` and/or `design-review`.
|
||||
|
||||
If an issue/PR has been inactive for >=30 days, it will be closed. If it does not have any status label, add `inactive`.
|
||||
If an issue/PR has been inactive for at least 30 days, it will be closed. If it does not have any status label, add `inactive`.
|
||||
|
||||
When creating a PR, if you're aiming to have it included in a specific release, please tag it with the version label. For example, to have a PR considered for inclusion in Superset 1.1 use the label `v1.1`.
|
||||
|
||||
|
||||
@@ -225,21 +225,57 @@ npm run test -- path/to/file.js
|
||||
|
||||
### E2E Integration Testing
|
||||
|
||||
For E2E testing, we recommend that you use a `docker compose` backend
|
||||
**Note: We are migrating from Cypress to Playwright. Use Playwright for new tests.**
|
||||
|
||||
#### Playwright (Recommended - NEW)
|
||||
|
||||
For E2E testing with Playwright, use the same `docker compose` backend:
|
||||
|
||||
```bash
|
||||
CYPRESS_CONFIG=true docker compose up --build
|
||||
```
|
||||
`docker compose` will get to work and expose a Cypress-ready Superset app.
|
||||
This app uses a different database schema (`superset_cypress`) to keep it isolated from
|
||||
your other dev environmen(s)t, a specific set of examples, and a set of configurations that
|
||||
aligns with the expectations within the end-to-end tests. Also note that it's served on a
|
||||
different port than the default port for the backend (`8088`).
|
||||
|
||||
Now in another terminal, let's get ready to execute some Cypress commands. First, tell cypress
|
||||
to connect to the Cypress-ready Superset backend.
|
||||
The backend setup is identical - this exposes a test-ready Superset app on port 8081 with isolated database schema (`superset_cypress`), test data, and configurations.
|
||||
|
||||
Now in another terminal, run Playwright tests:
|
||||
|
||||
```bash
|
||||
# Navigate to frontend directory (Playwright config is here)
|
||||
cd superset-frontend
|
||||
|
||||
# Run all Playwright tests
|
||||
npm run playwright:test
|
||||
# or: npx playwright test
|
||||
|
||||
# Run with interactive UI for debugging
|
||||
npm run playwright:ui
|
||||
# or: npx playwright test --ui
|
||||
|
||||
# Run in headed mode (see browser)
|
||||
npm run playwright:headed
|
||||
# or: npx playwright test --headed
|
||||
|
||||
# Run specific test file
|
||||
npx playwright test tests/auth/login.spec.ts
|
||||
|
||||
# Run with debug mode (step through tests)
|
||||
npm run playwright:debug tests/auth/login.spec.ts
|
||||
# or: npx playwright test --debug tests/auth/login.spec.ts
|
||||
|
||||
# Generate test report
|
||||
npx playwright show-report
|
||||
```
|
||||
|
||||
Configuration is in `superset-frontend/playwright.config.ts`. Base URL is automatically set to `http://localhost:8088` but will use `PLAYWRIGHT_BASE_URL` if provided.
|
||||
|
||||
#### Cypress (DEPRECATED - will be removed in Phase 5)
|
||||
|
||||
:::warning
|
||||
Cypress is being phased out in favor of Playwright. Use Playwright for all new tests.
|
||||
:::
|
||||
|
||||
```bash
|
||||
# Set base URL for Cypress
|
||||
CYPRESS_BASE_URL=http://localhost:8081
|
||||
```
|
||||
|
||||
@@ -627,7 +663,7 @@ feature flag to `true`, you can add the following line to the PR body/descriptio
|
||||
FEATURE_TAGGING_SYSTEM=true
|
||||
```
|
||||
|
||||
Simarly, it's possible to disable feature flags with:
|
||||
Similarly, it's possible to disable feature flags with:
|
||||
|
||||
```
|
||||
FEATURE_TAGGING_SYSTEM=false
|
||||
|
||||
@@ -86,8 +86,6 @@ USER root
|
||||
ENV PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers
|
||||
|
||||
# Install packages using uv into the virtual environment
|
||||
# Superset started using uv after the 4.1 branch; if you are building from apache/superset:4.1.x or an older version,
|
||||
# replace the first two lines with RUN pip install \
|
||||
RUN . /app/.venv/bin/activate && \
|
||||
uv pip install \
|
||||
# install psycopg2 for using PostgreSQL metadata store - could be a MySQL package if using that backend:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user