@sumaris-net/ngx-components 1.5.2 → 1.5.6
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/sumaris-net.ngx-components.umd.js +63 -44
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +6 -0
- package/esm2015/src/app/core/form/editor.class.js +5 -3
- package/esm2015/src/app/core/settings/settings.page.js +10 -13
- package/esm2015/src/app/shared/functions.js +18 -14
- package/esm2015/src/app/shared/observables.js +25 -2
- package/fesm2015/sumaris-net.ngx-components.js +54 -28
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/core/settings/settings.page.d.ts +3 -3
- package/src/app/shared/observables.d.ts +1 -0
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -543,27 +543,31 @@
|
|
|
543
543
|
if (target === items)
|
|
544
544
|
target = target.slice();
|
|
545
545
|
target.sort(propertiesPathComparator(keys));
|
|
546
|
-
var
|
|
547
|
-
|
|
548
|
-
|
|
546
|
+
var res = {
|
|
547
|
+
total: target.length || 0,
|
|
548
|
+
data: undefined // will be below
|
|
549
|
+
};
|
|
550
|
+
// Page (truncate if need)
|
|
549
551
|
if (opts) {
|
|
550
552
|
if (isNil(opts.offset) && opts.offset > 0) {
|
|
551
|
-
|
|
553
|
+
res.data = target.slice(opts.offset);
|
|
552
554
|
}
|
|
553
|
-
if (isNotNil(opts.size) &&
|
|
554
|
-
|
|
555
|
+
if (isNotNil(opts.size) && target.length > opts.size) {
|
|
556
|
+
res.data = target.slice(0, opts.size);
|
|
555
557
|
}
|
|
556
558
|
}
|
|
557
|
-
|
|
558
|
-
data
|
|
559
|
-
|
|
560
|
-
};
|
|
559
|
+
else {
|
|
560
|
+
res.data = target;
|
|
561
|
+
}
|
|
561
562
|
// Add fetch more capability, if total was fetched
|
|
562
|
-
var nextOffset = (opts && opts.offset || 0) +
|
|
563
|
-
if (nextOffset < total) {
|
|
564
|
-
res.fetchMore = function (_) { return __awaiter(_this, void 0, void 0, function () {
|
|
565
|
-
return
|
|
566
|
-
|
|
563
|
+
var nextOffset = (opts && opts.offset || 0) + target.length;
|
|
564
|
+
if (nextOffset < res.total) {
|
|
565
|
+
res.fetchMore = function (_) { return __awaiter(_this, void 0, void 0, function () {
|
|
566
|
+
return __generator(this, function (_a) {
|
|
567
|
+
return [2 /*return*/, suggestFromArray(target, undefined /*already applied*/, Object.assign(Object.assign({}, opts), { offset: nextOffset, excludedIds: undefined // not need (already applied)
|
|
568
|
+
}))];
|
|
569
|
+
});
|
|
570
|
+
}); };
|
|
567
571
|
}
|
|
568
572
|
return res;
|
|
569
573
|
}
|
|
@@ -1146,6 +1150,32 @@
|
|
|
1146
1150
|
});
|
|
1147
1151
|
});
|
|
1148
1152
|
}
|
|
1153
|
+
function waitForTrue(observable, opts) {
|
|
1154
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1155
|
+
var firstTrueObservable, $timeout;
|
|
1156
|
+
return __generator(this, function (_a) {
|
|
1157
|
+
firstTrueObservable = observable.pipe(operators.first(function (v) { return v === true; }), operators.map(function () { }) // convert to void
|
|
1158
|
+
);
|
|
1159
|
+
// Timeout (+ dueTime)
|
|
1160
|
+
if (opts && opts.timeout > 0) {
|
|
1161
|
+
$timeout = rxjs.timer(opts.timeout);
|
|
1162
|
+
return [2 /*return*/, rxjs.merge(rxjs.timer(opts.dueTime || 0)
|
|
1163
|
+
.pipe(operators.switchMap(function () { return firstTrueObservable; }), operators.takeUntil($timeout)), $timeout
|
|
1164
|
+
.pipe(operators.map(function () {
|
|
1165
|
+
throw new Error("Timeout ready() - after " + opts.timeout + "ms");
|
|
1166
|
+
})))
|
|
1167
|
+
.toPromise()];
|
|
1168
|
+
}
|
|
1169
|
+
// dueTime (without timeout)
|
|
1170
|
+
if (opts && opts.dueTime > 0) {
|
|
1171
|
+
return [2 /*return*/, rxjs.timer(opts.dueTime)
|
|
1172
|
+
.pipe(operators.switchMap(function () { return firstTrueObservable; }))
|
|
1173
|
+
.toPromise()];
|
|
1174
|
+
}
|
|
1175
|
+
return [2 /*return*/, firstTrueObservable.toPromise()];
|
|
1176
|
+
});
|
|
1177
|
+
});
|
|
1178
|
+
}
|
|
1149
1179
|
|
|
1150
1180
|
function createPromiseEventEmitter() {
|
|
1151
1181
|
return new i0.EventEmitter(true);
|
|
@@ -21265,13 +21295,14 @@
|
|
|
21265
21295
|
SettingsPage.prototype.save = function (event, options) {
|
|
21266
21296
|
return __awaiter(this, void 0, void 0, function () {
|
|
21267
21297
|
var data, peerChanged, err_1;
|
|
21298
|
+
var _this = this;
|
|
21268
21299
|
return __generator(this, function (_a) {
|
|
21269
21300
|
switch (_a.label) {
|
|
21270
21301
|
case 0:
|
|
21271
21302
|
if (this.saving)
|
|
21272
21303
|
return [2 /*return*/]; // Skip
|
|
21273
|
-
|
|
21274
|
-
|
|
21304
|
+
if (event)
|
|
21305
|
+
event.preventDefault();
|
|
21275
21306
|
// Remove all empty controls
|
|
21276
21307
|
this.propertiesFormHelper.removeAllEmpty();
|
|
21277
21308
|
if (!!this.form.valid) return [3 /*break*/, 2];
|
|
@@ -21288,6 +21319,7 @@
|
|
|
21288
21319
|
console.debug('[settings] Saving local settings...');
|
|
21289
21320
|
this.saving = true;
|
|
21290
21321
|
this.error = undefined;
|
|
21322
|
+
this.markForCheck();
|
|
21291
21323
|
return [4 /*yield*/, this.getValue()];
|
|
21292
21324
|
case 3:
|
|
21293
21325
|
data = _a.sent();
|
|
@@ -21319,8 +21351,11 @@
|
|
|
21319
21351
|
this.enable({ emitEvent: false });
|
|
21320
21352
|
// Apply inheritance
|
|
21321
21353
|
this.setAccountInheritance(data.accountInheritance, { emitEvent: false });
|
|
21322
|
-
|
|
21323
|
-
|
|
21354
|
+
// Add a delay, because of option menu that is always opened after save!!
|
|
21355
|
+
setTimeout(function () {
|
|
21356
|
+
_this.saving = false;
|
|
21357
|
+
_this.markForCheck();
|
|
21358
|
+
}, 400);
|
|
21324
21359
|
return [7 /*endfinally*/];
|
|
21325
21360
|
case 8: return [2 /*return*/];
|
|
21326
21361
|
}
|
|
@@ -21400,25 +21435,11 @@
|
|
|
21400
21435
|
};
|
|
21401
21436
|
SettingsPage.prototype.close = function (event) {
|
|
21402
21437
|
return __awaiter(this, void 0, void 0, function () {
|
|
21403
|
-
var confirmation;
|
|
21404
21438
|
return __generator(this, function (_a) {
|
|
21405
|
-
|
|
21406
|
-
|
|
21407
|
-
|
|
21408
|
-
|
|
21409
|
-
if (!this.dirty) return [3 /*break*/, 3];
|
|
21410
|
-
return [4 /*yield*/, Alerts.askSaveBeforeLeave(this.alertCtrl, this.translate)];
|
|
21411
|
-
case 1:
|
|
21412
|
-
confirmation = _a.sent();
|
|
21413
|
-
if (!confirmation) return [3 /*break*/, 3];
|
|
21414
|
-
return [4 /*yield*/, this.save(event)];
|
|
21415
|
-
case 2:
|
|
21416
|
-
_a.sent();
|
|
21417
|
-
_a.label = 3;
|
|
21418
|
-
case 3:
|
|
21419
|
-
// Back to home
|
|
21420
|
-
return [2 /*return*/, this.router.navigateByUrl('/', { replaceUrl: true })]; // back to home
|
|
21421
|
-
}
|
|
21439
|
+
if (this.saving)
|
|
21440
|
+
return [2 /*return*/];
|
|
21441
|
+
// Back to home
|
|
21442
|
+
return [2 /*return*/, this.router.navigateByUrl('/', { replaceUrl: true })]; // back to home
|
|
21422
21443
|
});
|
|
21423
21444
|
});
|
|
21424
21445
|
};
|
|
@@ -21476,7 +21497,7 @@
|
|
|
21476
21497
|
SettingsPage.decorators = [
|
|
21477
21498
|
{ type: i0.Component, args: [{
|
|
21478
21499
|
selector: 'page-settings',
|
|
21479
|
-
template: "<app-toolbar [title]=\"'SETTINGS.TITLE'|translate\" color=\"primary\"\n [hasValidate]=\"dirty && !saving\"\n [hasClose]=\"!dirty && !saving\"\n (onValidate)=\"save($event)\"\n (onClose)=\"close($event)\">\n\n <ion-buttons slot=\"end\">\n <!-- options menu -->\n <ion-button [matMenuTriggerFor]=\"optionsMenu\" [disabled]=\"saving\">\n <mat-icon slot=\"icon-only\">more_vert</mat-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Options menu -->\n<mat-menu #optionsMenu=\"matMenu\">\n <!-- Clear cache -->\n <button mat-menu-item (click)=\"clearCache($event)\">\n <ion-label translate>SETTINGS.BTN_CLEAR_CACHE</ion-label>\n </button>\n\n <!-- Reset -->\n <button mat-menu-item\n [disabled]=\"!dirty\"\n (click)=\"cancel($event)\">\n <ion-label>\n <mat-icon><ion-icon slot=\"start\" name=\"refresh\"></ion-icon></mat-icon> \n <span translate>COMMON.BTN_RESET</span>\n </ion-label>\n </button>\n</mat-menu>\n\n<ion-content>\n\n <form [formGroup]=\"form\" novalidate (ngSubmit)=\"save($event)\" class=\"form-container\">\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n\n <!-- left margin -->\n <ion-col size=\"0\" size-lg=\"2\"> \n </ion-col>\n\n <ion-col class=\"ion-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <p [innerHTML]=\"'SETTINGS.DESCRIPTION'|translate\"></p>\n\n <!-- account inheritance (desktop) -->\n <mat-form-field [hidden]=\"!isLogin\" *ngIf=\"!mobile; else accountInheritanceMobile\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- check box (if desktop) -->\n <mat-checkbox\n *ngIf=\"!mobile; else accountInheritanceMobile\"\n (change)=\"setAccountInheritance($event.checked)\"\n [checked]=\"accountInheritance\">\n <span translate>SETTINGS.INHERIT_FROM_ACCOUNT</span>\n </mat-checkbox>\n\n <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- account inheritance (if mobile) -->\n <ng-template #accountInheritanceMobile>\n <mat-form-field [hidden]=\"!isLogin\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- slide toggle -->\n <ion-text translate>SETTINGS.INHERIT_FROM_ACCOUNT</ion-text>\n <mat-slide-toggle matSuffix\n (change)=\"setAccountInheritance($event.checked)\"\n [checked]=\"accountInheritance\">\n\n </mat-slide-toggle>\n <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ng-template>\n\n <!-- locale -->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.LOCALE'|translate\" formControlName=\"locale\" required>\n <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n {{item.value}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"form.controls.locale.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- Network entry -->\n <h3>\n <ion-text translate>SETTINGS.NETWORK_DIVIDER</ion-text>\n </h3>\n\n <!-- Peer address -->\n <mat-form-field>\n <input matInput type=\"text\" [placeholder]=\"'SETTINGS.PEER_URL'|translate\" formControlName=\"peerUrl\"\n required>\n\n <button mat-icon-button type=\"button\" matSuffix (click)=\"showSelectPeerModal()\" tabindex=\"-1\"\n [title]=\"'SETTINGS.BTN_CHANGE_PEER'|translate\">\n <mat-icon>search</mat-icon>\n </button>\n\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerAlive')\"\n translate>SETTINGS.ERROR.PEER_NOT_REACHABLE\n </mat-error>\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerNotCompatible')\"\n translate>SETTINGS.ERROR.PEER_NOT_COMPATIBLE\n </mat-error>\n </mat-form-field>\n\n <!-- Offline mode (if mobile) -->\n <mat-form-field *ngIf=\"mobile\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- slide toggle -->\n <ion-text translate>SETTINGS.OFFLINE_MODE</ion-text>\n <mat-slide-toggle matSuffix\n (change)=\"network.setForceOffline($event.checked)\"\n [checked]=\"network.offline\">\n\n </mat-slide-toggle>\n </mat-form-field>\n\n <!-- Data entry -->\n <h3>\n <ion-text translate>SETTINGS.DATA_ENTRY_DIVIDER</ion-text>\n </h3>\n\n <!-- Usage mode -->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.USAGE_MODE'|translate\" formControlName=\"usageMode\"\n required>\n <mat-option *ngFor=\"let item of usageModes\" [value]=\"item\">\n {{'SETTINGS.USAGE_MODES.'+item|translate}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"form.controls.usageMode.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- lat/long format-->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.LAT_LONG_FORMAT'|translate\" formControlName=\"latLongFormat\"\n required>\n <mat-option *ngFor=\"let item of latLongFormats\" [value]=\"item\">\n {{'COMMON.LAT_LONG.'+item+'_PLACEHOLDER'|translate}}\n </mat-option>\n </mat-select>\n <mat-error\n *ngIf=\"form.controls.latLongFormat.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- fields options -->\n <ion-grid formArrayName=\"properties\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"propertiesForm?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"propertiesFormHelper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <!-- Fields options -->\n <ng-container *ngFor=\"let propertyForm of propertiesForm?.controls; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field>\n <mat-select formControlName=\"key\"\n [placeholder]=\" 'SETTINGS.PROPERTY_KEY'|translate\">\n <mat-option *ngFor=\"let item of propertyDefinitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left>\n <app-form-field *ngIf=\"getPropertyDefinition(i); let definition\"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"propertyForm.controls.value\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </ion-col>\n <ion-col size=\"2\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"loading\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removePropertyAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button *ngIf=\"propertiesFormHelper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"loading\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"propertiesFormHelper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n </ion-col>\n\n <!-- right margin -->\n <ion-col size=\"0\" size-lg=\"2\"> \n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <app-form-buttons-bar (onCancel)=\"cancel()\" (onSave)=\"save($event)\" [disabled]=\"!form.dirty || saving\"></app-form-buttons-bar>\n</ion-footer>\n",
|
|
21500
|
+
template: "<app-toolbar [title]=\"'SETTINGS.TITLE'|translate\" color=\"primary\"\n [hasValidate]=\"dirty && !saving\"\n [hasClose]=\"!dirty && !saving\"\n (onValidate)=\"save($event)\"\n (onClose)=\"close($event)\">\n\n <ion-buttons slot=\"end\">\n <!-- options menu -->\n <ion-button [matMenuTriggerFor]=\"optionsMenu\"\n *ngIf=\"!saving\"\n [disabled]=\"saving\">\n <mat-icon slot=\"icon-only\">more_vert</mat-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Options menu -->\n<mat-menu #optionsMenu=\"matMenu\">\n <!-- Clear cache -->\n <button mat-menu-item (click)=\"clearCache($event)\">\n <ion-label translate>SETTINGS.BTN_CLEAR_CACHE</ion-label>\n </button>\n\n <!-- Reset -->\n <button mat-menu-item\n [disabled]=\"!dirty\"\n (click)=\"cancel($event)\">\n <ion-label>\n <mat-icon><ion-icon slot=\"start\" name=\"refresh\"></ion-icon></mat-icon> \n <span translate>COMMON.BTN_RESET</span>\n </ion-label>\n </button>\n</mat-menu>\n\n<ion-content>\n\n <form [formGroup]=\"form\" novalidate (ngSubmit)=\"save($event)\" class=\"form-container\">\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n\n <!-- left margin -->\n <ion-col size=\"0\" size-lg=\"2\"> \n </ion-col>\n\n <ion-col class=\"ion-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <p [innerHTML]=\"'SETTINGS.DESCRIPTION'|translate\"></p>\n\n <!-- account inheritance (desktop) -->\n <mat-form-field [hidden]=\"!isLogin\" *ngIf=\"!mobile; else accountInheritanceMobile\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- check box (if desktop) -->\n <mat-checkbox\n *ngIf=\"!mobile; else accountInheritanceMobile\"\n (change)=\"setAccountInheritance($event.checked)\"\n [checked]=\"accountInheritance\">\n <span translate>SETTINGS.INHERIT_FROM_ACCOUNT</span>\n </mat-checkbox>\n\n <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- account inheritance (if mobile) -->\n <ng-template #accountInheritanceMobile>\n <mat-form-field [hidden]=\"!isLogin\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- slide toggle -->\n <ion-text translate>SETTINGS.INHERIT_FROM_ACCOUNT</ion-text>\n <mat-slide-toggle matSuffix\n (change)=\"setAccountInheritance($event.checked)\"\n [checked]=\"accountInheritance\">\n\n </mat-slide-toggle>\n <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ng-template>\n\n <!-- locale -->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.LOCALE'|translate\" formControlName=\"locale\" required>\n <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n {{item.value}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"form.controls.locale.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- Network entry -->\n <h3>\n <ion-text translate>SETTINGS.NETWORK_DIVIDER</ion-text>\n </h3>\n\n <!-- Peer address -->\n <mat-form-field>\n <input matInput type=\"text\" [placeholder]=\"'SETTINGS.PEER_URL'|translate\" formControlName=\"peerUrl\"\n required>\n\n <button mat-icon-button type=\"button\" matSuffix (click)=\"showSelectPeerModal()\" tabindex=\"-1\"\n [title]=\"'SETTINGS.BTN_CHANGE_PEER'|translate\">\n <mat-icon>search</mat-icon>\n </button>\n\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerAlive')\"\n translate>SETTINGS.ERROR.PEER_NOT_REACHABLE\n </mat-error>\n <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerNotCompatible')\"\n translate>SETTINGS.ERROR.PEER_NOT_COMPATIBLE\n </mat-error>\n </mat-form-field>\n\n <!-- Offline mode (if mobile) -->\n <mat-form-field *ngIf=\"mobile\">\n <input matInput hidden formControlName=\"accountInheritance\" type=\"text\">\n\n <!-- slide toggle -->\n <ion-text translate>SETTINGS.OFFLINE_MODE</ion-text>\n <mat-slide-toggle matSuffix\n (change)=\"network.setForceOffline($event.checked)\"\n [checked]=\"network.offline\">\n\n </mat-slide-toggle>\n </mat-form-field>\n\n <!-- Data entry -->\n <h3>\n <ion-text translate>SETTINGS.DATA_ENTRY_DIVIDER</ion-text>\n </h3>\n\n <!-- Usage mode -->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.USAGE_MODE'|translate\" formControlName=\"usageMode\"\n required>\n <mat-option *ngFor=\"let item of usageModes\" [value]=\"item\">\n {{'SETTINGS.USAGE_MODES.'+item|translate}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"form.controls.usageMode.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- lat/long format-->\n <mat-form-field>\n <mat-select [placeholder]=\"'SETTINGS.LAT_LONG_FORMAT'|translate\" formControlName=\"latLongFormat\"\n required>\n <mat-option *ngFor=\"let item of latLongFormats\" [value]=\"item\">\n {{'COMMON.LAT_LONG.'+item+'_PLACEHOLDER'|translate}}\n </mat-option>\n </mat-select>\n <mat-error\n *ngIf=\"form.controls.latLongFormat.hasError('required')\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- fields options -->\n <ion-grid formArrayName=\"properties\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"propertiesForm?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"propertiesFormHelper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <!-- Fields options -->\n <ng-container *ngFor=\"let propertyForm of propertiesForm?.controls; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field>\n <mat-select formControlName=\"key\"\n [placeholder]=\" 'SETTINGS.PROPERTY_KEY'|translate\">\n <mat-option *ngFor=\"let item of propertyDefinitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left>\n <app-form-field *ngIf=\"getPropertyDefinition(i); let definition\"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"propertyForm.controls.value\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </ion-col>\n <ion-col size=\"2\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"loading\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removePropertyAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button *ngIf=\"propertiesFormHelper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"loading\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"propertiesFormHelper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n </ion-col>\n\n <!-- right margin -->\n <ion-col size=\"0\" size-lg=\"2\"> \n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <app-form-buttons-bar (onCancel)=\"cancel()\" (onSave)=\"save($event)\" [disabled]=\"!form.dirty || saving\"></app-form-buttons-bar>\n</ion-footer>\n",
|
|
21480
21501
|
providers: [
|
|
21481
21502
|
{ provide: ngxMaterialTable.ValidatorService, useExisting: LocalSettingsValidatorService },
|
|
21482
21503
|
],
|
|
@@ -25936,6 +25957,8 @@
|
|
|
25936
25957
|
};
|
|
25937
25958
|
AppEditor.prototype.ngOnDestroy = function () {
|
|
25938
25959
|
this._subscription.unsubscribe();
|
|
25960
|
+
this._$ready.complete();
|
|
25961
|
+
this._$ready.unsubscribe();
|
|
25939
25962
|
};
|
|
25940
25963
|
AppEditor.prototype.addChildForm = function (form) {
|
|
25941
25964
|
if (!form)
|
|
@@ -26033,12 +26056,7 @@
|
|
|
26033
26056
|
AppEditor.prototype.ready = function (opts) {
|
|
26034
26057
|
return __awaiter(this, void 0, void 0, function () {
|
|
26035
26058
|
return __generator(this, function (_b) {
|
|
26036
|
-
|
|
26037
|
-
case 0: return [4 /*yield*/, firstTruePromise(this._$ready)];
|
|
26038
|
-
case 1:
|
|
26039
|
-
_b.sent();
|
|
26040
|
-
return [2 /*return*/];
|
|
26041
|
-
}
|
|
26059
|
+
return [2 /*return*/, waitForTrue(this._$ready, opts)];
|
|
26042
26060
|
});
|
|
26043
26061
|
});
|
|
26044
26062
|
};
|
|
@@ -28806,6 +28824,7 @@
|
|
|
28806
28824
|
exports.uncapitalizeFirstLetter = uncapitalizeFirstLetter;
|
|
28807
28825
|
exports.updateValueAndValidity = updateValueAndValidity;
|
|
28808
28826
|
exports.waitFor = waitFor;
|
|
28827
|
+
exports.waitForTrue = waitForTrue;
|
|
28809
28828
|
exports.waitIdle = waitIdle;
|
|
28810
28829
|
exports.waitWhilePending = waitWhilePending;
|
|
28811
28830
|
exports["ɵ0"] = ɵ0$5;
|