mirror of
https://github.com/apache/superset.git
synced 2026-04-13 13:18:25 +00:00
122 lines
3.8 KiB
JavaScript
122 lines
3.8 KiB
JavaScript
/**
|
|
* 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.
|
|
*/
|
|
|
|
import React from 'react';
|
|
import { supersetTheme, ThemeProvider } from '@superset-ui/core';
|
|
|
|
// A simple component to display a story example
|
|
export function StoryExample({ component: Component, props = {} }) {
|
|
return (
|
|
<ThemeProvider theme={supersetTheme}>
|
|
<div
|
|
className="storybook-example"
|
|
style={{
|
|
border: '1px solid #e8e8e8',
|
|
borderRadius: '4px',
|
|
padding: '20px',
|
|
marginBottom: '20px',
|
|
}}
|
|
>
|
|
{Component && <Component {...props} />}
|
|
</div>
|
|
</ThemeProvider>
|
|
);
|
|
}
|
|
|
|
// A simple component to display a story with controls
|
|
export function StoryWithControls({
|
|
component: Component,
|
|
props = {},
|
|
controls = [],
|
|
}) {
|
|
const [stateProps, setStateProps] = React.useState(props);
|
|
|
|
const updateProp = (key, value) => {
|
|
setStateProps(prev => ({
|
|
...prev,
|
|
[key]: value,
|
|
}));
|
|
};
|
|
|
|
return (
|
|
<ThemeProvider theme={supersetTheme}>
|
|
<div className="storybook-with-controls">
|
|
<div
|
|
className="storybook-example"
|
|
style={{
|
|
border: '1px solid #e8e8e8',
|
|
borderRadius: '4px',
|
|
padding: '20px',
|
|
marginBottom: '20px',
|
|
}}
|
|
>
|
|
{Component && <Component {...stateProps} />}
|
|
</div>
|
|
|
|
{controls.length > 0 && (
|
|
<div
|
|
className="storybook-controls"
|
|
style={{
|
|
border: '1px solid #e8e8e8',
|
|
borderRadius: '4px',
|
|
padding: '20px',
|
|
marginBottom: '20px',
|
|
}}
|
|
>
|
|
<h4>Controls</h4>
|
|
{controls.map(control => (
|
|
<div key={control.name} style={{ marginBottom: '10px' }}>
|
|
<label style={{ display: 'block', marginBottom: '5px' }}>
|
|
{control.label || control.name}:
|
|
</label>
|
|
{control.type === 'select' ? (
|
|
<select
|
|
value={stateProps[control.name]}
|
|
onChange={e => updateProp(control.name, e.target.value)}
|
|
style={{ width: '100%', padding: '5px' }}
|
|
>
|
|
{control.options.map(option => (
|
|
<option key={option} value={option}>
|
|
{option}
|
|
</option>
|
|
))}
|
|
</select>
|
|
) : control.type === 'boolean' ? (
|
|
<input
|
|
type="checkbox"
|
|
checked={stateProps[control.name]}
|
|
onChange={e => updateProp(control.name, e.target.checked)}
|
|
/>
|
|
) : (
|
|
<input
|
|
type="text"
|
|
value={stateProps[control.name]}
|
|
onChange={e => updateProp(control.name, e.target.value)}
|
|
style={{ width: '100%', padding: '5px' }}
|
|
/>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
</ThemeProvider>
|
|
);
|
|
}
|