diff --git a/frappe-ui b/frappe-ui index c92596203..9310cdb05 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit c92596203011e52c650602bc4d4f10c4163defc0 +Subproject commit 9310cdb056948121dced70995775d61e9170b112 diff --git a/frontend/package.json b/frontend/package.json index 1df665b1f..12550e735 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,7 +29,7 @@ "dom-to-image": "^2.6.0", "echarts": "^5.4.0", "feather-icons": "^4.28.0", - "frappe-ui": "0.1.5", + "frappe-ui": "0.1.35", "grid-layout-plus": "^1.0.2", "lucide-vue-next": "^0.300.0", "pinia": "^2.0.30", diff --git a/frontend/src/dashboard/useDashboard.js b/frontend/src/dashboard/useDashboard.js index 1782421e4..b64e3c1a3 100644 --- a/frontend/src/dashboard/useDashboard.js +++ b/frontend/src/dashboard/useDashboard.js @@ -1,5 +1,4 @@ import useQuery from '@/query/resources/useQuery' -import { useQueryResource } from '@/query/useQueryResource' import sessionStore from '@/stores/sessionStore' import { areDeeplyEqual, safeJSONParse } from '@/utils' import { createToast } from '@/utils/toasts' @@ -45,9 +44,7 @@ export default function useDashboard(name) { state.itemLayouts = state.doc.items.map(makeLayoutObject) state.isOwner = state.doc.owner == session.user.user_id state.canShare = state.isOwner || session.user.is_admin - resource.is_private.fetch().then((res) => { - state.isPrivate = res.message - }) + resource.is_private.fetch().then((res) => (state.isPrivate = res)) state.loading = false } reload() @@ -186,13 +183,11 @@ export default function useDashboard(name) { throw new Error(`Query not found for item ${itemId}`) } const filters = await getChartFilters(itemId) - return resource.fetch_chart_data - .submit({ - item_id: itemId, - query_name: queryName, - filters, - }) - .then((res) => res.message) + return resource.fetch_chart_data.submit({ + item_id: itemId, + query_name: queryName, + filters, + }) } function refreshFilter(filter_id) { diff --git a/frontend/src/datasource/DataSource.vue b/frontend/src/datasource/DataSource.vue index 11e233769..7697bfcba 100644 --- a/frontend/src/datasource/DataSource.vue +++ b/frontend/src/datasource/DataSource.vue @@ -9,18 +9,17 @@ /> - - - - - - - + }), + emptyState: { + title: 'No tables.', + description: 'No tables to display.', + button: { + label: 'Sync Tables', + variant: 'solid', + onClick: syncTables, + }, + }, + }" + > + + import IndicatorIcon from '@/components/Icons/IndicatorIcon.vue' -import ListView from '@/components/ListView.vue' import PageBreadcrumbs from '@/components/PageBreadcrumbs.vue' -import { ListRow, ListRowItem } from 'frappe-ui' +import { ListView } from 'frappe-ui' +import { SearchIcon } from 'lucide-vue-next' import { computed, inject, provide, ref, watchEffect } from 'vue' import { useRouter } from 'vue-router' import useDataSource from './useDataSource' @@ -100,15 +98,13 @@ provide('dataSource', dataSource) dataSource.fetchTables() const searchQuery = ref('') -const filteredList = computed(() => { - if (!searchQuery.value) { - return dataSource.tableList.filter((table) => !table.is_query_based) - } - return dataSource.tableList.filter( - (table) => - !table.is_query_based && - table.label.toLowerCase().includes(searchQuery.value.toLowerCase()) - ) +const filteredTableList = computed(() => { + const tableList = dataSource.tableList.filter((t) => !t.is_query_based) + if (!tableList.length) return [] + if (!searchQuery.value) return tableList + return tableList.filter((table) => { + return table.label.toLowerCase().includes(searchQuery.value.toLowerCase()) + }) }) const showDeleteDialog = ref(false) @@ -140,4 +136,17 @@ watchEffect(() => { document.title = `${title} - Frappe Insights` } }) + +const tableListColumns = [ + { label: 'Table', key: 'label' }, + { + label: 'Status', + key: 'status', + getLabel: ({ row }) => (row.hidden ? 'Disabled' : 'Enabled'), + prefix: ({ row }) => { + const color = row.hidden ? 'text-gray-500' : 'text-green-500' + return + }, + }, +] diff --git a/frontend/src/datasource/DataSourceList.vue b/frontend/src/datasource/DataSourceList.vue index 1878594ba..cb20639f5 100644 --- a/frontend/src/datasource/DataSourceList.vue +++ b/frontend/src/datasource/DataSourceList.vue @@ -9,49 +9,38 @@ - - - - - + }), + emptyState: { + title: 'No Data Sources.', + description: 'No data sources to display.', + button: { + label: 'New Data Source', + variant: 'solid', + onClick: () => (new_dialog = true), + }, + }, + }" + > + + import IndicatorIcon from '@/components/Icons/IndicatorIcon.vue' -import ListView from '@/components/ListView.vue' import NewDialogWithTypes from '@/components/NewDialogWithTypes.vue' import PageBreadcrumbs from '@/components/PageBreadcrumbs.vue' import ConnectMariaDBDialog from '@/datasource/ConnectMariaDBDialog.vue' @@ -74,9 +62,9 @@ import ConnectPostgreDBDialog from '@/datasource/ConnectPostgreDBDialog.vue' import UploadCSVFileDialog from '@/datasource/UploadCSVFileDialog.vue' import useDataSourceStore from '@/stores/dataSourceStore' import { updateDocumentTitle } from '@/utils' -import { ListRow, ListRowItem } from 'frappe-ui' -import { PlusIcon } from 'lucide-vue-next' -import { ref } from 'vue' +import { ListView } from 'frappe-ui' +import { PlusIcon, SearchIcon } from 'lucide-vue-next' +import { ref, computed } from 'vue' import { useRoute, useRouter } from 'vue-router' const new_dialog = ref(false) @@ -87,11 +75,15 @@ if (route.hash == '#new') { } const sources = useDataSourceStore() - -const StatusCell = (props) => ( - {props.row.status} -) -const columns = [] +const searchQuery = ref('') +const filteredSourceList = computed(() => { + if (searchQuery.value) { + return sources.list.filter((source) => { + return source.title.toLowerCase().includes(searchQuery.value.toLowerCase()) + }) + } + return sources.list +}) const router = useRouter() const showConnectMariaDBDialog = ref(false) @@ -127,6 +119,20 @@ const databaseTypes = ref([ }, ]) +const dataSourceListColumns = [ + { label: 'Title', key: 'title' }, + { + label: 'Status', + key: 'status', + prefix: ({ row }) => { + const color = row.status == 'Inactive' ? 'text-gray-500' : 'text-green-500' + return + }, + }, + { label: 'Database Type', key: 'database_type' }, + { label: 'Created', key: 'created_from_now' }, +] + const pageMeta = ref({ title: 'Data Sources' }) updateDocumentTitle(pageMeta) diff --git a/frontend/src/datasource/useDataSource.ts b/frontend/src/datasource/useDataSource.ts index e57c6441e..109f47371 100644 --- a/frontend/src/datasource/useDataSource.ts +++ b/frontend/src/datasource/useDataSource.ts @@ -24,8 +24,8 @@ function useDataSource(name: string) { async function fetchTables() { const promises = [resource.get_tables.submit(), resource.get_queries.submit()] const responses = await Promise.all(promises) - tableList.value = responses[0].message - queryList.value = responses[1].message + tableList.value = responses[0] + queryList.value = responses[1] dropdownOptions.value = makeDropdownOptions() groupedTableOptions.value = makeGroupedTableOptions() return tableList.value diff --git a/frontend/src/datasource/useDataSourceTable.ts b/frontend/src/datasource/useDataSourceTable.ts index bdf67ca51..fb7500ebf 100644 --- a/frontend/src/datasource/useDataSourceTable.ts +++ b/frontend/src/datasource/useDataSourceTable.ts @@ -44,7 +44,7 @@ async function useDataSourceTable(params: GetTableParams) { const table: DataSourceTable = reactive({ doc, columns, - rows: computed(() => resource.getPreview.data?.message), + rows: computed(() => resource.getPreview.data), loading: resource.loading, syncing: resource.syncTable.loading, sync: () => resource.syncTable.submit(), diff --git a/frontend/src/notebook/Notebook.vue b/frontend/src/notebook/Notebook.vue index db5edcd12..34601b554 100644 --- a/frontend/src/notebook/Notebook.vue +++ b/frontend/src/notebook/Notebook.vue @@ -1,11 +1,10 @@