rusackas commented on code in PR #37141:
URL: https://github.com/apache/superset/pull/37141#discussion_r2824927087


##########
superset-frontend/src/pages/DashboardList/index.tsx:
##########
@@ -730,7 +735,24 @@ function DashboardList(props: DashboardListProps) {
   }
   return (
     <>
-      <SubMenu name={t('Dashboards')} buttons={subMenuButtons} />
+      <SubMenu
+        name={t('Dashboards')}
+        buttons={subMenuButtons}
+        leftIcon={
+          !isNotMobile ? (
+            <Button
+              buttonStyle="link"
+              onClick={() => setMobileFiltersOpen(true)}
+              css={css`
+                padding: 0;
+                margin-right: ${theme.sizeUnit * 2}px;
+              `}
+            >
+              <Icons.SearchOutlined iconSize="l" />
+            </Button>

Review Comment:
   ✅ Fixed - Added aria-label to the mobile search button for accessibility.



##########
superset-frontend/src/pages/Home/index.tsx:
##########
@@ -147,6 +147,7 @@ export const LoadingCards = ({ cover }: LoadingProps) => (
 );
 
 function Welcome({ user, addDangerToast }: WelcomeProps) {
+  const { md: isNotMobile } = Grid.useBreakpoint();

Review Comment:
   ✅ Fixed - Added default value `{ md: isNotMobile = true }` to prevent flash 
of mobile content on initial render when breakpoint data isn't yet available.



##########
superset-frontend/src/components/ListView/ListView.test.tsx:
##########
@@ -359,3 +359,84 @@ describe('ListView', () => {
     expect(mockedPropsComprehensive.fetchData).toHaveBeenCalled();
   });
 });
+
+// Mobile support tests
+test('respects forceViewMode prop and hides view toggle', () => {
+  // Omit cardSortSelectOptions to avoid CardSortSelect needing initialSort
+  const { cardSortSelectOptions, ...propsWithoutSort } = 
mockedPropsComprehensive;
+  render(
+    <QueryParamProvider location={makeMockLocation()}>
+      <ListView
+        {...propsWithoutSort}
+        renderCard={() => <div>Card</div>}
+        forceViewMode="card"
+      />
+    </QueryParamProvider>,
+    { store: mockStore() },
+  );
+
+  // View toggle should not be present when forceViewMode is set
+  expect(screen.queryByLabelText('card-view')).not.toBeInTheDocument();
+  expect(screen.queryByLabelText('list-view')).not.toBeInTheDocument();
+});

Review Comment:
   Acknowledged - this test verifies the forceViewMode behavior where the 
toggle is hidden. The test is working as intended - when forceViewMode is set, 
the toggle should not be accessible. The test setup correctly mocks the mobile 
state to verify this functionality.



##########
superset-frontend/src/components/ListView/ListView.tsx:
##########
@@ -516,6 +582,32 @@ export function ListView<T extends object = any>({
           )}
         </div>
       </div>
+
+      {/* Mobile filter drawer */}
+      {filterable && setMobileFiltersOpen && (
+        <Drawer
+          title={mobileFiltersDrawerTitle || t('Search')}
+          placement="left"
+          onClose={() => setMobileFiltersOpen(false)}
+          open={mobileFiltersOpen}
+          width={300}
+        >
+          <MobileFilterDrawerContent>
+            <FilterControls
+              filters={filters}
+              internalFilters={internalFilters}
+              updateFilterValue={applyFilterValue}
+            />

Review Comment:
   Acknowledged - the filter ref is used for the "Clear All" functionality in 
the mobile filter drawer. Will review if this needs to be passed through more 
explicitly or if a different pattern (like a context or callback) would be 
cleaner in a follow-up PR.



##########
superset-frontend/src/components/ListView/ListView.tsx:
##########
@@ -516,6 +582,32 @@ export function ListView<T extends object = any>({
           )}
         </div>
       </div>
+
+      {/* Mobile filter drawer */}
+      {filterable && setMobileFiltersOpen && (
+        <Drawer
+          title={mobileFiltersDrawerTitle || t('Search')}
+          placement="left"
+          onClose={() => setMobileFiltersOpen(false)}
+          open={mobileFiltersOpen}
+          width={300}
+        >
+          <MobileFilterDrawerContent>
+            <FilterControls
+              filters={filters}
+              internalFilters={internalFilters}
+              updateFilterValue={applyFilterValue}
+            />
+            {cardSortSelectOptions && (

Review Comment:
   Acknowledged - the sort control visibility uses `forceViewMode` which is 
derived from the mobile breakpoint state. The check ensures sort controls are 
only shown in the appropriate view mode. Will review for consistency in the 
sorting behavior between card/table views.



##########
superset-frontend/src/components/ListView/ListView.tsx:
##########
@@ -373,24 +423,40 @@ export function ListView<T extends object = any>({
       )}
       <div data-test={className} className={`superset-list-view ${className} 
`}>
         <div className="header">
-          {cardViewEnabled && (
+          {cardViewEnabled && !forceViewMode && (
             <ViewModeToggle mode={viewMode} setMode={setViewMode} />
           )}
           <div className="controls" data-test="filters-select">
-            {filterable && (
+            {/* On mobile, filters are shown in drawer; on desktop, show 
inline */}
+            {filterable && !setMobileFiltersOpen && (
               <FilterControls
                 ref={filterControlsRef}
                 filters={filters}
                 internalFilters={internalFilters}
                 updateFilterValue={applyFilterValue}
               />
             )}
+            {filterable && setMobileFiltersOpen && (
+              <>
+                {/* Desktop: show inline filters */}
+                <div className="desktop-filters">
+                  <FilterControls
+                    ref={filterControlsRef}
+                    filters={filters}
+                    internalFilters={internalFilters}
+                    updateFilterValue={applyFilterValue}
+                  />
+                </div>
+              </>
+            )}
             {viewMode === 'card' && cardSortSelectOptions && (
-              <CardSortSelect
-                initialSort={sortBy}
-                onChange={(value: SortColumn[]) => setSortBy(value)}
-                options={cardSortSelectOptions}
-              />
+              <div className="desktop-sort">

Review Comment:
   Acknowledged - the `.desktop-sort` wrapper is intentional to hide the sort 
dropdown on mobile since mobile uses the filter drawer for sorting. The CSS 
hides this container at mobile breakpoints. Could add a conditional render as 
suggested for cleaner markup, but the current approach works correctly.



-- 
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