@esfaenza/admin-module 20.3.24 → 20.3.25
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.
|
@@ -866,6 +866,7 @@ class AdmDetailsV2Loc extends LocalizationService {
|
|
|
866
866
|
super.set("it->en", "Errore", ["Error"]);
|
|
867
867
|
super.set("it->en", "Nodo non trovato", ["Node not found"]);
|
|
868
868
|
super.set("it->en", "Sessione non trovata: non esiste più e nella finestra non era attiva", ["Session not found: it no longer exists and was not active in the window"]);
|
|
869
|
+
super.set("it->en", "Sullo storico il nodo si cerca solo negli snapshot della finestra: prova \"Dal vivo\" o una finestra più ampia", ["In history the node is only looked up in the window's snapshots: try \"Live\" or a wider window"]);
|
|
869
870
|
super.set("it->en", "Carico i Dati", ["Loading data"]);
|
|
870
871
|
super.set("it->en", "Copia", ["Copy"]);
|
|
871
872
|
super.set("it->en", "Copiato", ["Copied"]);
|
|
@@ -1529,11 +1530,11 @@ class AdmDetailsV2Component {
|
|
|
1529
1530
|
return dayjs(date).format(this.lc.token("getFullDateDisplayFormat"));
|
|
1530
1531
|
}
|
|
1531
1532
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: AdmDetailsV2Component, deps: [{ token: i1.LocalizationService }, { token: i1$1.DateService }, { token: AdminModuleBaseService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1532
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: AdmDetailsV2Component, isStandalone: false, selector: "adm-details-v2", inputs: { Be: "Be", CanShowSessions: "CanShowSessions", CanOpenProfiler: "CanOpenProfiler" }, outputs: { closed: "closed", sessionsOnEvent: "sessionsOnEvent", openProfiler: "openProfiler" }, providers: [{ provide: LocalizationService, useClass: AdmDetailsV2Loc }], ngImport: i0, template: "<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <!-- Navigazione: \"Indietro\" torna al dettaglio precedente con la sua finestra (D1) -->\n <div class=\"modal-header dv2-header\">\n <div class=\"dv2-heading\">\n @if (stack.length > 1) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"back()\"><i class=\"fa fa-arrow-left\"></i> {{'Indietro' | localize: lc}}</button>\n }\n <h4 class=\"modal-title\">\n @if (current?.kind == 'node') {\n {{'Dettaglio nodo' | localize: lc}}\n } @else if (current) {\n {{'Sessione' | localize: lc}} {{current.sid}},{{current.serial}}\n @if (current.instanceId) {\n <span class=\"dv2-muted\">· {{current.instanceId}}</span>\n }\n }\n </h4>\n </div>\n <button type=\"button\" class=\"close\" (click)=\"close()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n </div>\n\n <div class=\"modal-body\">\n @if (current) {\n <!-- Finestra, sorgente, aggiornamento (D2, D3, D5) -->\n <div class=\"dv2-toolbar\">\n <div class=\"dv2-group\">\n <span class=\"dv2-window\"><i class=\"fa fa-clock\"></i> {{windowLabel}}</span>\n <div class=\"dv2-seg\">\n @for (h of QuickRanges; track h) {\n <button type=\"button\" (click)=\"quickRange(h)\" [title]=\"'Ultime' | localize: lc\">{{h}} h</button>\n }\n </div>\n </div>\n <div class=\"dv2-group dv2-dates\">\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"dv2from\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime></div>\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"dv2to\" [Placeholder]=\"'A' | localize: lc\"></form-datetime></div>\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"applyDates()\" [title]=\"'Applica' | localize: lc\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"dv2-seg\">\n @if (current.kind == 'session') {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Memoria' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Memoria e storico' | localize: lc}}</button>\n } @else {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Dal vivo' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Storico' | localize: lc}}</button>\n }\n </div>\n <div class=\"dv2-group dv2-end\">\n @if (loading) {\n <i class=\"fa fa-spinner fa-spin\"></i>\n }\n @if (updatedAt) {\n <span class=\"dv2-muted\">{{'Aggiornato alle' | localize: lc}} {{updatedAt | date: 'HH:mm:ss'}}</span>\n }\n @if (autoRefresh) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"togglePause()\">\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\n </button>\n }\n </div>\n </div>\n @if (windowClamped) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'La finestra \u00E8 stata ridotta alle ultime 24 ore' | localize: lc}}</div>\n }\n\n <!-- Stati (D6) -->\n @if (error) {\n <div class=\"alert alert-warning dv2-state\">{{error}}</div>\n } @else if (notFound && !loading) {\n <div class=\"alert alert-info dv2-state\">\n {{(current.kind == 'node' ? 'Nodo non trovato' : 'Sessione non trovata: non esiste pi\u00F9 e nella finestra non era attiva') | localize: lc}}\n </div>\n } @else if (loading && !node && !session) {\n <div class=\"dv2-empty\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Carico i Dati' | localize: lc}}</div>\n }\n\n <!-- ==================== Nodo ==================== -->\n @if (node && current.kind == 'node') {\n <!-- N1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-node-name\">{{node.nodeName}}</div>\n <div class=\"dv2-meta\">\n <span><span class=\"dv2-swatch\" [style.background]=\"typeColor(node.eventTypeName, node.waitClassName)\"></span>{{typeLabel(node.eventTypeName, node.waitClassName)}}</span>\n <span class=\"dv2-muted\">Id <code>{{node.nodeId}}</code></span>\n <button type=\"button\" class=\"btn btn-sm btn-link\" (click)=\"copyName()\"><i class=\"fa\" [class.fa-copy]=\"!copied\" [class.fa-check]=\"copied\"></i> {{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\n </div>\n @if (node.fullWaitStack?.length) {\n <div class=\"dv2-path\">\n @for (item of node.fullWaitStack; track item.nodeId) {\n <span class=\"app-link dv2-path-item\" [title]=\"item.nodeName\" (click)=\"pushNode(item.nodeId)\">{{item.nodeName}}</span>\n <i class=\"fa fa-angle-right dv2-muted\"></i>\n }\n <span class=\"dv2-path-item dv2-path-current\" [title]=\"node.nodeName\">{{node.nodeName}}</span>\n </div>\n }\n <div class=\"dv2-actions\">\n @if (CanOpenProfiler) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openProfiler.emit(node.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri nel profiler' | localize: lc}}</button>\n }\n @if (CanShowSessions) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"showSessions()\" [title]=\"(node.numChildren > 0 ? 'Solo l\\'evento esatto: il lavoro dei discendenti non \u00E8 compreso' : 'Top Activity filtrata su questo evento') | localize: lc\">\n <i class=\"fa fa-users\"></i> {{'Sessioni su questo evento' | localize: lc}}\n </button>\n @if (node.numChildren > 0) {\n <span class=\"dv2-muted\">{{'discendenti esclusi' | localize: lc}}</span>\n }\n }\n </div>\n </div>\n\n <div class=\"dv2-grid\">\n <!-- N2 Statistiche -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Statistiche' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Dall\\'avvio' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Dall\\'ultimo snapshot' | localize: lc}} <span class=\"dv2-muted\">({{'dalle' | localize: lc}} {{shortTime(node.snapFrom)}})</span></th>\n } @else {\n <th class=\"dv2-right\">{{'Nella finestra' | localize: lc}} <span class=\"dv2-muted\">({{shortTime(node.snapFrom)}} - {{shortTime(node.snapTo)}})</span></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of nodeStats; track row.label) {\n <tr>\n <td>{{row.label}}</td>\n <td class=\"dv2-right\">{{row.total == null ? '\u2014' : (row.total | pv2fmt: row.kind)}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{row.snap == null ? '\u2014' : (row.snap | pv2fmt: row.kind)}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (nodeLive) {\n <div class=\"dv2-live\">\n <span>{{'Thread dentro adesso' | localize: lc}} <strong>{{node.activeThreads ?? 0}}</strong></span>\n <span>{{'In corso da' | localize: lc}} <strong>{{node.activeMaxTime ? (node.activeMaxTime | pv2fmt: 'dur') : '\u2014'}}</strong></span>\n <span>{{'Ultima uscita' | localize: lc}} <strong>{{node.lastExitTime ? localTime(node.lastExitTime) : '\u2014'}}</strong></span>\n </div>\n }\n </div>\n\n <!-- N4 Dove va il tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Dove va il tempo' | localize: lc}} <span class=\"dv2-muted\">{{'tempo proprio del sottoalbero' | localize: lc}}</span></div>\n <div class=\"dv2-typebar\">\n @for (part of typeParts; track part.label) {\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [class.dv2-idle]=\"part.idle\" [title]=\"part.label + ' ' + (part.percentage | number : '1.1-1' : 'it') + '%'\"></div>\n }\n </div>\n <div class=\"dv2-legend\">\n @for (part of typeParts; track part.label) {\n <span><span class=\"dv2-swatch\" [class.dv2-idle]=\"part.idle\" [style.background]=\"part.color\"></span>{{part.label}} <span class=\"dv2-muted\">{{part.percentage | number : '1.1-1' : 'it'}}%</span></span>\n }\n </div>\n @if (typeParts.length && typeParts[typeParts.length - 1].idle) {\n <div class=\"dv2-muted dv2-small\">{{'Idle \u00E8 tempo di attesa senza lavoro' | localize: lc}}</div>\n }\n\n <!-- N3 Per istanza -->\n @if ((node.instances?.length ?? 0) > 1) {\n <div class=\"dv2-title dv2-spaced\">{{'Per istanza' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Istanza' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Thread attivi' | localize: lc}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (inst of node.instances; track inst.instanceId) {\n <tr>\n <td class=\"app-nowrap\">{{inst.instanceId}}</td>\n <td class=\"dv2-right\">{{inst.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{inst.activeThreads ?? 0}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <!-- N6 Attivit\u00E0 nel tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{'Attivit\u00E0 nel tempo' | localize: lc}}\n <span class=\"dv2-muted\">\u2248 <strong>{{node.averageActiveSessions | number : '1.2-3' : 'it'}}</strong> {{'sessioni attive medie' | localize: lc}} · {{'picco' | localize: lc}} <strong>{{node.peakActiveSessions | number : '1.2-3' : 'it'}}</strong> · {{'un punto ogni' | localize: lc}} {{node.bucketSeconds}} s</span>\n <span class=\"dv2-estimate\" [title]=\"'Valori stimati contando i campioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\n </div>\n <activity-chart-v2 [Times]=\"nodeChartTimes\" [Components]=\"nodeChart\" [BucketSeconds]=\"node.bucketSeconds\" [Uom]=\"'sessioni' | localize: lc\"\n [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2nodechart\"></activity-chart-v2>\n @if (nodeHistoryBefore) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'Prima delle' | localize: lc}} {{nodeHistoryBefore}} {{'i dati vengono dallo storico, con meno risoluzione' | localize: lc}}</div>\n }\n @if (node.numChildren > 0) {\n <div class=\"dv2-muted dv2-small\">{{'Comprende il lavoro dei discendenti' | localize: lc}}</div>\n }\n </div>\n\n <!-- N5 Discendenti principali -->\n @if (node.numChildren > 0) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Discendenti principali' | localize: lc}} <span class=\"dv2-muted\">{{'Figli' | localize: lc}}: {{node.numChildren}} · {{'Discendenti' | localize: lc}}: {{node.numDescendants}}</span></div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Livello' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n <th class=\"dv2-right\">% {{'del nodo' | localize: lc}}</th>\n </tr>\n </thead>\n <tbody>\n @for (d of node.topDescendants ?? []; track d.nodeId) {\n <tr>\n <td><span class=\"app-link dv2-ellipsis\" [title]=\"d.nodeName\" (click)=\"pushNode(d.nodeId)\">{{d.nodeName}}</span></td>\n <td class=\"app-nowrap\">{{typeLabel(d.eventTypeName, d.waitClassName)}}</td>\n <td class=\"dv2-right\">{{d.depth}}</td>\n <td class=\"dv2-right\">{{d.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{d.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{d.percentage | number : '1.1-1' : 'it'}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n <!-- ==================== Sessione ==================== -->\n @if (session && current.kind == 'session') {\n <!-- S1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-meta dv2-session-head\">\n @if (session.connected) {\n <span class=\"dv2-badge\">{{session.currentStatus}}</span>\n } @else {\n <span class=\"dv2-badge dv2-badge-off\">{{'Terminata' | localize: lc}}</span>\n }\n <span>{{'Utente' | localize: lc}} <strong>{{session.user}}</strong>@if (session.tenant) {<span class=\"dv2-muted\"> · {{session.tenant}}</span>}</span>\n <span>{{'Tipo' | localize: lc}} <strong>{{session.type | titlecase}}</strong></span>\n @if (session.resourceConsumerGroup) {\n <span>{{'Gruppo di consumo' | localize: lc}} <strong>{{session.resourceConsumerGroup}}</strong></span>\n }\n @if (session.bgSessionName) {\n <span>{{'Sessione di background' | localize: lc}} <strong>{{session.bgSessionName}}</strong></span>\n }\n @if (session.jobName) {\n <span>Job <strong>{{session.jobName}}</strong></span>\n }\n </div>\n <div class=\"dv2-meta\">\n @if (session.startTime) {\n <span>{{'Inizio' | localize: lc}} <strong>{{localTime(session.startTime)}}</strong> <span class=\"dv2-muted\">({{'collegata da' | localize: lc}} {{connectedFor() | pv2fmt: 'dur'}})</span></span>\n }\n @if (session.numThreads != null) {\n <span>Thread <strong>{{session.numThreads}}</strong></span>\n }\n <span>{{'Ultima attivit\u00E0' | localize: lc}} <strong>{{session.lastSampleTime ? localTime(session.lastSampleTime) : '\u2014'}}</strong></span>\n </div>\n </div>\n\n <!-- S6 Sessione terminata -->\n @if (!session.connected) {\n <div class=\"alert alert-warning dv2-state\">\n {{'La sessione non esiste pi\u00F9: i suoi dati vengono dall\\'ultimo campione, delle' | localize: lc}} {{localTime(session.lastSampleTime)}}\n </div>\n }\n\n <!-- S2 Grafico -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-chart-head\">\n <span class=\"dv2-title\">\n {{'Sessioni attive medie' | localize: lc}}\n @if (session.topActivity) {\n <span class=\"dv2-muted\">\n {{'Media' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'Picco' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'un punto ogni' | localize: lc}} {{session.topActivity.bucketSeconds}} s\n </span>\n @if (session.topActivity.estimated) {\n <span class=\"dv2-estimate\">{{'stima per campionamento' | localize: lc}}</span>\n }\n }\n </span>\n <div class=\"dv2-group\">\n <div class=\"dv2-field dv2-field-wide dv2-noclear\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"'' + current.dimension\" (ngModelChange)=\"setDimension($event)\" name=\"dv2dim\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\"></form-select>\n </div>\n <div class=\"dv2-seg\">\n @for (o of Resolutions; track o.id) {\n <button type=\"button\" [class.dv2-on]=\"'' + current.resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\n }\n </div>\n </div>\n </div>\n <activity-chart-v2 [Times]=\"session.topActivity?.times\" [Components]=\"sessionChart\" [BucketSeconds]=\"session.topActivity?.bucketSeconds\" [FixedColors]=\"sessionFixedColors\"\n [Uom]=\"'sessioni' | localize: lc\" [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2sessionchart\"></activity-chart-v2>\n </div>\n\n <!-- S3 Tabelle: eventi, thread, API -->\n <div class=\"dv2-tables\">\n @for (table of sessionTables; track table.dimension) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{tableTitle(table)}}@if (table.estimated) { \u2248}\n <span class=\"dv2-muted\">{{'Attivit\u00E0' | localize: lc}} <strong>{{table.estimated ? '\u2248 ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\n </div>\n <table class=\"table table-sm dv2-table\">\n <tbody>\n @for (item of table.items; track $index) {\n <tr [class.dv2-highlight]=\"table.dimension == Dim.Thread && highlightedTid != null && item.key?.startsWith(highlightedTid + '@')\">\n <td>\n @if (isItemClickable(item, table)) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"itemClicked(item, table)\">{{itemLabel(item, table)}}</span>\n } @else {\n <span class=\"dv2-ellipsis\" [class.dv2-muted]=\"item.other || !item.label\" [title]=\"item.label || ''\">{{itemLabel(item, table)}}</span>\n }\n </td>\n <td class=\"app-nowrap\">\n <div class=\"dv2-bar-cell\">\n <div class=\"dv2-bar\">\n @for (part of item.breakdown; track $index) {\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\n }\n </div>\n <span>{{table.estimated ? '\u2248 ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\n </div>\n </td>\n <td class=\"dv2-right app-nowrap\">{{item.percentage | number : '1.1-1' : 'it'}}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- S4 Thread adesso -->\n @if (session.connected && session.threads?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Thread adesso' | localize: lc}}</div>\n <div class=\"dv2-scroll\">\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n <th>TID</th>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th>{{'Stato' | localize: lc}}</th>\n <th>{{'Priorit\u00E0' | localize: lc}}</th>\n <th>API</th>\n <th>{{'Macchina' | localize: lc}}</th>\n <th>{{'Evento corrente' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'In corso da' | localize: lc}}</th>\n <th>p1 - p3</th>\n </tr>\n </thead>\n <tbody>\n @for (thread of session.threads; track thread.tid) {\n <tr [class.dv2-highlight]=\"thread.tid == highlightedTid\">\n <td><button type=\"button\" class=\"btn btn-sm btn-link dv2-toggle\" (click)=\"toggleThread(thread)\" [title]=\"'Pila completa degli eventi' | localize: lc\"><i class=\"fa\" [class.fa-caret-right]=\"expandedTid != thread.tid\" [class.fa-caret-down]=\"expandedTid == thread.tid\"></i></button></td>\n <td>{{thread.tid}}</td>\n <td class=\"app-nowrap\">{{thread.name}}</td>\n <td class=\"app-nowrap\">{{thread.type}}</td>\n <td>{{thread.currentStatus}}</td>\n <td>{{thread.priority}}</td>\n <td><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"thread.currentApi || ''\">{{thread.currentApi}}</span></td>\n <td>{{thread.machineName}}</td>\n <td>\n @if (thread.inWait && thread.currentWaitNodeId) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"thread.currentWait\" (click)=\"pushNode(thread.currentWaitNodeId)\">{{thread.currentWait}}</span>\n <span class=\"dv2-muted\">{{typeLabel(thread.waitEventTypeName, thread.waitClassName)}}</span>\n } @else {\n <span class=\"dv2-muted\">{{'nessun evento in corso' | localize: lc}}</span>\n }\n </td>\n <td class=\"dv2-right app-nowrap\">{{thread.inWait ? (runningSeconds(thread) | pv2fmt: 'dur') : '\u2014'}}</td>\n <td class=\"dv2-muted\"><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')\">{{[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')}}</span></td>\n </tr>\n @if (expandedTid == thread.tid) {\n <tr class=\"dv2-stack-row\">\n <td colspan=\"11\"><pre class=\"dv2-stack\">{{thread.fullWaitStack || ('Nessun evento' | localize: lc)}}</pre></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- S5 Operazioni lunghe -->\n @if (session.connected && session.longOps?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Operazioni lunghe' | localize: lc}}</div>\n @for (op of session.longOps; track $index) {\n <div class=\"dv2-longop\">\n <div class=\"dv2-meta\">\n <strong>{{op.opName}}</strong>\n <span>{{op.target}} @if (op.targetDesc) {<span class=\"dv2-muted\">({{op.targetDesc}})</span>}</span>\n <span class=\"dv2-muted\">Thread {{op.tid}}</span>\n </div>\n <div class=\"dv2-progress\"><div [style.width.%]=\"progress(op)\"></div></div>\n <div class=\"dv2-meta dv2-small\">\n <span>{{op.soFar | number : '1.0-0' : 'it'}} {{'di' | localize: lc}} {{op.totalWork | number : '1.0-0' : 'it'}} {{op.units}} ({{progress(op) | number : '1.0-1' : 'it'}}%)</span>\n <span>{{'Trascorso' | localize: lc}} {{op.elapsedSeconds | pv2fmt: 'dur'}}</span>\n <span>{{'Alla fine' | localize: lc}} {{op.timeRemaining == null ? ('non stimabile' | localize: lc) : (op.timeRemaining | pv2fmt: 'dur')}}</span>\n @if (op.message) {\n <span class=\"dv2-muted\">{{op.message}}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}:host ::ng-deep .dv2-noclear .p-select-clear-icon{display:none}.dv2-header{align-items:center}.dv2-heading{display:flex;flex:1 1 auto;align-items:center;gap:12px;min-width:0}.dv2-heading .btn{flex:none;white-space:nowrap}.dv2-heading .modal-title{margin:0;overflow-wrap:anywhere}.dv2-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;padding-top:6px}.dv2-group{display:flex;align-items:center;gap:8px}.dv2-end{margin-left:auto}.dv2-window{font-weight:600;white-space:nowrap}.dv2-field{width:170px}.dv2-field-wide{width:200px}.dv2-seg{display:inline-flex;border:1px solid var(--p-form-field-border-color, #cbd5e1);border-radius:var(--p-form-field-border-radius, 6px);overflow:hidden}.dv2-seg button{border:0;border-left:1px solid var(--p-form-field-border-color, #cbd5e1);background:transparent;padding:4px 10px;font-size:12px;white-space:nowrap;cursor:pointer}.dv2-seg button:first-child{border-left:0}.dv2-seg button.dv2-on{background:var(--p-primary-color, #6366f1);color:#fff}.dv2-panel{margin-top:12px;padding:10px 12px 12px;border:1px solid var(--p-content-border-color, #e2e8f0);border-radius:var(--p-form-field-border-radius, 6px);min-width:0}.dv2-title{font-weight:600;margin-bottom:6px}.dv2-title .dv2-muted{font-weight:400;margin-left:8px}.dv2-spaced{margin-top:14px}.dv2-chart-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px;padding-top:6px;margin-bottom:6px}.dv2-muted{color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-small{font-size:12px}.dv2-note{margin-top:6px;color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-state{margin:12px 0 0}.dv2-empty{padding:40px 0;text-align:center;color:var(--p-text-muted-color, #64748b)}.dv2-estimate{display:inline-block;margin-left:6px;padding:0 6px;border:1px solid #fcd34d;border-radius:10px;background:#fffbeb;color:#92400e;font-size:11px;font-weight:400}.dv2-badge{display:inline-block;padding:1px 8px;border-radius:10px;background:#dcfce7;color:#166534;font-size:12px;font-weight:600}.dv2-badge-off{background:#fee2e2;color:#991b1b}.dv2-node-name{font-family:var(--p-font-family-mono, Consolas, monospace);font-size:13px;white-space:pre-wrap;word-break:break-word;max-height:160px;overflow:auto}.dv2-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 16px;margin-top:6px}.dv2-session-head{margin-top:0}.dv2-path{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-top:8px;font-size:12px}.dv2-path-item{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dv2-path-current{font-weight:600}.dv2-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px}.dv2-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 12px}@media(max-width:991px){.dv2-grid{grid-template-columns:minmax(0,1fr)}}.dv2-table{margin-bottom:0;font-size:12px}.dv2-table th{font-weight:600;white-space:nowrap}.dv2-table td{vertical-align:middle}.dv2-right{text-align:right}.dv2-live{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:8px;font-size:12px}.dv2-typebar{display:flex;height:14px;border-radius:3px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-idle{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.55) 0 3px,transparent 3px 6px)}.dv2-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12px}.dv2-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:2px;vertical-align:-1px}.dv2-tables{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:0 12px}.dv2-tables .dv2-table{table-layout:fixed;width:100%}.dv2-tables .dv2-table td:nth-child(2){width:120px}.dv2-tables .dv2-table td:nth-child(3){width:58px}.dv2-tables .dv2-ellipsis{display:block;max-width:100%}.dv2-ellipsis{display:inline-block;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.dv2-ellipsis-short{max-width:160px}.dv2-ellipsis+.dv2-muted{margin-left:6px}.dv2-bar-cell{display:flex;align-items:center;gap:8px}.dv2-bar{display:flex;flex:none;width:70px;height:8px;border-radius:2px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-highlight>td{background:#eef2ff}.dv2-scroll{overflow-x:auto}.dv2-toggle{padding:0 4px}.dv2-stack-row>td{border-top:0}.dv2-stack{margin:0;padding:8px;max-height:240px;overflow:auto;border-radius:4px;background:#f8fafc;font-size:11px;white-space:pre}.dv2-longop+.dv2-longop{margin-top:12px}.dv2-progress{height:8px;margin-top:6px;border-radius:4px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-progress div{height:100%;background:var(--p-primary-color, #6366f1)}\n"], dependencies: [{ kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.EsFormSelectComponent, selector: "form-select", inputs: ["OptionsTemplate"] }, { kind: "component", type: i9.EsFormDateTimeComponent, selector: "form-datetime" }, { kind: "directive", type: i10.Draggable, selector: "[emaDraggable]", inputs: ["emaDraggable"] }, { kind: "component", type: ActivityChartV2Component, selector: "activity-chart-v2", inputs: ["Times", "Components", "BucketSeconds", "FixedColors", "Uom", "EmptyText", "name"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }, { kind: "pipe", type: ProfilerFormatPipe, name: "pv2fmt" }] }); }
|
|
1533
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: AdmDetailsV2Component, isStandalone: false, selector: "adm-details-v2", inputs: { Be: "Be", CanShowSessions: "CanShowSessions", CanOpenProfiler: "CanOpenProfiler" }, outputs: { closed: "closed", sessionsOnEvent: "sessionsOnEvent", openProfiler: "openProfiler" }, providers: [{ provide: LocalizationService, useClass: AdmDetailsV2Loc }], ngImport: i0, template: "<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <!-- Navigazione: \"Indietro\" torna al dettaglio precedente con la sua finestra (D1) -->\n <div class=\"modal-header dv2-header\">\n <div class=\"dv2-heading\">\n @if (stack.length > 1) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"back()\"><i class=\"fa fa-arrow-left\"></i> {{'Indietro' | localize: lc}}</button>\n }\n <h4 class=\"modal-title\">\n @if (current?.kind == 'node') {\n {{'Dettaglio nodo' | localize: lc}}\n } @else if (current) {\n {{'Sessione' | localize: lc}} {{current.sid}},{{current.serial}}\n @if (current.instanceId) {\n <span class=\"dv2-muted\">· {{current.instanceId}}</span>\n }\n }\n </h4>\n </div>\n <button type=\"button\" class=\"close\" (click)=\"close()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n </div>\n\n <div class=\"modal-body\">\n @if (current) {\n <!-- Finestra, sorgente, aggiornamento (D2, D3, D5) -->\n <div class=\"dv2-toolbar\">\n <div class=\"dv2-group\">\n <span class=\"dv2-window\"><i class=\"fa fa-clock\"></i> {{windowLabel}}</span>\n <div class=\"dv2-seg\">\n @for (h of QuickRanges; track h) {\n <button type=\"button\" (click)=\"quickRange(h)\" [title]=\"'Ultime' | localize: lc\">{{h}} h</button>\n }\n </div>\n </div>\n <div class=\"dv2-group dv2-dates\">\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"dv2from\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime></div>\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"dv2to\" [Placeholder]=\"'A' | localize: lc\"></form-datetime></div>\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"applyDates()\" [title]=\"'Applica' | localize: lc\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"dv2-seg\">\n @if (current.kind == 'session') {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Memoria' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Memoria e storico' | localize: lc}}</button>\n } @else {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Dal vivo' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Storico' | localize: lc}}</button>\n }\n </div>\n <div class=\"dv2-group dv2-end\">\n @if (loading) {\n <i class=\"fa fa-spinner fa-spin\"></i>\n }\n @if (updatedAt) {\n <span class=\"dv2-muted\">{{'Aggiornato alle' | localize: lc}} {{updatedAt | date: 'HH:mm:ss'}}</span>\n }\n @if (autoRefresh) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"togglePause()\">\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\n </button>\n }\n </div>\n </div>\n @if (windowClamped) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'La finestra \u00E8 stata ridotta alle ultime 24 ore' | localize: lc}}</div>\n }\n\n <!-- Stati (D6) -->\n @if (error) {\n <div class=\"alert alert-warning dv2-state\">{{error}}</div>\n } @else if (notFound && !loading) {\n <div class=\"alert alert-info dv2-state\">\n {{(current.kind == 'node' ? 'Nodo non trovato' : 'Sessione non trovata: non esiste pi\u00F9 e nella finestra non era attiva') | localize: lc}}\n @if (current.kind == 'node' && !current.realTime) {\n <div class=\"dv2-small\">{{'Sullo storico il nodo si cerca solo negli snapshot della finestra: prova \"Dal vivo\" o una finestra pi\u00F9 ampia' | localize: lc}}</div>\n }\n </div>\n } @else if (loading && !node && !session) {\n <div class=\"dv2-empty\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Carico i Dati' | localize: lc}}</div>\n }\n\n <!-- ==================== Nodo ==================== -->\n @if (node && current.kind == 'node') {\n <!-- N1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-node-name\">{{node.nodeName}}</div>\n <div class=\"dv2-meta\">\n <span><span class=\"dv2-swatch\" [style.background]=\"typeColor(node.eventTypeName, node.waitClassName)\"></span>{{typeLabel(node.eventTypeName, node.waitClassName)}}</span>\n <span class=\"dv2-muted\">Id <code>{{node.nodeId}}</code></span>\n <button type=\"button\" class=\"btn btn-sm btn-link\" (click)=\"copyName()\"><i class=\"fa\" [class.fa-copy]=\"!copied\" [class.fa-check]=\"copied\"></i> {{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\n </div>\n @if (node.fullWaitStack?.length) {\n <div class=\"dv2-path\">\n @for (item of node.fullWaitStack; track item.nodeId) {\n <span class=\"app-link dv2-path-item\" [title]=\"item.nodeName\" (click)=\"pushNode(item.nodeId)\">{{item.nodeName}}</span>\n <i class=\"fa fa-angle-right dv2-muted\"></i>\n }\n <span class=\"dv2-path-item dv2-path-current\" [title]=\"node.nodeName\">{{node.nodeName}}</span>\n </div>\n }\n <div class=\"dv2-actions\">\n @if (CanOpenProfiler) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openProfiler.emit(node.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri nel profiler' | localize: lc}}</button>\n }\n @if (CanShowSessions) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"showSessions()\" [title]=\"(node.numChildren > 0 ? 'Solo l\\'evento esatto: il lavoro dei discendenti non \u00E8 compreso' : 'Top Activity filtrata su questo evento') | localize: lc\">\n <i class=\"fa fa-users\"></i> {{'Sessioni su questo evento' | localize: lc}}\n </button>\n @if (node.numChildren > 0) {\n <span class=\"dv2-muted\">{{'discendenti esclusi' | localize: lc}}</span>\n }\n }\n </div>\n </div>\n\n <div class=\"dv2-grid\">\n <!-- N2 Statistiche -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Statistiche' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Dall\\'avvio' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Dall\\'ultimo snapshot' | localize: lc}} <span class=\"dv2-muted\">({{'dalle' | localize: lc}} {{shortTime(node.snapFrom)}})</span></th>\n } @else {\n <th class=\"dv2-right\">{{'Nella finestra' | localize: lc}} <span class=\"dv2-muted\">({{shortTime(node.snapFrom)}} - {{shortTime(node.snapTo)}})</span></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of nodeStats; track row.label) {\n <tr>\n <td>{{row.label}}</td>\n <td class=\"dv2-right\">{{row.total == null ? '\u2014' : (row.total | pv2fmt: row.kind)}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{row.snap == null ? '\u2014' : (row.snap | pv2fmt: row.kind)}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (nodeLive) {\n <div class=\"dv2-live\">\n <span>{{'Thread dentro adesso' | localize: lc}} <strong>{{node.activeThreads ?? 0}}</strong></span>\n <span>{{'In corso da' | localize: lc}} <strong>{{node.activeMaxTime ? (node.activeMaxTime | pv2fmt: 'dur') : '\u2014'}}</strong></span>\n <span>{{'Ultima uscita' | localize: lc}} <strong>{{node.lastExitTime ? localTime(node.lastExitTime) : '\u2014'}}</strong></span>\n </div>\n }\n </div>\n\n <!-- N4 Dove va il tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Dove va il tempo' | localize: lc}} <span class=\"dv2-muted\">{{'tempo proprio del sottoalbero' | localize: lc}}</span></div>\n <div class=\"dv2-typebar\">\n @for (part of typeParts; track part.label) {\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [class.dv2-idle]=\"part.idle\" [title]=\"part.label + ' ' + (part.percentage | number : '1.1-1' : 'it') + '%'\"></div>\n }\n </div>\n <div class=\"dv2-legend\">\n @for (part of typeParts; track part.label) {\n <span><span class=\"dv2-swatch\" [class.dv2-idle]=\"part.idle\" [style.background]=\"part.color\"></span>{{part.label}} <span class=\"dv2-muted\">{{part.percentage | number : '1.1-1' : 'it'}}%</span></span>\n }\n </div>\n @if (typeParts.length && typeParts[typeParts.length - 1].idle) {\n <div class=\"dv2-muted dv2-small\">{{'Idle \u00E8 tempo di attesa senza lavoro' | localize: lc}}</div>\n }\n\n <!-- N3 Per istanza -->\n @if ((node.instances?.length ?? 0) > 1) {\n <div class=\"dv2-title dv2-spaced\">{{'Per istanza' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Istanza' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Thread attivi' | localize: lc}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (inst of node.instances; track inst.instanceId) {\n <tr>\n <td class=\"app-nowrap\">{{inst.instanceId}}</td>\n <td class=\"dv2-right\">{{inst.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{inst.activeThreads ?? 0}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <!-- N6 Attivit\u00E0 nel tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{'Attivit\u00E0 nel tempo' | localize: lc}}\n <span class=\"dv2-muted\">\u2248 <strong>{{node.averageActiveSessions | number : '1.2-3' : 'it'}}</strong> {{'sessioni attive medie' | localize: lc}} · {{'picco' | localize: lc}} <strong>{{node.peakActiveSessions | number : '1.2-3' : 'it'}}</strong> · {{'un punto ogni' | localize: lc}} {{node.bucketSeconds}} s</span>\n <span class=\"dv2-estimate\" [title]=\"'Valori stimati contando i campioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\n </div>\n <activity-chart-v2 [Times]=\"nodeChartTimes\" [Components]=\"nodeChart\" [BucketSeconds]=\"node.bucketSeconds\" [Uom]=\"'sessioni' | localize: lc\"\n [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2nodechart\"></activity-chart-v2>\n @if (nodeHistoryBefore) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'Prima delle' | localize: lc}} {{nodeHistoryBefore}} {{'i dati vengono dallo storico, con meno risoluzione' | localize: lc}}</div>\n }\n @if (node.numChildren > 0) {\n <div class=\"dv2-muted dv2-small\">{{'Comprende il lavoro dei discendenti' | localize: lc}}</div>\n }\n </div>\n\n <!-- N5 Discendenti principali -->\n @if (node.numChildren > 0) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Discendenti principali' | localize: lc}} <span class=\"dv2-muted\">{{'Figli' | localize: lc}}: {{node.numChildren}} · {{'Discendenti' | localize: lc}}: {{node.numDescendants}}</span></div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Livello' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n <th class=\"dv2-right\">% {{'del nodo' | localize: lc}}</th>\n </tr>\n </thead>\n <tbody>\n @for (d of node.topDescendants ?? []; track d.nodeId) {\n <tr>\n <td><span class=\"app-link dv2-ellipsis\" [title]=\"d.nodeName\" (click)=\"pushNode(d.nodeId)\">{{d.nodeName}}</span></td>\n <td class=\"app-nowrap\">{{typeLabel(d.eventTypeName, d.waitClassName)}}</td>\n <td class=\"dv2-right\">{{d.depth}}</td>\n <td class=\"dv2-right\">{{d.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{d.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{d.percentage | number : '1.1-1' : 'it'}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n <!-- ==================== Sessione ==================== -->\n @if (session && current.kind == 'session') {\n <!-- S1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-meta dv2-session-head\">\n @if (session.connected) {\n <span class=\"dv2-badge\">{{session.currentStatus}}</span>\n } @else {\n <span class=\"dv2-badge dv2-badge-off\">{{'Terminata' | localize: lc}}</span>\n }\n <span>{{'Utente' | localize: lc}} <strong>{{session.user}}</strong>@if (session.tenant) {<span class=\"dv2-muted\"> · {{session.tenant}}</span>}</span>\n <span>{{'Tipo' | localize: lc}} <strong>{{session.type | titlecase}}</strong></span>\n @if (session.resourceConsumerGroup) {\n <span>{{'Gruppo di consumo' | localize: lc}} <strong>{{session.resourceConsumerGroup}}</strong></span>\n }\n @if (session.bgSessionName) {\n <span>{{'Sessione di background' | localize: lc}} <strong>{{session.bgSessionName}}</strong></span>\n }\n @if (session.jobName) {\n <span>Job <strong>{{session.jobName}}</strong></span>\n }\n </div>\n <div class=\"dv2-meta\">\n @if (session.startTime) {\n <span>{{'Inizio' | localize: lc}} <strong>{{localTime(session.startTime)}}</strong> <span class=\"dv2-muted\">({{'collegata da' | localize: lc}} {{connectedFor() | pv2fmt: 'dur'}})</span></span>\n }\n @if (session.numThreads != null) {\n <span>Thread <strong>{{session.numThreads}}</strong></span>\n }\n <span>{{'Ultima attivit\u00E0' | localize: lc}} <strong>{{session.lastSampleTime ? localTime(session.lastSampleTime) : '\u2014'}}</strong></span>\n </div>\n </div>\n\n <!-- S6 Sessione terminata -->\n @if (!session.connected) {\n <div class=\"alert alert-warning dv2-state\">\n {{'La sessione non esiste pi\u00F9: i suoi dati vengono dall\\'ultimo campione, delle' | localize: lc}} {{localTime(session.lastSampleTime)}}\n </div>\n }\n\n <!-- S2 Grafico -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-chart-head\">\n <span class=\"dv2-title\">\n {{'Sessioni attive medie' | localize: lc}}\n @if (session.topActivity) {\n <span class=\"dv2-muted\">\n {{'Media' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'Picco' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'un punto ogni' | localize: lc}} {{session.topActivity.bucketSeconds}} s\n </span>\n @if (session.topActivity.estimated) {\n <span class=\"dv2-estimate\">{{'stima per campionamento' | localize: lc}}</span>\n }\n }\n </span>\n <div class=\"dv2-group\">\n <div class=\"dv2-field dv2-field-wide dv2-noclear\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"'' + current.dimension\" (ngModelChange)=\"setDimension($event)\" name=\"dv2dim\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\"></form-select>\n </div>\n <div class=\"dv2-seg\">\n @for (o of Resolutions; track o.id) {\n <button type=\"button\" [class.dv2-on]=\"'' + current.resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\n }\n </div>\n </div>\n </div>\n <activity-chart-v2 [Times]=\"session.topActivity?.times\" [Components]=\"sessionChart\" [BucketSeconds]=\"session.topActivity?.bucketSeconds\" [FixedColors]=\"sessionFixedColors\"\n [Uom]=\"'sessioni' | localize: lc\" [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2sessionchart\"></activity-chart-v2>\n </div>\n\n <!-- S3 Tabelle: eventi, thread, API -->\n <div class=\"dv2-tables\">\n @for (table of sessionTables; track table.dimension) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{tableTitle(table)}}@if (table.estimated) { \u2248}\n <span class=\"dv2-muted\">{{'Attivit\u00E0' | localize: lc}} <strong>{{table.estimated ? '\u2248 ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\n </div>\n <table class=\"table table-sm dv2-table\">\n <tbody>\n @for (item of table.items; track $index) {\n <tr [class.dv2-highlight]=\"table.dimension == Dim.Thread && highlightedTid != null && item.key?.startsWith(highlightedTid + '@')\">\n <td>\n @if (isItemClickable(item, table)) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"itemClicked(item, table)\">{{itemLabel(item, table)}}</span>\n } @else {\n <span class=\"dv2-ellipsis\" [class.dv2-muted]=\"item.other || !item.label\" [title]=\"item.label || ''\">{{itemLabel(item, table)}}</span>\n }\n </td>\n <td class=\"app-nowrap\">\n <div class=\"dv2-bar-cell\">\n <div class=\"dv2-bar\">\n @for (part of item.breakdown; track $index) {\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\n }\n </div>\n <span>{{table.estimated ? '\u2248 ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\n </div>\n </td>\n <td class=\"dv2-right app-nowrap\">{{item.percentage | number : '1.1-1' : 'it'}}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- S4 Thread adesso -->\n @if (session.connected && session.threads?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Thread adesso' | localize: lc}}</div>\n <div class=\"dv2-scroll\">\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n <th>TID</th>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th>{{'Stato' | localize: lc}}</th>\n <th>{{'Priorit\u00E0' | localize: lc}}</th>\n <th>API</th>\n <th>{{'Macchina' | localize: lc}}</th>\n <th>{{'Evento corrente' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'In corso da' | localize: lc}}</th>\n <th>p1 - p3</th>\n </tr>\n </thead>\n <tbody>\n @for (thread of session.threads; track thread.tid) {\n <tr [class.dv2-highlight]=\"thread.tid == highlightedTid\">\n <td><button type=\"button\" class=\"btn btn-sm btn-link dv2-toggle\" (click)=\"toggleThread(thread)\" [title]=\"'Pila completa degli eventi' | localize: lc\"><i class=\"fa\" [class.fa-caret-right]=\"expandedTid != thread.tid\" [class.fa-caret-down]=\"expandedTid == thread.tid\"></i></button></td>\n <td>{{thread.tid}}</td>\n <td class=\"app-nowrap\">{{thread.name}}</td>\n <td class=\"app-nowrap\">{{thread.type}}</td>\n <td>{{thread.currentStatus}}</td>\n <td>{{thread.priority}}</td>\n <td><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"thread.currentApi || ''\">{{thread.currentApi}}</span></td>\n <td>{{thread.machineName}}</td>\n <td>\n @if (thread.inWait && thread.currentWaitNodeId) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"thread.currentWait\" (click)=\"pushNode(thread.currentWaitNodeId)\">{{thread.currentWait}}</span>\n <span class=\"dv2-muted\">{{typeLabel(thread.waitEventTypeName, thread.waitClassName)}}</span>\n } @else {\n <span class=\"dv2-muted\">{{'nessun evento in corso' | localize: lc}}</span>\n }\n </td>\n <td class=\"dv2-right app-nowrap\">{{thread.inWait ? (runningSeconds(thread) | pv2fmt: 'dur') : '\u2014'}}</td>\n <td class=\"dv2-muted\"><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')\">{{[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')}}</span></td>\n </tr>\n @if (expandedTid == thread.tid) {\n <tr class=\"dv2-stack-row\">\n <td colspan=\"11\"><pre class=\"dv2-stack\">{{thread.fullWaitStack || ('Nessun evento' | localize: lc)}}</pre></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- S5 Operazioni lunghe -->\n @if (session.connected && session.longOps?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Operazioni lunghe' | localize: lc}}</div>\n @for (op of session.longOps; track $index) {\n <div class=\"dv2-longop\">\n <div class=\"dv2-meta\">\n <strong>{{op.opName}}</strong>\n <span>{{op.target}} @if (op.targetDesc) {<span class=\"dv2-muted\">({{op.targetDesc}})</span>}</span>\n <span class=\"dv2-muted\">Thread {{op.tid}}</span>\n </div>\n <div class=\"dv2-progress\"><div [style.width.%]=\"progress(op)\"></div></div>\n <div class=\"dv2-meta dv2-small\">\n <span>{{op.soFar | number : '1.0-0' : 'it'}} {{'di' | localize: lc}} {{op.totalWork | number : '1.0-0' : 'it'}} {{op.units}} ({{progress(op) | number : '1.0-1' : 'it'}}%)</span>\n <span>{{'Trascorso' | localize: lc}} {{op.elapsedSeconds | pv2fmt: 'dur'}}</span>\n <span>{{'Alla fine' | localize: lc}} {{op.timeRemaining == null ? ('non stimabile' | localize: lc) : (op.timeRemaining | pv2fmt: 'dur')}}</span>\n @if (op.message) {\n <span class=\"dv2-muted\">{{op.message}}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}:host ::ng-deep .dv2-noclear .p-select-clear-icon{display:none}.dv2-header{align-items:center}.dv2-heading{display:flex;flex:1 1 auto;align-items:center;gap:12px;min-width:0}.dv2-heading .btn{flex:none;white-space:nowrap}.dv2-heading .modal-title{margin:0;overflow-wrap:anywhere}.dv2-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;padding-top:6px}.dv2-group{display:flex;align-items:center;gap:8px}.dv2-end{margin-left:auto}.dv2-window{font-weight:600;white-space:nowrap}.dv2-field{width:170px}.dv2-field-wide{width:200px}.dv2-seg{display:inline-flex;border:1px solid var(--p-form-field-border-color, #cbd5e1);border-radius:var(--p-form-field-border-radius, 6px);overflow:hidden}.dv2-seg button{border:0;border-left:1px solid var(--p-form-field-border-color, #cbd5e1);background:transparent;padding:4px 10px;font-size:12px;white-space:nowrap;cursor:pointer}.dv2-seg button:first-child{border-left:0}.dv2-seg button.dv2-on{background:var(--p-primary-color, #6366f1);color:#fff}.dv2-panel{margin-top:12px;padding:10px 12px 12px;border:1px solid var(--p-content-border-color, #e2e8f0);border-radius:var(--p-form-field-border-radius, 6px);min-width:0}.dv2-title{font-weight:600;margin-bottom:6px}.dv2-title .dv2-muted{font-weight:400;margin-left:8px}.dv2-spaced{margin-top:14px}.dv2-chart-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px;padding-top:6px;margin-bottom:6px}.dv2-muted{color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-small{font-size:12px}.dv2-note{margin-top:6px;color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-state{margin:12px 0 0}.dv2-empty{padding:40px 0;text-align:center;color:var(--p-text-muted-color, #64748b)}.dv2-estimate{display:inline-block;margin-left:6px;padding:0 6px;border:1px solid #fcd34d;border-radius:10px;background:#fffbeb;color:#92400e;font-size:11px;font-weight:400}.dv2-badge{display:inline-block;padding:1px 8px;border-radius:10px;background:#dcfce7;color:#166534;font-size:12px;font-weight:600}.dv2-badge-off{background:#fee2e2;color:#991b1b}.dv2-node-name{font-family:var(--p-font-family-mono, Consolas, monospace);font-size:13px;white-space:pre-wrap;word-break:break-word;max-height:160px;overflow:auto}.dv2-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 16px;margin-top:6px}.dv2-session-head{margin-top:0}.dv2-path{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-top:8px;font-size:12px}.dv2-path-item{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dv2-path-current{font-weight:600}.dv2-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px}.dv2-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 12px}@media(max-width:991px){.dv2-grid{grid-template-columns:minmax(0,1fr)}}.dv2-table{margin-bottom:0;font-size:12px}.dv2-table th{font-weight:600;white-space:nowrap}.dv2-table td{vertical-align:middle}.dv2-right{text-align:right}.dv2-live{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:8px;font-size:12px}.dv2-typebar{display:flex;height:14px;border-radius:3px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-idle{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.55) 0 3px,transparent 3px 6px)}.dv2-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12px}.dv2-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:2px;vertical-align:-1px}.dv2-tables{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:0 12px}.dv2-tables .dv2-table{table-layout:fixed;width:100%}.dv2-tables .dv2-table td:nth-child(2){width:120px}.dv2-tables .dv2-table td:nth-child(3){width:58px}.dv2-tables .dv2-ellipsis{display:block;max-width:100%}.dv2-ellipsis{display:inline-block;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.dv2-ellipsis-short{max-width:160px}.dv2-ellipsis+.dv2-muted{margin-left:6px}.dv2-bar-cell{display:flex;align-items:center;gap:8px}.dv2-bar{display:flex;flex:none;width:70px;height:8px;border-radius:2px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-highlight>td{background:#eef2ff}.dv2-scroll{overflow-x:auto}.dv2-toggle{padding:0 4px}.dv2-stack-row>td{border-top:0}.dv2-stack{margin:0;padding:8px;max-height:240px;overflow:auto;border-radius:4px;background:#f8fafc;font-size:11px;white-space:pre}.dv2-longop+.dv2-longop{margin-top:12px}.dv2-progress{height:8px;margin-top:6px;border-radius:4px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-progress div{height:100%;background:var(--p-primary-color, #6366f1)}\n"], dependencies: [{ kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.EsFormSelectComponent, selector: "form-select", inputs: ["OptionsTemplate"] }, { kind: "component", type: i9.EsFormDateTimeComponent, selector: "form-datetime" }, { kind: "directive", type: i10.Draggable, selector: "[emaDraggable]", inputs: ["emaDraggable"] }, { kind: "component", type: ActivityChartV2Component, selector: "activity-chart-v2", inputs: ["Times", "Components", "BucketSeconds", "FixedColors", "Uom", "EmptyText", "name"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }, { kind: "pipe", type: ProfilerFormatPipe, name: "pv2fmt" }] }); }
|
|
1533
1534
|
}
|
|
1534
1535
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: AdmDetailsV2Component, decorators: [{
|
|
1535
1536
|
type: Component,
|
|
1536
|
-
args: [{ selector: "adm-details-v2", providers: [{ provide: LocalizationService, useClass: AdmDetailsV2Loc }], standalone: false, template: "<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <!-- Navigazione: \"Indietro\" torna al dettaglio precedente con la sua finestra (D1) -->\n <div class=\"modal-header dv2-header\">\n <div class=\"dv2-heading\">\n @if (stack.length > 1) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"back()\"><i class=\"fa fa-arrow-left\"></i> {{'Indietro' | localize: lc}}</button>\n }\n <h4 class=\"modal-title\">\n @if (current?.kind == 'node') {\n {{'Dettaglio nodo' | localize: lc}}\n } @else if (current) {\n {{'Sessione' | localize: lc}} {{current.sid}},{{current.serial}}\n @if (current.instanceId) {\n <span class=\"dv2-muted\">· {{current.instanceId}}</span>\n }\n }\n </h4>\n </div>\n <button type=\"button\" class=\"close\" (click)=\"close()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n </div>\n\n <div class=\"modal-body\">\n @if (current) {\n <!-- Finestra, sorgente, aggiornamento (D2, D3, D5) -->\n <div class=\"dv2-toolbar\">\n <div class=\"dv2-group\">\n <span class=\"dv2-window\"><i class=\"fa fa-clock\"></i> {{windowLabel}}</span>\n <div class=\"dv2-seg\">\n @for (h of QuickRanges; track h) {\n <button type=\"button\" (click)=\"quickRange(h)\" [title]=\"'Ultime' | localize: lc\">{{h}} h</button>\n }\n </div>\n </div>\n <div class=\"dv2-group dv2-dates\">\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"dv2from\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime></div>\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"dv2to\" [Placeholder]=\"'A' | localize: lc\"></form-datetime></div>\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"applyDates()\" [title]=\"'Applica' | localize: lc\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"dv2-seg\">\n @if (current.kind == 'session') {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Memoria' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Memoria e storico' | localize: lc}}</button>\n } @else {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Dal vivo' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Storico' | localize: lc}}</button>\n }\n </div>\n <div class=\"dv2-group dv2-end\">\n @if (loading) {\n <i class=\"fa fa-spinner fa-spin\"></i>\n }\n @if (updatedAt) {\n <span class=\"dv2-muted\">{{'Aggiornato alle' | localize: lc}} {{updatedAt | date: 'HH:mm:ss'}}</span>\n }\n @if (autoRefresh) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"togglePause()\">\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\n </button>\n }\n </div>\n </div>\n @if (windowClamped) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'La finestra \u00E8 stata ridotta alle ultime 24 ore' | localize: lc}}</div>\n }\n\n <!-- Stati (D6) -->\n @if (error) {\n <div class=\"alert alert-warning dv2-state\">{{error}}</div>\n } @else if (notFound && !loading) {\n <div class=\"alert alert-info dv2-state\">\n {{(current.kind == 'node' ? 'Nodo non trovato' : 'Sessione non trovata: non esiste pi\u00F9 e nella finestra non era attiva') | localize: lc}}\n </div>\n } @else if (loading && !node && !session) {\n <div class=\"dv2-empty\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Carico i Dati' | localize: lc}}</div>\n }\n\n <!-- ==================== Nodo ==================== -->\n @if (node && current.kind == 'node') {\n <!-- N1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-node-name\">{{node.nodeName}}</div>\n <div class=\"dv2-meta\">\n <span><span class=\"dv2-swatch\" [style.background]=\"typeColor(node.eventTypeName, node.waitClassName)\"></span>{{typeLabel(node.eventTypeName, node.waitClassName)}}</span>\n <span class=\"dv2-muted\">Id <code>{{node.nodeId}}</code></span>\n <button type=\"button\" class=\"btn btn-sm btn-link\" (click)=\"copyName()\"><i class=\"fa\" [class.fa-copy]=\"!copied\" [class.fa-check]=\"copied\"></i> {{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\n </div>\n @if (node.fullWaitStack?.length) {\n <div class=\"dv2-path\">\n @for (item of node.fullWaitStack; track item.nodeId) {\n <span class=\"app-link dv2-path-item\" [title]=\"item.nodeName\" (click)=\"pushNode(item.nodeId)\">{{item.nodeName}}</span>\n <i class=\"fa fa-angle-right dv2-muted\"></i>\n }\n <span class=\"dv2-path-item dv2-path-current\" [title]=\"node.nodeName\">{{node.nodeName}}</span>\n </div>\n }\n <div class=\"dv2-actions\">\n @if (CanOpenProfiler) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openProfiler.emit(node.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri nel profiler' | localize: lc}}</button>\n }\n @if (CanShowSessions) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"showSessions()\" [title]=\"(node.numChildren > 0 ? 'Solo l\\'evento esatto: il lavoro dei discendenti non \u00E8 compreso' : 'Top Activity filtrata su questo evento') | localize: lc\">\n <i class=\"fa fa-users\"></i> {{'Sessioni su questo evento' | localize: lc}}\n </button>\n @if (node.numChildren > 0) {\n <span class=\"dv2-muted\">{{'discendenti esclusi' | localize: lc}}</span>\n }\n }\n </div>\n </div>\n\n <div class=\"dv2-grid\">\n <!-- N2 Statistiche -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Statistiche' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Dall\\'avvio' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Dall\\'ultimo snapshot' | localize: lc}} <span class=\"dv2-muted\">({{'dalle' | localize: lc}} {{shortTime(node.snapFrom)}})</span></th>\n } @else {\n <th class=\"dv2-right\">{{'Nella finestra' | localize: lc}} <span class=\"dv2-muted\">({{shortTime(node.snapFrom)}} - {{shortTime(node.snapTo)}})</span></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of nodeStats; track row.label) {\n <tr>\n <td>{{row.label}}</td>\n <td class=\"dv2-right\">{{row.total == null ? '\u2014' : (row.total | pv2fmt: row.kind)}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{row.snap == null ? '\u2014' : (row.snap | pv2fmt: row.kind)}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (nodeLive) {\n <div class=\"dv2-live\">\n <span>{{'Thread dentro adesso' | localize: lc}} <strong>{{node.activeThreads ?? 0}}</strong></span>\n <span>{{'In corso da' | localize: lc}} <strong>{{node.activeMaxTime ? (node.activeMaxTime | pv2fmt: 'dur') : '\u2014'}}</strong></span>\n <span>{{'Ultima uscita' | localize: lc}} <strong>{{node.lastExitTime ? localTime(node.lastExitTime) : '\u2014'}}</strong></span>\n </div>\n }\n </div>\n\n <!-- N4 Dove va il tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Dove va il tempo' | localize: lc}} <span class=\"dv2-muted\">{{'tempo proprio del sottoalbero' | localize: lc}}</span></div>\n <div class=\"dv2-typebar\">\n @for (part of typeParts; track part.label) {\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [class.dv2-idle]=\"part.idle\" [title]=\"part.label + ' ' + (part.percentage | number : '1.1-1' : 'it') + '%'\"></div>\n }\n </div>\n <div class=\"dv2-legend\">\n @for (part of typeParts; track part.label) {\n <span><span class=\"dv2-swatch\" [class.dv2-idle]=\"part.idle\" [style.background]=\"part.color\"></span>{{part.label}} <span class=\"dv2-muted\">{{part.percentage | number : '1.1-1' : 'it'}}%</span></span>\n }\n </div>\n @if (typeParts.length && typeParts[typeParts.length - 1].idle) {\n <div class=\"dv2-muted dv2-small\">{{'Idle \u00E8 tempo di attesa senza lavoro' | localize: lc}}</div>\n }\n\n <!-- N3 Per istanza -->\n @if ((node.instances?.length ?? 0) > 1) {\n <div class=\"dv2-title dv2-spaced\">{{'Per istanza' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Istanza' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Thread attivi' | localize: lc}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (inst of node.instances; track inst.instanceId) {\n <tr>\n <td class=\"app-nowrap\">{{inst.instanceId}}</td>\n <td class=\"dv2-right\">{{inst.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{inst.activeThreads ?? 0}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <!-- N6 Attivit\u00E0 nel tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{'Attivit\u00E0 nel tempo' | localize: lc}}\n <span class=\"dv2-muted\">\u2248 <strong>{{node.averageActiveSessions | number : '1.2-3' : 'it'}}</strong> {{'sessioni attive medie' | localize: lc}} · {{'picco' | localize: lc}} <strong>{{node.peakActiveSessions | number : '1.2-3' : 'it'}}</strong> · {{'un punto ogni' | localize: lc}} {{node.bucketSeconds}} s</span>\n <span class=\"dv2-estimate\" [title]=\"'Valori stimati contando i campioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\n </div>\n <activity-chart-v2 [Times]=\"nodeChartTimes\" [Components]=\"nodeChart\" [BucketSeconds]=\"node.bucketSeconds\" [Uom]=\"'sessioni' | localize: lc\"\n [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2nodechart\"></activity-chart-v2>\n @if (nodeHistoryBefore) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'Prima delle' | localize: lc}} {{nodeHistoryBefore}} {{'i dati vengono dallo storico, con meno risoluzione' | localize: lc}}</div>\n }\n @if (node.numChildren > 0) {\n <div class=\"dv2-muted dv2-small\">{{'Comprende il lavoro dei discendenti' | localize: lc}}</div>\n }\n </div>\n\n <!-- N5 Discendenti principali -->\n @if (node.numChildren > 0) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Discendenti principali' | localize: lc}} <span class=\"dv2-muted\">{{'Figli' | localize: lc}}: {{node.numChildren}} · {{'Discendenti' | localize: lc}}: {{node.numDescendants}}</span></div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Livello' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n <th class=\"dv2-right\">% {{'del nodo' | localize: lc}}</th>\n </tr>\n </thead>\n <tbody>\n @for (d of node.topDescendants ?? []; track d.nodeId) {\n <tr>\n <td><span class=\"app-link dv2-ellipsis\" [title]=\"d.nodeName\" (click)=\"pushNode(d.nodeId)\">{{d.nodeName}}</span></td>\n <td class=\"app-nowrap\">{{typeLabel(d.eventTypeName, d.waitClassName)}}</td>\n <td class=\"dv2-right\">{{d.depth}}</td>\n <td class=\"dv2-right\">{{d.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{d.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{d.percentage | number : '1.1-1' : 'it'}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n <!-- ==================== Sessione ==================== -->\n @if (session && current.kind == 'session') {\n <!-- S1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-meta dv2-session-head\">\n @if (session.connected) {\n <span class=\"dv2-badge\">{{session.currentStatus}}</span>\n } @else {\n <span class=\"dv2-badge dv2-badge-off\">{{'Terminata' | localize: lc}}</span>\n }\n <span>{{'Utente' | localize: lc}} <strong>{{session.user}}</strong>@if (session.tenant) {<span class=\"dv2-muted\"> · {{session.tenant}}</span>}</span>\n <span>{{'Tipo' | localize: lc}} <strong>{{session.type | titlecase}}</strong></span>\n @if (session.resourceConsumerGroup) {\n <span>{{'Gruppo di consumo' | localize: lc}} <strong>{{session.resourceConsumerGroup}}</strong></span>\n }\n @if (session.bgSessionName) {\n <span>{{'Sessione di background' | localize: lc}} <strong>{{session.bgSessionName}}</strong></span>\n }\n @if (session.jobName) {\n <span>Job <strong>{{session.jobName}}</strong></span>\n }\n </div>\n <div class=\"dv2-meta\">\n @if (session.startTime) {\n <span>{{'Inizio' | localize: lc}} <strong>{{localTime(session.startTime)}}</strong> <span class=\"dv2-muted\">({{'collegata da' | localize: lc}} {{connectedFor() | pv2fmt: 'dur'}})</span></span>\n }\n @if (session.numThreads != null) {\n <span>Thread <strong>{{session.numThreads}}</strong></span>\n }\n <span>{{'Ultima attivit\u00E0' | localize: lc}} <strong>{{session.lastSampleTime ? localTime(session.lastSampleTime) : '\u2014'}}</strong></span>\n </div>\n </div>\n\n <!-- S6 Sessione terminata -->\n @if (!session.connected) {\n <div class=\"alert alert-warning dv2-state\">\n {{'La sessione non esiste pi\u00F9: i suoi dati vengono dall\\'ultimo campione, delle' | localize: lc}} {{localTime(session.lastSampleTime)}}\n </div>\n }\n\n <!-- S2 Grafico -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-chart-head\">\n <span class=\"dv2-title\">\n {{'Sessioni attive medie' | localize: lc}}\n @if (session.topActivity) {\n <span class=\"dv2-muted\">\n {{'Media' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'Picco' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'un punto ogni' | localize: lc}} {{session.topActivity.bucketSeconds}} s\n </span>\n @if (session.topActivity.estimated) {\n <span class=\"dv2-estimate\">{{'stima per campionamento' | localize: lc}}</span>\n }\n }\n </span>\n <div class=\"dv2-group\">\n <div class=\"dv2-field dv2-field-wide dv2-noclear\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"'' + current.dimension\" (ngModelChange)=\"setDimension($event)\" name=\"dv2dim\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\"></form-select>\n </div>\n <div class=\"dv2-seg\">\n @for (o of Resolutions; track o.id) {\n <button type=\"button\" [class.dv2-on]=\"'' + current.resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\n }\n </div>\n </div>\n </div>\n <activity-chart-v2 [Times]=\"session.topActivity?.times\" [Components]=\"sessionChart\" [BucketSeconds]=\"session.topActivity?.bucketSeconds\" [FixedColors]=\"sessionFixedColors\"\n [Uom]=\"'sessioni' | localize: lc\" [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2sessionchart\"></activity-chart-v2>\n </div>\n\n <!-- S3 Tabelle: eventi, thread, API -->\n <div class=\"dv2-tables\">\n @for (table of sessionTables; track table.dimension) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{tableTitle(table)}}@if (table.estimated) { \u2248}\n <span class=\"dv2-muted\">{{'Attivit\u00E0' | localize: lc}} <strong>{{table.estimated ? '\u2248 ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\n </div>\n <table class=\"table table-sm dv2-table\">\n <tbody>\n @for (item of table.items; track $index) {\n <tr [class.dv2-highlight]=\"table.dimension == Dim.Thread && highlightedTid != null && item.key?.startsWith(highlightedTid + '@')\">\n <td>\n @if (isItemClickable(item, table)) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"itemClicked(item, table)\">{{itemLabel(item, table)}}</span>\n } @else {\n <span class=\"dv2-ellipsis\" [class.dv2-muted]=\"item.other || !item.label\" [title]=\"item.label || ''\">{{itemLabel(item, table)}}</span>\n }\n </td>\n <td class=\"app-nowrap\">\n <div class=\"dv2-bar-cell\">\n <div class=\"dv2-bar\">\n @for (part of item.breakdown; track $index) {\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\n }\n </div>\n <span>{{table.estimated ? '\u2248 ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\n </div>\n </td>\n <td class=\"dv2-right app-nowrap\">{{item.percentage | number : '1.1-1' : 'it'}}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- S4 Thread adesso -->\n @if (session.connected && session.threads?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Thread adesso' | localize: lc}}</div>\n <div class=\"dv2-scroll\">\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n <th>TID</th>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th>{{'Stato' | localize: lc}}</th>\n <th>{{'Priorit\u00E0' | localize: lc}}</th>\n <th>API</th>\n <th>{{'Macchina' | localize: lc}}</th>\n <th>{{'Evento corrente' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'In corso da' | localize: lc}}</th>\n <th>p1 - p3</th>\n </tr>\n </thead>\n <tbody>\n @for (thread of session.threads; track thread.tid) {\n <tr [class.dv2-highlight]=\"thread.tid == highlightedTid\">\n <td><button type=\"button\" class=\"btn btn-sm btn-link dv2-toggle\" (click)=\"toggleThread(thread)\" [title]=\"'Pila completa degli eventi' | localize: lc\"><i class=\"fa\" [class.fa-caret-right]=\"expandedTid != thread.tid\" [class.fa-caret-down]=\"expandedTid == thread.tid\"></i></button></td>\n <td>{{thread.tid}}</td>\n <td class=\"app-nowrap\">{{thread.name}}</td>\n <td class=\"app-nowrap\">{{thread.type}}</td>\n <td>{{thread.currentStatus}}</td>\n <td>{{thread.priority}}</td>\n <td><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"thread.currentApi || ''\">{{thread.currentApi}}</span></td>\n <td>{{thread.machineName}}</td>\n <td>\n @if (thread.inWait && thread.currentWaitNodeId) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"thread.currentWait\" (click)=\"pushNode(thread.currentWaitNodeId)\">{{thread.currentWait}}</span>\n <span class=\"dv2-muted\">{{typeLabel(thread.waitEventTypeName, thread.waitClassName)}}</span>\n } @else {\n <span class=\"dv2-muted\">{{'nessun evento in corso' | localize: lc}}</span>\n }\n </td>\n <td class=\"dv2-right app-nowrap\">{{thread.inWait ? (runningSeconds(thread) | pv2fmt: 'dur') : '\u2014'}}</td>\n <td class=\"dv2-muted\"><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')\">{{[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')}}</span></td>\n </tr>\n @if (expandedTid == thread.tid) {\n <tr class=\"dv2-stack-row\">\n <td colspan=\"11\"><pre class=\"dv2-stack\">{{thread.fullWaitStack || ('Nessun evento' | localize: lc)}}</pre></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- S5 Operazioni lunghe -->\n @if (session.connected && session.longOps?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Operazioni lunghe' | localize: lc}}</div>\n @for (op of session.longOps; track $index) {\n <div class=\"dv2-longop\">\n <div class=\"dv2-meta\">\n <strong>{{op.opName}}</strong>\n <span>{{op.target}} @if (op.targetDesc) {<span class=\"dv2-muted\">({{op.targetDesc}})</span>}</span>\n <span class=\"dv2-muted\">Thread {{op.tid}}</span>\n </div>\n <div class=\"dv2-progress\"><div [style.width.%]=\"progress(op)\"></div></div>\n <div class=\"dv2-meta dv2-small\">\n <span>{{op.soFar | number : '1.0-0' : 'it'}} {{'di' | localize: lc}} {{op.totalWork | number : '1.0-0' : 'it'}} {{op.units}} ({{progress(op) | number : '1.0-1' : 'it'}}%)</span>\n <span>{{'Trascorso' | localize: lc}} {{op.elapsedSeconds | pv2fmt: 'dur'}}</span>\n <span>{{'Alla fine' | localize: lc}} {{op.timeRemaining == null ? ('non stimabile' | localize: lc) : (op.timeRemaining | pv2fmt: 'dur')}}</span>\n @if (op.message) {\n <span class=\"dv2-muted\">{{op.message}}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}:host ::ng-deep .dv2-noclear .p-select-clear-icon{display:none}.dv2-header{align-items:center}.dv2-heading{display:flex;flex:1 1 auto;align-items:center;gap:12px;min-width:0}.dv2-heading .btn{flex:none;white-space:nowrap}.dv2-heading .modal-title{margin:0;overflow-wrap:anywhere}.dv2-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;padding-top:6px}.dv2-group{display:flex;align-items:center;gap:8px}.dv2-end{margin-left:auto}.dv2-window{font-weight:600;white-space:nowrap}.dv2-field{width:170px}.dv2-field-wide{width:200px}.dv2-seg{display:inline-flex;border:1px solid var(--p-form-field-border-color, #cbd5e1);border-radius:var(--p-form-field-border-radius, 6px);overflow:hidden}.dv2-seg button{border:0;border-left:1px solid var(--p-form-field-border-color, #cbd5e1);background:transparent;padding:4px 10px;font-size:12px;white-space:nowrap;cursor:pointer}.dv2-seg button:first-child{border-left:0}.dv2-seg button.dv2-on{background:var(--p-primary-color, #6366f1);color:#fff}.dv2-panel{margin-top:12px;padding:10px 12px 12px;border:1px solid var(--p-content-border-color, #e2e8f0);border-radius:var(--p-form-field-border-radius, 6px);min-width:0}.dv2-title{font-weight:600;margin-bottom:6px}.dv2-title .dv2-muted{font-weight:400;margin-left:8px}.dv2-spaced{margin-top:14px}.dv2-chart-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px;padding-top:6px;margin-bottom:6px}.dv2-muted{color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-small{font-size:12px}.dv2-note{margin-top:6px;color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-state{margin:12px 0 0}.dv2-empty{padding:40px 0;text-align:center;color:var(--p-text-muted-color, #64748b)}.dv2-estimate{display:inline-block;margin-left:6px;padding:0 6px;border:1px solid #fcd34d;border-radius:10px;background:#fffbeb;color:#92400e;font-size:11px;font-weight:400}.dv2-badge{display:inline-block;padding:1px 8px;border-radius:10px;background:#dcfce7;color:#166534;font-size:12px;font-weight:600}.dv2-badge-off{background:#fee2e2;color:#991b1b}.dv2-node-name{font-family:var(--p-font-family-mono, Consolas, monospace);font-size:13px;white-space:pre-wrap;word-break:break-word;max-height:160px;overflow:auto}.dv2-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 16px;margin-top:6px}.dv2-session-head{margin-top:0}.dv2-path{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-top:8px;font-size:12px}.dv2-path-item{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dv2-path-current{font-weight:600}.dv2-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px}.dv2-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 12px}@media(max-width:991px){.dv2-grid{grid-template-columns:minmax(0,1fr)}}.dv2-table{margin-bottom:0;font-size:12px}.dv2-table th{font-weight:600;white-space:nowrap}.dv2-table td{vertical-align:middle}.dv2-right{text-align:right}.dv2-live{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:8px;font-size:12px}.dv2-typebar{display:flex;height:14px;border-radius:3px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-idle{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.55) 0 3px,transparent 3px 6px)}.dv2-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12px}.dv2-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:2px;vertical-align:-1px}.dv2-tables{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:0 12px}.dv2-tables .dv2-table{table-layout:fixed;width:100%}.dv2-tables .dv2-table td:nth-child(2){width:120px}.dv2-tables .dv2-table td:nth-child(3){width:58px}.dv2-tables .dv2-ellipsis{display:block;max-width:100%}.dv2-ellipsis{display:inline-block;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.dv2-ellipsis-short{max-width:160px}.dv2-ellipsis+.dv2-muted{margin-left:6px}.dv2-bar-cell{display:flex;align-items:center;gap:8px}.dv2-bar{display:flex;flex:none;width:70px;height:8px;border-radius:2px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-highlight>td{background:#eef2ff}.dv2-scroll{overflow-x:auto}.dv2-toggle{padding:0 4px}.dv2-stack-row>td{border-top:0}.dv2-stack{margin:0;padding:8px;max-height:240px;overflow:auto;border-radius:4px;background:#f8fafc;font-size:11px;white-space:pre}.dv2-longop+.dv2-longop{margin-top:12px}.dv2-progress{height:8px;margin-top:6px;border-radius:4px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-progress div{height:100%;background:var(--p-primary-color, #6366f1)}\n"] }]
|
|
1537
|
+
args: [{ selector: "adm-details-v2", providers: [{ provide: LocalizationService, useClass: AdmDetailsV2Loc }], standalone: false, template: "<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <!-- Navigazione: \"Indietro\" torna al dettaglio precedente con la sua finestra (D1) -->\n <div class=\"modal-header dv2-header\">\n <div class=\"dv2-heading\">\n @if (stack.length > 1) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"back()\"><i class=\"fa fa-arrow-left\"></i> {{'Indietro' | localize: lc}}</button>\n }\n <h4 class=\"modal-title\">\n @if (current?.kind == 'node') {\n {{'Dettaglio nodo' | localize: lc}}\n } @else if (current) {\n {{'Sessione' | localize: lc}} {{current.sid}},{{current.serial}}\n @if (current.instanceId) {\n <span class=\"dv2-muted\">· {{current.instanceId}}</span>\n }\n }\n </h4>\n </div>\n <button type=\"button\" class=\"close\" (click)=\"close()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n </div>\n\n <div class=\"modal-body\">\n @if (current) {\n <!-- Finestra, sorgente, aggiornamento (D2, D3, D5) -->\n <div class=\"dv2-toolbar\">\n <div class=\"dv2-group\">\n <span class=\"dv2-window\"><i class=\"fa fa-clock\"></i> {{windowLabel}}</span>\n <div class=\"dv2-seg\">\n @for (h of QuickRanges; track h) {\n <button type=\"button\" (click)=\"quickRange(h)\" [title]=\"'Ultime' | localize: lc\">{{h}} h</button>\n }\n </div>\n </div>\n <div class=\"dv2-group dv2-dates\">\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"dv2from\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime></div>\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"dv2to\" [Placeholder]=\"'A' | localize: lc\"></form-datetime></div>\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"applyDates()\" [title]=\"'Applica' | localize: lc\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"dv2-seg\">\n @if (current.kind == 'session') {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Memoria' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Memoria e storico' | localize: lc}}</button>\n } @else {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Dal vivo' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Storico' | localize: lc}}</button>\n }\n </div>\n <div class=\"dv2-group dv2-end\">\n @if (loading) {\n <i class=\"fa fa-spinner fa-spin\"></i>\n }\n @if (updatedAt) {\n <span class=\"dv2-muted\">{{'Aggiornato alle' | localize: lc}} {{updatedAt | date: 'HH:mm:ss'}}</span>\n }\n @if (autoRefresh) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"togglePause()\">\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\n </button>\n }\n </div>\n </div>\n @if (windowClamped) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'La finestra \u00E8 stata ridotta alle ultime 24 ore' | localize: lc}}</div>\n }\n\n <!-- Stati (D6) -->\n @if (error) {\n <div class=\"alert alert-warning dv2-state\">{{error}}</div>\n } @else if (notFound && !loading) {\n <div class=\"alert alert-info dv2-state\">\n {{(current.kind == 'node' ? 'Nodo non trovato' : 'Sessione non trovata: non esiste pi\u00F9 e nella finestra non era attiva') | localize: lc}}\n @if (current.kind == 'node' && !current.realTime) {\n <div class=\"dv2-small\">{{'Sullo storico il nodo si cerca solo negli snapshot della finestra: prova \"Dal vivo\" o una finestra pi\u00F9 ampia' | localize: lc}}</div>\n }\n </div>\n } @else if (loading && !node && !session) {\n <div class=\"dv2-empty\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Carico i Dati' | localize: lc}}</div>\n }\n\n <!-- ==================== Nodo ==================== -->\n @if (node && current.kind == 'node') {\n <!-- N1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-node-name\">{{node.nodeName}}</div>\n <div class=\"dv2-meta\">\n <span><span class=\"dv2-swatch\" [style.background]=\"typeColor(node.eventTypeName, node.waitClassName)\"></span>{{typeLabel(node.eventTypeName, node.waitClassName)}}</span>\n <span class=\"dv2-muted\">Id <code>{{node.nodeId}}</code></span>\n <button type=\"button\" class=\"btn btn-sm btn-link\" (click)=\"copyName()\"><i class=\"fa\" [class.fa-copy]=\"!copied\" [class.fa-check]=\"copied\"></i> {{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\n </div>\n @if (node.fullWaitStack?.length) {\n <div class=\"dv2-path\">\n @for (item of node.fullWaitStack; track item.nodeId) {\n <span class=\"app-link dv2-path-item\" [title]=\"item.nodeName\" (click)=\"pushNode(item.nodeId)\">{{item.nodeName}}</span>\n <i class=\"fa fa-angle-right dv2-muted\"></i>\n }\n <span class=\"dv2-path-item dv2-path-current\" [title]=\"node.nodeName\">{{node.nodeName}}</span>\n </div>\n }\n <div class=\"dv2-actions\">\n @if (CanOpenProfiler) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openProfiler.emit(node.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri nel profiler' | localize: lc}}</button>\n }\n @if (CanShowSessions) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"showSessions()\" [title]=\"(node.numChildren > 0 ? 'Solo l\\'evento esatto: il lavoro dei discendenti non \u00E8 compreso' : 'Top Activity filtrata su questo evento') | localize: lc\">\n <i class=\"fa fa-users\"></i> {{'Sessioni su questo evento' | localize: lc}}\n </button>\n @if (node.numChildren > 0) {\n <span class=\"dv2-muted\">{{'discendenti esclusi' | localize: lc}}</span>\n }\n }\n </div>\n </div>\n\n <div class=\"dv2-grid\">\n <!-- N2 Statistiche -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Statistiche' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Dall\\'avvio' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Dall\\'ultimo snapshot' | localize: lc}} <span class=\"dv2-muted\">({{'dalle' | localize: lc}} {{shortTime(node.snapFrom)}})</span></th>\n } @else {\n <th class=\"dv2-right\">{{'Nella finestra' | localize: lc}} <span class=\"dv2-muted\">({{shortTime(node.snapFrom)}} - {{shortTime(node.snapTo)}})</span></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of nodeStats; track row.label) {\n <tr>\n <td>{{row.label}}</td>\n <td class=\"dv2-right\">{{row.total == null ? '\u2014' : (row.total | pv2fmt: row.kind)}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{row.snap == null ? '\u2014' : (row.snap | pv2fmt: row.kind)}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (nodeLive) {\n <div class=\"dv2-live\">\n <span>{{'Thread dentro adesso' | localize: lc}} <strong>{{node.activeThreads ?? 0}}</strong></span>\n <span>{{'In corso da' | localize: lc}} <strong>{{node.activeMaxTime ? (node.activeMaxTime | pv2fmt: 'dur') : '\u2014'}}</strong></span>\n <span>{{'Ultima uscita' | localize: lc}} <strong>{{node.lastExitTime ? localTime(node.lastExitTime) : '\u2014'}}</strong></span>\n </div>\n }\n </div>\n\n <!-- N4 Dove va il tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Dove va il tempo' | localize: lc}} <span class=\"dv2-muted\">{{'tempo proprio del sottoalbero' | localize: lc}}</span></div>\n <div class=\"dv2-typebar\">\n @for (part of typeParts; track part.label) {\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [class.dv2-idle]=\"part.idle\" [title]=\"part.label + ' ' + (part.percentage | number : '1.1-1' : 'it') + '%'\"></div>\n }\n </div>\n <div class=\"dv2-legend\">\n @for (part of typeParts; track part.label) {\n <span><span class=\"dv2-swatch\" [class.dv2-idle]=\"part.idle\" [style.background]=\"part.color\"></span>{{part.label}} <span class=\"dv2-muted\">{{part.percentage | number : '1.1-1' : 'it'}}%</span></span>\n }\n </div>\n @if (typeParts.length && typeParts[typeParts.length - 1].idle) {\n <div class=\"dv2-muted dv2-small\">{{'Idle \u00E8 tempo di attesa senza lavoro' | localize: lc}}</div>\n }\n\n <!-- N3 Per istanza -->\n @if ((node.instances?.length ?? 0) > 1) {\n <div class=\"dv2-title dv2-spaced\">{{'Per istanza' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Istanza' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Thread attivi' | localize: lc}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (inst of node.instances; track inst.instanceId) {\n <tr>\n <td class=\"app-nowrap\">{{inst.instanceId}}</td>\n <td class=\"dv2-right\">{{inst.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{inst.activeThreads ?? 0}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <!-- N6 Attivit\u00E0 nel tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{'Attivit\u00E0 nel tempo' | localize: lc}}\n <span class=\"dv2-muted\">\u2248 <strong>{{node.averageActiveSessions | number : '1.2-3' : 'it'}}</strong> {{'sessioni attive medie' | localize: lc}} · {{'picco' | localize: lc}} <strong>{{node.peakActiveSessions | number : '1.2-3' : 'it'}}</strong> · {{'un punto ogni' | localize: lc}} {{node.bucketSeconds}} s</span>\n <span class=\"dv2-estimate\" [title]=\"'Valori stimati contando i campioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\n </div>\n <activity-chart-v2 [Times]=\"nodeChartTimes\" [Components]=\"nodeChart\" [BucketSeconds]=\"node.bucketSeconds\" [Uom]=\"'sessioni' | localize: lc\"\n [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2nodechart\"></activity-chart-v2>\n @if (nodeHistoryBefore) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'Prima delle' | localize: lc}} {{nodeHistoryBefore}} {{'i dati vengono dallo storico, con meno risoluzione' | localize: lc}}</div>\n }\n @if (node.numChildren > 0) {\n <div class=\"dv2-muted dv2-small\">{{'Comprende il lavoro dei discendenti' | localize: lc}}</div>\n }\n </div>\n\n <!-- N5 Discendenti principali -->\n @if (node.numChildren > 0) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Discendenti principali' | localize: lc}} <span class=\"dv2-muted\">{{'Figli' | localize: lc}}: {{node.numChildren}} · {{'Discendenti' | localize: lc}}: {{node.numDescendants}}</span></div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Livello' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n <th class=\"dv2-right\">% {{'del nodo' | localize: lc}}</th>\n </tr>\n </thead>\n <tbody>\n @for (d of node.topDescendants ?? []; track d.nodeId) {\n <tr>\n <td><span class=\"app-link dv2-ellipsis\" [title]=\"d.nodeName\" (click)=\"pushNode(d.nodeId)\">{{d.nodeName}}</span></td>\n <td class=\"app-nowrap\">{{typeLabel(d.eventTypeName, d.waitClassName)}}</td>\n <td class=\"dv2-right\">{{d.depth}}</td>\n <td class=\"dv2-right\">{{d.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{d.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{d.percentage | number : '1.1-1' : 'it'}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n <!-- ==================== Sessione ==================== -->\n @if (session && current.kind == 'session') {\n <!-- S1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-meta dv2-session-head\">\n @if (session.connected) {\n <span class=\"dv2-badge\">{{session.currentStatus}}</span>\n } @else {\n <span class=\"dv2-badge dv2-badge-off\">{{'Terminata' | localize: lc}}</span>\n }\n <span>{{'Utente' | localize: lc}} <strong>{{session.user}}</strong>@if (session.tenant) {<span class=\"dv2-muted\"> · {{session.tenant}}</span>}</span>\n <span>{{'Tipo' | localize: lc}} <strong>{{session.type | titlecase}}</strong></span>\n @if (session.resourceConsumerGroup) {\n <span>{{'Gruppo di consumo' | localize: lc}} <strong>{{session.resourceConsumerGroup}}</strong></span>\n }\n @if (session.bgSessionName) {\n <span>{{'Sessione di background' | localize: lc}} <strong>{{session.bgSessionName}}</strong></span>\n }\n @if (session.jobName) {\n <span>Job <strong>{{session.jobName}}</strong></span>\n }\n </div>\n <div class=\"dv2-meta\">\n @if (session.startTime) {\n <span>{{'Inizio' | localize: lc}} <strong>{{localTime(session.startTime)}}</strong> <span class=\"dv2-muted\">({{'collegata da' | localize: lc}} {{connectedFor() | pv2fmt: 'dur'}})</span></span>\n }\n @if (session.numThreads != null) {\n <span>Thread <strong>{{session.numThreads}}</strong></span>\n }\n <span>{{'Ultima attivit\u00E0' | localize: lc}} <strong>{{session.lastSampleTime ? localTime(session.lastSampleTime) : '\u2014'}}</strong></span>\n </div>\n </div>\n\n <!-- S6 Sessione terminata -->\n @if (!session.connected) {\n <div class=\"alert alert-warning dv2-state\">\n {{'La sessione non esiste pi\u00F9: i suoi dati vengono dall\\'ultimo campione, delle' | localize: lc}} {{localTime(session.lastSampleTime)}}\n </div>\n }\n\n <!-- S2 Grafico -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-chart-head\">\n <span class=\"dv2-title\">\n {{'Sessioni attive medie' | localize: lc}}\n @if (session.topActivity) {\n <span class=\"dv2-muted\">\n {{'Media' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'Picco' | localize: lc}} <strong>{{session.topActivity.estimated ? '\u2248 ' : ''}}{{session.topActivity.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'un punto ogni' | localize: lc}} {{session.topActivity.bucketSeconds}} s\n </span>\n @if (session.topActivity.estimated) {\n <span class=\"dv2-estimate\">{{'stima per campionamento' | localize: lc}}</span>\n }\n }\n </span>\n <div class=\"dv2-group\">\n <div class=\"dv2-field dv2-field-wide dv2-noclear\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"'' + current.dimension\" (ngModelChange)=\"setDimension($event)\" name=\"dv2dim\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\"></form-select>\n </div>\n <div class=\"dv2-seg\">\n @for (o of Resolutions; track o.id) {\n <button type=\"button\" [class.dv2-on]=\"'' + current.resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\n }\n </div>\n </div>\n </div>\n <activity-chart-v2 [Times]=\"session.topActivity?.times\" [Components]=\"sessionChart\" [BucketSeconds]=\"session.topActivity?.bucketSeconds\" [FixedColors]=\"sessionFixedColors\"\n [Uom]=\"'sessioni' | localize: lc\" [EmptyText]=\"'Nessuna attivit\u00E0 nella finestra' | localize: lc\" name=\"dv2sessionchart\"></activity-chart-v2>\n </div>\n\n <!-- S3 Tabelle: eventi, thread, API -->\n <div class=\"dv2-tables\">\n @for (table of sessionTables; track table.dimension) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{tableTitle(table)}}@if (table.estimated) { \u2248}\n <span class=\"dv2-muted\">{{'Attivit\u00E0' | localize: lc}} <strong>{{table.estimated ? '\u2248 ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\n </div>\n <table class=\"table table-sm dv2-table\">\n <tbody>\n @for (item of table.items; track $index) {\n <tr [class.dv2-highlight]=\"table.dimension == Dim.Thread && highlightedTid != null && item.key?.startsWith(highlightedTid + '@')\">\n <td>\n @if (isItemClickable(item, table)) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"itemClicked(item, table)\">{{itemLabel(item, table)}}</span>\n } @else {\n <span class=\"dv2-ellipsis\" [class.dv2-muted]=\"item.other || !item.label\" [title]=\"item.label || ''\">{{itemLabel(item, table)}}</span>\n }\n </td>\n <td class=\"app-nowrap\">\n <div class=\"dv2-bar-cell\">\n <div class=\"dv2-bar\">\n @for (part of item.breakdown; track $index) {\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\n }\n </div>\n <span>{{table.estimated ? '\u2248 ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\n </div>\n </td>\n <td class=\"dv2-right app-nowrap\">{{item.percentage | number : '1.1-1' : 'it'}}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- S4 Thread adesso -->\n @if (session.connected && session.threads?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Thread adesso' | localize: lc}}</div>\n <div class=\"dv2-scroll\">\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n <th>TID</th>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th>{{'Stato' | localize: lc}}</th>\n <th>{{'Priorit\u00E0' | localize: lc}}</th>\n <th>API</th>\n <th>{{'Macchina' | localize: lc}}</th>\n <th>{{'Evento corrente' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'In corso da' | localize: lc}}</th>\n <th>p1 - p3</th>\n </tr>\n </thead>\n <tbody>\n @for (thread of session.threads; track thread.tid) {\n <tr [class.dv2-highlight]=\"thread.tid == highlightedTid\">\n <td><button type=\"button\" class=\"btn btn-sm btn-link dv2-toggle\" (click)=\"toggleThread(thread)\" [title]=\"'Pila completa degli eventi' | localize: lc\"><i class=\"fa\" [class.fa-caret-right]=\"expandedTid != thread.tid\" [class.fa-caret-down]=\"expandedTid == thread.tid\"></i></button></td>\n <td>{{thread.tid}}</td>\n <td class=\"app-nowrap\">{{thread.name}}</td>\n <td class=\"app-nowrap\">{{thread.type}}</td>\n <td>{{thread.currentStatus}}</td>\n <td>{{thread.priority}}</td>\n <td><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"thread.currentApi || ''\">{{thread.currentApi}}</span></td>\n <td>{{thread.machineName}}</td>\n <td>\n @if (thread.inWait && thread.currentWaitNodeId) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"thread.currentWait\" (click)=\"pushNode(thread.currentWaitNodeId)\">{{thread.currentWait}}</span>\n <span class=\"dv2-muted\">{{typeLabel(thread.waitEventTypeName, thread.waitClassName)}}</span>\n } @else {\n <span class=\"dv2-muted\">{{'nessun evento in corso' | localize: lc}}</span>\n }\n </td>\n <td class=\"dv2-right app-nowrap\">{{thread.inWait ? (runningSeconds(thread) | pv2fmt: 'dur') : '\u2014'}}</td>\n <td class=\"dv2-muted\"><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')\">{{[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' \u00B7 ')}}</span></td>\n </tr>\n @if (expandedTid == thread.tid) {\n <tr class=\"dv2-stack-row\">\n <td colspan=\"11\"><pre class=\"dv2-stack\">{{thread.fullWaitStack || ('Nessun evento' | localize: lc)}}</pre></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- S5 Operazioni lunghe -->\n @if (session.connected && session.longOps?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Operazioni lunghe' | localize: lc}}</div>\n @for (op of session.longOps; track $index) {\n <div class=\"dv2-longop\">\n <div class=\"dv2-meta\">\n <strong>{{op.opName}}</strong>\n <span>{{op.target}} @if (op.targetDesc) {<span class=\"dv2-muted\">({{op.targetDesc}})</span>}</span>\n <span class=\"dv2-muted\">Thread {{op.tid}}</span>\n </div>\n <div class=\"dv2-progress\"><div [style.width.%]=\"progress(op)\"></div></div>\n <div class=\"dv2-meta dv2-small\">\n <span>{{op.soFar | number : '1.0-0' : 'it'}} {{'di' | localize: lc}} {{op.totalWork | number : '1.0-0' : 'it'}} {{op.units}} ({{progress(op) | number : '1.0-1' : 'it'}}%)</span>\n <span>{{'Trascorso' | localize: lc}} {{op.elapsedSeconds | pv2fmt: 'dur'}}</span>\n <span>{{'Alla fine' | localize: lc}} {{op.timeRemaining == null ? ('non stimabile' | localize: lc) : (op.timeRemaining | pv2fmt: 'dur')}}</span>\n @if (op.message) {\n <span class=\"dv2-muted\">{{op.message}}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block}:host ::ng-deep .dv2-noclear .p-select-clear-icon{display:none}.dv2-header{align-items:center}.dv2-heading{display:flex;flex:1 1 auto;align-items:center;gap:12px;min-width:0}.dv2-heading .btn{flex:none;white-space:nowrap}.dv2-heading .modal-title{margin:0;overflow-wrap:anywhere}.dv2-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;padding-top:6px}.dv2-group{display:flex;align-items:center;gap:8px}.dv2-end{margin-left:auto}.dv2-window{font-weight:600;white-space:nowrap}.dv2-field{width:170px}.dv2-field-wide{width:200px}.dv2-seg{display:inline-flex;border:1px solid var(--p-form-field-border-color, #cbd5e1);border-radius:var(--p-form-field-border-radius, 6px);overflow:hidden}.dv2-seg button{border:0;border-left:1px solid var(--p-form-field-border-color, #cbd5e1);background:transparent;padding:4px 10px;font-size:12px;white-space:nowrap;cursor:pointer}.dv2-seg button:first-child{border-left:0}.dv2-seg button.dv2-on{background:var(--p-primary-color, #6366f1);color:#fff}.dv2-panel{margin-top:12px;padding:10px 12px 12px;border:1px solid var(--p-content-border-color, #e2e8f0);border-radius:var(--p-form-field-border-radius, 6px);min-width:0}.dv2-title{font-weight:600;margin-bottom:6px}.dv2-title .dv2-muted{font-weight:400;margin-left:8px}.dv2-spaced{margin-top:14px}.dv2-chart-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px;padding-top:6px;margin-bottom:6px}.dv2-muted{color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-small{font-size:12px}.dv2-note{margin-top:6px;color:var(--p-text-muted-color, #64748b);font-size:12px}.dv2-state{margin:12px 0 0}.dv2-empty{padding:40px 0;text-align:center;color:var(--p-text-muted-color, #64748b)}.dv2-estimate{display:inline-block;margin-left:6px;padding:0 6px;border:1px solid #fcd34d;border-radius:10px;background:#fffbeb;color:#92400e;font-size:11px;font-weight:400}.dv2-badge{display:inline-block;padding:1px 8px;border-radius:10px;background:#dcfce7;color:#166534;font-size:12px;font-weight:600}.dv2-badge-off{background:#fee2e2;color:#991b1b}.dv2-node-name{font-family:var(--p-font-family-mono, Consolas, monospace);font-size:13px;white-space:pre-wrap;word-break:break-word;max-height:160px;overflow:auto}.dv2-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 16px;margin-top:6px}.dv2-session-head{margin-top:0}.dv2-path{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-top:8px;font-size:12px}.dv2-path-item{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dv2-path-current{font-weight:600}.dv2-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px}.dv2-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 12px}@media(max-width:991px){.dv2-grid{grid-template-columns:minmax(0,1fr)}}.dv2-table{margin-bottom:0;font-size:12px}.dv2-table th{font-weight:600;white-space:nowrap}.dv2-table td{vertical-align:middle}.dv2-right{text-align:right}.dv2-live{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:8px;font-size:12px}.dv2-typebar{display:flex;height:14px;border-radius:3px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-idle{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.55) 0 3px,transparent 3px 6px)}.dv2-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12px}.dv2-swatch{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:2px;vertical-align:-1px}.dv2-tables{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:0 12px}.dv2-tables .dv2-table{table-layout:fixed;width:100%}.dv2-tables .dv2-table td:nth-child(2){width:120px}.dv2-tables .dv2-table td:nth-child(3){width:58px}.dv2-tables .dv2-ellipsis{display:block;max-width:100%}.dv2-ellipsis{display:inline-block;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.dv2-ellipsis-short{max-width:160px}.dv2-ellipsis+.dv2-muted{margin-left:6px}.dv2-bar-cell{display:flex;align-items:center;gap:8px}.dv2-bar{display:flex;flex:none;width:70px;height:8px;border-radius:2px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-highlight>td{background:#eef2ff}.dv2-scroll{overflow-x:auto}.dv2-toggle{padding:0 4px}.dv2-stack-row>td{border-top:0}.dv2-stack{margin:0;padding:8px;max-height:240px;overflow:auto;border-radius:4px;background:#f8fafc;font-size:11px;white-space:pre}.dv2-longop+.dv2-longop{margin-top:12px}.dv2-progress{height:8px;margin-top:6px;border-radius:4px;overflow:hidden;background:var(--p-content-border-color, #e2e8f0)}.dv2-progress div{height:100%;background:var(--p-primary-color, #6366f1)}\n"] }]
|
|
1537
1538
|
}], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i1$1.DateService }, { type: AdminModuleBaseService }], propDecorators: { Be: [{
|
|
1538
1539
|
type: Input
|
|
1539
1540
|
}], CanShowSessions: [{
|