This is an automated email from the ASF dual-hosted git repository.

yjc pushed a commit to branch home-screen-mvp
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 97c21c9cdc7a86f047e13f2cd2ca6280cdb59bbf
Author: Phillip Kelley-Dotson <[email protected]>
AuthorDate: Tue Oct 6 15:28:42 2020 -0700

    more updates
---
 .../views/CRUD/welcome/SavedQueries_spec.tsx       |   0
 .../views/CRUD/welcome/Welcome_spec.tsx            |   7 +-
 .../src/components/ListViewCard/index.tsx          |   8 +-
 superset-frontend/src/components/Menu/SubMenu.tsx  |  14 +-
 .../src/views/CRUD/chart/ChartCard.tsx             | 162 +++++++++++++++++++++
 .../src/views/CRUD/chart/ChartList.tsx             |   5 +-
 .../src/views/CRUD/dashboard/DashboardCard.tsx     |  31 +---
 superset-frontend/src/views/CRUD/types.ts          |  36 +++++
 .../src/views/CRUD/welcome/ActivityTable.tsx       |  63 ++++----
 .../src/views/CRUD/welcome/ChartTable.tsx          |  55 +++----
 .../src/views/CRUD/welcome/SavedQueries.tsx        | 129 +++++++++-------
 .../src/views/CRUD/welcome/Welcome.tsx             |  31 ++--
 superset/queries/saved_queries/api.py              |   2 +-
 13 files changed, 355 insertions(+), 188 deletions(-)

diff --git 
a/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx 
b/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
new file mode 100644
index 0000000..e69de29
diff --git 
a/superset-frontend/spec/javascripts/views/CRUD/welcome/Welcome_spec.tsx 
b/superset-frontend/spec/javascripts/views/CRUD/welcome/Welcome_spec.tsx
index bf23ef1..5db15b9 100644
--- a/superset-frontend/spec/javascripts/views/CRUD/welcome/Welcome_spec.tsx
+++ b/superset-frontend/spec/javascripts/views/CRUD/welcome/Welcome_spec.tsx
@@ -17,7 +17,6 @@
  * under the License.
  */
 import React from 'react';
-import { Panel, Row, Tab } from 'react-bootstrap';
 import { shallow } from 'enzyme';
 
 import Welcome from 'src/views/CRUD/welcome/Welcome';
