diff --git a/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java b/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java index 0e63c2f3b..76ac0b1a1 100644 --- a/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java +++ b/maxkey-core/src/main/java/org/maxkey/entity/apps/Apps.java @@ -30,6 +30,8 @@ import org.apache.mybatis.jpa.persistence.JpaBaseEntity; import org.maxkey.constants.ConstsBoolean; import org.maxkey.crypto.Base64Utils; +import com.fasterxml.jackson.annotation.JsonFormat; + @Entity @Table(name = "MXK_APPS") public class Apps extends JpaBaseEntity implements Serializable { @@ -118,6 +120,7 @@ public class Apps extends JpaBaseEntity implements Serializable { /* * extendAttr */ + @JsonFormat(shape = JsonFormat.Shape.STRING) private int isExtendAttr; private String extendAttr; diff --git a/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java b/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java index 5d268edca..05d1b08d1 100644 --- a/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java +++ b/maxkey-core/src/main/java/org/maxkey/entity/apps/AppsOAuth20Details.java @@ -107,6 +107,7 @@ public class AppsOAuth20Details extends Apps { this.setAdapterId(application.getAdapterId()); this.setAdapterName(application.getAdapterName()); this.setFrequently(application.getFrequently()); + this.setStatus(application.getStatus()); this.clientSecret = baseClientDetails.getClientSecret(); this.scope = StringUtils diff --git a/maxkey-core/src/main/java/org/maxkey/persistence/repository/LoginRepository.java b/maxkey-core/src/main/java/org/maxkey/persistence/repository/LoginRepository.java index f1f569563..bc578e29e 100644 --- a/maxkey-core/src/main/java/org/maxkey/persistence/repository/LoginRepository.java +++ b/maxkey-core/src/main/java/org/maxkey/persistence/repository/LoginRepository.java @@ -60,7 +60,7 @@ public class LoginRepository { private static final String DEFAULT_USERINFO_SELECT_STATEMENT_USERNAME_MOBILE_EMAIL = "select * from mxk_userinfo where (username = ? or mobile = ? or email = ?) "; - private static final String DEFAULT_MYAPPS_SELECT_STATEMENT = "select distinct app.id,app.appname from mxk_apps app,mxk_role_permissions pm,mxk_roles r where app.id=pm.appid and pm.roleid=r.id and r.id in(%s)"; + private static final String DEFAULT_MYAPPS_SELECT_STATEMENT = "select distinct app.id,app.appname from mxk_apps app,mxk_role_permissions pm,mxk_roles r where app.id=pm.appid and app.status = 1 and pm.roleid=r.id and r.id in(%s)"; protected JdbcTemplate jdbcTemplate; diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/AppsMapper.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/AppsMapper.java index f54d0a1f1..8ff483b52 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/AppsMapper.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/AppsMapper.java @@ -37,7 +37,7 @@ public interface AppsMapper extends IJpaBaseMapper { public int updateApp(Apps app); - @Update("update mxk_apps set isextendattr=#{isExtendAttr}, extendattr=#{extendAttr} where id = #{id}") + @Update("update mxk_apps set extendattr=#{extendAttr} where id = #{id}") public int updateExtendAttr(Apps app); diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsCasDetailsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsCasDetailsMapper.xml index 4d4b01eb8..449b3e33a 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsCasDetailsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsCasDetailsMapper.xml @@ -8,7 +8,6 @@ mxk_apps_cas_details cd, mxk_apps app where app.instid = cd.instid - and app.status = 1 and cd.id = app.id and ( app.id = #{value} diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsFormBasedDetailsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsFormBasedDetailsMapper.xml index 498d7b5a3..22b7f9a50 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsFormBasedDetailsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsFormBasedDetailsMapper.xml @@ -12,6 +12,5 @@ and app.id = #{value} and fbd.id = #{value} and fbd.id = app.id - and status = 1 \ No newline at end of file diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsJwtDetailsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsJwtDetailsMapper.xml index 6d2488e6e..38522f589 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsJwtDetailsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsJwtDetailsMapper.xml @@ -11,7 +11,6 @@ where app.instid = jd.instid and app.id = #{value} and jd.id = #{value} - and status = 1 and jd.id = app.id diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml index 47ec80cf4..b89233c0a 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml @@ -143,8 +143,9 @@ sharedusername = #{sharedUsername}, sharedpassword = #{sharedPassword}, systemuserattr = #{systemUserAttr}, - userpropertys = #{userPropertys}, @@ -184,21 +185,26 @@ and p.instid = #{instId} and r.instid = #{instId} and app.visible != 0 - and ( - r.id='ROLE_ALL_USER' - or r.id in( - select - rm.roleid - from - mxk_role_member rm,mxk_userinfo u - where rm.memberid = u.id - - and u.id = #{userId} - - - and u.username = #{username} - - ) + and r.id in( + + select id as roleid + from mxk_roles + where rolecode = 'ROLE_ALL_USER' + + union + + + select + rm.roleid + from + mxk_role_member rm,mxk_userinfo u + where rm.memberid = u.id + + and u.id = #{userId} + + + and u.username = #{username} + ) and appname = #{appName} diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsSaml20DetailsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsSaml20DetailsMapper.xml index dd7151ab5..6537d9073 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsSaml20DetailsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsSaml20DetailsMapper.xml @@ -28,7 +28,6 @@ and app.id = #{value} and svd.id = #{value} and svd.id = app.id - and app.status = 1 \ No newline at end of file diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsTokenBasedDetailsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsTokenBasedDetailsMapper.xml index 3b4e62240..8e7db1a94 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsTokenBasedDetailsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsTokenBasedDetailsMapper.xml @@ -12,7 +12,6 @@ and app.id = #{value} and tbd.id = #{value} and tbd.id = app.id - and status = 1 \ No newline at end of file diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Apps.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Apps.ts index e2e5c7507..ca2b0a0b3 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Apps.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/Apps.ts @@ -64,6 +64,8 @@ export class Apps extends BaseEntity { Object.assign(this, data); if (this.status == 1) { this.switch_status = true; + } else { + this.switch_status = false; } this.isAdapter = `${data.isAdapter}`; this.isExtendAttr = `${data.isExtendAttr}`; diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsCasDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsCasDetails.ts index 08f14cf01..8573765e1 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsCasDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsCasDetails.ts @@ -35,6 +35,8 @@ export class AppsCasDetails extends Apps { super.init(data); if (this.status == 1) { this.switch_status = true; + } else { + this.switch_status = false; } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsExtendApiDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsExtendApiDetails.ts index c33fdf8de..22c41e7eb 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsExtendApiDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsExtendApiDetails.ts @@ -28,6 +28,8 @@ export class AppsExtendApiDetails extends Apps { super.init(data); if (this.status == 1) { this.switch_status = true; + } else { + this.switch_status = false; } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsFormBasedDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsFormBasedDetails.ts index 64cce0b86..e4d59c128 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsFormBasedDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsFormBasedDetails.ts @@ -19,32 +19,34 @@ import format from 'date-fns/format'; import { Apps } from './Apps'; export class AppsFormBasedDetails extends Apps { - redirectUri!: String; - usernameMapping!: String; - passwordMapping!: String; - passwordAlgorithm!: String; - authorizeView!: String; + redirectUri!: String; + usernameMapping!: String; + passwordMapping!: String; + passwordAlgorithm!: String; + authorizeView!: String; - constructor() { - super(); - this.usernameMapping = 'username'; - this.passwordMapping = 'password'; - this.passwordAlgorithm = 'NONE'; - } + constructor() { + super(); + this.usernameMapping = 'username'; + this.passwordMapping = 'password'; + this.passwordAlgorithm = 'NONE'; + } - override init(data: any): void { - Object.assign(this, data); - super.init(data); - if (this.status == 1) { - this.switch_status = true; - } + override init(data: any): void { + Object.assign(this, data); + super.init(data); + if (this.status == 1) { + this.switch_status = true; + } else { + this.switch_status = false; } + } - override trans(): void { - if (this.switch_status) { - this.status = 1; - } else { - this.status = 0; - } + override trans(): void { + if (this.switch_status) { + this.status = 1; + } else { + this.status = 0; } + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsJwtDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsJwtDetails.ts index b3b27283d..c6148ca20 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsJwtDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsJwtDetails.ts @@ -19,41 +19,43 @@ import format from 'date-fns/format'; import { Apps } from './Apps'; export class AppsJwtDetails extends Apps { - subject!: String; - issuer!: String; - audience!: String; + subject!: String; + issuer!: String; + audience!: String; - redirectUri!: String; - tokenType!: String; - jwtName!: String; - algorithm!: String; - algorithmKey!: String; - encryptionMethod!: String; - signature!: String; - signatureKey!: String; - expires!: Number; + redirectUri!: String; + tokenType!: String; + jwtName!: String; + algorithm!: String; + algorithmKey!: String; + encryptionMethod!: String; + signature!: String; + signatureKey!: String; + expires!: Number; - constructor() { - super(); - this.expires = 300; - this.jwtName = 'jwt'; - this.subject = 'username'; - this.tokenType = 'POST'; + constructor() { + super(); + this.expires = 300; + this.jwtName = 'jwt'; + this.subject = 'username'; + this.tokenType = 'POST'; + } + + override init(data: any): void { + Object.assign(this, data); + super.init(data); + if (this.status == 1) { + this.switch_status = true; + } else { + this.switch_status = false; } + } - override init(data: any): void { - Object.assign(this, data); - super.init(data); - if (this.status == 1) { - this.switch_status = true; - } - } - - override trans(): void { - if (this.switch_status) { - this.status = 1; - } else { - this.status = 0; - } + override trans(): void { + if (this.switch_status) { + this.status = 1; + } else { + this.status = 0; } + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsOauth20Details.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsOauth20Details.ts index 73c5e9477..814682fda 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsOauth20Details.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsOauth20Details.ts @@ -81,6 +81,8 @@ export class AppsOauth20Details extends Apps { super.init(data); if (this.status == 1) { this.switch_status = true; + } else { + this.switch_status = false; } if (this.approvalPrompt == '') { } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsSamlDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsSamlDetails.ts index 92cd215dd..d996d6585 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsSamlDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsSamlDetails.ts @@ -19,86 +19,88 @@ import format from 'date-fns/format'; import { Apps } from './Apps'; export class AppsSamlDetails extends Apps { - certIssuer!: String; + certIssuer!: String; - certSubject!: String; + certSubject!: String; - certExpiration!: String; + certExpiration!: String; - signature!: String; + signature!: String; - digestMethod!: String; + digestMethod!: String; - entityId!: String; + entityId!: String; - spAcsUrl!: String; + spAcsUrl!: String; - issuer!: String; + issuer!: String; - audience!: String; + audience!: String; - nameidFormat!: String; + nameidFormat!: String; - validityInterval!: String; - /** - * Redirect-Post Post-Post IdpInit-Post Redirect-PostSimpleSign - * Post-PostSimpleSign IdpInit-PostSimpleSign - */ + validityInterval!: String; + /** + * Redirect-Post Post-Post IdpInit-Post Redirect-PostSimpleSign + * Post-PostSimpleSign IdpInit-PostSimpleSign + */ - binding!: String; + binding!: String; - /** - * yes or no - */ + /** + * yes or no + */ - encrypted!: String; - /** - * metadata_file metadata_url or certificate - */ - fileType!: String; + encrypted!: String; + /** + * metadata_file metadata_url or certificate + */ + fileType!: String; - metaUrl!: String; + metaUrl!: String; - metaFileId!: String; + metaFileId!: String; - /** - * original , uppercase or lowercase - */ + /** + * original , uppercase or lowercase + */ - nameIdConvert!: String; + nameIdConvert!: String; - nameIdSuffix!: String; + nameIdSuffix!: String; - constructor() { - super(); - this.fileType = 'certificate'; - this.validityInterval = '300'; - this.nameidFormat = 'persistent'; - this.nameIdConvert = 'original'; - this.signature = 'RSAwithSHA1'; - this.digestMethod = 'SHA1'; - this.encrypted = 'no'; - this.binding = 'Redirect-Post'; + constructor() { + super(); + this.fileType = 'certificate'; + this.validityInterval = '300'; + this.nameidFormat = 'persistent'; + this.nameIdConvert = 'original'; + this.signature = 'RSAwithSHA1'; + this.digestMethod = 'SHA1'; + this.encrypted = 'no'; + this.binding = 'Redirect-Post'; + } + + override init(data: any): void { + Object.assign(this, data); + super.init(data); + this.fileType = 'certificate'; + this.metaUrl = ''; + if (this.category == null || this.category == '') { + this.category = 'NONE'; } - - override init(data: any): void { - Object.assign(this, data); - super.init(data); - this.fileType = 'certificate'; - this.metaUrl = ''; - if (this.category == null || this.category == '') { - this.category = 'NONE'; - } - if (this.status == 1) { - this.switch_status = true; - } + if (this.status == 1) { + this.switch_status = true; + } else { + this.switch_status = false; } + } - override trans(): void { - if (this.switch_status) { - this.status = 1; - } else { - this.status = 0; - } + override trans(): void { + if (this.switch_status) { + this.status = 1; + } else { + this.status = 0; } + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsTokenBasedDetails.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsTokenBasedDetails.ts index 446ff69bc..8c3225388 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsTokenBasedDetails.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/AppsTokenBasedDetails.ts @@ -39,6 +39,8 @@ export class AppsTokenBasedDetails extends Apps { super.init(data); if (this.status == 1) { this.switch_status = true; + } else { + this.switch_status = false; } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/ExtraAttr.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/ExtraAttr.ts new file mode 100644 index 000000000..aff70cb00 --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/entity/ExtraAttr.ts @@ -0,0 +1,27 @@ +/* + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import format from 'date-fns/format'; + +import { BaseEntity } from './BaseEntity'; + +export class ExtraAttr { + id!: string; + attr!: string; + type!: string; + value!: string; + constructor() { } +} diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.html index 78f0cc926..6c2760813 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -245,6 +269,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.ts index f2a4689e3..8d2eeac07 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-basic-details-editer/app-basic-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { Apps } from '../../../entity/Apps'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,10 @@ export class AppBasicDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modal: NzModalRef, private appsService: AppsService, @@ -94,6 +99,7 @@ export class AppBasicDetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsService.init().subscribe(res => { @@ -173,4 +179,86 @@ export class AppBasicDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.html index e20392287..33273c407 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -297,6 +321,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.ts index 4745ef5d8..615a92a6a 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-cas-details-editer/app-cas-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { AppsCasDetails } from '../../../entity/AppsCasDetails'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsCasDetailsService } from '../../../service/apps-cas-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,9 @@ export class AppCasDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; constructor( private modal: NzModalRef, private modalService: NzModalService, @@ -95,6 +99,7 @@ export class AppCasDetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsCasDetailsService.init().subscribe(res => { @@ -174,4 +179,86 @@ export class AppCasDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.html index e2bdb9ebe..4432cd91d 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -321,6 +345,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.ts index 98f2adcbb..5c58781aa 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-extend-api-details-editer/app-extend-api-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { Apps } from '../../../entity/Apps'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsExtendApiDetailsService } from '../../../service/apps-extend-api-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,10 @@ export class AppExtendApiDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modalRef: NzModalRef, private modalService: NzModalService, @@ -86,6 +91,7 @@ export class AppExtendApiDetailsEditerComponent implements OnInit { if (this.isEdit) { this.appsExtendApiDetailsService.get(`${this.id}`).subscribe(res => { this.form.model.init(res.data); + this.initExtraAttr(res.data); }); } else { this.appsExtendApiDetailsService.init().subscribe(res => { @@ -173,4 +179,86 @@ export class AppExtendApiDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.html index 880195df8..0a843500d 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -370,6 +394,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.ts index bb388f40e..f315e1a42 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-form-based-details-editer/app-form-based-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { AppsFormBasedDetails } from '../../../entity/AppsFormBasedDetails'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsFormBasedDetailsService } from '../../../service/apps-form-based-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,10 @@ export class AppFormBasedDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modalRef: NzModalRef, private modalService: NzModalService, @@ -95,6 +100,7 @@ export class AppFormBasedDetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsFormBasedDetailsService.init().subscribe(res => { @@ -173,4 +179,86 @@ export class AppFormBasedDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.html index 555343b73..ea7b724fa 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -411,6 +435,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.ts index f10c79ea0..a0e30fcb9 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-jwt-details-editer/app-jwt-details-editer.component.ts @@ -25,6 +25,7 @@ import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { AppsJwtDetails } from 'src/app/entity/AppsJwtDetails'; import { Apps } from '../../../entity/Apps'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsJwtDetailsService } from '../../../service/apps-jwt-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -71,6 +72,10 @@ export class AppJwtDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modalRef: NzModalRef, private appsJwtDetailsService: AppsJwtDetailsService, @@ -96,6 +101,7 @@ export class AppJwtDetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsJwtDetailsService.init().subscribe(res => { @@ -183,4 +189,86 @@ export class AppJwtDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.html index 95c1d4412..559219fde 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.html @@ -138,6 +138,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -490,6 +514,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.ts index 0f09a4157..3ceb0cbfe 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-oauth20-details-editer/app-oauth20-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { AppsOauth20Details } from '../../../entity/AppsOauth20Details'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsOauth20DetailsService } from '../../../service/apps-oauth20-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,10 @@ export class AppOauth20DetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modal: NzModalRef, private modalService: NzModalService, @@ -96,6 +101,7 @@ export class AppOauth20DetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsOauth20DetailsService.init().subscribe(res => { @@ -193,4 +199,86 @@ export class AppOauth20DetailsEditerComponent implements OnInit { } ); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.html index f84c8d32f..76b5a711e 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.html @@ -129,6 +129,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -473,6 +497,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.ts index 8731fb6f0..2caf1bd41 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-saml20-details-editer/app-saml20-details-editer.component.ts @@ -24,6 +24,7 @@ import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { AppsSamlDetails } from '../../../entity/AppsSamlDetails'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsSamlDetailsService } from '../../../service/apps-saml-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -70,6 +71,10 @@ export class AppSaml20DetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modal: NzModalRef, private modalService: NzModalService, @@ -95,6 +100,7 @@ export class AppSaml20DetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsSamlDetailsService.init().subscribe(res => { @@ -183,4 +189,86 @@ export class AppSaml20DetailsEditerComponent implements OnInit { } ); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.html index a3832e74f..01f269f13 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.html @@ -135,6 +135,30 @@ +
+ + {{ 'mxk.text.status' | i18n }} + + + + + + + + + {{ 'mxk.apps.isExtendAttr' | i18n }} + + + + + + + + +
@@ -338,6 +362,48 @@
+ + + + + + {{ 'mxk.custom.extraAttr.attr' | i18n }} + {{ 'mxk.custom.extraAttr.type' | i18n }} + {{ 'mxk.custom.extraAttr.value' | i18n }} + {{ 'mxk.text.action' | i18n }} + + + + + + {{ data.attr }} + {{ data.type }} + {{ data.value }} + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.ts index 5f8624387..e8f67751d 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/app-token-based-details-editer/app-token-based-details-editer.component.ts @@ -25,6 +25,7 @@ import { NzUploadFile, NzUploadChangeParam } from 'ng-zorro-antd/upload'; import { Apps } from '../../../entity/Apps'; import { AppsTokenBasedDetails } from '../../../entity/AppsTokenBasedDetails'; +import { ExtraAttr } from '../../../entity/ExtraAttr'; import { AppsTokenBasedDetailsService } from '../../../service/apps-token-based-details.service'; import { AppsService } from '../../../service/apps.service'; import { SelectAdaptersComponent } from '../../config/adapters/select-adapters/select-adapters.component'; @@ -71,6 +72,10 @@ export class AppTokenBasedDetailsEditerComponent implements OnInit { previewImage: string | ArrayBuffer | undefined | null = ''; previewVisible = false; + extraAttrIndex: number = 1; + extraAttrEditCache: { [key: string]: { edit: boolean; data: ExtraAttr } } = {}; + extraAttrListOfData: ExtraAttr[] = []; + constructor( private modalRef: NzModalRef, private modalService: NzModalService, @@ -96,6 +101,7 @@ export class AppTokenBasedDetailsEditerComponent implements OnInit { url: this.previewImage } ]; + this.initExtraAttr(res.data); }); } else { this.appsTokenBasedDetailsService.init().subscribe(res => { @@ -182,4 +188,86 @@ export class AppTokenBasedDetailsEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + initExtraAttr(extraData: any): void { + if (extraData.extendAttr != null && extraData.extendAttr != '') { + let extraAttrDataArray = JSON.parse(extraData.extendAttr); + console.log(extraAttrDataArray); + const data = []; + while (this.extraAttrIndex <= extraAttrDataArray.length) { + let extraAttrData = extraAttrDataArray[this.extraAttrIndex - 1]; + data.push({ + id: `${this.extraAttrIndex}`, + attr: extraAttrData.attr, + type: extraAttrData.type, + value: extraAttrData.value + }); + this.extraAttrIndex++; + } + this.extraAttrListOfData = data; + this.updateExtraAttrEditCache(); + } + } + + addExtraAttrRow(e: MouseEvent): void { + e.preventDefault(); + this.extraAttrListOfData = [ + ...this.extraAttrListOfData, + { + id: `${this.extraAttrIndex}`, + attr: `Attr ${this.extraAttrIndex}`, + type: 'string', + value: `value ${this.extraAttrIndex}` + } + ]; + this.updateExtraAttrEditCache(); + this.startExtraAttrEdit(`${this.extraAttrIndex}`); + this.extraAttrIndex++; + } + + deleteExtraAttrRow(id: string): void { + this.extraAttrListOfData = this.extraAttrListOfData.filter(d => d.id !== id); + this.submitExtraAttr(); + } + + startExtraAttrEdit(id: string): void { + this.extraAttrEditCache[id].edit = true; + } + + cancelExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + console.log(index); + this.extraAttrEditCache[id] = { + data: { ...this.extraAttrListOfData[index] }, + edit: false + }; + } + + saveExtraAttrEdit(id: string): void { + const index = this.extraAttrListOfData.findIndex(item => item.id === id); + Object.assign(this.extraAttrListOfData[index], this.extraAttrEditCache[id].data); + this.extraAttrEditCache[id].edit = false; + this.submitExtraAttr(); + } + + submitExtraAttr() { + let extraAttrString = JSON.stringify(this.extraAttrListOfData); + this.appsService.updateExtendAttr({ id: this.form.model.id, extendAttr: extraAttrString }).subscribe(res => { + if (res.code == 0) { + this.msg.success(this.i18n.fanyi('mxk.alert.update.success')); + } else { + this.msg.error(this.i18n.fanyi('mxk.alert.update.error')); + } + this.cdr.detectChanges(); + }); + } + + updateExtraAttrEditCache(): void { + this.extraAttrListOfData.forEach(item => { + this.extraAttrEditCache[item.id] = { + edit: false, + data: { ...item } + }; + }); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/apps.service.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/apps.service.ts index fb3586091..def33de7e 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/apps.service.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/apps.service.ts @@ -1,19 +1,18 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; @@ -22,6 +21,7 @@ import { Observable } from 'rxjs'; import { Apps } from '../entity/Apps'; import { Message } from '../entity/Message'; +import { PageResults } from '../entity/PageResults'; import { BaseService } from './base.service'; @Injectable({ @@ -43,4 +43,8 @@ export class AppsService extends BaseService { generateKeys(id: String, type: String): Observable> { return this.getByParams({}, `/apps/generate/secret/${type}?id=${id}`); } + + updateExtendAttr(params: NzSafeAny): Observable> { + return this.http.post>(`${this.server.urls.base}/updateExtendAttr`, params); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json index 30118d3e5..cbda82d27 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json @@ -265,6 +265,7 @@ "apps": { "tab.basic": "Basic", "tab.extra": "Extra", + "tab.custom": "Custom", "extendapi.tab": "API", "resources":"Resources", "id": "App Id", @@ -453,6 +454,13 @@ "oauth.connect.userInfoResponse": "UserInfoResponse" }, + "custom":{ + "extraAttr":{ + "attr":"Attribute", + "type":"Type", + "value":"Value" + } + }, "roles": { "name": "Role Name", "type": { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json index c596cf8d9..92c55dd9c 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json @@ -266,6 +266,7 @@ "apps": { "tab.basic": "基本信息", "tab.extra": "扩展信息", + "tab.custom": "自定义属性", "extendapi.tab": "API配置", "resources":"资源", "id": "应用编码", @@ -451,6 +452,13 @@ "oauth.connect.issuer": "签发人(Issuer)", "oauth.connect.userInfoResponse": "用户接口类型" }, + "custom":{ + "extraAttr":{ + "attr":"属性", + "type":"类型", + "value":"值" + } + }, "roles": { "name": "角色名称", "type": { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-TW.json b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-TW.json index 88bfcc4a2..4f4019439 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-TW.json +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-TW.json @@ -267,6 +267,7 @@ "apps": { "tab.basic": "基本信息", "tab.extra": "擴展信息", + "tab.custom": "自訂屬性", "extendapi.tab": "API配置", "resources":"資源", "id": "應用編碼", @@ -452,6 +453,13 @@ "oauth.connect.issuer": "簽發人(Issuer)", "oauth.connect.userInfoResponse": "用戶接口類型" }, + "custom":{ + "extraAttr":{ + "attr":"屬性", + "type":"類型", + "value":"值" + } + }, "roles": { "name": "角色名稱", "type": { diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/apps/contorller/ApplicationsController.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/apps/contorller/ApplicationsController.java index 0ca6d934f..cd1f5daab 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/apps/contorller/ApplicationsController.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/apps/contorller/ApplicationsController.java @@ -22,8 +22,6 @@ import org.apache.mybatis.jpa.persistence.JpaPageResults; import org.maxkey.authn.annotation.CurrentUser; import org.maxkey.constants.ConstsProtocols; import org.maxkey.crypto.ReciprocalUtils; -import org.maxkey.entity.ExtraAttr; -import org.maxkey.entity.ExtraAttrs; import org.maxkey.entity.Message; import org.maxkey.entity.UserInfo; import org.maxkey.entity.apps.Apps; @@ -134,28 +132,11 @@ public class ApplicationsController extends BaseAppContorller { } } - - @RequestMapping(value = { "/forwardAppsExtendAttr/{id}" }) - public ResponseEntity forwardExtendAttr(@PathVariable("id") String id) { - Apps apps = appsService.get(id); - return new Message(apps).buildResponse(); - } - @ResponseBody @RequestMapping(value = { "/updateExtendAttr" }) - public ResponseEntity updateExtendAttr(@ModelAttribute("application") Apps application,@ModelAttribute("extraAttrs") ExtraAttr extraAttr) { - if(extraAttr.getAttr()!=null){ - String []attributes=extraAttr.getAttr().split(","); - String []attributeType=extraAttr.getType().split(","); - String []attributeValue=extraAttr.getValue().split(","); - ExtraAttrs extraAttrs=new ExtraAttrs(); - for(int i=0;i updateExtendAttr(@RequestBody Apps app) { + _logger.debug("-updateExtendAttr id : {} , ExtendAttr : {}" , app.getId(),app.getExtendAttr()); + if (appsService.updateExtendAttr(app)) { return new Message(Message.SUCCESS).buildResponse(); } else { return new Message(Message.FAIL).buildResponse();