snapshot of https://github.com/frappe/crm.git (develop, 2026-09-18; blobs > 131072B omitted)
Some checks failed
Frontend / Unit Tests & Coverage (push) Has been skipped
Regenerate POT file (translatable strings) / Regenerate POT file (develop) (push) Failing after 1m13s
Regenerate POT file (translatable strings) / Regenerate POT file (main-hotfix) (push) Failing after 6s
Server / Tests (frappe ${{ matrix.frappe-branch }}) (push) Has been skipped
Server / Resolve frappe matrix (push) Failing after 1s
Frontend / Lint (push) Failing after 1s
Frontend / Production Build (push) Failing after 1s
Server / Coverage Wrap Up (push) Has been skipped
Frontend / Coverage Wrap Up (push) Has been skipped
Some checks failed
Frontend / Unit Tests & Coverage (push) Has been skipped
Regenerate POT file (translatable strings) / Regenerate POT file (develop) (push) Failing after 1m13s
Regenerate POT file (translatable strings) / Regenerate POT file (main-hotfix) (push) Failing after 6s
Server / Tests (frappe ${{ matrix.frappe-branch }}) (push) Has been skipped
Server / Resolve frappe matrix (push) Failing after 1s
Frontend / Lint (push) Failing after 1s
Frontend / Production Build (push) Failing after 1s
Server / Coverage Wrap Up (push) Has been skipped
Frontend / Coverage Wrap Up (push) Has been skipped
This commit is contained in:
82
frontend/src/components/CountUpTimer.vue
Normal file
82
frontend/src/components/CountUpTimer.vue
Normal file
@@ -0,0 +1,82 @@
|
||||
<template>
|
||||
<slot />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const hours = ref(0)
|
||||
const minutes = ref(0)
|
||||
const seconds = ref(0)
|
||||
const timer = ref(null)
|
||||
const updatedTime = ref('0:00')
|
||||
|
||||
function startCounter() {
|
||||
updatedTime.value = getTime()
|
||||
}
|
||||
|
||||
function start() {
|
||||
timer.value = setInterval(() => startCounter(), 1000)
|
||||
}
|
||||
|
||||
function stop() {
|
||||
clearInterval(timer.value)
|
||||
let output = updatedTime.value
|
||||
hours.value = 0
|
||||
minutes.value = 0
|
||||
seconds.value = 0
|
||||
updatedTime.value = '0:00'
|
||||
return output
|
||||
}
|
||||
|
||||
function getTime(_seconds = 0) {
|
||||
if (_seconds) {
|
||||
if (typeof _seconds === 'string') {
|
||||
_seconds = parseInt(_seconds)
|
||||
}
|
||||
seconds.value = _seconds
|
||||
|
||||
if (seconds.value >= 60) {
|
||||
minutes.value = Math.floor(seconds.value / 60)
|
||||
seconds.value = seconds.value % 60
|
||||
} else {
|
||||
minutes.value = 0
|
||||
}
|
||||
|
||||
if (minutes.value >= 60) {
|
||||
hours.value = Math.floor(minutes.value / 60)
|
||||
minutes.value = minutes.value % 60
|
||||
} else {
|
||||
hours.value = 0
|
||||
}
|
||||
}
|
||||
|
||||
if (seconds.value === 59) {
|
||||
seconds.value = 0
|
||||
minutes.value = minutes.value + 1
|
||||
seconds.value--
|
||||
}
|
||||
if (minutes.value === 60) {
|
||||
minutes.value = 0
|
||||
hours.value = hours.value + 1
|
||||
}
|
||||
seconds.value++
|
||||
|
||||
let minutesCount = minutes.value
|
||||
let secondsCount = seconds.value < 10 ? '0' + seconds.value : seconds.value
|
||||
let hoursCount = hours.value > 0 ? hours.value + ':' : ''
|
||||
|
||||
if (hoursCount) {
|
||||
minutesCount = minutesCount < 10 ? '0' + minutesCount : minutesCount
|
||||
secondsCount = secondsCount < 10 ? '0' + secondsCount : secondsCount
|
||||
|
||||
if (minutesCount === 0) {
|
||||
minutesCount = '00'
|
||||
}
|
||||
}
|
||||
|
||||
return hoursCount + minutesCount + ':' + secondsCount
|
||||
}
|
||||
|
||||
defineExpose({ start, stop, getTime, updatedTime })
|
||||
</script>
|
||||
Reference in New Issue
Block a user