]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.html
d/control: depend on python3-yaml for ceph-mgr
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / shared / datatable / table / table.component.html
CommitLineData
9f95a23c
TL
1<cd-alert-panel type="error"
2 *ngIf="loadingError"
3 i18n>Failed to load data.</cd-alert-panel>
11fdf7f2
TL
4
5<div class="dataTables_wrapper">
9f95a23c
TL
6
7 <div *ngIf="onlyActionHeader"
8 class="dataTables_header clearfix">
9 <div class="cd-datatable-actions">
10 <ng-content select=".only-table-actions"></ng-content>
11 </div>
12 </div>
13 <div class="dataTables_header clearfix"
11fdf7f2
TL
14 *ngIf="toolHeader">
15 <!-- actions -->
9f95a23c 16 <div class="cd-datatable-actions">
11fdf7f2
TL
17 <ng-content select=".table-actions"></ng-content>
18 </div>
19 <!-- end actions -->
20
21 <!-- filters -->
22 <ng-content select=".table-filters"></ng-content>
23 <!-- end filters -->
24
9f95a23c
TL
25 <!-- column filters -->
26 <div *ngIf="columnFilters.length !== 0"
27 class="btn-group widget-toolbar">
28 <div dropdown
29 class="btn-group tc_filter_name">
30 <a dropdownToggle
31 class="btn btn-light dropdown-toggle"
32 data-toggle="dropdown">
33 <i [ngClass]="[icons.large, icons.filter]"></i>
34 {{ selectedFilter.column.name }}
35 </a>
36 <ul *dropdownMenu
37 class="dropdown-menu px-1"
38 role="menu">
39 <li *ngFor="let filter of columnFilters"
40 role="menuitem">
41 <a href=""
42 class="dropdown-item"
43 (click)="onSelectFilter(filter); false">{{ filter.column.name }}</a>
44 </li>
45 </ul>
46 </div>
47 <div dropdown
48 class="btn-group tc_filter_option">
49 <a dropdownToggle
50 class="btn btn-light dropdown-toggle"
51 [class.disabled]="selectedFilter.options.length === 0"
52 data-toggle="dropdown">
53 {{ selectedFilter.value ? selectedFilter.value.formatted: 'Any' }}
54 </a>
55 <ul *dropdownMenu
56 class="dropdown-menu px-1"
57 role="menu">
58 <li *ngFor="let option of selectedFilter.options"
59 role="menuitem">
60 <a href=""
61 class="dropdown-item"
62 (click)="onChangeFilter(selectedFilter, option); false">{{ option.formatted }}
63 <i *ngIf="selectedFilter.value !== undefined && (selectedFilter.value.raw === option.raw)"
64 [ngClass]="[icons.check]"></i>
65 </a>
66 </li>
67 </ul>
68 </div>
69 </div>
70 <!-- end column filters -->
71
11fdf7f2 72 <!-- search -->
9f95a23c
TL
73 <div class="input-group search"
74 *ngIf="searchField">
75 <span class="input-group-prepend">
76 <span class="input-group-text">
77 <i [ngClass]="[icons.search]"></i>
78 </span>
11fdf7f2
TL
79 </span>
80 <input class="form-control"
81 type="text"
82 [(ngModel)]="search"
83 (keyup)="updateFilter()">
9f95a23c 84 <div class="input-group-append">
11fdf7f2 85 <button type="button"
9f95a23c
TL
86 class="btn btn-light"
87 (click)="onClearSearch()">
88 <i class="icon-prepend {{ icons.destroy }}"></i>
11fdf7f2 89 </button>
9f95a23c 90 </div>
11fdf7f2
TL
91 </div>
92 <!-- end search -->
93
94 <!-- pagination limit -->
95 <div class="input-group dataTables_paginate">
96 <input class="form-control"
97 type="number"
98 min="1"
99 max="9999"
100 [value]="userConfig.limit"
101 (click)="setLimit($event)"
102 (keyup)="setLimit($event)"
103 (blur)="setLimit($event)">
104 </div>
105 <!-- end pagination limit-->
106
107 <!-- show hide columns -->
108 <div class="widget-toolbar">
109 <div dropdown
9f95a23c 110 [autoClose]="false"
11fdf7f2
TL
111 class="dropdown tc_menuitem tc_menuitem_cluster">
112 <a dropdownToggle
9f95a23c 113 class="btn btn-light dropdown-toggle tc_columnBtn"
11fdf7f2 114 data-toggle="dropdown">
9f95a23c 115 <i [ngClass]="[icons.large, icons.table]"></i>
11fdf7f2
TL
116 </a>
117 <ul *dropdownMenu
9f95a23c 118 class="dropdown-menu px-3">
11fdf7f2 119 <li *ngFor="let column of columns">
9f95a23c
TL
120
121 <div class="custom-control custom-checkbox">
122 <input class="custom-control-input"
123 type="checkbox"
11fdf7f2
TL
124 (change)="toggleColumn($event)"
125 [name]="column.prop"
9f95a23c 126 [id]="column.prop"
11fdf7f2 127 [checked]="!column.isHidden">
9f95a23c
TL
128 <label class="custom-control-label"
129 [for]="column.prop">{{ column.name }}</label>
130 </div>
11fdf7f2
TL
131 </li>
132 </ul>
133 </div>
134 </div>
135 <!-- end show hide columns -->
136
137 <!-- refresh button -->
138 <div class="widget-toolbar tc_refreshBtn"
139 *ngIf="fetchData.observers.length > 0">
9f95a23c
TL
140
141 <button type="button"
142 class="btn btn-light"
143 (click)="refreshBtn()">
144 <i [ngClass]="[icons.large, icons.refresh]"
11fdf7f2 145 [class.fa-spin]="updating || loadingIndicator"></i>
9f95a23c 146 </button>
11fdf7f2
TL
147 </div>
148 <!-- end refresh button -->
149 </div>
9f95a23c
TL
150 <div class="dataTables_header clearfix"
151 *ngIf="toolHeader && columnFiltered">
152 <!-- filter chips for column filters -->
153 <div class="filter-chips">
154 <span *ngFor="let filter of columnFilters">
155 <span *ngIf="filter.value"
156 class="badge badge-info mr-2">
157 <span class="mr-2">{{ filter.column.name }}: {{ filter.value.formatted }}</span>
158 <a class="badge-remove"
159 (click)="onChangeFilter(filter); false">
160 <i [ngClass]="[icons.destroy]"
161 aria-hidden="true"></i>
162 </a>
163 </span>
164 </span>
165 <a class="tc_clearSelections"
166 href=""
167 (click)="onClearFilters(); false">
168 <ng-container i18n>Clear filters</ng-container>
169 </a>
170 </div>
171 <!-- end filter chips for column filters -->
172 </div>
11fdf7f2 173 <ngx-datatable #table
9f95a23c 174 class="bootstrap cd-datatable"
11fdf7f2
TL
175 [cssClasses]="paginationClasses"
176 [selectionType]="selectionType"
177 [selected]="selection.selected"
9f95a23c 178 (select)="onSelect($event)"
11fdf7f2
TL
179 [sorts]="userConfig.sorts"
180 (sort)="changeSorting($event)"
181 [columns]="tableColumns"
182 [columnMode]="columnMode"
183 [rows]="rows"
184 [rowClass]="getRowClass()"
185 [headerHeight]="header ? 'auto' : 0"
186 [footerHeight]="footer ? 'auto' : 0"
187 [limit]="userConfig.limit > 0 ? userConfig.limit : undefined"
188 [loadingIndicator]="loadingIndicator"
189 [rowIdentity]="rowIdentity()"
190 [rowHeight]="'auto'">
191 <ngx-datatable-footer>
192 <ng-template ngx-datatable-footer-template
193 let-rowCount="rowCount"
194 let-pageSize="pageSize"
195 let-selectedCount="selectedCount"
196 let-curPage="curPage"
197 let-offset="offset"
198 let-isVisible="isVisible">
199 <div class="page-count">
200 <span *ngIf="selectionType">
201 {{ selectedCount }} <ng-container i18n="X selected">selected</ng-container> /
202 </span>
203 <span *ngIf="rowCount != data?.length">
204 {{ rowCount }} <ng-container i18n="X found">found</ng-container> /
205 </span>
206 <span>
207 {{ data?.length || 0 }} <ng-container i18n="X total">total</ng-container>
208 </span>
209 </div>
210 <datatable-pager [pagerLeftArrowIcon]="paginationClasses.pagerLeftArrow"
211 [pagerRightArrowIcon]="paginationClasses.pagerRightArrow"
212 [pagerPreviousIcon]="paginationClasses.pagerPrevious"
213 [pagerNextIcon]="paginationClasses.pagerNext"
214 [page]="curPage"
215 [size]="pageSize"
216 [count]="rowCount"
217 [hidden]="!((rowCount / pageSize) > 1)"
218 (change)="table.onFooterPage($event)">
219 </datatable-pager>
220 </ng-template>
221 </ngx-datatable-footer>
222 </ngx-datatable>
223</div>
224
225<!-- Table Details -->
226<ng-content select="[cdTableDetail]"></ng-content>
227
228<!-- cell templates that can be accessed from outside -->
229<ng-template #tableCellBoldTpl
230 let-value="value">
231 <strong>{{ value }}</strong>
232</ng-template>
233
234<ng-template #sparklineTpl
235 let-row="row"
236 let-value="value">
237 <cd-sparkline [data]="value"
238 [isBinary]="row.cdIsBinary"></cd-sparkline>
239</ng-template>
240
241<ng-template #routerLinkTpl
242 let-row="row"
243 let-value="value">
244 <a [routerLink]="[row.cdLink]"
245 [queryParams]="row.cdParams">{{ value }}</a>
246</ng-template>
247
248<ng-template #checkIconTpl
249 let-value="value">
9f95a23c
TL
250 <i [ngClass]="[icons.check]"
251 [hidden]="!(value | boolean)"></i>
11fdf7f2
TL
252</ng-template>
253
254<ng-template #perSecondTpl
255 let-row="row"
256 let-value="value">
257 {{ value }} /s
258</ng-template>
259
260<ng-template #executingTpl
261 let-row="row"
262 let-value="value">
9f95a23c 263 <i [ngClass]="[icons.spinner, icons.spin]"
11fdf7f2
TL
264 *ngIf="row.cdExecuting"></i>
265 {{ value }}
266 <span *ngIf="row.cdExecuting"
eafe8130 267 class="text-muted italic">({{ row.cdExecuting }})</span>
11fdf7f2
TL
268</ng-template>
269
270<ng-template #classAddingTpl
271 let-value="value">
272 <span class="{{useCustomClass(value)}}">{{ value }}</span>
273</ng-template>
9f95a23c
TL
274
275<ng-template #badgeTpl
276 let-column="column"
277 let-value="value">
278 <span *ngFor="let item of (value | array); last as last">
279 <span class="badge"
280 [ngClass]="(column?.customTemplateConfig?.map && column?.customTemplateConfig?.map[item]?.class) ? column.customTemplateConfig.map[item].class : (column?.customTemplateConfig?.class ? column.customTemplateConfig.class : 'badge-primary')"
281 *ngIf="(column?.customTemplateConfig?.map && column?.customTemplateConfig?.map[item]?.value) ? column.customTemplateConfig.map[item].value : column?.customTemplateConfig?.prefix ? column.customTemplateConfig.prefix + item : item">
282 {{ (column?.customTemplateConfig?.map && column?.customTemplateConfig?.map[item]?.value) ? column.customTemplateConfig.map[item].value : column?.customTemplateConfig?.prefix ? column.customTemplateConfig.prefix + item : item }}
283 </span>
284 <span *ngIf="!last">&nbsp;</span>
285 </span>
286</ng-template>
287
288<ng-template #mapTpl
289 let-column="column"
290 let-value="value">
291 <span>{{ value | map:column?.customTemplateConfig }}</span>
292</ng-template>
1911f103
TL
293
294<ng-template #truncateTpl
295 let-column="column"
296 let-value="value">
297 <span data-toggle="tooltip"
298 [title]="value">{{ value | truncate:column?.customTemplateConfig?.length:column?.customTemplateConfig?.omission }}</span>
299</ng-template>