feat: новая функция
This commit is contained in:
@@ -99,6 +99,20 @@ const editMode = ref(false);
|
||||
|
||||
const auth = useAuthContext();
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[EmailSettingsView] Clearing Email settings data');
|
||||
// Очищаем данные при выходе из системы
|
||||
settings.value = { smtpHost: '', smtpPort: '', smtpUser: '', smtpPass: '', enabled: false };
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[EmailSettingsView] Refreshing Email settings data');
|
||||
loadEmailSettings(); // Обновляем данные при входе в систему
|
||||
});
|
||||
});
|
||||
|
||||
const loadEmailSettings = async () => {
|
||||
// Не загружаем если не авторизован
|
||||
if (!auth.isAuthenticated.value) {
|
||||
|
||||
@@ -58,6 +58,20 @@ const editMode = ref(false);
|
||||
|
||||
const auth = useAuthContext();
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[TelegramSettingsView] Clearing Telegram settings data');
|
||||
// Очищаем данные при выходе из системы
|
||||
settings.value = { botToken: '', webhookUrl: '', enabled: false };
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[TelegramSettingsView] Refreshing Telegram settings data');
|
||||
loadTelegramSettings(); // Обновляем данные при входе в систему
|
||||
});
|
||||
});
|
||||
|
||||
const loadTelegramSettings = async () => {
|
||||
// Не загружаем если не авторизован
|
||||
if (!auth.isAuthenticated.value) {
|
||||
|
||||
@@ -67,12 +67,26 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import { ref, onMounted } from 'vue';
|
||||
import AIProviderSettings from './AIProviderSettings.vue';
|
||||
import { useAuthContext } from '@/composables/useAuth';
|
||||
import { usePermissions } from '@/composables/usePermissions';
|
||||
import NoAccessModal from '@/components/NoAccessModal.vue';
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[AiSettingsView] Clearing AI settings data');
|
||||
// Очищаем данные при выходе из системы
|
||||
// AiSettingsView не нуждается в очистке данных
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[AiSettingsView] Refreshing AI settings data');
|
||||
// AiSettingsView не нуждается в обновлении данных
|
||||
});
|
||||
});
|
||||
|
||||
const showProvider = ref(null);
|
||||
const showTelegramSettings = ref(false);
|
||||
const showEmailSettings = ref(false);
|
||||
@@ -80,7 +94,6 @@ const showDbSettings = ref(false);
|
||||
const showAiAssistantSettings = ref(false);
|
||||
const showNoAccessModal = ref(false);
|
||||
|
||||
const { isAdmin } = useAuthContext();
|
||||
const { canManageSettings } = usePermissions();
|
||||
|
||||
const providerLabels = {
|
||||
|
||||
@@ -35,9 +35,9 @@
|
||||
<span><strong>Editor:</strong> {{ token.editorThreshold || 2 }} токен{{ token.editorThreshold === 1 ? '' : token.editorThreshold < 5 ? 'а' : 'ов' }}</span>
|
||||
<button
|
||||
class="btn btn-sm"
|
||||
:class="canEdit ? 'btn-danger' : 'btn-secondary'"
|
||||
@click="canEdit ? removeToken(index) : null"
|
||||
:disabled="!canEdit"
|
||||
:class="canManageSettings ? 'btn-danger' : 'btn-secondary'"
|
||||
@click="canManageSettings ? removeToken(index) : null"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
Удалить
|
||||
</button>
|
||||
@@ -53,7 +53,7 @@
|
||||
v-model="newToken.name"
|
||||
class="form-control"
|
||||
placeholder="test2"
|
||||
:disabled="!canEdit"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
@@ -63,12 +63,12 @@
|
||||
v-model="newToken.address"
|
||||
class="form-control"
|
||||
placeholder="0x..."
|
||||
:disabled="!canEdit"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Сеть:</label>
|
||||
<select v-model="newToken.network" class="form-control" :disabled="!canEdit">
|
||||
<select v-model="newToken.network" class="form-control" :disabled="!canManageSettings">
|
||||
<option value="">-- Выберите сеть --</option>
|
||||
<optgroup v-for="(group, groupIndex) in networkGroups" :key="groupIndex" :label="group.label">
|
||||
<option v-for="option in group.options" :key="option.value" :value="option.value">
|
||||
@@ -86,7 +86,7 @@
|
||||
placeholder="0"
|
||||
min="0"
|
||||
step="0.01"
|
||||
:disabled="!canEdit"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
<small class="form-text">Минимальный баланс токена для получения доступа</small>
|
||||
</div>
|
||||
@@ -102,7 +102,7 @@
|
||||
class="form-control"
|
||||
placeholder="1"
|
||||
min="1"
|
||||
:disabled="!canEdit"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
<small class="form-text">Количество токенов для получения прав только на чтение</small>
|
||||
</div>
|
||||
@@ -114,16 +114,16 @@
|
||||
class="form-control"
|
||||
placeholder="2"
|
||||
min="2"
|
||||
:disabled="!canEdit"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
<small class="form-text">Количество токенов для получения прав на редактирование и удаление</small>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
class="btn"
|
||||
:class="canEdit ? 'btn-primary' : 'btn-secondary'"
|
||||
@click="canEdit ? addToken() : null"
|
||||
:disabled="!canEdit"
|
||||
:class="canManageSettings ? 'btn-primary' : 'btn-secondary'"
|
||||
@click="canManageSettings ? addToken() : null"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
Добавить токен
|
||||
</button>
|
||||
@@ -132,7 +132,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { reactive, computed } from 'vue';
|
||||
import { reactive, computed, onMounted } from 'vue';
|
||||
import useBlockchainNetworks from '@/composables/useBlockchainNetworks';
|
||||
import api from '@/api/axios';
|
||||
import { useAuthContext } from '@/composables/useAuth';
|
||||
@@ -152,8 +152,22 @@ const newToken = reactive({
|
||||
});
|
||||
|
||||
const { networkGroups, networks } = useBlockchainNetworks();
|
||||
const { isAdmin, checkTokenBalances, address, checkAuth, userAccessLevel, checkUserAccessLevel } = useAuthContext();
|
||||
const { canEdit, getLevelClass, getLevelDescription } = usePermissions();
|
||||
const { checkTokenBalances, address, checkAuth, userAccessLevel, checkUserAccessLevel } = useAuthContext();
|
||||
const { canManageSettings, getLevelClass, getLevelDescription } = usePermissions();
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[AuthTokensSettings] Clearing tokens data');
|
||||
// Очищаем данные при выходе из системы
|
||||
tokens.value = [];
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[AuthTokensSettings] Refreshing tokens data');
|
||||
loadTokens(); // Обновляем данные при входе в систему
|
||||
});
|
||||
});
|
||||
|
||||
async function addToken() {
|
||||
if (!newToken.name || !newToken.address || !newToken.network) {
|
||||
|
||||
@@ -854,8 +854,8 @@
|
||||
@click="deploySmartContracts"
|
||||
type="button"
|
||||
class="btn btn-primary btn-lg deploy-btn"
|
||||
:disabled="!isFormValid || !canEdit || adminTokenCheck.isLoading"
|
||||
:title="`isFormValid: ${isFormValid}, isAdmin: ${adminTokenCheck.isAdmin}, isLoading: ${adminTokenCheck.isLoading}`"
|
||||
:disabled="!isFormValid || !canManageSettings || adminTokenCheck.isLoading"
|
||||
:title="`isFormValid: ${isFormValid}, canManageSettings: ${canManageSettings}, isLoading: ${adminTokenCheck.isLoading}`"
|
||||
>
|
||||
<i class="fas fa-cogs"></i>
|
||||
Поэтапный деплой DLE
|
||||
@@ -921,13 +921,27 @@ function normalizePrivateKey(raw) {
|
||||
|
||||
|
||||
// Получаем контекст авторизации для адреса кошелька
|
||||
const { address, isAdmin } = useAuthContext();
|
||||
const { canEdit } = usePermissions();
|
||||
const { address } = useAuthContext();
|
||||
const { canManageSettings } = usePermissions();
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[DleDeployFormView] Clearing DLE deploy data');
|
||||
// Очищаем данные при выходе из системы
|
||||
// DleDeployFormView не нуждается в очистке данных
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[DleDeployFormView] Refreshing DLE deploy data');
|
||||
checkAdminTokens(); // Обновляем данные при входе в систему
|
||||
});
|
||||
});
|
||||
|
||||
// Состояние для проверки админских токенов
|
||||
const adminTokenCheck = ref({
|
||||
isLoading: false,
|
||||
isAdmin: false,
|
||||
canManageSettings: false,
|
||||
error: null
|
||||
});
|
||||
|
||||
@@ -2381,7 +2395,7 @@ watch(address, (newAddress) => {
|
||||
// Функция проверки админских токенов
|
||||
const checkAdminTokens = async () => {
|
||||
if (!address.value) {
|
||||
adminTokenCheck.value = { isLoading: false, isAdmin: false, error: 'Кошелек не подключен' };
|
||||
adminTokenCheck.value = { isLoading: false, canManageSettings: false, error: 'Кошелек не подключен' };
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2391,7 +2405,7 @@ const checkAdminTokens = async () => {
|
||||
const response = await api.get(`/dle-v2/check-admin-tokens?address=${address.value}`);
|
||||
|
||||
if (response.data.success) {
|
||||
adminTokenCheck.value = { ...adminTokenCheck.value, isAdmin: response.data.data.isAdmin };
|
||||
adminTokenCheck.value = { ...adminTokenCheck.value, canManageSettings: response.data.data.userAccessLevel.hasAccess };
|
||||
console.log('Проверка админских токенов:', response.data.data);
|
||||
} else {
|
||||
adminTokenCheck.value = { ...adminTokenCheck.value, error: response.data.message || 'Ошибка проверки токенов' };
|
||||
@@ -2589,7 +2603,7 @@ const handleDeploymentCompleted = (result) => {
|
||||
console.log('🔍 unifiedPrivateKey.value:', unifiedPrivateKey.value);
|
||||
console.log('🔍 keyValidation.unified:', keyValidation.unified);
|
||||
console.log('🔍 dleSettings.coordinates:', dleSettings.coordinates);
|
||||
console.log('🔍 Кнопка должна быть активна:', !(!validation.jurisdiction || !validation.name || !validation.tokenSymbol || !validation.partners || !validation.partnersValid || !validation.quorum || !validation.networks || !validation.privateKey || !validation.keyValid || !validation.coordinates) && adminTokenCheck.value.isAdmin && !adminTokenCheck.value.isLoading);
|
||||
console.log('🔍 Кнопка должна быть активна:', !(!validation.jurisdiction || !validation.name || !validation.tokenSymbol || !validation.partners || !validation.partnersValid || !validation.quorum || !validation.networks || !validation.privateKey || !validation.keyValid || !validation.coordinates) && adminTokenCheck.value.canManageSettings && !adminTokenCheck.value.isLoading);
|
||||
|
||||
return Boolean(
|
||||
validation.jurisdiction &&
|
||||
|
||||
@@ -73,7 +73,13 @@
|
||||
<span class="feature">✓ Безопасно</span>
|
||||
<span class="feature">✓ Для локальных и VPS</span>
|
||||
</div>
|
||||
<button class="btn-primary" @click="goToWebSsh">Подробнее</button>
|
||||
<button
|
||||
class="btn-primary"
|
||||
@click="canManageSettings ? goToWebSsh() : null"
|
||||
:disabled="!canManageSettings"
|
||||
>
|
||||
Подробнее
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Модальное окно с формой WEB SSH -->
|
||||
@@ -93,9 +99,23 @@ import { useRouter } from 'vue-router';
|
||||
import { useAuthContext } from '@/composables/useAuth';
|
||||
import { usePermissions } from '@/composables/usePermissions';
|
||||
import NoAccessModal from '@/components/NoAccessModal.vue';
|
||||
import { onMounted } from 'vue';
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[InterfaceSettingsView] Clearing interface data');
|
||||
// Очищаем данные при выходе из системы
|
||||
// InterfaceSettingsView не нуждается в очистке данных
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[InterfaceSettingsView] Refreshing interface data');
|
||||
// InterfaceSettingsView не нуждается в обновлении данных
|
||||
});
|
||||
});
|
||||
import { ref } from 'vue';
|
||||
const router = useRouter();
|
||||
const { isAdmin } = useAuthContext();
|
||||
const { canManageSettings } = usePermissions();
|
||||
const goBack = () => router.push('/settings');
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import WebSshForm from '@/components/WebSshForm.vue';
|
||||
import Header from '@/components/Header.vue';
|
||||
@@ -57,6 +57,20 @@ const toggleSidebar = () => {
|
||||
const auth = useAuthContext();
|
||||
const isAuthenticated = auth.isAuthenticated.value;
|
||||
const identities = auth.identities?.value || [];
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[InterfaceWebSshView] Clearing WebSSH data');
|
||||
// Очищаем данные при выходе из системы
|
||||
// InterfaceWebSshView не нуждается в очистке данных
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[InterfaceWebSshView] Refreshing WebSSH data');
|
||||
// InterfaceWebSshView не нуждается в обновлении данных
|
||||
});
|
||||
});
|
||||
const tokenBalances = auth.tokenBalances?.value || [];
|
||||
const isLoadingTokens = false;
|
||||
</script>
|
||||
|
||||
@@ -80,6 +80,20 @@ import { usePermissions } from '@/composables/usePermissions';
|
||||
import NoAccessModal from '@/components/NoAccessModal.vue';
|
||||
import wsClient from '@/utils/websocket';
|
||||
|
||||
// Подписываемся на централизованные события очистки и обновления данных
|
||||
onMounted(() => {
|
||||
window.addEventListener('clear-application-data', () => {
|
||||
console.log('[SecuritySettingsView] Clearing security data');
|
||||
// Очищаем данные при выходе из системы
|
||||
// SecuritySettingsView не нуждается в очистке данных
|
||||
});
|
||||
|
||||
window.addEventListener('refresh-application-data', () => {
|
||||
console.log('[SecuritySettingsView] Refreshing security data');
|
||||
// SecuritySettingsView не нуждается в обновлении данных
|
||||
});
|
||||
});
|
||||
|
||||
// Состояние для отображения/скрытия дополнительных настроек
|
||||
const showRpcSettings = ref(false);
|
||||
const showAuthSettings = ref(false);
|
||||
@@ -88,7 +102,6 @@ const isSaving = ref(false);
|
||||
const showNoAccessModal = ref(false);
|
||||
|
||||
// Получаем контекст авторизации
|
||||
const { isAdmin } = useAuthContext();
|
||||
const { canManageSettings } = usePermissions();
|
||||
|
||||
// Настройки безопасности
|
||||
|
||||
Reference in New Issue
Block a user