add: translation of OlapQueries.vue
fix: optimization of translation
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<AppLayout>
|
||||
<div class="flex justify-between items-center mb-6 flex-wrap gap-4">
|
||||
<h1 class="text-2xl font-bold text-gray-900">{{ t('olap.columnsTitle') }}</h1>
|
||||
<h1 class="text-2xl font-bold text-gray-900">{{ t('olapColumns.title') }}</h1>
|
||||
<div class="flex gap-3">
|
||||
<button
|
||||
v-if="hasData && !loading && !initializing"
|
||||
@@ -11,7 +11,7 @@
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
|
||||
</svg>
|
||||
{{ t('olap.refreshStructure') }}
|
||||
{{ t('olapColumns.refreshStructure') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="!hasData && !loading && !initializing"
|
||||
@@ -21,7 +21,7 @@
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
|
||||
</svg>
|
||||
{{ t('olap.initialize') }}
|
||||
{{ t('olapColumns.initialize') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,18 +30,18 @@
|
||||
<div v-if="hasData" class="card mb-6 p-4">
|
||||
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olap.filterFieldKey') }}</label>
|
||||
<input v-model="filters.fieldKey" type="text" class="input-field" :placeholder="t('olap.filterFieldKeyPlaceholder')" />
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olapColumns.filterFieldKey') }}</label>
|
||||
<input v-model="filters.fieldKey" type="text" class="input-field" :placeholder="t('olapColumns.filterFieldKeyPlaceholder')" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olap.filterReportType') }}</label>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olapColumns.filterReportType') }}</label>
|
||||
<select v-model="filters.reportType" class="input-field">
|
||||
<option value="">{{ t('app.all') }}</option>
|
||||
<option v-for="rt in availableReportTypes" :key="rt" :value="rt">{{ rt }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olap.filterTag') }}</label>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olapColumns.filterTag') }}</label>
|
||||
<select v-model="filters.tag" class="input-field">
|
||||
<option value="">{{ t('app.all') }}</option>
|
||||
<option v-for="tag in availableTags" :key="tag" :value="tag">{{ tag }}</option>
|
||||
@@ -62,21 +62,21 @@
|
||||
<p class="mt-2 text-gray-500">{{ t('app.loading') }}</p>
|
||||
</div>
|
||||
<div v-else-if="hasData && filteredColumns.length === 0" class="card p-8 text-center text-gray-500">
|
||||
{{ t('olap.noColumnsFound') }}
|
||||
{{ t('olapColumns.noColumnsFound') }}
|
||||
</div>
|
||||
<div v-else-if="hasData" class="card overflow-hidden">
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.fieldKey') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.fieldKey') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.name') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.reportTypes') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.type') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.tags') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.aggregation') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.grouping') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olap.filtering') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.reportTypes') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.type') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.tags') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.aggregation') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.grouping') }}</th>
|
||||
<th class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapColumns.filtering') }}</th>
|
||||
<th class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.actions') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -162,7 +162,7 @@
|
||||
v-model="restaurantSearch"
|
||||
type="text"
|
||||
class="input-field pl-9"
|
||||
:placeholder="t('olap.searchRestaurant')"
|
||||
:placeholder="t('olapColumns.searchRestaurant')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -198,7 +198,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="filteredRestaurants.length === 0" class="text-center py-8 text-gray-500">
|
||||
{{ t('olap.noRestaurantsFound') }}
|
||||
{{ t('olapColumns.noRestaurantsFound') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -230,11 +230,11 @@
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">{{ t('olap.refreshWarningTitle') }}</h3>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">{{ t('olapColumns.refreshWarningTitle') }}</h3>
|
||||
<p class="text-sm text-gray-500 mb-4">
|
||||
{{ t('olap.refreshWarningMessage', { restaurant: pendingRestaurantName }) }}
|
||||
{{ t('olapColumns.refreshWarningMessage', { restaurant: pendingRestaurantName }) }}
|
||||
</p>
|
||||
<p class="text-sm font-semibold text-red-600 mb-6">{{ t('olap.refreshWarningConfirm') }}</p>
|
||||
<p class="text-sm font-semibold text-red-600 mb-6">{{ t('olapColumns.refreshWarningConfirm') }}</p>
|
||||
<div class="flex justify-center space-x-3">
|
||||
<button @click="refreshWarningModal.show = false" class="btn-secondary">{{ t('app.cancel') }}</button>
|
||||
<button @click="executeInitialize" class="bg-red-600 text-white px-4 py-2 rounded-lg hover:bg-red-700">
|
||||
@@ -254,7 +254,7 @@
|
||||
<div class="flex items-center justify-center min-h-screen p-4">
|
||||
<div class="relative bg-white rounded-2xl shadow-xl max-w-md w-full">
|
||||
<div class="flex justify-between items-center p-6 border-b">
|
||||
<h2 class="text-xl font-bold text-gray-900">{{ t('olap.editField') }}</h2>
|
||||
<h2 class="text-xl font-bold text-gray-900">{{ t('olapColumns.editField') }}</h2>
|
||||
<button @click="closeEditModal" class="text-gray-400 hover:text-gray-600">
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||
@@ -267,7 +267,7 @@
|
||||
<input v-model="editForm.name" type="text" class="input-field" required />
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olap.displayType') }}</label>
|
||||
<label class="block text-sm font-medium text-gray-700 mb-1">{{ t('olapColumns.displayType') }}</label>
|
||||
<select v-model="editForm.typeNormal" class="input-field">
|
||||
<option value="string">string</option>
|
||||
<option value="integer">integer</option>
|
||||
@@ -277,15 +277,15 @@
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" v-model="editForm.aggregationAllowed" class="rounded border-gray-300 text-primary-600 focus:ring-primary-500 w-4 h-4 mr-2" />
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olap.aggregation') }}</label>
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olapColumns.aggregation') }}</label>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" v-model="editForm.groupingAllowed" class="rounded border-gray-300 text-primary-600 focus:ring-primary-500 w-4 h-4 mr-2" />
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olap.grouping') }}</label>
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olapColumns.grouping') }}</label>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" v-model="editForm.filteringAllowed" class="rounded border-gray-300 text-primary-600 focus:ring-primary-500 w-4 h-4 mr-2" />
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olap.filtering') }}</label>
|
||||
<label class="text-sm font-medium text-gray-700">{{ t('olapColumns.filtering') }}</label>
|
||||
</div>
|
||||
<div class="flex justify-end space-x-3 pt-2">
|
||||
<button type="button" @click="closeEditModal" class="btn-secondary">{{ t('app.cancel') }}</button>
|
||||
@@ -309,8 +309,8 @@
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">{{ t('olap.deleteField') }}</h3>
|
||||
<p class="text-sm text-gray-500 mb-6">{{ t('olap.deleteFieldConfirm') }}</p>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">{{ t('olapColumns.deleteField') }}</h3>
|
||||
<p class="text-sm text-gray-500 mb-6">{{ t('olapColumns.deleteFieldConfirm') }}</p>
|
||||
<div class="flex justify-center space-x-3">
|
||||
<button @click="deleteFieldConfirm.show = false" class="btn-secondary">{{ t('app.cancel') }}</button>
|
||||
<button @click="confirmDeleteField" class="bg-red-600 text-white px-4 py-2 rounded-lg hover:bg-red-700">{{ t('app.delete') }}</button>
|
||||
@@ -332,7 +332,7 @@
|
||||
{{ initializingText }}
|
||||
</p>
|
||||
<p class="text-sm text-gray-500 text-center">
|
||||
{{ t('olap.waitMessage') }}
|
||||
{{ t('olapColumns.waitMessage') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -453,7 +453,7 @@ async function loadColumns() {
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
showNotification('olap.loadError', 'error');
|
||||
showNotification('olapColumns.loadError', 'error');
|
||||
columns.value = [];
|
||||
} finally {
|
||||
loading.value = false;
|
||||
@@ -486,12 +486,12 @@ const filteredRestaurants = computed(() => {
|
||||
});
|
||||
|
||||
function openInitModal() {
|
||||
initModalTitle.value = t('olap.selectRestaurant');
|
||||
initModalTitle.value = t('olapColumns.selectRestaurant');
|
||||
loadRestaurants().then(() => { initModalOpen.value = true; });
|
||||
}
|
||||
|
||||
function openRefreshModal() {
|
||||
initModalTitle.value = t('olap.refreshStructure');
|
||||
initModalTitle.value = t('olapColumns.refreshStructure');
|
||||
loadRestaurants().then(() => { initModalOpen.value = true; });
|
||||
}
|
||||
|
||||
@@ -517,7 +517,7 @@ function onInitConfirm() {
|
||||
async function executeInitialize() {
|
||||
const id = pendingRestaurantId.value ?? selectedRestaurantId.value;
|
||||
if (!id) {
|
||||
showNotification('olap.selectRestaurantFirst', 'error');
|
||||
showNotification('olapColumns.selectRestaurantFirst', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -526,7 +526,7 @@ async function executeInitialize() {
|
||||
editModalOpen.value = false;
|
||||
deleteFieldConfirm.value.show = false;
|
||||
|
||||
initializingText.value = hasData.value ? t('olap.refreshingData') : t('olap.initializingData');
|
||||
initializingText.value = hasData.value ? t('olapColumns.refreshingData') : t('olapColumns.initializingData');
|
||||
initializing.value = true;
|
||||
|
||||
try {
|
||||
@@ -539,10 +539,10 @@ async function executeInitialize() {
|
||||
const errText = await res.text();
|
||||
throw new Error(errText || `HTTP ${res.status}`);
|
||||
}
|
||||
showNotification('olap.initSuccess', 'success');
|
||||
showNotification('olapColumns.initSuccess', 'success');
|
||||
await loadColumns();
|
||||
} catch (error: any) {
|
||||
showNotification('olap.initError', 'error', { error: error.message });
|
||||
showNotification('olapColumns.initError', 'error', { error: error.message });
|
||||
} finally {
|
||||
initializing.value = false;
|
||||
initializingText.value = '';
|
||||
@@ -583,11 +583,11 @@ async function updateField() {
|
||||
})
|
||||
});
|
||||
if (!res.ok) throw new Error();
|
||||
showNotification('olap.updateSuccess', 'success');
|
||||
showNotification('olapColumns.updateSuccess', 'success');
|
||||
closeEditModal();
|
||||
await loadColumns();
|
||||
} catch (error) {
|
||||
showNotification('olap.updateError', 'error');
|
||||
showNotification('olapColumns.updateError', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -603,11 +603,11 @@ async function confirmDeleteField() {
|
||||
method: 'DELETE'
|
||||
});
|
||||
if (!res.ok) throw new Error();
|
||||
showNotification('olap.deleteSuccess', 'success');
|
||||
showNotification('olapColumns.deleteSuccess', 'success');
|
||||
deleteFieldConfirm.value.show = false;
|
||||
await loadColumns();
|
||||
} catch (error) {
|
||||
showNotification('olap.deleteError', 'error');
|
||||
showNotification('olapColumns.deleteError', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1354,7 +1354,7 @@ onMounted(async () => {
|
||||
isDirty.value = false
|
||||
}
|
||||
triggerSqlUpdate()
|
||||
isReady.value = true // <- Страница полностью загружена
|
||||
isReady.value = true
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<AppLayout>
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<h1 class="text-2xl font-bold text-gray-900">OLAP запросы</h1>
|
||||
<router-link to="/olap/constructor" class="btn-primary">+ Создать запрос</router-link>
|
||||
<h1 class="text-2xl font-bold text-gray-900">{{ t('olapQueries.title') }}</h1>
|
||||
<router-link to="/olap/constructor" class="btn-primary">+ {{ t('olapQueries.createButton') }}</router-link>
|
||||
</div>
|
||||
|
||||
<div class="card overflow-hidden">
|
||||
@@ -10,15 +10,15 @@
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<thead class="bg-gray-50">
|
||||
<tr>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Название</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Активен</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Последнее выполнение</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Результат</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Подключение</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Рестораны</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Создан</th>
|
||||
<th class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">Действия</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.id') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.name') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.active') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapQueries.lastRun') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapQueries.result') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('olapQueries.connection') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.restaurants') }}</th>
|
||||
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.created') }}</th>
|
||||
<th class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">{{ t('common.actions') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200 bg-white">
|
||||
@@ -27,14 +27,14 @@
|
||||
<td class="px-6 py-4 text-sm font-medium">{{ q.name }}</td>
|
||||
<td class="px-6 py-4 text-sm">
|
||||
<span :class="q.active ? 'text-green-600' : 'text-red-600'">
|
||||
{{ q.active ? 'Да' : 'Нет' }}
|
||||
{{ q.active ? t('common.yes') : t('common.no') }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm">{{ q.lastRun ? formatDate(q.lastRun) : '—' }}</td>
|
||||
<td class="px-6 py-4 text-sm">
|
||||
<span v-if="q.lastRunSuccess === null">—</span>
|
||||
<span v-else-if="q.lastRunSuccess" class="text-green-600">Успешно</span>
|
||||
<span v-else class="text-red-600">Ошибка</span>
|
||||
<span v-else-if="q.lastRunSuccess" class="text-green-600">{{ t('olapQueries.success') }}</span>
|
||||
<span v-else class="text-red-600">{{ t('olapQueries.error') }}</span>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm">{{ q.dbConnectionName }}</td>
|
||||
<td class="px-6 py-4 text-sm">{{ q.restaurants }}</td>
|
||||
@@ -53,7 +53,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="queries.length === 0">
|
||||
<td colspan="6" class="px-6 py-12 text-center text-gray-500">Нет запросов. Создайте первый!</td>
|
||||
<td colspan="6" class="px-6 py-12 text-center text-gray-500">{{ t('olapQueries.noQueries') }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -73,11 +73,11 @@
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">Удалить запрос?</h3>
|
||||
<p class="text-sm text-gray-500 mb-6">Действие необратимо. Вы уверены?</p>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">{{ t('olapQueries.deleteQueriesTitle') }}</h3>
|
||||
<p class="text-sm text-gray-500 mb-6">{{ t('olapQueries.deleteQueriesMessage') }}</p>
|
||||
<div class="flex justify-center space-x-3">
|
||||
<button @click="deleteModal.show = false" class="btn-secondary">Отмена</button>
|
||||
<button @click="deleteQuery" class="bg-red-600 text-white px-4 py-2 rounded-lg hover:bg-red-700 transition-colors">Удалить</button>
|
||||
<button @click="deleteModal.show = false" class="btn-secondary">{{ t('app.cancel') }}</button>
|
||||
<button @click="deleteQuery" class="bg-red-600 text-white px-4 py-2 rounded-lg hover:bg-red-700 transition-colors">{{ t('app.delete') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -90,9 +90,11 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import AppLayout from '@/components/Layout/AppLayout.vue'
|
||||
import { useNotification } from '@/composables/useNotification'
|
||||
|
||||
const { t } = useI18n()
|
||||
const { showNotification } = useNotification()
|
||||
const queries = ref([])
|
||||
const deleteModal = ref({ show: false, id: null as number | null })
|
||||
@@ -103,7 +105,7 @@ async function loadQueries() {
|
||||
if (!res.ok) throw new Error()
|
||||
queries.value = await res.json()
|
||||
} catch (e) {
|
||||
showNotification('Ошибка загрузки запросов', 'error')
|
||||
showNotification('olapQueries.loadError', 'error')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,10 +123,10 @@ async function deleteQuery() {
|
||||
try {
|
||||
const res = await fetch(`/api/olap/queries/${id}`, { method: 'DELETE' })
|
||||
if (!res.ok) throw new Error()
|
||||
showNotification('Запрос удалён', 'success')
|
||||
showNotification('olapQueries.deleteSuccess', 'success')
|
||||
await loadQueries()
|
||||
} catch (e) {
|
||||
showNotification('Ошибка удаления', 'error')
|
||||
showNotification('olapQueries.deleteError', 'error')
|
||||
} finally {
|
||||
deleteModal.value.show = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user