Browse Source

Merge pull request #6908 in DEC/decision-webui-dcm from release/11.0 to final/11.0

* commit 'a8d96361bb2fb549440bf43b2f51075e82cf92a3':
  Revert "REPORT-86413 feat: 数据连接适配平台加解密改造"
  REPORT-89173 fix: 适配下接口
  无JIRA任务,处理下类型
  REPORT-89173 fix: JNDI入口屏蔽
  REPORT-86413 feat: 数据连接适配平台加解密改造
  REPORT-87662 feat:tbase适配tdsql的更改
  REPORT-87662 feat:数据连接添加版本选择
  REPORT-86591 fix:tdsql数据库更名
final/11.0
superman 2 years ago
parent
commit
ac993f728d
  1. 10
      src/modules/app.service.ts
  2. 6
      src/modules/app.typings.d.ts
  3. 4
      src/modules/components/collapse/collapse.ts
  4. 3
      src/modules/constants/constant.ts
  5. 5
      src/modules/crud/api.ts
  6. 5
      src/modules/crud/decision.api.ts
  7. 4
      src/modules/crud/design.api.ts
  8. 22
      src/modules/pages/connection/connection_jdbc/connection_jdbc.ts
  9. 23
      src/modules/pages/database/database.model.ts
  10. 13
      src/modules/pages/database/database.ts
  11. 14
      src/modules/pages/maintain/components/driverselector/driverselector.model.ts
  12. 11
      src/modules/pages/maintain/components/driverselector/driverselector.ts
  13. 82
      src/modules/pages/maintain/forms/components/form.jdbc.ts

10
src/modules/app.service.ts

