mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 00:09:35 +00:00
fix(web): unify toolbar and component sizing, spacing and contrast
Toolbars: sm-toolbar and icon-toolbar are now one 34px box with 10px padding, per-page overrides are gone, and controls sit 8px apart across Logs, Metrics and Traces. Contrast: darken the default primary to #5A64DB so white labels pass 4.5:1, use primary-700 for active tabs, raise label and muted text, log punctuation and dark pagination, and replace opacity on text with tokens. Components: 28px table footer and row actions, matching button and input borders, stat tile padding, one-row Alerts tiles with stacked labels, centred header checkbox, and aligned Settings fields.
This commit is contained in:
@@ -30,7 +30,7 @@
|
||||
|
||||
}
|
||||
.log-separator {
|
||||
color: #9ca3af;
|
||||
color: #6b7280;
|
||||
|
||||
}
|
||||
/* `.log-key`/`.log-separator` are applied to generated log HTML injected via
|
||||
@@ -41,7 +41,7 @@
|
||||
font-weight: normal;
|
||||
}
|
||||
.log-object-brace {
|
||||
color: #9ca3af;
|
||||
color: #6b7280;
|
||||
|
||||
}
|
||||
|
||||
@@ -100,7 +100,8 @@
|
||||
color: #6EE7B7; /* Soft mint green */
|
||||
|
||||
}
|
||||
.dark .log-separator {
|
||||
.dark .log-separator,
|
||||
.dark .log-object-brace {
|
||||
color: #999;
|
||||
}
|
||||
.dark .log-number {
|
||||
|
||||
@@ -298,7 +298,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
@update:pending-date="pendingDay = $event"
|
||||
/>
|
||||
</div>
|
||||
<div class="text-3xs ps-6 pe-6">{{ t("common.datetimeMessage") }}</div>
|
||||
<div class="text-text-secondary ps-6 pe-6 text-xs">
|
||||
{{ t("common.datetimeMessage") }}
|
||||
</div>
|
||||
<OSeparator v-if="!disableRelative" class="my-2" />
|
||||
|
||||
<table
|
||||
|
||||
@@ -499,7 +499,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
: t("alerts.wouldNotTrigger")
|
||||
}}
|
||||
</span>
|
||||
<span class="text-xs opacity-60">{{ activeEvaluationStatus.reason }}</span>
|
||||
<span class="text-text-secondary text-xs">{{ activeEvaluationStatus.reason }}</span>
|
||||
</template>
|
||||
</div>
|
||||
<div class="min-h-0 flex-1 overflow-hidden">
|
||||
|
||||
@@ -521,7 +521,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OIcon name="error" size="sm" class="text-status-error-text" />
|
||||
</template>
|
||||
<template #header-right>
|
||||
<div class="text-compact ms-9 flex items-center text-xs opacity-70">
|
||||
<div class="text-compact text-text-secondary ms-9 flex items-center text-xs">
|
||||
<span class="me-1">{{ t("alerts.lastError") }}</span>
|
||||
<OIcon name="schedule" size="xs" class="me-1" />
|
||||
{{
|
||||
@@ -532,7 +532,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</template>
|
||||
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 text-sm font-semibold tracking-[0.02em] opacity-80">
|
||||
<div class="text-text-secondary mb-2 text-sm font-semibold tracking-[0.02em]">
|
||||
{{ t("alerts.errorSummary") }}
|
||||
</div>
|
||||
<div
|
||||
|
||||
@@ -163,6 +163,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:items="summaryStats"
|
||||
:loading="loading"
|
||||
compact
|
||||
stacked
|
||||
selectable
|
||||
:selected-key="stateFilter"
|
||||
default-key="total"
|
||||
@@ -592,7 +593,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-list-${row.name}-pause-start-alert`"
|
||||
class="ms-1 max-md:hidden"
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost-success'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
@click.stop="toggleAlertState(row)"
|
||||
>
|
||||
@@ -606,7 +607,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="edit"
|
||||
:data-test="`alert-list-${row.name}-update-alert`"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
@click.stop="editAlert(row)"
|
||||
@@ -631,7 +632,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
data-row-action="duplicate"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
:disabled="isSloRow(row)"
|
||||
:aria-label="isSloRow(row) ? t('alerts.sloCloneDisabled') : t('alerts.clone')"
|
||||
@@ -669,7 +670,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #trigger>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="more-vert"
|
||||
:aria-label="t('alerts.moreActions')"
|
||||
@click.stop="openMenu($event, row)"
|
||||
|
||||
@@ -35,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="flex h-full min-h-30 flex-col items-center justify-center gap-2 p-4"
|
||||
>
|
||||
<OIcon name="article" size="lg" class="opacity-20" />
|
||||
<span class="text-compact text-center font-medium opacity-50">{{
|
||||
<span class="text-compact text-text-secondary text-center font-medium">{{
|
||||
t("alerts.summary.configureAlert")
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
@@ -300,7 +300,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="destination-export"
|
||||
data-row-action="export"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_destinations.exportDestination')"
|
||||
@click.stop="exportDestination(row)"
|
||||
@@ -311,7 +311,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-destination-list-${row.name}-update-destination`"
|
||||
data-row-action="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_destinations.edit')"
|
||||
@click="editDestination(row)"
|
||||
@@ -322,7 +322,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-destination-list-${row.name}-delete-destination`"
|
||||
data-row-action="delete"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_destinations.delete')"
|
||||
:loading="deletingDestinations.has(row.name)"
|
||||
|
||||
@@ -191,7 +191,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-if="row.integration" class="flex items-center gap-1">
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_sources.edit')"
|
||||
@@ -200,7 +200,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="autorenew"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_sources.rotateToken')"
|
||||
@@ -209,7 +209,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
:variant="row.integration.enabled ? 'ghost-destructive' : 'ghost-success'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.integration.enabled ? 'pause' : 'play-arrow'"
|
||||
class="max-md:hidden"
|
||||
:title="
|
||||
@@ -220,7 +220,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete"
|
||||
class="max-md:hidden"
|
||||
:disabled="row.integration.name === 'default'"
|
||||
|
||||
@@ -363,7 +363,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SECTION 2: Main Content (2:1 Ratio Layout) with calc(100vh - 236px) height (was 276px) -->
|
||||
<div class="flex h-[calc(100vh-23.75rem)] flex-1 gap-3">
|
||||
<!-- PART 1: Primary Content (66.67% width) -->
|
||||
<div class="flex w-2/3 flex-col gap-3">
|
||||
|
||||
@@ -274,7 +274,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="row.status === 'open'"
|
||||
variant="ghost-warning"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:aria-label="t('alerts.incidents.acknowledgeAriaLabel')"
|
||||
class="max-md:hidden"
|
||||
@click.stop="acknowledgeIncident(row)"
|
||||
@@ -285,7 +285,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="row.status !== 'resolved'"
|
||||
variant="ghost-primary"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click.stop="resolveIncident(row)"
|
||||
data-test="incident-resolve-btn"
|
||||
@@ -295,7 +295,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="row.status === 'resolved'"
|
||||
variant="ghost-warning"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click.stop="reopenIncident(row)"
|
||||
data-test="incident-reopen-btn"
|
||||
|
||||
@@ -111,7 +111,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-destination-list-${row.name}-update-destination`"
|
||||
data-row-action="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_destinations.edit')"
|
||||
@click="editDestination(row)"
|
||||
@@ -122,7 +122,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-destination-list-${row.name}-delete-destination`"
|
||||
data-row-action="delete"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('alert_destinations.delete')"
|
||||
@click="conformDeleteDestination(row)"
|
||||
|
||||
@@ -24,7 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="flex h-full flex-col items-center justify-center gap-2"
|
||||
>
|
||||
<OIcon name="edit" size="xl" class="opacity-20" />
|
||||
<span class="text-sm opacity-40">{{ t("alerts.writeQueryToSeePreview") }}</span>
|
||||
<span class="text-text-secondary text-sm">{{ t("alerts.writeQueryToSeePreview") }}</span>
|
||||
</div>
|
||||
<PanelSchemaRenderer
|
||||
ref="panelRendererRef"
|
||||
|
||||
@@ -48,7 +48,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="rounded-default border-info/28 bg-info/10 inline-flex flex-row items-center gap-1.25 border px-2.5 py-0.75"
|
||||
>
|
||||
<span class="text-2xs text-text-label font-semibold">{{ t("alerts.streamType") }}</span>
|
||||
<span class="text-2xs text-text-label opacity-30">:</span>
|
||||
<span class="text-2xs text-text-label">:</span>
|
||||
<span class="text-text-link text-xs font-bold">{{ streamType }}</span>
|
||||
</div>
|
||||
<span v-if="streamType && streamName" class="opacity-20 select-none">|</span>
|
||||
@@ -58,11 +58,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<span class="text-2xs text-text-label font-semibold">{{
|
||||
t("alerts.stream_name")
|
||||
}}</span>
|
||||
<span class="text-2xs text-text-label opacity-30">:</span>
|
||||
<span class="text-2xs text-text-label">:</span>
|
||||
<span v-if="streamName" class="text-sql-accent text-xs font-bold">{{
|
||||
streamName
|
||||
}}</span>
|
||||
<span v-else class="text-sql-accent text-xs font-bold italic opacity-40">{{
|
||||
<span v-else class="text-text-muted text-xs font-bold italic">{{
|
||||
t("alerts.queryEditor.noStream")
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -395,7 +395,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="flex h-full flex-col items-center justify-center gap-2"
|
||||
>
|
||||
<OSpinner size="md" />
|
||||
<span class="text-sm opacity-60">{{ t("search.fetchingResults") }}</span>
|
||||
<span class="text-text-secondary text-sm">{{
|
||||
t("search.fetchingResults")
|
||||
}}</span>
|
||||
</div>
|
||||
<!-- Results -->
|
||||
<QueryEditor
|
||||
@@ -472,7 +474,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="flex h-full flex-col items-center justify-center gap-2"
|
||||
>
|
||||
<OSpinner size="md" />
|
||||
<span class="text-sm opacity-60">{{ t("search.fetchingResults") }}</span>
|
||||
<span class="text-text-secondary text-sm">{{
|
||||
t("search.fetchingResults")
|
||||
}}</span>
|
||||
</div>
|
||||
<!-- Results -->
|
||||
<QueryEditor
|
||||
|
||||
@@ -189,7 +189,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:title="t('alert_templates.exportTemplate')"
|
||||
class="ms-1 max-md:hidden"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
@click.stop="exportTemplate(row)"
|
||||
data-test="destination-export"
|
||||
data-row-action="export"
|
||||
@@ -200,7 +200,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-template-list-${row.name}-update-template`"
|
||||
class="ms-1 max-md:hidden"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="
|
||||
row.isPrebuilt ? t('alert_templates.systemReadOnlyEdit') : t('alert_templates.edit')
|
||||
"
|
||||
@@ -214,7 +214,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-template-list-${row.name}-clone-template`"
|
||||
class="ms-1 max-md:hidden"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:aria-label="cloneActionLabel(row, t('alert_templates.clone'))"
|
||||
@click="cloneTemplate(row)"
|
||||
data-row-action="duplicate"
|
||||
@@ -235,7 +235,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`alert-template-list-${row.name}-delete-template`"
|
||||
class="ms-1 max-md:hidden"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="
|
||||
row.isPrebuilt
|
||||
? t('alert_templates.systemReadOnlyDelete')
|
||||
|
||||
@@ -341,7 +341,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="row.status === 'scheduled'"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="cancel"
|
||||
:data-test="`downtime-list-${row.id}-cancel`"
|
||||
@click.stop="askCancel([row.id])"
|
||||
@@ -351,7 +351,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-else
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="stop-circle"
|
||||
:disabled="row.status !== 'active'"
|
||||
:aria-label="t('alerts.downtimes.actions.endNow')"
|
||||
@@ -369,7 +369,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="isEditable(row)"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
:data-test="`downtime-list-${row.id}-edit`"
|
||||
@click.stop="editDowntime(row)"
|
||||
@@ -380,7 +380,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<span class="inline-flex size-8 max-md:hidden">
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
:data-test="`downtime-list-${row.id}-duplicate`"
|
||||
:aria-label="
|
||||
@@ -415,7 +415,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #trigger>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="more-vert"
|
||||
:aria-label="moreActionsLabel(row)"
|
||||
:data-test="`downtime-list-${row.id}-more`"
|
||||
|
||||
@@ -247,7 +247,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-xs opacity-60">{{ t("alerts.advanced.templateType") }}</span>
|
||||
<span class="text-text-secondary text-xs">{{
|
||||
t("alerts.advanced.templateType")
|
||||
}}</span>
|
||||
<OFormToggleGroup
|
||||
data-test="add-alert-row-template-type-toggle"
|
||||
name="row_template_type"
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
<OButton
|
||||
v-if="row.slug"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
class="max-md:hidden"
|
||||
:aria-label="t('dashboard.publicDashboard.copyLink')"
|
||||
@@ -210,7 +210,7 @@
|
||||
<OButton
|
||||
v-if="row.slug"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="open-in-new"
|
||||
class="max-md:hidden"
|
||||
:aria-label="t('dashboard.publicLinks.openPublicPage')"
|
||||
@@ -228,7 +228,7 @@
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
:aria-label="t('dashboard.publicLinks.editSettings')"
|
||||
:disabled="!hasDashboard(row)"
|
||||
@@ -245,7 +245,7 @@
|
||||
<OButton
|
||||
v-if="!noDashboardAccess(row) && takeOverReplacesResume(row, userId)"
|
||||
variant="ghost-success"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="how-to-reg"
|
||||
class="max-md:hidden"
|
||||
:aria-label="t('dashboard.publicLinks.takeOver')"
|
||||
@@ -261,7 +261,7 @@
|
||||
<OTooltip v-if="!canPause(row)" side="bottom" :content="pauseBlockedReason(row, t)" />
|
||||
<OButton
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost-success'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
:aria-label="
|
||||
row.enabled ? t('dashboard.publicLinks.pause') : t('dashboard.publicLinks.resume')
|
||||
@@ -285,7 +285,7 @@
|
||||
<OButton
|
||||
icon-left="more-vert"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('dashboard.moreActions')"
|
||||
:aria-label="t('dashboard.moreActions')"
|
||||
:loading="busyRows.get(row.id) === 'menu'"
|
||||
|
||||
@@ -14,7 +14,7 @@ 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 v-if="variablesData.values?.length > 0" class="mt-1 flex flex-wrap gap-y-1">
|
||||
<div v-if="variablesData.values?.length > 0" class="mt-2 flex flex-wrap gap-x-4 gap-y-2">
|
||||
<div
|
||||
v-for="(item, index) in variablesData.values"
|
||||
v-show="!isVariableOffTab(item)"
|
||||
@@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-show="!isVariableOmitted(item)"
|
||||
>
|
||||
<VariableQueryValueSelector
|
||||
class="me-4 mt-1"
|
||||
v-show="!item.hideOnDashboard"
|
||||
v-model="item.value"
|
||||
:variableItem="item"
|
||||
@@ -53,7 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-else-if="item.type == 'constant'" class="max-w-[40rem] min-w-37.5">
|
||||
<OInput
|
||||
v-show="!item.hideOnDashboard"
|
||||
class="me-4 mt-1 max-w-37.5!"
|
||||
class="max-w-37.5!"
|
||||
v-model="item.value"
|
||||
:label="item.label || item.name"
|
||||
label-position="inside"
|
||||
@@ -65,7 +64,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-else-if="item.type == 'textbox'" class="max-w-[40rem] min-w-37.5">
|
||||
<OInput
|
||||
v-show="!item.hideOnDashboard"
|
||||
class="me-4 mt-1 max-w-37.5!"
|
||||
class="max-w-37.5!"
|
||||
:debounce="textboxDebounce"
|
||||
v-model="item.value"
|
||||
:label="item.label || item.name"
|
||||
@@ -90,7 +89,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div v-else-if="item.type == 'custom'" class="max-w-[40rem] min-w-37.5">
|
||||
<VariableCustomValueSelector
|
||||
v-show="!item.hideOnDashboard"
|
||||
class="me-4 mt-1"
|
||||
v-model="item.value"
|
||||
:variableItem="item"
|
||||
@update:model-value="onVariablesValueUpdated(Number(index))"
|
||||
@@ -99,7 +97,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<div v-else-if="item.type == 'dynamic_filters'" class="max-w-max">
|
||||
<VariableAdHocValueSelector
|
||||
class="me-4 mt-1"
|
||||
v-model="item.value"
|
||||
:variableItem="item"
|
||||
@update:model-value="onVariablesValueUpdated(Number(index))"
|
||||
@@ -108,7 +105,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
<!-- Add Variable Button -->
|
||||
<div v-if="showAddVariableButton" class="ms-1 mt-1">
|
||||
<div v-if="showAddVariableButton">
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="sm"
|
||||
|
||||
@@ -234,7 +234,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`${row.name}-explore-btn`"
|
||||
:title="t('logStream.explore')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="exploreEnrichmentTable(row)"
|
||||
icon-left="search"
|
||||
@@ -249,7 +249,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`${row.name}-schema-btn`"
|
||||
:title="t('logStream.schemaHeader')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="listSchema(row)"
|
||||
icon-left="format-list-bulleted"
|
||||
@@ -267,7 +267,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`${row.name}-edit-btn`"
|
||||
:title="t('function.enrichmentTables')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="showAddUpdateFn(row)"
|
||||
icon-left="edit"
|
||||
@@ -279,7 +279,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`${row.name}-delete-btn`"
|
||||
:title="t('function.delete')"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="showDeleteDialogFn(row)"
|
||||
icon-left="delete"
|
||||
|
||||
@@ -151,7 +151,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="actions-container flex items-center">
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('function.updateTitle')"
|
||||
data-test="function-list-edit-function-btn"
|
||||
data-row-action="edit"
|
||||
@@ -161,7 +161,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="account-tree"
|
||||
:title="t('function.associatedPipelines')"
|
||||
data-row-action="view"
|
||||
@@ -170,7 +170,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="download"
|
||||
:title="t('common.export')"
|
||||
data-test="function-list-export-function-btn"
|
||||
@@ -180,7 +180,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('function.delete')"
|
||||
data-test="function-list-delete-function-btn"
|
||||
data-row-action="delete"
|
||||
|
||||
@@ -185,7 +185,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="service-accounts-refresh"
|
||||
:title="t('serviceAccounts.rotate')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="refresh"
|
||||
class="max-md:hidden"
|
||||
@click="confirmRefreshAction(row)"
|
||||
@@ -195,7 +195,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="edit"
|
||||
:title="t('serviceAccounts.update')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
@click="addRoutePush(row)"
|
||||
@@ -205,7 +205,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="delete"
|
||||
:title="t('serviceAccounts.deleteServiceAccount')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete"
|
||||
class="max-md:hidden"
|
||||
@click="confirmDeleteAction(row)"
|
||||
|
||||
@@ -54,7 +54,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="refresh"
|
||||
:loading="loading"
|
||||
data-test="invitation-list-refresh-btn"
|
||||
|
||||
@@ -177,7 +177,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="row.enableDelete && row.status != 'pending' && !row.isDomainMapped"
|
||||
:title="t('user.delete')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:data-test="`delete-basic-user-${row.email}`"
|
||||
data-row-action="delete"
|
||||
@@ -189,7 +189,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="row.enableDelete && row.status != 'pending' && row.isDomainMapped"
|
||||
:title="t('user.block')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:data-test="`block-basic-user-${row.email}`"
|
||||
data-row-action="delete"
|
||||
@@ -201,7 +201,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="row.status == 'pending' && row.token"
|
||||
:title="t('user.revoke_invite')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:data-test="`revoke-invite-${row.email}`"
|
||||
data-row-action="delete"
|
||||
@@ -213,7 +213,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="row.enableEdit && row.status != 'pending'"
|
||||
:title="t('user.update')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:data-test="`edit-basic-user-${index}`"
|
||||
data-row-action="edit"
|
||||
|
||||
@@ -80,7 +80,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #cell-actions="{ row }">
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete-outline"
|
||||
:aria-label="t('oncall.coverRemove')"
|
||||
:data-test="`oncall-cover-remove-${row.id}`"
|
||||
|
||||
@@ -157,7 +157,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="shrink-0"
|
||||
:aria-label="t('oncall.edit')"
|
||||
|
||||
@@ -86,15 +86,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="pipeline-list-tabs"
|
||||
>
|
||||
<OToggleGroupItem value="all" size="sm" data-test="tab-all">
|
||||
<template #icon-left><OIcon name="format-list-bulleted" size="sm" /></template>
|
||||
<template #icon-left><OIcon name="format-list-bulleted" size="xs" /></template>
|
||||
{{ t("pipeline_list.tab_all") }}
|
||||
</OToggleGroupItem>
|
||||
<OToggleGroupItem value="scheduled" size="sm" data-test="tab-scheduled">
|
||||
<template #icon-left><OIcon name="schedule" size="sm" /></template>
|
||||
<template #icon-left><OIcon name="schedule" size="xs" /></template>
|
||||
{{ t("pipeline_list.tab_scheduled") }}
|
||||
</OToggleGroupItem>
|
||||
<OToggleGroupItem value="realtime" size="sm" data-test="tab-realtime">
|
||||
<template #icon-left><OIcon name="bolt" size="sm" /></template>
|
||||
<template #icon-left><OIcon name="bolt" size="xs" /></template>
|
||||
{{ t("pipeline_list.tab_realtime") }}
|
||||
</OToggleGroupItem>
|
||||
</OToggleGroup>
|
||||
@@ -173,7 +173,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`pipeline-list-${row.name}-pause-start-action`"
|
||||
:data-row-action="row.enabled ? 'pause' : 'resume'"
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
class="max-md:hidden"
|
||||
@click.stop="togglePipeline(row)"
|
||||
@@ -188,7 +188,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:data-test="`pipeline-list-${row.name}-view-pipeline`"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('pipeline.view')"
|
||||
class="max-md:hidden"
|
||||
icon-left="visibility"
|
||||
@@ -201,7 +201,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`pipeline-list-${row.name}-update-pipeline`"
|
||||
data-row-action="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click.stop="editPipeline(row)"
|
||||
icon-left="edit"
|
||||
@@ -235,7 +235,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:aria-label="t('common.moreActions')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
@click.stop
|
||||
:data-test="`pipeline-list-${row.name}-more-options`"
|
||||
icon-left="more-vert"
|
||||
|
||||
@@ -61,7 +61,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="shrink-0"
|
||||
@click="refreshJobs"
|
||||
:disabled="loading"
|
||||
@@ -175,7 +175,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="canPauseJob(row)"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="confirmPauseJob(row)"
|
||||
data-test="pause-job-btn"
|
||||
@@ -186,7 +186,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="canResumeJob(row)"
|
||||
variant="ghost-success"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="confirmResumeJob(row)"
|
||||
data-test="resume-job-btn"
|
||||
@@ -197,7 +197,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="canEditJob(row.status)"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="editJob(row)"
|
||||
data-test="edit-job-btn"
|
||||
@@ -207,7 +207,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="viewJob(row)"
|
||||
data-test="view-job-btn"
|
||||
@@ -218,7 +218,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="canDeleteJob(row.status)"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="confirmDeleteJob(row)"
|
||||
data-test="delete-job-btn"
|
||||
@@ -229,7 +229,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="row.error"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="showErrorDialog(row)"
|
||||
data-test="error-indicator-btn"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<OButton
|
||||
:aria-label="t('common.close')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
data-test="queryList-cancel"
|
||||
@click="$emit('close')"
|
||||
icon-left="close"
|
||||
|
||||
@@ -67,7 +67,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="shrink-0"
|
||||
icon-left="refresh"
|
||||
data-test="running-queries-refresh-btn"
|
||||
@@ -89,7 +89,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
icon-left="format-list-bulleted"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('queries.queryList')"
|
||||
data-test="queryList-btn"
|
||||
@@ -98,7 +98,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
icon-left="close"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('queries.cancelQuery')"
|
||||
data-test="cancelQuery-btn"
|
||||
|
||||
@@ -44,7 +44,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="shrink-0"
|
||||
icon-left="refresh"
|
||||
data-test="summary-list-refresh-btn"
|
||||
@@ -65,7 +65,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #cell-actions="{ row }">
|
||||
<OButton
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('queries.cancelQuery')"
|
||||
data-test="cancelQuery-btn"
|
||||
@click.stop="confirmDeleteAction({ row })"
|
||||
|
||||
@@ -280,7 +280,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`report-list-${row.name}-pause-start-report`"
|
||||
:data-row-action="row.enabled ? 'pause' : 'resume'"
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
:title="row.enabled ? t('alerts.pause') : t('alerts.start')"
|
||||
class="max-md:hidden"
|
||||
@@ -293,7 +293,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="run-now"
|
||||
icon-left="send"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:loading="runningReportId === row.report_id"
|
||||
:disabled="!!runningReportId"
|
||||
:title="t('reports.history.runNow')"
|
||||
@@ -307,7 +307,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="edit"
|
||||
icon-left="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('alerts.edit')"
|
||||
class="max-md:hidden"
|
||||
@click.stop="editReport(row)"
|
||||
@@ -318,7 +318,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`report-list-${row.name}-move-report`"
|
||||
icon-left="drive-file-move"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('reports.moveToFolder')"
|
||||
class="max-md:hidden"
|
||||
@click.stop="openMoveDialog(row)"
|
||||
@@ -330,7 +330,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-row-action="delete"
|
||||
icon-left="delete"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:title="t('alerts.delete')"
|
||||
class="max-md:hidden"
|
||||
@click.stop="confirmDeleteReport(row)"
|
||||
|
||||
@@ -138,7 +138,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="flex items-center justify-center gap-1">
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
:title="t('announcements.card.edit')"
|
||||
:aria-label="t('announcements.card.edit')"
|
||||
@@ -147,7 +147,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
:aria-label="duplicateLabel(row)"
|
||||
:data-test="`announcement-list-duplicate-${row.index}`"
|
||||
@@ -163,7 +163,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
<OButton
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete"
|
||||
:title="t('announcements.card.remove')"
|
||||
:aria-label="t('announcements.card.remove')"
|
||||
|
||||
@@ -42,10 +42,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:aria-label="t('settings.scrapintervalLabel')"
|
||||
type="number"
|
||||
min="0"
|
||||
class="ms-2 w-30!"
|
||||
class="w-52!"
|
||||
data-test="general-settings-scrape-interval"
|
||||
/>
|
||||
<span class="individual-setting-description text-compact opacity-70">
|
||||
<span class="individual-setting-description text-compact text-text-secondary">
|
||||
{{ t("settings.scrapeIntervalDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -62,8 +62,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
type="number"
|
||||
:min="1000"
|
||||
:max="1000000"
|
||||
class="ms-2 w-52!"
|
||||
:placeholder="raw('40000 (' + t('settings.systemDefault') + ')')"
|
||||
class="w-52!"
|
||||
:placeholder="raw('40000')"
|
||||
:aria-label="t('settings.maxSeriesPerQueryLabel')"
|
||||
data-test="general-settings-max-series-per-query"
|
||||
>
|
||||
@@ -73,7 +73,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OIcon>
|
||||
</template>
|
||||
</OFormInput>
|
||||
<span class="individual-setting-description text-compact opacity-70">
|
||||
<span class="individual-setting-description text-compact text-text-secondary">
|
||||
{{ t("settings.maxSeriesPerQueryDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -85,7 +85,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<span class="individual-setting-title text-sm leading-5 font-medium">
|
||||
{{ t("settings.manageTheme") }}
|
||||
</span>
|
||||
<div class="-ms-15 flex items-center gap-2 max-lg:ms-0 max-lg:flex-wrap">
|
||||
<div class="flex items-center gap-2 max-lg:flex-wrap">
|
||||
<!-- Light Mode Theme -->
|
||||
<div
|
||||
class="group/chip bg-surface-subtle border-border-default hover:bg-surface-subtle-hover hover:border-accent inline-flex cursor-pointer items-center gap-2 rounded-full border py-1.5 ps-1.5 pe-3 transition-all duration-200 hover:-translate-y-px hover:shadow-md"
|
||||
@@ -104,10 +104,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<!-- eslint-enable local/no-hardcoded-px -->
|
||||
</div>
|
||||
<span class="chip-label text-2xs font-semibold tracking-wider opacity-50">{{
|
||||
<span class="chip-label text-text-body text-xs font-semibold">{{
|
||||
t("settings.light")
|
||||
}}</span>
|
||||
<span class="chip-value text-2xs font-mono font-medium tracking-tight opacity-70">{{
|
||||
<span class="chip-value text-text-body font-mono text-xs font-medium">{{
|
||||
customLightColor
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -130,10 +130,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<!-- eslint-enable local/no-hardcoded-px -->
|
||||
</div>
|
||||
<span class="chip-label text-2xs font-semibold tracking-wider opacity-50">{{
|
||||
<span class="chip-label text-text-body text-xs font-semibold">{{
|
||||
t("settings.dark")
|
||||
}}</span>
|
||||
<span class="chip-value text-2xs font-mono font-medium tracking-tight opacity-70">{{
|
||||
<span class="chip-value text-text-body font-mono text-xs font-medium">{{
|
||||
customDarkColor
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -152,7 +152,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTooltip :content="t('settings.resetToDefaultColors')" side="top" />
|
||||
</div>
|
||||
</div>
|
||||
<span class="individual-setting-description text-compact self-start opacity-70">
|
||||
<span
|
||||
class="individual-setting-description text-compact text-text-secondary self-start"
|
||||
>
|
||||
{{ t("settings.themeManagementDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -255,7 +257,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<span class="individual-setting-description text-compact opacity-70">
|
||||
<span class="individual-setting-description text-compact text-text-secondary">
|
||||
{{ t("settings.customLogoTextDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -343,7 +345,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<span class="individual-setting-description text-compact -translate-y-1.25 opacity-70">
|
||||
<span
|
||||
class="individual-setting-description text-compact text-text-secondary -translate-y-1.25"
|
||||
>
|
||||
{{ t("settings.customLogoLightDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -432,7 +436,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<span class="individual-setting-description text-compact -translate-y-1.25 opacity-70">
|
||||
<span
|
||||
class="individual-setting-description text-compact text-text-secondary -translate-y-1.25"
|
||||
>
|
||||
{{ t("settings.customLogoDarkDescription") }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -152,7 +152,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="examples-table border-card-glass-border rounded-default overflow-hidden border"
|
||||
>
|
||||
<div
|
||||
class="bg-surface-subtle border-card-glass-border text-3xs grid grid-cols-[11.25rem_1fr_auto] gap-3 border-b px-3 py-1.5 font-bold tracking-[0.06em] uppercase opacity-45"
|
||||
class="bg-surface-subtle border-card-glass-border text-2xs text-text-secondary grid grid-cols-[11.25rem_1fr_auto] gap-3 border-b px-3 py-1.5 font-bold tracking-[0.06em] uppercase"
|
||||
>
|
||||
<span>{{ t("modelPricing.patternExamplesModelCol") }}</span>
|
||||
<span>{{ t("modelPricing.patternExamplesPatternCol") }}</span>
|
||||
@@ -240,7 +240,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<div class="flex items-center gap-2">
|
||||
<span
|
||||
class="tier-name-label shrink-0 text-xs font-medium whitespace-nowrap opacity-50"
|
||||
class="tier-name-label text-text-secondary shrink-0 text-xs font-medium whitespace-nowrap"
|
||||
>{{ t("modelPricing.tierName") }}</span
|
||||
>
|
||||
<OFormInput
|
||||
@@ -331,7 +331,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OText variant="section">
|
||||
{{ t("modelPricing.timeWindows") }}
|
||||
</OText>
|
||||
<div class="text-2xs mt-px mb-2 opacity-55">
|
||||
<div class="text-2xs text-text-secondary mt-px mb-2">
|
||||
{{ t("modelPricing.timeWindowsDesc") }}
|
||||
</div>
|
||||
<!-- Key by INDEX to match the index-based field names — see the
|
||||
@@ -370,7 +370,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
<span
|
||||
v-if="windowWraps(win)"
|
||||
class="text-2xs whitespace-nowrap opacity-55"
|
||||
class="text-2xs text-text-secondary whitespace-nowrap"
|
||||
:data-test="`model-pricing-tier-window-wrap-hint-${idx}-${winIdx}`"
|
||||
>
|
||||
{{ t("modelPricing.timeWindowWrapsHint") }}
|
||||
@@ -380,7 +380,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- The same window in the viewer's timezone -->
|
||||
<div
|
||||
v-if="windowLocalHint(win)"
|
||||
class="text-2xs mt-1 opacity-55"
|
||||
class="text-2xs text-text-secondary mt-1"
|
||||
:data-test="`model-pricing-tier-window-local-hint-${idx}-${winIdx}`"
|
||||
>
|
||||
{{ t("modelPricing.localTimeHint", { range: windowLocalHint(win) }) }}
|
||||
@@ -403,7 +403,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OText variant="section">
|
||||
{{ t("modelPricing.attributeRules") }}
|
||||
</OText>
|
||||
<div class="text-2xs mt-px mb-2 opacity-55">
|
||||
<div class="text-2xs text-text-secondary mt-px mb-2">
|
||||
{{ t("modelPricing.attributeRulesDesc") }}
|
||||
</div>
|
||||
<!-- Index keys: form fields bind to their name once, see the price-row note below. -->
|
||||
@@ -582,7 +582,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- Column headers (only when rows exist) -->
|
||||
<div
|
||||
v-if="tier.prices.length"
|
||||
class="price-table-head text-2xs grid grid-cols-[1fr_10rem_auto] gap-2 px-3 py-1.5 font-semibold tracking-[0.01em] opacity-45 max-lg:grid-cols-[1fr_6rem_auto]"
|
||||
class="price-table-head text-2xs text-text-secondary grid grid-cols-[1fr_10rem_auto] gap-2 px-3 py-1.5 font-semibold tracking-[0.01em] max-lg:grid-cols-[1fr_6rem_auto]"
|
||||
>
|
||||
<span>{{ t("modelPricing.usageKeyCol") }}</span>
|
||||
<span>{{ t("modelPricing.colPrice") }}</span>
|
||||
|
||||
@@ -37,7 +37,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<template #title>
|
||||
{{ t("modelPricing.header") }}
|
||||
<OButton variant="ghost" size="icon-sm" class="-ms-1" data-test="model-pricing-info-btn">
|
||||
<OButton variant="ghost" size="icon-xs-sq" class="-ms-1" data-test="model-pricing-info-btn">
|
||||
<OIcon name="info-outline" size="sm" />
|
||||
<OTooltip :content="t('modelPricing.matchingPriorityTooltip')" />
|
||||
</OButton>
|
||||
@@ -333,21 +333,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<div
|
||||
v-if="tier.utc_windows?.length"
|
||||
class="text-2xs font-mono opacity-70"
|
||||
class="text-2xs text-text-secondary font-mono"
|
||||
>
|
||||
{{ formatUtcWindows(tier.utc_windows) }}
|
||||
</div>
|
||||
<div v-if="tierWindowsLocal(tier)" class="text-2xs font-mono opacity-70">
|
||||
<div
|
||||
v-if="tierWindowsLocal(tier)"
|
||||
class="text-2xs text-text-secondary font-mono"
|
||||
>
|
||||
{{ t("modelPricing.localTimeHint", { range: tierWindowsLocal(tier) }) }}
|
||||
</div>
|
||||
<div
|
||||
v-for="(rule, rIdx) in tier.rules ?? []"
|
||||
:key="rIdx"
|
||||
class="text-2xs font-mono opacity-70"
|
||||
class="text-2xs text-text-secondary font-mono"
|
||||
>
|
||||
{{ formatTierRule(rule, t) }}
|
||||
</div>
|
||||
<div v-if="isUnrestrictedTier(tier)" class="text-2xs opacity-70">
|
||||
<div v-if="isUnrestrictedTier(tier)" class="text-2xs text-text-secondary">
|
||||
{{ t("modelPricing.tierAlwaysActive") }}
|
||||
</div>
|
||||
<table class="mt-0.5 w-full border-collapse">
|
||||
@@ -377,7 +380,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template v-if="!isReadOnly(row)">
|
||||
<OButton
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost-success'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="
|
||||
row.enabled ? t('modelPricing.actionDisable') : t('modelPricing.actionEnable')
|
||||
@@ -389,7 +392,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('modelPricing.actionEdit')"
|
||||
@click.stop="openEditor(row)"
|
||||
@@ -419,7 +422,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
icon-left="more-vert"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:aria-label="duplicateActionLabel(row, t('modelPricing.moreActions'))"
|
||||
data-test="model-pricing-row-more-actions"
|
||||
@click.stop
|
||||
@@ -475,7 +478,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template v-else>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:aria-label="duplicateActionLabel(row, t('modelPricing.actionClone'))"
|
||||
@click.stop="duplicateModel(row)"
|
||||
data-test="model-pricing-clone-btn"
|
||||
@@ -621,13 +624,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
</div>
|
||||
<div v-if="tier.utc_windows?.length" class="mt-2">
|
||||
<div class="text-2xs mb-1.5 opacity-55">
|
||||
<div class="text-2xs text-text-secondary mb-1.5">
|
||||
{{ t("modelPricing.timeWindows") }}
|
||||
<span class="ms-1 font-mono">{{ formatUtcWindows(tier.utc_windows) }}</span>
|
||||
</div>
|
||||
<div
|
||||
v-if="tierWindowsLocal(tier)"
|
||||
class="text-2xs mb-1.5 opacity-55"
|
||||
class="text-2xs text-text-secondary mb-1.5"
|
||||
data-test="model-pricing-drawer-tier-local-hint"
|
||||
>
|
||||
{{ t("modelPricing.localTimeHint", { range: tierWindowsLocal(tier) }) }}
|
||||
@@ -642,7 +645,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<OCode>{{ formatTierRule(rule, t) }}</OCode>
|
||||
</div>
|
||||
<div v-if="isUnrestrictedTier(tier)" class="text-2xs mt-0.5 opacity-55">
|
||||
<div v-if="isUnrestrictedTier(tier)" class="text-2xs text-text-secondary mt-0.5">
|
||||
{{ t("modelPricing.tierAlwaysActive") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -141,7 +141,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`regex-pattern-list-${row.id}-export-regex-pattern`"
|
||||
data-row-action="export"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('settings.regexPatternList.exportTitle')"
|
||||
@click.stop="exportRegexPattern(row)"
|
||||
@@ -151,7 +151,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`regex-pattern-list-${row.id}-update-regex-pattern`"
|
||||
data-row-action="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('regex_patterns.edit')"
|
||||
@click.stop="editRegexPattern(row)"
|
||||
@@ -161,7 +161,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`regex-pattern-list-${row.id}-delete-regex-pattern`"
|
||||
data-row-action="delete"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('regex_patterns.delete')"
|
||||
@click.stop="confirmDeleteRegexPattern(row)"
|
||||
|
||||
@@ -55,7 +55,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
t("settings.correlation.service")
|
||||
}}</span>
|
||||
{{ t("settings.serviceIdentitySetup.fieldAlias") }}
|
||||
<span class="text-xs opacity-60"
|
||||
<span class="text-text-secondary text-xs"
|
||||
>({{ detectedServiceFields.length + unseenServiceFields.length }})</span
|
||||
>
|
||||
</template>
|
||||
@@ -438,7 +438,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OIcon name="check-circle" size="sm" />
|
||||
<div class="text-compact min-w-0 flex-1 leading-tight">
|
||||
{{ t("settings.serviceIdentitySetup.workloadDetectedUsingFields") }}
|
||||
<span class="text-xs opacity-60">({{ trackedAliasIds.length }})</span>
|
||||
<span class="text-text-secondary text-xs">({{ trackedAliasIds.length }})</span>
|
||||
</div>
|
||||
<OIcon
|
||||
:name="trackedAliasExpanded ? 'keyboard-arrow-up' : 'keyboard-arrow-down'"
|
||||
|
||||
@@ -88,7 +88,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="refresh"
|
||||
:loading="listLoading"
|
||||
data-test="synthetics-locations-refresh-btn"
|
||||
@@ -127,7 +127,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-else
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
:data-test="`synthetics-locations-${row.id}-${row.enabled ? 'disable' : 'enable'}-btn`"
|
||||
@@ -148,7 +148,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`synthetics-locations-${row.id}-edit-btn`"
|
||||
data-row-action="edit"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('common.edit')"
|
||||
@click.stop="openEditDialog(row)"
|
||||
@@ -162,7 +162,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`synthetics-locations-${row.id}-delete-btn`"
|
||||
data-row-action="delete"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
:title="t('common.delete')"
|
||||
@click.stop="confirmDelete(row)"
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
<div class="text-compact font-bold">
|
||||
{{ t("modelPricing.noMatchFound") }}
|
||||
</div>
|
||||
<div class="mt-0.5 text-xs opacity-70">
|
||||
<div class="text-text-secondary mt-0.5 text-xs">
|
||||
{{
|
||||
t("modelPricing.noMatchDesc", {
|
||||
modelName: testModelName,
|
||||
@@ -165,10 +165,10 @@
|
||||
<div
|
||||
class="rounded-default bg-surface-panel border-card-glass-border border px-3.5 py-3"
|
||||
>
|
||||
<div class="text-2xs mb-1.5 font-semibold opacity-55">
|
||||
<div class="text-2xs text-text-secondary mb-1.5 font-semibold">
|
||||
{{ t("modelPricing.troubleshootingTitle") }}
|
||||
</div>
|
||||
<ul class="m-0 ps-4 text-xs leading-[1.9] opacity-60">
|
||||
<ul class="text-text-secondary m-0 ps-4 text-xs leading-[1.9]">
|
||||
<li>{{ t("modelPricing.tip1") }}</li>
|
||||
<li>{{ t("modelPricing.tip2") }}</li>
|
||||
<li>{{ t("modelPricing.tip3") }}</li>
|
||||
@@ -191,12 +191,12 @@
|
||||
: t("modelPricing.matchFound")
|
||||
}}
|
||||
</div>
|
||||
<div class="mt-0.5 text-xs opacity-70">
|
||||
<div class="text-text-secondary mt-0.5 text-xs">
|
||||
<OCode truncate>{{ testResult.matched.name }}</OCode>
|
||||
</div>
|
||||
<div
|
||||
v-if="isApproximateMatch"
|
||||
class="mt-0.5 text-xs opacity-70"
|
||||
class="text-text-secondary mt-0.5 text-xs"
|
||||
data-test="test-match-approximate"
|
||||
>
|
||||
{{ t("modelPricing.approximateMatchDesc", { modelName: testModelName }) }}
|
||||
@@ -216,7 +216,7 @@
|
||||
<div
|
||||
class="border-card-glass-border rounded-default bg-surface-panel border px-3.5 py-3"
|
||||
>
|
||||
<div class="text-3xs mb-2 font-semibold opacity-40">
|
||||
<div class="text-2xs text-text-secondary mb-2 font-semibold">
|
||||
{{ t("modelPricing.matchPriority") }}
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-1.5">
|
||||
@@ -252,7 +252,7 @@
|
||||
<div class="text-compact font-bold">
|
||||
{{ testResult.tier || t("settings.testModelMatchDialog.defaultTier") }}
|
||||
</div>
|
||||
<div class="text-2xs mt-0.5 opacity-50" v-if="matchedTierDef?.condition">
|
||||
<div class="text-2xs text-text-secondary mt-0.5" v-if="matchedTierDef?.condition">
|
||||
{{ t("settings.testModelMatchDialog.condition") }}
|
||||
<OCode
|
||||
>{{ matchedTierDef.condition.usage_key }}
|
||||
@@ -261,7 +261,7 @@
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="text-2xs mt-0.5 flex items-center gap-1 opacity-50"
|
||||
class="text-2xs text-text-secondary mt-0.5 flex items-center gap-1"
|
||||
v-if="matchedTierWindows.length"
|
||||
data-test="test-match-tier-windows"
|
||||
>
|
||||
@@ -274,13 +274,13 @@
|
||||
<div
|
||||
v-for="(rule, rIdx) in matchedTierRules"
|
||||
:key="rIdx"
|
||||
class="text-2xs mt-0.5 opacity-50"
|
||||
class="text-2xs text-text-secondary mt-0.5"
|
||||
data-test="test-match-tier-rule"
|
||||
>
|
||||
<OCode>{{ formatTierRule(rule, t) }}</OCode>
|
||||
</div>
|
||||
<div
|
||||
class="text-2xs mt-0.5 opacity-50"
|
||||
class="text-2xs text-text-secondary mt-0.5"
|
||||
v-if="
|
||||
!matchedTierDef?.condition &&
|
||||
!matchedTierWindows.length &&
|
||||
@@ -296,10 +296,10 @@
|
||||
<div
|
||||
class="border-card-glass-border bg-surface-panel grid grid-cols-[1.5fr_1fr] gap-2 border-b px-3.5 py-1.75"
|
||||
>
|
||||
<span class="text-3xs font-semibold opacity-40">{{
|
||||
<span class="text-2xs text-text-secondary font-semibold">{{
|
||||
t("modelPricing.usageType")
|
||||
}}</span>
|
||||
<span class="text-3xs text-right font-semibold opacity-40">{{
|
||||
<span class="text-2xs text-text-secondary text-right font-semibold">{{
|
||||
t("modelPricing.pricePerMTokens")
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
@@ -292,7 +292,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-else
|
||||
:variant="(row as any).enabled ? 'ghost-destructive' : 'ghost'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="(row as any).enabled ? 'pause' : 'play-arrow'"
|
||||
class="max-md:hidden"
|
||||
:data-test="`${dataTest}-${(row as any).enabled ? 'pause' : 'enable'}-btn`"
|
||||
@@ -309,7 +309,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- Edit -->
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
:data-test="`${dataTest}-edit-btn`"
|
||||
@@ -321,7 +321,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- Duplicate -->
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
class="max-md:hidden"
|
||||
:data-test="`${dataTest}-duplicate-btn`"
|
||||
@@ -332,7 +332,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="drive-file-move"
|
||||
class="max-md:hidden"
|
||||
:data-test="`${dataTest}-move-btn`"
|
||||
@@ -356,7 +356,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-else
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="more-vert"
|
||||
:data-test="`${dataTest}-more-btn`"
|
||||
@click.stop
|
||||
|
||||
@@ -56,7 +56,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="refresh"
|
||||
:loading="loading"
|
||||
data-test="synthetics-variables-refresh-btn"
|
||||
@@ -127,14 +127,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:aria-label="t('common.edit')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
data-test="synthetics-variable-edit-btn"
|
||||
@click="openEdit(row)"
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="content-copy"
|
||||
data-test="synthetics-variable-duplicate-btn"
|
||||
@click="openDuplicate(row)"
|
||||
@@ -154,7 +154,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:aria-label="t('synthetics.promote.toGlobal')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="drive-file-move"
|
||||
:disabled="row.kind === 'secret'"
|
||||
data-test="synthetics-variable-promote-btn"
|
||||
@@ -165,7 +165,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="!environment && environments.length > 0"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="drive-file-move"
|
||||
data-test="synthetics-variable-split-btn"
|
||||
@click="openSplit(row)"
|
||||
@@ -175,7 +175,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:aria-label="t('common.delete')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete"
|
||||
data-test="synthetics-variable-delete-btn"
|
||||
@click="removeVariable(row)"
|
||||
|
||||
@@ -219,7 +219,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:data-test="`workflow-list-${row.name}-pause-start-action`"
|
||||
:data-row-action="row.enabled ? 'pause' : 'resume'"
|
||||
:variant="row.enabled ? 'ghost-destructive' : 'ghost-success'"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
class="max-md:hidden"
|
||||
@click.stop="toggleWorkflow(row)"
|
||||
@@ -232,7 +232,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:data-test="`workflow-list-${row.name}-view`"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="visibility"
|
||||
:title="t('workflow.view')"
|
||||
>
|
||||
@@ -243,7 +243,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:data-test="`workflow-list-${row.name}-edit`"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
@click.stop="editWorkflow(row)"
|
||||
@@ -254,7 +254,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="!row.is_draft"
|
||||
:data-test="`workflow-list-${row.name}-move`"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="drive-file-move"
|
||||
:title="t('workflow.moveToFolder')"
|
||||
@click.stop="openMoveDialog(row)"
|
||||
@@ -266,7 +266,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:aria-label="t('common.moreActions')"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="more-vert"
|
||||
:data-test="`workflow-list-${row.name}-more-options`"
|
||||
@click.stop
|
||||
|
||||
@@ -73,7 +73,7 @@ export const PREDEFINED_THEMES: PredefinedTheme[] = [
|
||||
id: 10,
|
||||
name: raw("O2 Signature"),
|
||||
light: {
|
||||
themeColor: "#6B76E3",
|
||||
themeColor: "#5A64DB",
|
||||
},
|
||||
dark: {
|
||||
themeColor: "#8B8DF0",
|
||||
|
||||
@@ -390,8 +390,8 @@ const sizeClasses: Record<NonNullable<ButtonProps["size"]>, string> = {
|
||||
// 34px control height — the workhorse compact button that pairs with 34px
|
||||
// inputs in toolbars/headers. (radius 8 = rounded-default.)
|
||||
sm: "h-[2.125rem] ps-3 pe-3 text-sm gap-2 rounded-default",
|
||||
// 30px labeled — matches icon-toolbar height for labeled outline buttons in toolbars
|
||||
"sm-toolbar": "h-[1.875rem] ps-2 pe-2 text-xs gap-1.5 rounded-default",
|
||||
// Every toolbar control shares this box so a bar never mixes heights or padding.
|
||||
"sm-toolbar": "h-8.5 ps-2.5 pe-2.5 text-xs gap-1.5 rounded-default",
|
||||
"xs-grouped": "h-6.5 ps-2 pe-2 text-xs gap-1.5 rounded-default",
|
||||
// Compact labeled size for inline field chips (axis items) — ~28px, matches the dense button size
|
||||
// Extra-compact chip size — 24px height for axis field chips in query builder
|
||||
@@ -418,8 +418,8 @@ const sizeClasses: Record<NonNullable<ButtonProps["size"]>, string> = {
|
||||
"icon-lg": "h-12 w-12 shrink-0 p-0 rounded-default gap-x-0",
|
||||
"icon-circle": "size-8 shrink-0 p-0 rounded-full gap-x-0",
|
||||
"icon-circle-sm": "size-7 shrink-0 p-0 rounded-full gap-x-0",
|
||||
// 30×30px square — for toolbar icon buttons (auto-refresh, share, hamburger)
|
||||
"icon-toolbar": "size-[1.875rem] shrink-0 p-0 rounded-default gap-x-0",
|
||||
// Square twin of sm-toolbar for icon-only toolbar controls.
|
||||
"icon-toolbar": "size-8.5 shrink-0 p-0 rounded-default gap-x-0",
|
||||
// 26px rounded-default — compact modern icon button for panel header collapse/expand
|
||||
"icon-panel": "size-6.5 shrink-0 p-0 rounded-default gap-x-0",
|
||||
// Tall narrow vertical rectangle — 32px × 20px for splitter collapse/expand buttons
|
||||
|
||||
@@ -182,7 +182,7 @@ const onNativeCopy = () => {
|
||||
<i class="bg-warning block size-2.5 rounded-full" />
|
||||
<i class="bg-status-positive block size-2.5 rounded-full" />
|
||||
</span>
|
||||
<span class="o2-code-lang text-2xs font-mono opacity-55">{{
|
||||
<span class="o2-code-lang text-text-body font-mono text-xs">{{
|
||||
t("components.codeBlock.terminal")
|
||||
}}</span>
|
||||
</span>
|
||||
@@ -195,7 +195,7 @@ const onNativeCopy = () => {
|
||||
filename || lang || t("common.plainText")
|
||||
}}</span>
|
||||
</span>
|
||||
<span v-else class="o2-code-lang text-2xs font-mono opacity-55">{{
|
||||
<span v-else class="o2-code-lang text-text-body font-mono text-xs">{{
|
||||
lang || t("common.plainText")
|
||||
}}</span>
|
||||
<div class="flex items-center gap-1">
|
||||
|
||||
@@ -141,9 +141,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<slot name="title">{{ title }}</slot>
|
||||
</OTruncatedText>
|
||||
<!-- Fixed-height subtitle band: keeps the <h1> at an identical Y whether
|
||||
the subtitle is present or not, so the title doesn't appear to shift
|
||||
when navigating between views. Content is vertically centered. -->
|
||||
<!-- A page without a subtitle centres its title lower than one with a subtitle. -->
|
||||
<OText
|
||||
v-if="hasSubtitle()"
|
||||
variant="meta"
|
||||
|
||||
@@ -95,12 +95,10 @@ function handleClick(e: MouseEvent) {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- `h-8!` beats sm-toolbar's own 30px, so this matches the 32px icon-sm buttons beside it. -->
|
||||
<OButton
|
||||
v-if="layout === 'inline'"
|
||||
:variant="variant"
|
||||
size="sm-toolbar"
|
||||
class="h-8!"
|
||||
icon-left="refresh"
|
||||
:loading="loading"
|
||||
:disabled="disabled"
|
||||
|
||||
@@ -61,7 +61,7 @@ function resetToDefault(): void {
|
||||
<div class="relative inline-flex">
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-toolbar"
|
||||
:aria-label="
|
||||
hiddenCount > 0
|
||||
? t('common.manageColumnsHidden', { count: hiddenCount })
|
||||
@@ -83,7 +83,7 @@ function resetToDefault(): void {
|
||||
</OButton>
|
||||
<span
|
||||
v-if="hiddenCount > 0"
|
||||
class="bg-count-badge-bg text-3xs pointer-events-none absolute -top-1 -right-1 inline-flex h-4 w-4 items-center justify-center rounded-full leading-none font-medium text-white"
|
||||
class="bg-count-badge-bg text-2xs pointer-events-none absolute -top-1 -right-1 inline-flex h-4 w-4 items-center justify-center rounded-full leading-none font-medium text-white"
|
||||
data-test="o2-table-column-toggle-hidden-badge"
|
||||
>
|
||||
{{ hiddenCount }}
|
||||
|
||||
@@ -137,7 +137,7 @@ const selectionLabel = computed(() => {
|
||||
v-model="pageSizeModel"
|
||||
:options="pageSizeSelectOptions"
|
||||
:searchable="false"
|
||||
size="sm"
|
||||
size="xs"
|
||||
:aria-label="t('search.recordsPerPage')"
|
||||
data-test="o2-table-page-size-select"
|
||||
/>
|
||||
@@ -146,7 +146,7 @@ const selectionLabel = computed(() => {
|
||||
<nav class="flex items-center gap-1" :aria-label="t('components.pagination.pagination')">
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon"
|
||||
size="icon-xs-sq"
|
||||
:disabled="isFirstPage"
|
||||
:aria-label="t('search.firstPage')"
|
||||
data-test="o2-table-first-page-btn"
|
||||
@@ -156,7 +156,7 @@ const selectionLabel = computed(() => {
|
||||
</OButton>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon"
|
||||
size="icon-xs-sq"
|
||||
:disabled="isFirstPage"
|
||||
:aria-label="t('components.pagination.previousPage')"
|
||||
data-test="o2-table-prev-page-btn"
|
||||
@@ -166,7 +166,7 @@ const selectionLabel = computed(() => {
|
||||
</OButton>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon"
|
||||
size="icon-xs-sq"
|
||||
:disabled="isLastPage"
|
||||
:aria-label="t('components.pagination.nextPage')"
|
||||
data-test="o2-table-next-page-btn"
|
||||
@@ -177,7 +177,7 @@ const selectionLabel = computed(() => {
|
||||
<OButton
|
||||
v-if="totalCountExact"
|
||||
variant="outline"
|
||||
size="icon"
|
||||
size="icon-xs-sq"
|
||||
:disabled="isLastPage"
|
||||
:aria-label="t('search.lastPage')"
|
||||
data-test="o2-table-last-page-btn"
|
||||
|
||||
@@ -38,6 +38,7 @@ function handleUpdate(val: CheckboxModelValue) {
|
||||
:model-value="checkboxModel"
|
||||
:data-test="`o2-table-select-${rowId ?? 'header'}`"
|
||||
size="sm"
|
||||
class="align-middle"
|
||||
:aria-label="label"
|
||||
:disabled="disabled"
|
||||
@update:model-value="handleUpdate"
|
||||
|
||||
@@ -74,9 +74,9 @@ const dropIndicatorClass = computed<string>(() => {
|
||||
});
|
||||
|
||||
const sizeClasses: Record<NonNullable<ToggleGroupItemProps["size"]>, string> = {
|
||||
md: "h-9 px-3 text-sm max-md:px-2",
|
||||
sm: "h-7 px-2.5 text-xs max-md:px-1.5",
|
||||
xs: "h-5 px-1.5 text-xs max-md:px-1",
|
||||
md: "h-9 gap-2 px-3 text-sm max-md:px-2",
|
||||
sm: "h-7 gap-1.5 px-2.5 text-xs max-md:px-1.5",
|
||||
xs: "h-5 gap-2 px-1.5 text-xs max-md:px-1",
|
||||
};
|
||||
|
||||
// Icon size mirrors the toggle size
|
||||
@@ -138,7 +138,7 @@ const iconSize: Record<NonNullable<ToggleGroupItemProps["size"]>, "xs" | "sm" |
|
||||
:aria-hidden="unavailable || undefined"
|
||||
:class="[
|
||||
// Layout
|
||||
'inline-flex items-center justify-center gap-2',
|
||||
'inline-flex items-center justify-center',
|
||||
sizeClasses[props.size],
|
||||
// Base state - inactive (transparent on track)
|
||||
'bg-toggle-item-bg text-toggle-item-text font-medium whitespace-nowrap',
|
||||
|
||||
@@ -31,6 +31,8 @@ const { lgUp } = useBreakpoint();
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
/** Puts the label under the value, so a narrow tile keeps its full label. */
|
||||
stacked?: boolean;
|
||||
label?: I18nText;
|
||||
value?: string | number;
|
||||
/**
|
||||
@@ -154,7 +156,7 @@ const trendClass = computed(() =>
|
||||
:is="clickable ? 'button' : 'div'"
|
||||
:type="clickable ? 'button' : undefined"
|
||||
:aria-pressed="clickable ? String(selected) : undefined"
|
||||
class="rounded-default bg-surface-base flex min-w-0 flex-col justify-center gap-1 overflow-hidden border px-2.5 py-1 text-left transition-colors max-lg:px-1.5"
|
||||
class="rounded-default bg-surface-base flex min-w-0 flex-col justify-center gap-1.5 overflow-hidden border px-2.5 py-2 text-left transition-colors max-lg:px-1.5"
|
||||
:class="[
|
||||
selected ? 'border-accent' : 'border-border-default',
|
||||
clickable ? 'cursor-pointer' : '',
|
||||
@@ -164,7 +166,10 @@ const trendClass = computed(() =>
|
||||
:data-test="dataTest"
|
||||
>
|
||||
<div class="flex min-w-0 items-center justify-between gap-2">
|
||||
<div class="flex min-w-0 items-baseline gap-1.5">
|
||||
<div
|
||||
class="flex min-w-0"
|
||||
:class="stacked ? 'flex-col items-start gap-1' : 'items-baseline gap-1.5'"
|
||||
>
|
||||
<!-- The VALUE never shrinks: it is the payload, and a clipped "499.51…" is
|
||||
a useless number. When the tile is too narrow (5 tiles on a laptop),
|
||||
the squeeze is absorbed by the label, which truncates but stays: a
|
||||
|
||||
@@ -41,6 +41,8 @@ const props = withDefaults(
|
||||
* Leave off for the standard strip — long labels need the wider basis.
|
||||
*/
|
||||
compact?: boolean;
|
||||
/** Puts each label under its value, for strips too narrow to fit them side by side. */
|
||||
stacked?: boolean;
|
||||
}>(),
|
||||
{
|
||||
items: () => [],
|
||||
@@ -86,6 +88,7 @@ const onCardClick = (item: StatItem) => {
|
||||
:key="item.key"
|
||||
class="grow max-lg:shrink-0 max-lg:basis-auto"
|
||||
:class="compact ? 'basis-36' : 'basis-52'"
|
||||
:stacked="stacked"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
:sub="item.sub"
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/* Button — outline */
|
||||
--color-button-outline-text: var(--color-text-heading);
|
||||
--color-button-outline-border: var(--color-border-default);
|
||||
--color-button-outline-border: var(--color-border-control);
|
||||
--color-button-outline-hover-bg: var(--color-interactive-hover-bg);
|
||||
--color-button-outline-hover-border: var(--color-primary-300);
|
||||
--color-button-outline-active-bg: var(--color-surface-accent-active);
|
||||
@@ -191,7 +191,7 @@
|
||||
|
||||
/* Tabs */
|
||||
--color-tabs-indicator: var(--color-primary-600);
|
||||
--color-tabs-active-text: var(--color-primary-600);
|
||||
--color-tabs-active-text: var(--color-primary-700);
|
||||
--color-tabs-active-bg: var(--color-surface-accent-active);
|
||||
--color-tabs-inactive-text: var(--color-text-heading);
|
||||
--color-tabs-hover-text: var(--color-text-heading);
|
||||
|
||||
@@ -897,18 +897,6 @@ export const CONTRAST_PAIRS: readonly ContrastPair[] = [
|
||||
issue: "WCAG-AA colour remediation (follow-up PR)",
|
||||
themes: ["dark"],
|
||||
},
|
||||
{
|
||||
fg: "--color-text-label",
|
||||
category: "pending",
|
||||
why: "fails the threshold against the page surface it is painted on",
|
||||
issue: "WCAG-AA colour remediation (follow-up PR)",
|
||||
},
|
||||
{
|
||||
fg: "--color-text-muted",
|
||||
category: "pending",
|
||||
why: "fails the threshold against the page surface it is painted on",
|
||||
issue: "WCAG-AA colour remediation (follow-up PR)",
|
||||
},
|
||||
{
|
||||
fg: "--color-thread-tool-link",
|
||||
category: "pending",
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
--color-text-soft: var(--color-grey-200); /* feeds --color-select-text (OSelect trigger value) */
|
||||
--color-text-body: var(--color-grey-300); /* paragraphs, default body */
|
||||
--color-text-secondary: var(--color-grey-400); /* supporting text, descriptions */
|
||||
--color-text-label: var(--color-grey-500); /* form labels, metadata */
|
||||
--color-text-muted: var(--color-grey-500); /* de-emphasized */
|
||||
--color-text-label: var(--color-grey-400); /* form labels, metadata */
|
||||
--color-text-muted: var(--color-grey-400); /* de-emphasized */
|
||||
--color-text-disabled: var(--color-grey-600); /* dimmer than labels so disabled reads disabled */
|
||||
/* Between grey-500 and grey-400: the lowest grey that clears 4.5:1 on the dark canvas without matching secondary text. */
|
||||
--color-text-placeholder: #7c7c7c;
|
||||
@@ -525,7 +525,7 @@
|
||||
--color-dialog-close-active-bg: var(--d-border);
|
||||
|
||||
/* Pagination */
|
||||
--color-pagination-item-active-bg: var(--color-primary-500);
|
||||
--color-pagination-item-active-bg: var(--color-primary-800);
|
||||
|
||||
/* Timeline */
|
||||
--color-timeline-dot-primary: var(--color-primary-500);
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
--color-text-heading: var(--color-grey-800); /* h1-h6, modal titles, page/panel titles */
|
||||
--color-text-body: var(--color-grey-700); /* paragraphs, default body */
|
||||
--color-text-secondary: var(--color-grey-500); /* supporting text, descriptions, captions */
|
||||
--color-text-label: var(--color-grey-400); /* form labels, metadata, badges */
|
||||
--color-text-muted: var(--color-grey-300); /* disabled, placeholder, de-emphasized */
|
||||
--color-text-label: var(--color-grey-500); /* form labels, metadata, badges */
|
||||
--color-text-muted: var(--color-grey-500); /* disabled, absent, de-emphasized */
|
||||
/* label, disabled, border-strong and scrollbar-thumb-hover share grey-400 but stay separate tokens so each can diverge. */
|
||||
--color-text-disabled: var(--color-grey-400);
|
||||
/* grey-500, not grey-400: placeholder text must clear 4.5:1 on white. */
|
||||
|
||||
@@ -97,7 +97,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<span
|
||||
v-else
|
||||
:data-test="`logs-search-stream-group-label-${group.id}`"
|
||||
class="text-text-secondary mb-0.5 text-center text-xs font-medium"
|
||||
class="text-text-secondary mb-0.5 text-left text-xs font-medium"
|
||||
>
|
||||
{{ group.label }}
|
||||
</span>
|
||||
|
||||
@@ -51,7 +51,9 @@ describe("SearchBar — Drill down mode toggle", () => {
|
||||
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(function (
|
||||
this: HTMLElement,
|
||||
) {
|
||||
const isToolbarBar = this.classList.contains("border-b-card-glass-border");
|
||||
const isToolbarBar =
|
||||
this.classList.contains("border-border-default") &&
|
||||
this.classList.contains("overflow-hidden");
|
||||
return { width: isToolbarBar ? toolbarWidth : 0 } as DOMRect;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -38,7 +38,9 @@ describe("SearchBar — pinned saved views", () => {
|
||||
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(function (
|
||||
this: HTMLElement,
|
||||
) {
|
||||
const isToolbarBar = this.classList.contains("border-b-card-glass-border");
|
||||
const isToolbarBar =
|
||||
this.classList.contains("border-border-default") &&
|
||||
this.classList.contains("overflow-hidden");
|
||||
return { width: isToolbarBar ? toolbarWidth : 0 } as DOMRect;
|
||||
});
|
||||
}
|
||||
@@ -66,14 +68,14 @@ describe("SearchBar — pinned saved views", () => {
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
|
||||
it("gives the list trigger the grouped xs size with an icon and a caret", async () => {
|
||||
it("gives the list trigger the toolbar size with an icon and a caret", async () => {
|
||||
wrapper = mountSearchBar(1600);
|
||||
await flushPromises();
|
||||
|
||||
const trigger = group()
|
||||
.findAllComponents({ name: "OButton" })
|
||||
.find((b) => b.attributes("data-test") === "logs-search-bar-saved-views-pinned-list-btn")!;
|
||||
expect(trigger.props("size")).toBe("xs-grouped");
|
||||
expect(trigger.props("size")).toBe("sm-toolbar");
|
||||
const icons = trigger.findAllComponents({ name: "OIcon" }).map((c) => c.props("name"));
|
||||
expect(icons).toEqual(["saved-search", "arrow-drop-down"]);
|
||||
});
|
||||
@@ -104,7 +106,7 @@ describe("SearchBar — pinned saved views", () => {
|
||||
group().find('[data-test="logs-search-bar-saved-views-pinned-create-btn"]').classes(),
|
||||
).toContain("size-8!");
|
||||
expect(wrapper!.find('[data-test="logs-search-bar-reset-filters-btn"]').classes()).toContain(
|
||||
"h-[2.125rem]!",
|
||||
"h-8.5",
|
||||
);
|
||||
});
|
||||
|
||||
@@ -255,12 +257,12 @@ describe("SearchBar — pinned saved views", () => {
|
||||
expect(group().exists()).toBe(false);
|
||||
});
|
||||
|
||||
// 89px = 1px border + 54px list trigger + 1px separator + 32px create button + 1px border.
|
||||
// 93px = 1px border + 58px list trigger + 1px separator + 32px create button + 1px border.
|
||||
it.each([
|
||||
[698, false],
|
||||
[699, true],
|
||||
[680, false],
|
||||
[681, true],
|
||||
])(
|
||||
"budgets the group at its rendered 89px width (toolbar %ipx → shown: %s)",
|
||||
"budgets the group at its rendered 93px width (toolbar %ipx → shown: %s)",
|
||||
async (width, shown) => {
|
||||
const otherPins = (["histogram", "sqlMode", "quickMode", "syntaxGuide"] as const).filter(
|
||||
(key) => isPinned(key),
|
||||
|
||||
@@ -28,7 +28,7 @@ const router = createRouter({
|
||||
});
|
||||
|
||||
// The view-mode OToggleGroup is 34px tall (28px sm items + 2px track padding each side + 1px border each side).
|
||||
const TOGGLE_GROUP_HEIGHT_CLASS = "h-[2.125rem]!";
|
||||
const TOGGLE_GROUP_HEIGHT_CLASS = "h-8.5";
|
||||
|
||||
describe("SearchBar — toolbar controls match the view-mode toggle height", () => {
|
||||
let wrapper: VueWrapper<any> | undefined;
|
||||
@@ -41,7 +41,9 @@ describe("SearchBar — toolbar controls match the view-mode toggle height", ()
|
||||
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(function (
|
||||
this: HTMLElement,
|
||||
) {
|
||||
const isToolbarBar = this.classList.contains("border-b-card-glass-border");
|
||||
const isToolbarBar =
|
||||
this.classList.contains("border-border-default") &&
|
||||
this.classList.contains("overflow-hidden");
|
||||
return { width: isToolbarBar ? toolbarWidth : 0 } as DOMRect;
|
||||
});
|
||||
}
|
||||
@@ -121,20 +123,19 @@ describe("SearchBar — toolbar controls match the view-mode toggle height", ()
|
||||
"logs-search-bar-more-options-btn",
|
||||
"logs-search-bar-share-link-btn",
|
||||
]) {
|
||||
expect(classesOf(dataTest)).toContain("size-[2.125rem]!");
|
||||
expect(classesOf(dataTest)).toContain("h-8.5");
|
||||
}
|
||||
for (const dataTest of [
|
||||
"logs-search-bar-function-editor-pinned-btn",
|
||||
"logs-search-bar-date-time-dropdown",
|
||||
"logs-search-bar-refresh-btn",
|
||||
"logs-search-bar-refresh-cache-dropdown-trigger",
|
||||
]) {
|
||||
expect(classesOf(dataTest)).toContain(TOGGLE_GROUP_HEIGHT_CLASS);
|
||||
}
|
||||
expect(classesOf("logs-search-bar-refresh-cache-dropdown-trigger")).toContain("size-8.5");
|
||||
expect(classesOf("logs-search-bar-date-time-dropdown")).toContain("h-8.5!");
|
||||
const runButton = wrapper.get('[data-test="logs-search-bar-refresh-btn"]').element;
|
||||
expect(runButton.nextElementSibling!.classList).toContain(TOGGLE_GROUP_HEIGHT_CLASS);
|
||||
const interval = wrapper.get('[data-test="logs-search-bar-refresh-interval-btn"]').element;
|
||||
expect(interval.parentElement!.classList).toContain("*:size-[2.125rem]!");
|
||||
expect(runButton.nextElementSibling!.classList).toContain("h-8.5!");
|
||||
expect(classesOf("logs-search-bar-refresh-interval-btn")).toContain("size-8.5");
|
||||
// A 1px group border around 2rem buttons makes the function selector 34px.
|
||||
for (const dataTest of [
|
||||
"logs-search-bar-function-dropdown",
|
||||
|
||||
@@ -51,7 +51,13 @@ describe("SearchBar — toolbar controls are spaced only by the row gap", () =>
|
||||
vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(function (
|
||||
this: HTMLElement,
|
||||
) {
|
||||
return { width: this.classList.contains("border-b-card-glass-border") ? 1600 : 0 } as DOMRect;
|
||||
return {
|
||||
width:
|
||||
this.classList.contains("border-border-default") &&
|
||||
this.classList.contains("overflow-hidden")
|
||||
? 1600
|
||||
: 0,
|
||||
} as DOMRect;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -65,7 +71,7 @@ describe("SearchBar — toolbar controls are spaced only by the row gap", () =>
|
||||
const marginClassesOf = (el: Element) =>
|
||||
[...el.classList].filter((c) => UNPREFIXED_HORIZONTAL_MARGIN.test(c));
|
||||
|
||||
it("adds no horizontal margin on top of the gap-1 between adjacent controls", async () => {
|
||||
it("adds no horizontal margin on top of the row gap between adjacent controls", async () => {
|
||||
wrapper = mount(SearchBar, {
|
||||
attachTo: document.body,
|
||||
global: {
|
||||
@@ -78,8 +84,8 @@ describe("SearchBar — toolbar controls are spaced only by the row gap", () =>
|
||||
|
||||
const left = wrapper.vm.$refs.toolbarLeftRef as HTMLElement;
|
||||
const collapsible = left.firstElementChild as HTMLElement;
|
||||
expect(left.classList).toContain("gap-1");
|
||||
expect(collapsible.classList).toContain("gap-1");
|
||||
expect(left.classList).toContain("gap-2");
|
||||
expect(collapsible.classList).toContain("gap-2");
|
||||
|
||||
const more = wrapper.get('[data-test="logs-search-bar-utilities-menu-btn"]');
|
||||
expect(marginClassesOf(more.element)).toEqual([]);
|
||||
|
||||
@@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template>
|
||||
<div class="logs-search-bar-component" id="searchBarComponent">
|
||||
<div
|
||||
class="solid border-b-card-glass-border m-0! flex w-full items-center! overflow-hidden border-b p-1.5! max-md:flex-wrap max-md:gap-y-1 max-md:overflow-visible"
|
||||
class="solid border-border-default m-0! flex w-full items-center! overflow-hidden border-b p-1.5! max-md:flex-wrap max-md:gap-y-1 max-md:overflow-visible"
|
||||
>
|
||||
<div
|
||||
ref="toolbarLeftRef"
|
||||
class="flex min-w-0 flex-1 flex-nowrap items-center gap-1 max-md:w-full max-md:flex-none"
|
||||
class="flex min-w-0 flex-1 flex-nowrap items-center gap-2 max-md:w-full max-md:flex-none"
|
||||
>
|
||||
<!-- Collapsible region — clips its overflow so the More button (a
|
||||
shrink-0 sibling below) always stays visible. Pinned items hide via
|
||||
@@ -30,15 +30,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
sits right after the pinned items instead of being pushed to the
|
||||
far right; it still shrinks + clips when content overflows. -->
|
||||
<div
|
||||
class="-my-1 flex min-w-0 flex-initial flex-nowrap items-center gap-1 overflow-hidden py-1"
|
||||
class="-my-1 flex min-w-0 flex-initial flex-nowrap items-center gap-2 overflow-hidden py-1"
|
||||
>
|
||||
<!-- View Mode: Dropdown when very narrow, Toggle Group otherwise -->
|
||||
<ODropdown v-if="toolbarToggleAsDropdown" side="bottom" align="start">
|
||||
<template #trigger>
|
||||
<OButton
|
||||
data-test="logs-view-mode-dropdown-btn"
|
||||
size="xs"
|
||||
class="h-[2.125rem]!"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
icon-right="arrow-drop-down"
|
||||
>
|
||||
@@ -153,8 +152,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="!toolbarMoveResetToMenu"
|
||||
data-test="logs-search-bar-reset-filters-btn"
|
||||
size="xs"
|
||||
class="h-[2.125rem]!"
|
||||
:size="shouldHideToolbarButtonText ? 'icon-toolbar' : 'sm-toolbar'"
|
||||
variant="outline"
|
||||
@click="resetFilters"
|
||||
>
|
||||
@@ -173,9 +171,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="showPinnedHistogram"
|
||||
as="div"
|
||||
data-test="logs-search-bar-histogram-btn"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
class="h-[2.125rem]! gap-1.5"
|
||||
@click="searchObj.meta.showHistogram = !searchObj.meta.showHistogram"
|
||||
>
|
||||
<OSwitch
|
||||
@@ -200,9 +197,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="showPinnedSqlMode"
|
||||
as="div"
|
||||
data-test="logs-search-bar-sql-mode-pinned-btn"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
class="h-[2.125rem]! gap-1.5"
|
||||
@click="!isSqlModeDisabled && (searchObj.meta.sqlMode = !searchObj.meta.sqlMode)"
|
||||
>
|
||||
<OSwitch
|
||||
@@ -221,9 +217,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="showPinnedQuickMode"
|
||||
as="div"
|
||||
data-test="logs-search-bar-quick-mode-pinned-btn"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
class="h-[2.125rem]! gap-1.5"
|
||||
@click="handleQuickMode"
|
||||
>
|
||||
<OSwitch
|
||||
@@ -259,7 +254,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
data-test="logs-search-bar-saved-views-pinned-list-btn"
|
||||
variant="ghost"
|
||||
size="xs-grouped"
|
||||
size="sm-toolbar"
|
||||
class="h-8!"
|
||||
>
|
||||
<OIcon name="saved-search" size="sm" />
|
||||
@@ -320,10 +315,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #trigger>
|
||||
<OButton
|
||||
data-test="logs-search-bar-utilities-menu-btn"
|
||||
class="rounded-default hover:bg-button-outline-hover-bg h-[2.125rem]! p-1! text-xs font-medium [border:0.0625rem_solid_var(--color-button-outline-border)]! [transition:all_0.2s_ease] max-md:ms-auto"
|
||||
class="max-md:ms-auto"
|
||||
icon-left="more-horiz"
|
||||
variant="outline"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
>
|
||||
{{ t("search.menuMore") }}
|
||||
</OButton>
|
||||
@@ -566,7 +561,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
<div
|
||||
ref="toolbarRightRef"
|
||||
class="flex flex-shrink-0 items-center gap-1 max-md:w-full max-md:justify-end"
|
||||
class="flex flex-shrink-0 items-center gap-2 max-md:w-full max-md:justify-end"
|
||||
>
|
||||
<OPageHeaderStatus />
|
||||
<template v-if="searchObj.meta.showTransformEditor && !shouldMoveShareToMenu">
|
||||
@@ -589,9 +584,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #trigger>
|
||||
<OButton
|
||||
data-test="logs-search-bar-more-options-btn"
|
||||
class="download-logs-btn hover:bg-interactive-hover-bg! order-4 size-[2.125rem]!"
|
||||
class="download-logs-btn hover:bg-interactive-hover-bg! order-4"
|
||||
variant="outline"
|
||||
size="icon-toolbar"
|
||||
size="icon-md"
|
||||
>
|
||||
<OIcon name="menu" size="sm" />
|
||||
<OTooltip max-width="7rem" :content="t('search.moreActions')" />
|
||||
@@ -852,19 +847,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="logs-search-bar-share-link-btn"
|
||||
:url="shareURL"
|
||||
variant="outline"
|
||||
size="icon-toolbar"
|
||||
size="icon-md"
|
||||
:disabled="!!shareReason"
|
||||
:tooltip="shareReason || undefined"
|
||||
class="order-3 size-[2.125rem]!"
|
||||
class="order-3"
|
||||
/>
|
||||
<!-- Function Editor (pinned) — sits to the left of the date picker -->
|
||||
<OButton
|
||||
v-if="showPinnedFunctionEditor"
|
||||
as="div"
|
||||
data-test="logs-search-bar-function-editor-pinned-btn"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
class="order-1 me-1 h-[2.125rem]! gap-1.5"
|
||||
class="order-1"
|
||||
@click="searchObj.meta.showTransformEditor = !searchObj.meta.showTransformEditor"
|
||||
>
|
||||
<OSwitch
|
||||
@@ -877,7 +872,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTooltip :content="t('search.functionEditorLabel')" />
|
||||
</OButton>
|
||||
|
||||
<div class="order-1 me-1 max-md:me-auto">
|
||||
<div class="order-1 max-md:me-auto">
|
||||
<DateTime
|
||||
ref="dateTimeRef"
|
||||
auto-apply
|
||||
@@ -895,14 +890,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
@on:date-change="updateDateTime"
|
||||
@on:timezone-change="updateTimezone"
|
||||
:disable="disable"
|
||||
class="h-[2.125rem]!"
|
||||
class="h-8.5!"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="search-time order-2">
|
||||
<div class="flex">
|
||||
<div class="flex gap-2">
|
||||
<OButtonGroup
|
||||
class="border-card-glass-border me-1 border p-0"
|
||||
class="border-card-glass-border border p-0"
|
||||
v-if="
|
||||
config.isEnterprise == 'true' &&
|
||||
Object.keys(store.state.regionInfo).length > 0 &&
|
||||
@@ -961,7 +956,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:title="t('search.cancel')"
|
||||
variant="ghost"
|
||||
size="sm-toolbar"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
@click="cancelVisualizeQueries"
|
||||
>{{ t("search.cancel") }}</OButton
|
||||
>
|
||||
@@ -972,18 +967,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:title="t('search.runQuery')"
|
||||
:disabled="buildRunBlocked"
|
||||
size="sm-toolbar"
|
||||
class="bg-button-primary! text-button-primary-foreground! hover:shadow-button-primary/70 rounded-s-default! h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease] hover:opacity-90 hover:shadow-md"
|
||||
class="bg-button-primary! text-button-primary-foreground! hover:shadow-button-primary/70 rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease] hover:opacity-90 hover:shadow-md"
|
||||
@click="handleRunQueryFn()"
|
||||
>
|
||||
{{ t("search.runQuery") }}
|
||||
</OButton>
|
||||
<OSeparator class="h-[2.125rem]! w-px" vertical />
|
||||
<OSeparator class="h-8.5! w-px" vertical />
|
||||
<ODropdown align="end" side="bottom">
|
||||
<template #trigger>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-xs"
|
||||
class="h-[2.125rem]!"
|
||||
size="icon-toolbar"
|
||||
:aria-label="t('search.refreshCacheAndRunQuery')"
|
||||
data-test="logs-search-bar-refresh-cache-dropdown-trigger"
|
||||
:class="[
|
||||
@@ -1018,7 +1012,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
variant="ghost"
|
||||
:title="t('search.cancel')"
|
||||
size="sm-toolbar"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
@click="cancelVisualizeQueries"
|
||||
>{{ t("search.cancel") }}</OButton
|
||||
>
|
||||
@@ -1030,18 +1024,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:title="t('search.runQuery')"
|
||||
:disabled="buildRunBlocked || disable"
|
||||
size="sm-toolbar"
|
||||
class="bg-button-primary! text-button-primary-foreground! hover:shadow-button-primary/70 rounded-s-default! h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease] hover:opacity-90 hover:shadow-md"
|
||||
class="bg-button-primary! text-button-primary-foreground! hover:shadow-button-primary/70 rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease] hover:opacity-90 hover:shadow-md"
|
||||
@click="handleRunQueryFn()"
|
||||
>
|
||||
{{ t("search.runQuery") }}
|
||||
</OButton>
|
||||
<OSeparator class="h-[2.125rem]! w-px" vertical />
|
||||
<OSeparator class="h-8.5! w-px" vertical />
|
||||
<ODropdown align="end" side="bottom">
|
||||
<template #trigger>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-xs"
|
||||
class="h-[2.125rem]!"
|
||||
size="icon-toolbar"
|
||||
:aria-label="t('search.refreshCacheAndRunQuery')"
|
||||
data-test="logs-search-bar-refresh-cache-dropdown-trigger"
|
||||
:class="[
|
||||
@@ -1078,7 +1071,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
variant="ghost"
|
||||
:title="t('search.cancel')"
|
||||
size="sm-toolbar"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-default h-[2.125rem]! w-[5.875rem]! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-default min-w-[5.875rem] [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
@click="autoRun.engine.cancelGeneration(null, { cause: 'user' })"
|
||||
>{{ t("search.cancel") }}</OButton
|
||||
>
|
||||
@@ -1089,7 +1082,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
variant="primary"
|
||||
:title="t('search.cancel')"
|
||||
size="sm-toolbar"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
@click="cancelRun"
|
||||
>{{ t("search.cancel") }}</OButton
|
||||
>
|
||||
@@ -1102,7 +1095,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:variant="showRunQueryPending ? 'pending' : 'primary'"
|
||||
:title="t('search.runQuery')"
|
||||
size="sm-toolbar"
|
||||
class="rounded-s-default! relative h-[2.125rem]! w-[5.875rem]! rounded-e-none! p-0 px-1! text-center leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
class="rounded-s-default! relative min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,opacity_0.2s_ease]"
|
||||
:class="[
|
||||
showRunQueryPending
|
||||
? ''
|
||||
@@ -1136,15 +1129,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
<OSeparator
|
||||
v-if="!showRunQueryPending || isRunQueryCancelShown"
|
||||
class="h-[2.125rem]! w-px"
|
||||
class="h-8.5! w-px"
|
||||
vertical
|
||||
/>
|
||||
<ODropdown align="end" side="bottom">
|
||||
<template #trigger>
|
||||
<OButton
|
||||
:variant="showRunQueryPending && !isRunQueryCancelShown ? 'pending' : 'ghost'"
|
||||
size="icon-xs"
|
||||
class="h-[2.125rem]!"
|
||||
size="icon-toolbar"
|
||||
:aria-label="t('search.refreshCacheAndRunQuery')"
|
||||
data-test="logs-search-bar-refresh-cache-dropdown-trigger"
|
||||
:class="[
|
||||
@@ -1202,7 +1194,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</ODropdown>
|
||||
<!-- Compact Auto Refresh Button -->
|
||||
<AutoRefreshInterval
|
||||
class="ms-1 *:size-[2.125rem]!"
|
||||
class="ms-2"
|
||||
v-model="searchObj.meta.refreshInterval"
|
||||
:trigger="true"
|
||||
:is-compact="true"
|
||||
@@ -2432,10 +2424,10 @@ export default defineComponent({
|
||||
// Approximate rendered widths (px) of each pinned control and of the fixed
|
||||
// left-section content, used only to decide how many pinned items fit before
|
||||
// they would clip. Hidden pinned items stay reachable inside the More menu.
|
||||
const PIN_ITEM_WIDTH = { histogram: 46, sqlMode: 46, quickMode: 46, savedViews: 89 };
|
||||
const PIN_ITEM_WIDTH = { histogram: 72, sqlMode: 72, quickMode: 72, savedViews: 93 };
|
||||
const SYNTAX_GUIDE_LABEL_WIDTH = 108;
|
||||
const SYNTAX_GUIDE_ICON_WIDTH = 40;
|
||||
const PIN_ITEM_GAP = 4;
|
||||
const PIN_ITEM_GAP = 8;
|
||||
|
||||
// Width consumed by the always-present left content (toggle group in its
|
||||
// current collapse state, reset) plus the reserved More button.
|
||||
@@ -2444,8 +2436,8 @@ export default defineComponent({
|
||||
if (toolbarToggleAsDropdown.value) w += 120;
|
||||
else if (toolbarToggleIconOnly.value) w += 230;
|
||||
else w += 440;
|
||||
if (!toolbarMoveResetToMenu.value) w += shouldHideToolbarButtonText.value ? 40 : 88;
|
||||
w += 92; // More button (always visible)
|
||||
if (!toolbarMoveResetToMenu.value) w += shouldHideToolbarButtonText.value ? 34 : 80;
|
||||
w += 76; // More button (always visible)
|
||||
w += 24; // inter-item gaps / padding buffer
|
||||
return w;
|
||||
});
|
||||
|
||||
@@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- Field panel toggle — same style as add-panel config sidebar -->
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-xs-sq"
|
||||
size="icon-chip"
|
||||
class="ms-1.5 shrink-0"
|
||||
data-test="logs-search-field-list-collapse-btn"
|
||||
@click="isMobile ? $emit('open-mobile-fields') : toggleFieldList()"
|
||||
@@ -64,8 +64,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="text-warning flex min-w-0 flex-1 flex-wrap items-center gap-1.5 ps-2 text-left transition-opacity max-md:min-w-32"
|
||||
:class="{ 'opacity-60': summaryDimmed }"
|
||||
class="text-warning flex min-w-0 flex-1 flex-wrap items-center gap-1.5 ps-2 text-left max-md:min-w-32"
|
||||
data-test="logs-search-result-title"
|
||||
:data-search-state="
|
||||
searchObj.loading || searchObj.loadingCounter ? 'loading' : 'complete'
|
||||
@@ -78,14 +77,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTag
|
||||
type="logsResultChip"
|
||||
value="neutral"
|
||||
class="min-w-[26ch] tabular-nums"
|
||||
class="tabular-nums transition-opacity"
|
||||
:class="{ 'opacity-60': summaryDimmed }"
|
||||
data-test="logs-result-records-chip"
|
||||
>{{ recordsChips.records }}</OTag
|
||||
>
|
||||
<OTag
|
||||
type="logsResultChip"
|
||||
value="info"
|
||||
class="min-w-[10ch] tabular-nums max-md:hidden"
|
||||
class="tabular-nums transition-opacity max-md:hidden"
|
||||
:class="{ 'opacity-60': summaryDimmed }"
|
||||
data-test="logs-result-time-chip"
|
||||
>{{ recordsChips.time }}</OTag
|
||||
>
|
||||
@@ -93,7 +94,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="recordsChips.scan"
|
||||
type="logsResultChip"
|
||||
value="warn"
|
||||
class="max-md:hidden"
|
||||
class="transition-opacity max-md:hidden"
|
||||
:class="{ 'opacity-60': summaryDimmed }"
|
||||
data-test="logs-result-scan-chip"
|
||||
>{{ recordsChips.scan }}</OTag
|
||||
>
|
||||
@@ -457,7 +459,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
@keydown.esc="closePinnedTooltip"
|
||||
tabindex="-1"
|
||||
>
|
||||
<div class="oo-pin-tooltip__time">
|
||||
<div class="oo-pin-tooltip__time text-text-secondary">
|
||||
{{ pinnedTooltip.timestamp }}
|
||||
</div>
|
||||
<div v-for="row in pinnedTooltip.rows" :key="row.rawValue" class="oo-pin-tooltip__row">
|
||||
@@ -3435,7 +3437,6 @@ export default defineComponent({
|
||||
.oo-pin-tooltip__time {
|
||||
font-size: var(--text-2xs);
|
||||
font-weight: 500;
|
||||
opacity: 0.65;
|
||||
padding: 0 0.625rem 0.25rem;
|
||||
margin-bottom: 0;
|
||||
/* eslint-disable-next-line local/no-hardcoded-px -- hairline: a 1-device-pixel rule must not scale with text or it smears at fractional zoom */
|
||||
|
||||
@@ -411,15 +411,15 @@ describe("SyntaxGuide.vue", () => {
|
||||
wrapper = createWrapper({ toolbar: true, label: "Syntax Guide" });
|
||||
const button = wrapper.findComponent({ name: "OButton" });
|
||||
expect(button.props("variant")).toBe("outline");
|
||||
expect(button.classes()).toContain("h-[2.125rem]!");
|
||||
expect(button.classes()).toContain("h-8.5");
|
||||
expect(button.classes()).toContain("text-xs");
|
||||
});
|
||||
|
||||
// Test 42: non-toolbar variants keep their own height
|
||||
it("should not apply the toolbar height to the default or menu-item variants", () => {
|
||||
wrapper = createWrapper();
|
||||
expect(wrapper.findComponent({ name: "OButton" }).classes()).not.toContain("h-[2.125rem]!");
|
||||
expect(wrapper.findComponent({ name: "OButton" }).props("size")).not.toBe("sm-toolbar");
|
||||
wrapper = createWrapper({ menuItem: true });
|
||||
expect(wrapper.findComponent({ name: "OButton" }).classes()).not.toContain("h-[2.125rem]!");
|
||||
expect(wrapper.findComponent({ name: "OButton" }).props("size")).not.toBe("sm-toolbar");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -40,8 +40,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-else-if="toolbar"
|
||||
data-cy="syntax-guide-button"
|
||||
variant="outline"
|
||||
size="xs"
|
||||
:class="['h-[2.125rem]!', sqlmode ? 'sql-mode' : 'normal-mode']"
|
||||
:size="label ? 'sm-toolbar' : 'icon-toolbar'"
|
||||
:class="sqlmode ? 'sql-mode' : 'normal-mode'"
|
||||
>
|
||||
<OIcon name="help" size="sm" />
|
||||
<span v-if="label">{{ label }}</span>
|
||||
|
||||
@@ -53,7 +53,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template v-for="section in sections" :key="section.group">
|
||||
<span
|
||||
v-if="section.group > 0"
|
||||
class="text-3xs text-text-secondary shrink-0 tracking-wide uppercase select-none"
|
||||
class="text-2xs text-text-secondary shrink-0 tracking-wide uppercase select-none"
|
||||
:data-test="`metrics-explorer-label-group-join-${section.group}`"
|
||||
>{{
|
||||
section.position > 0
|
||||
@@ -87,7 +87,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- Said, not inferred: two adjacent chips read as either one, but they are always AND. -->
|
||||
<span
|
||||
v-if="i > 0"
|
||||
class="text-3xs text-text-secondary shrink-0 tracking-wide uppercase select-none"
|
||||
class="text-2xs text-text-secondary shrink-0 tracking-wide uppercase select-none"
|
||||
:title="t('metrics.explorer.labels.andSeparatorTitle')"
|
||||
data-test="metrics-explorer-label-and"
|
||||
>{{ t("metrics.explorer.labels.andSeparator") }}</span
|
||||
|
||||
@@ -105,6 +105,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
ref="dateTimePickerRef"
|
||||
v-model="selectedDate"
|
||||
data-test="metrics-date-picker"
|
||||
class="h-8.5!"
|
||||
:auto-apply-dashboard="mode === 'visualize'"
|
||||
calendar-presets
|
||||
@on:date-change="onDateChange"
|
||||
@@ -136,7 +137,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:variant="isVisualizePending ? 'pending' : 'primary'"
|
||||
size="sm-toolbar"
|
||||
class="w-[5.875rem]! px-1!"
|
||||
class="min-w-[5.875rem]"
|
||||
data-test="metrics-explorer-run"
|
||||
:data-run-pending="isVisualizePending ? 'true' : undefined"
|
||||
:aria-label="isVisualizePending ? t('search.runQueryPendingLabel') : undefined"
|
||||
@@ -150,7 +151,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
:variant="isVisualizePending ? 'pending' : 'primary'"
|
||||
size="icon-toolbar"
|
||||
class="w-5"
|
||||
icon-left="arrow-drop-down"
|
||||
:aria-label="t('metrics.runQueryOptions')"
|
||||
data-test="metrics-explorer-run-options"
|
||||
@@ -204,7 +204,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="shareUrl"
|
||||
:url="shareUrl"
|
||||
variant="outline"
|
||||
size="icon-toolbar"
|
||||
size="icon-md"
|
||||
data-test="metrics-explorer-share-btn"
|
||||
shortcut-id="metricsCopyUrl"
|
||||
/>
|
||||
|
||||
@@ -2341,24 +2341,25 @@ describe("SearchBar", () => {
|
||||
expect(separator.props("vertical")).toBe(true);
|
||||
});
|
||||
|
||||
it("is as tall as Reset and More: a hairline border around 1.625rem children", async () => {
|
||||
it("is as tall as Reset and More: a hairline border around full-height children", async () => {
|
||||
wrapper = mountSearchBar();
|
||||
await flushPromises();
|
||||
|
||||
const group = wrapper.find('[data-test="traces-search-bar-saved-views"]');
|
||||
expect(group.classes()).toContain("border");
|
||||
expect(group.classes()).toContain("p-0");
|
||||
expect(group.classes()).toContain("h-8.5");
|
||||
expect(group.find('[data-test="traces-search-bar-saved-views-btn"]').classes()).toContain(
|
||||
"h-6.5",
|
||||
"h-full!",
|
||||
);
|
||||
expect(
|
||||
group.find('[data-test="traces-search-bar-saved-views-create-btn"]').classes(),
|
||||
).toContain("size-6.5");
|
||||
).toContain("h-full!");
|
||||
for (const neighbour of [
|
||||
"traces-search-bar-reset-filters-btn",
|
||||
"traces-search-bar-more-menu-btn",
|
||||
]) {
|
||||
expect(wrapper.find(`[data-test="${neighbour}"]`).classes()).toContain("h-7");
|
||||
expect(wrapper.find(`[data-test="${neighbour}"]`).classes()).toContain("h-8.5");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -21,11 +21,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<div
|
||||
ref="toolbarLeftRef"
|
||||
class="flex min-w-0 flex-1 flex-row items-center gap-1.5 max-lg:w-full max-lg:flex-none max-lg:flex-wrap max-lg:gap-y-1"
|
||||
class="flex min-w-0 flex-1 flex-row items-center gap-2 max-lg:w-full max-lg:flex-none max-lg:flex-wrap max-lg:gap-y-1"
|
||||
>
|
||||
<!-- Clips its overflow so More, a shrink-0 sibling, is never clipped. -->
|
||||
<div
|
||||
class="flex min-w-0 flex-initial flex-row items-center gap-1.5 overflow-hidden max-lg:flex-wrap max-lg:gap-y-1 max-lg:overflow-visible"
|
||||
class="flex min-w-0 flex-initial flex-row items-center gap-2 overflow-hidden max-lg:flex-wrap max-lg:gap-y-1 max-lg:overflow-visible"
|
||||
>
|
||||
<!-- Unified View Toggle: Service Graph / Traces / Spans -->
|
||||
<OToggleGroup
|
||||
@@ -104,7 +104,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="!toolbarMoveResetToMenu"
|
||||
data-test="traces-search-bar-reset-filters-btn"
|
||||
variant="outline"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
@click="resetFilters"
|
||||
>
|
||||
<template #icon-left>
|
||||
@@ -117,9 +117,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
v-if="showPinnedMetrics"
|
||||
data-test="traces-search-bar-metrics-pinned-btn"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
variant="outline"
|
||||
class="gap-1.5"
|
||||
@click="searchObj.meta.showHistogram = !searchObj.meta.showHistogram"
|
||||
>
|
||||
<OSwitch v-model="searchObj.meta.showHistogram" size="md" @click.stop />
|
||||
@@ -130,7 +129,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButtonGroup
|
||||
v-if="showPinnedSavedViews"
|
||||
data-test="traces-search-bar-saved-views"
|
||||
class="border-button-outline-border shrink-0 border p-0"
|
||||
class="border-button-outline-border h-8.5 shrink-0 border p-0"
|
||||
>
|
||||
<ODropdown
|
||||
:open="savedViewsDropdownOpen"
|
||||
@@ -143,6 +142,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="traces-search-bar-saved-views-btn"
|
||||
variant="ghost"
|
||||
size="xs-grouped"
|
||||
class="h-full!"
|
||||
>
|
||||
<OIcon name="saved-search" size="sm" />
|
||||
<OIcon name="arrow-drop-down" size="sm" />
|
||||
@@ -167,6 +167,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="traces-search-bar-saved-views-create-btn"
|
||||
variant="ghost"
|
||||
size="icon-panel"
|
||||
class="h-full!"
|
||||
@click="openSaveViewDialog"
|
||||
>
|
||||
<OIcon name="save" size="sm" />
|
||||
@@ -185,7 +186,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OButton
|
||||
data-test="traces-search-bar-more-menu-btn"
|
||||
variant="outline"
|
||||
size="xs"
|
||||
size="sm-toolbar"
|
||||
icon-left="more-horiz"
|
||||
class="shrink-0 max-lg:ms-auto"
|
||||
>
|
||||
@@ -295,7 +296,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
searchObj.meta.searchMode !== 'service-graph' &&
|
||||
searchObj.meta.searchMode !== 'services-catalog'
|
||||
"
|
||||
class="flex items-center gap-1.5 max-lg:w-full max-lg:flex-wrap max-lg:justify-end max-lg:gap-y-1"
|
||||
class="flex items-center gap-2 max-lg:w-full max-lg:flex-wrap max-lg:justify-end max-lg:gap-y-1"
|
||||
>
|
||||
<OPageHeaderStatus />
|
||||
<DateTime
|
||||
@@ -312,7 +313,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
calendar-presets
|
||||
:queryRangeRestrictionInHour="searchObj.data.datetime.queryRangeRestrictionInHour"
|
||||
:queryRangeRestrictionMsg="searchObj.data.datetime.queryRangeRestrictionMsg"
|
||||
class="h-8 max-lg:me-auto max-md:[&_.date-time-label]:hidden"
|
||||
class="h-8.5! max-lg:me-auto max-md:[&_.date-time-label]:hidden"
|
||||
@on:date-change="updateDateTime"
|
||||
@on:timezone-change="updateTimezone"
|
||||
/>
|
||||
@@ -326,8 +327,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="config.isEnterprise == 'true' && isLoading"
|
||||
variant="ghost"
|
||||
data-test="traces-search-bar-cancel-btn"
|
||||
size="sm-toolbar"
|
||||
:title="t('search.cancel')"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! h-[1.875rem]! w-[5.875rem]! ![border-radius:0.375rem_0_0_0.375rem] p-0 px-1! py-0! text-center text-xs! leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,_opacity_0.2s_ease]"
|
||||
class="bg-cancel-query-bg! text-button-primary-foreground! rounded-s-default! min-w-[5.875rem] rounded-e-none! [transition:box-shadow_0.3s_ease,_opacity_0.2s_ease]"
|
||||
@click="cancelQueryData"
|
||||
>{{ t("search.cancel") }}</OButton
|
||||
>
|
||||
@@ -338,11 +340,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-cy="search-bar-refresh-button"
|
||||
:data-run-pending="showRunQueryPending ? 'true' : undefined"
|
||||
:aria-label="showRunQueryPending ? t('search.runQueryPendingLabel') : undefined"
|
||||
size="sm-toolbar"
|
||||
:title="t('search.runQuery')"
|
||||
class="h-[1.875rem]! w-[5.875rem]! p-0 px-1! py-0! text-center text-xs! leading-4! font-medium! break-words whitespace-normal [transition:box-shadow_0.3s_ease,_opacity_0.2s_ease]"
|
||||
class="min-w-[5.875rem] [transition:box-shadow_0.3s_ease,_opacity_0.2s_ease]"
|
||||
:class="[
|
||||
store.state.zoConfig.auto_query_enabled
|
||||
? '![border-radius:0.375rem_0_0_0.375rem]'
|
||||
? 'rounded-s-default! rounded-e-none!'
|
||||
: 'rounded-default',
|
||||
showRunQueryPending
|
||||
? ''
|
||||
@@ -368,13 +371,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/>
|
||||
{{ t("search.runQuery") }}
|
||||
</OButton>
|
||||
<OSeparator v-if="!showRunQueryPending" class="h-[1.875rem]! w-px" vertical />
|
||||
<OSeparator
|
||||
v-if="!showRunQueryPending && store.state.zoConfig.auto_query_enabled"
|
||||
class="h-8.5! w-px"
|
||||
vertical
|
||||
/>
|
||||
<ODropdown v-if="store.state.zoConfig.auto_query_enabled" side="bottom" align="end">
|
||||
<template #trigger>
|
||||
<OButton
|
||||
:aria-label="t('common.moreOptions')"
|
||||
:variant="showRunQueryPending && !isLoading ? 'pending' : 'ghost'"
|
||||
size="icon-xs"
|
||||
size="icon-toolbar"
|
||||
:disabled="isLoading"
|
||||
:class="[
|
||||
config.isEnterprise == 'true' && isLoading
|
||||
@@ -382,7 +389,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
: showRunQueryPending
|
||||
? 'border-s-0'
|
||||
: 'bg-button-primary! text-button-primary-foreground! hover:ring-button-primary/70 hover:opacity-90 hover:ring-2',
|
||||
'![border-radius:0_0.375rem_0.375rem_0]',
|
||||
'rounded-e-default! rounded-s-none!',
|
||||
]"
|
||||
>
|
||||
<OIcon name="arrow-drop-down" size="sm" />
|
||||
@@ -422,7 +429,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="logs-search-bar-share-link-btn"
|
||||
:url="tracesShareURL"
|
||||
variant="outline"
|
||||
size="icon-toolbar"
|
||||
size="icon-md"
|
||||
shortcut-id="tracesCopyUrl"
|
||||
/>
|
||||
<ODropdown side="bottom" align="end">
|
||||
@@ -521,14 +528,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:default-relative-time="searchObj.data.datetime.relativeTimePeriod"
|
||||
data-test="service-graph-date-time-picker"
|
||||
calendar-presets
|
||||
class="h-8!"
|
||||
class="h-8.5!"
|
||||
@on:date-change="updateDateTime"
|
||||
/>
|
||||
<OButton
|
||||
data-test="service-graph-refresh-btn"
|
||||
variant="outline"
|
||||
size="icon-toolbar"
|
||||
class="min-w-[1.875rem]!"
|
||||
size="icon-md"
|
||||
@click="$emit('service-graph-refresh')"
|
||||
>
|
||||
<OIcon name="refresh" size="sm" />
|
||||
@@ -553,7 +559,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-model="searchObj.meta.serviceGraphLayoutType"
|
||||
:options="serviceGraphLayoutOptions"
|
||||
:searchable="false"
|
||||
class="h-8! min-h-8! w-[7.5rem] max-lg:w-24!"
|
||||
class="h-[2.125rem]! min-h-[2.125rem]! w-[7.5rem] max-lg:w-24!"
|
||||
:disabled="searchObj.meta.serviceGraphVisualizationType === 'graph'"
|
||||
@update:model-value="onServiceGraphLayoutChange"
|
||||
/>
|
||||
@@ -576,7 +582,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:default-relative-time="searchObj.data.datetime.relativeTimePeriod"
|
||||
data-test="services-catalog-date-time-picker"
|
||||
calendar-presets
|
||||
class="me-1.5 h-8!"
|
||||
class="h-8.5!"
|
||||
@on:date-change="updateDateTime"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -67,7 +67,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="traces-count-badge"
|
||||
type="logsResultChip"
|
||||
value="neutral"
|
||||
class="me-[0.6rem] tabular-nums"
|
||||
class="me-2.5 tabular-nums"
|
||||
:aria-busy="countPending"
|
||||
>
|
||||
<template v-if="searchObj.meta.searchMode === 'spans'">
|
||||
@@ -103,11 +103,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
searchObj.data.queryResults.errorCount > 0
|
||||
"
|
||||
data-test="traces-error-count-badge"
|
||||
variant="error"
|
||||
type="logsResultChip"
|
||||
value="error"
|
||||
:clickable="true"
|
||||
:disabled="countPending"
|
||||
:aria-busy="countPending"
|
||||
class="rounded-default! px-2.5! py-[0.4rem]! text-xs text-xs! tabular-nums"
|
||||
class="tabular-nums"
|
||||
:class="[
|
||||
showErrorOnly
|
||||
? 'bg-badge-error-solid-bg! text-badge-error-solid-text!'
|
||||
|
||||
@@ -286,8 +286,8 @@ describe("SpanBlock", () => {
|
||||
|
||||
it("should apply defocus class when span is not selected", async () => {
|
||||
await flushPromises();
|
||||
const spanBlock = newWrapper.find('[data-test="span-block-select-trigger"]');
|
||||
expect(spanBlock.classes()).toContain("opacity-30");
|
||||
const bar = newWrapper.find('[data-test="span-marker"]');
|
||||
expect(bar.classes()).toContain("opacity-30");
|
||||
});
|
||||
|
||||
it("Should not show border when span is not selected", async () => {
|
||||
@@ -1191,8 +1191,7 @@ describe("SpanBlock critical path", () => {
|
||||
await flushPromises();
|
||||
};
|
||||
|
||||
const isDimmed = () =>
|
||||
wrapper.find('[data-test="span-block-select-trigger"]').classes().includes("opacity-30");
|
||||
const isDimmed = () => wrapper.find('[data-test="span-marker"]').classes().includes("opacity-30");
|
||||
|
||||
afterEach(() => {
|
||||
wrapper.vm.searchObj.data.traceDetails.selectedSpanId = null;
|
||||
|
||||
@@ -17,7 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template>
|
||||
<div
|
||||
class="wrap bg-surface-base flex items-center justify-start"
|
||||
:class="dimmed ? 'opacity-30' : ''"
|
||||
:style="{
|
||||
zIndex: 2,
|
||||
}"
|
||||
@@ -53,7 +52,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
the bar itself — that would rebase them onto the span. -->
|
||||
<div
|
||||
class="relative flex w-full cursor-pointer flex-nowrap items-center"
|
||||
:class="dimmed ? 'opacity-30' : ''"
|
||||
@click="selectSpan(span.spanId)"
|
||||
data-test="span-block-select-trigger"
|
||||
>
|
||||
@@ -64,7 +62,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
left: leftPosition + '%',
|
||||
}"
|
||||
class="relative flex flex-nowrap items-center justify-start"
|
||||
:class="startsInWindow ? 'min-w-0.5' : ''"
|
||||
:class="[startsInWindow ? 'min-w-0.5' : '', dimmed ? 'opacity-30' : '']"
|
||||
ref="spanMarkerRef"
|
||||
data-test="span-marker"
|
||||
>
|
||||
|
||||
@@ -57,7 +57,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:fit-view-options="{ padding: 0.3, minZoom: 0.3, maxZoom: 0.7 }"
|
||||
class="trace-dag-flow bg-surface-panel! h-full w-full"
|
||||
>
|
||||
<Background pattern-color="#aaa" :gap="16" />
|
||||
<Background :gap="16" />
|
||||
<Controls />
|
||||
|
||||
<template #node-custom="{ data }">
|
||||
@@ -397,7 +397,7 @@ export default defineComponent({
|
||||
markerEnd: MarkerType.ArrowClosed,
|
||||
style: {
|
||||
strokeWidth: 2,
|
||||
stroke: "#94a3b8",
|
||||
stroke: "var(--color-border-strong)",
|
||||
},
|
||||
}));
|
||||
});
|
||||
@@ -560,6 +560,11 @@ export default defineComponent({
|
||||
background-color: var(--color-surface-panel) !important;
|
||||
}
|
||||
|
||||
/* keep: lib-override:vue-flow — the library sets the dot colour as an SVG attribute, which cannot hold a var(). */
|
||||
.trace-dag-flow :deep(.vue-flow__background circle) {
|
||||
fill: var(--color-border-strong);
|
||||
}
|
||||
|
||||
/* keep: lib-override:vue-flow — the controls stylesheet hard-codes light-only button colours. */
|
||||
.trace-dag-flow :deep(.vue-flow__controls-button) {
|
||||
background: var(--color-surface-base);
|
||||
|
||||
@@ -716,7 +716,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<!-- DAG View - only for LLM traces -->
|
||||
<div v-if="hasLLMSpans && activeTab === 'dag'" class="flex min-h-0 flex-1">
|
||||
<div
|
||||
class="h-[calc(100vh-12.5rem)] min-w-[12.5rem] overflow-hidden p-4"
|
||||
class="h-full min-h-0 min-w-[12.5rem] overflow-hidden p-4"
|
||||
:style="{
|
||||
width:
|
||||
isSidebarOpen && (selectedSpanId || showTraceDetails)
|
||||
@@ -746,7 +746,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
<div
|
||||
v-if="isSidebarOpen && (selectedSpanId || showTraceDetails)"
|
||||
class="h-[calc(100vh-12.5rem)] min-h-0 min-w-[18.75rem] overflow-x-hidden overflow-y-auto"
|
||||
class="h-full min-h-0 min-w-[18.75rem] overflow-x-hidden overflow-y-auto"
|
||||
:style="{
|
||||
width: `${100 - dagLeftWidth}%`,
|
||||
}"
|
||||
|
||||
@@ -58,7 +58,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="text-text-body rounded-default border-info/28 bg-card-glass-tint-info-soft inline-flex items-center gap-1.5 border px-3.5 py-2 text-sm whitespace-nowrap max-md:min-w-0"
|
||||
>
|
||||
<OIcon name="code" size="sm" class="text-info shrink-0" />
|
||||
<span class="text-info text-xs font-semibold tracking-wide uppercase">{{
|
||||
<span class="text-text-body text-xs font-semibold">{{
|
||||
t("about.commit_lbl")
|
||||
}}</span>
|
||||
<OText variant="mono" class="max-md:max-w-28 max-md:truncate">{{
|
||||
@@ -77,9 +77,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
class="text-text-body rounded-default border-warning/28 bg-card-glass-tint-warning inline-flex items-center gap-1.5 border px-3.5 py-2 text-sm whitespace-nowrap"
|
||||
>
|
||||
<OIcon name="event" size="sm" class="text-warning shrink-0" />
|
||||
<span class="text-warning text-xs font-semibold tracking-wide uppercase">{{
|
||||
t("about.build_lbl")
|
||||
}}</span>
|
||||
<span class="text-text-body text-xs font-semibold">{{ t("about.build_lbl") }}</span>
|
||||
{{
|
||||
store.state.zoConfig.build_date ? formatDate(store.state.zoConfig.build_date) : ""
|
||||
}}
|
||||
|
||||
@@ -75,7 +75,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<ODropdownItem @select="importDashboard" data-test="dashboard-import-custom">
|
||||
<div class="flex flex-col">
|
||||
<span>{{ t("dashboard.importCustom") }}</span>
|
||||
<span class="text-dropdown-item-text text-xs opacity-60 max-md:mt-0.5">{{
|
||||
<span class="text-text-secondary text-xs max-md:mt-0.5">{{
|
||||
t("dashboard.importCustomDesc")
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -86,7 +86,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
<div class="flex flex-col">
|
||||
<span>{{ t("dashboard.importTemplates") }}</span>
|
||||
<span class="text-dropdown-item-text text-xs opacity-60 max-md:mt-0.5">{{
|
||||
<span class="text-text-secondary text-xs max-md:mt-0.5">{{
|
||||
t("dashboard.importTemplatesDesc")
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -101,7 +101,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="flex w-full items-center gap-2">
|
||||
<div class="flex min-w-0 flex-1 flex-col">
|
||||
<span>{{ t(`dashboard.${migration.labelKey}`) }}</span>
|
||||
<span class="text-dropdown-item-text text-xs opacity-60 max-md:mt-0.5">{{
|
||||
<span class="text-text-secondary text-xs max-md:mt-0.5">{{
|
||||
t(`dashboard.${migration.descKey}`)
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
@@ -112,7 +112,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
v-if="selectedDate"
|
||||
v-show="store.state.printMode === false"
|
||||
ref="dateTimePicker"
|
||||
class="dashboard-icons h-7.5 [transition:all_0.2s_ease] max-md:[&_.date-time-label]:hidden"
|
||||
class="dashboard-icons max-md:[&_.date-time-label]:hidden"
|
||||
size="sm"
|
||||
:modelValue="pickedDate ?? selectedDate"
|
||||
:auto-apply-dashboard="true"
|
||||
@@ -132,7 +132,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
trigger
|
||||
:min-refresh-interval="store.state?.zoConfig?.min_auto_refresh_interval || 5"
|
||||
@trigger="onAutoRefreshTick"
|
||||
class="dashboard-icons hideOnPrintMode h-7.5 [transition:all_0.2s_ease]"
|
||||
class="dashboard-icons hideOnPrintMode"
|
||||
size="sm"
|
||||
/>
|
||||
<OButtonGroup v-show="store.state.printMode !== true">
|
||||
@@ -314,7 +314,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
trigger
|
||||
:min-refresh-interval="store.state?.zoConfig?.min_auto_refresh_interval || 5"
|
||||
@trigger="onAutoRefreshTick"
|
||||
class="dashboard-icons hideOnPrintMode h-7.5 [transition:all_0.2s_ease]"
|
||||
class="dashboard-icons hideOnPrintMode"
|
||||
size="sm"
|
||||
/>
|
||||
<!-- These save, print or reload outside the draft, so edit mode hides them until Save or Discard. -->
|
||||
|
||||
@@ -59,7 +59,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
</div>
|
||||
|
||||
<p class="text-compact text-text-secondary m-0 opacity-70">
|
||||
<p class="text-compact text-text-secondary m-0">
|
||||
{{ t("common.redirectingHome", { countdown }) }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -65,14 +65,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template v-if="tab.id.startsWith('dash:')" #trailing>
|
||||
<button
|
||||
type="button"
|
||||
class="rounded-default text-text-secondary hover:bg-surface-subtle-hover hover:text-text-body inline-flex h-4 w-4 cursor-pointer items-center justify-center border-none bg-transparent text-sm leading-none opacity-60 transition-all duration-200 ease-[ease] hover:opacity-100 max-md:h-6 max-md:w-6"
|
||||
class="rounded-default text-text-secondary hover:bg-surface-subtle-hover hover:text-text-body inline-flex h-5 w-5 cursor-pointer items-center justify-center border-none bg-transparent opacity-60 transition-all duration-200 ease-[ease] hover:opacity-100 max-md:h-6 max-md:w-6"
|
||||
:data-test="`home-tab-close-${tab.id}`"
|
||||
:aria-label="t('home.removeHomeDashboard')"
|
||||
@mousedown.stop.prevent
|
||||
@pointerdown.stop.prevent
|
||||
@click.stop.prevent="onCloseTab(tab.id)"
|
||||
>
|
||||
{{ "×" }}
|
||||
<OIcon name="close" size="xs" />
|
||||
</button>
|
||||
<OTooltip side="bottom" :content="t('home.removeHomeDashboard')" />
|
||||
</template>
|
||||
|
||||
@@ -45,14 +45,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
:options="tokenOptions"
|
||||
label-key="label"
|
||||
value-key="value"
|
||||
class="max-w-xs max-md:order-last max-md:max-w-full max-md:min-w-0! max-md:basis-full"
|
||||
style="min-width: 13.75rem"
|
||||
class="max-w-xs min-w-55 max-md:order-last max-md:max-w-full max-md:min-w-0! max-md:basis-full"
|
||||
@update:model-value="onTokenSelected"
|
||||
/>
|
||||
<OButton
|
||||
v-if="!isRUMPage"
|
||||
variant="primary"
|
||||
size="sm"
|
||||
size="sm-action"
|
||||
class="shrink-0"
|
||||
icon-left="key"
|
||||
:title="isMobile ? t('ingestion.manageTokensBtnLabel') : undefined"
|
||||
@click="navigateToIngestionTokens"
|
||||
@@ -66,7 +66,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
store.state.organizationData.rumToken.rum_token != ''
|
||||
"
|
||||
variant="primary"
|
||||
size="sm"
|
||||
size="sm-action"
|
||||
data-test="ingestion-reset-token-btn"
|
||||
@click="showRUMUpdateDialogFn"
|
||||
>
|
||||
@@ -79,7 +79,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
store.state.organizationData.rumToken.rum_token == ''
|
||||
"
|
||||
variant="primary"
|
||||
size="sm"
|
||||
size="sm-action"
|
||||
data-test="ingestion-reset-token-btn"
|
||||
@click="generateRUMToken"
|
||||
>
|
||||
|
||||
@@ -37,11 +37,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</OButton>
|
||||
</template>
|
||||
|
||||
<!-- Org-wide stream footprint. Deliberately OUTSIDE the table: these totals
|
||||
come from the org summary endpoint and cover every stream type, so they
|
||||
must not sit in the table's #subheader where they would read as a
|
||||
summary of the (server-paginated, type-filtered) rows below. Read-only
|
||||
for the same reason — they are page context, not a facet. -->
|
||||
<!-- Outside the table: these totals cover every stream type, not the paginated rows. -->
|
||||
<template #subnav>
|
||||
<div class="px-page-edge py-1.5" data-test="log-stream-summary">
|
||||
<OStatStrip :items="summaryStats" :loading="summaryLoading" />
|
||||
@@ -188,7 +184,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="log-stream-explore-btn"
|
||||
data-row-action="view"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="exploreStream({ row })"
|
||||
/>
|
||||
@@ -198,7 +194,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="log-stream-schema-btn"
|
||||
data-row-action="view"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="listSchema({ row })"
|
||||
/>
|
||||
@@ -208,7 +204,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
data-test="log-stream-delete-btn"
|
||||
data-row-action="delete"
|
||||
variant="ghost-destructive"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
class="max-md:hidden"
|
||||
@click="confirmDeleteAction({ row })"
|
||||
/>
|
||||
|
||||
@@ -57,7 +57,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
>
|
||||
</div>
|
||||
<button
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap opacity-80 transition-opacity duration-150 hover:underline hover:opacity-100"
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap hover:underline"
|
||||
@click="goToIncidentList"
|
||||
>
|
||||
{{ t("overview.viewAll") }} {{ "→" }}
|
||||
@@ -169,7 +169,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
</span>
|
||||
</div>
|
||||
<button
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap opacity-80 transition-opacity duration-150 hover:underline hover:opacity-100"
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap hover:underline"
|
||||
@click="goToServiceGraph"
|
||||
>
|
||||
{{ t("overview.viewAll") }} {{ "→" }}
|
||||
@@ -353,7 +353,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTag type="countChip" value="warning">{{ anomalies.length }}</OTag>
|
||||
</div>
|
||||
<button
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap opacity-80 transition-opacity duration-150 hover:underline hover:opacity-100"
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap hover:underline"
|
||||
@click="goToAnomalies"
|
||||
>
|
||||
{{ t("overview.viewAll") }} {{ "→" }}
|
||||
@@ -410,7 +410,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<OTag type="countChip" value="warning">{{ recentEvents.length }}</OTag>
|
||||
</div>
|
||||
<button
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap opacity-80 transition-opacity duration-150 hover:underline hover:opacity-100"
|
||||
class="text-text-link cursor-pointer border-none bg-none p-0 text-xs font-medium whitespace-nowrap hover:underline"
|
||||
@click="goToAlertList"
|
||||
>
|
||||
{{ t("overview.viewAll") }} {{ "→" }}
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
<div class="flex items-center gap-1" @click.stop>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
:title="t('slos.edit')"
|
||||
@@ -284,7 +284,7 @@
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="drive-file-move"
|
||||
class="max-md:hidden"
|
||||
:title="t('slos.move')"
|
||||
@@ -293,7 +293,7 @@
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
:icon-left="row.enabled ? 'pause' : 'play-arrow'"
|
||||
class="max-md:hidden"
|
||||
:title="row.enabled ? t('slos.pause') : t('slos.resume')"
|
||||
@@ -302,7 +302,7 @@
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="download"
|
||||
class="max-md:hidden"
|
||||
:title="t('common.export')"
|
||||
@@ -312,7 +312,7 @@
|
||||
<OButton
|
||||
v-if="downtimesEnabled"
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="notifications-paused"
|
||||
class="max-md:hidden"
|
||||
:title="t('alerts.downtimes.mute.exclude')"
|
||||
@@ -321,7 +321,7 @@
|
||||
/>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="delete"
|
||||
class="max-md:hidden"
|
||||
:title="t('slos.delete')"
|
||||
|
||||
@@ -52,7 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #toolbar-trailing>
|
||||
<OButton
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="refresh"
|
||||
:loading="loading"
|
||||
data-test="status-pages-refresh-btn"
|
||||
@@ -134,7 +134,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="flex items-center gap-0.5" @click.stop>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="edit"
|
||||
class="max-md:hidden"
|
||||
:data-test="`status-pages-edit-btn-${(row as any).id}`"
|
||||
@@ -147,7 +147,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<template #trigger>
|
||||
<OButton
|
||||
variant="ghost"
|
||||
size="icon-sm"
|
||||
size="icon-xs-sq"
|
||||
icon-left="more-vert"
|
||||
:data-test="`status-pages-more-btn-${(row as any).id}`"
|
||||
@click.stop
|
||||
|
||||
Reference in New Issue
Block a user