refactor(frontend): dedupliziere JS-Code und fixe Bugs

- fix: _oldestLoadedMessageId → _oldestLoadedSortKey (chat.js, chat-page.js)
- move: formatTimestamp nach ui-helpers.js (war _formatTimestamp in msg-actions.js)
- move: _isReviewMessage nach ui-helpers.js (war in history.js)
- add: _getSubAgentMeta + _createSubAgentHeader in ui-helpers.js
- refactor: stream-ui.js + history.js nutzen _createSubAgentHeader
- refactor: flushText() Hilfsfunktion in _renderReviewGroup (history.js)
- refactor: shared-page.js nutzt _mergeConsecutiveAssistantTexts statt eigener Kopie
- refactor: _initCardMenu + _onCardMenuAction Helper in dashboard.js

-53 Zeilen netto
This commit is contained in:
Meleki committed 2026-03-09 07:17:54 +01:00
1 parent 57560cbbea
commit 33934b2c4a
9 files changed
+114 -167

No files matched your search

+47
View File
@@ -154,6 +154,19 @@ function formatDate(iso) {
});
}
function formatTimestamp(isoString) {
if (!isoString) return '';
var d = new Date(isoString);
if (isNaN(d.getTime())) return '';
var dd = String(d.getDate()).padStart(2, '0');
var mm = String(d.getMonth() + 1).padStart(2, '0');
var yyyy = d.getFullYear();
var hh = String(d.getHours()).padStart(2, '0');
var min = String(d.getMinutes()).padStart(2, '0');
var ss = String(d.getSeconds()).padStart(2, '0');
return dd + '.' + mm + '.' + yyyy + ' ' + hh + ':' + min + ':' + ss;
}
// ── Meta Bar ──
function setMeta(text) {
@@ -205,6 +218,40 @@ function removeArchiveLoadButton() {
btns.forEach(b => b.remove());
}
// ── Review/Sub-Agent Helpers ──
function _isReviewMessage(content) {
return content && (content.startsWith('[Review:') || content.startsWith('[Review-Feedback') || content.startsWith('[Finalizer:') || content.startsWith('[Preparer:'));
}
/**
* Returns { icon, defaultName } for a sub-agent type.
* @param {string} agentType - 'preparer', 'finalizer', or 'review'
*/
function _getSubAgentMeta(agentType) {
if (agentType === 'preparer') return { icon: 'fa-filter', defaultName: 'Vorbereiter-Agent' };
if (agentType === 'finalizer') return { icon: 'fa-flag-checkered', defaultName: 'Finalizer-Agent' };
return { icon: 'fa-check-circle-o', defaultName: 'Review-Agent' };
}
/**
* Creates a review/sub-agent header element.
* @param {string} agentType - 'preparer', 'finalizer', or 'review'
* @param {string} agentName - Display name of the agent
* @param {object} [extra] - Optional: { round, maxRounds } for review
*/
function _createSubAgentHeader(agentType, agentName, extra) {
var meta = _getSubAgentMeta(agentType);
var header = document.createElement('div');
header.className = 'review-header';
var html = '<i class="fa ' + meta.icon + '"></i> <strong>' + esc(agentName || meta.defaultName) + '</strong>';
if (agentType === 'review' && extra && extra.round) {
html += ' <span class="review-round">Runde ' + extra.round + '/' + extra.maxRounds + '</span>';
}
header.innerHTML = html;
return header;
}
// ── Streamed Elements ──
function removeStreamedElements() {