@mmlogic/components 0.1.9 → 0.1.11

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.
Files changed (45) hide show
  1. package/README.md +196 -61
  2. package/dist/cjs/format-DBr-GTvS.js +308 -0
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/mosterdcomponents.cjs.js +1 -1
  5. package/dist/cjs/mrd-boolean-field_16.cjs.entry.js +108 -117
  6. package/dist/cjs/mrd-table.cjs.entry.js +318 -62
  7. package/dist/collection/components/mrd-field/mrd-field.js +26 -2
  8. package/dist/collection/components/mrd-file-field/mrd-file-field.js +70 -2
  9. package/dist/collection/components/mrd-file-field/mrd-file-field.scss +13 -0
  10. package/dist/collection/components/mrd-form/mrd-form.js +28 -1
  11. package/dist/collection/components/mrd-image-field/mrd-image-field.js +71 -2
  12. package/dist/collection/components/mrd-image-field/mrd-image-field.scss +26 -2
  13. package/dist/collection/components/mrd-table/mrd-table.js +386 -62
  14. package/dist/collection/components/mrd-table/mrd-table.scss +388 -0
  15. package/dist/collection/dev/app.js +48 -4
  16. package/dist/collection/dev/sprites.svg +55 -0
  17. package/dist/collection/utils/i18n.js +144 -0
  18. package/dist/components/i18n.js +1 -1
  19. package/dist/components/mrd-field2.js +1 -1
  20. package/dist/components/mrd-file-field2.js +1 -1
  21. package/dist/components/mrd-form.js +1 -1
  22. package/dist/components/mrd-image-field2.js +1 -1
  23. package/dist/components/mrd-table.js +1 -1
  24. package/dist/esm/format-EzhfM0uw.js +299 -0
  25. package/dist/esm/loader.js +1 -1
  26. package/dist/esm/mosterdcomponents.js +1 -1
  27. package/dist/esm/mrd-boolean-field_16.entry.js +82 -91
  28. package/dist/esm/mrd-table.entry.js +318 -62
  29. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
  30. package/dist/mosterdcomponents/p-27f6947a.entry.js +1 -0
  31. package/dist/mosterdcomponents/p-EzhfM0uw.js +1 -0
  32. package/dist/mosterdcomponents/p-ca5f9919.entry.js +1 -0
  33. package/dist/types/components/mrd-field/mrd-field.d.ts +5 -0
  34. package/dist/types/components/mrd-file-field/mrd-file-field.d.ts +10 -0
  35. package/dist/types/components/mrd-form/mrd-form.d.ts +5 -0
  36. package/dist/types/components/mrd-image-field/mrd-image-field.d.ts +10 -0
  37. package/dist/types/components/mrd-table/mrd-table.d.ts +52 -18
  38. package/dist/types/components.d.ts +53 -3
  39. package/dist/types/utils/cell-renderer.d.ts +27 -0
  40. package/package.json +1 -1
  41. package/dist/cjs/format-CDw-zie_.js +0 -82
  42. package/dist/esm/format-Dt-aHxkM.js +0 -74
  43. package/dist/mosterdcomponents/p-2a8cb2eb.entry.js +0 -1
  44. package/dist/mosterdcomponents/p-Dt-aHxkM.js +0 -1
  45. package/dist/mosterdcomponents/p-baf08615.entry.js +0 -1
@@ -152,6 +152,394 @@
152
152
  100% { background-position: -200% 0; }
153
153
  }
154
154
 
