diff --git a/ui-ngx/src/app/core/services/menu.models.ts b/ui-ngx/src/app/core/services/menu.models.ts index f173ef1af5..03eae14a56 100644 --- a/ui-ngx/src/app/core/services/menu.models.ts +++ b/ui-ngx/src/app/core/services/menu.models.ts @@ -723,8 +723,8 @@ const defaultUserMenuMap = new Map([ { id: MenuId.mobile_center, pages: [ - {id: MenuId.mobile_apps}, {id: MenuId.mobile_bundles}, + {id: MenuId.mobile_apps}, {id: MenuId.mobile_qr_code_widget} ] }, @@ -819,8 +819,8 @@ const defaultUserMenuMap = new Map([ { id: MenuId.mobile_center, pages: [ - {id: MenuId.mobile_apps}, - {id: MenuId.mobile_bundles} + {id: MenuId.mobile_bundles}, + {id: MenuId.mobile_apps} ] }, {id: MenuId.api_usage}, diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/applications.module.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/applications.module.ts index afcb8571cf..8e67f96a18 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/applications.module.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/applications.module.ts @@ -23,9 +23,6 @@ import { HomeComponentsModule } from '@home/components/home-components.module'; import { ApplicationsRoutingModule } from '@home/pages/mobile/applications/applications-routing.module'; import { MobileAppDialogComponent } from '@home/pages/mobile/applications/mobile-app-dialog.component'; import { RemoveAppDialogComponent } from '@home/pages/mobile/applications/remove-app-dialog.component'; -import { - MobileAppConfigurationDialogComponent -} from '@home/pages/mobile/applications/mobile-app-configuration-dialog.component'; import { CommonMobileModule } from '@home/pages/mobile/common/common-mobile.module'; @NgModule({ @@ -34,7 +31,6 @@ import { CommonMobileModule } from '@home/pages/mobile/common/common-mobile.modu MobileAppTableHeaderComponent, MobileAppDialogComponent, RemoveAppDialogComponent, - MobileAppConfigurationDialogComponent, ], imports: [ CommonModule, diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-config.resolver.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-config.resolver.ts index d402c992e2..543ab89078 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-config.resolver.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app-table-config.resolver.ts @@ -38,24 +38,11 @@ import { } from '@shared/models/mobile-app.models'; import { platformTypeTranslations } from '@shared/models/oauth2.models'; import { TruncatePipe } from '@shared/pipe/truncate.pipe'; -import { NotificationTemplate } from '@shared/models/notification.models'; -import { BaseData, HasId } from '@shared/models/base-data'; -import { - MobileBundleDialogComponent, - MobileBundleDialogData -} from '@home/pages/mobile/bundes/mobile-bundle-dialog.component'; import { MatDialog } from '@angular/material/dialog'; import { MobileAppDeleteDialogData, RemoveAppDialogComponent } from '@home/pages/mobile/applications/remove-app-dialog.component'; -import { - MobileAppConfigurationDialogComponent, MobileAppConfigurationDialogData -} from '@home/pages/mobile/applications/mobile-app-configuration-dialog.component'; -import { select, Store } from '@ngrx/store'; -import { selectUserSettingsProperty } from '@core/auth/auth.selectors'; -import { take } from 'rxjs/operators'; -import { AppState } from '@core/core.state'; @Injectable() export class MobileAppTableConfigResolver { @@ -66,8 +53,7 @@ export class MobileAppTableConfigResolver { private datePipe: DatePipe, private mobileAppService: MobileAppService, private truncatePipe: TruncatePipe, - private dialog: MatDialog, - private store: Store, + private dialog: MatDialog ) { this.config.selectionEnabled = false; this.config.entityType = EntityType.MOBILE_APP; @@ -130,18 +116,6 @@ export class MobileAppTableConfigResolver { this.config.saveEntity = (mobileApp) => this.mobileAppService.saveMobileApp(mobileApp); this.config.deleteEntity = id => this.mobileAppService.deleteMobileApp(id.id); - this.config.entityAdded = (mobileApp) => { - this.store.pipe(select(selectUserSettingsProperty( 'notDisplayConfigurationAfterAddMobileApp'))).pipe( - take(1) - ).subscribe((settings: boolean) => { - if(!settings) { - this.configurationApp(null, mobileApp, true); - } else { - this.config.updateData(); - } - }); - } - this.config.cellActionDescriptors = this.configureCellActions(); } @@ -151,12 +125,6 @@ export class MobileAppTableConfigResolver { private configureCellActions(): Array> { return [ - { - name: this.translate.instant('mobile.configuration-app'), - icon: 'code', - isEnabled: () => true, - onAction: ($event, entity) => this.configurationApp($event, entity) - }, { name: this.translate.instant('action.delete'), icon: 'delete', @@ -185,26 +153,6 @@ export class MobileAppTableConfigResolver { }); } - private configurationApp($event: Event, entity: MobileApp, afterAdd = false) { - if ($event) { - $event.stopPropagation(); - } - this.dialog.open(MobileAppConfigurationDialogComponent, { - disableClose: true, - panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], - data: { - afterAdd, - appSecret: entity.appSecret - } - }).afterClosed() - .subscribe(() => { - if (afterAdd) { - this.config.updateData(); - } - }); - } - private mobileStatus(status: MobileAppStatus): string { const translateKey = mobileAppStatusTranslations.get(status); let backgroundColor = 'rgba(25, 128, 56, 0.06)'; diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.html b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.html index 99460c8a6f..e74fb25b0b 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.html +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.html @@ -35,7 +35,7 @@ {{ 'mobile.mobile-package-max-length' | translate }} - {{ 'mobile.mobile-package-spaces' | translate }} + {{ 'mobile.mobile-package-pattern' | translate }} @@ -84,9 +84,13 @@
mobile.version-information
- + mobile.min-version + + + {{ 'mobile.invalid-version-pattern' | translate }} +
- + mobile.latest-version + + + {{ 'mobile.invalid-version-pattern' | translate }} +
diff --git a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts index 4552cf8348..98195c9c84 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/applications/mobile-app.component.ts @@ -64,20 +64,22 @@ export class MobileAppComponent extends EntityComponent { buildForm(entity: MobileApp): FormGroup { const form = this.fb.group({ pkgName: [entity?.pkgName ? entity.pkgName : '', [Validators.required, Validators.maxLength(255), - Validators.pattern(/^\S+$/)]], + Validators.pattern(/^[a-zA-Z][a-zA-Z\d_]*(?:\.[a-zA-Z][a-zA-Z\d_]*)+$/)]], platformType: [entity?.platformType ? entity.platformType : PlatformType.ANDROID], appSecret: [entity?.appSecret ? entity.appSecret : btoa(randomAlphanumeric(64)), [Validators.required, this.base64Format]], status: [entity?.status ? entity.status : MobileAppStatus.DRAFT], versionInfo: this.fb.group({ - minVersion: [entity?.versionInfo?.minVersion ? entity.versionInfo.minVersion : ''], + minVersion: [entity?.versionInfo?.minVersion ? entity.versionInfo.minVersion : '', Validators.pattern(/^\d+\.\d+\.\d+(-[a-zA-Z\d-.]+)?(\+[a-zA-Z\d-.]+)?$/)], minVersionReleaseNotes: [entity?.versionInfo?.minVersionReleaseNotes ? entity.versionInfo.minVersionReleaseNotes : ''], - latestVersion: [entity?.versionInfo?.latestVersion ? entity.versionInfo.latestVersion : ''], + latestVersion: [entity?.versionInfo?.latestVersion ? entity.versionInfo.latestVersion : '', Validators.pattern(/^\d+\.\d+\.\d+(-[a-zA-Z\d-.]+)?(\+[a-zA-Z\d-.]+)?$/)], latestVersionReleaseNotes: [entity?.versionInfo?.latestVersionReleaseNotes ? entity.versionInfo.latestVersionReleaseNotes : ''], }), storeInfo: this.fb.group({ - storeLink: [entity?.storeInfo?.storeLink ? entity.storeInfo.storeLink : ''], - sha256CertFingerprints: [entity?.storeInfo?.sha256CertFingerprints ? entity.storeInfo.sha256CertFingerprints : ''], - appId: [entity?.storeInfo?.appId ? entity.storeInfo.appId : ''], + storeLink: [entity?.storeInfo?.storeLink ? entity.storeInfo.storeLink : '', + Validators.pattern(/^https?:\/\/play\.google\.com\/store\/apps\/details\?id=[a-zA-Z0-9._]+$/)], + sha256CertFingerprints: [entity?.storeInfo?.sha256CertFingerprints ? entity.storeInfo.sha256CertFingerprints : '', + Validators.pattern(/^[A-Fa-f0-9]{2}(:[A-Fa-f0-9]{2}){1,31}$/)], + appId: [entity?.storeInfo?.appId ? entity.storeInfo.appId : '', Validators.pattern(/^\d{7,10}$/)], }), }); @@ -87,9 +89,11 @@ export class MobileAppComponent extends EntityComponent { if (value === PlatformType.ANDROID) { form.get('storeInfo.sha256CertFingerprints').enable({emitEvent: false}); form.get('storeInfo.appId').disable({emitEvent: false}); + form.get('storeInfo.storeLink').setValidators(Validators.pattern(/^https?:\/\/play\.google\.com\/store\/apps\/details\?id=[a-zA-Z0-9._]+$/)); } else if (value === PlatformType.IOS) { form.get('storeInfo.sha256CertFingerprints').disable({emitEvent: false}); form.get('storeInfo.appId').enable({emitEvent: false}); + form.get('storeInfo.storeLink').setValidators(Validators.pattern(/^https?:\/\/apps\.apple\.com\/[a-z]{2}\/app\/[\w-]+\/id\d{7,10}$/)); } form.get('storeInfo.storeLink').setValue('', {emitEvent: false}); }); @@ -99,12 +103,13 @@ export class MobileAppComponent extends EntityComponent { ).subscribe((value: MobileAppStatus) => { if (value !== MobileAppStatus.DRAFT) { form.get('storeInfo.storeLink').addValidators(Validators.required); - form.get('storeInfo.sha256CertFingerprints').addValidators(Validators.required); + form.get('storeInfo.sha256CertFingerprints') + .addValidators(Validators.required); form.get('storeInfo.appId').addValidators(Validators.required); } else { form.get('storeInfo.storeLink').clearValidators(); - form.get('storeInfo.sha256CertFingerprints').clearValidators(); - form.get('storeInfo.appId').clearValidators(); + form.get('storeInfo.sha256CertFingerprints').removeValidators(Validators.required); + form.get('storeInfo.appId').removeValidators(Validators.required); } form.get('storeInfo.storeLink').updateValueAndValidity({emitEvent: false}); form.get('storeInfo.sha256CertFingerprints').updateValueAndValidity({emitEvent: false}); diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/bundles.module.ts b/ui-ngx/src/app/modules/home/pages/mobile/bundes/bundles.module.ts index ebbb5e534e..c0385a8dd5 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/bundles.module.ts +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/bundles.module.ts @@ -27,6 +27,10 @@ import { AddMobilePageDialogComponent } from '@home/pages/mobile/bundes/layout/a import { CustomMobilePageComponent } from '@home/pages/mobile/bundes/layout/custom-mobile-page.component'; import { CustomMobilePagePanelComponent } from '@home/pages/mobile/bundes/layout/custom-mobile-page-panel.component'; import { DefaultMobilePagePanelComponent } from '@home/pages/mobile/bundes/layout/default-mobile-page-panel.component'; +import { + MobileAppConfigurationDialogComponent +} from '@home/pages/mobile/bundes/mobile-app-configuration-dialog.component'; + @NgModule({ declarations: [ @@ -38,6 +42,7 @@ import { DefaultMobilePagePanelComponent } from '@home/pages/mobile/bundes/layou CustomMobilePageComponent, CustomMobilePagePanelComponent, DefaultMobilePagePanelComponent, + MobileAppConfigurationDialogComponent, ], imports: [ CommonModule, diff --git a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.html b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.html index 705cc7031c..2bf38a94f1 100644 --- a/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.html +++ b/ui-ngx/src/app/modules/home/pages/mobile/bundes/layout/mobile-layout.component.html @@ -19,6 +19,7 @@
mobile.pages + {{ 'mobile.show-hidden-pages' | translate }}