mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 00:09:35 +00:00
#5463 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes - **New Features** - Enhanced auto-refresh interval configuration across multiple components. - Added minimum refresh interval support with configurable restrictions. - Introduced new error handling and validation mechanisms for report creation. - Added new utility functions for validating frequency intervals. - **Improvements** - Introduced dynamic minimum refresh interval settings. - Added user feedback mechanisms for refresh interval constraints. - Improved error handling for alert creation and updates. - Enhanced clarity and maintainability of code through formatting adjustments. - Updated frequency input logic to dynamically calculate minimum values. - Added validation for refresh intervals during data refresh and URL query restoration. - **Configuration** - Added new props for minimum refresh interval and related messages. - Implemented dynamic minimum value calculations for frequency inputs. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
259 lines
6.9 KiB
Vue
259 lines
6.9 KiB
Vue
<!-- Copyright 2023 OpenObserve Inc.
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
-->
|
|
|
|
<template>
|
|
<div class="q-pl-sm float-left">
|
|
<q-btn-dropdown
|
|
data-test="logs-search-bar-refresh-interval-btn-dropdown"
|
|
v-model="btnRefreshInterval"
|
|
border
|
|
no-caps
|
|
class="q-pa-xs refresh-interval-dropdown"
|
|
content-style="z-index: 10001"
|
|
>
|
|
<template v-slot:label>
|
|
<div class="row items-center no-wrap">
|
|
<q-icon left name="update" />
|
|
<div class="text-center">{{ selectedLabel }}</div>
|
|
</div>
|
|
</template>
|
|
<div class="row">
|
|
<div class="col col-12 q-pa-sm" style="text-align: center">
|
|
<q-btn
|
|
data-test="logs-search-off-refresh-interval"
|
|
no-caps
|
|
:flat="modelValue.toString() !== '0'"
|
|
size="md"
|
|
:class="
|
|
'no-border full-width ' +
|
|
(modelValue.toString() === '0' ? 'selected' : '')
|
|
"
|
|
v-close-popup="true"
|
|
@click="onItemClick({ label: 'Off', value: 0 })"
|
|
>
|
|
Off
|
|
</q-btn>
|
|
</div>
|
|
</div>
|
|
<q-separator />
|
|
<div v-for="(items, i) in refreshTimes" :key="'row_' + i" class="row">
|
|
<div
|
|
v-for="(item, j) in items"
|
|
:key="'col_' + i + '_' + j"
|
|
class="col col-4 q-pa-sm"
|
|
style="text-align: center"
|
|
>
|
|
<q-btn
|
|
:data-test="`logs-search-bar-refresh-time-${item.value}`"
|
|
no-caps
|
|
:flat="Number(modelValue) !== item.value"
|
|
size="md"
|
|
:class="[
|
|
'no-border ' +
|
|
(Number(modelValue) === item.value ? 'selected' : ''),
|
|
]"
|
|
@click="onItemClick(item)"
|
|
v-close-popup="true"
|
|
:disable="item.disabled"
|
|
>
|
|
<q-tooltip
|
|
v-if="item.disabled"
|
|
style="z-index: 10001; font-size: 14px"
|
|
anchor="center right"
|
|
self="center left"
|
|
max-width="300px"
|
|
>
|
|
{{ minRangeRestrictionMessageVal }}
|
|
</q-tooltip>
|
|
{{ item.label }}
|
|
</q-btn>
|
|
</div>
|
|
</div>
|
|
</q-btn-dropdown>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import {
|
|
defineComponent,
|
|
ref,
|
|
computed,
|
|
watch,
|
|
onActivated,
|
|
onDeactivated,
|
|
onMounted,
|
|
} from "vue";
|
|
import { useI18n } from "vue-i18n";
|
|
import { useRouter } from "vue-router";
|
|
import { useQuasar } from "quasar";
|
|
import { generateDurationLabel } from "../utils/date";
|
|
|
|
export default defineComponent({
|
|
name: "AutoRefreshInterval",
|
|
props: {
|
|
modelValue: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
trigger: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
minRangeRestrictionMessage: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
minRefreshInterval: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
},
|
|
emits: ["update:modelValue", "trigger"],
|
|
setup(props: any, { emit }) {
|
|
const router = useRouter();
|
|
const { t } = useI18n();
|
|
const $q = useQuasar();
|
|
|
|
const btnRefreshInterval = ref(false);
|
|
let intervalInstance = 0;
|
|
|
|
const refreshTimes = [
|
|
[
|
|
{ label: "5 sec", value: 5, disabled: false },
|
|
{ label: "1 min", value: 60, disabled: false },
|
|
{ label: "1 hr", value: 3600, disabled: false },
|
|
],
|
|
[
|
|
{ label: "10 sec", value: 10, disabled: false },
|
|
{ label: "5 min", value: 300, disabled: false },
|
|
{ label: "2 hr", value: 7200, disabled: false },
|
|
],
|
|
[
|
|
{ label: "15 sec", value: 15, disabled: false },
|
|
{ label: "15 min", value: 900, disabled: false },
|
|
{ label: "1 day", value: 86400, disabled: false },
|
|
],
|
|
[
|
|
{ label: "30 sec", value: 30, disabled: false },
|
|
{ label: "30 min", value: 1800, disabled: false },
|
|
],
|
|
];
|
|
|
|
// v-model computed value
|
|
const selectedValue = computed({
|
|
get() {
|
|
return props.modelValue;
|
|
},
|
|
set(value) {
|
|
if (isDisabled(value)) {
|
|
emit("update:modelValue", 0);
|
|
}
|
|
|
|
emit("update:modelValue", Number(value));
|
|
},
|
|
});
|
|
|
|
// computed label based on the selected value
|
|
const selectedLabel = computed(
|
|
() =>
|
|
refreshTimes.flat().find((it: any) => it.value == selectedValue.value)
|
|
?.label || generateDurationLabel(selectedValue.value),
|
|
);
|
|
|
|
// update model when the selection has changed
|
|
const onItemClick = (item: any) => {
|
|
selectedValue.value = item.value;
|
|
};
|
|
|
|
// watch on the selected value and update the timers
|
|
watch(selectedValue, () => {
|
|
resetTimers();
|
|
});
|
|
|
|
const resetTimers = () => {
|
|
// first reset the current interval callback
|
|
clearInterval(intervalInstance);
|
|
|
|
// return if the interval value is zero
|
|
if (selectedValue.value == 0 || !props.trigger) {
|
|
return;
|
|
}
|
|
|
|
// if we have the value, continue and set the interval
|
|
intervalInstance = window?.setInterval(() => {
|
|
emit("trigger");
|
|
}, selectedValue.value * 1000);
|
|
};
|
|
|
|
const minRangeRestrictionMessageVal = ref("");
|
|
|
|
watch(
|
|
() => props.minRefreshInterval,
|
|
() => {
|
|
updateDisabledFlags();
|
|
},
|
|
);
|
|
|
|
const isDisabled = (value: number) => {
|
|
return value < props.minRefreshInterval;
|
|
};
|
|
|
|
const updateDisabledFlags = () => {
|
|
refreshTimes.forEach((row) => {
|
|
row.forEach((item) => {
|
|
item.disabled = isDisabled(item.value);
|
|
});
|
|
});
|
|
minRangeRestrictionMessageVal.value = `The minimum refresh interval is ${props.minRefreshInterval} seconds. Please adjust the minimum refresh interval accordingly.`;
|
|
};
|
|
|
|
onMounted(() => {
|
|
// Initialize the disabled flags on component mount
|
|
updateDisabledFlags();
|
|
});
|
|
|
|
// on component mount and unmount, update the intervals
|
|
onActivated(() => {
|
|
resetTimers();
|
|
});
|
|
|
|
onDeactivated(() => {
|
|
clearInterval(intervalInstance);
|
|
});
|
|
|
|
return {
|
|
t,
|
|
router,
|
|
btnRefreshInterval,
|
|
selectedLabel,
|
|
refreshTimes,
|
|
onItemClick,
|
|
minRangeRestrictionMessageVal,
|
|
};
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.refresh-interval-dropdown {
|
|
min-width: 36px;
|
|
height: 100%;
|
|
min-height: 30px;
|
|
line-height: 30px;
|
|
padding: 0px 5px;
|
|
}
|
|
</style>
|