155
+ /* ── Toolbar ───────────────────────────────────────────────────────────── */
156
+ .mrd-table__toolbar {
157
+ display: flex;
158
+ align-items: center;
159
+ justify-content: space-between;
160
+ padding-bottom: var(--mrd-space-2);
161
+ }
162
+
163
+ .mrd-table__toolbar-left,
164
+ .mrd-table__toolbar-right {
165
+ display: flex;
166
+ gap: var(--mrd-space-2);
167
+ align-items: center;
168
+ }
169
+
170
+ .mrd-table__action {
171
+ position: relative;
172
+ display: inline-flex;
173
+ align-items: center;
174
+ justify-content: center;
175
+ width: 2rem;
176
+ height: 2rem;
177
+ padding: 0;
178
+ background: transparent;
179
+ border: 1px solid transparent;
180
+ border-radius: var(--mrd-border-radius);
181
+ cursor: pointer;
182
+ color: var(--mrd-color-neutral-400);
183
+ transition: background-color 0.15s, border-color 0.15s, color 0.15s;
184
+ }
185
+
186
+ .mrd-table__action:hover {
187
+ background-color: var(--mrd-color-neutral-100);
188
+ border-color: var(--mrd-color-neutral-300);
189
+ color: var(--mrd-color-neutral-700);
190
+ }
191
+
192
+ .mrd-table__action:disabled {
193
+ opacity: 0.4;
194
+ cursor: not-allowed;
195
+ }
196
+
197
+ /* Primary: slightly more prominent than regular at rest; primary fill on hover */
198
+ .mrd-table__action--primary {
199
+ color: var(--mrd-color-neutral-500);
200
+ }
201
+
202
+ .mrd-table__action--primary:hover {
203
+ background: var(--mrd-color-primary);
204
+ border-color: var(--mrd-color-primary);
205
+ color: var(--mrd-color-white);
206
+ }
207
+
208
+ .mrd-table__action--danger {
209
+ color: var(--mrd-color-error);
210
+ }
211
+
212
+ .mrd-table__action--danger:hover {
213
+ background-color: var(--mrd-color-error-light, #fef2f2);
214
+ border-color: var(--mrd-color-error);
215
+ }
216
+
217
+ .mrd-table__action-icon {
218
+ width: 1.25rem;
219
+ height: 1.25rem;
220
+ pointer-events: none;
221
+ fill: currentColor;
222
+ }
223
+
224
+ /* CSS tooltip — appears above the button on hover */
225
+ .mrd-table__action-tooltip {
226
+ display: none;
227
+ position: absolute;
228
+ bottom: calc(100% + 6px);
229
+ right: 0;
230
+ padding: var(--mrd-space-1) var(--mrd-space-2);
231
+ font-size: var(--mrd-font-size-xs);
232
+ white-space: nowrap;
233
+ background: var(--mrd-color-tooltip, #fffce1);
234
+ color: var(--mrd-color-neutral-900);
235
+ border: 1px solid var(--mrd-border-color);
236
+ border-radius: var(--mrd-border-radius-sm, var(--mrd-border-radius));
237
+ pointer-events: none;
238
+ z-index: 10;
239
+ }
240
+
241
+ .mrd-table__action:hover .mrd-table__action-tooltip {
242
+ display: block;
243
+ }
244
+
245
+ /* ── Filter toggle active state ────────────────────────────────────────── */
246
+ .mrd-table__filter-toggle--active {
247
+ background: var(--mrd-color-primary);
248
+ border-color: var(--mrd-color-primary);
249
+ color: var(--mrd-color-white);
250
+ }
251
+
252
+ .mrd-table__filter-toggle--active:hover {
253
+ background: var(--mrd-color-primary-dark, var(--mrd-color-primary));
254
+ border-color: var(--mrd-color-primary-dark, var(--mrd-color-primary));
255
+ color: var(--mrd-color-white);
256
+ }
257
+
258
+ /* Badge showing count of active filters */
259
+ .mrd-table__filter-badge {
260
+ position: absolute;
261
+ top: -6px;
262
+ right: -6px;
263
+ min-width: 1.25rem;
264
+ height: 1.25rem;
265
+ padding: 0 3px;
266
+ background: var(--mrd-color-error, #e53e3e);
267
+ color: var(--mrd-color-white);
268
+ border-radius: 9999px;
269
+ font-size: 0.65rem;
270
+ font-weight: var(--mrd-font-weight-medium);
271
+ line-height: 1.25rem;
272
+ text-align: center;
273
+ pointer-events: none;
274
+ }
275
+
276
+ /* ── Header: filtered indicator + filter button ─────────────────────────── */
277
+ .mrd-table__header--filtered {
278
+ color: var(--mrd-color-primary);
279
+ border-bottom-color: var(--mrd-color-primary);
280
+ }
281
+
282
+ .mrd-table__header-filter-btn {
283
+ display: inline-flex;
284
+ align-items: center;
285
+ justify-content: center;
286
+ margin-left: var(--mrd-space-1);
287
+ padding: 0 3px;
288
+ background: transparent;
289
+ border: none;
290
+ border-radius: 3px;
291
+ cursor: pointer;
292
+ color: var(--mrd-color-neutral-500);
293
+ font-size: 0.8rem;
294
+ line-height: 1;
295
+ vertical-align: middle;
296
+ }
297
+
298
+ .mrd-table__header-filter-btn:hover {
299
+ background: var(--mrd-color-neutral-200);
300
+ color: var(--mrd-color-neutral-800);
301
+ }
302
+
303
+ .mrd-table__header-filter-btn--active {
304
+ color: var(--mrd-color-primary);
305
+ }
306
+
307
+ /* ── Filter popup ───────────────────────────────────────────────────────── */
308
+ .mrd-table__filter-popup {
309
+ position: fixed;
310
+ width: 280px;
311
+ background: var(--mrd-color-white);
312
+ border: 1px solid var(--mrd-border-color);
313
+ border-radius: var(--mrd-border-radius);
314
+ box-shadow: var(--mrd-shadow-md, 0 4px 12px rgba(0,0,0,.12));
315
+ z-index: var(--mrd-z-dropdown, 200);
316
+ font-size: var(--mrd-font-size-sm);
317
+ }
318
+
319
+ .mrd-table__filter-popup-header {
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: space-between;
323
+ padding: var(--mrd-space-2) var(--mrd-space-3);
324
+ border-bottom: 1px solid var(--mrd-border-color);
325
+ }
326
+
327
+ .mrd-table__filter-popup-title {
328
+ font-weight: var(--mrd-font-weight-medium);
329
+ color: var(--mrd-color-neutral-800);
330
+ font-size: var(--mrd-font-size-sm);
331
+ }
332
+
333
+ .mrd-table__filter-close {
334
+ background: transparent;
335
+ border: none;
336
+ cursor: pointer;
337
+ color: var(--mrd-color-neutral-500);
338
+ font-size: 0.9rem;
339
+ padding: 2px 4px;
340
+ border-radius: 3px;
341
+ line-height: 1;
342
+ }
343
+
344
+ .mrd-table__filter-close:hover {
345
+ background: var(--mrd-color-neutral-100);
346
+ color: var(--mrd-color-neutral-800);
347
+ }
348
+
349
+ .mrd-table__filter-section {
350
+ padding: var(--mrd-space-2) var(--mrd-space-3);
351
+ }
352
+
353
+ .mrd-table__filter-section-label {
354
+ font-size: var(--mrd-font-size-xs);
355
+ font-weight: var(--mrd-font-weight-medium);
356
+ text-transform: uppercase;
357
+ letter-spacing: 0.04em;
358
+ color: var(--mrd-color-neutral-500);
359
+ margin-bottom: var(--mrd-space-2);
360
+ }
361
+
362
+ .mrd-table__filter-sort-buttons {
363
+ display: flex;
364
+ gap: var(--mrd-space-2);
365
+ }
366
+
367
+ .mrd-table__filter-sort-btn {
368
+ flex: 1;
369
+ padding: var(--mrd-space-1) var(--mrd-space-2);
370
+ background: transparent;
371
+ border: 1px solid var(--mrd-border-color);
372
+ border-radius: var(--mrd-border-radius);
373
+ cursor: pointer;
374
+ font-size: var(--mrd-font-size-xs);
375
+ color: var(--mrd-color-neutral-700);
376
+ }
377
+
378
+ .mrd-table__filter-sort-btn:hover {
379
+ background: var(--mrd-color-neutral-100);
380
+ }
381
+
382
+ .mrd-table__filter-sort-btn--active {
383
+ background: var(--mrd-color-primary);
384
+ border-color: var(--mrd-color-primary);
385
+ color: var(--mrd-color-white);
386
+ }
387
+
388
+ .mrd-table__filter-divider {
389
+ height: 1px;
390
+ background: var(--mrd-border-color);
391
+ margin: 0;
392
+ }
393
+
394
+ /* ── Filter editors ─────────────────────────────────────────────────────── */
395
+ .mrd-table__filter-editor {
396
+ display: flex;
397
+ flex-direction: column;
398
+ gap: var(--mrd-space-2);
399
+ }
400
+
401
+ .mrd-table__filter-select,
402
+ .mrd-table__filter-input {
403
+ width: 100%;
404
+ padding: var(--mrd-space-1) var(--mrd-space-2);
405
+ border: 1px solid var(--mrd-border-color);
406
+ border-radius: var(--mrd-border-radius);
407
+ font-size: var(--mrd-font-size-sm);
408
+ color: var(--mrd-color-neutral-900);
409
+ background: var(--mrd-color-white);
410
+ box-sizing: border-box;
411
+ }
412
+
413
+ .mrd-table__filter-select:focus,
414
+ .mrd-table__filter-input:focus {
415
+ outline: none;
416
+ border-color: var(--mrd-color-primary);
417
+ box-shadow: 0 0 0 2px rgba(0,0,0,.06);
418
+ }
419
+
420
+ .mrd-table__filter-range {
421
+ display: flex;
422
+ align-items: center;
423
+ gap: var(--mrd-space-1);
424
+ }
425
+
426
+ .mrd-table__filter-range .mrd-table__filter-input {
427
+ flex: 1;
428
+ min-width: 0;
429
+ }
430
+
431
+ .mrd-table__filter-range-sep {
432
+ color: var(--mrd-color-neutral-400);
433
+ flex-shrink: 0;
434
+ }
435
+
436
+ /* Radio group */
437
+ .mrd-table__filter-radio-group {
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: var(--mrd-space-1);
441
+ }
442
+
443
+ .mrd-table__filter-radio-group--inline {
444
+ flex-direction: row;
445
+ gap: var(--mrd-space-3);
446
+ }
447
+
448
+ .mrd-table__filter-radio-label {
449
+ display: flex;
450
+ align-items: center;
451
+ gap: var(--mrd-space-1);
452
+ cursor: pointer;
453
+ font-size: var(--mrd-font-size-sm);
454
+ color: var(--mrd-color-neutral-800);
455
+ }
456
+
457
+ /* List (enum) checkboxes */
458
+ .mrd-table__filter-list {
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: var(--mrd-space-1);
462
+ max-height: 180px;
463
+ overflow-y: auto;
464
+ }
465
+
466
+ .mrd-table__filter-list-controls {
467
+ display: flex;
468
+ gap: var(--mrd-space-2);
469
+ margin-bottom: var(--mrd-space-1);
470
+ }
471
+
472
+ .mrd-table__filter-list-btn {
473
+ font-size: var(--mrd-font-size-xs);
474
+ color: var(--mrd-color-primary);
475
+ background: transparent;
476
+ border: none;
477
+ cursor: pointer;
478
+ padding: 0;
479
+ text-decoration: underline;
480
+ }
481
+
482
+ .mrd-table__filter-checkbox-label {
483
+ display: flex;
484
+ align-items: center;
485
+ gap: var(--mrd-space-1);
486
+ cursor: pointer;
487
+ font-size: var(--mrd-font-size-sm);
488
+ color: var(--mrd-color-neutral-800);
489
+ }
490
+
491
+ .mrd-table__filter-no-support {
492
+ font-size: var(--mrd-font-size-sm);
493
+ color: var(--mrd-color-neutral-500);
494
+ margin: 0;
495
+ font-style: italic;
496
+ }
497
+
498
+ /* ── Popup footer ───────────────────────────────────────────────────────── */
499
+ .mrd-table__filter-popup-footer {
500
+ display: flex;
501
+ justify-content: flex-end;
502
+ gap: var(--mrd-space-2);
503
+ padding: var(--mrd-space-2) var(--mrd-space-3);
504
+ border-top: 1px solid var(--mrd-border-color);
505
+ }
506
+
507
+ .mrd-table__filter-btn {
508
+ padding: var(--mrd-space-1) var(--mrd-space-3);
509
+ border-radius: var(--mrd-border-radius);
510
+ border: 1px solid var(--mrd-border-color);
511
+ font-size: var(--mrd-font-size-sm);
512
+ cursor: pointer;
513
+ }
514
+
515
+ .mrd-table__filter-btn--clear {
516
+ background: transparent;
517
+ color: var(--mrd-color-neutral-600);
518
+ }
519
+
520
+ .mrd-table__filter-btn--clear:hover {
521
+ background: var(--mrd-color-neutral-100);
522
+ }
523
+
524
+ .mrd-table__filter-btn--apply {
525
+ background: var(--mrd-color-primary);
526
+ border-color: var(--mrd-color-primary);
527
+ color: var(--mrd-color-white);
528
+ }
529
+
530
+ .mrd-table__filter-btn--apply:hover {
531
+ background: var(--mrd-color-primary-dark, var(--mrd-color-primary));
532
+ border-color: var(--mrd-color-primary-dark, var(--mrd-color-primary));
533
+ }
534
+
535
+ /* ── Pagination footer ─────────────────────────────────────────────────── */
536
+ .mrd-table__footer {
537
+ padding: var(--mrd-space-1) var(--mrd-space-2);
538
+ font-size: var(--mrd-font-size-xs);
539
+ color: var(--mrd-color-neutral-500);
540
+ text-align: right;
541
+ }
542
+
155
543
  /* ── Empty state ───────────────────────────────────────────────────────── */
156
544
  .mrd-table__empty {
157
545
  padding: var(--mrd-space-4) var(--mrd-space-3);
@@ -6,6 +6,7 @@ let _selectedTenant = null;
6
6
  let _selectedType = null; // { name, pluralName }
7
7
  let _relationMeta = {}; // relatedClass / mostSignificantClass → { name, mostSignificantClass }
8
8
  let _tableDataHref = null; // base href for the current table view (without ?page=)
9
+ let _locale = navigator.language || 'nl-NL';
9
10
 
10
11
  /* =====================================================================
11
12
  UTILITIES
@@ -192,18 +193,40 @@ function renderTable(columns, totalElements, pageSize, page0Rows, dataHref, defa
192
193
  customElements.whenDefined('mrd-table').then(async () => {
193
194
  const table = document.getElementById('live-table');
194
195
 
196
+ // Active filters stored here; combined with sort in every mrdLoadPage call
197
+ let _activeFilters = [];
198
+
195
199
  table.columns = columns;
196
- table.locale = 'nl-NL';
200
+ table.locale = _locale;
197
201
  table.pageSize = pageSize;
198
202
  table.tableHeight = 500;
199
203
  table.totalElements = totalElements;
200
204
  table.defaultSort = defaultSort;
205
+ table.actions = [
206
+ { action: 'create', label: 'Nieuw record', icon: 'dev/sprites.svg#icon-plus', variant: 'primary' },
207
+ { action: 'export', label: 'Exporteer naar Excel', icon: 'dev/sprites.svg#icon-file-excel' },
208
+ ];
201
209
 
202
210
  // Register mrdLoadPage before init() so scroll events are caught immediately
203
211
  table.addEventListener('mrdLoadPage', async (e) => {
204
212
  const { page, sort } = e.detail;
205
213
  try {
206
- const result = await apiFetchPage(authGetToken(), dataHref, page, sort);
214
+ const params = new URLSearchParams();
215
+ if (sort) params.set('sort', sort);
216
+ // Apply active filters as simple ?field=value params (range = future API)
217
+ _activeFilters.forEach(f => {
218
+ if (f.operator === 'isEmpty') { params.set(f.field, ''); return; }
219
+ if (f.operator === 'isNotEmpty') { params.set(f.field + '_notempty', 'true'); return; }
220
+ if (f.values?.length) { params.set(f.field, f.values.join(',')); return; }
221
+ if (f.value != null && f.value !== '') params.set(f.field, String(f.value));
222
+ // Range: _from/_to suffix (future API support)
223
+ if (f.from != null && f.from !== '') params.set(f.field + '_from', String(f.from));
224
+ if (f.to != null && f.to !== '') params.set(f.field + '_to', String(f.to));
225
+ });
226
+ const qs = params.toString();
227
+ const url = qs ? `${dataHref}?${qs}` : dataHref;
228
+
229
+ const result = await apiFetchPage(authGetToken(), url, page);
207
230
  const embedded = result._embedded ?? {};
208
231
  const rows = Object.values(embedded)[0] ?? [];
209
232
  await table.setPage(page, rows);
@@ -217,6 +240,18 @@ function renderTable(columns, totalElements, pageSize, page0Rows, dataHref, defa
217
240
  await loadRecord(e.detail);
218
241
  });
219
242
 
243
+ // Table-level action buttons (toolbar)
244
+ table.addEventListener('mrdAction', (e) => {
245
+ logEvent('mrdAction', e.detail);
246
+ if (e.detail.action === 'create') loadForm();
247
+ });
248
+
249
+ // Store filters; mrdLoadPage will pick them up automatically
250
+ table.addEventListener('mrdFilter', (e) => {
251
+ logEvent('mrdFilter', e.detail);
252
+ _activeFilters = e.detail.filters;
253
+ });
254
+
220
255
  await table.init();
221
256
  await table.setPage(0, page0Rows); // inject pre-fetched page 0 — no extra request
222
257
  });
@@ -328,7 +363,7 @@ function renderForm(layout, record = null, selfHref = null) {
328
363
  }
329
364
 
330
365
  const formPanel = document.getElementById('panel-form');
331
- formPanel.innerHTML = '<mrd-form id="live-form" locale="nl-NL"></mrd-form>';
366
+ formPanel.innerHTML = `<mrd-form id="live-form" locale="${_locale}"></mrd-form>`;
332
367
 
333
368
  customElements.whenDefined('mrd-form').then(() => {
334
369
  const form = document.getElementById('live-form');
@@ -488,7 +523,16 @@ customElements.whenDefined('mrd-form').then(() => {
488
523
  });
489
524
 
490
525
  document.getElementById('locale-select').addEventListener('change', (e) => {
491
- document.getElementById('demo-form').locale = e.target.value;
526
+ _locale = e.target.value;
527
+ // Update embedded demo form
528
+ const demoForm = document.getElementById('demo-form');
529
+ if (demoForm) demoForm.locale = _locale;
530
+ // Update live table if present
531
+ const liveTable = document.getElementById('live-table');
532
+ if (liveTable) liveTable.locale = _locale;
533
+ // Update live form if present
534
+ const liveForm = document.getElementById('live-form');
535
+ if (liveForm) liveForm.locale = _locale;
492
536
  });
493
537
 
494
538
  document.getElementById('btn-inject-results').addEventListener('click', () => {
@@ -0,0 +1,55 @@
1
+ <svg aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2
+ <defs>
3
+ <symbol id="icon-search" viewBox="0 0 32 32">
4
+ <path d="M31.008 27.231l-7.58-6.447c-0.784-0.705-1.622-1.029-2.299-0.998 1.789-2.096 2.87-4.815 2.87-7.787 0-6.627-5.373-12-12-12s-12 5.373-12 12 5.373 12 12 12c2.972 0 5.691-1.081 7.787-2.87-0.031 0.677 0.293 1.515 0.998 2.299l6.447 7.58c1.104 1.226 2.907 1.33 4.007 0.23s0.997-2.903-0.23-4.007zM12 20c-4.418 0-8-3.582-8-8s3.582-8 8-8 8 3.582 8 8-3.582 8-8 8z"></path>
5
+ </symbol>
6
+ <symbol id="icon-bin" viewBox="0 0 32 32">
7
+ <path d="M4 10v20c0 1.1 0.9 2 2 2h18c1.1 0 2-0.9 2-2v-20h-22zM10 28h-2v-14h2v14zM14 28h-2v-14h2v14zM18 28h-2v-14h2v14zM22 28h-2v-14h2v14z"></path>
8
+ <path d="M26.5 4h-6.5v-2.5c0-0.825-0.675-1.5-1.5-1.5h-7c-0.825 0-1.5 0.675-1.5 1.5v2.5h-6.5c-0.825 0-1.5 0.675-1.5 1.5v2.5h26v-2.5c0-0.825-0.675-1.5-1.5-1.5zM18 4h-6v-1.975h6v1.975z"></path>
9
+ </symbol>
10
+ <symbol id="icon-plus" viewBox="0 0 32 32">
11
+ <path d="M31 12h-11v-11c0-0.552-0.448-1-1-1h-6c-0.552 0-1 0.448-1 1v11h-11c-0.552 0-1 0.448-1 1v6c0 0.552 0.448 1 1 1h11v11c0 0.552 0.448 1 1 1h6c0.552 0 1-0.448 1-1v-11h11c0.552 0 1-0.448 1-1v-6c0-0.552-0.448-1-1-1z"></path>
12
+ </symbol>
13
+ <symbol id="icon-cross" viewBox="0 0 32 32">
14
+ <path d="M31.708 25.708c-0-0-0-0-0-0l-9.708-9.708 9.708-9.708c0-0 0-0 0-0 0.105-0.105 0.18-0.227 0.229-0.357 0.133-0.356 0.057-0.771-0.229-1.057l-4.586-4.586c-0.286-0.286-0.702-0.361-1.057-0.229-0.13 0.048-0.252 0.124-0.357 0.228 0 0-0 0-0 0l-9.708 9.708-9.708-9.708c-0-0-0-0-0-0-0.105-0.104-0.227-0.18-0.357-0.228-0.356-0.133-0.771-0.057-1.057 0.229l-4.586 4.586c-0.286 0.286-0.361 0.702-0.229 1.057 0.049 0.13 0.124 0.252 0.229 0.357 0 0 0 0 0 0l9.708 9.708-9.708 9.708c-0 0-0 0-0 0-0.104 0.105-0.18 0.227-0.229 0.357-0.133 0.355-0.057 0.771 0.229 1.057l4.586 4.586c0.286 0.286 0.702 0.361 1.057 0.229 0.13-0.049 0.252-0.124 0.357-0.229 0-0 0-0 0-0l9.708-9.708 9.708 9.708c0 0 0 0 0 0 0.105 0.105 0.227 0.18 0.357 0.229 0.356 0.133 0.771 0.057 1.057-0.229l4.586-4.586c0.286-0.286 0.362-0.702 0.229-1.057-0.049-0.13-0.124-0.252-0.229-0.357z"></path>
15
+ </symbol>
16
+ <symbol id="icon-backward2" viewBox="0 0 32 32">
17
+ <path d="M18 5v10l10-10v22l-10-10v10l-11-11z"></path>
18
+ </symbol>
19
+ <symbol id="icon-forward3" viewBox="0 0 32 32">
20
+ <path d="M16 27v-10l-10 10v-22l10 10v-10l11 11z"></path>
21
+ </symbol>
22
+ <symbol id="icon-previous2" viewBox="0 0 32 32">
23
+ <path d="M8 28v-24h4v11l10-10v22l-10-10v11z"></path>
24
+ </symbol>
25
+ <symbol id="icon-next2" viewBox="0 0 32 32">
26
+ <path d="M24 4v24h-4v-11l-10 10v-22l10 10v-11z"></path>
27
+ </symbol>
28
+ <symbol id="icon-sort-alpha-asc" viewBox="0 0 32 32">
29
+ <path d="M10 24v-24h-4v24h-5l7 7 7-7h-5z"></path>
30
+ <path d="M29 32h-8c-0.369 0-0.708-0.203-0.882-0.528s-0.155-0.72 0.050-1.027l6.963-10.445h-6.131c-0.552 0-1-0.448-1-1s0.448-1 1-1h8c0.369 0 0.708 0.203 0.882 0.528s0.155 0.72-0.050 1.027l-6.963 10.445h6.131c0.552 0 1 0.448 1 1s-0.448 1-1 1z"></path>
31
+ <path d="M31.894 12.553l-6-12c-0.169-0.339-0.516-0.553-0.894-0.553s-0.725 0.214-0.895 0.553l-6 12c-0.247 0.494-0.047 1.095 0.447 1.342 0.144 0.072 0.296 0.106 0.447 0.106 0.367 0 0.72-0.203 0.895-0.553l1.724-3.447h6.764l1.724 3.447c0.247 0.494 0.848 0.694 1.342 0.447s0.694-0.848 0.447-1.342zM22.618 8l2.382-4.764 2.382 4.764h-4.764z"></path>
32
+ </symbol>
33
+ <symbol id="icon-sort-alpha-desc" viewBox="0 0 32 32">
34
+ <path d="M10 24v-24h-4v24h-5l7 7 7-7h-5z"></path>
35
+ <path d="M29 14h-8c-0.369 0-0.708-0.203-0.882-0.528s-0.155-0.72 0.050-1.027l6.963-10.445h-6.131c-0.552 0-1-0.448-1-1s0.448-1 1-1h8c0.369 0 0.708 0.203 0.882 0.528s0.155 0.72-0.050 1.027l-6.963 10.445h6.131c0.552 0 1 0.448 1 1s-0.448 1-1 1z"></path>
36
+ <path d="M31.894 30.553l-6-12c-0.169-0.339-0.516-0.553-0.894-0.553s-0.725 0.214-0.895 0.553l-6 12c-0.247 0.494-0.047 1.095 0.447 1.342 0.144 0.072 0.296 0.106 0.447 0.106 0.367 0 0.72-0.203 0.895-0.553l1.724-3.447h6.764l1.724 3.447c0.247 0.494 0.848 0.694 1.342 0.447s0.694-0.848 0.447-1.342zM22.618 26l2.382-4.764 2.382 4.764h-4.764z"></path>
37
+ </symbol>
38
+ <symbol id="icon-filter" viewBox="0 0 32 32">
39
+ <path d="M16 0c-8.837 0-16 2.239-16 5v3l12 12v10c0 1.105 1.791 2 4 2s4-0.895 4-2v-10l12-12v-3c0-2.761-7.163-5-16-5zM2.95 4.338c0.748-0.427 1.799-0.832 3.040-1.171 2.748-0.752 6.303-1.167 10.011-1.167s7.262 0.414 10.011 1.167c1.241 0.34 2.292 0.745 3.040 1.171 0.494 0.281 0.76 0.519 0.884 0.662-0.124 0.142-0.391 0.38-0.884 0.662-0.748 0.427-1.8 0.832-3.040 1.171-2.748 0.752-6.303 1.167-10.011 1.167s-7.262-0.414-10.011-1.167c-1.24-0.34-2.292-0.745-3.040-1.171-0.494-0.282-0.76-0.519-0.884-0.662 0.124-0.142 0.391-0.38 0.884-0.662z"></path>
40
+ </symbol>
41
+ <symbol id="icon-file-excel" viewBox="0 0 32 32">
42
+ <path d="M23.22 12h-4.228l-2.992 4.407-2.992-4.407h-4.228l5.068 7.577-5.718 8.423h7.87v-2.862h-1.567l1.567-2.344 3.481 5.205h4.389l-5.718-8.423 5.068-7.577z"></path>
43
+ <path d="M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.121 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841v0zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268v0zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z"></path>
44
+ </symbol>
45
+ <symbol id="icon-pencil" viewBox="0 0 32 32">
46
+ <path d="M27.414 0.586c-0.781-0.781-2.048-0.781-2.828 0l-3.172 3.172 5.828 5.828 3.172-3.172c0.781-0.781 0.781-2.047 0-2.828l-3-3zM0 24v8h8l17.414-17.414-8-8-17.414 17.414zM6.828 28h-2.828v-2.828l12-12 2.828 2.828-12 12z"></path>
47
+ </symbol>
48
+ <symbol id="icon-ellipsis" viewBox="0 0 32 32">
49
+ <circle cx="4" cy="16" r="3.5"></circle>
50
+ <circle cx="16" cy="16" r="3.5"></circle>
51
+ <circle cx="28" cy="16" r="3.5"></circle>
52
+ </symbol>
53
+ </defs>
54
+ </svg>
55
+