@ -1,7 +1,7 @@
import { DATA_BASE_TYPES, DATA_BASE_TYPES_OTHER, DESIGN_DRIVER_TYPE, OTHER_JDBC } from '@constants/constant'; import { DATA_BASE_TYPES, DATA_BASE_TYPES_OTHER, DESIGN_DRIVER_TYPE, OTHER_JDBC } from '@constants/constant';
import { DatabaseType } from './app.typings'; import { DatabaseType } from './app.typings';
import { Connection } from './crud/crud.typings'; import { Connection } from './crud/crud.typings';
export function getAllDatabaseTypes():DatabaseType[] { export function getAllDatabaseTypes(): DatabaseType[] {
return [ return [
...DATA_BASE_TYPES, ...DATA_BASE_TYPES,
...BI.Providers.getProvider('dec.connection.provider.datebase').customDatabaseType.map(item => { ...BI.Providers.getProvider('dec.connection.provider.datebase').customDatabaseType.map(item => {
@ -49,7 +49,7 @@ export function getJdbcDatabaseType(database: string, driver: string): DatabaseT
return databaseType; return databaseType;
} }
export function resolveUrlInfo (url: string, database?: string) { export function resolveUrlInfo(url: string, database?: string) {
if (BI.isNull(url)) return {}; if (BI.isNull(url)) return {};
return BI.Providers.getProvider('dec.connection.provider.datebase').getJdbcResolveByType(database)(url) || { return BI.Providers.getProvider('dec.connection.provider.datebase').getJdbcResolveByType(database)(url) || {
@ -70,9 +70,9 @@ export function splitUrl(host: string, port: string, database: string, baseUrl:
// https://work.fineres.com/browse/REPORT-72078 // https://work.fineres.com/browse/REPORT-72078
if (baseUrl.startsWith('jdbc:informix-sqli')) { if (baseUrl.startsWith('jdbc:informix-sqli')) {
return baseUrl.replace('hostname', host) return baseUrl.replace('hostname', host)
.replace(':port', port ? `:${port}` : '') .replace(':port', port ? `:${port}` : '')
.replace('database', database) .replace('database', database)
.replace(':INFORMIXSERVER={server}',''); .replace(':INFORMIXSERVER={server}', '');
} }
return baseUrl.replace('hostname', host).replace(':port', port ? `:${port}` : '') return baseUrl.replace('hostname', host).replace(':port', port ? `:${port}` : '')

6
src/modules/app.typings.d.ts vendored

@ -8,9 +8,13 @@ export interface DatabaseType {
internal: boolean; internal: boolean;
type: string; type: string;
hasSchema?: boolean; hasSchema?: boolean;
hasSchemas?: {
[key: string]: boolean;
};
kerberos?: boolean; kerberos?: boolean;
iconUrl?: string; iconUrl?: string;
versions?: string[];
urls?: { urls?: {
[key: string]: string; [key: string]: string;
} };
} }

4
src/modules/components/collapse/collapse.ts

@ -64,4 +64,8 @@ export class Collapse extends BI.BasicButton {
doClick() { doClick() {
this.store.setCollapse(!this.model.isCollapse); this.store.setCollapse(!this.model.isCollapse);
} }
setCollapse(v: boolean) {
this.store.setCollapse(v);
}
} }

3
src/modules/constants/constant.ts

@ -704,10 +704,11 @@ export const DATA_BASE_TYPES = [
kerberos: false, kerberos: false,
}, },
{ {
text: BI.i18nText('Dec-Dcm_Connection_TDSQL'), text: 'TDSQL',
databaseType: 'tdsql', databaseType: 'tdsql',
driver: 'org.postgresql.Driver', driver: 'org.postgresql.Driver',
url: 'jdbc:postgresql://hostname:port/database', url: 'jdbc:postgresql://hostname:port/database',
versions: ['pgsql'],
commonly: false, commonly: false,
internal: true, internal: true,
type: 'jdbc', type: 'jdbc',

5
src/modules/crud/api.ts

@ -93,4 +93,9 @@ export interface Api {
* *
*/ */
getHyperlink(name: string): string; getHyperlink(name: string): string;
/**
* JNDI数据库类型可用状态
*/
getJNDIDatabaseStatus(): Promise<{ data?: boolean }>;
} }

5
src/modules/crud/decision.api.ts

@ -136,6 +136,11 @@ export class DecisionApi implements Api {
return requestPut(`kdc/timeout?timeout=${value}`, {}) return requestPut(`kdc/timeout?timeout=${value}`, {})
} }
// 获取当前lic是否可以使用JNDI数据库类型
getJNDIDatabaseStatus(): Promise<{ data?: boolean }> {
return requestGet('databasetype/limit', {});
}
private sendEditStatusEvent(name: string, type: string): Promise<SocketResult> { private sendEditStatusEvent(name: string, type: string): Promise<SocketResult> {
return new Promise(resolve => { return new Promise(resolve => {
if (Dec && Dec.socket.connected) { if (Dec && Dec.socket.connected) {

4
src/modules/crud/design.api.ts

@ -88,4 +88,8 @@ export class DesignApi implements Api {
// 设计器获取超链 // 设计器获取超链
return ''; return '';
} }
getJNDIDatabaseStatus() {
return Promise.resolve({ data: true });
}
} }

22
src/modules/pages/connection/connection_jdbc/connection_jdbc.ts

@ -52,7 +52,8 @@ export class ConnectionJdbc extends BI.Widget {
sslClientCertificate, sslClientCertificate,
} = connectionData; } = connectionData;
const databaseType = getJdbcDatabaseType(database, driver); const databaseType = getJdbcDatabaseType(database, driver);
const { host, port, databaseName } = resolveUrlInfo(url, database); const { host, port, databaseName, version } = resolveUrlInfo(url, database);
this.version = !BI.isUndefined(databaseType.versions) ? (version ?? databaseType.versions[0]) : version;
const { hgap, vgap } = CONNECTION_LAYOUT; const { hgap, vgap } = CONNECTION_LAYOUT;
return { return {
@ -62,6 +63,13 @@ export class ConnectionJdbc extends BI.Widget {
items: [ items: [
{ {
type: FormItem.xtype, type: FormItem.xtype,
name: BI.i18nText('Dec-Basic_Version'),
invisible: BI.isUndefined(this.version),
value: BI.i18nText('Dec-Migration_Database_Version', this.version),
},
{
type: FormItem.xtype,
_tgap: BI.isUndefined(this.version) ? vgap : 0,
name: BI.i18nText('Dec-Dcm_Connection_Form_Driver'), name: BI.i18nText('Dec-Dcm_Connection_Form_Driver'),
value: BI.isKey(driverSource) ? `${driver} (${driverSource})` : driver, value: BI.isKey(driverSource) ? `${driver} (${driverSource})` : driver,
}, },
@ -82,13 +90,13 @@ export class ConnectionJdbc extends BI.Widget {
}, },
authType authType
? { ? {
type: FormItem.xtype, type: FormItem.xtype,
name: BI.i18nText('Dec-Dcm_Connection_Form_AuthType'), name: BI.i18nText('Dec-Dcm_Connection_Form_AuthType'),
value: authType, value: authType,
} }
: { : {
type: BI.Layout.xtype, type: BI.Layout.xtype,
}, },
{ {
type: FormItem.xtype, type: FormItem.xtype,
name: authType ? BI.i18nText('Dec-Dcm_Connection_Form_Principal') : BI.i18nText('Dec-Dcm_Connection_Form_UserName'), name: authType ? BI.i18nText('Dec-Dcm_Connection_Form_Principal') : BI.i18nText('Dec-Dcm_Connection_Form_UserName'),

23
src/modules/pages/database/database.model.ts

@ -2,10 +2,12 @@ import { model, Model } from '@core/core';
import { AppModel } from 'src/modules/app.model'; import { AppModel } from 'src/modules/app.model';
import { getAllDatabaseTypes } from '../../app.service'; import { getAllDatabaseTypes } from '../../app.service';
import { DatabaseType } from '../../app.typings'; import { DatabaseType } from '../../app.typings';
import { connectionType } from '@constants/env';
import { OTHER_JDBC } from '@constants/constant';
@model() @model()
export class DatebaseModel extends Model<{ export class DatebaseModel extends Model<{
types : { types: {
filter: AppModel['TYPE']['filter']; filter: AppModel['TYPE']['filter'];
datebaseTypeSelected: AppModel['TYPE']['datebaseTypeSelected']; datebaseTypeSelected: AppModel['TYPE']['datebaseTypeSelected'];
}, },
@ -20,20 +22,30 @@ export class DatebaseModel extends Model<{
isInternal: true, isInternal: true,
isPlugin: true, isPlugin: true,
datebaseTypes: getAllDatabaseTypes().filter(item => item.commonly), datebaseTypes: getAllDatabaseTypes().filter(item => item.commonly),
isJNDILimit: false,
}; };
} }
computed = {
otherDatabases: () => {
return this.model.isJNDILimit
? [OTHER_JDBC]
: [OTHER_JDBC, connectionType.JNDI];
}
}
actions = { actions = {
setSearch:(search: string) => { setSearch: (search: string) => {
this.model.search = search; this.model.search = search;
}, },
setFilter:(filter: string) => { setFilter: (filter: string) => {
this.model.filter = filter; this.model.filter = filter;
}, },
setDatebaseTypes: (datebaseTypes: DatabaseType[]) => { setDatebaseTypes: (datebaseTypes: DatabaseType[]) => {
this.model.datebaseTypes = datebaseTypes; this.model.datebaseTypes = datebaseTypes;
this.model.datebaseTypeSelected = ''; this.model.datebaseTypeSelected = '';
}, },
setInternal:(isInternal: boolean) => { setInternal: (isInternal: boolean) => {
this.model.isInternal = isInternal; this.model.isInternal = isInternal;
}, },
setPlugin: (isPlugin: boolean) => { setPlugin: (isPlugin: boolean) => {
@ -42,5 +54,8 @@ export class DatebaseModel extends Model<{
setDatebaseTypeSelected(datebaseType: string) { setDatebaseTypeSelected(datebaseType: string) {
this.model.datebaseTypeSelected = datebaseType; this.model.datebaseTypeSelected = datebaseType;
}, },
setJNDILimit: (v: boolean) => {
this.model.isJNDILimit = v;
},
} }
} }

13
src/modules/pages/database/database.ts

@ -6,6 +6,10 @@ import { connectionType } from '@constants/env';
import { DatebaseType } from './database_type/database_type'; import { DatebaseType } from './database_type/database_type';
import { getAllDatabaseTypes } from '../../app.service'; import { getAllDatabaseTypes } from '../../app.service';
import { ButtonGroup, MultiSelectItem, SearchEditor } from '@fui/core'; import { ButtonGroup, MultiSelectItem, SearchEditor } from '@fui/core';
import { ApiFactory } from 'src/modules/crud/apiFactory';
const api = new ApiFactory().create();
@shortcut() @shortcut()
@store(DatebaseModel) @store(DatebaseModel)
export class Datebase extends BI.Widget { export class Datebase extends BI.Widget {
@ -65,6 +69,7 @@ export class Datebase extends BI.Widget {
mounted() { mounted() {
this.store.setFilter(DATEBASE_FILTER_TYPE.COMMONLY); this.store.setFilter(DATEBASE_FILTER_TYPE.COMMONLY);
this.store.setDatebaseTypeSelected(''); this.store.setDatebaseTypeSelected('');
this.getDatabaseTypeLimit();
} }
render() { render() {
@ -250,11 +255,17 @@ export class Datebase extends BI.Widget {
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.commonly)); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.commonly));
break; break;
case DATEBASE_FILTER_TYPE.OTHER: case DATEBASE_FILTER_TYPE.OTHER:
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type === connectionType.JNDI || item.type === OTHER_JDBC)); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => this.model.otherDatabases.includes(item.type)));
break; break;
default: default:
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== OTHER_JDBC)); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== OTHER_JDBC));
break; break;
} }
} }
// 获取JNDI
private async getDatabaseTypeLimit() {
const result = await api.getJNDIDatabaseStatus();
this.store.setJNDILimit(result.data);
}
} }

14
src/modules/pages/maintain/components/driverselector/driverselector.model.ts

@ -87,6 +87,12 @@ export class DriverSelectorModel extends Model {
changeDriverSource: driverTypeComboValue => { changeDriverSource: driverTypeComboValue => {
this.model.driverSource = driverTypeComboValue === 'default' ? '' : this.model.driverSource; this.model.driverSource = driverTypeComboValue === 'default' ? '' : this.model.driverSource;
}, },
setDefaultDrivers: version => {
const defaultDrivers = this.getDrivers(version);
this.model.defaultDrivers = defaultDrivers;
this.changeDefaultDriver(defaultDrivers[0]?.value);
}
}; };
private resolveSelectedDriverType = () => { private resolveSelectedDriverType = () => {
@ -97,11 +103,12 @@ export class DriverSelectorModel extends Model {
return [this.options.driverSource, this.options.driver]; return [this.options.driverSource, this.options.driver];
}; };
private getDrivers = () => { private getDrivers = (version?: string) => {
const connectionData = this.options.connectionData as ConnectionJDBC; const connectionData = this.options.connectionData as ConnectionJDBC;
const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver); const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver);
const selectedVersion = version ?? this.options.version;
const drivers = connectionType.drivers ? const drivers = connectionType.drivers ?
connectionType.drivers.map(item => { (BI.isUndefined(connectionType.versions) ? connectionType.drivers : connectionType.drivers[selectedVersion]).map(item => {
return { return {
text: item, text: item,
value: item, value: item,
@ -111,8 +118,7 @@ export class DriverSelectorModel extends Model {
text: connectionType.driver, text: connectionType.driver,
value: connectionType.driver, value: connectionType.driver,
}]; }];
if (BI.isUndefined(connectionType.versions) && !drivers.some(item => item.text === connectionData.driver)) {
if (!drivers.some(item => item.text === connectionData.driver)) {
return [ return [
{ {
text: connectionData.driver, text: connectionData.driver,

11
src/modules/pages/maintain/components/driverselector/driverselector.ts

@ -24,6 +24,7 @@ export class DriverSelector extends BI.Widget {
driver: '', driver: '',
driverSource: '', driverSource: '',
connectionData: {} as ConnectionJDBC, connectionData: {} as ConnectionJDBC,
version: '',
}; };
defaultDrivers: EditorIconCheckCombo = null; defaultDrivers: EditorIconCheckCombo = null;
@ -43,6 +44,12 @@ export class DriverSelector extends BI.Widget {
driverManageEntryVisible: b => { driverManageEntryVisible: b => {
this.driverManageEntry.setVisible(b); this.driverManageEntry.setVisible(b);
}, },
defaultDrivers: items => {
this.defaultDrivers.populate(items);
this.defaultDrivers.setValue(this.model.defaultDriver.driver);
this.fireEvent('EVENT_CHANGE');
}
}; };
private driverManageEntry = null; private driverManageEntry = null;
@ -182,4 +189,8 @@ export class DriverSelector extends BI.Widget {
driver: this.model.driverSource === '' ? this.model.defaultDriver.driver : this.model.customDriver.driver, driver: this.model.driverSource === '' ? this.model.defaultDriver.driver : this.model.customDriver.driver,
}; };
} }
setDefaultDrivers(version: string) {
this.store.setDefaultDrivers(version);
}
} }

82
src/modules/pages/maintain/forms/components/form.jdbc.ts

@ -40,9 +40,11 @@ export class FormJdbc extends BI.Widget {
formKeyPath: FormItem; formKeyPath: FormItem;
formKrb5File: FormItem; formKrb5File: FormItem;
labelTips: Label; labelTips: Label;
schemaForm: FormItem;
form = { form = {
connectionName: null, connectionName: null,
version: null,
driver: null, driver: null,
database: null, database: null,
host: null, host: null,
@ -138,8 +140,8 @@ export class FormJdbc extends BI.Widget {
} = connectionPoolAttr as ConnectionPoolJDBC; } = connectionPoolAttr as ConnectionPoolJDBC;
const databaseType = getJdbcDatabaseType(database, driver); const databaseType = getJdbcDatabaseType(database, driver);
this.databaseType = databaseType; this.databaseType = databaseType;
const { host, port, databaseName, version } = resolveUrlInfo(url, database);
const { host, port, databaseName } = resolveUrlInfo(url, database); this.version = !BI.isUndefined(databaseType.versions) ? (version ?? databaseType.versions[0]) : version;
const { hgap, vgap } = CONNECTION_LAYOUT; const { hgap, vgap } = CONNECTION_LAYOUT;
const valueRangeConfig = { const valueRangeConfig = {
@ -171,6 +173,41 @@ export class FormJdbc extends BI.Widget {
}, },
], ],
}, },
// 版本
{
type: FormItem.xtype,
name: BI.i18nText('Dec-Basic_Version'),
invisible: BI.isUndefined(databaseType.versions),
forms: [
{
type: BI.TextValueCombo.xtype,
width: 300,
value: this.version,
items: () => databaseType.versions.map(item => {
return {
text: BI.i18nText('Dec-Migration_Database_Version', item),
value: item,
}
}),
ref: (_ref: TextValueCombo) => {
this.form.version = _ref;
},
listeners: [
{
eventName: BI.TextValueCombo.EVENT_CHANGE,
action: () => {
const version = this.form.version.getValue()[0];
this.version = version;
this.sslCollapse.setCollapse(true);
this.sslCollapse.setVisible(this.getSslSetEnabled());
!BI.isUndefined(databaseType.hasSchemas) && this.schemaForm.setVisible(databaseType.hasSchemas[version]);
this.form.driver.setDefaultDrivers(version);
},
},
],
},
],
},
// 驱动 // 驱动
{ {
type: FormItem.xtype, type: FormItem.xtype,
@ -184,6 +221,7 @@ export class FormJdbc extends BI.Widget {
driver, driver,
driverSource, driverSource,
connectionData, connectionData,
version: this.version,
listeners: [ listeners: [
{ {
eventName: 'EVENT_CHANGE', eventName: 'EVENT_CHANGE',
@ -405,7 +443,7 @@ export class FormJdbc extends BI.Widget {
{ {
eventName: FileUpload.EVENT_CHECK_SUCCESS, eventName: FileUpload.EVENT_CHECK_SUCCESS,
action: (value) => { action: (value) => {
const principalsItems = BI.map(value.principals, function(index, item) { const principalsItems = BI.map(value.principals, function (index, item) {
return { return {
text: item, text: item,
value: item value: item
@ -510,7 +548,7 @@ export class FormJdbc extends BI.Widget {
// 模式 // 模式
{ {
type: FormItem.xtype, type: FormItem.xtype,
invisible: !databaseType.hasSchema, invisible: BI.isUndefined(databaseType.hasSchemas) ? !databaseType.hasSchema : !databaseType.hasSchemas[this.version],
height: 64, height: 64,
name: BI.i18nText('Dec-Dcm_Connection_Form_Pattern'), name: BI.i18nText('Dec-Dcm_Connection_Form_Pattern'),
forms: [ forms: [
@ -551,6 +589,9 @@ export class FormJdbc extends BI.Widget {
], ],
}, },
], ],
ref: (_ref: FormItem) => {
this.schemaForm = _ref;
},
}, },
// 分隔线 // 分隔线
{ {
@ -866,6 +907,9 @@ export class FormJdbc extends BI.Widget {
width: 100, width: 100,
name: BI.i18nText('Dec-Dcm_Connection_Setting', 'SSL'), name: BI.i18nText('Dec-Dcm_Connection_Setting', 'SSL'),
invisible: !this.getSslSetEnabled(), invisible: !this.getSslSetEnabled(),
ref: (_ref: Collapse) => {
this.sslCollapse = _ref;
},
listeners: [ listeners: [
{ {
eventName: EVENT_CHANGE, eventName: EVENT_CHANGE,
@ -1252,17 +1296,17 @@ export class FormJdbc extends BI.Widget {
const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver); const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver);
const drivers = connectionType.drivers const drivers = connectionType.drivers
? connectionType.drivers.map((item) => { ? connectionType.drivers.map((item) => {
return { return {
text: item, text: item,
value: item, value: item,
}; };
}) })
: [ : [
{ {
text: connectionType.driver, text: connectionType.driver,
value: connectionType.driver, value: connectionType.driver,
}, },
]; ];
if (!drivers.some((item) => item.text === connectionData.driver)) { if (!drivers.some((item) => item.text === connectionData.driver)) {
return [ return [
@ -1309,7 +1353,7 @@ export class FormJdbc extends BI.Widget {
private getSslSetEnabled(): boolean { private getSslSetEnabled(): boolean {
const { databaseType } = this.databaseType; const { databaseType } = this.databaseType;
return databaseType === 'mysql'; return databaseType === 'mysql' || this.version === 'mysql';
} }
public setSchemas(schemas: string[]) { public setSchemas(schemas: string[]) {
@ -1329,7 +1373,7 @@ export class FormJdbc extends BI.Widget {
} }
public setKerberos() { public setKerberos() {
const KerberosParams = BI.extend({},{ const KerberosParams = BI.extend({}, {
keytabPath: this.form.keyPath.getValue(), keytabPath: this.form.keyPath.getValue(),
krb5ConfPath: this.form.krb5Path.getValue(), krb5ConfPath: this.form.krb5Path.getValue(),
principal: this.form.principal.getValue()[0] principal: this.form.principal.getValue()[0]
@ -1341,7 +1385,7 @@ export class FormJdbc extends BI.Widget {
public initPrincipals(keyPath, principal) { public initPrincipals(keyPath, principal) {
let self = this; let self = this;
api.getPrincipals(keyPath).then(res => { api.getPrincipals(keyPath).then(res => {
const principalsItems = BI.map(res.data, function(index, item) { const principalsItems = BI.map(res.data, function (index, item) {
return { return {
text: item, text: item,
value: item value: item
@ -1354,12 +1398,12 @@ export class FormJdbc extends BI.Widget {
public changePrincipal() { public changePrincipal() {
let self = this; let self = this;
const KerberosParams = BI.extend({},{ const KerberosParams = BI.extend({}, {
keytabPath: this.form.keyPath.getValue(), keytabPath: this.form.keyPath.getValue(),
krb5ConfPath: this.form.krb5Path.getValue(), krb5ConfPath: this.form.krb5Path.getValue(),
principal: this.form.principal.getValue()[0] principal: this.form.principal.getValue()[0]
}); });
api.changePrincipal(KerberosParams).then(res =>{ api.changePrincipal(KerberosParams).then(res => {
self.form.keyPath.setValue(res.data.keytabPath); self.form.keyPath.setValue(res.data.keytabPath);
self.form.krb5Path.setValue(res.data.krb5ConfPath); self.form.krb5Path.setValue(res.data.krb5ConfPath);
}); });

Loading…
Cancel
Save