Fixed the issue that clicking the Settings button on the edit status page was invalid

This commit is contained in:
Marshu 2025-04-13 23:41:43 +08:00
parent 436ac1b2ca
commit 853e84178e
2 changed files with 182 additions and 170 deletions

View file

@ -72,11 +72,17 @@ export default {
* @returns {void}
*/
show(group, monitor) {
// Check if monitor exists and has required properties
if (!monitor || !monitor.id) {
console.error("Invalid monitor object", monitor);
return;
}
this.monitor = {
id: monitor.element.id,
name: monitor.element.name,
monitor_index: monitor.index,
group_index: group.index,
id: monitor.id,
name: monitor.name,
monitor_index: monitor.index || 0,
group_index: group.index || 0,
isClickAble: this.showLink(monitor),
};
@ -103,12 +109,18 @@ export default {
* @returns {boolean} Should the link be shown?
*/
showLink(monitor, ignoreSendUrl = false) {
if (!monitor || !monitor.id) {
return false;
}
// We must check if there are any elements in monitorList to
// prevent undefined errors if it hasn't been loaded yet
if (this.$parent.editMode && ignoreSendUrl && Object.keys(this.$root.monitorList).length) {
return this.$root.monitorList[monitor.element.id].type === "http" || this.$root.monitorList[monitor.element.id].type === "keyword" || this.$root.monitorList[monitor.element.id].type === "json-query";
return this.$root.monitorList[monitor.id].type === "http" ||
this.$root.monitorList[monitor.id].type === "keyword" ||
this.$root.monitorList[monitor.id].type === "json-query";
}
return monitor.element.sendUrl && monitor.element.url && monitor.element.url !== "https://" && !this.editMode;
return monitor.sendUrl && monitor.url && monitor.url !== "https://" && !this.editMode;
},
},
};

View file

@ -86,15 +86,15 @@
<div class="shadow-box">
<!-- Group Title and Search Bar -->
<div class="group-header">
<h2 class="group-title">
<font-awesome-icon v-if="editMode && showGroupDrag" icon="arrows-alt-v" class="action drag me-3" />
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeGroup(group.index)" />
<Editable v-model="group.element.name" :contenteditable="editMode" tag="span" data-testid="group-name" />
</h2>
<h2 class="group-title">
<font-awesome-icon v-if="editMode && showGroupDrag" icon="arrows-alt-v" class="action drag me-3" />
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeGroup(group.index)" />
<Editable v-model="group.element.name" :contenteditable="editMode" tag="span" data-testid="group-name" />
</h2>
<!-- Group Search Box -->
<div v-if="!editMode && group.element && group.element.monitorList && group.element.monitorList.length > 0"
class="search-container">
class="search-container">
<div class="search-input-wrapper">
<input
type="text"
@ -117,7 +117,7 @@
<!-- Group Sort Button Bar -->
<div v-if="!editMode && group.element && group.element.monitorList && group.element.monitorList.length > 0"
class="sort-bar">
class="sort-bar">
<div class="sort-controls">
<span class="sort-label me-2">
{{ $t("Sort By") }}:
@ -191,70 +191,70 @@
<!-- Monitor List -->
<div class="monitor-list-container">
<div v-if="!group.element || !group.element.monitorList || group.element.monitorList.length === 0" class="text-center no-monitor-msg">
{{ $t("No Monitors") }}
{{ $t("No Monitors") }}
</div>
<div v-else-if="getFilteredMonitorList(group.element).length === 0" class="text-center no-monitor-msg">
{{ $t("No services found") }}
</div>
</div>
<!-- Monitor List -->
<Draggable
<!-- Monitor List -->
<Draggable
v-if="group.element && group.element.monitorList && group.element.monitorList.length > 0"
v-model="group.element.monitorList"
class="monitor-list"
group="same-group"
:disabled="!editMode"
:animation="100"
item-key="id"
>
v-model="group.element.monitorList"
class="monitor-list"
group="same-group"
:disabled="!editMode"
:animation="100"
item-key="id"
>
<template #item="{ element: monitor, index: monitorIndex }">
<div v-if="shouldShowMonitor(monitor, group.element)" class="item" data-testid="monitor">
<div class="row">
<div class="col-9 col-md-8 small-padding">
<div class="info">
<font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" />
<div class="row">
<div class="col-9 col-md-8 small-padding">
<div class="info">
<font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" />
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeMonitor(group.index, monitorIndex)" />
<Uptime :monitor="monitor" type="24" :pill="true" />
<a
v-if="showLink(monitor)"
<a
v-if="showLink(monitor)"
:href="monitor.url"
class="item-name"
target="_blank"
rel="noopener noreferrer"
data-testid="monitor-name"
>
class="item-name"
target="_blank"
rel="noopener noreferrer"
data-testid="monitor-name"
>
{{ monitor.name }}
</a>
</a>
<p v-else class="item-name" data-testid="monitor-name"> {{ monitor.name }} </p>
<span
title="Setting"
>
<span
title="Setting"
>
<font-awesome-icon
v-if="editMode"
:class="{'link-active': true, 'btn-link': true}"
icon="cog" class="action me-3"
@click="$refs.monitorSettingDialog.show(group.element, monitor)"
@click="$refs.monitorSettingDialog.show(group, monitor)"
/>
</span>
</div>
<div class="extra-info">
<div v-if="showCertificateExpiry && monitor.certExpiryDaysRemaining">
<Tag :item="{name: $t('Cert Exp.'), value: formattedCertExpiryMessage(monitor), color: certExpiryColor(monitor)}" :size="'sm'" />
</div>
<div v-if="showTags">
<div class="extra-info">
<div v-if="showCertificateExpiry && monitor.certExpiryDaysRemaining">
<Tag :item="{name: $t('Cert Exp.'), value: formattedCertExpiryMessage(monitor), color: certExpiryColor(monitor)}" :size="'sm'" />
</div>
<div v-if="showTags">
<Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" data-testid="monitor-tag" />
</div>
</div>
</div>
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4">
<HeartbeatBar size="mid" :monitor-id="monitor.id" />
</div>
</div>
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4">
<HeartbeatBar size="mid" :monitor-id="monitor.id" />
</div>
</div>
</div>
</template>
</Draggable>
</template>
</Draggable>
</div>
</div>
</div>
@ -326,12 +326,12 @@ export default {
},
hasPublicGroups() {
return this.$root &&
this.$root.publicGroupList &&
Array.isArray(this.$root.publicGroupList) &&
this.$root.publicGroupList.length > 0 &&
this.$root.publicGroupList.some(group =>
group && group.monitorList && group.monitorList.length > 0
);
this.$root.publicGroupList &&
Array.isArray(this.$root.publicGroupList) &&
this.$root.publicGroupList.length > 0 &&
this.$root.publicGroupList.some(group =>
group && group.monitorList && group.monitorList.length > 0
);
},
filteredMonitorList() {
if (!this.searchText || !this.monitorList) {
@ -391,7 +391,7 @@ export default {
},
// Watch for changes in uptimeList to re-apply sort
'$root.uptimeList': {
handler() {
handler() {
if (this.$root && this.$root.publicGroupList) {
this.$root.publicGroupList.forEach(group => {
if (group) {
@ -546,8 +546,8 @@ export default {
// Search name, URL and description fields
return (monitor.name && monitor.name.toLowerCase().includes(keyword)) ||
(monitor.url && monitor.url.toLowerCase().includes(keyword)) ||
(monitor.description && monitor.description.toLowerCase().includes(keyword));
(monitor.url && monitor.url.toLowerCase().includes(keyword)) ||
(monitor.description && monitor.description.toLowerCase().includes(keyword));
},
/**