Merge pull request #1674 from pateljannat/issues-126
fix: video statistics scroll and time format
This commit is contained in:
@@ -23,7 +23,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="currentTab" class="mt-4">
|
<div v-if="currentTab" class="mt-4">
|
||||||
<div class="grid grid-cols-[55%,40%] gap-5">
|
<div class="grid grid-cols-[55%,40%] gap-5">
|
||||||
<div class="space-y-5 border rounded-md p-2 pt-4">
|
<div
|
||||||
|
class="space-y-5 border rounded-md p-2 pt-4 h-[70vh] overflow-y-auto"
|
||||||
|
>
|
||||||
<div class="grid grid-cols-[70%,30%] text-sm text-ink-gray-5">
|
<div class="grid grid-cols-[70%,30%] text-sm text-ink-gray-5">
|
||||||
<div class="px-4">
|
<div class="px-4">
|
||||||
{{ __('Member') }}
|
{{ __('Member') }}
|
||||||
@@ -59,7 +61,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center text-sm">
|
<div class="text-center text-sm">
|
||||||
{{ convertToMinutes(row.watch_time) }}
|
{{ formatTimestamp(row.watch_time) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -69,7 +71,7 @@
|
|||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{
|
:config="{
|
||||||
title: __('Average Watch Time (minutes)'),
|
title: __('Average Watch Time'),
|
||||||
value: averageWatchTime,
|
value: averageWatchTime,
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
@@ -97,7 +99,7 @@ import {
|
|||||||
TabButtons,
|
TabButtons,
|
||||||
} from 'frappe-ui'
|
} from 'frappe-ui'
|
||||||
import { computed, ref, watch } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { enablePlyr, convertToMinutes } from '@/utils'
|
import { enablePlyr, formatTimestamp } from '@/utils'
|
||||||
import VideoBlock from '@/components/VideoBlock.vue'
|
import VideoBlock from '@/components/VideoBlock.vue'
|
||||||
|
|
||||||
const show = defineModel<boolean | undefined>()
|
const show = defineModel<boolean | undefined>()
|
||||||
@@ -185,7 +187,7 @@ const averageWatchTime = computed(() => {
|
|||||||
totalWatchTime += parseFloat(item.watch_time)
|
totalWatchTime += parseFloat(item.watch_time)
|
||||||
})
|
})
|
||||||
|
|
||||||
return convertToMinutes(totalWatchTime / currentTabData.value.length)
|
return formatTimestamp(totalWatchTime / currentTabData.value.length)
|
||||||
})
|
})
|
||||||
|
|
||||||
const currentTabData = computed(() => {
|
const currentTabData = computed(() => {
|
||||||
|
|||||||
@@ -663,13 +663,8 @@ export const updateMetaInfo = (type, route, meta) => {
|
|||||||
|
|
||||||
export const formatTimestamp = (seconds) => {
|
export const formatTimestamp = (seconds) => {
|
||||||
const date = new Date(seconds * 1000)
|
const date = new Date(seconds * 1000)
|
||||||
|
const hours = String(date.getUTCHours()).padStart(2, '0')
|
||||||
const minutes = String(date.getUTCMinutes()).padStart(2, '0')
|
const minutes = String(date.getUTCMinutes()).padStart(2, '0')
|
||||||
const secs = String(date.getUTCSeconds()).padStart(2, '0')
|
const secs = String(date.getUTCSeconds()).padStart(2, '0')
|
||||||
return `${minutes}:${secs}`
|
return `${hours}:${minutes}:${secs}`
|
||||||
}
|
|
||||||
|
|
||||||
export const convertToMinutes = (seconds) => {
|
|
||||||
const minutes = Math.floor(seconds / 60)
|
|
||||||
const remainingSeconds = Math.round(seconds % 60)
|
|
||||||
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"fieldname": "lesson",
|
"fieldname": "lesson",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 1,
|
||||||
"label": "Lesson",
|
"label": "Lesson",
|
||||||
"options": "Course Lesson",
|
"options": "Course Lesson",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
@@ -39,6 +40,7 @@
|
|||||||
"fetch_from": "lesson.course",
|
"fetch_from": "lesson.course",
|
||||||
"fieldname": "course",
|
"fieldname": "course",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
|
"in_standard_filter": 1,
|
||||||
"label": "Course",
|
"label": "Course",
|
||||||
"options": "LMS Course",
|
"options": "LMS Course",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
@@ -51,6 +53,7 @@
|
|||||||
"fieldname": "member",
|
"fieldname": "member",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
|
"in_standard_filter": 1,
|
||||||
"label": "Member",
|
"label": "Member",
|
||||||
"options": "User",
|
"options": "User",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
@@ -99,7 +102,7 @@
|
|||||||
"grid_page_length": 50,
|
"grid_page_length": 50,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2025-06-30 16:57:10.561660",
|
"modified": "2025-07-30 14:38:52.555010",
|
||||||
"modified_by": "sayali@frappe.io",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Video Watch Duration",
|
"name": "LMS Video Watch Duration",
|
||||||
|
|||||||
Reference in New Issue
Block a user