2020-07-28 23:09:34 +05:30
|
|
|
<script>
|
|
|
|
import {
|
|
|
|
GlButtonGroup,
|
|
|
|
GlButton,
|
2020-11-24 15:15:51 +05:30
|
|
|
GlDropdown,
|
|
|
|
GlDropdownItem,
|
|
|
|
GlDropdownDivider,
|
2020-07-28 23:09:34 +05:30
|
|
|
GlTooltipDirective,
|
|
|
|
} from '@gitlab/ui';
|
2021-03-11 19:13:27 +05:30
|
|
|
import Visibility from 'visibilityjs';
|
|
|
|
import { mapActions } from 'vuex';
|
2021-04-29 21:17:54 +05:30
|
|
|
import { n__, __, s__ } from '~/locale';
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2020-07-28 23:09:34 +05:30
|
|
|
const makeInterval = (length = 0, unit = 's') => {
|
|
|
|
const shortLabel = `${length}${unit}`;
|
|
|
|
switch (unit) {
|
|
|
|
case 'd':
|
|
|
|
return {
|
|
|
|
interval: length * 24 * 60 * 60 * 1000,
|
|
|
|
shortLabel,
|
|
|
|
label: n__('%d day', '%d days', length),
|
|
|
|
};
|
|
|
|
case 'h':
|
|
|
|
return {
|
|
|
|
interval: length * 60 * 60 * 1000,
|
|
|
|
shortLabel,
|
|
|
|
label: n__('%d hour', '%d hours', length),
|
|
|
|
};
|
|
|
|
case 'm':
|
|
|
|
return {
|
|
|
|
interval: length * 60 * 1000,
|
|
|
|
shortLabel,
|
|
|
|
label: n__('%d minute', '%d minutes', length),
|
|
|
|
};
|
|
|
|
case 's':
|
|
|
|
default:
|
|
|
|
return {
|
|
|
|
interval: length * 1000,
|
|
|
|
shortLabel,
|
|
|
|
label: n__('%d second', '%d seconds', length),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
export default {
|
2021-04-29 21:17:54 +05:30
|
|
|
i18n: {
|
|
|
|
refreshDashboard: s__('Metrics|Refresh dashboard'),
|
|
|
|
},
|
2020-07-28 23:09:34 +05:30
|
|
|
components: {
|
|
|
|
GlButtonGroup,
|
|
|
|
GlButton,
|
2020-11-24 15:15:51 +05:30
|
|
|
GlDropdown,
|
|
|
|
GlDropdownItem,
|
|
|
|
GlDropdownDivider,
|
2020-07-28 23:09:34 +05:30
|
|
|
},
|
|
|
|
directives: {
|
|
|
|
GlTooltip: GlTooltipDirective,
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
refreshInterval: null,
|
|
|
|
timeoutId: null,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
dropdownText() {
|
|
|
|
return this.refreshInterval?.shortLabel ?? __('Off');
|
|
|
|
},
|
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
refreshInterval() {
|
|
|
|
if (this.refreshInterval !== null) {
|
|
|
|
this.startAutoRefresh();
|
|
|
|
} else {
|
|
|
|
this.stopAutoRefresh();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
destroyed() {
|
|
|
|
this.stopAutoRefresh();
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
...mapActions('monitoringDashboard', ['fetchDashboardData']),
|
|
|
|
|
|
|
|
refresh() {
|
|
|
|
this.fetchDashboardData();
|
|
|
|
},
|
|
|
|
startAutoRefresh() {
|
|
|
|
const schedule = () => {
|
|
|
|
if (this.refreshInterval) {
|
|
|
|
this.timeoutId = setTimeout(this.startAutoRefresh, this.refreshInterval.interval);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
this.stopAutoRefresh();
|
2020-10-24 23:57:45 +05:30
|
|
|
|
|
|
|
if (Visibility.hidden()) {
|
2020-07-28 23:09:34 +05:30
|
|
|
// Inactive tab? Skip fetch and schedule again
|
|
|
|
schedule();
|
|
|
|
} else {
|
|
|
|
// Active tab! Fetch data and then schedule when settled
|
|
|
|
// eslint-disable-next-line promise/catch-or-return
|
|
|
|
this.fetchDashboardData().finally(schedule);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
stopAutoRefresh() {
|
|
|
|
clearTimeout(this.timeoutId);
|
|
|
|
this.timeoutId = null;
|
|
|
|
},
|
|
|
|
|
|
|
|
setRefreshInterval(option) {
|
|
|
|
this.refreshInterval = option;
|
|
|
|
},
|
|
|
|
removeRefreshInterval() {
|
|
|
|
this.refreshInterval = null;
|
|
|
|
},
|
|
|
|
isChecked(option) {
|
|
|
|
if (this.refreshInterval) {
|
|
|
|
return option.interval === this.refreshInterval.interval;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
refreshIntervals: [
|
|
|
|
makeInterval(5),
|
|
|
|
makeInterval(10),
|
|
|
|
makeInterval(30),
|
|
|
|
makeInterval(5, 'm'),
|
|
|
|
makeInterval(30, 'm'),
|
|
|
|
makeInterval(1, 'h'),
|
|
|
|
makeInterval(2, 'h'),
|
|
|
|
makeInterval(12, 'h'),
|
|
|
|
makeInterval(1, 'd'),
|
|
|
|
],
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<gl-button-group>
|
|
|
|
<gl-button
|
|
|
|
v-gl-tooltip
|
|
|
|
class="gl-flex-grow-1"
|
|
|
|
variant="default"
|
2021-04-29 21:17:54 +05:30
|
|
|
:title="$options.i18n.refreshDashboard"
|
|
|
|
:aria-label="$options.i18n.refreshDashboard"
|
2020-07-28 23:09:34 +05:30
|
|
|
icon="retry"
|
|
|
|
@click="refresh"
|
|
|
|
/>
|
2023-03-04 22:38:38 +05:30
|
|
|
<gl-dropdown v-gl-tooltip :title="s__('Metrics|Set refresh rate')" :text="dropdownText">
|
2020-11-24 15:15:51 +05:30
|
|
|
<gl-dropdown-item
|
2022-10-11 01:57:18 +05:30
|
|
|
is-check-item
|
2020-07-28 23:09:34 +05:30
|
|
|
:is-checked="refreshInterval === null"
|
|
|
|
@click="removeRefreshInterval()"
|
2020-11-24 15:15:51 +05:30
|
|
|
>{{ __('Off') }}</gl-dropdown-item
|
2020-07-28 23:09:34 +05:30
|
|
|
>
|
2020-11-24 15:15:51 +05:30
|
|
|
<gl-dropdown-divider />
|
|
|
|
<gl-dropdown-item
|
2020-07-28 23:09:34 +05:30
|
|
|
v-for="(option, i) in $options.refreshIntervals"
|
|
|
|
:key="i"
|
2022-10-11 01:57:18 +05:30
|
|
|
is-check-item
|
2020-07-28 23:09:34 +05:30
|
|
|
:is-checked="isChecked(option)"
|
|
|
|
@click="setRefreshInterval(option)"
|
2020-11-24 15:15:51 +05:30
|
|
|
>{{ option.label }}</gl-dropdown-item
|
2020-07-28 23:09:34 +05:30
|
|
|
>
|
2020-11-24 15:15:51 +05:30
|
|
|
</gl-dropdown>
|
2020-07-28 23:09:34 +05:30
|
|
|
</gl-button-group>
|
|
|
|
</template>
|