@@ -37,10 +36,8 @@ describe('Welcome', () => {
   it('is valid', () => {
     expect(React.isValidElement(<Welcome {...mockedProps} />)).toBe(true);
   });
-  it('renders 3 Tab, Panel, and Row components', () => {
+  it('renders 3 submenu components', () => {
     const wrapper = shallow(<Welcome {...mockedProps} />);
-    expect(wrapper.find(Tab)).toHaveLength(3);
-    expect(wrapper.find(Panel)).toHaveLength(3);
-    expect(wrapper.find(Row)).toHaveLength(3);
+    expect(wrapper.find('SubMenu')).toHaveLength(4);
   });
 });
diff --git a/superset-frontend/src/components/ListViewCard/index.tsx 
b/superset-frontend/src/components/ListViewCard/index.tsx
index eb2bbab..7fb69c0 100644
--- a/superset-frontend/src/components/ListViewCard/index.tsx
+++ b/superset-frontend/src/components/ListViewCard/index.tsx
@@ -151,10 +151,11 @@ interface CardProps {
   titleRight?: React.ReactNode;
   coverLeft?: React.ReactNode;
   coverRight?: React.ReactNode;
-  actions: React.ReactNode;
+  actions: React.ReactNode | null;
   showImg?: boolean;
   rows?: number | string;
   avatar?: string;
+  isRecent?: boolean;
 }
 
 function ListViewCard({
@@ -167,7 +168,7 @@ function ListViewCard({
   coverLeft,
   coverRight,
   actions,
-  avatar = 'nav-dashboard',
+  avatar,
   loading,
   imgPosition = 'top',
   showImg = true,
@@ -255,7 +256,8 @@ function ListViewCard({
             </>
           }
           description={description}
-          avatar={<IconComponent />}
+          // @ts-ignore
+          avatar={avatar ? <Icon name={avatar} /> : null}
         />
       )}
     </StyledCard>
diff --git a/superset-frontend/src/components/Menu/SubMenu.tsx 
b/superset-frontend/src/components/Menu/SubMenu.tsx
index 93df81c..0144a20 100644
--- a/superset-frontend/src/components/Menu/SubMenu.tsx
+++ b/superset-frontend/src/components/Menu/SubMenu.tsx
@@ -53,12 +53,24 @@ const StyledHeader = styled.header`
     li.active > a,
     li.active > div,
     li > a:hover,
+    li > a:focus,
     li > div:hover {
-      background-color: ${({ theme }) => theme.colors.secondary.light4};
+      background: ${({ theme }) => theme.colors.secondary.light4};
       border-bottom: none;
       border-radius: 4px;
     }
   }
+  .navbar-inverse {
+    .navbar-nav {
+      & > .active > a {
+        background: ${({ theme }) => theme.colors.secondary.light4};
+        &:hover,
+        &:focus {
+          background: ${({ theme }) => theme.colors.secondary.light4};
+        }
+      }
+    }
+  }
 `;
 
 type MenuClickHandler = React.MouseEventHandler<MenuItem>;
diff --git a/superset-frontend/src/views/CRUD/chart/ChartCard.tsx 
b/superset-frontend/src/views/CRUD/chart/ChartCard.tsx
new file mode 100644
index 0000000..a8a123c
--- /dev/null
+++ b/superset-frontend/src/views/CRUD/chart/ChartCard.tsx
@@ -0,0 +1,162 @@
+/**
+ * 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 { useFavoriteStatus } from 'src/views/CRUD/hooks';
+// import { createFetchRelated, createErrorHandler } from 
'src/views/CRUD/utils';
+import { SupersetClient, t } from '@superset-ui/core';
+import ConfirmStatusChange from 'src/components/ConfirmStatusChange';
+import AvatarIcon from 'src/components/AvatarIcon';
+import Icon from 'src/components/Icon';
+import Chart from 'src/types/Chart';
+import ListViewCard from 'src/components/ListViewCard';
+import Label from 'src/components/Label';
+import { Dropdown, Menu } from 'src/common/components';
+import FaveStar from 'src/components/FaveStar';
+
+const FAVESTAR_BASE_URL = '/superset/favstar/slice';
+
+interface ChartCardProps {
+  chart: Chart;
+  hasPerm: (perm: string) => boolean;
+  openChartEditModal: (chart: Chart) => void;
+  bulkSelectEnabled: boolean;
+  addDangerToast: (msg: string) => void;
+  addSuccessToast: (msg: string) => void;
+  refreshData: () => void;
+  loading: boolean;
+}
+
+export default function ChartCard({
+  chart,
+  hasPerm,
+  openChartEditModal,
+  bulkSelectEnabled,
+  addDangerToast,
+  addSuccessToast,
+  refreshData,
+  loading,
+}: ChartCardProps) {
+  const canEdit = hasPerm('can_edit');
+  const canDelete = hasPerm('can_delete');
+  const [favoriteStatusRef, fetchFaveStar, saveFaveStar] = useFavoriteStatus(
+    {},
+    FAVESTAR_BASE_URL,
+    addDangerToast,
+  );
+
+  function openChartEditModal(chart: Chart) {
+    setSliceCurrentlyEditing({
+      slice_id: chart.id,
+      slice_name: chart.slice_name,
+      description: chart.description,
+      cache_timeout: chart.cache_timeout,
+    });
+  }
+
+  function handleChartDelete({ id, slice_name: sliceName }: Chart) {
+    SupersetClient.delete({
+      endpoint: `/api/v1/chart/${id}`,
+    }).then(
+      () => {
+        refreshData();
+        addSuccessToast(t('Deleted: %s', sliceName));
+      },
+      () => {
+        addDangerToast(t('There was an issue deleting: %s', sliceName));
+      },
+    );
+  }
+
+  const menu = (
+    <Menu>
+      {canDelete && (
+        <Menu.Item>
+          <ConfirmStatusChange
+            title={t('Please Confirm')}
+            description={
+              <>
+                {t('Are you sure you want to delete')} 
<b>{chart.slice_name}</b>
+                ?
+              </>
+            }
+            onConfirm={() => handleChartDelete(chart)}
+          >
+            {confirmDelete => (
+              <div
+                role="button"
+                tabIndex={0}
+                className="action-button"
+                onClick={confirmDelete}
+              >
+                <ListViewCard.MenuIcon name="trash" /> Delete
+              </div>
+            )}
+          </ConfirmStatusChange>
+        </Menu.Item>
+      )}
+      {canEdit && (
+        <Menu.Item
+          role="button"
+          tabIndex={0}
+          onClick={() => openChartEditModal(chart)}
+        >
+          <ListViewCard.MenuIcon name="edit-alt" /> Edit
+        </Menu.Item>
+      )}
+    </Menu>
+  );
+  return (
+    <ListViewCard
+      loading={loading}
+      title={chart.slice_name}
+      url={bulkSelectEnabled ? undefined : chart.url}
+      imgURL={chart.thumbnail_url ?? ''}
+      imgFallbackURL="/static/assets/images/chart-card-fallback.png"
+      description={t('Last modified %s', chart.changed_on_delta_humanized)}
+      coverLeft={(chart.owners || []).slice(0, 5).map(owner => (
+        <AvatarIcon
+          key={owner.id}
+          uniqueKey={`${owner.username}-${chart.id}`}
+          firstName={owner.first_name}
+          lastName={owner.last_name}
+          iconSize={24}
+          textSize={9}
+        />
+      ))}
+      coverRight={
+        <Label bsStyle="secondary">{chart.datasource_name_text}</Label>
+      }
+      actions={
+        <ListViewCard.Actions>
+          <FaveStar
+            itemId={chart.id}
+            fetchFaveStar={fetchFaveStar}
+            saveFaveStar={saveFaveStar}
+            isStarred={!!favoriteStatusRef.current[chart.id]}
+            height={20}
+            width={20}
+          />
+          <Dropdown overlay={menu}>
+            <Icon name="more-horiz" />
+          </Dropdown>
+        </ListViewCard.Actions>
+      }
+    />
+  );
+}
diff --git a/superset-frontend/src/views/CRUD/chart/ChartList.tsx 
b/superset-frontend/src/views/CRUD/chart/ChartList.tsx
index 0586267..d326db7 100644
--- a/superset-frontend/src/views/CRUD/chart/ChartList.tsx
+++ b/superset-frontend/src/views/CRUD/chart/ChartList.tsx
@@ -430,7 +430,10 @@ function ChartList(props: ChartListProps) {
         hasPerm={hasPerm}
         openChartEditModal={openChartEditModal}
         bulkSelectEnabled={bulkSelectEnabled}
-        renderFaveStar={renderFaveStar}
+        addDangerToast={props.addDangerToast}
+        addSuccessToast={addSuccessToast}
+        refreshData={refreshData}
+        loading={loading}
       />
     );
   }
diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx 
b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
index f42de20..e2e3b1f 100644
--- a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
+++ b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx
@@ -8,39 +8,12 @@ import Icon from 'src/components/Icon';
 import Label from 'src/components/Label';
 import FacePile from 'src/components/FacePile';
 import FaveStar from 'src/components/FaveStar';
-import Owner from 'src/types/Owner';
-
+import { DashboardCardProps, Dashboard } from 'src/views/CRUD/types';
 import { createErrorHandler } from 'src/views/CRUD/utils';
 import { useFavoriteStatus } from 'src/views/CRUD/hooks';
 
 const FAVESTAR_BASE_URL = '/superset/favstar/Dashboard';
 
-interface Dashboard {
-  changed_by_name: string;
-  changed_by_url: string;
-  changed_on_delta_humanized: string;
-  changed_by: string;
-  dashboard_title: string;
-  slice_name?: string;
-  id: number;
-  published: boolean;
-  url: string;
-  thumbnail_url: string;
-  owners: Owner[];
-  loading: boolean;
-}
-
-interface DashboardCardProps {
-  isChart?: boolean;
-  dashboard: Dashboard;
-  hasPerm: (name: string) => boolean;
-  bulkSelectEnabled: boolean;
-  refreshData: () => void;
-  addDangerToast: (msg: string) => void;
-  addSuccessToast: (msg: string) => void;
-  openDashboardEditModal?: (d: Dashboard) => void;
-}
-
 function DashboardCard({
   isChart,
   dashboard,
@@ -132,7 +105,7 @@ function DashboardCard({
             openDashboardEditModal && openDashboardEditModal(dashboard)
           }
         >
-          <ListViewCard.MenuIcon name="pencil" /> Edit
+          <ListViewCard.MenuIcon name="edit-alt" /> Edit
         </Menu.Item>
       )}
     </Menu>
diff --git a/superset-frontend/src/views/CRUD/types.ts 
b/superset-frontend/src/views/CRUD/types.ts
index 91d88a3..7f5fce5 100644
--- a/superset-frontend/src/views/CRUD/types.ts
+++ b/superset-frontend/src/views/CRUD/types.ts
@@ -16,7 +16,43 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { User } from 'src/types/bootstrapTypes';
+import Owner from 'src/types/Owner';
 
 export type FavoriteStatus = {
   [id: number]: boolean;
 };
+
+export interface DashboardTableProps {
+  addDangerToast: (message: string) => void;
+  addSuccessToast: (message: string) => void;
+  search: string;
+  dashboardFilter?: string;
+  user?: User;
+}
+
+interface Dashboard {
+  changed_by_name: string;
+  changed_by_url: string;
+  changed_on_delta_humanized: string;
+  changed_by: string;
+  dashboard_title: string;
+  slice_name?: string;
+  id: number;
+  published: boolean;
+  url: string;
+  thumbnail_url: string;
+  owners: Owner[];
+  loading: boolean;
+}
+
+export interface DashboardCardProps {
+  isChart?: boolean;
+  dashboard: Dashboard;
+  hasPerm: (name: string) => boolean;
+  bulkSelectEnabled: boolean;
+  refreshData: () => void;
+  addDangerToast: (msg: string) => void;
+  addSuccessToast: (msg: string) => void;
+  openDashboardEditModal?: (d: Dashboard) => void;
+}
diff --git a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx 
b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
index ae496f2..b4c941c 100644
--- a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
@@ -17,34 +17,29 @@
  * under the License.
  */
 import React, { useEffect, useState } from 'react';
-import { styled, SupersetClient, t } from '@superset-ui/core';
-import Icon from 'src/components/Icon';
+import { SupersetClient, t } from '@superset-ui/core';
 import rison from 'rison';
 import moment from 'moment';
 import ListViewCard from 'src/components/ListViewCard';
 import { addDangerToast } from 'src/messageToasts/actions';
-import { MenuItem } from 'react-bootstrap';
 import { createBatchMethod, createErrorHandler } from '../utils';
 
 interface MapProps {
-  action: string;
-  item_title: string;
+  action?: string;
+  item_title?: string;
   slice_name: string;
   time: string;
   changed_on_utc: string;
+  item_url: string;
+}
+
+interface ActivityProps {
   user: {
     userId: string | number;
   };
   activityFilter: string;
-  item_url: string;
 }
 
-const Cards = styled.div`
-  width: 200px;
-  padding: 15px;
-  border: 1px solid #f0f0f0;
-`;
-
 const filters = {
   // Chart and dashbaord uses same filters
   // for edited and created
@@ -64,33 +59,34 @@ const filters = {
   ],
 };
 
-export default function ActivityTable({ user, activityFilter }: MapProps) {
+export default function ActivityTable({ user, activityFilter }: ActivityProps) 
{
   const [active, setActiveState] = useState([]);
+  const [loading, setLoading] = useState(false);
   const recent = `/superset/recent_activity/${user.userId}/?limit=10`;
   const setData = (endpoint: string) => {
-    SupersetClient.get(endpoint)
+    setLoading(true);
+    SupersetClient.get({ endpoint })
       .then(({ json }) => {
+        setLoading(false);
         setActiveState(json);
       })
-      .catch(e => {
-        createErrorHandler(err =>
+      .catch(() => {
+        setLoading(false);
+        createErrorHandler(() =>
           addDangerToast(t('There was an issue fetching your resource')),
         );
       });
   };
 
   const setBatchData = (q: string) => {
-    createBatchMethod(q).then((res: Array<object>) => {
-      setActiveState(res);
-    });
+    createBatchMethod(q).then((res: Array<object>) => setActiveState(res));
   };
 
-  const getIconName = (name: string): string => {
-    console.log('name', name)
+  const getIconName = (name: string | undefined) => {
     if (name === 'explore_json') return 'sql';
     if (name === 'dashboard') return 'nav-dashboard';
-    if (name === 'log') return 'nav-chart';
-    return 'sql';
+    if (name === 'log') return 'nav-charts';
+    return '';
   };
 
   const getData = () => {
@@ -102,7 +98,7 @@ export default function ActivityTable({ user, activityFilter 
}: MapProps) {
       filters: activityFilter !== 'Created' ? filters.edited : filters.created,
     });
     if (activityFilter === 'Viewed') {
-      setData({ endpoint: recent });
+      setData(recent);
     }
     if (activityFilter === 'Edited') {
       setBatchData(queryParams);
@@ -117,31 +113,22 @@ export default function ActivityTable({ user, 
activityFilter }: MapProps) {
   }, [activityFilter]);
 
   const renderActivity = () => {
-    console.log('e', active)
     return active.map((e: MapProps) => (
       <ListViewCard
-        isRecent={true}
+        isRecent
+        loading={loading}
+        imgURL={null}
+        imgFallbackURL={null}
         url={e.item_url}
         title={activityFilter === 'Viewed' ? e.item_title : e.slice_name}
         description={moment
           .utc(activityFilter === 'Viewd' ? e.time : e.changed_on_utc)
           .fromNow()}
         avatar={getIconName(e.action)}
+        actions={null}
       />
     ));
   };
 
   return <> {renderActivity()} </>;
 }
-/*
-      <a href={e.item_url}>
-        <Cards>
-          <div>{activityFilter === 'Viewed' ? e.item_title : 
e.slice_name}</div>
-          <div>
-            {moment
-              .utc(activityFilter === 'Viewd' ? e.time : e.changed_on_utc)
-              .fromNow()}
-          </div>
-        </Cards>
-      </>
-      */
\ No newline at end of file
diff --git a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx 
b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
index 1958f88..e1223cb 100644
--- a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
@@ -18,18 +18,13 @@
  */
 import React, { useEffect } from 'react';
 import { t } from '@superset-ui/core';
-import { debounce } from 'lodash';
-import ListView, { FetchDataConfig } from 'src/components/ListView';
 import { useListViewResource, useFavoriteStatus } from 'src/views/CRUD/hooks';
 import withToasts from 'src/messageToasts/enhancers/withToasts';
 import { User } from 'src/types/bootstrapTypes';
-import ListViewCard from 'src/components/ListViewCard';
-import { Dropdown, Menu } from 'src/common/components';
-import Icon from 'src/components/Icon';
-import Label from 'src/components/Label';
 import Owner from 'src/types/Owner';
-import ConfirmStatusChange from 'src/components/ConfirmStatusChange';
-import DashboardCard from '../dashboard/DashboardCard';
+import ChartCard from 'src/views/CRUD/chart/ChartCard';
+import Chart from 'src/types/Chart';
+
 const PAGE_SIZE = 3;
 
 interface ChartTableProps {
@@ -61,16 +56,6 @@ interface ChartTableState {
   loading: boolean;
 }
 
-export interface FilterValue {
-  col: string;
-  operator: string;
-  value: string | boolean | number | null | undefined;
-}
-
-export interface FetchDataConfig {
-  filters: FilterValue[];
-}
-
 function ChartTable({
   chartFilter,
   user,
@@ -82,15 +67,14 @@ function ChartTable({
     hasPerm,
     refreshData,
     fetchData,
-  } = useListViewResource<Dashboard>('chart', t('chart'), addDangerToast);
-  console.log('dashboardFilter', chartFilter);
+  } = useListViewResource<Chart>('chart', t('chart'), addDangerToast);
   const getFilters = () => {
     const filters = [];
 
     if (chartFilter === 'Mine') {
       filters.push({
-        id: 'owners',
-        operator: 'rel_m_m',
+        id: 'created_by',
+        operator: 'rel_o_m',
         value: `${user?.userId}`,
       });
     } else {
@@ -98,10 +82,6 @@ function ChartTable({
         id: 'id',
         operator: 'chart_is_fav',
         value: true,
-       /* id: 'favorite', // API currently can't filter by favorite
-        operator: 'eq',
-        value: true,
-        */
       });
     }
     // Do we need search?
@@ -129,20 +109,19 @@ function ChartTable({
       filters: getFilters(),
     });
   }, [chartFilter]);
-  console.log("----charts: ", charts);
+
   return (
     <>
-      {charts.map(e => (
-        <DashboardCard
-          {...{
-            dashboard: e,
-            hasPerm,
-            bulkSelectEnabled,
-            refreshData,
-            addDangerToast,
-            addSuccessToast,
-          }}
-          isChart
+      {charts.map((e, i) => (
+        <ChartCard
+          key={`${i}`}
+          loading={loading}
+          chart={e}
+          hasPerm={hasPerm}
+          bulkSelectEnabled={bulkSelectEnabled}
+          refreshData={refreshData}
+          addDangerToast={addDangerToast}
+          addSuccessToast={addSuccessToast}
         />
       ))}
     </>
diff --git a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx 
b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
index cab929e..73c7547 100644
--- a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
@@ -16,70 +16,97 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import React from 'react';
+import React, { useEffect, useState } from 'react';
 import { t, SupersetClient } from '@superset-ui/core';
 import withToasts from 'src/messageToasts/enhancers/withToasts';
 import { Dropdown, Menu } from 'src/common/components';
+import { useListViewResource } from 'src/views/CRUD/hooks';
 import ListViewCard from 'src/components/ListViewCard';
-// import FaveStar from 'src/components/FaveStar';
 import Icon from 'src/components/Icon';
+import { addDangerToast } from 'src/messageToasts/actions';
 
-interface StateProps {
-  queries: Array<object>;
+const PAGE_SIZE = 3;
+
+interface Query {
+  database: {
+    database_name: string;
+  };
+  rows: string;
+  description: string;
+  end_time: string;
+  addDangerToast: () => void;
 }
 
-class SavedQueries extends React.PureComponent {
-  constructor(props: StateProps) {
-    super(props);
-    this.state = {
-      queries: [],
-    };
-  }
+interface StateProps {
+  queries: Array<Query>;
+}
 
-  componentDidMount() {
-    this.fetchData();
-  }
+const SavedQueries = ({ user, queryFilter }) => {
+  const {
+    state: { loading, resourceCollection: queries },
+    fetchData,
+  } = useListViewResource<Query>('query', t('query'), addDangerToast);
+  const getFilters = () => {
+    const filters = [];
 
-  // eslint-disable-next-line consistent-return
-  fetchData = async () => {
-    try {
-      const { json } = await SupersetClient.get({
-        endpoint: `/api/v1/query/`,
+    if (queryFilter === 'Mine') {
+      filters.push({
+        id: 'created_by',
+        operator: 'rel_o_m',
+        value: `${user?.userId}`,
+      });
+    } else {
+      filters.push({
+        id: 'id',
+        operator: 'saved_query_is_fav',
+        value: true,
       });
-      this.setState({ queries: json.result });
-    } catch (e) {
-      return console.log(e);
     }
+    return filters;
   };
 
-  render() {
-    const menu = (
-      <Menu>
-        <Menu.Item>Delete</Menu.Item>
-      </Menu>
-    );
-    // console.log('queries', this.state.queries)
-    return (
-      <>
-        {this.state.queries.map(q => (
-          <ListViewCard
-            title={q.database.database_name}
-            rows={q.rows}
-            loading={false}
-            description={t('Last run ', q.end_time)}
-            showImg={false}
-            actions={
-              <ListViewCard.Actions>
-                <Dropdown overlay={menu}>
-                  <Icon name="more-horiz" />
-                </Dropdown>
-              </ListViewCard.Actions>
-            }
-          />
-        ))}
-      </>
-    );
-  }
-}
+  useEffect(() => {
+    fetchData({
+      pageIndex: 0,
+      pageSize: PAGE_SIZE,
+      sortBy: [
+        {
+          id: 'changed_on_delta_humanized',
+          desc: true,
+        },
+      ],
+      filters: getFilters(),
+    });
+  }, [queryFilter]);
+
+  const menu = (
+    <Menu>
+      <Menu.Item>Delete</Menu.Item>
+    </Menu>
+  );
+
+  return (
+    <>
+      {queries.map(q => (
+        <ListViewCard
+          imgFallbackURL={null}
+          imgURL={null}
+          title={q.database.database_name}
+          rows={q.rows}
+          loading={loading}
+          description={t('Last run ', q.end_time)}
+          showImg={false}
+          actions={
+            <ListViewCard.Actions>
+              <Dropdown overlay={menu}>
+                <Icon name="more-horiz" />
+              </Dropdown>
+            </ListViewCard.Actions>
+          }
+        />
+      ))}
+    </>
+  );
+};
 
 export default withToasts(SavedQueries);
diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx 
b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx
index f4f1e7d..b4326fc 100644
--- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx
@@ -24,11 +24,11 @@ import { Collapse } from 'src/common/components';
 import { useQueryParam, StringParam, QueryParamConfig } from 
'use-query-params';
 import { User } from 'src/types/bootstrapTypes';
 import Icon from 'src/components/Icon';
+
 import ActivityTable from './ActivityTable';
 import ChartTable from './ChartTable';
 import SavedQueries from './SavedQueries';
 import DashboardTable from './DashboardTable';
-import Icon from 'src/components/Icon';
 
 const { Panel } = Collapse;
 
@@ -79,11 +79,6 @@ function useSyncQueryState(
 }
 
 export default function Welcome({ user }: WelcomeProps) {
-  const [activeTab, setActiveTab] = useSyncQueryState(
-    'activeTab',
-    StringParam,
-    'all',
-  );
   const [queryFilter, setQueryFilter] = useState('Favorite');
   const [activityFilter, setActivityFilter] = useState('Viewed');
   const [dashboardFilter, setDashboardFilter] = useState('Favorite');
@@ -93,21 +88,13 @@ export default function Welcome({ user }: WelcomeProps) {
     StringParam,
     '',
   );
-  console.log('user', user);
-
 
   function ExpandIcon(): React.ReactNode {
-    return (
-      <Icon name="caret-right" />
-    )
+    return <Icon name="caret-right" />;
   }
 
   return (
-    <Collapse
-      defaultActiveKey={['1']}
-      expandIcon={ExpandIcon}
-      ghost
-    >
+    <Collapse defaultActiveKey={['1']} expandIcon={ExpandIcon} ghost>
       <Panel header={t('Recents')} key="1">
         <SubMenu
           activeChild={activityFilter}
@@ -130,10 +117,6 @@ export default function Welcome({ user }: WelcomeProps) {
               onClick: () => setActivityFilter('Created'),
             },
           ]}
-          links={{
-            link: `/chart/list`,
-            linkTitle: 'View All',
-          }}
         />
         <ActivityContainer>
           <ActivityTable user={user} activityFilter={activityFilter} />
@@ -166,6 +149,7 @@ export default function Welcome({ user }: WelcomeProps) {
               ),
               buttonStyle: 'tertiary',
               onClick: () => {
+                // @ts-ignore
                 window.location = '/dashboard/new';
               },
             },
@@ -173,6 +157,7 @@ export default function Welcome({ user }: WelcomeProps) {
               name: 'View All',
               buttonStyle: 'link',
               onClick: () => {
+                // @ts-ignore
                 window.location = '/dashboard/list/';
               },
             },
@@ -221,6 +206,7 @@ export default function Welcome({ user }: WelcomeProps) {
               ),
               buttonStyle: 'tertiary',
               onClick: () => {
+                // @ts-ignore
                 window.location = '/superset/sqllab';
               },
             },
@@ -228,13 +214,14 @@ export default function Welcome({ user }: WelcomeProps) {
               name: 'View All',
               buttonStyle: 'link',
               onClick: () => {
+                // @ts-ignore
                 window.location = 'superset/sqllab#search';
               },
             },
           ]}
         />
         <CardContainer>
-          <SavedQueries />
+          <SavedQueries user={user} queryFilter={queryFilter} />
         </CardContainer>
       </Panel>
       <Panel header={t('Charts')} key="4">
@@ -263,6 +250,7 @@ export default function Welcome({ user }: WelcomeProps) {
               ),
               buttonStyle: 'tertiary',
               onClick: () => {
+                // @ts-ignore
                 window.location = '/chart/add';
               },
             },
@@ -270,6 +258,7 @@ export default function Welcome({ user }: WelcomeProps) {
               name: 'View All',
               buttonStyle: 'link',
               onClick: () => {
+                // @ts-ignore
                 window.location = '/chart/list';
               },
             },
diff --git a/superset/queries/saved_queries/api.py 
b/superset/queries/saved_queries/api.py
index 794ab25..b37fc7d 100644
--- a/superset/queries/saved_queries/api.py
+++ b/superset/queries/saved_queries/api.py
@@ -106,7 +106,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi):
         "last_run_delta_humanized",
     ]
 
-    search_columns = ["id", "database", "label", "schema"]
+    search_columns = ["id", "database", "label", "schema", "created_by"]
     search_filters = {
         "id": [SavedQueryFavoriteFilter],
         "label": [SavedQueryAllTextFilter],

Reply via email to