Gitea-Projektintegration im Ticket-Frontend dauerhaft einbinden.

Projekt-Zuweisung, README-Anzeige und Admin-API-Hooks ins Repo committen, damit deploy.sh die Änderungen nicht mehr verwirft.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Webklar Deploy
2026-06-08 10:54:46 +00:00
parent 4a2e94bc83
commit 8abf11ad18
14 changed files with 1659 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
import { useState } from 'react'
import { FaLock, FaLockOpen, FaPlay, FaStop, FaTruck, FaSackDollar, FaUserGear, FaPlus, FaClockRotateLeft } from 'react-icons/fa6'
import { FaLock, FaLockOpen, FaPlay, FaStop, FaTruck, FaSackDollar, FaUserGear, FaPlus, FaClockRotateLeft, FaPen } from 'react-icons/fa6'
import { formatDistanceToNow, format } from 'date-fns'
import { de } from 'date-fns/locale'
import StatusDropdown from './StatusDropdown'
@@ -10,7 +10,8 @@ import CreateWorksheetModal from './CreateWorksheetModal'
import StatusHistoryModal from './StatusHistoryModal'
import WorksheetList from './WorksheetList'
import WorksheetStats from './WorksheetStats'
import WebpageProjectPanel from './WebpageProjectPanel'
import TicketAssignedProjectsPanel from './TicketAssignedProjectsPanel'
import TicketProjectsModal from './TicketProjectsModal'
import { useWorksheets } from '../hooks/useWorksheets'
const PRIORITY_CLASSES = {
@@ -49,6 +50,8 @@ export default function TicketRow({ ticket, onUpdate, onExpand }) {
const [locked, setLocked] = useState(true)
const [showCreateWorksheet, setShowCreateWorksheet] = useState(false)
const [showHistoryModal, setShowHistoryModal] = useState(false)
const [showProjectsModal, setShowProjectsModal] = useState(false)
const [projectsRefreshKey, setProjectsRefreshKey] = useState(0)
// Worksheets für dieses Ticket laden (nur wenn expanded)
const {
@@ -267,6 +270,19 @@ export default function TicketRow({ ticket, onUpdate, onExpand }) {
>
<FaPlus style={{ marginRight: '8px' }} /> Add Worksheet
</button>
<button
type="button"
style={{
background: '#3b82f6', color: 'white', border: 'none', padding: '12px',
borderRadius: '8px', cursor: 'pointer', display: 'flex', alignItems: 'center',
justifyContent: 'center', minWidth: '44px', width: '44px',
}}
onClick={() => setShowProjectsModal(true)}
title="Projekte bearbeiten"
>
<FaPen size={18} />
</button>
{/* History Icon Button - klein, grau, nur Icon */}
<button
@@ -317,7 +333,7 @@ export default function TicketRow({ ticket, onUpdate, onExpand }) {
</div>
</div>
<WebpageProjectPanel ticket={ticket} />
<TicketAssignedProjectsPanel ticket={ticket} refreshKey={projectsRefreshKey} />
{/* Gesamtarbeitszeit und Worksheet-Liste - 100% Breite unter dem Bento Box */}
<div style={{
@@ -350,6 +366,13 @@ export default function TicketRow({ ticket, onUpdate, onExpand }) {
worksheets={worksheets}
ticket={ticket}
/>
<TicketProjectsModal
isOpen={showProjectsModal}
onClose={() => setShowProjectsModal(false)}
ticket={ticket}
onUpdated={() => setProjectsRefreshKey((k) => k + 1)}
/>
<tr className="spacer">
<td colSpan={10} style={{ height: '12px', background: 'transparent', border: 'none' }}></td>
</tr>