ваше сообщение коммита

This commit is contained in:
2025-08-01 16:33:10 +03:00
parent 3ee29f16bd
commit e30d672c52
69 changed files with 690 additions and 2130 deletions

View File

@@ -193,7 +193,7 @@ export default {
stats.value = response.data.data
}
} catch (error) {
console.error('Error fetching queue stats:', error)
// console.error('Error fetching queue stats:', error)
} finally {
loading.value = false
}
@@ -210,7 +210,7 @@ export default {
await fetchStats()
}
} catch (error) {
console.error(`Error controlling queue (${action}):`, error)
// console.error(`Error controlling queue (${action}):`, error)
}
}

View File

@@ -81,7 +81,7 @@ const emit = defineEmits(['auth-action-completed']);
// Callback после успешной аутентификации/привязки через Email/Telegram
const handleAuthFlowSuccess = (authType) => {
console.log(`[BaseLayout] Auth flow success: ${authType}`);
// console.log(`[BaseLayout] Auth flow success: ${authType}`);
// Отправляем событие для обновления данных на страницах
eventBus.emit('auth-success', { authType });
};
@@ -116,7 +116,7 @@ const handleWalletAuth = async () => {
isConnectingWallet.value = true;
try {
const result = await connectWithWallet();
console.log('[BaseLayout] Результат подключения кошелька:', result);
// console.log('[BaseLayout] Результат подключения кошелька:', result);
if (result.success) {
if (auth.isAuthenticated.value) {
@@ -132,7 +132,7 @@ const handleWalletAuth = async () => {
// Новая аутентификация через кошелек
const authResponse = await auth.checkAuth();
if (authResponse.authenticated && authResponse.authType === 'wallet') {
console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
// console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
showSuccessMessage('Кошелёк успешно подключен!');
emit('auth-action-completed');
} else {
@@ -140,11 +140,11 @@ const handleWalletAuth = async () => {
}
}
} else {
console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
// console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
showErrorMessage(result.error || 'Не удалось подключить кошелёк');
}
} catch (error) {
console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
// console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
showErrorMessage('Произошла ошибка при подключении кошелька');
} finally {
isConnectingWallet.value = false;
@@ -155,7 +155,7 @@ const handleWalletAuth = async () => {
* Выполняет выход из аккаунта
*/
const disconnectWallet = async () => {
console.log('[BaseLayout] Выполняется выход из системы...');
// console.log('[BaseLayout] Выполняется выход из системы...');
try {
await api.post('/auth/logout');
showSuccessMessage('Вы успешно вышли из системы');
@@ -163,7 +163,7 @@ const disconnectWallet = async () => {
removeFromStorage('hasUserSentMessage');
emit('auth-action-completed');
} catch (error) {
console.error('[BaseLayout] Ошибка при выходе из системы:', error);
// console.error('[BaseLayout] Ошибка при выходе из системы:', error);
showErrorMessage('Произошла ошибка при выходе из системы');
}
};
@@ -181,7 +181,7 @@ const toggleWalletSidebar = () => {
// =====================================================================
onMounted(() => {
console.log('[BaseLayout] Компонент загружен');
// console.log('[BaseLayout] Компонент загружен');
// Загружаем сохраненное состояние боковой панели
const savedSidebarState = getFromStorage('showWalletSidebar');

View File

@@ -166,26 +166,26 @@ const videoStream = ref(null);
const recordedAudioChunks = ref([]);
const recordedVideoChunks = ref([]);
const startAudioRecording = async () => {
console.log('[ChatInterface] startAudioRecording called');
const startAudioRecording = async () => {
// console.log('[ChatInterface] startAudioRecording called');
try {
if (isAudioRecording.value) return;
audioStream.value = await navigator.mediaDevices.getUserMedia({ audio: true });
console.log('[ChatInterface] Got audio stream:', audioStream.value);
// console.log('[ChatInterface] Got audio stream:', audioStream.value);
recordedAudioChunks.value = [];
audioRecorder.value = new MediaRecorder(audioStream.value);
audioRecorder.value.ondataavailable = (event) => {
console.log('[ChatInterface] audioRecorder.ondataavailable fired');
// console.log('[ChatInterface] audioRecorder.ondataavailable fired');
if (event.data.size > 0) recordedAudioChunks.value.push(event.data);
};
audioRecorder.value.onstop = () => {
console.log('[ChatInterface] audioRecorder.onstop fired');
// console.log('[ChatInterface] audioRecorder.onstop fired');
setTimeout(() => {
if (recordedAudioChunks.value.length === 0) {
console.warn('[ChatInterface] No audio chunks recorded.');
// console.warn('[ChatInterface] No audio chunks recorded.');
return;
}
console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
// console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
const audioBlob = new Blob(recordedAudioChunks.value, { type: 'audio/webm' });
const audioFile = new File([audioBlob], `audio-${Date.now()}.webm`, { type: 'audio/webm' });
addAttachment(audioFile);
@@ -194,64 +194,64 @@ const startAudioRecording = async () => {
};
audioRecorder.value.start();
isAudioRecording.value = true;
console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
// console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
} catch (error) {
console.error('[ChatInterface] Error starting audio recording:', error);
// console.error('[ChatInterface] Error starting audio recording:', error);
}
};
const stopAudioRecording = async () => {
console.log('[ChatInterface] stopAudioRecording called');
// console.log('[ChatInterface] stopAudioRecording called');
if (!isAudioRecording.value || !audioRecorder.value || audioRecorder.value.state === 'inactive') {
console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
// console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
return;
}
try {
audioRecorder.value.stop();
console.log('[ChatInterface] audioRecorder.stop() called');
// console.log('[ChatInterface] audioRecorder.stop() called');
isAudioRecording.value = false;
if (audioStream.value) {
audioStream.value.getTracks().forEach(track => track.stop());
console.log('[ChatInterface] Audio stream tracks stopped.');
// console.log('[ChatInterface] Audio stream tracks stopped.');
}
} catch (error) {
console.error('[ChatInterface] Error stopping audio recording:', error);
// console.error('[ChatInterface] Error stopping audio recording:', error);
isAudioRecording.value = false;
if (audioStream.value) audioStream.value.getTracks().forEach(track => track.stop());
}
};
const startVideoRecording = async () => {
console.log('[ChatInterface] startVideoRecording called');
// console.log('[ChatInterface] startVideoRecording called');
try {
if (isVideoRecording.value) return;
videoStream.value = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
console.log('[ChatInterface] Got video stream:', videoStream.value);
// console.log('[ChatInterface] Got video stream:', videoStream.value);
recordedVideoChunks.value = [];
let options = { mimeType: 'video/webm;codecs=vp9,opus' };
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
// console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
options = { mimeType: 'video/webm' };
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.warn(`MIME type ${options.mimeType} not supported, using default.`);
// console.warn(`MIME type ${options.mimeType} not supported, using default.`);
options = {};
}
}
console.log('[ChatInterface] Using MediaRecorder options:', options);
// console.log('[ChatInterface] Using MediaRecorder options:', options);
videoRecorder.value = new MediaRecorder(videoStream.value, options);
videoRecorder.value.ondataavailable = (event) => {
console.log('[ChatInterface] videoRecorder.ondataavailable fired');
// console.log('[ChatInterface] videoRecorder.ondataavailable fired');
if (event.data.size > 0) recordedVideoChunks.value.push(event.data);
};
videoRecorder.value.onstop = () => {
console.log('[ChatInterface] videoRecorder.onstop fired');
// console.log('[ChatInterface] videoRecorder.onstop fired');
setTimeout(() => {
if (recordedVideoChunks.value.length === 0) {
console.warn('[ChatInterface] No video chunks recorded.');
// console.warn('[ChatInterface] No video chunks recorded.');
return;
}
console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
// console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
const videoBlob = new Blob(recordedVideoChunks.value, { type: videoRecorder.value.mimeType || 'video/webm' });
const videoFile = new File([videoBlob], `video-${Date.now()}.webm`, { type: videoRecorder.value.mimeType || 'video/webm' });
addAttachment(videoFile);
@@ -260,28 +260,28 @@ const startVideoRecording = async () => {
};
videoRecorder.value.start();
isVideoRecording.value = true;
console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
// console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
} catch (error) {
console.error('[ChatInterface] Error starting video recording:', error);
// console.error('[ChatInterface] Error starting video recording:', error);
}
};
const stopVideoRecording = async () => {
console.log('[ChatInterface] stopVideoRecording called');
// console.log('[ChatInterface] stopVideoRecording called');
if (!isVideoRecording.value || !videoRecorder.value || videoRecorder.value.state === 'inactive') {
console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
// console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
return;
}
try {
videoRecorder.value.stop();
console.log('[ChatInterface] videoRecorder.stop() called');
// console.log('[ChatInterface] videoRecorder.stop() called');
isVideoRecording.value = false;
if (videoStream.value) {
videoStream.value.getTracks().forEach(track => track.stop());
console.log('[ChatInterface] Video stream tracks stopped.');
// console.log('[ChatInterface] Video stream tracks stopped.');
}
} catch (error) {
console.error('[ChatInterface] Error stopping video recording:', error);
// console.error('[ChatInterface] Error stopping video recording:', error);
isVideoRecording.value = false;
if (videoStream.value) videoStream.value.getTracks().forEach(track => track.stop());
}

View File

@@ -336,7 +336,7 @@ async function deleteMessagesSelected() {
deletedConversations += result.deletedConversations || 0;
}
} catch (error) {
console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
// console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
}
}

View File

@@ -242,7 +242,7 @@ const connectToDLE = async () => {
connectionStatus.value = 'connecting';
// Здесь будет подключение к DLE через Web3
console.log('Подключение к DLE:', props.dleAddress);
// console.log('Подключение к DLE:', props.dleAddress);
// Имитация подключения
await new Promise(resolve => setTimeout(resolve, 1000));
@@ -252,7 +252,7 @@ const connectToDLE = async () => {
connectionStatus.value = 'connected';
} catch (error) {
console.error('Ошибка подключения к DLE:', error);
// console.error('Ошибка подключения к DLE:', error);
connectionStatus.value = 'error';
}
};
@@ -312,7 +312,7 @@ const loadDLEData = async () => {
];
} catch (error) {
console.error('Ошибка загрузки данных DLE:', error);
// console.error('Ошибка загрузки данных DLE:', error);
}
};
@@ -351,7 +351,7 @@ const signProposal = async (proposalId) => {
isSigning.value = true;
// Здесь будет подписание предложения
console.log('Подписание предложения:', proposalId);
// console.log('Подписание предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -362,7 +362,7 @@ const signProposal = async (proposalId) => {
emit('proposal-signed', { proposalId, dleAddress: props.dleAddress });
} catch (error) {
console.error('Ошибка подписания предложения:', error);
// console.error('Ошибка подписания предложения:', error);
} finally {
isSigning.value = false;
}
@@ -375,7 +375,7 @@ const executeProposal = async (proposalId) => {
isExecuting.value = true;
// Здесь будет выполнение предложения
console.log('Выполнение предложения:', proposalId);
// console.log('Выполнение предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -385,7 +385,7 @@ const executeProposal = async (proposalId) => {
emit('proposal-executed', { proposalId, dleAddress: props.dleAddress });
} catch (error) {
console.error('Ошибка выполнения предложения:', error);
// console.error('Ошибка выполнения предложения:', error);
} finally {
isExecuting.value = false;
}

View File

@@ -56,7 +56,7 @@ onMounted(() => {
// Следим за изменениями авторизации и сообщаем о них через eventBus
unwatch = watch(isAuthenticated, (newValue, oldValue) => {
if (newValue !== oldValue) {
console.log('[Header] Состояние аутентификации изменилось:', newValue);
// console.log('[Header] Состояние аутентификации изменилось:', newValue);
// Оповещаем остальные компоненты через шину событий
eventBus.emit('auth-state-changed', {
isAuthenticated: newValue,

View File

@@ -106,7 +106,7 @@ const base64ToBlob = (base64, mimetype) => {
const byteArray = new Uint8Array(byteNumbers);
return new Blob([byteArray], { type: mimetype });
} catch (e) {
console.error("Error decoding base64 string:", e);
// console.error("Error decoding base64 string:", e);
return null;
}
};
@@ -161,7 +161,7 @@ const formattedTime = computed(() => {
try {
const date = new Date(timestamp);
if (isNaN(date.getTime())) {
console.warn('Invalid timestamp in Message.vue:', timestamp);
// console.warn('Invalid timestamp in Message.vue:', timestamp);
return '';
}
return date.toLocaleString([], {
@@ -172,7 +172,7 @@ const formattedTime = computed(() => {
minute: '2-digit',
});
} catch (error) {
console.error('Error formatting time in Message.vue:', error, timestamp);
// console.error('Error formatting time in Message.vue:', error, timestamp);
return '';
}
});

View File

@@ -135,7 +135,7 @@ async function checkConnection() {
await loadInstalledModels();
}
} catch (error) {
console.error('Ошибка проверки подключения:', error);
// console.error('Ошибка проверки подключения:', error);
isConnected.value = false;
} finally {
checking.value = false;
@@ -148,7 +148,7 @@ async function loadInstalledModels() {
const response = await axios.get('/ollama/models');
installedModels.value = response.data.models || [];
} catch (error) {
console.error('Ошибка загрузки моделей:', error);
// console.error('Ошибка загрузки моделей:', error);
}
}
@@ -162,7 +162,7 @@ async function searchModels() {
// Пока просто устанавливаем модель напрямую
await installModel(searchQuery.value.trim());
} catch (error) {
console.error('Ошибка поиска моделей:', error);
// console.error('Ошибка поиска моделей:', error);
} finally {
searching.value = false;
}
@@ -176,7 +176,7 @@ async function installModel(modelName) {
await loadInstalledModels();
searchQuery.value = '';
} catch (error) {
console.error('Ошибка установки модели:', error);
// console.error('Ошибка установки модели:', error);
} finally {
installing.value = '';
}
@@ -189,7 +189,7 @@ async function removeModel(modelName) {
await axios.delete(`/ollama/models/${encodeURIComponent(modelName)}`);
await loadInstalledModels();
} catch (error) {
console.error('Ошибка удаления модели:', error);
// console.error('Ошибка удаления модели:', error);
} finally {
removing.value = '';
}

View File

@@ -197,7 +197,7 @@ const closeSidebar = () => {
// Обработка события изменения авторизации
const handleAuthEvent = (event) => {
console.log('[Sidebar] Получено событие изменения авторизации:', event);
// console.log('[Sidebar] Получено событие изменения авторизации:', event);
// Здесь можно обновить данные, если нужно дополнительное обновление
};
@@ -239,11 +239,11 @@ const handleDeleteIdentity = async (provider, providerId) => {
// Добавляем watch для отслеживания props
watch(() => props.tokenBalances, (newVal, oldVal) => {
console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
// console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
}, { deep: true });
watch(() => props.isLoadingTokens, (newVal, oldVal) => {
console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
// console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
});
</script>

View File

@@ -66,7 +66,7 @@
error.value = result.error || 'Не удалось подключить кошелек';
}
} catch (err) {
console.error('Error connecting wallet:', err);
// console.error('Error connecting wallet:', err);
error.value = err.message || 'Произошла ошибка при подключении кошелька';
} finally {
isLoading.value = false;

View File

@@ -180,7 +180,7 @@ watch(editing, (val) => {
// Добавляем watch для отслеживания изменений в мультисвязях с дебаунсингом
let debounceTimer = null;
watch(editMultiRelationValues, (newValues, oldValues) => {
console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
// console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
// Очищаем предыдущий таймер
if (debounceTimer) {
@@ -204,7 +204,7 @@ let unsubscribeFromWebSocket = null;
// Функция для очистки кэша
function clearCache() {
cacheService.clearAll();
console.log('[TableCell] Кэш очищен');
// console.log('[TableCell] Кэш очищен');
}
// WebSocket для тегов
@@ -223,7 +223,7 @@ let isMultiRelationValuesLoaded = false;
onMounted(async () => {
const startTime = Date.now();
console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
// console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
if (props.column.type === 'multiselect') {
multiOptions.value = (props.column.options && props.column.options.options) || [];
@@ -250,14 +250,14 @@ onMounted(async () => {
} else if (props.column.type === 'multiselect-relation') {
// Загружаем опции только один раз
if (!isInitialized) {
console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
// console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
await loadMultiRelationOptions();
isInitialized = true;
}
// Загружаем relations только один раз для каждой комбинации rowId + columnId
if (!isMultiRelationValuesLoaded) {
console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
// console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
await loadMultiRelationValues();
isMultiRelationValuesLoaded = true;
}
@@ -265,7 +265,7 @@ onMounted(async () => {
// Подписываемся на обновления таблицы
if (props.column.type === 'multiselect-relation') {
unsubscribeFromWebSocket = subscribeToTableRelationsUpdates(props.column.table_id, async () => {
console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
// console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
// Сбрасываем флаг загрузки
isMultiRelationValuesLoaded = false;
// Очищаем кэш relations для текущей строки
@@ -277,7 +277,7 @@ onMounted(async () => {
// Подписываемся на обновления тегов, если это связанная таблица тегов
if (props.column.options && props.column.options.relatedTableId) {
unsubscribeFromTags = onTagsUpdate(async () => {
console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
// console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
// Сбрасываем флаги загрузки
isInitialized = false;
isMultiRelationValuesLoaded = false;
@@ -300,7 +300,7 @@ onMounted(async () => {
localValue.value = cell ? cell.value : '';
}
const endTime = Date.now();
console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
// console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
});
onUnmounted(() => {
@@ -487,7 +487,7 @@ async function loadLookupValues() {
async function loadMultiRelationOptions() {
// Проверяем, не загружены ли уже опции
if (multiRelationOptions.value.length > 0) {
console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
// console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
return;
}
@@ -499,10 +499,10 @@ async function loadMultiRelationOptions() {
let tableData;
if (cachedTableData) {
console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
// console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
tableData = cachedTableData;
} else {
console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
// console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
const response = await fetch(`/api/tables/${rel.relatedTableId}`);
tableData = await response.json();
// Сохраняем в кэш
@@ -517,9 +517,9 @@ async function loadMultiRelationOptions() {
opts.push({ id: row.id, display: cell ? cell.value : `ID ${row.id}` });
}
multiRelationOptions.value = opts;
console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
// console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
} catch (e) {
console.error('[loadMultiRelationOptions] Error:', e);
// console.error('[loadMultiRelationOptions] Error:', e);
}
}
}
@@ -531,7 +531,7 @@ const LOAD_DEBOUNCE_DELAY = 50; // 50ms (уменьшено для ускоре
async function loadMultiRelationValues() {
// Проверяем, не загружены ли уже данные
if (isMultiRelationValuesLoaded) {
console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
// console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
return;
}
@@ -543,7 +543,7 @@ async function loadMultiRelationValues() {
// Устанавливаем новый таймер
loadMultiRelationValuesTimer = setTimeout(async () => {
// Получаем связи для текущей строки
console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
// console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
try {
const rel = props.column.options || {};
@@ -554,10 +554,10 @@ async function loadMultiRelationValues() {
const cachedRelations = cacheService.getRelationsData(props.rowId, props.column.id);
if (cachedRelations) {
console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
// console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
relations = cachedRelations;
} else {
console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
// console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
// Выполняем запросы параллельно
const [relationsRes, tableRes] = await Promise.all([
fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`),
@@ -573,13 +573,13 @@ async function loadMultiRelationValues() {
cacheService.setRelationsData(props.rowId, props.column.id, relations);
}
console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
// console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
// Приводим все id к строке для корректного сравнения
const relatedRowIds = relations
.filter(r => String(r.column_id) === String(props.column.id) && String(r.to_table_id) === String(rel.relatedTableId))
.map(r => String(r.to_row_id));
console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
// console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
// Обновляем значения
editMultiRelationValues.value = relatedRowIds;
@@ -603,48 +603,48 @@ async function loadMultiRelationValues() {
selectedMultiRelationNames.value = multiRelationOptions.value
.filter(opt => relatedRowIds.includes(String(opt.id)))
.map(opt => opt.display);
console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
// console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
// Отмечаем, что данные загружены
isMultiRelationValuesLoaded = true;
}
} catch (e) {
console.error('[loadMultiRelationValues] Error:', e);
// console.error('[loadMultiRelationValues] Error:', e);
}
}, LOAD_DEBOUNCE_DELAY);
}
async function saveMultiRelation() {
console.log('[saveMultiRelation] called');
// console.log('[saveMultiRelation] called');
const rel = props.column.options || {};
console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
// console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
try {
const payload = {
column_id: props.column.id,
to_table_id: rel.relatedTableId,
to_row_ids: editMultiRelationValues.value
};
console.log('[saveMultiRelation] POST payload:', payload);
console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
console.log('[TableCell] Данные запроса:', payload);
// console.log('[saveMultiRelation] POST payload:', payload);
// console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
// console.log('[TableCell] Данные запроса:', payload);
const response = await fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json().catch(() => ({}));
console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
// console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
if (response.ok) {
console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
// console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
} else {
console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
// console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
}
editing.value = false;
await loadMultiRelationValues();
console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
// console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
emit('update', editMultiRelationValues.value);
} catch (e) {
console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
// console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
}
}
@@ -653,7 +653,7 @@ async function addTag() {
const rel = props.column.options || {};
try {
console.log('[addTag] Добавляем новый тег:', newTagName.value);
// console.log('[addTag] Добавляем новый тег:', newTagName.value);
// 1. Создаем новую пустую строку в связанной таблице
const rowResponse = await fetch(`/api/tables/${rel.relatedTableId}/rows`, {
@@ -662,7 +662,7 @@ async function addTag() {
});
const newRow = await rowResponse.json();
console.log('[addTag] Новая строка создана:', newRow);
// console.log('[addTag] Новая строка создана:', newRow);
// 2. Добавляем значение в ячейку через POST /cell
const cellResponse = await fetch(`/api/tables/cell`, {
@@ -676,7 +676,7 @@ async function addTag() {
});
const cellResult = await cellResponse.json();
console.log('[addTag] Значение ячейки сохранено:', cellResult);
// console.log('[addTag] Значение ячейки сохранено:', cellResult);
// Очищаем форму
newTagName.value = '';
@@ -688,12 +688,12 @@ async function addTag() {
Promise.resolve(editMultiRelationValues.value.push(String(newRow.id)))
]);
console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
// console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
// Сохраняем изменения, чтобы отправить WebSocket уведомление
await saveMultiRelation();
} catch (e) {
console.error('[addTag] Ошибка при добавлении тега:', e);
// console.error('[addTag] Ошибка при добавлении тега:', e);
}
}
@@ -702,13 +702,13 @@ async function deleteTag(tagId) {
if (!confirm('Удалить этот тег?')) return;
try {
console.log('[deleteTag] Удаляем тег с ID:', tagId);
// console.log('[deleteTag] Удаляем тег с ID:', tagId);
// Удаляем тег из связанной таблицы
const response = await fetch(`/api/tables/row/${tagId}`, { method: 'DELETE' });
const result = await response.json();
console.log('[deleteTag] Ответ сервера:', response.status, result);
// console.log('[deleteTag] Ответ сервера:', response.status, result);
// Убираем тег из выбранных значений, если он был выбран
editMultiRelationValues.value = editMultiRelationValues.value.filter(id => String(id) !== String(tagId));
@@ -716,12 +716,12 @@ async function deleteTag(tagId) {
// Обновляем список опций
await loadMultiRelationOptions();
console.log('[deleteTag] Тег удален:', tagId);
// console.log('[deleteTag] Тег удален:', tagId);
// Сохраняем изменения, чтобы отправить WebSocket уведомление
await saveMultiRelation();
} catch (e) {
console.error('[deleteTag] Ошибка при удалении тега:', e);
// console.error('[deleteTag] Ошибка при удалении тега:', e);
}
}

View File

@@ -361,7 +361,7 @@ async function fetchFilteredRows() {
params.append(def.filterKey, Array.isArray(val) ? val.join(',') : val);
}
}
console.log('fetchFilteredRows params:', params.toString()); // Для отладки
// console.log('fetchFilteredRows params:', params.toString()); // Для отладки
const data = await tablesService.getFilteredRows(props.tableId, params);
// Локальная фильтрация по multiselect-relation (если backend не фильтрует)
filteredRows.value = data.filter(row => {
@@ -387,7 +387,7 @@ async function fetchFilteredRows() {
// Основная загрузка таблицы
async function fetchTable() {
const startTime = Date.now();
console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
// console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
const data = await tablesService.getTable(props.tableId);
columns.value = data.columns;
@@ -395,12 +395,12 @@ async function fetchTable() {
cellValues.value = data.cellValues;
tableMeta.value = { name: data.name, description: data.description };
console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
// console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
// Предварительно загружаем все relations для всех строк параллельно
const relationColumns = columns.value.filter(col => col.type === 'multiselect-relation');
if (relationColumns.length > 0) {
console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
// console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
const relationPromises = [];
for (const row of rows.value) {
@@ -413,7 +413,7 @@ async function fetchTable() {
return { rowId: row.id, colId: col.id, relations };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
// console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
return { rowId: row.id, colId: col.id, relations: [] };
});
relationPromises.push(promise);
@@ -422,7 +422,7 @@ async function fetchTable() {
// Ждем загрузки всех relations
const results = await Promise.all(relationPromises);
console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
// console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
}
// Предварительно загружаем данные связанных таблиц для опций
@@ -434,7 +434,7 @@ async function fetchTable() {
}
if (relatedTableIds.size > 0) {
console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
// console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
const tablePromises = Array.from(relatedTableIds).map(tableId =>
fetch(`/api/tables/${tableId}`)
@@ -445,13 +445,13 @@ async function fetchTable() {
return { tableId, tableData };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
// console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
return { tableId, tableData: null };
})
);
const tableResults = await Promise.all(tablePromises);
console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
// console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
}
// Выполняем обновление фильтров и фильтрацию строк параллельно
@@ -462,15 +462,15 @@ async function fetchTable() {
// Выводим статистику кэша для отладки
const cacheStats = cacheService.getStats();
console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
tableCacheSize: cacheStats.tableCacheSize,
relationsCacheSize: cacheStats.relationsCacheSize,
tableCacheKeys: cacheStats.tableCacheKeys,
relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
});
// console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
// tableCacheSize: cacheStats.tableCacheSize,
// relationsCacheSize: cacheStats.relationsCacheSize,
// tableCacheKeys: cacheStats.tableCacheKeys,
// relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
// });
const endTime = Date.now();
console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
// console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
}
async function updateRelationFilterDefs() {
@@ -485,7 +485,7 @@ async function updateRelationFilterDefs() {
// Проверяем кэш
const cached = cacheService.getTableData(tableId);
if (cached) {
console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
// console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
relatedTableMap.set(tableId, Promise.resolve(cached));
} else {
relatedTableMap.set(tableId, tablesService.getTable(tableId));
@@ -536,7 +536,7 @@ async function updateRelationFilterDefs() {
});
}
}
console.log('relationFilterDefs:', defs); // Для отладки
// console.log('relationFilterDefs:', defs); // Для отладки
relationFilterDefs.value = defs;
}
@@ -553,7 +553,7 @@ onMounted(() => {
fetchTable();
// Подписка на WebSocket обновления таблицы
unsubscribeFromTableUpdate = websocketService.onTableUpdate(props.tableId, () => {
console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
// console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
// Очищаем кэш текущей таблицы
cacheService.clearTableCache(props.tableId);
fetchTable();
@@ -561,15 +561,15 @@ onMounted(() => {
// Подписка на WebSocket обновления тегов
const { onTagsUpdate } = useTagsWebSocket();
console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
// console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
// console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
unsubscribeFromTagsUpdate = onTagsUpdate(async (data) => {
console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
// console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
// console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
// Если есть информация о конкретной строке, обновляем только её
if (data && data.rowId) {
console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
// console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
try {
// Очищаем кэш relations только для конкретной строки
const tagColumns = columns.value.filter(col =>
@@ -581,19 +581,19 @@ onMounted(() => {
cacheService.clearRelationsData(data.rowId, col.id);
}
console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
// console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
// Обновляем только данные конкретной строки
await updateRowData(data.rowId);
console.log('[UserTableView] Данные строки обновлены:', data.rowId);
// console.log('[UserTableView] Данные строки обновлены:', data.rowId);
} catch (error) {
console.error('[UserTableView] Ошибка при точечном обновлении:', error);
// console.error('[UserTableView] Ошибка при точечном обновлении:', error);
// Fallback: полная перезагрузка при ошибке
await fetchTable();
}
} else {
// Если нет информации о строке, используем старую логику
console.log('[UserTableView] Общее обновление тегов');
// console.log('[UserTableView] Общее обновление тегов');
try {
// Очищаем кэш relations для всех строк этой таблицы
const tableRows = rows.value || [];
@@ -609,11 +609,11 @@ onMounted(() => {
}
}
console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
// console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
await fetchTable();
console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
// console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
} catch (error) {
console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
// console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
// Fallback: полная перезагрузка при ошибке
cacheService.clearTableCache(props.tableId);
await fetchTable();
@@ -764,13 +764,13 @@ async function rebuildIndex() {
// Функция для точечного обновления данных конкретной строки
async function updateRowData(rowId) {
const startTime = Date.now();
console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
// console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
try {
// Находим строку в текущих данных
const rowIndex = rows.value.findIndex(row => row.id === rowId);
if (rowIndex === -1) {
console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
// console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
return;
}
@@ -781,7 +781,7 @@ async function updateRowData(rowId) {
);
if (tagColumns.length > 0) {
console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
// console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
const relationPromises = tagColumns.map(col =>
fetch(`/api/tables/${col.table_id}/row/${rowId}/relations`)
@@ -792,19 +792,19 @@ async function updateRowData(rowId) {
return { rowId, colId: col.id, relations };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
// console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
return { rowId, colId: col.id, relations: [] };
})
);
await Promise.all(relationPromises);
console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
// console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
}
const endTime = Date.now();
console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
// console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
} catch (error) {
console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
// console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
throw error;
}
}