136 lines
7.0 KiB
HTML
136 lines
7.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Jira Ticket Extractor</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=DM+Sans:wght@300;400;500;600;700;900&display=swap" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
|
|
<link rel="stylesheet" href="css/style.css">
|
|
</head>
|
|
<body>
|
|
<div class="bg-grid"></div>
|
|
<div class="bg-glow bg-glow--1"></div>
|
|
<div class="toast-container" id="toastContainer"></div>
|
|
|
|
<div class="app">
|
|
<header class="header">
|
|
<div class="header-icon"><i class="fa-solid fa-bolt"></i></div>
|
|
<div class="header-text">
|
|
<h1>Jira Ticket Extractor</h1>
|
|
<p>Extraction via API locale — Proxy transparent</p>
|
|
</div>
|
|
<div class="badge-api"><i class="fa-solid fa-server"></i>API : localhost:3000</div>
|
|
</header>
|
|
|
|
<section class="card-form">
|
|
<div class="card-title"><i class="fa-solid fa-filter"></i> Paramètres d'extraction</div>
|
|
<div class="alert alert-info">
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<div>Le proxy d'entreprise et l'URL Jira sont gérés par le backend (<code>config.ini</code>). Ici, fournissez uniquement vos identifiants Jira et les filtres du projet.</div>
|
|
</div>
|
|
<div class="form-grid">
|
|
<div class="form-group">
|
|
<label for="username">Nom d'utilisateur / Email</label>
|
|
<input type="text" id="username" placeholder="user@mondomaine.be">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="apiToken">Token API / Mot de passe</label>
|
|
<input type="password" id="apiToken" placeholder="votre-token-api-jira">
|
|
<span class="hint">Jira Cloud : Personal Access Token. Jira Server : mot de passe.</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="projectKey">Clé du projet</label>
|
|
<input type="text" id="projectKey" class="uppercase-input" placeholder="PROJ" oninput="autoJql()">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="customFields">Champs personnalisés (optionnel)</label>
|
|
<input type="text" id="customFields" placeholder="customfield_10001:Production Date">
|
|
<span class="hint">Format : customfield_ID:NomAffiché, séparés par virgules</span>
|
|
</div>
|
|
<div class="form-group full">
|
|
<label for="jqlQuery">Requête JQL (optionnel)</label>
|
|
<textarea id="jqlQuery" placeholder='project = "PROJ" AND status != Deleted ORDER BY created DESC' rows="2"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="btn-group mt-24">
|
|
<button class="btn btn-primary" id="extractBtn" onclick="startExtraction()">
|
|
<i class="fa-solid fa-download"></i> Lancer l'extraction
|
|
</button>
|
|
<button class="btn btn-secondary" onclick="pingApi()">
|
|
<i class="fa-solid fa-plug"></i> Tester l'API
|
|
</button>
|
|
</div>
|
|
</section>
|
|
|
|
<div id="results-section">
|
|
<div class="stats-row" id="statsRow"></div>
|
|
|
|
<div class="card card-actions">
|
|
<div class="actions-wrapper">
|
|
<div class="tabs">
|
|
<button class="tab-btn active" onclick="switchTab('table', this)"><i class="fa-solid fa-table"></i>Tableau</button>
|
|
<button class="tab-btn" onclick="switchTab('roadmap', this)"><i class="fa-solid fa-timeline"></i>Roadmap</button>
|
|
<button class="tab-btn" onclick="switchTab('json', this)"><i class="fa-solid fa-code"></i>JSON Brut</button>
|
|
</div>
|
|
<div class="btn-group no-margin">
|
|
<button class="btn btn-secondary" onclick="copyJSON()"><i class="fa-solid fa-copy"></i> Copier</button>
|
|
<button class="btn btn-primary" onclick="downloadJSON()"><i class="fa-solid fa-file-arrow-down"></i> Telecharger</button>
|
|
<button class="btn btn-danger" onclick="clearResults()"><i class="fa-solid fa-trash"></i> Effacer</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="search-bar">
|
|
<i class="fa-solid fa-magnifying-glass"></i>
|
|
<input type="text" id="searchInput" placeholder="Rechercher..." oninput="filterTable()">
|
|
</div>
|
|
|
|
<div class="tab-panel active" id="panel-table">
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead id="tableHead"></thead>
|
|
<tbody id="tableBody"></tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="tab-panel" id="panel-roadmap">
|
|
<div class="toolbar-roadmap">
|
|
<div class="view-controls">
|
|
<span class="mr-8"><i class="fa-solid fa-magnifying-glass-plus"></i> Vue :</span>
|
|
<div class="btn-group no-margin">
|
|
<button class="btn btn-secondary btn-sm" onclick="setGanttView('month')">Mois</button>
|
|
<button class="btn btn-secondary btn-sm" onclick="setGanttView('quarter')">Trimestres</button>
|
|
<button class="btn btn-secondary btn-sm" onclick="setGanttView('year')">Années</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="export-drawio-box">
|
|
<span class="mr-8 export-label">
|
|
<i class="fa-solid fa-diagram-project"></i> EXPORT DRAW.IO (XML)
|
|
</span>
|
|
<div class="btn-group">
|
|
<button class="btn btn-secondary btn-sm" onclick="exportDrawIOXML('download')">
|
|
<i class="fa-solid fa-file-download"></i> Télécharger
|
|
</button>
|
|
<button class="btn btn-secondary btn-sm" onclick="exportDrawIOXML('copy')">
|
|
<i class="fa-solid fa-copy"></i> Copier XML
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card p-20">
|
|
<div id="roadmapPreview"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-panel" id="panel-json"><div class="json-viewer" id="jsonViewer"></div></div>
|
|
</div>
|
|
</div>
|
|
<script src="/js/script.js"></script>
|
|
|
|
</body>
|
|
</html> |