ngx-techlify-core 11.3.4 → 11.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/ngx-techlify-core.umd.js +646 -104
- package/bundles/ngx-techlify-core.umd.js.map +1 -1
- package/bundles/ngx-techlify-core.umd.min.js +2 -2
- package/bundles/ngx-techlify-core.umd.min.js.map +1 -1
- package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.component.js +2 -2
- package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.component.js +2 -2
- package/esm2015/lib/login-history-for-user/login-history-for-user.component.js +11 -2
- package/esm2015/lib/note/index.js +2 -1
- package/esm2015/lib/note/note-list/note-list.component.js +2 -2
- package/esm2015/lib/techlify-feature/on-off-switch/on-off-switch.component.js +27 -0
- package/esm2015/lib/techlify-feature/techlify-feature-enabled.directive.js +77 -0
- package/esm2015/lib/techlify-feature/techlify-feature-listing.component.js +174 -0
- package/esm2015/lib/techlify-feature/techlify-feature.module.js +30 -0
- package/esm2015/lib/techlify-feature/techlify-feature.routing.js +12 -0
- package/esm2015/lib/techlify-feature/techlify-feature.service.js +28 -0
- package/esm2015/lib/timeline-filter/calculate-timeline.js +2 -2
- package/esm2015/lib/timeline-filter/timeline-filter.component.js +146 -16
- package/esm2015/ngx-techlify-core.js +4 -1
- package/esm2015/public-api.js +5 -1
- package/fesm2015/ngx-techlify-core.js +537 -88
- package/fesm2015/ngx-techlify-core.js.map +1 -1
- package/lib/login-history-for-user/login-history-for-user.component.d.ts +2 -0
- package/lib/note/index.d.ts +1 -0
- package/lib/techlify-feature/on-off-switch/on-off-switch.component.d.ts +9 -0
- package/lib/techlify-feature/techlify-feature-enabled.directive.d.ts +16 -0
- package/lib/techlify-feature/techlify-feature-listing.component.d.ts +34 -0
- package/lib/techlify-feature/techlify-feature.module.d.ts +2 -0
- package/lib/techlify-feature/techlify-feature.routing.d.ts +2 -0
- package/lib/techlify-feature/techlify-feature.service.d.ts +8 -0
- package/lib/timeline-filter/calculate-timeline.d.ts +5 -0
- package/lib/timeline-filter/timeline-filter.component.d.ts +47 -6
- package/ngx-techlify-core.d.ts +3 -0
- package/ngx-techlify-core.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -4,7 +4,7 @@ import { __decorate, __awaiter } from 'tslib';
|
|
|
4
4
|
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
5
5
|
import { MatSort, MatSortModule } from '@angular/material/sort';
|
|
6
6
|
import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
|
|
7
|
-
import { Location, CommonModule } from '@angular/common';
|
|
7
|
+
import { Location, DatePipe, CommonModule } from '@angular/common';
|
|
8
8
|
import { Validators, FormBuilder, FormControl, NgControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
9
9
|
import { HttpResponse, HttpClient, HttpHandler, HttpClientModule } from '@angular/common/http';
|
|
10
10
|
import { throwError, Observable, Subject, of, from, fromEvent } from 'rxjs';
|
|
@@ -38,6 +38,7 @@ import { diff, formatters } from 'jsondiffpatch';
|
|
|
38
38
|
import { ENTER, COMMA } from '@angular/cdk/keycodes';
|
|
39
39
|
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
40
40
|
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
41
|
+
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
41
42
|
|
|
42
43
|
class ActionPopup {
|
|
43
44
|
}
|
|
@@ -1725,7 +1726,7 @@ class NoteListComponent {
|
|
|
1725
1726
|
NoteListComponent.decorators = [
|
|
1726
1727
|
{ type: Component, args: [{
|
|
1727
1728
|
selector: 'app-note-list',
|
|
1728
|
-
template: "<div fxLayout=\"column\" fxLayoutGap=\"1.5rem\" class=\"m-4\" *ngIf=\"!commentsView\">\n\n
|
|
1729
|
+
template: "<div fxLayout=\"column\" fxLayoutGap=\"1.5rem\" class=\"m-4\" *ngIf=\"!commentsView\">\n\n <div fxLayout fxLayoutAlign=\"center center\" fxLayoutGap=\"1rem\">\n <h3 class=\"m-0 font-weight-bold mr-3\">{{labelText}}s</h3>\n <button class=\"d-print-none\" *ngIf=\"!readonly\" mat-raised-button color=\"primary\" type=\"button\" (click)=\"addNote()\">+\n Add</button>\n </div>\n\n <div class=\"w-100 scroll-container\" infiniteScroll [infiniteScrollDistance]=\"1\" [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\" [scrollWindow]=\"false\">\n <table mat-table [dataSource]=\"notes\" class=\"w-100\" multiTemplateDataRows>\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let note; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n\n <ng-container matColumnDef=\"note\">\n <th mat-header-cell *matHeaderCellDef> {{labelText}} </th>\n <td mat-cell *matCellDef=\"let note\">\n {{note?.note}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef class=\"d-print-none\"> Actions </th>\n <td mat-cell *matCellDef=\"let note\" class=\"d-print-none\">\n <button type=\"button\" mat-icon-button (click)=\"editNote(note)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"deleteNote(note)\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n\n</div>\n\n<div fxLayout=\"column\" fxLayoutGap=\"1.5rem\" *ngIf=\"commentsView\">\n <div fxLayout fxLayoutAlign=\"center center\" fxLayoutGap=\"1rem\">\n <h3 class=\"m-0 font-weight-bold mr-3\">{{labelText}}s</h3>\n </div>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"start\" fxFlex=\"100%\">\n <div class=\"w-100 scroll-container jumbotron\" infiniteScroll [infiniteScrollDistance]=\"1\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" [scrollWindow]=\"false\">\n <app-comment-form [commentData]=\"comment\" (action)=\"commentAction($event)\" *ngFor=\"let comment of notes\">\n </app-comment-form>\n <app-comment-form (action)=\"commentAction($event)\"></app-comment-form>\n </div>\n </div>\n</div>\n",
|
|
1729
1730
|
styles: [".scroll-container{max-height:400px;overflow-y:auto}"]
|
|
1730
1731
|
},] }
|
|
1731
1732
|
];
|
|
@@ -1741,6 +1742,76 @@ NoteListComponent.propDecorators = {
|
|
|
1741
1742
|
commentsView: [{ type: Input }]
|
|
1742
1743
|
};
|
|
1743
1744
|
|
|
1745
|
+
class CommentFormComponent {
|
|
1746
|
+
constructor(fb, credentialService) {
|
|
1747
|
+
this.fb = fb;
|
|
1748
|
+
this.credentialService = credentialService;
|
|
1749
|
+
this.action = new EventEmitter();
|
|
1750
|
+
this.createForm();
|
|
1751
|
+
}
|
|
1752
|
+
set commentData(data) {
|
|
1753
|
+
this.view = !!data;
|
|
1754
|
+
this._commentData = data;
|
|
1755
|
+
this.commentFormGroup.patchValue(data);
|
|
1756
|
+
}
|
|
1757
|
+
ngOnInit() { }
|
|
1758
|
+
get isLoggedIn() {
|
|
1759
|
+
return this.credentialService.isAuthenticated;
|
|
1760
|
+
}
|
|
1761
|
+
get currentUser() {
|
|
1762
|
+
return this.credentialService.credentials.user;
|
|
1763
|
+
}
|
|
1764
|
+
createForm() {
|
|
1765
|
+
//TODO: Finialize and add more validations.
|
|
1766
|
+
this.commentFormGroup = this.fb.group({
|
|
1767
|
+
id: [""],
|
|
1768
|
+
note: [""],
|
|
1769
|
+
model_type: [""],
|
|
1770
|
+
related_model_id: [""],
|
|
1771
|
+
});
|
|
1772
|
+
}
|
|
1773
|
+
submit() {
|
|
1774
|
+
if (this.commentFormGroup.get("note").value) {
|
|
1775
|
+
if (this._commentData) {
|
|
1776
|
+
this.view = !this.view;
|
|
1777
|
+
}
|
|
1778
|
+
this.action.emit({ type: "save", value: this.commentFormGroup.value });
|
|
1779
|
+
this.commentFormGroup.reset();
|
|
1780
|
+
}
|
|
1781
|
+
else if (this.commentFormGroup.get("id").value) {
|
|
1782
|
+
this.deleteComment();
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
hideEdit() {
|
|
1786
|
+
if (this.commentFormGroup.get("id").value) {
|
|
1787
|
+
this.view = !this.view;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
editComment() {
|
|
1791
|
+
this.view = !this.view;
|
|
1792
|
+
this.commentFormGroup.patchValue(this._commentData);
|
|
1793
|
+
}
|
|
1794
|
+
deleteComment() {
|
|
1795
|
+
this.action.emit({ type: "delete", value: this.commentFormGroup.value });
|
|
1796
|
+
}
|
|
1797
|
+
ngOnDestroy() { }
|
|
1798
|
+
}
|
|
1799
|
+
CommentFormComponent.decorators = [
|
|
1800
|
+
{ type: Component, args: [{
|
|
1801
|
+
selector: "app-comment-form",
|
|
1802
|
+
template: "<form (ngSubmit)=\"submit()\" [formGroup]=\"commentFormGroup\">\n <div fxLayout=\"column\" class=\"my-2\" [ngClass]=\"{ 'border border-primary shadow rounded ': view}\">\n <div *ngIf=\"!view\" fxLayout=\"column\">\n <mat-form-field appearance=\"outline\" style=\"background-color:white;\">\n <mat-label>Comment</mat-label>\n <textarea matInput rows=\"5\" placeholder=\"Add a comment...\" formControlName=\"note\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n\n <div fxLayout fxLayoutGap=\"1rem\" class=\"mt-2\">\n <span fxFlex></span>\n <button *ngIf=\"_commentData\" mat-button type=\"button\" (click)=\"view = !view\">\n Cancel\n </button>\n <button mat-raised-button color=\"primary\" type=\"submit\">\n {{ _commentData ? \"Update\" : \"Post comment\" }}\n </button>\n </div>\n </div>\n\n <div fxLayout=\"column\" *ngIf=\"view\" class=\"p-2 m-2\">\n <div fxLayout=\"row wrap\" fxLayoutGap=\".5rem\">\n <div fxFlex=\"20%\" fxLayoutAlign=\"start\">\n <button mat-icon-button type=\"button\" style=\"color:grey\">\n <mat-icon style=\"font-size:60px\">account_circle</mat-icon>\n </button>\n </div>\n <div fxFlex=\"75%\">\n <div fxLayout=\"column\" fxLayoutGap=\".5rem\">\n <div class=\"font-weight-bold\">{{ _commentData?.creator?.name }}</div>\n <div class=\"text-muted\">{{ _commentData.updated_at | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <app-read-more class=\"mt-2\" [text]=\"_commentData.note\"></app-read-more>\n <div fxLayout class=\"mt-1\" fxLayoutGap=\"1rem\" *ngIf=\"isLoggedIn && currentUser.id === _commentData.creator_id\">\n <a href=\"javascript:;\" (click)=\"editComment()\">\n Edit\n </a>\n <a href=\"javascript:;\" (click)=\"deleteComment()\">\n Delete\n </a>\n </div>\n </div>\n </div>\n</form>",
|
|
1803
|
+
styles: [":host ::ng-deep .mat-form-field-wrapper{margin:0!important;padding-bottom:0!important}"]
|
|
1804
|
+
},] }
|
|
1805
|
+
];
|
|
1806
|
+
CommentFormComponent.ctorParameters = () => [
|
|
1807
|
+
{ type: FormBuilder },
|
|
1808
|
+
{ type: CredentialsService }
|
|
1809
|
+
];
|
|
1810
|
+
CommentFormComponent.propDecorators = {
|
|
1811
|
+
commentData: [{ type: Input }],
|
|
1812
|
+
action: [{ type: Output }]
|
|
1813
|
+
};
|
|
1814
|
+
|
|
1744
1815
|
var SearchableSelectorComponent_1;
|
|
1745
1816
|
let SearchableSelectorComponent = SearchableSelectorComponent_1 = class SearchableSelectorComponent {
|
|
1746
1817
|
constructor(formBuilder, _focusMonitor, http, _elementRef, dialog, ngControl) {
|
|
@@ -2219,7 +2290,7 @@ function calculateTimeline(value) {
|
|
|
2219
2290
|
}
|
|
2220
2291
|
case 4: { // This Week
|
|
2221
2292
|
var first = date.getDate() - date.getDay() + 1; // First day is the day of the month - the day of the week
|
|
2222
|
-
var last = first + 6; // last day is the first day + 6
|
|
2293
|
+
var last = first + 6; // last day is the first day + 6
|
|
2223
2294
|
data.date_from = new Date(date.setDate(first));
|
|
2224
2295
|
data.date_to = new Date(date.setDate(last));
|
|
2225
2296
|
break;
|
|
@@ -2298,8 +2369,11 @@ Timeline.THIS_YEAR = 10;
|
|
|
2298
2369
|
Timeline.LAST_YEAR = 11;
|
|
2299
2370
|
Timeline.ALL = 12;
|
|
2300
2371
|
|
|
2301
|
-
|
|
2302
|
-
|
|
2372
|
+
var TimelineFilterComponent_1;
|
|
2373
|
+
let TimelineFilterComponent = TimelineFilterComponent_1 = class TimelineFilterComponent {
|
|
2374
|
+
constructor(formBuilder, ngControl, datePipe) {
|
|
2375
|
+
this.ngControl = ngControl;
|
|
2376
|
+
this.datePipe = datePipe;
|
|
2303
2377
|
this.timelineValue = new FormControl('');
|
|
2304
2378
|
this.timelines = [
|
|
2305
2379
|
{ value: 1, viewValue: 'Custom' },
|
|
@@ -2315,20 +2389,73 @@ let TimelineFilterComponent = class TimelineFilterComponent {
|
|
|
2315
2389
|
{ value: 11, viewValue: 'Last Year' },
|
|
2316
2390
|
{ value: 12, viewValue: 'All dates' },
|
|
2317
2391
|
];
|
|
2318
|
-
this.labelText = 'Select Timeline';
|
|
2319
2392
|
this.dateFrom = 'date_from';
|
|
2320
2393
|
this.dateTo = 'date_to';
|
|
2321
2394
|
this.appearance = "legacy";
|
|
2322
2395
|
this.showClearbutton = false;
|
|
2396
|
+
/**
|
|
2397
|
+
* @deprecated The form input is deprated
|
|
2398
|
+
*/
|
|
2399
|
+
this.form = null;
|
|
2400
|
+
this.labelText = 'Select Timeline';
|
|
2401
|
+
this.touchUi = true;
|
|
2402
|
+
this.selectedValueChange = new EventEmitter();
|
|
2403
|
+
this.selectionChange = new EventEmitter();
|
|
2404
|
+
this.onChange = () => { };
|
|
2405
|
+
this.onTouched = () => { };
|
|
2406
|
+
this.stateChanges = new Subject();
|
|
2407
|
+
this.controlType = 'timeline-filter';
|
|
2408
|
+
this.id = `timeline-filter-${TimelineFilterComponent_1.nextId++}`;
|
|
2409
|
+
this.describedBy = '';
|
|
2323
2410
|
this.showCustomDateFields = false;
|
|
2411
|
+
this._required = false;
|
|
2412
|
+
this._disabled = false;
|
|
2413
|
+
this.selectorForm = formBuilder.group({
|
|
2414
|
+
select_value: [null],
|
|
2415
|
+
});
|
|
2416
|
+
if (this.ngControl != null) {
|
|
2417
|
+
this.ngControl.valueAccessor = this;
|
|
2418
|
+
}
|
|
2324
2419
|
}
|
|
2325
2420
|
set defaultValue(value) {
|
|
2326
2421
|
this.timelineValue.setValue(value);
|
|
2327
2422
|
this.changeTimeline(value);
|
|
2328
2423
|
}
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2424
|
+
get required() { return this._required; }
|
|
2425
|
+
set required(value) {
|
|
2426
|
+
this.selectorForm.get('select_value').setValidators(Validators.required);
|
|
2427
|
+
this._required = coerceBooleanProperty(value);
|
|
2428
|
+
this.stateChanges.next();
|
|
2429
|
+
}
|
|
2430
|
+
get disabled() { return this._disabled; }
|
|
2431
|
+
set disabled(value) {
|
|
2432
|
+
this._disabled = coerceBooleanProperty(value);
|
|
2433
|
+
this._disabled ? this.selectorForm.disable() : this.selectorForm.enable();
|
|
2434
|
+
this.stateChanges.next();
|
|
2435
|
+
}
|
|
2436
|
+
get value() {
|
|
2437
|
+
if (this.selectorForm.valid) {
|
|
2438
|
+
return this.selectorForm.value.select_value;
|
|
2439
|
+
}
|
|
2440
|
+
return '';
|
|
2441
|
+
}
|
|
2442
|
+
set value(data) {
|
|
2443
|
+
this.selectorForm.patchValue({ select_value: data || '' });
|
|
2444
|
+
this._handleInput();
|
|
2445
|
+
this.stateChanges.next();
|
|
2446
|
+
}
|
|
2447
|
+
getDateRangeString() {
|
|
2448
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
2449
|
+
let str = "";
|
|
2450
|
+
if ((_a = this.selectedRange) === null || _a === void 0 ? void 0 : _a.show_custom_field) {
|
|
2451
|
+
if (((_b = this.selectedRange) === null || _b === void 0 ? void 0 : _b.date_from.toUTCString()) != 'Invalid Date') {
|
|
2452
|
+
str += ' - ' + this.datePipe.transform((_d = (_c = this.selectedRange) === null || _c === void 0 ? void 0 : _c.date_from) === null || _d === void 0 ? void 0 : _d.toUTCString());
|
|
2453
|
+
}
|
|
2454
|
+
if (((_e = this.selectedRange) === null || _e === void 0 ? void 0 : _e.date_to.toUTCString()) != 'Invalid Date') {
|
|
2455
|
+
str += ' - ' + this.datePipe.transform((_g = (_f = this.selectedRange) === null || _f === void 0 ? void 0 : _f.date_to) === null || _g === void 0 ? void 0 : _g.toUTCString());
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
return str;
|
|
2332
2459
|
}
|
|
2333
2460
|
resetFieldValue(field) {
|
|
2334
2461
|
this.form.get(field).setValue('');
|
|
@@ -2347,27 +2474,97 @@ let TimelineFilterComponent = class TimelineFilterComponent {
|
|
|
2347
2474
|
this.showCustomDateFields = timeline.show_custom_field;
|
|
2348
2475
|
}
|
|
2349
2476
|
}
|
|
2477
|
+
_handleInput() {
|
|
2478
|
+
if (this.value == 1) {
|
|
2479
|
+
this.picker.open();
|
|
2480
|
+
return;
|
|
2481
|
+
}
|
|
2482
|
+
const range = calculateTimeline(this.value);
|
|
2483
|
+
this.selectedRange = range;
|
|
2484
|
+
this.onChange(this.value);
|
|
2485
|
+
this.selectedValueChange.emit(this.selectedValue);
|
|
2486
|
+
this.selectionChange.emit(range);
|
|
2487
|
+
}
|
|
2488
|
+
dateRangeChange(dateRangeStart, dateRangeEnd) {
|
|
2489
|
+
const range = {
|
|
2490
|
+
date_from: new Date(dateRangeStart.value),
|
|
2491
|
+
date_to: new Date(dateRangeEnd.value),
|
|
2492
|
+
show_custom_field: true
|
|
2493
|
+
};
|
|
2494
|
+
this.selectedRange = range;
|
|
2495
|
+
this.onChange(this.value);
|
|
2496
|
+
this.selectedValueChange.emit(this.selectedValue);
|
|
2497
|
+
this.selectionChange.emit(range);
|
|
2498
|
+
}
|
|
2499
|
+
onCustomDateChange(event) {
|
|
2500
|
+
console.log(event);
|
|
2501
|
+
}
|
|
2502
|
+
setDescribedByIds(ids) {
|
|
2503
|
+
this.describedBy = ids.join(' ');
|
|
2504
|
+
}
|
|
2505
|
+
onContainerClick(event) {
|
|
2506
|
+
event.stopPropagation();
|
|
2507
|
+
}
|
|
2508
|
+
writeValue(data) {
|
|
2509
|
+
this.value = data;
|
|
2510
|
+
}
|
|
2511
|
+
registerOnChange(fn) {
|
|
2512
|
+
this.onChange = fn;
|
|
2513
|
+
}
|
|
2514
|
+
registerOnTouched(fn) {
|
|
2515
|
+
this.onTouched = fn;
|
|
2516
|
+
}
|
|
2517
|
+
setDisabledState(isDisabled) {
|
|
2518
|
+
this.disabled = isDisabled;
|
|
2519
|
+
}
|
|
2520
|
+
ngOnInit() {
|
|
2521
|
+
console.log(this.form);
|
|
2522
|
+
this.timelineValue.valueChanges.
|
|
2523
|
+
pipe(debounceTime(100), distinctUntilChanged(), untilDestroyed(this)).subscribe(value => this.changeTimeline(value));
|
|
2524
|
+
}
|
|
2525
|
+
ngOnDestroy() {
|
|
2526
|
+
this.stateChanges.complete();
|
|
2527
|
+
}
|
|
2350
2528
|
};
|
|
2529
|
+
TimelineFilterComponent.nextId = 0;
|
|
2351
2530
|
TimelineFilterComponent.decorators = [
|
|
2352
2531
|
{ type: Component, args: [{
|
|
2353
2532
|
selector: 'app-timeline-filter',
|
|
2354
|
-
template: "<ng-container [formGroup]=\"form\">\n
|
|
2533
|
+
template: "<ng-container *ngIf=\"form\" [formGroup]=\"form\">\n <mat-form-field [appearance]=\"appearance\">\n <mat-label>{{labelText}}</mat-label>\n <mat-select [formControl]=\"timelineValue\">\n <mat-option *ngFor=\"let timeline of timelines\" [value]=\"timeline.value\">\n {{timeline.viewValue}}\n </mat-option>\n </mat-select>\n <button mat-button *ngIf=\"showClearbutton && timelineValue.value\" matSuffix mat-icon-button\n (click)=\"timelineValue.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"showCustomDateFields\">\n <mat-form-field [appearance]=\"appearance\">\n <mat-label>From Date</mat-label>\n <input matInput formControlName=\"{{dateFrom}}\" [matDatepicker]=\"fromPicker\" (click)=\"fromPicker.open()\"\n placeholder=\"From Date\" readonly />\n <mat-datepicker-toggle matSuffix [for]=\"fromPicker\"></mat-datepicker-toggle>\n <mat-datepicker #fromPicker></mat-datepicker>\n <button mat-button *ngIf=\"getFieldValue(dateFrom)\" matSuffix mat-icon-button\n (click)=\"resetFieldValue(dateFrom)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field [appearance]=\"appearance\">\n <mat-label>To Date</mat-label>\n <input matInput formControlName=\"{{dateTo}}\" [matDatepicker]=\"toPicker\" (click)=\"toPicker.open()\"\n placeholder=\"To Date\" readonly />\n <mat-datepicker-toggle matSuffix [for]=\"\"></mat-datepicker-toggle>\n <mat-datepicker #toPicker></mat-datepicker>\n <button mat-button *ngIf=\"getFieldValue(dateTo)\" matSuffix mat-icon-button\n (click)=\"resetFieldValue(dateTo)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n </ng-container>\n</ng-container>\n<div *ngIf=\"!form\" [formGroup]=\"selectorForm\">\n <mat-select formControlName=\"select_value\" focused=\"false\" [required]=\"required\"\n autocomplete=\"off\" (selectionChange)=\"_handleInput()\">\n <mat-option *ngFor=\"let timeline of timelines\" [value]=\"timeline?.value\">\n {{ timeline?.viewValue }} {{ selectedRange?.show_custom_field && timeline?.value == 1 ? getDateRangeString() : '' }}\n </mat-option>\n </mat-select>\n <mat-date-range-input hidden (dateChange)=\"onCustomDateChange($event)\" [rangePicker]=\"picker\">\n <input matStartDate #customStartDate>\n <input matEndDate (dateChange)=\"dateRangeChange(customStartDate, customEndDate)\" #customEndDate>\n </mat-date-range-input>\n <mat-date-range-picker #picker [touchUi]=\"touchUi\"></mat-date-range-picker>\n</div>\n",
|
|
2534
|
+
providers: [
|
|
2535
|
+
{
|
|
2536
|
+
provide: MatFormFieldControl,
|
|
2537
|
+
useExisting: TimelineFilterComponent_1
|
|
2538
|
+
}
|
|
2539
|
+
],
|
|
2355
2540
|
styles: [""]
|
|
2356
2541
|
},] }
|
|
2357
2542
|
];
|
|
2358
|
-
TimelineFilterComponent.ctorParameters = () => [
|
|
2543
|
+
TimelineFilterComponent.ctorParameters = () => [
|
|
2544
|
+
{ type: FormBuilder },
|
|
2545
|
+
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] },
|
|
2546
|
+
{ type: DatePipe }
|
|
2547
|
+
];
|
|
2359
2548
|
TimelineFilterComponent.propDecorators = {
|
|
2549
|
+
picker: [{ type: ViewChild, args: ['picker',] }],
|
|
2360
2550
|
timelineValue: [{ type: Input }],
|
|
2361
2551
|
timelines: [{ type: Input }],
|
|
2362
|
-
labelText: [{ type: Input }],
|
|
2363
2552
|
dateFrom: [{ type: Input }],
|
|
2364
2553
|
dateTo: [{ type: Input }],
|
|
2365
2554
|
appearance: [{ type: Input }],
|
|
2366
2555
|
showClearbutton: [{ type: Input }],
|
|
2367
2556
|
form: [{ type: Input }],
|
|
2368
|
-
|
|
2557
|
+
labelText: [{ type: Input }],
|
|
2558
|
+
selectedValue: [{ type: Input }],
|
|
2559
|
+
touchUi: [{ type: Input }],
|
|
2560
|
+
selectedValueChange: [{ type: Output }],
|
|
2561
|
+
selectionChange: [{ type: Output }],
|
|
2562
|
+
defaultValue: [{ type: Input }],
|
|
2563
|
+
required: [{ type: Input }],
|
|
2564
|
+
disabled: [{ type: Input }],
|
|
2565
|
+
value: [{ type: Input }]
|
|
2369
2566
|
};
|
|
2370
|
-
TimelineFilterComponent = __decorate([
|
|
2567
|
+
TimelineFilterComponent = TimelineFilterComponent_1 = __decorate([
|
|
2371
2568
|
UntilDestroy()
|
|
2372
2569
|
], TimelineFilterComponent);
|
|
2373
2570
|
|
|
@@ -2842,76 +3039,6 @@ EntityFilesViewAllModule.decorators = [
|
|
|
2842
3039
|
},] }
|
|
2843
3040
|
];
|
|
2844
3041
|
|
|
2845
|
-
class CommentFormComponent {
|
|
2846
|
-
constructor(fb, credentialService) {
|
|
2847
|
-
this.fb = fb;
|
|
2848
|
-
this.credentialService = credentialService;
|
|
2849
|
-
this.action = new EventEmitter();
|
|
2850
|
-
this.createForm();
|
|
2851
|
-
}
|
|
2852
|
-
set commentData(data) {
|
|
2853
|
-
this.view = !!data;
|
|
2854
|
-
this._commentData = data;
|
|
2855
|
-
this.commentFormGroup.patchValue(data);
|
|
2856
|
-
}
|
|
2857
|
-
ngOnInit() { }
|
|
2858
|
-
get isLoggedIn() {
|
|
2859
|
-
return this.credentialService.isAuthenticated;
|
|
2860
|
-
}
|
|
2861
|
-
get currentUser() {
|
|
2862
|
-
return this.credentialService.credentials.user;
|
|
2863
|
-
}
|
|
2864
|
-
createForm() {
|
|
2865
|
-
//TODO: Finialize and add more validations.
|
|
2866
|
-
this.commentFormGroup = this.fb.group({
|
|
2867
|
-
id: [""],
|
|
2868
|
-
note: [""],
|
|
2869
|
-
model_type: [""],
|
|
2870
|
-
related_model_id: [""],
|
|
2871
|
-
});
|
|
2872
|
-
}
|
|
2873
|
-
submit() {
|
|
2874
|
-
if (this.commentFormGroup.get("note").value) {
|
|
2875
|
-
if (this._commentData) {
|
|
2876
|
-
this.view = !this.view;
|
|
2877
|
-
}
|
|
2878
|
-
this.action.emit({ type: "save", value: this.commentFormGroup.value });
|
|
2879
|
-
this.commentFormGroup.reset();
|
|
2880
|
-
}
|
|
2881
|
-
else if (this.commentFormGroup.get("id").value) {
|
|
2882
|
-
this.deleteComment();
|
|
2883
|
-
}
|
|
2884
|
-
}
|
|
2885
|
-
hideEdit() {
|
|
2886
|
-
if (this.commentFormGroup.get("id").value) {
|
|
2887
|
-
this.view = !this.view;
|
|
2888
|
-
}
|
|
2889
|
-
}
|
|
2890
|
-
editComment() {
|
|
2891
|
-
this.view = !this.view;
|
|
2892
|
-
this.commentFormGroup.patchValue(this._commentData);
|
|
2893
|
-
}
|
|
2894
|
-
deleteComment() {
|
|
2895
|
-
this.action.emit({ type: "delete", value: this.commentFormGroup.value });
|
|
2896
|
-
}
|
|
2897
|
-
ngOnDestroy() { }
|
|
2898
|
-
}
|
|
2899
|
-
CommentFormComponent.decorators = [
|
|
2900
|
-
{ type: Component, args: [{
|
|
2901
|
-
selector: "app-comment-form",
|
|
2902
|
-
template: "<form (ngSubmit)=\"submit()\" [formGroup]=\"commentFormGroup\">\n <div fxLayout=\"column\" class=\"my-2\" [ngClass]=\"{ 'border border-primary shadow rounded ': view}\">\n <div *ngIf=\"!view\" fxLayout=\"column\">\n <mat-form-field appearance=\"outline\" style=\"background-color:white;\">\n <mat-label>Comment</mat-label>\n <textarea matInput rows=\"5\" placeholder=\"Add a comment...\" formControlName=\"note\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n\n <div fxLayout fxLayoutGap=\"1rem\" class=\"mt-2\">\n <span fxFlex></span>\n <button *ngIf=\"_commentData\" mat-button type=\"button\" (click)=\"view = !view\">\n Cancel\n </button>\n <button mat-raised-button color=\"primary\" type=\"submit\">\n {{ _commentData ? \"Update\" : \"Post comment\" }}\n </button>\n </div>\n </div>\n\n <div fxLayout=\"column\" *ngIf=\"view\" class=\"p-2 m-2\">\n <div fxLayout=\"row wrap\" fxLayoutGap=\".5rem\">\n <div fxFlex=\"20%\" fxLayoutAlign=\"start\">\n <button mat-icon-button type=\"button\" style=\"color:grey\">\n <mat-icon style=\"font-size:60px\">account_circle</mat-icon>\n </button>\n </div>\n <div fxFlex=\"75%\">\n <div fxLayout=\"column\" fxLayoutGap=\".5rem\">\n <div class=\"font-weight-bold\">{{ _commentData?.creator?.name }}</div>\n <div class=\"text-muted\">{{ _commentData.updated_at | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <app-read-more class=\"mt-2\" [text]=\"_commentData.note\"></app-read-more>\n <div fxLayout class=\"mt-1\" fxLayoutGap=\"1rem\" *ngIf=\"isLoggedIn && currentUser.id === _commentData.creator_id\">\n <a href=\"javascript:;\" (click)=\"editComment()\">\n Edit\n </a>\n <a href=\"javascript:;\" (click)=\"deleteComment()\">\n Delete\n </a>\n </div>\n </div>\n </div>\n</form>",
|
|
2903
|
-
styles: [":host ::ng-deep .mat-form-field-wrapper{margin:0!important;padding-bottom:0!important}"]
|
|
2904
|
-
},] }
|
|
2905
|
-
];
|
|
2906
|
-
CommentFormComponent.ctorParameters = () => [
|
|
2907
|
-
{ type: FormBuilder },
|
|
2908
|
-
{ type: CredentialsService }
|
|
2909
|
-
];
|
|
2910
|
-
CommentFormComponent.propDecorators = {
|
|
2911
|
-
commentData: [{ type: Input }],
|
|
2912
|
-
action: [{ type: Output }]
|
|
2913
|
-
};
|
|
2914
|
-
|
|
2915
3042
|
class ReadMoreComponent {
|
|
2916
3043
|
constructor() {
|
|
2917
3044
|
this.maxLength = 100;
|
|
@@ -3441,7 +3568,7 @@ let EmailSubscriptionUserListFilterComponent = class EmailSubscriptionUserListFi
|
|
|
3441
3568
|
EmailSubscriptionUserListFilterComponent.decorators = [
|
|
3442
3569
|
{ type: Component, args: [{
|
|
3443
3570
|
selector: 'app-email-subscription-user-list-filter',
|
|
3444
|
-
template: "<form [formGroup]=\"esUserFilterForm\" fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" fxLayoutAlign=\"start center\">\n <mat-form-field class=\"ml-3\">\n <mat-label>User</mat-label>\n <app-searchable-selector formControlName=\"user_id\" apiUrl=\"api/users\" titleField=\"name\">\n </app-searchable-selector>\n <button mat-button *ngIf=\"getFieldValue('user_id')\" matSuffix mat-icon-button\n (click)=\"resetFieldValue('user_id')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"ml-3\">\n <mat-label>Email Type</mat-label>\n <app-searchable-selector formControlName=\"email_type_id\" apiUrl=\"api/email-subscription-types\">\n </app-searchable-selector>\n <button mat-button *ngIf=\"getFieldValue('
|
|
3571
|
+
template: "<form [formGroup]=\"esUserFilterForm\" fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" fxLayoutAlign=\"start center\">\n <mat-form-field class=\"ml-3\">\n <mat-label>User</mat-label>\n <app-searchable-selector formControlName=\"user_id\" apiUrl=\"api/users\" titleField=\"name\">\n </app-searchable-selector>\n <button mat-button *ngIf=\"getFieldValue('user_id')\" matSuffix mat-icon-button\n (click)=\"resetFieldValue('user_id')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class=\"ml-3\">\n <mat-label>Email Type</mat-label>\n <app-searchable-selector formControlName=\"email_type_id\" apiUrl=\"api/email-subscription-types\">\n </app-searchable-selector>\n <button mat-button *ngIf=\"getFieldValue('email_type_id')\" matSuffix mat-icon-button\n (click)=\"resetFieldValue('email_type_id')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n</form>",
|
|
3445
3572
|
styles: [""]
|
|
3446
3573
|
},] }
|
|
3447
3574
|
];
|
|
@@ -3761,7 +3888,7 @@ let EmailSubscriptionTypeListComponent = class EmailSubscriptionTypeListComponen
|
|
|
3761
3888
|
EmailSubscriptionTypeListComponent.decorators = [
|
|
3762
3889
|
{ type: Component, args: [{
|
|
3763
3890
|
selector: 'app-email-subscription-type-list',
|
|
3764
|
-
template: "<div class=\"mat-typography m-4\">\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"start center\">\n <mat-form-field>\n <input matInput [formControl]=\"search\" placeholder=\"Email Type\" autocomplete=\"off\" />\n <button mat-button matSuffix mat-icon-button>\n <mat-icon>search</mat-icon>\n </button>\n <button mat-button *ngIf=\"search.value\" matSuffix mat-icon-button (click)=\"search.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <div class=\"ml-2\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"addEmailSubscriptionType()\">+ Email\n Type</button>\n </div>\n <span fxFlex></span>\n <mat-form-field appearance=\"outline\" class=\"no-padding\">\n <mat-label>Columns</mat-label>\n <mat-select [formControl]=\"displayColumns\" multiple (selectionChange)=\"columnsChange()\">\n <mat-option *ngFor=\"let column of availableDisplayColumns\" [value]=\"column.value\">{{column.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <section>\n <div class=\"scroll-container\" infiniteScroll [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\" [scrollWindow]=\"false\">\n <table mat-table [dataSource]=\"emailSubscriptionTypeList\" matSort class=\"w-100 mt-1\" multiTemplateDataRows\n id=\"email-subscription-type-table\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Title </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.title }} </td>\n </ng-container>\n <ng-container matColumnDef=\"code\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Code </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.code }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"frequency.title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>
|
|
3891
|
+
template: "<div class=\"mat-typography m-4\">\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"start center\">\n <mat-form-field>\n <input matInput [formControl]=\"search\" placeholder=\"Email Type\" autocomplete=\"off\" />\n <button mat-button matSuffix mat-icon-button>\n <mat-icon>search</mat-icon>\n </button>\n <button mat-button *ngIf=\"search.value\" matSuffix mat-icon-button (click)=\"search.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <div class=\"ml-2\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"addEmailSubscriptionType()\">+ Email\n Type</button>\n </div>\n <span fxFlex></span>\n <mat-form-field appearance=\"outline\" class=\"no-padding\">\n <mat-label>Columns</mat-label>\n <mat-select [formControl]=\"displayColumns\" multiple (selectionChange)=\"columnsChange()\">\n <mat-option *ngFor=\"let column of availableDisplayColumns\" [value]=\"column.value\">{{column.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <section>\n <div class=\"scroll-container\" infiniteScroll [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\" [scrollWindow]=\"false\">\n <table mat-table [dataSource]=\"emailSubscriptionTypeList\" matSort class=\"w-100 mt-1\" multiTemplateDataRows\n id=\"email-subscription-type-table\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Title </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.title }} </td>\n </ng-container>\n <ng-container matColumnDef=\"code\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Code </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.code }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"frequency.title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Frequency </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.frequency?.title }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef> Description </th>\n <td mat-cell *matCellDef=\"let emailSubscriptionType;\"> {{ emailSubscriptionType?.description }}\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 emailSubscriptionType\">\n <button type=\"button\" mat-icon-button\n (click)=\"deleteEmailSubscriptionType($event,emailSubscriptionType)\">\n <mat-icon>delete</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button\n (click)=\"editEmailSubscriptionType($event,emailSubscriptionType)\">\n <mat-icon>edit</mat-icon>\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky:true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </section>\n</div>",
|
|
3765
3892
|
styles: [".scroll-container{max-height:800px;overflow-y:auto}"]
|
|
3766
3893
|
},] }
|
|
3767
3894
|
];
|
|
@@ -5604,6 +5731,7 @@ let LoginHistoryForUserComponent = class LoginHistoryForUserComponent {
|
|
|
5604
5731
|
};
|
|
5605
5732
|
this.displayedColumns = ['index', 'created_at'];
|
|
5606
5733
|
this.historyFilterForm = this.fb.group({
|
|
5734
|
+
'duration': [''],
|
|
5607
5735
|
'date_from': [''],
|
|
5608
5736
|
'date_to': ['']
|
|
5609
5737
|
});
|
|
@@ -5619,6 +5747,14 @@ let LoginHistoryForUserComponent = class LoginHistoryForUserComponent {
|
|
|
5619
5747
|
});
|
|
5620
5748
|
this.initializeData();
|
|
5621
5749
|
}
|
|
5750
|
+
onTimelineChange(range) {
|
|
5751
|
+
let date_from = (range === null || range === void 0 ? void 0 : range.date_from) ? new Date(range.date_from) : '';
|
|
5752
|
+
let date_to = (range === null || range === void 0 ? void 0 : range.date_to) ? new Date(range.date_to) : '';
|
|
5753
|
+
this.historyFilterForm.patchValue({
|
|
5754
|
+
date_from,
|
|
5755
|
+
date_to
|
|
5756
|
+
});
|
|
5757
|
+
}
|
|
5622
5758
|
initializeData() {
|
|
5623
5759
|
this.http.get(`api/user-login-history`, { params: Object.assign(Object.assign({}, this.filters), this.pageEvent) })
|
|
5624
5760
|
.pipe(untilDestroyed(this))
|
|
@@ -5650,7 +5786,7 @@ let LoginHistoryForUserComponent = class LoginHistoryForUserComponent {
|
|
|
5650
5786
|
LoginHistoryForUserComponent.decorators = [
|
|
5651
5787
|
{ type: Component, args: [{
|
|
5652
5788
|
selector: 'app-login-history-for-user',
|
|
5653
|
-
template: "<div class=\"mat-typography m-4\">\n <form fxLayoutAlign=\" start center\">\n <app-timeline-filter
|
|
5789
|
+
template: "<div class=\"mat-typography m-4\">\n <form [formGroup]=\"historyFilterForm\" fxLayoutAlign=\" start center\">\n <app-timeline-filter formControlName=\"duration\" (selectionChange)=\"onTimelineChange($event)\"></app-timeline-filter>\n </form>\n\n <section>\n <div class=\"scroll-container\" infiniteScroll [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\" [scrollWindow]=\"false\">\n <table mat-table [dataSource]=\"loginHistoryList\" matSort class=\"w-100 mt-1\" multiTemplateDataRows\n id=\"login-history-table\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let loginHistory; let i = dataIndex\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"created_at\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Last Login</th>\n <td mat-cell *matCellDef=\"let loginHistory;\">\n {{loginHistory?.created_at | date:'medium' }}\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\n </section>\n</div>\n",
|
|
5654
5790
|
styles: [".scroll-container{max-height:800px;overflow-y:auto}"]
|
|
5655
5791
|
},] }
|
|
5656
5792
|
];
|
|
@@ -6166,6 +6302,319 @@ TechlifyTaggerTagSelectorModule.decorators = [
|
|
|
6166
6302
|
},] }
|
|
6167
6303
|
];
|
|
6168
6304
|
|
|
6305
|
+
class TechlifyFeatureService {
|
|
6306
|
+
constructor(dataManager) {
|
|
6307
|
+
this.dataManager = dataManager;
|
|
6308
|
+
}
|
|
6309
|
+
getFeatures() {
|
|
6310
|
+
return this.dataManager.GET(`api/features`);
|
|
6311
|
+
}
|
|
6312
|
+
disableFeature(id) {
|
|
6313
|
+
return this.dataManager.GET(`api/feature/${id}/disable`);
|
|
6314
|
+
}
|
|
6315
|
+
enableFeature(id) {
|
|
6316
|
+
return this.dataManager.GET(`api/feature/${id}/enable`);
|
|
6317
|
+
}
|
|
6318
|
+
}
|
|
6319
|
+
TechlifyFeatureService.ɵprov = ɵɵdefineInjectable({ factory: function TechlifyFeatureService_Factory() { return new TechlifyFeatureService(ɵɵinject(DataManager)); }, token: TechlifyFeatureService, providedIn: "root" });
|
|
6320
|
+
TechlifyFeatureService.decorators = [
|
|
6321
|
+
{ type: Injectable, args: [{
|
|
6322
|
+
providedIn: 'root'
|
|
6323
|
+
},] }
|
|
6324
|
+
];
|
|
6325
|
+
TechlifyFeatureService.ctorParameters = () => [
|
|
6326
|
+
{ type: DataManager }
|
|
6327
|
+
];
|
|
6328
|
+
|
|
6329
|
+
let TechlifyFeatureListingComponent = class TechlifyFeatureListingComponent {
|
|
6330
|
+
constructor(dataManager, errorHandler, fb, alertService, dialog, storage, featureService) {
|
|
6331
|
+
this.dataManager = dataManager;
|
|
6332
|
+
this.errorHandler = errorHandler;
|
|
6333
|
+
this.fb = fb;
|
|
6334
|
+
this.alertService = alertService;
|
|
6335
|
+
this.dialog = dialog;
|
|
6336
|
+
this.storage = storage;
|
|
6337
|
+
this.featureService = featureService;
|
|
6338
|
+
this.features = [];
|
|
6339
|
+
this.displayedColumns = [
|
|
6340
|
+
'index',
|
|
6341
|
+
'feature',
|
|
6342
|
+
'description',
|
|
6343
|
+
'actions',
|
|
6344
|
+
];
|
|
6345
|
+
this.dataSource = new MatTableDataSource();
|
|
6346
|
+
this.page = 1;
|
|
6347
|
+
this.perPage = 25;
|
|
6348
|
+
this.isWorking = false;
|
|
6349
|
+
this.filterFormGroup = this.fb.group({
|
|
6350
|
+
num_items: [""]
|
|
6351
|
+
});
|
|
6352
|
+
}
|
|
6353
|
+
ngOnInit() {
|
|
6354
|
+
this.loadData();
|
|
6355
|
+
this.listenForChanges();
|
|
6356
|
+
}
|
|
6357
|
+
listenForChanges() {
|
|
6358
|
+
this.filterFormGroup.valueChanges
|
|
6359
|
+
.pipe(debounceTime(500), untilDestroyed(this))
|
|
6360
|
+
.subscribe((changes) => {
|
|
6361
|
+
this.reload();
|
|
6362
|
+
});
|
|
6363
|
+
}
|
|
6364
|
+
loadData() {
|
|
6365
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
6366
|
+
let result;
|
|
6367
|
+
try {
|
|
6368
|
+
this.isWorking = true;
|
|
6369
|
+
var filter = this.filterFormGroup.value;
|
|
6370
|
+
filter.page = this.page;
|
|
6371
|
+
filter.perPage = this.perPage;
|
|
6372
|
+
result = yield this.dataManager.GET(`api/features`, filter);
|
|
6373
|
+
this.features = this.features.concat(result.data);
|
|
6374
|
+
this.dataSource = new MatTableDataSource(this.features);
|
|
6375
|
+
if (!this.storage.getItem('features')) {
|
|
6376
|
+
this.setStorage(this.features);
|
|
6377
|
+
}
|
|
6378
|
+
this.isWorking = false;
|
|
6379
|
+
}
|
|
6380
|
+
catch (error) {
|
|
6381
|
+
this.errorHandler.handleError(error);
|
|
6382
|
+
}
|
|
6383
|
+
finally {
|
|
6384
|
+
this.isWorking = false;
|
|
6385
|
+
}
|
|
6386
|
+
});
|
|
6387
|
+
}
|
|
6388
|
+
toggeleFeature(element, feature) {
|
|
6389
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
6390
|
+
let status = element ? 'Off' : "On";
|
|
6391
|
+
let data;
|
|
6392
|
+
const dialogRef = this.dialog.open(ActionPopupComponent, {
|
|
6393
|
+
width: "400px",
|
|
6394
|
+
data: {
|
|
6395
|
+
title: `Turn this feature ${status}?`,
|
|
6396
|
+
message: `Would you like to turn ${feature.title} feature ${status}`
|
|
6397
|
+
}
|
|
6398
|
+
});
|
|
6399
|
+
dialogRef.afterClosed().subscribe((result) => __awaiter(this, void 0, void 0, function* () {
|
|
6400
|
+
if (result) {
|
|
6401
|
+
try {
|
|
6402
|
+
data = element
|
|
6403
|
+
? yield this.featureService.disableFeature(feature.id)
|
|
6404
|
+
: yield this.featureService.enableFeature(feature.id);
|
|
6405
|
+
}
|
|
6406
|
+
catch (error) {
|
|
6407
|
+
this.errorHandler.handleError(error);
|
|
6408
|
+
}
|
|
6409
|
+
finally {
|
|
6410
|
+
this.alertService.addAlert(`You have just turned ${status} the feature ${feature.title}`, 'success');
|
|
6411
|
+
this.reload();
|
|
6412
|
+
this.storage.removeItem('features');
|
|
6413
|
+
this.setStorage(this.features);
|
|
6414
|
+
this.isWorking = false;
|
|
6415
|
+
}
|
|
6416
|
+
}
|
|
6417
|
+
else {
|
|
6418
|
+
this.reload();
|
|
6419
|
+
}
|
|
6420
|
+
}));
|
|
6421
|
+
});
|
|
6422
|
+
}
|
|
6423
|
+
setStorage(features) {
|
|
6424
|
+
let localFeatures = [];
|
|
6425
|
+
for (let feature of features) {
|
|
6426
|
+
if (!feature.client_feature) {
|
|
6427
|
+
if (feature.is_enabled_default) {
|
|
6428
|
+
localFeatures.push(feature.code);
|
|
6429
|
+
}
|
|
6430
|
+
}
|
|
6431
|
+
else {
|
|
6432
|
+
if (feature.client_feature.is_enabled) {
|
|
6433
|
+
localFeatures.push(feature.code);
|
|
6434
|
+
}
|
|
6435
|
+
}
|
|
6436
|
+
}
|
|
6437
|
+
this.storage.setItem("features", localFeatures);
|
|
6438
|
+
}
|
|
6439
|
+
reload() {
|
|
6440
|
+
this.features = [];
|
|
6441
|
+
this.page = 1;
|
|
6442
|
+
if (!this.isWorking) {
|
|
6443
|
+
this.loadData();
|
|
6444
|
+
}
|
|
6445
|
+
}
|
|
6446
|
+
onScroll() {
|
|
6447
|
+
if (!this.isWorking && this.page < this.lastPage) {
|
|
6448
|
+
this.page += 1;
|
|
6449
|
+
this.loadData();
|
|
6450
|
+
}
|
|
6451
|
+
}
|
|
6452
|
+
sortColumn(event) {
|
|
6453
|
+
var direction = event.direction.toString().toUpperCase();
|
|
6454
|
+
this.assignFilter(event.active, direction);
|
|
6455
|
+
this.reload();
|
|
6456
|
+
}
|
|
6457
|
+
assignFilter(column, direction) {
|
|
6458
|
+
switch (column) {
|
|
6459
|
+
case 'name': {
|
|
6460
|
+
return this.filterFormGroup
|
|
6461
|
+
.get('sort_by')
|
|
6462
|
+
.setValue('first_name|' + direction);
|
|
6463
|
+
}
|
|
6464
|
+
case 'added_on': {
|
|
6465
|
+
return this.filterFormGroup
|
|
6466
|
+
.get('sort_by')
|
|
6467
|
+
.setValue('created_at|' + direction);
|
|
6468
|
+
}
|
|
6469
|
+
}
|
|
6470
|
+
}
|
|
6471
|
+
};
|
|
6472
|
+
TechlifyFeatureListingComponent.decorators = [
|
|
6473
|
+
{ type: Component, args: [{
|
|
6474
|
+
selector: 'app-techlify-listing-feature',
|
|
6475
|
+
template: "<div fxLayout=\"column\" fxLayoutGap=\"3rem\" class=\"p-3\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" class=\"primary-color mt-3\">\n <h3>Features Configuration</h3>\n <mat-hint>\n <i> Here you can specify which optional features you'd like to have available to your team </i>\n </mat-hint>\n </div>\n\n\n <div>\n <mat-card>\n <mat-card-content fxlayout=\"column\" style=\"overflow: auto; height: 700px\" class=\"classifications-card\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8 w-100\" matSort multiTemplateDataRows\n (matSortChange)=\"sortColumn($event)\" infiniteScroll [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\" [fromRoot]=\"true\" [infiniteScrollContainer]=\"'.classifications-card'\">\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\">\n {{ i + 1 }}\n </td>\n </ng-container>\n\n <!-- Title Column -->\n <ng-container matColumnDef=\"feature\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n Feature\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.title }}</td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n Descriptions\n </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.description }}\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header disableClear>\n Actions\n </th>\n <td mat-cell *matCellDef=\"let element\">\n <div *ngIf=\"!element?.client_feature\">\n <app-on-off-switch [value]=\"element?.is_enabled_default\"\n (click)=\"toggeleFeature(element?.is_enabled_default, element)\"></app-on-off-switch>\n </div>\n <div *ngIf=\"element?.client_feature\">\n <app-on-off-switch [value]=\"element?.client_feature?.is_enabled\"\n (click)=\"toggeleFeature(element?.client_feature?.is_enabled, element)\"></app-on-off-switch>\n </div>\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 </div>\n</div>\n",
|
|
6476
|
+
styles: [""]
|
|
6477
|
+
},] }
|
|
6478
|
+
];
|
|
6479
|
+
TechlifyFeatureListingComponent.ctorParameters = () => [
|
|
6480
|
+
{ type: DataManager },
|
|
6481
|
+
{ type: ErrorHandlerService },
|
|
6482
|
+
{ type: FormBuilder },
|
|
6483
|
+
{ type: AlertService },
|
|
6484
|
+
{ type: MatDialog },
|
|
6485
|
+
{ type: StorageService },
|
|
6486
|
+
{ type: TechlifyFeatureService }
|
|
6487
|
+
];
|
|
6488
|
+
TechlifyFeatureListingComponent = __decorate([
|
|
6489
|
+
UntilDestroy()
|
|
6490
|
+
], TechlifyFeatureListingComponent);
|
|
6491
|
+
|
|
6492
|
+
const routes$n = [
|
|
6493
|
+
{
|
|
6494
|
+
path: '',
|
|
6495
|
+
component: TechlifyFeatureListingComponent,
|
|
6496
|
+
canActivate: [AuthenticationGuard]
|
|
6497
|
+
},
|
|
6498
|
+
];
|
|
6499
|
+
const TechlifyFeatureRoutes = RouterModule.forChild(routes$n);
|
|
6500
|
+
|
|
6501
|
+
class OnOffSwitchComponent {
|
|
6502
|
+
constructor(fb) {
|
|
6503
|
+
this.fb = fb;
|
|
6504
|
+
this.slideToggle = this.fb.group({
|
|
6505
|
+
toggle: [""]
|
|
6506
|
+
});
|
|
6507
|
+
}
|
|
6508
|
+
ngOnInit() {
|
|
6509
|
+
this.slideToggle.get('toggle').setValue(this.value);
|
|
6510
|
+
}
|
|
6511
|
+
}
|
|
6512
|
+
OnOffSwitchComponent.decorators = [
|
|
6513
|
+
{ type: Component, args: [{
|
|
6514
|
+
selector: 'app-on-off-switch',
|
|
6515
|
+
template: "<form [formGroup]=\"slideToggle\">\n <mat-slide-toggle formControlName=\"toggle\">On / Off\n </mat-slide-toggle>\n</form>\n",
|
|
6516
|
+
styles: [""]
|
|
6517
|
+
},] }
|
|
6518
|
+
];
|
|
6519
|
+
OnOffSwitchComponent.ctorParameters = () => [
|
|
6520
|
+
{ type: FormBuilder }
|
|
6521
|
+
];
|
|
6522
|
+
OnOffSwitchComponent.propDecorators = {
|
|
6523
|
+
value: [{ type: Input }]
|
|
6524
|
+
};
|
|
6525
|
+
|
|
6526
|
+
class TechlifyFeatureEnabledDirective {
|
|
6527
|
+
constructor(el, featureService, errorHandler, storage) {
|
|
6528
|
+
this.el = el;
|
|
6529
|
+
this.featureService = featureService;
|
|
6530
|
+
this.errorHandler = errorHandler;
|
|
6531
|
+
this.storage = storage;
|
|
6532
|
+
this.localFeatures = [];
|
|
6533
|
+
}
|
|
6534
|
+
ngOnInit() {
|
|
6535
|
+
if (!this.storage.getItem('features')) {
|
|
6536
|
+
this.getFeatures();
|
|
6537
|
+
}
|
|
6538
|
+
else {
|
|
6539
|
+
this.checkForFeatureEnabled();
|
|
6540
|
+
}
|
|
6541
|
+
}
|
|
6542
|
+
getFeatures() {
|
|
6543
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
6544
|
+
try {
|
|
6545
|
+
let features = yield this.featureService.getFeatures();
|
|
6546
|
+
for (let feature of features.data) {
|
|
6547
|
+
if (!feature.client_feature) {
|
|
6548
|
+
if (feature.is_enabled_default) {
|
|
6549
|
+
this.localFeatures.push(feature.code);
|
|
6550
|
+
}
|
|
6551
|
+
}
|
|
6552
|
+
else {
|
|
6553
|
+
if (feature.client_feature.is_enabled) {
|
|
6554
|
+
this.localFeatures.push(feature.code);
|
|
6555
|
+
}
|
|
6556
|
+
}
|
|
6557
|
+
}
|
|
6558
|
+
this.storage.setItem("features", this.localFeatures);
|
|
6559
|
+
}
|
|
6560
|
+
catch (error) {
|
|
6561
|
+
this.errorHandler.handleError(error);
|
|
6562
|
+
}
|
|
6563
|
+
finally {
|
|
6564
|
+
this.checkForFeatureEnabled();
|
|
6565
|
+
}
|
|
6566
|
+
});
|
|
6567
|
+
}
|
|
6568
|
+
checkForFeatureEnabled() {
|
|
6569
|
+
try {
|
|
6570
|
+
let features = this.storage.getItem('features');
|
|
6571
|
+
let features_split = features.split(',');
|
|
6572
|
+
if (features_split.includes(this.enabledFeature)) {
|
|
6573
|
+
this.el.nativeElement.style.display = "show";
|
|
6574
|
+
}
|
|
6575
|
+
else {
|
|
6576
|
+
this.el.nativeElement.remove();
|
|
6577
|
+
}
|
|
6578
|
+
}
|
|
6579
|
+
catch (error) {
|
|
6580
|
+
this.errorHandler.handleError(error);
|
|
6581
|
+
}
|
|
6582
|
+
}
|
|
6583
|
+
}
|
|
6584
|
+
TechlifyFeatureEnabledDirective.decorators = [
|
|
6585
|
+
{ type: Directive, args: [{
|
|
6586
|
+
selector: '[techlifyFeatureEnabled]'
|
|
6587
|
+
},] }
|
|
6588
|
+
];
|
|
6589
|
+
TechlifyFeatureEnabledDirective.ctorParameters = () => [
|
|
6590
|
+
{ type: ElementRef },
|
|
6591
|
+
{ type: TechlifyFeatureService },
|
|
6592
|
+
{ type: ErrorHandlerService },
|
|
6593
|
+
{ type: StorageService }
|
|
6594
|
+
];
|
|
6595
|
+
TechlifyFeatureEnabledDirective.propDecorators = {
|
|
6596
|
+
enabledFeature: [{ type: Input, args: ['techlifyFeatureEnabled',] }]
|
|
6597
|
+
};
|
|
6598
|
+
|
|
6599
|
+
class TechlifyFeatureModule {
|
|
6600
|
+
}
|
|
6601
|
+
TechlifyFeatureModule.decorators = [
|
|
6602
|
+
{ type: NgModule, args: [{
|
|
6603
|
+
imports: [
|
|
6604
|
+
CommonModule,
|
|
6605
|
+
MaterialModule,
|
|
6606
|
+
FlexLayoutModule,
|
|
6607
|
+
TechlifyFeatureRoutes,
|
|
6608
|
+
MatSlideToggleModule,
|
|
6609
|
+
FormsModule,
|
|
6610
|
+
ReactiveFormsModule,
|
|
6611
|
+
InfiniteScrollModule
|
|
6612
|
+
],
|
|
6613
|
+
declarations: [TechlifyFeatureListingComponent, OnOffSwitchComponent, TechlifyFeatureEnabledDirective],
|
|
6614
|
+
exports: [TechlifyFeatureListingComponent, TechlifyFeatureEnabledDirective]
|
|
6615
|
+
},] }
|
|
6616
|
+
];
|
|
6617
|
+
|
|
6169
6618
|
/*
|
|
6170
6619
|
* Public API Surface of ngx-techlify-core
|
|
6171
6620
|
*/
|
|
@@ -6174,5 +6623,5 @@ TechlifyTaggerTagSelectorModule.decorators = [
|
|
|
6174
6623
|
* Generated bundle index. Do not edit.
|
|
6175
6624
|
*/
|
|
6176
6625
|
|
|
6177
|
-
export { ActionPopup, ActionPopupComponent, ActionPopupModule, AlertService, ApiPrefixInterceptor, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, ConfigService, CoreModule, CredentialsService, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFilesViewAllComponent, EntityFilesViewAllModule, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FailedItemsComponent, FailedItemsModule, FailedItemsRoutingModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportConfig, ImportCsvComponent, ImportCsvModule, ImportCsvRoutingModule, ImportItemsComponent, ImportItemsModule, ImportItemsRoutingModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, MatSelectInfiniteScrollDirective, MaterialModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberSelector, PageEvent, ReadMoreComponent, ReadMoreModule, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SnackModule, StorageService, SuccessSnackComponent, TechlifyConfig, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, Timeline, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, UtilityModule, ViewerConfig, calculateTimeline, esfur, estlr, esulr, SnackModule as ɵa, SuccessSnackComponent as ɵb, NumberSelector as ɵba, TimelineFilterComponent as ɵbb, TimelineFilterRoutingModule as ɵbc, LoaderComponent as ɵbd, EmailSubscriptionUserFormComponent as ɵbe, EmailSubscriptionUserListComponent as ɵbf, AuthenticationGuard as ɵbg, EmailSubscriptionUserListFilterComponent as ɵbh, EmailSubscriptionTypeFormComponent as ɵbi, EmailSubscriptionTypeListComponent as ɵbj, EmailSubscriptionForUserComponent as ɵbk, TechlifyUpdatesListComponent as ɵbl, TechlifyUpdateService as ɵbm, TechlifyUpdateRoutingModule as ɵbn, TechlifyUpdateFormModule as ɵbo, TechlifyUpdateFormComponent as ɵbp, TechlifyUpdateHistoryRoutingModule as ɵbq, TechlifyUpdateHistoryComponent as ɵbr, UpdateNotifierSnackComponent as ɵbs, UpdateViewModule as ɵbt, UpdateViewComponent as ɵbu, DataManager as ɵbv, ErrorSnackComponent as ɵc, HTTP_DYNAMIC_INTERCEPTORS as ɵd, HttpService as ɵe, RouteReusableStrategy as ɵf, ActionPopupComponent as ɵg, ActionPopup as ɵh, DataTableComponent as ɵi, DocumentViewerComponent as ɵj, EntityFileFormComponent as ɵk, FormValidatorService as ɵl, EntityFileService as ɵm, AlertService as ɵn, EntityFilesViewAllComponent as ɵo, FileDropperComponent as ɵp, NoteListComponent as ɵq, NoteService as ɵr, NoteFormComponent as ɵs, CommentFormComponent as ɵt, CredentialsService as ɵu, ConfigService as ɵv, TechlifyConfig as ɵw, SearchableSelectorComponent as ɵx, MatSelectInfiniteScrollDirective as ɵy, NumItemsSelector as ɵz };
|
|
6626
|
+
export { ActionPopup, ActionPopupComponent, ActionPopupModule, AlertService, ApiPrefixInterceptor, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, CommentFormComponent, ConfigService, CoreModule, CredentialsService, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFilesViewAllComponent, EntityFilesViewAllModule, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FailedItemsComponent, FailedItemsModule, FailedItemsRoutingModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportConfig, ImportCsvComponent, ImportCsvModule, ImportCsvRoutingModule, ImportItemsComponent, ImportItemsModule, ImportItemsRoutingModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, MatSelectInfiniteScrollDirective, MaterialModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberSelector, PageEvent, ReadMoreComponent, ReadMoreModule, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SnackModule, StorageService, SuccessSnackComponent, TechlifyConfig, TechlifyFeatureEnabledDirective, TechlifyFeatureListingComponent, TechlifyFeatureModule, TechlifyFeatureRoutes, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, Timeline, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, UtilityModule, ViewerConfig, calculateTimeline, esfur, estlr, esulr, SnackModule as ɵa, SuccessSnackComponent as ɵb, NumberSelector as ɵba, TimelineFilterComponent as ɵbb, TimelineFilterRoutingModule as ɵbc, LoaderComponent as ɵbd, EmailSubscriptionUserFormComponent as ɵbe, EmailSubscriptionUserListComponent as ɵbf, AuthenticationGuard as ɵbg, EmailSubscriptionUserListFilterComponent as ɵbh, EmailSubscriptionTypeFormComponent as ɵbi, EmailSubscriptionTypeListComponent as ɵbj, EmailSubscriptionForUserComponent as ɵbk, TechlifyUpdatesListComponent as ɵbl, TechlifyUpdateService as ɵbm, TechlifyUpdateRoutingModule as ɵbn, TechlifyUpdateFormModule as ɵbo, TechlifyUpdateFormComponent as ɵbp, TechlifyUpdateHistoryRoutingModule as ɵbq, TechlifyUpdateHistoryComponent as ɵbr, UpdateNotifierSnackComponent as ɵbs, UpdateViewModule as ɵbt, UpdateViewComponent as ɵbu, DataManager as ɵbv, DataManager as ɵbw, ErrorHandlerService as ɵbx, AlertService as ɵby, StorageService as ɵbz, ErrorSnackComponent as ɵc, TechlifyFeatureService as ɵca, AuthenticationGuard as ɵcb, OnOffSwitchComponent as ɵcc, HTTP_DYNAMIC_INTERCEPTORS as ɵd, HttpService as ɵe, RouteReusableStrategy as ɵf, ActionPopupComponent as ɵg, ActionPopup as ɵh, DataTableComponent as ɵi, DocumentViewerComponent as ɵj, EntityFileFormComponent as ɵk, FormValidatorService as ɵl, EntityFileService as ɵm, AlertService as ɵn, EntityFilesViewAllComponent as ɵo, FileDropperComponent as ɵp, NoteListComponent as ɵq, NoteService as ɵr, NoteFormComponent as ɵs, CommentFormComponent as ɵt, CredentialsService as ɵu, ConfigService as ɵv, TechlifyConfig as ɵw, SearchableSelectorComponent as ɵx, MatSelectInfiniteScrollDirective as ɵy, NumItemsSelector as ɵz };
|
|
6178
6627
|
//# sourceMappingURL=ngx-techlify-core.js.map
|