ngx-techlify-core 11.4.4 → 11.4.5-beta.3

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 (27) hide show
  1. package/bundles/ngx-techlify-core.umd.js +88 -32
  2. package/bundles/ngx-techlify-core.umd.js.map +1 -1
  3. package/bundles/ngx-techlify-core.umd.min.js +2 -2
  4. package/bundles/ngx-techlify-core.umd.min.js.map +1 -1
  5. package/esm2015/lib/core/error-handler.interceptor.js +7 -2
  6. package/esm2015/lib/core/error-handler.service.js +1 -1
  7. package/esm2015/lib/core/techlify-config.model.js +3 -1
  8. package/esm2015/lib/entity-files/entity-file-form/entity-file-form.component.js +6 -9
  9. package/esm2015/lib/entity-files/entity-file.service.js +6 -2
  10. package/esm2015/lib/entity-files/entity-files-view-all.component.js +47 -4
  11. package/esm2015/lib/import-csv/import-csv.component.js +3 -2
  12. package/esm2015/lib/import-csv/import-history-list/import-history-list.component.js +3 -2
  13. package/esm2015/lib/material.module.js +4 -2
  14. package/esm2015/lib/techlify-feature/techlify-feature.routing.js +2 -2
  15. package/esm2015/lib/techlify-feature/techlify-feature.service.js +2 -2
  16. package/esm2015/ngx-techlify-core.js +10 -11
  17. package/fesm2015/ngx-techlify-core.js +68 -16
  18. package/fesm2015/ngx-techlify-core.js.map +1 -1
  19. package/lib/core/techlify-config.model.d.ts +1 -0
  20. package/lib/entity-files/entity-file.service.d.ts +1 -1
  21. package/lib/entity-files/entity-files-view-all.component.d.ts +6 -0
  22. package/lib/import-csv/import-csv.component.d.ts +2 -1
  23. package/lib/import-csv/import-history-list/import-history-list.component.d.ts +2 -1
  24. package/lib/techlify-feature/techlify-feature.service.d.ts +1 -1
  25. package/ngx-techlify-core.d.ts +9 -10
  26. package/ngx-techlify-core.metadata.json +1 -1
  27. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/material/dialog'), require('@angular/material/table'), require('@angular/material/sort'), require('@ngneat/until-destroy'), require('@angular/common'), require('@angular/forms'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/material/snack-bar'), require('@angular/cdk/a11y'), require('@angular/cdk/coercion'), require('@angular/material/form-field'), require('@angular/material/select'), require('moment'), require('@angular/material/icon'), require('@angular/router'), require('@angular/material/tooltip'), require('@angular/material/core'), require('@angular/material/button'), require('@angular/material/checkbox'), require('@angular/material/input'), require('@angular/material/menu'), require('@angular/material/progress-spinner'), require('@angular/material/card'), require('@angular/material/divider'), require('@angular/material/chips'), require('@angular/material/datepicker'), require('@angular/material/list'), require('@angular/flex-layout'), require('ngx-infinite-scroll'), require('ngx-doc-viewer'), require('ngx-editor'), require('xlsx'), require('@angular/platform-browser'), require('jsondiffpatch'), require('@angular/cdk/keycodes'), require('@angular/material/autocomplete'), require('@angular/material/button-toggle'), require('@angular/material/slide-toggle')) :
