Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d1f5124
feat: add support for checking pending query results and handling que…
shahzeelahmed Feb 5, 2026
9b0ed8a
feat: redlock with semaphore
shahzeelahmed Feb 5, 2026
ab631b4
feat: enhance query execution with polling and improved status handling
shahzeelahmed Feb 5, 2026
6d38811
fix: disable locking in ibis query execution for data source table
shahzeelahmed Feb 5, 2026
81fad5d
test: add comprehensive unit tests for query locking and semaphore fu…
shahzeelahmed Feb 5, 2026
09645c9
Merge remote-tracking branch 'upstream' into redlock
shahzeelahmed Feb 5, 2026
d76ba4e
fix: `ValueError` not enough values to unpack (expected 2, got 1)
shahzeelahmed Feb 5, 2026
d3596cd
fix: `KeyError` while retrieving cached results
shahzeelahmed Feb 6, 2026
b006c91
refactor: comment out toast notification for ongoing query execution
shahzeelahmed Feb 9, 2026
6593348
feat: add query hashes for Insights Query v3
shahzeelahmed Feb 9, 2026
9d0b780
feat: logging for locks
shahzeelahmed Feb 9, 2026
00095c2
feat: add logging to locks
shahzeelahmed Feb 9, 2026
fafdc7c
feat: query_hash field for tracking changes in a query
shahzeelahmed Feb 9, 2026
175b9ac
fix: make polling async and increase retry count
shahzeelahmed Feb 15, 2026
9cf210a
feat: add max concurrent queries setting
shahzeelahmed Feb 15, 2026
7e76d0b
feat: use semaphore count based on max concurrent queries setting
shahzeelahmed Feb 15, 2026
6950c07
chore: lock section
shahzeelahmed Feb 15, 2026
34e9434
fix: typo and import new constant
shahzeelahmed Feb 17, 2026
34ae12e
chore: remove lock log doctype
shahzeelahmed Mar 1, 2026
be2b552
chore: remove lock logs
shahzeelahmed Mar 1, 2026
afd874c
fix: get `socketio_port` from site config
shahzeelahmed Mar 1, 2026
82d2edb
fix: use make_keys to create keys
shahzeelahmed Mar 3, 2026
ae3f242
fix: dont acquire lock on execption
shahzeelahmed Mar 3, 2026
83e1f5b
feat: dashboard level lock using publish_realtime
shahzeelahmed Mar 3, 2026
a5f8af1
fix: use socket instead of polling
shahzeelahmed Mar 3, 2026
f146f14
fix: get socketio_port from window
shahzeelahmed Mar 3, 2026
3a8c795
Merge branch 'develop' into redlock
shahzeelahmed Mar 6, 2026
d379f68
feat: query_hash field for tracking changes in a query
shahzeelahmed Feb 9, 2026
f791558
chore: formatting
shahzeelahmed Mar 6, 2026
290bef7
chore: remove `query_hash`
shahzeelahmed Mar 6, 2026
4459014
chore: merge develop
nextchamp-saqib Mar 29, 2026
1b8a35a
refactor: wip
nextchamp-saqib Mar 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions frontend/src2/dashboard/Dashboard.vue
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<script setup lang="ts">
import { useStorage } from '@vueuse/core'
import { Breadcrumbs, call } from 'frappe-ui'
import { RefreshCcw } from 'lucide-vue-next'
import { computed, provide, ref } from 'vue'
import { onBeforeUnmount, provide, ref } from 'vue'
import { useRouter } from 'vue-router'
import { downloadImage, waitUntil, wheneverChanges } from '../helpers'
import useDashboard from './dashboard'
import { downloadImage, waitUntil } from '../helpers'
import { __ } from '../translation'
import useDashboard from './dashboard'
import DashboardItem from './DashboardItem.vue'
import VueGridLayout from './VueGridLayout.vue'
import { useStorage } from '@vueuse/core'

const props = defineProps<{ name: string }>()

Expand All @@ -20,6 +20,11 @@ const dashboard = useDashboard(dashboard_name)
provide('dashboard', dashboard)
dashboard.refresh()

// avoid listening if user navigates to another dashboard room
onBeforeUnmount(() => {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be done in DashboardBuilder too?

dashboard.unsubscribeFromDashboardRoom()
})

