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]

Reply via email to