diff --git a/npm/ng-packs/packages/core/src/lib/models/index.ts b/npm/ng-packs/packages/core/src/lib/models/index.ts index 4d4ed321c4..c38a38bfaf 100644 --- a/npm/ng-packs/packages/core/src/lib/models/index.ts +++ b/npm/ng-packs/packages/core/src/lib/models/index.ts @@ -3,6 +3,6 @@ export * from './common'; export * from './config'; export * from './dtos'; export * from './profile'; -export * from './replaceable-components'; +export * from './replaceable-components'; export * from './rest'; export * from './session'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html index a0fccaf9d3..2b0276ede8 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html @@ -140,6 +140,26 @@ +
+ + +
+
+ + +
diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index fa400d06f9..788953096f 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -60,6 +60,10 @@ export class TenantsComponent implements OnInit { sortKey = ''; + get hasSelectedTenant(): boolean { + return Boolean(this.selected.id); + } + get useSharedDatabase(): boolean { return this.defaultConnectionStringForm.get('useSharedDatabase').value; } @@ -115,9 +119,18 @@ export class TenantsComponent implements OnInit { } private createTenantForm() { - this.tenantForm = this.fb.group({ + const tenantForm = this.fb.group({ name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]], + adminEmailAddress: [null, [Validators.required, Validators.maxLength(256), Validators.email]], + adminPassword: [null, [Validators.required]], }); + + if (this.hasSelectedTenant) { + tenantForm.removeControl('adminEmailAddress'); + tenantForm.removeControl('adminPassword'); + } + + this.tenantForm = tenantForm; } private createDefaultConnectionStringForm() { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts b/npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts index 40a9c06d11..b7659e2a95 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/models/tenant-management.ts @@ -14,11 +14,14 @@ export namespace TenantManagement { } export interface AddRequest { + adminEmailAddress: string; + adminPassword: string; name: string; } - export interface UpdateRequest extends AddRequest { + export interface UpdateRequest { id: string; + name: string; } export interface DefaultConnectionStringRequest { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts b/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts index bb043377e6..27ee26b7ed 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts @@ -4,7 +4,7 @@ import { RestService, Rest, ABP } from '@abp/ng.core'; import { TenantManagement } from '../models/tenant-management'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class TenantManagementService { constructor(private rest: RestService) {} @@ -13,7 +13,7 @@ export class TenantManagementService { const request: Rest.Request = { method: 'GET', url: '/api/multi-tenancy/tenants', - params + params, }; return this.rest.request(request); @@ -22,7 +22,7 @@ export class TenantManagementService { getTenantById(id: string): Observable { const request: Rest.Request = { method: 'GET', - url: `/api/multi-tenancy/tenants/${id}` + url: `/api/multi-tenancy/tenants/${id}`, }; return this.rest.request(request); @@ -31,7 +31,7 @@ export class TenantManagementService { deleteTenant(id: string): Observable { const request: Rest.Request = { method: 'DELETE', - url: `/api/multi-tenancy/tenants/${id}` + url: `/api/multi-tenancy/tenants/${id}`, }; return this.rest.request(request); @@ -41,7 +41,7 @@ export class TenantManagementService { const request: Rest.Request = { method: 'POST', url: '/api/multi-tenancy/tenants', - body + body, }; return this.rest.request(request); @@ -54,10 +54,10 @@ export class TenantManagementService { const request: Rest.Request = { method: 'PUT', url, - body + body, }; - return this.rest.request(request); + return this.rest.request(request); } getDefaultConnectionString(id: string): Observable { @@ -66,18 +66,20 @@ export class TenantManagementService { const request: Rest.Request = { method: 'GET', responseType: Rest.ResponseType.Text, - url + url, }; return this.rest.request(request); } - updateDefaultConnectionString(payload: TenantManagement.DefaultConnectionStringRequest): Observable { + updateDefaultConnectionString( + payload: TenantManagement.DefaultConnectionStringRequest, + ): Observable { const url = `/api/multi-tenancy/tenants/${payload.id}/default-connection-string`; const request: Rest.Request = { method: 'PUT', url, - params: { defaultConnectionString: payload.defaultConnectionString } + params: { defaultConnectionString: payload.defaultConnectionString }, }; return this.rest.request(request); } @@ -87,7 +89,7 @@ export class TenantManagementService { const request: Rest.Request = { method: 'DELETE', - url + url, }; return this.rest.request(request); } diff --git a/templates/app/react-native/package.json b/templates/app/react-native/package.json index 09f9159570..14e799b900 100644 --- a/templates/app/react-native/package.json +++ b/templates/app/react-native/package.json @@ -24,7 +24,7 @@ "formik": "^2.1.2", "i18n-js": "^3.5.1", "lodash": "^4.17.15", - "native-base": "^2.13.8", + "native-base": "2.13.8", "prop-types": "^15.7.2", "react": "~16.9.0", "react-dom": "~16.9.0", diff --git a/templates/app/react-native/src/screens/CreateUpdateTenant/CreateUpdateTenantForm.js b/templates/app/react-native/src/screens/CreateUpdateTenant/CreateUpdateTenantForm.js index ff5801f914..45710eb594 100644 --- a/templates/app/react-native/src/screens/CreateUpdateTenant/CreateUpdateTenantForm.js +++ b/templates/app/react-native/src/screens/CreateUpdateTenant/CreateUpdateTenantForm.js @@ -1,8 +1,8 @@ import { Formik } from 'formik'; import i18n from 'i18n-js'; -import { Container, Content, Input, InputGroup, Label } from 'native-base'; +import { Container, Content, Input, InputGroup, Label, Item, Icon } from 'native-base'; import PropTypes from 'prop-types'; -import React, { useRef } from 'react'; +import React, { useRef, useState } from 'react'; import { StyleSheet } from 'react-native'; import * as Yup from 'yup'; import FormButtons from '../../components/FormButtons/FormButtons'; @@ -15,7 +15,10 @@ const validations = { function CreateUpdateTenantForm({ editingTenant = {}, submit, remove }) { const tenantNameRef = useRef(); + const adminEmailRef = useRef(); + const adminPasswordRef = useRef(); + const [showAdminPassword, setShowAdminPassword] = useState(false); const hasRemovePermission = usePermission('AbpTenantManagement.Tenants.Delete'); const onSubmit = values => { @@ -25,11 +28,25 @@ function CreateUpdateTenantForm({ editingTenant = {}, submit, remove }) { }); }; + const adminEmailAddressValidation = Yup.lazy(() => + Yup.string() + .required('AbpAccount::ThisFieldIsRequired.') + .email('AbpAccount::ThisFieldIsNotAValidEmailAddress.'), + ); + + const adminPasswordValidation = Yup.lazy(() => + Yup.string().required('AbpAccount::ThisFieldIsRequired.'), + ); + return ( + !editingTenant.id ? adminEmailRef.current._root.focus() : null + } + returnKeyType={!editingTenant.id ? 'next' : 'done'} onChangeText={handleChange('name')} onBlur={handleBlur('name')} value={values.name} /> {errors.name} + {!editingTenant.id ? ( + <> + + + adminPasswordRef.current._root.focus()} + returnKeyType="next" + onChangeText={handleChange('adminEmailAddress')} + onBlur={handleBlur('adminEmailAddress')} + value={values.adminEmailAddress} + /> + + {errors.adminEmailAddress} + + + + + setShowAdminPassword(!showAdminPassword)} + /> + + + {errors.adminPassword} + + ) : null}