const router = useRouter()
function openWorkbook() {
router.push(`/workbook/${dashboard.doc.workbook}`)
Expand Down
55 changes: 43 additions & 12 deletions frontend/src2/dashboard/dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
wheneverChanges,
} from '../helpers'
import useDocumentResource from '../helpers/resource'
import { getSocket } from '../socket'
import { isFilterValid } from '../query/components/filter_utils'
import { column, filter_group } from '../query/helpers'
import session from '../session'
Expand Down Expand Up @@ -51,16 +52,13 @@ function makeDashboard(name: string) {
return editing.value && editingItemIndex.value === dashboard.doc.items.indexOf(item)
}


const filters = ref<Record<string, FilterArgs[]>>({})
const filterStates = ref<Record<string, FilterState>>({})

function addChart(charts: WorkbookChart[]) {
const maxY = getMaxY()
charts.forEach((chart) => {
if (
!dashboard.doc.items.some((item) => item.type === 'chart' && item.chart === chart.name)
) {
if (!dashboard.doc.items.some((item) => item.type === 'chart' && item.chart === chart.name)) {
dashboard.doc.items.push({
type: 'chart',
chart: chart.name,
Expand Down Expand Up @@ -122,9 +120,7 @@ function makeDashboard(name: string) {

function positionNewFilter(newFilter: WorkbookDashboardItem) {
const items = dashboard.doc.items
const existingFilters = items.filter(
(item) => item.type === 'filter' && item !== newFilter
)
const existingFilters = items.filter((item) => item.type === 'filter' && item !== newFilter)

if (existingFilters.length === 0) {
newFilter.layout.x = 0
Expand Down Expand Up @@ -205,6 +201,22 @@ function makeDashboard(name: string) {
})
}

function subscribeToDashboardRoom() {
const socket = getSocket()

socket.emit('doc_subscribe', 'Insights Dashboard v3', name)
socket.on('connect', () => {
socket.emit('doc_subscribe', 'Insights Dashboard v3', name)
})
}

function unsubscribeFromDashboardRoom() {
const socket = getSocket()
socket.emit('doc_unsubscribe', 'Insights Dashboard v3', name)
}

subscribeToDashboardRoom()

function refresh(force = false) {
dashboard.doc.items
.filter((item) => item.type === 'chart')
Expand All @@ -214,6 +226,7 @@ function makeDashboard(name: string) {
function refreshChart(chart_name: string, force = false) {
const chart = useChart(chart_name)
chart.dataQuery.adhocFilters = getAdhocFilters(chart_name)
chart.dataQuery.dashboardName = name
chart.refresh(force)
}

Expand Down Expand Up @@ -336,6 +349,20 @@ function makeDashboard(name: string) {
.then(() => dashboard.load())
}

const defaultFilters = dashboard.doc.items.reduce((acc, item) => {
if (item.type != 'filter') return acc

const filterItem = item as WorkbookDashboardFilter
if (filterItem.default_operator && filterItem.default_value) {
acc[filterItem.filter_name] = {
operator: filterItem.default_operator,
value: filterItem.default_value,
}
}
return acc
}, {} as typeof filterStates.value)

Object.assign(filterStates.value, defaultFilters)

const key = `insights:dashboard-filter-states-${name}`
filterStates.value = store(key, () => filterStates.value)
Expand Down Expand Up @@ -399,6 +426,7 @@ function makeDashboard(name: string) {
updateAccess,

getShareLink,
unsubscribeFromDashboardRoom,
})
}

Expand Down Expand Up @@ -431,13 +459,16 @@ function getDashboardResource(name: string) {
},
})
if (session.isLoggedIn) {
dashboard.onAfterLoad(() => dashboard.call('track_view').catch(() => { }))
dashboard.onAfterLoad(() => dashboard.call('track_view').catch(() => {}))
}
wheneverChanges(() => dashboard.doc.read_only, () => {
if (dashboard.doc.read_only) {
dashboard.autoSave = false
wheneverChanges(
() => dashboard.doc.read_only,
() => {
if (dashboard.doc.read_only) {
dashboard.autoSave = false
}
}
})
)
return dashboard
}

Expand Down
Loading
Loading