ваше сообщение коммита
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@ async function deleteMessagesSelected() {
|
||||
deletedConversations += result.deletedConversations || 0;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
|
||||
// console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 '';
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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 = '';
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user