3
- typeof define === 'function' && define.amd ? define('ngx-techlify-core', ['exports', '@angular/core', '@angular/material/dialog', '@angular/material/table', '@angular/material/sort', '@ngneat/until-destroy', '@angular/common', '@angular/forms', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/material/snack-bar', '@angular/cdk/a11y', '@angular/cdk/coercion', '@angular/material/form-field', '@angular/material/select', 'moment', '@angular/material/icon', '@angular/router', '@angular/material/tooltip', '@angular/material/core', '@angular/material/button', '@angular/material/checkbox', '@angular/material/input', '@angular/material/menu', '@angular/material/progress-spinner', '@angular/material/card', '@angular/material/divider', '@angular/material/chips', '@angular/material/datepicker', '@angular/material/list', '@angular/flex-layout', 'ngx-infinite-scroll', 'ngx-doc-viewer', 'ngx-editor', 'xlsx', '@angular/platform-browser', 'jsondiffpatch', '@angular/cdk/keycodes', '@angular/material/autocomplete', '@angular/material/button-toggle', '@angular/material/slide-toggle'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['ngx-techlify-core'] = {}, global.ng.core, global.ng.material.dialog, global.ng.material.table, global.ng.material.sort, global['@ngneat/until-destroy'], global.ng.common, global.ng.forms, global.ng.common.http, global.rxjs, global.rxjs.operators, global.ng.material.snackBar, global.ng.cdk.a11y, global.ng.cdk.coercion, global.ng.material.formField, global.ng.material.select, global.moment, global.ng.material.icon, global.ng.router, global.ng.material.tooltip, global.ng.material.core, global.ng.material.button, global.ng.material.checkbox, global.ng.material.input, global.ng.material.menu, global.ng.material.progressSpinner, global.ng.material.card, global.ng.material.divider, global.ng.material.chips, global.ng.material.datepicker, global.ng.material.list, global.ng.flexLayout, global['ngx-infinite-scroll'], global['ngx-doc-viewer'], global['ngx-editor'], global.xlsx, global.ng.platformBrowser, global.jsondiffpatch, global.ng.cdk.keycodes, global.ng.material.autocomplete, global.ng.material.buttonToggle, global.ng.material.slideToggle));
5
- }(this, (function (exports, i0, dialog, table, sort, untilDestroy, common, forms, i1$1, rxjs, operators, i1, a11y, coercion, formField, select, moment_, icon, i1$2, tooltip, core, button, checkbox, input, menu, progressSpinner, card, divider, chips, datepicker, list, flexLayout, ngxInfiniteScroll, ngxDocViewer, ngxEditor, XLSX, platformBrowser, jsondiffpatch, keycodes, autocomplete, buttonToggle, slideToggle) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/material/dialog'), require('@angular/material/table'), require('@angular/material/sort'), require('@ngneat/until-destroy'), require('@angular/common'), require('@angular/forms'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/material/snack-bar'), require('@angular/cdk/a11y'), require('@angular/cdk/coercion'), require('@angular/material/form-field'), require('@angular/material/select'), require('moment'), require('@angular/material/icon'), require('@angular/router'), require('@angular/material/tooltip'), require('@angular/material/core'), require('@angular/material/button'), require('@angular/material/checkbox'), require('@angular/material/input'), require('@angular/material/menu'), require('@angular/material/progress-spinner'), require('@angular/material/card'), require('@angular/material/divider'), require('@angular/material/chips'), require('@angular/material/datepicker'), require('@angular/material/list'), require('@angular/material/button-toggle'), require('@angular/flex-layout'), require('ngx-infinite-scroll'), require('ngx-doc-viewer'), require('ngx-editor'), require('xlsx'), require('@angular/platform-browser'), require('jsondiffpatch'), require('@angular/cdk/keycodes'), require('@angular/material/autocomplete'), require('@angular/material/slide-toggle')) :
3
+ typeof define === 'function' && define.amd ? define('ngx-techlify-core', ['exports', '@angular/core', '@angular/material/dialog', '@angular/material/table', '@angular/material/sort', '@ngneat/until-destroy', '@angular/common', '@angular/forms', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/material/snack-bar', '@angular/cdk/a11y', '@angular/cdk/coercion', '@angular/material/form-field', '@angular/material/select', 'moment', '@angular/material/icon', '@angular/router', '@angular/material/tooltip', '@angular/material/core', '@angular/material/button', '@angular/material/checkbox', '@angular/material/input', '@angular/material/menu', '@angular/material/progress-spinner', '@angular/material/card', '@angular/material/divider', '@angular/material/chips', '@angular/material/datepicker', '@angular/material/list', '@angular/material/button-toggle', '@angular/flex-layout', 'ngx-infinite-scroll', 'ngx-doc-viewer', 'ngx-editor', 'xlsx', '@angular/platform-browser', 'jsondiffpatch', '@angular/cdk/keycodes', '@angular/material/autocomplete', '@angular/material/slide-toggle'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['ngx-techlify-core'] = {}, global.ng.core, global.ng.material.dialog, global.ng.material.table, global.ng.material.sort, global['@ngneat/until-destroy'], global.ng.common, global.ng.forms, global.ng.common.http, global.rxjs, global.rxjs.operators, global.ng.material.snackBar, global.ng.cdk.a11y, global.ng.cdk.coercion, global.ng.material.formField, global.ng.material.select, global.moment, global.ng.material.icon, global.ng.router, global.ng.material.tooltip, global.ng.material.core, global.ng.material.button, global.ng.material.checkbox, global.ng.material.input, global.ng.material.menu, global.ng.material.progressSpinner, global.ng.material.card, global.ng.material.divider, global.ng.material.chips, global.ng.material.datepicker, global.ng.material.list, global.ng.material.buttonToggle, global.ng.flexLayout, global['ngx-infinite-scroll'], global['ngx-doc-viewer'], global['ngx-editor'], global.xlsx, global.ng.platformBrowser, global.jsondiffpatch, global.ng.cdk.keycodes, global.ng.material.autocomplete, global.ng.material.slideToggle));
5
+ }(this, (function (exports, i0, dialog, table, sort, untilDestroy, common, forms, i1$1, rxjs, operators, i1, a11y, coercion, formField, select, moment_, icon, i1$2, tooltip, core, button, checkbox, input, menu, progressSpinner, card, divider, chips, datepicker, list, buttonToggle, flexLayout, ngxInfiniteScroll, ngxDocViewer, ngxEditor, XLSX, platformBrowser, jsondiffpatch, keycodes, autocomplete, slideToggle) { 'use strict';
6
6
 
7
7
  function _interopNamespace(e) {
8
8
  if (e && e.__esModule) return e;
@@ -747,6 +747,7 @@
747
747
  this.authClientSecret = '';
748
748
  this.authGrantType = '';
749
749
  this.apiUrl = '';
750
+ this.isLogoutWhileApiGetsFailed = false;
750
751
  this.loadFromMap(data);
751
752
  }
752
753
  TechlifyConfig.prototype.loadFromMap = function (data) {
@@ -757,6 +758,7 @@
757
758
  this.apiUrl = data.apiUrl;
758
759
  this.storage = data === null || data === void 0 ? void 0 : data.storage;
759
760
  this.rawConfigs = data;
761
+ this.isLogoutWhileApiGetsFailed = data === null || data === void 0 ? void 0 : data.isLogoutWhileApiGetsFailed;
760
762
  };
761
763
  return TechlifyConfig;
762
764
  }());
@@ -939,7 +941,7 @@
939
941
  };
940
942
  // Customize the default error handler here if needed
941
943
  ErrorHandlerInterceptor.prototype.handleError = function (error) {
942
- var _a, _b;
944
+ var _a, _b, _c;
943
945
  var errorMessage = '';
944
946
  if (error.error instanceof ErrorEvent) {
945
947
  // client-side error
@@ -949,6 +951,11 @@
949
951
  // server-side error
950
952
  errorMessage = "Server Error: " + ((_b = this.configService) === null || _b === void 0 ? void 0 : _b.getProjectKey());
951
953
  try {
954
+ if (error.status == 403 && ((_c = this.configService.getConfigsRaw()) === null || _c === void 0 ? void 0 : _c.isLogoutWhileApiGetsFailed)) {
955
+ sessionStorage.clear();
956
+ localStorage.clear();
957
+ location.reload();
958
+ }
952
959
  this.errorHandler.handleError(error, 'Unexpected Server Error, try later or contact service team');
953
960
  }
954
961
  catch (e) {
@@ -1391,9 +1398,13 @@
1391
1398
  EntityFileService.prototype.deleteEntityFile = function (model) {
1392
1399
  return this.http.delete("api/entity-files/" + model.id).toPromise();
1393
1400
  };
1394
- EntityFileService.prototype.uploadEntityFile = function (file) {
1401
+ EntityFileService.prototype.uploadEntityFile = function (file, params) {
1395
1402
  var formData = new FormData();
1396
1403
  formData.append("fileData", file, file.name);
1404
+ if (params === null || params === void 0 ? void 0 : params.entity_id) {
1405
+ formData.append('entity_id', params.entity_id);
1406
+ formData.append('entity_type', params.entity_type);
1407
+ }
1397
1408
  return this.http
1398
1409
  .skipHeader()
1399
1410
  .post("api/entity-files-upload", formData).toPromise();
@@ -1459,7 +1470,8 @@
1459
1470
  entity_type: [''],
1460
1471
  entity_id: [],
1461
1472
  file: ['', forms.Validators.required],
1462
- url: ['', forms.Validators.required]
1473
+ url: ['', forms.Validators.required],
1474
+ file_size: ['', forms.Validators.required],
1463
1475
  });
1464
1476
  };
1465
1477
  EntityFileFormComponent.prototype.ngOnInit = function () {
@@ -1538,12 +1550,8 @@
1538
1550
  return [4 /*yield*/, this.entityFileService.uploadEntityFile(this.fileList[0])];
1539
1551
  case 1:
1540
1552
  result = _c.sent();
1541
- this.entityFileGroup
1542
- .get("file")
1543
- .setValue(result.item.file);
1544
- this.entityFileGroup
1545
- .get("url")
1546
- .setValue(result.item.url);
1553
+ this.entityFileGroup.patchValue(result.item);
1554
+ ;
1547
1555
  this.fileList = [];
1548
1556
  _c.label = 2;
1549
1557
  case 2: return [2 /*return*/];
@@ -1582,7 +1590,7 @@
1582
1590
  EntityFileFormComponent.decorators = [
1583
1591
  { type: i0.Component, args: [{
1584
1592
  selector: 'entity-file-form',
1585
- template: "<form [formGroup]=\"entityFileGroup\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Entity File</div>\n </div>\n\n <div mat-dialog-content fxLayout=\"column\" fxLayoutAlign.=\"start\">\n <ng-container *ngIf=\"!hideTitleAndDetails\">\n <mat-form-field>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n </ng-container>\n\n <ng-template #fileUpload>\n <section fxFlex=\"100%\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n\n\n <div fxFlex=\"100%\" class=\"mt-2\" *ngIf=\"entityFileGroup.get('url').value;else fileUpload;\">\n <app-document-viewer [file]=\"entityFileGroup.get('file').value\"\n [fileUrl]=\"entityFileGroup.get('url').value\" [config]=\"this.viewerConfig\" (remove)=\"removeFile()\"\n [disableEdit]=\"updateMode\">\n </app-document-viewer>\n\n </div>\n\n <div class=\"mt-4 mb-2\" fxLayout=\"row\" fxLayoutGap=\"30px\" fxLayoutAlign=\"end\" fxFlex=\"100%\">\n <button mat-raised-button type=\"button\" (click)=\"dialogRef.close()\">\n Cancel\n </button>\n <button mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n </div>\n </div>\n </div>\n</form>",
1593
+ template: "<form [formGroup]=\"entityFileGroup\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Entity File</div>\n </div>\n <div mat-dialog-content fxLayout=\"column\" fxLayoutAlign.=\"start\">\n <ng-container *ngIf=\"!hideTitleAndDetails\">\n <mat-form-field>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n </ng-container>\n <ng-template #fileUpload>\n <section fxFlex=\"100%\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n <div fxFlex=\"100%\" class=\"mt-2\" *ngIf=\"entityFileGroup.get('url').value;else fileUpload;\">\n <app-document-viewer [file]=\"entityFileGroup.get('file').value\" [fileUrl]=\"entityFileGroup.get('url').value\"\n [config]=\"this.viewerConfig\" (remove)=\"removeFile()\" [disableEdit]=\"updateMode\">\n </app-document-viewer>\n </div>\n <div class=\"mt-4 mb-2\" fxLayout=\"row\" fxLayoutGap=\"30px\" fxLayoutAlign=\"end\" fxFlex=\"100%\">\n <button mat-raised-button type=\"button\" (click)=\"dialogRef.close()\">\n Cancel\n </button>\n <button mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n </div>\n </div>\n </div>\n</form>\n",
1586
1594
  styles: [""]
1587
1595
  },] }
1588
1596
  ];
@@ -1602,17 +1610,37 @@
1602
1610
  this.alertService = alertService;
1603
1611
  this.dialog = dialog;
1604
1612
  this.viewOnly = false;
1613
+ this.title = "File";
1605
1614
  this.filters = {};
1606
1615
  this.entityFiles = [];
1607
- this.displayedColumns = ['index', 'title', 'details', 'file',];
1616
+ this.displayedColumns = [
1617
+ 'index',
1618
+ 'title',
1619
+ 'details',
1620
+ 'file_size',
1621
+ 'uploaded_on',
1622
+ ];
1608
1623
  this.isWorking = false;
1609
1624
  this.search = new forms.FormControl('');
1610
1625
  this.page = 1;
1611
1626
  this.perPage = 25;
1612
1627
  this.lastPage = 0;
1628
+ this.fileList = [];
1613
1629
  }
1614
1630
  EntityFilesViewAllComponent.prototype.ngOnInit = function () {
1615
1631
  var _this = this;
1632
+ //File dropper config
1633
+ this.fileConfig = {
1634
+ fileId: "entityDashboardDropper",
1635
+ containerId: "entityDashboardDropperContainer",
1636
+ styles: {
1637
+ height: "500px"
1638
+ },
1639
+ multiple: false,
1640
+ acceptFile: "*",
1641
+ maxSize: 10,
1642
+ acceptFileText: "All Files"
1643
+ };
1616
1644
  this.viewerConfig = {
1617
1645
  imageStyle: {
1618
1646
  height: '200px',
@@ -1648,6 +1676,7 @@
1648
1676
  switch (_a.label) {
1649
1677
  case 0:
1650
1678
  this.filters.page = this.page;
1679
+ this.filters.perPage = this.perPage;
1651
1680
  this.isWorking = true;
1652
1681
  return [4 /*yield*/, this.entityFileService.getEntityFiles(this.filters)];
1653
1682
  case 1:
@@ -1743,12 +1772,42 @@
1743
1772
  EntityFilesViewAllComponent.prototype.resetFieldValue = function () {
1744
1773
  this.search.setValue("");
1745
1774
  };
1775
+ EntityFilesViewAllComponent.prototype.sizeOf = function (bytes) {
1776
+ if (!bytes) {
1777
+ return "0.00 B";
1778
+ }
1779
+ var e = Math.floor(Math.log(bytes) / Math.log(1024));
1780
+ return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';
1781
+ };
1782
+ EntityFilesViewAllComponent.prototype.fileChanged = function (event) {
1783
+ return __awaiter(this, void 0, void 0, function () {
1784
+ var result;
1785
+ return __generator(this, function (_a) {
1786
+ switch (_a.label) {
1787
+ case 0:
1788
+ this.fileList = event;
1789
+ if (!(this.fileList.length > 0)) return [3 /*break*/, 2];
1790
+ return [4 /*yield*/, this.entityFileService.uploadEntityFile(this.fileList[0], {
1791
+ entity_type: this.entityType,
1792
+ entity_id: this.entityId,
1793
+ })];
1794
+ case 1:
1795
+ result = _a.sent();
1796
+ this.fileList = [];
1797
+ this.alertService.addAlert('Successfull uploaded', 'success');
1798
+ this.reload();
1799
+ _a.label = 2;
1800
+ case 2: return [2 /*return*/];
1801
+ }
1802
+ });
1803
+ });
1804
+ };
1746
1805
  return EntityFilesViewAllComponent;
1747
1806
  }());
1748
1807
  exports.ɵo.decorators = [
1749
1808
  { type: i0.Component, args: [{
1750
1809
  selector: 'app-entity-files-view-all',
1751
- template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"!displayMode\">\n <div fxLayout=\"column\" fxLayoutGap=\"0.25rem\">\n <h3 class=\"font-weight-bold\" fxLayoutAlign=\"center center\"> Files\n <button type=\"button\" class=\"mx-1\" mat-mini-fab color=\"primary\" (click)=\"addEntityFile()\" *ngIf=\"!viewOnly\">\n <mat-icon>add</mat-icon>\n </button>\n </h3>\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"start\" *ngIf=\"!removeSearch\">\n <mat-form-field class=\"mt-1\">\n <input type=\"text\" matInput [formControl]=\"search\" placeholder=\"Title\" name=\"title\"\n autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button (click)=\"resetFieldValue()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n <table mat-table [dataSource]=\"entityFiles\" class=\"w-100\" matSort multiTemplateDataRows\n infiniteScrollContainer=\"body\" infiniteScroll [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\"\n [fromRoot]=\"true\" (scrolled)=\"onScroll()\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.title}} </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.details}} </td>\n </ng-container>\n\n <!-- File Column -->\n <ng-container matColumnDef=\"file\">\n <th mat-header-cell *matHeaderCellDef> File </th>\n <td mat-cell *matCellDef=\"let element\">\n <a href=\"{{element.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\">\n <button type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n</div>\n\n<div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\"\n [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n\n</div>",
1810
+ template: "<div class=\"mat-typography\" *ngIf=\"!displayMode\">\n <div fxLayout=\"row\" fxLayoutGap=\"1rem\">\n <mat-card fxFlex=\"70%\">\n <mat-card-title fxLayout fxLayoutGap=\"1rem\">\n <h3 class=\"font-weight-bold primary-color\" fxLayout=\"center center\">\n <mat-icon>\n <span class=\"material-icons\">\n description\n </span>\n </mat-icon>\n {{title}}s\n </h3>\n <div>\n <button type=\"button\" class=\"mx-1\" mat-raised-button color=\"primary\" (click)=\"addEntityFile()\"\n *ngIf=\"!viewOnly\">\n <mat-icon>\n <span class=\"material-icons\">\n add_circle_outline\n </span>\n </mat-icon>\n {{title}}\n </button>\n </div>\n <mat-form-field *ngIf=\"!removeSearch\" appearance=\"outline\" style=\"font-size: 10px;\">\n <mat-label>Search</mat-label>\n <input type=\"text\" matInput [formControl]=\"search\" placeholder=\"Search\" name=\"title\" autocomplete=\"off\" />\n <button mat-button *ngIf=\"filters.title\" matSuffix mat-icon-button (click)=\"resetFieldValue()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </mat-card-title>\n <mat-card-content class=\"entity-file-card\">\n <table mat-table [dataSource]=\"entityFiles\" class=\"w-100\" matSort multiTemplateDataRows infiniteScroll\n [infiniteScrollDistance]=\"1.5\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n <span>\n {{element.title}}\n </span>\n <span>\n <a href=\"{{element.url}}\" target=\"_blank\" class=\"text-decoration-none text-muted\">\n <button mat-icon-button type=\"button\">\n <mat-icon>download</mat-icon>\n </button>\n </a>\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Details Column -->\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef> Details </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.details}} </td>\n </ng-container>\n\n <!-- File size Column -->\n <ng-container matColumnDef=\"file_size\">\n <th mat-header-cell *matHeaderCellDef> File Size </th>\n <td mat-cell *matCellDef=\"let element\"> {{ sizeOf(element.file_size)}} </td>\n </ng-container>\n\n <!-- Uploaded On Column -->\n <ng-container matColumnDef=\"uploaded_on\">\n <th mat-header-cell *matHeaderCellDef> Uploaded On </th>\n <td mat-cell *matCellDef=\"let element\">\n <div>\n {{element.created_at | date: 'mediumDate'}}\n </div>\n <div class=\"text-muted\">\n By {{element.creator?.name}}\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\" style=\"min-width:110px\" class=\"text-muted\">\n <button type=\"button\" mat-icon-button (click)=\"editEntityFile(element)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"deleteEntityFile(element)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </mat-card-content>\n </mat-card>\n <section fxFlex=\"30%\">\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </section>\n </div>\n</div>\n\n<div fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" class=\"mat-typography p-4\" *ngIf=\"displayMode\">\n <div *ngFor=\"let efile of entityFiles\">\n <app-document-viewer [file]=\"efile.file\" [fileUrl]=\"efile.url\" [config]=\"this.viewerConfig\" [disableEdit]=\"true\">\n </app-document-viewer>\n <a href=\"{{efile.url}}\" target=\"_blank\">\n <button mat-button type=\"button\">View</button>\n </a>\n </div>\n</div>\n",
1752
1811
  styles: [""]
1753
1812
  },] }
1754
1813
  ];
@@ -1764,7 +1823,8 @@
1764
1823
  viewOnly: [{ type: i0.Input }],
1765
1824
  removeSearch: [{ type: i0.Input }],
1766
1825
  hideTitleAndDetails: [{ type: i0.Input }],
1767
- displayMode: [{ type: i0.Input }]
1826
+ displayMode: [{ type: i0.Input }],
1827
+ title: [{ type: i0.Input }]
1768
1828
  };
1769
1829
  exports.ɵo = __decorate([
1770
1830
  untilDestroy.UntilDestroy()
@@ -3514,7 +3574,8 @@
3514
3574
  chips.MatChipsModule,
3515
3575
  datepicker.MatDatepickerModule,
3516
3576
  list.MatListModule,
3517
- tooltip.MatTooltipModule
3577
+ tooltip.MatTooltipModule,
3578
+ buttonToggle.MatButtonToggleModule
3518
3579
  ]
3519
3580
  },] }
3520
3581
  ];
@@ -8051,21 +8112,16 @@
8051
8112
  exports.ɵbt = UpdateViewModule;
8052
8113
  exports.ɵbu = UpdateViewComponent;
8053
8114
  exports.ɵbv = DataManager;
8054
- exports.ɵbw = AlertService;
8055
- exports.ɵbx = ErrorHandlerService;
8056
- exports.ɵby = FieldMappingComponent;
8057
- exports.ɵbz = FailedItemsListComponent;
8115
+ exports.ɵbw = ErrorHandlerService;
8116
+ exports.ɵbx = FieldMappingComponent;
8117
+ exports.ɵby = FailedItemsListComponent;
8118
+ exports.ɵbz = ImportHistoryListComponent;
8058
8119
  exports.ɵc = ErrorSnackComponent;
8059
- exports.ɵca = ImportHistoryListComponent;
8060
- exports.ɵcb = HttpService;
8061
- exports.ɵcc = ImportSuccessComponent;
8062
- exports.ɵcd = DataImportComponent;
8063
- exports.ɵce = ErrorHandlerService;
8064
- exports.ɵcf = StorageService;
8065
- exports.ɵcg = TechlifyFeatureService;
8066
- exports.ɵch = DataManager;
8067
- exports.ɵci = AuthenticationGuard;
8068
- exports.ɵcj = OnOffSwitchComponent;
8120
+ exports.ɵca = ImportSuccessComponent;
8121
+ exports.ɵcb = DataImportComponent;
8122
+ exports.ɵcc = StorageService;
8123
+ exports.ɵcd = TechlifyFeatureService;
8124
+ exports.ɵce = OnOffSwitchComponent;
8069
8125
  exports.ɵd = HTTP_DYNAMIC_INTERCEPTORS;
8070
8126
  exports.ɵe = HttpService;
8071
8127
  exports.ɵf = RouteReusableStrategy;