codeant-ai-for-open-source[bot] commented on code in PR #38196: URL: https://github.com/apache/superset/pull/38196#discussion_r2842668014
########## docs/developer_docs/components/ui/tree.mdx: ########## @@ -0,0 +1,268 @@ +--- +title: Tree +sidebar_label: Tree +--- + +<!-- + 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 { StoryWithControls } from '../../../src/components/StorybookWrapper'; + +# Tree + +The Tree component is used to display hierarchical data in a tree structure. It allows for features such as selection, expansion, and drag-and-drop functionality. + +## Live Example + +<StoryWithControls + component="Tree" + props={{ + checkable: false, + defaultExpandAll: false, + disabled: false, + draggable: false, + multiple: false, + selectable: true, + showIcon: false, + showLine: false, + treeData: [ + { + title: "parent 1", + key: "0-0", + children: [ + { + title: "parent 1-0", + key: "0-0-0", + children: [ + { + title: "leaf", + key: "0-0-0-0" + }, + { + title: "leaf", + key: "0-0-0-1" + }, + { + title: "leaf", + key: "0-0-0-2" + } + ] + }, + { + title: "parent 1-1", + key: "0-0-1", + children: [ + { + title: "leaf", + key: "0-0-1-0" + } + ] + }, + { + title: "parent 1-2", + key: "0-0-2", + children: [ + { + title: "leaf", + key: "0-0-2-0" + }, + { + title: "leaf", + key: "0-0-2-1" + } + ] + } + ] + } + ], + defaultExpandedKeys: [ + "0-0", + "0-0-0" + ] +}} + controls={[ + { + name: "checkable", + label: "Checkable", + type: "boolean", + description: "Add a Checkbox before the treeNodes" + }, + { + name: "defaultExpandAll", + label: "Default Expand All", + type: "boolean", + description: "Whether to expand all treeNodes by default" + }, + { + name: "disabled", + label: "Disabled", + type: "boolean", + description: "Whether disabled the tree" + }, + { + name: "draggable", + label: "Draggable", + type: "boolean", + description: "Specifies whether this Tree or the node is draggable" + }, + { + name: "multiple", + label: "Multiple", + type: "boolean", + description: "Allows selecting multiple treeNodes" + }, + { + name: "selectable", + label: "Selectable", + type: "boolean", + description: "Whether can be selected" + }, + { + name: "showIcon", + label: "Show Icon", + type: "boolean", + description: "Controls whether to display the icon node" + }, + { + name: "showLine", + label: "Show Line", + type: "boolean", + description: "Shows a connecting line" + } +]} +/> + +## Try It + +Edit the code below to experiment with the component: + +```tsx live +function Demo() { + const treeData = [ + { + title: 'Databases', + key: 'databases', + children: [ + { title: 'PostgreSQL', key: 'postgres' }, + { title: 'MySQL', key: 'mysql' }, + { title: 'SQLite', key: 'sqlite' }, + ], + }, + { + title: 'Charts', + key: 'charts', + children: [ + { title: 'Bar Chart', key: 'bar' }, + { title: 'Line Chart', key: 'line' }, + { title: 'Pie Chart', key: 'pie' }, + ], + }, + ]; + return <Tree treeData={treeData} defaultExpandAll />; +} +``` + +## Checkable Tree + +```tsx live +function CheckableTree() { + const [checkedKeys, setCheckedKeys] = React.useState(['postgres']); + const treeData = [ + { + title: 'Databases', + key: 'databases', + children: [ + { title: 'PostgreSQL', key: 'postgres' }, + { title: 'MySQL', key: 'mysql' }, + ], + }, + { + title: 'Charts', + key: 'charts', + children: [ + { title: 'Bar Chart', key: 'bar' }, + { title: 'Line Chart', key: 'line' }, + ], + }, + ]; + return ( + <Tree + treeData={treeData} + checkable + defaultExpandAll + checkedKeys={checkedKeys} + onCheck={setCheckedKeys} + /> + ); +} +``` + +## With Lines and Icons + +```tsx live +function LinesAndIcons() { + const treeData = [ + { + title: 'Dashboards', + key: 'dashboards', + children: [ + { title: 'Sales Dashboard', key: 'sales' }, + { title: 'Marketing Dashboard', key: 'marketing' }, + ], + }, + { + title: 'Reports', + key: 'reports', + children: [ + { title: 'Weekly Report', key: 'weekly' }, + { title: 'Monthly Report', key: 'monthly' }, + ], + }, + ]; + return <Tree treeData={treeData} showLine showIcon defaultExpandAll />; +} +``` + +## Props + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `checkable` | `boolean` | `false` | Add a Checkbox before the treeNodes | +| `defaultExpandAll` | `boolean` | `false` | Whether to expand all treeNodes by default | +| `disabled` | `boolean` | `false` | Whether disabled the tree | +| `draggable` | `boolean` | `false` | Specifies whether this Tree or the node is draggable | +| `multiple` | `boolean` | `false` | Allows selecting multiple treeNodes | +| `selectable` | `boolean` | `true` | Whether can be selected | +| `showIcon` | `boolean` | `false` | Controls whether to display the icon node | +| `showLine` | `boolean` | `false` | Shows a connecting line | +| `treeData` | `any` | `[{"title":"parent 1","key":"0-0","children":[{"title":"parent 1-0","key":"0-0-0","children":[{"title":"leaf","key":"0-0-0-0"},{"title":"leaf","key":"0-0-0-1"},{"title":"leaf","key":"0-0-0-2"}]},{"title":"parent 1-1","key":"0-0-1","children":[{"title":"leaf","key":"0-0-1-0"}]},{"title":"parent 1-2","key":"0-0-2","children":[{"title":"leaf","key":"0-0-2-0"},{"title":"leaf","key":"0-0-2-1"}]}]}]` | - | +| `defaultExpandedKeys` | `any` | `["0-0","0-0-0"]` | - | + +## Import + +```tsx +import Tree from '@superset/components'; Review Comment: **Suggestion:** The import example for the Tree component uses a default import from the '@superset/components' module, but the components index only provides Tree as a named export, so copying this snippet into real code will fail or not import the component correctly. [logic error] <details> <summary><b>Severity Level:</b> Major ⚠️</summary> ```mdx - ⚠️ Tree component docs show incorrect import syntax. - ⚠️ Copy-pasting snippet into plugins causes import/build failures. ``` </details> ```suggestion import { Tree } from '@superset/components'; ``` <details> <summary><b>Steps of Reproduction ✅ </b></summary> ```mdx 1. Open `docs/developer_docs/components/ui/tree.mdx` and locate the "Import" section at lines 257–261, which shows: ```tsx import Tree from '@superset/components'; ``` 2. Create a new React/TypeScript component in a Superset frontend or extension package that imports using this snippet: `import Tree from '@superset/components';` and then renders `<Tree treeData={[]} />`. 3. Build or type-check the frontend using the same component library used by the docs, which exposes components via `@superset/components`. The module is treated as an object of named exports, as seen in `docs/src/components/StorybookWrapper.jsx:36–47`, where `require('@superset/components')` is spread into a registry and its keys are used as component names. 4. Observe that the build or type-check fails (e.g., TypeScript "Module '@superset/components' has no default export" or runtime `Tree` being `undefined`), because `Tree` is exported from `@superset/components` as a named export (the Storybook story `superset-frontend/packages/superset-ui-core/src/components/Tree/Tree.stories.tsx:21` imports `Tree` from a local `index` and the docs infrastructure only ever treats `@superset/components` as a bag of named components, not a default export). ``` </details> <details> <summary><b>Prompt for AI Agent 🤖 </b></summary> ```mdx This is a comment left during a code review. **Path:** docs/developer_docs/components/ui/tree.mdx **Line:** 260:260 **Comment:** *Logic Error: The import example for the Tree component uses a default import from the '@superset/components' module, but the components index only provides Tree as a named export, so copying this snippet into real code will fail or not import the component correctly. Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise. ``` </details> <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F38196&comment_hash=aea83ff0941178b066fb15381e8b3b070e0402d3285fef78d4ccf2c77ccc13be&reaction=like'>👍</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F38196&comment_hash=aea83ff0941178b066fb15381e8b3b070e0402d3285fef78d4ccf2c77ccc13be&reaction=dislike'>👎</a> ########## docs/developer_docs/components/ui/slider.mdx: ########## @@ -0,0 +1,253 @@ +--- +title: Slider +sidebar_label: Slider +--- + +<!-- + 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 { StoryWithControls } from '../../../src/components/StorybookWrapper'; + +# Slider + +A slider input for selecting a value or range from a continuous or stepped interval. Supports single value, range, vertical orientation, marks, and tooltip display. + +## Live Example + +<StoryWithControls + component="Slider" + props={{ + min: 0, + max: 100, + defaultValue: 70, + step: 1, + disabled: false, + reverse: false, + vertical: false, + keyboard: true, + dots: false, + included: true +}} + controls={[ + { + name: "min", + label: "Min", + type: "number", + description: "Minimum value of the slider." + }, + { + name: "max", + label: "Max", + type: "number", + description: "Maximum value of the slider." + }, + { + name: "defaultValue", + label: "Default Value", + type: "number", + description: "Initial value of the slider." + }, + { + name: "step", + label: "Step", + type: "number", + description: "Step increment between values. Use null for marks-only mode." + }, + { + name: "disabled", + label: "Disabled", + type: "boolean", + description: "Whether the slider is disabled." + }, + { + name: "reverse", + label: "Reverse", + type: "boolean", + description: "Whether to reverse the slider direction." + }, + { + name: "vertical", + label: "Vertical", + type: "boolean", + description: "Whether to display the slider vertically." + }, + { + name: "keyboard", + label: "Keyboard", + type: "boolean", + description: "Whether keyboard arrow keys can control the slider." + }, + { + name: "dots", + label: "Dots", + type: "boolean", + description: "Whether to show dots at each step mark." + }, + { + name: "included", + label: "Included", + type: "boolean", + description: "Whether to highlight the filled portion of the track." + }, + { + name: "tooltipOpen", + label: "Tooltip Open", + type: "boolean", + description: "Whether the value tooltip is always visible." + }, + { + name: "tooltipPosition", + label: "Tooltip Position", + type: "select", + options: [ + "top", + "left", + "bottom", + "right", + "topLeft", + "topRight", + "bottomLeft", + "bottomRight", + "leftTop", + "leftBottom", + "rightTop", + "rightBottom" + ], + description: "Position of the value tooltip relative to the handle." + } +]} +/> + +## Try It + +Edit the code below to experiment with the component: + +```tsx live +function Demo() { + return ( + <div style={{ width: 400, padding: '20px 0' }}> + <Slider + min={0} + max={100} + defaultValue={70} + step={1} + /> + </div> + ); +} +``` + +## Range Slider + +```tsx live +function RangeSliderDemo() { + return ( + <div style={{ width: 400, padding: '20px 0' }}> + <h4>Basic Range</h4> + <Slider range defaultValue={[20, 70]} min={0} max={100} /> + <br /> + <h4>Draggable Track</h4> + <Slider range={{ draggableTrack: true }} defaultValue={[30, 60]} min={0} max={100} /> + </div> + ); +} +``` + +## With Marks + +```tsx live +function MarksDemo() { + return ( + <div style={{ width: 400, padding: '20px 0' }}> + <Slider + min={0} + max={100} + defaultValue={37} + marks={{ + 0: '0°C', + 25: '25°C', + 50: '50°C', + 75: '75°C', + 100: '100°C', + }} + /> + </div> + ); +} +``` + +## Stepped and Dots + +```tsx live +function SteppedDemo() { + return ( + <div style={{ width: 400, padding: '20px 0' }}> + <h4>Step = 10 with Dots</h4> + <Slider min={0} max={100} defaultValue={30} step={10} dots /> + <br /> + <h4>Step = 25</h4> + <Slider min={0} max={100} defaultValue={50} step={25} dots + marks={{ 0: '0', 25: '25', 50: '50', 75: '75', 100: '100' }} /> + </div> + ); +} +``` + +## Vertical Slider + +```tsx live +function VerticalDemo() { + return ( + <div style={{ height: 300, display: 'flex', gap: 40, padding: '0 40px' }}> + <Slider vertical defaultValue={30} /> + <Slider vertical range defaultValue={[20, 60]} /> + <Slider vertical defaultValue={50} dots step={10} + marks={{ 0: '0', 50: '50', 100: '100' }} /> + </div> + ); +} +``` + +## Props + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `min` | `number` | `0` | Minimum value of the slider. | +| `max` | `number` | `100` | Maximum value of the slider. | +| `defaultValue` | `number` | `70` | Initial value of the slider. | +| `step` | `number` | `1` | Step increment between values. Use null for marks-only mode. | +| `disabled` | `boolean` | `false` | Whether the slider is disabled. | +| `reverse` | `boolean` | `false` | Whether to reverse the slider direction. | +| `vertical` | `boolean` | `false` | Whether to display the slider vertically. | +| `keyboard` | `boolean` | `true` | Whether keyboard arrow keys can control the slider. | +| `dots` | `boolean` | `false` | Whether to show dots at each step mark. | +| `included` | `boolean` | `true` | Whether to highlight the filled portion of the track. | + +## Import + +```tsx +import Slider from '@superset/components'; Review Comment: **Suggestion:** The import example uses a default import from the barrel module, but this module can only have a single default export, so importing one specific component as the default (`Slider`) is misleading and inconsistent with the pattern used for other components, likely causing consumers to import the wrong value; switch to a named import to correctly reference the `Slider` component. [possible bug] <details> <summary><b>Severity Level:</b> Major ⚠️</summary> ```mdx - ⚠️ Slider import snippet misleads developers integrating Superset components. - ⚠️ Copy-pasted snippet can cause runtime React element errors. - ⚠️ Inconsistent with other UI docs using named imports. ``` </details> ```suggestion import { Slider } from '@superset/components'; ``` <details> <summary><b>Steps of Reproduction ✅ </b></summary> ```mdx 1. Open the Slider UI component docs at `docs/developer_docs/components/ui/slider.mdx:227-246`, which show the import snippet: ```tsx import Slider from '@superset/components'; ``` 2. Note from `docs/src/components/StorybookWrapper.jsx:36-47` and `docs/src/theme/ReactLiveScope/index.tsx:48-58` that `require('@superset/components')` returns an object (`SupersetComponents`) whose keys are individual components (e.g. `Button`, `Slider`) and is merged into a registry by spreading the object, indicating components are exposed as properties, not as a single default React component. 3. A developer following the Slider docs copies the snippet `import Slider from '@superset/components';` into their own Superset-frontend extension or external React project, then uses `<Slider />` in JSX expecting a React component. 4. At runtime, because `@superset/components` is an object of components (per the `require` usage) and not a single default `Slider` export, `Slider` will actually be that object, causing React to throw "Element type is invalid: expected a string (for built-in components) or a class/function but got: object" when rendering, until the import is corrected to `import { Slider } from '@superset/components';`. ``` </details> <details> <summary><b>Prompt for AI Agent 🤖 </b></summary> ```mdx This is a comment left during a code review. **Path:** docs/developer_docs/components/ui/slider.mdx **Line:** 245:245 **Comment:** *Possible Bug: The import example uses a default import from the barrel module, but this module can only have a single default export, so importing one specific component as the default (`Slider`) is misleading and inconsistent with the pattern used for other components, likely causing consumers to import the wrong value; switch to a named import to correctly reference the `Slider` component. Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise. ``` </details> <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F38196&comment_hash=2126ef1fca5681c59dd6e5c33bcbeec3e7de95b33b40c97b1ecab779dae9beb4&reaction=like'>👍</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F38196&comment_hash=2126ef1fca5681c59dd6e5c33bcbeec3e7de95b33b40c97b1ecab779dae9beb4&reaction=dislike'>👎</a> -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
