@meloniwastaken/prri-jira-viewer 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -9
- package/dist/assets/index-BrA7kY7g.css +1 -0
- package/dist/assets/index-BsI9oNc3.js +9 -0
- package/dist/index.html +2 -2
- package/package.json +7 -2
- package/server.js +203 -38
- package/dist/assets/index-4x__MVw7.css +0 -1
- package/dist/assets/index-z0Qe69X_.js +0 -9
package/README.md
CHANGED
|
@@ -1,16 +1,85 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PRRI Jira Sprint Viewer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Sprint board viewer per il progetto PRRI su Jira Cloud. Mostra epiche, story, bug e sottotask in una vista gerarchica con possibilita di creare issue direttamente dalla board.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Requisiti
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
- [
|
|
7
|
+
- **Node.js** >= 18
|
|
8
|
+
- **Jira API Token** ([genera qui](https://id.atlassian.com/manage-profile/security/api-tokens))
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Installazione e avvio rapido
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Un solo comando, non serve installare nulla:
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
```bash
|
|
15
|
+
npx @meloniwastaken/prri-jira-viewer
|
|
16
|
+
```
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
Si apre il browser su `http://localhost:3000`. Inserisci le credenziali Jira nel form di login:
|
|
19
|
+
|
|
20
|
+
| Campo | Valore |
|
|
21
|
+
|-------|--------|
|
|
22
|
+
| **Email** | La tua email Jira (es. `nome.cognome@vmway.it`) |
|
|
23
|
+
| **API Token** | Il token generato da Atlassian |
|
|
24
|
+
|
|
25
|
+
## Configurazione avanzata
|
|
26
|
+
|
|
27
|
+
### Porta personalizzata
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
PORT=4000 npx @meloniwastaken/prri-jira-viewer
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Credenziali via variabili d'ambiente
|
|
34
|
+
|
|
35
|
+
Se preferisci non usare il form di login, puoi passare le credenziali direttamente:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
JIRA_EMAIL=nome@email.com JIRA_TOKEN=il-tuo-token npx @meloniwastaken/prri-jira-viewer
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Con le variabili d'ambiente impostate, il login viene saltato automaticamente.
|
|
42
|
+
|
|
43
|
+
### URL Jira personalizzato
|
|
44
|
+
|
|
45
|
+
Se l'istanza Jira non e quella di default:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
JIRA_URL=https://la-tua-istanza.atlassian.net npx @meloniwastaken/prri-jira-viewer
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Funzionalita
|
|
52
|
+
|
|
53
|
+
- **Vista gerarchica**: Epiche > Story/Sottotask > Bug con struttura ad albero
|
|
54
|
+
- **Creazione issue**: Clicca il pulsante **+** su un'epica per creare una Story, o su una Story/Sottotask per creare un Bug. L'issue viene creata via API con il parent gia assegnato
|
|
55
|
+
- **Dettaglio issue**: Clicca su qualsiasi issue per vedere descrizione, stato, assegnatario e commenti
|
|
56
|
+
- **Barra di progresso**: Avanzamento completamento per ogni epica
|
|
57
|
+
- **Filtro completate**: Toggle per nascondere le issue completate
|
|
58
|
+
- **Refresh**: Aggiorna i dati dalla board Jira con un click
|
|
59
|
+
|
|
60
|
+
## Sviluppo locale
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Clona il repo e installa le dipendenze
|
|
64
|
+
cd lda-jira-viewer
|
|
65
|
+
npm install
|
|
66
|
+
|
|
67
|
+
# Crea un file .env con le credenziali
|
|
68
|
+
cat > .env << EOF
|
|
69
|
+
JIRA_URL=https://regcam-projectmgm.atlassian.net
|
|
70
|
+
JIRA_EMAIL=nome@email.com
|
|
71
|
+
JIRA_TOKEN=il-tuo-token
|
|
72
|
+
EOF
|
|
73
|
+
|
|
74
|
+
# Avvia server Express + Vite in dev mode
|
|
75
|
+
npm run dev:all
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Il frontend e disponibile su `http://localhost:5173` con hot-reload.
|
|
79
|
+
|
|
80
|
+
## Pubblicazione
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Bumpa la versione in package.json, poi:
|
|
84
|
+
npm publish --access public
|
|
85
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,sans-serif;line-height:1.5;font-weight:400;color:#172b4d;background-color:#f4f5f7;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}*{box-sizing:border-box;margin:0;padding:0}body{min-height:100vh}a{color:#0052cc;text-decoration:none}a:hover{text-decoration:underline}.app{max-width:960px;margin:0 auto;padding:24px 16px}.sprint-header{margin-bottom:24px}.sprint-title-row{display:flex;align-items:center;gap:12px;margin-bottom:16px}.sprint-title-row h1{font-size:1.6rem;font-weight:600;color:#172b4d}.create-epic-btn{background:#0052cc;color:#fff;border:none;border-radius:4px;padding:6px 14px;font-size:.85rem;font-weight:600;cursor:pointer;transition:background .15s}.create-epic-btn:hover{background:#0065ff}.refresh-btn{background:none;border:1px solid #dfe1e5;border-radius:4px;padding:4px 10px;font-size:1.2rem;cursor:pointer;color:#6b778c;transition:all .15s}.refresh-btn:hover{background:#ebecf0;color:#172b4d}.sprint-stats{display:flex;gap:16px;flex-wrap:wrap}.stat{background:#fff;border:1px solid #dfe1e5;border-radius:8px;padding:12px 20px;text-align:center;min-width:80px}.stat-value{display:block;font-size:1.5rem;font-weight:700;color:#172b4d}.stat-done .stat-value{color:#064}.stat-progress .stat-value{color:#0052cc}.stat-todo .stat-value{color:#6b778c}.stat-label{display:block;font-size:.75rem;color:#6b778c;text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.hide-completed-toggle{display:flex;align-items:center;gap:6px;font-size:.85rem;color:#6b778c;cursor:pointer;-webkit-user-select:none;user-select:none;margin-top:12px}.hide-completed-toggle input{cursor:pointer;accent-color:#0052cc}.epic-card{background:#fff;border:1px solid #dfe1e5;border-radius:8px;margin-bottom:12px;overflow:hidden}.epic-header{padding:16px 20px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s}.epic-header:hover{background:#fafbfc}.epic-title-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}.epic-chevron{font-size:.7rem;color:#6b778c;transition:transform .2s;display:inline-block}.epic-chevron.expanded{transform:rotate(90deg)}.epic-key{font-size:.8rem;font-weight:600;color:#0052cc;white-space:nowrap}.epic-name{font-size:1rem;font-weight:600;color:#172b4d;flex:1}.epic-count{font-size:.8rem;color:#6b778c;white-space:nowrap}.epic-progress{display:flex;align-items:center;gap:12px}.progress-bar{flex:1;height:6px;background:#dfe1e5;border-radius:3px;overflow:hidden}.progress-fill{height:100%;background:#36b37e;border-radius:3px;transition:width .3s ease}.progress-text{font-size:.75rem;color:#6b778c;white-space:nowrap}.epic-issues{border-top:1px solid #ebecf0}.no-issues{padding:16px 20px;color:#6b778c;font-style:italic;font-size:.9rem}.issue-row{display:flex;align-items:center;gap:10px;padding:10px 20px;border-bottom:1px solid #f4f5f7;cursor:pointer;transition:background .1s}.issue-row:last-child{border-bottom:none}.issue-row:hover{background:#f4f5f7}.issue-row-child{background:#fafbfc}.issue-row-child:hover{background:#f0f1f4}.issue-indent{color:#a5adba;font-size:1rem;flex-shrink:0}.issue-type{font-size:1rem;flex-shrink:0}.issue-key{font-size:.8rem;font-weight:600;color:#0052cc;white-space:nowrap;flex-shrink:0}.issue-summary{flex:1;font-size:.9rem;color:#172b4d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issue-assignee{display:flex;align-items:center;gap:4px;font-size:.8rem;color:#6b778c;white-space:nowrap;flex-shrink:0}.avatar{width:20px;height:20px;border-radius:50%}.status-badge{display:inline-block;font-size:.7rem;font-weight:700;text-transform:uppercase;padding:2px 8px;border-radius:3px;white-space:nowrap;flex-shrink:0;letter-spacing:.3px}.dialog-overlay{position:fixed;inset:0;background:#091e428a;display:flex;align-items:center;justify-content:center;z-index:1000;padding:24px}.dialog{background:#fff;border-radius:8px;width:100%;max-width:640px;max-height:80vh;overflow-y:auto;box-shadow:0 8px 16px #091e4240}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 0}.dialog-title-row{display:flex;align-items:center;gap:12px}.dialog-key{font-size:.9rem;font-weight:700;color:#0052cc}.dialog-close{background:none;border:none;font-size:1.5rem;color:#6b778c;cursor:pointer;padding:0 4px;line-height:1}.dialog-close:hover{color:#172b4d}.dialog-summary{font-size:1.2rem;font-weight:600;color:#172b4d;padding:12px 24px 16px}.dialog-loading{padding:24px;text-align:center;color:#6b778c}.dialog-body{padding:0 24px 24px}.dialog-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px 24px;margin-bottom:20px;padding:12px 16px;background:#f4f5f7;border-radius:6px}.meta-item{display:flex;flex-direction:column;gap:2px}.meta-label{font-size:.7rem;font-weight:600;text-transform:uppercase;color:#6b778c;letter-spacing:.5px}.meta-item>span:last-child{font-size:.9rem;color:#172b4d}.dialog-description h3,.dialog-comments h3{font-size:.85rem;font-weight:600;color:#6b778c;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.dialog-description p{font-size:.9rem;color:#172b4d;line-height:1.6;margin-bottom:8px}.no-description{color:#6b778c;font-style:italic}.dialog-comments{margin-top:20px;border-top:1px solid #ebecf0;padding-top:16px}.comment{margin-bottom:12px;padding:10px 12px;background:#f4f5f7;border-radius:6px}.comment-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:.8rem}.comment-header strong{color:#172b4d}.comment-header span{color:#6b778c}.comment-body p{font-size:.85rem;color:#172b4d;line-height:1.5}.login-container{display:flex;align-items:center;justify-content:center;min-height:80vh}.login-form{background:#fff;border:1px solid #dfe1e5;border-radius:8px;padding:40px 36px;width:100%;max-width:400px;box-shadow:0 2px 8px #091e4214}.login-title{font-size:1.4rem;font-weight:700;color:#172b4d;margin-bottom:4px}.login-subtitle{font-size:.85rem;color:#6b778c;margin-bottom:24px}.login-label{display:block;font-size:.8rem;font-weight:600;color:#6b778c;text-transform:uppercase;letter-spacing:.5px;margin-bottom:16px}.login-input{display:block;width:100%;margin-top:6px;padding:8px 12px;font-size:.9rem;border:1px solid #dfe1e5;border-radius:4px;outline:none;transition:border-color .15s;box-sizing:border-box}.login-input:focus{border-color:#0052cc}.login-error{background:#ffebe6;color:#de350b;padding:8px 12px;border-radius:4px;font-size:.85rem;margin-bottom:16px}.login-btn{width:100%;background:#0052cc;color:#fff;border:none;border-radius:4px;padding:10px;font-size:.95rem;font-weight:600;cursor:pointer;transition:background .15s}.login-btn:hover{background:#0065ff}.login-btn:disabled{background:#a5adba;cursor:not-allowed}.login-help{display:block;text-align:center;margin-top:16px;font-size:.8rem;color:#0052cc;text-decoration:none}.login-help:hover{text-decoration:underline}.create-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:4px;background:#0052cc;color:#fff;font-size:.9rem;font-weight:700;line-height:1;text-decoration:none;flex-shrink:0;transition:background .15s;border:none;cursor:pointer}.create-btn:hover{background:#0065ff}.create-btn-sm{width:18px;height:18px;font-size:.75rem}.create-dialog{max-width:480px}.create-form{padding:16px 24px 24px}.create-label{display:block;font-size:.8rem;font-weight:600;color:#6b778c;text-transform:uppercase;letter-spacing:.5px;margin-bottom:16px}.create-input{display:block;width:100%;margin-top:6px;padding:8px 12px;font-size:.9rem;border:1px solid #dfe1e5;border-radius:4px;outline:none;transition:border-color .15s;box-sizing:border-box}.create-input:focus{border-color:#0052cc}.create-textarea{resize:vertical;font-family:inherit;min-height:80px}.create-actions{display:flex;justify-content:flex-end;gap:8px}.create-actions .login-btn{width:auto;padding:8px 20px;font-size:.85rem}.create-cancel{background:none;border:1px solid #dfe1e5;border-radius:4px;padding:8px 20px;font-size:.85rem;color:#6b778c;cursor:pointer;transition:all .15s}.create-cancel:hover{background:#f4f5f7;color:#172b4d}.dialog-transition{margin-bottom:20px;padding:14px 16px;background:#f4f5f7;border-radius:6px}.dialog-transition h3{font-size:.85rem;font-weight:600;color:#6b778c;text-transform:uppercase;letter-spacing:.5px;margin-bottom:10px}.transition-row{display:flex;gap:10px;align-items:center}.transition-select{flex:1;padding:8px 12px;font-size:.9rem;border:1px solid #dfe1e5;border-radius:4px;outline:none;background:#fff;transition:border-color .15s}.transition-select:focus{border-color:#0052cc}.transition-save-btn{background:#0052cc;color:#fff;border:none;border-radius:4px;padding:8px 20px;font-size:.85rem;font-weight:600;cursor:pointer;transition:background .15s;white-space:nowrap}.transition-save-btn:hover:not(:disabled){background:#0065ff}.transition-save-btn:disabled{background:#a5adba;cursor:not-allowed}.transition-error{margin-top:8px;background:#ffebe6;color:#de350b;padding:6px 10px;border-radius:4px;font-size:.8rem}.loading{text-align:center;padding:60px 24px;color:#6b778c;font-size:1.1rem}.error{text-align:center;padding:60px 24px;color:#de350b}.error button{margin-top:12px;background:#0052cc;color:#fff;border:none;border-radius:4px;padding:8px 20px;font-size:.9rem;cursor:pointer}.error button:hover{background:#0065ff}
|