Browse Source

Pull request #188: 无jira任务, release/10.0 合 bugfix/10.0

Merge in DEC/decision-webui-dcm from release/10.0 to bugfix/10.0

* commit '1e09fd380e06d1570161186cd17f47eb9a5fc22e':
  fix: 添加判断
  DEC-14009 1.8以上版本JDK支持ODBC连接
  fix:调整名称
  DEC-13832 fix: 调整id
  DEC-13832 chore:覆盖数据连接id
bugfix/10.0
ju.ju 4 years ago
parent
commit
076526ddf1
  1. 1
      src/modules/components/collapse/collapse.ts
  2. 3
      src/modules/components/text_checker/text_checker.ts
  3. 3
      src/modules/constants/constant.ts
  4. 1
      src/modules/pages/connection/components/form_item/form_item.ts
  5. 1
      src/modules/pages/connection/connection.ts
  6. 1
      src/modules/pages/connection/connection_jndi/connection_jndi.ts
  7. 9
      src/modules/pages/connection/list/list_item/list_item.ts
  8. 1
      src/modules/pages/connection_pool/list_item/list_item.ts
  9. 9
      src/modules/pages/connection_pool/pool/pool.ts
  10. 1
      src/modules/pages/database/database.ts
  11. 2
      src/modules/pages/database/database_type/database_type.less
  12. 3
      src/modules/pages/database/database_type/database_type.ts
  13. 1
      src/modules/pages/database/filter/filter.ts
  14. 1
      src/modules/pages/maintain/components/form_item/form_item.ts
  15. 26
      src/modules/pages/maintain/forms/components/form.jdbc.ts
  16. 19
      src/modules/pages/maintain/forms/components/form.jndi.ts
  17. 8
      src/modules/pages/maintain/forms/form.server.ts
  18. 1
      src/modules/pages/maintain/maintain.ts
  19. 2
      src/modules/title/title.ts
  20. 2
      src/modules/title/title_database/title_datebase.ts
  21. 3
      src/modules/title/title_maintain/title_maintain.ts

1
src/modules/components/collapse/collapse.ts

@ -10,6 +10,7 @@ export class Collapse extends BI.BasicButton {
props = {
name: '',
isCollapse: true,
$testId: 'dec-dcm-components-collapse',
}
rightFont: any;

3
src/modules/components/text_checker/text_checker.ts

@ -26,7 +26,7 @@ export class TextChecker extends BI.Widget {
}
render() {
const { width, allowBlank, value, watermark, validationChecker } = this.options;
const { width, allowBlank, value, watermark, validationChecker, $value } = this.options;
this.value = value;
return {
@ -36,6 +36,7 @@ export class TextChecker extends BI.Widget {
items: [{
el: {
type: TextEditor,
$value,
width,
allowBlank,
value,

3
src/modules/constants/constant.ts

@ -9,6 +9,9 @@ export const PAGE_INDEX = {
export const OTHER_JDBC = 'otherJDBC';
export const JDBC_ODBC_DRIVER = 'sun.jdbc.odbc.JdbcOdbcDriver';
export const JDBC_ODBC_DRIVER_HELP_LINK = DecCst && DecCst.Hyperlink ? DecCst.Hyperlink.Database.OTHER_ODBC : '';
export const DATEBASE_FILTER_TYPE = {
COMMONLY: 'commonly',
ALL: 'all',

1
src/modules/pages/connection/components/form_item/form_item.ts

@ -9,6 +9,7 @@ export class FormItem extends BI.Widget {
unit: '',
isBold: true,
nameWidth: 140,
$testId: 'dec-dcm-connection-form-item',
}
render () {

1
src/modules/pages/connection/connection.ts

@ -102,6 +102,7 @@ export class Connection extends BI.Widget {
type: VerticalAdapt,
items: [{
type: Button,
$value: 'connection-edit',
invisible: true,
text: BI.i18nText('Dec-Dcm_Edit'),
ref: (_ref: any) => {

1
src/modules/pages/connection/connection_jndi/connection_jndi.ts

@ -21,6 +21,7 @@ export class ConnectionJdbc extends BI.Widget {
return {
type: Vertical,
$testId: 'dec-dcm-connection-jndi',
hgap,
vgap,
items: [

9
src/modules/pages/connection/list/list_item/list_item.ts

@ -17,6 +17,7 @@ export class ListItem extends BI.BasicButton {
databaseType: '',
height: 25,
baseCls: 'dec-dcm-connection-list-item bi-list-item-active2',
$testId: 'dec-dcm-connection-list-item',
}
store: ListItemModel['store'];
@ -42,6 +43,7 @@ export class ListItem extends BI.BasicButton {
return {
type: Htape,
$scope: name,
items: [{
el: {
type: IconLabel,
@ -64,6 +66,7 @@ export class ListItem extends BI.BasicButton {
},
{
type: SignEditor,
$value: 'connection-name',
value: name,
invisible: !this.model.isEdit,
ref: (_ref: any) => {
@ -107,6 +110,7 @@ export class ListItem extends BI.BasicButton {
hgap: 8,
el: {
type: IconButton,
$value: 'other-edit',
cls: 'dcm-link-other-font icon-size-16',
},
items: this.renderDownList(),
@ -158,29 +162,34 @@ export class ListItem extends BI.BasicButton {
[
{
text: BI.i18nText('Dec-Dcm_Test_Connection'),
$testId: 'dec-dcm-connection-list-btn',
cls: 'dcm-test-font',
value: 'test',
},
{
text: BI.i18nText('Dec-Dcm_Edit'),
$testId: 'dec-dcm-connection-list-btn',
cls: 'dcm-link-edit-font',
value: 'edit',
invisible: !canEdit,
},
{
text: BI.i18nText('Dec-Dcm_Change_Name'),
$testId: 'dec-dcm-connection-list-btn',
cls: 'dcm-change-name-font',
value: 'changeName',
invisible: !canEdit,
},
{
text: BI.i18nText('Dec-Dcm_Copy'),
$testId: 'dec-dcm-connection-list-btn',
cls: 'copy-font',
value: 'copy',
invisible: !canEdit,
},
{
text: BI.i18nText('Dec-Dcm_Delete'),
$testId: 'dec-dcm-connection-list-btn',
cls: 'dcm-delete-font',
value: 'delete',
invisible: !canEdit,

1
src/modules/pages/connection_pool/list_item/list_item.ts

@ -9,6 +9,7 @@ export class ListItem extends BI.BasicButton {
name: '',
height: 25,
baseCls: 'dec-dcm-connection-pool-list-item bi-list-item-active2',
$testId: 'dec-dcm-connection-pool-list-item',
}
store: ListItemModel['store'];

9
src/modules/pages/connection_pool/pool/pool.ts

@ -10,6 +10,7 @@ export const PoolXtype = 'dec.dcm.connection_pool.pool';
export class Pool extends BI.Widget {
props = {
baseCls: 'dec-dcm-connection-pool',
$testId: 'dec-dcm-connection-pool',
}
model: PoolModel['model'];
@ -54,6 +55,8 @@ export class Pool extends BI.Widget {
items: [
{
type: Label,
$testId: 'dec-dcm-pool-status-number',
$value: 'active',
cls: 'bi-high-light card-font-heighlight',
ref: (_ref: any) => {
this.numActive = _ref;
@ -65,6 +68,8 @@ export class Pool extends BI.Widget {
},
{
type: Label,
$testId: 'dec-dcm-pool-status-max',
$value: 'active',
ref: (_ref: any) => {
this.maxActive = _ref;
},
@ -98,6 +103,8 @@ export class Pool extends BI.Widget {
items: [
{
type: Label,
$testId: 'dec-dcm-pool-status-number',
$value: 'idle',
cls: 'bi-high-light card-font-heighlight',
ref: (_ref: any) => {
this.numIdle = _ref;
@ -109,6 +116,8 @@ export class Pool extends BI.Widget {
},
{
type: Label,
$testId: 'dec-dcm-pool-status-max',
$value: 'idle',
ref: (_ref: any) => {
this.maxIdle = _ref;
},

1
src/modules/pages/database/database.ts

@ -81,6 +81,7 @@ export class Datebase extends BI.Widget {
items: [
{
type: SearchEditor,
$value: 'database-type',
width: 300,
watermark: BI.i18nText('BI-Basic_Search'),
ref: (_ref: any) => {

2
src/modules/pages/database/database_type/database_type.less

@ -1,6 +1,6 @@
@import '../../../../less/index.less';
.dec-dcm-datebase-type{
.dec-dcm-database-type{
.bi-list-item-active{
&:hover{
.box-shadow(0 1px 5px 0, fade(@color-bi-background-black, 20));

3
src/modules/pages/database/database_type/database_type.ts

@ -18,7 +18,8 @@ export class DatebaseType extends BI.BasicButton {
keyword: '',
databaseType: '',
iconUrl: '',
baseCls: 'dec-dcm-datebase-type',
baseCls: 'dec-dcm-database-type',
$testId: 'dec-dcm-database-type',
}
img: any;

1
src/modules/pages/database/filter/filter.ts

@ -11,6 +11,7 @@ export class Filter extends BI.BasicButton {
text: '',
value: '',
baseCls: 'bi-list-item-active2',
$testId: 'dec-dcm-database-filter',
}
render() {

1
src/modules/pages/maintain/components/form_item/form_item.ts

@ -9,6 +9,7 @@ export class FormItem extends BI.Widget {
forms: '',
nameWidth: 140,
isBold: true,
$testId: 'dec-dcm-maintain-form-item',
}
render () {

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

@ -81,6 +81,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Name'),
forms: [{
type: TextCheckerXtype,
$value: 'connection-name',
width: 300,
value: connectionName,
allowBlank: true,
@ -95,6 +96,8 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Driver'),
forms: [{
type: EdirotIconCheckCombo,
$testId: 'dec-editor-icon-check-combo',
$value: 'driver',
width: 300,
value: driver,
ref: (_ref: any) => {
@ -122,6 +125,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Name'),
forms: [{
type: TextEditor,
$value: 'database-name',
width: 300,
allowBlank: true,
watermark: BI.i18nText('Dec-Dcm_Connection_Form_Database_Name'),
@ -142,6 +146,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Host'),
forms: [{
type: TextEditor,
$value: 'database-host',
width: 300,
allowBlank: true,
value: host,
@ -162,6 +167,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Port'),
forms: [{
type: TextCheckerXtype,
$value: 'database-port',
width: 300,
allowBlank: true,
value: port,
@ -188,6 +194,7 @@ export class FormJdbc extends BI.Widget {
invisible: !databaseType.kerberos,
forms: [{
type: TextValueCombo,
$value: 'auth-type',
width: 300,
value: authType,
ref: (_ref: any) => {
@ -227,6 +234,7 @@ export class FormJdbc extends BI.Widget {
},
forms: [{
type: TextEditor,
$value: 'username',
width: 300,
allowBlank: true,
value: user,
@ -245,6 +253,7 @@ export class FormJdbc extends BI.Widget {
},
forms: [{
type: Editor,
$value: 'password',
cls: 'bi-border bi-border-radius',
width: 300,
height: 20,
@ -266,6 +275,7 @@ export class FormJdbc extends BI.Widget {
},
forms: [{
type: TextEditor,
$value: 'principal',
width: 300,
allowBlank: true,
value: principal,
@ -284,6 +294,7 @@ export class FormJdbc extends BI.Widget {
},
forms: [{
type: Editor,
$value: 'key-path',
cls: 'bi-border',
width: 300,
height: 20,
@ -310,6 +321,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_OriginalCharsetName'),
forms: [{
type: TextValueCombo,
$value: 'original-charset-name',
width: 300,
value: originalCharsetName ? originalCharsetName : '',
items: CONNECT_CHARSET,
@ -342,6 +354,7 @@ export class FormJdbc extends BI.Widget {
}],
}, {
type: TextValueCombo,
$value: 'schema',
width: 300,
vgap: 15,
disabled: true,
@ -363,6 +376,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_URL'),
forms: [{
type: TextEditor,
$value: 'database-url',
width: 300,
allowBlank: true,
value: url,
@ -410,6 +424,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Initial_Size'),
forms: [{
type: TextCheckerXtype,
$value: 'initial-size',
width: 300,
allowBlank: false,
value: initialSize,
@ -429,6 +444,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Max_Active'),
forms: [{
type: TextCheckerXtype,
$value: 'max-active',
width: 300,
allowBlank: false,
value: maxActive,
@ -448,6 +464,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Max_Idle'),
forms: [{
type: TextCheckerXtype,
$value: 'max-idle',
width: 300,
allowBlank: false,
value: maxIdle,
@ -467,6 +484,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Min_Idle'),
forms: [{
type: TextCheckerXtype,
$value: 'min-idle',
width: 300,
allowBlank: false,
value: minIdle,
@ -487,6 +505,7 @@ export class FormJdbc extends BI.Widget {
forms: [
{
type: TextCheckerXtype,
$value: 'max-wait',
width: 300,
allowBlank: false,
value: maxWait,
@ -513,6 +532,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_SQL_Validation_Query'),
forms: [{
type: TextAreaEditor,
$value: 'validation-query',
cls: 'bi-border',
allowBlank: true,
watermark: BI.i18nText('Dec-Dcm_Connection_Form_Place_Input'),
@ -529,6 +549,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Connection-Check'),
forms: [{
type: TextValueCombo,
$value: 'check',
width: 300,
allowBlank: true,
value: testOnBorrow,
@ -544,6 +565,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Test_On_Return'),
forms: [{
type: TextValueCombo,
$value: 'test-on-return',
width: 300,
allowBlank: true,
value: testOnReturn,
@ -559,6 +581,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Test_While_Idle'),
forms: [{
type: TextValueCombo,
$value: 'test-while-idle',
width: 300,
allowBlank: true,
value: testWhileIdle,
@ -575,6 +598,7 @@ export class FormJdbc extends BI.Widget {
forms: [
{
type: TextCheckerXtype,
$value: 'test-between-evicition-millis',
width: 300,
allowBlank: false,
value: timeBetweenEvictionRunsMillis,
@ -601,6 +625,7 @@ export class FormJdbc extends BI.Widget {
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Tests_PerEviction_Run_Num'),
forms: [{
type: TextCheckerXtype,
$value: 'test-pereviction-run-num',
width: 300,
allowBlank: false,
value: numTestsPerEvictionRun,
@ -621,6 +646,7 @@ export class FormJdbc extends BI.Widget {
forms: [
{
type: TextCheckerXtype,
$value: 'min-evictable-idle-time-millis',
width: 300,
allowBlank: false,
value: minEvictableIdleTimeMillis,

19
src/modules/pages/maintain/forms/components/form.jndi.ts

@ -51,6 +51,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextCheckerXtype,
$value: 'connection-name',
width: 300,
value: connectionName,
ref: (_ref: any) => {
@ -64,6 +65,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'jdni-name',
width: 300,
allowBlank: true,
value: jndiName,
@ -102,6 +104,8 @@ export class FormJndi extends BI.Widget {
isBold: false,
forms: [{
type: EdirotIconCheckCombo,
$testId: 'dec-editor-icon-check-combo',
$value: 'initial',
width: 300,
value: contextHashtable['java.naming.factory.initial'],
ref: (_ref: any) => {
@ -130,6 +134,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'provider-url',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.provider.url'],
@ -145,6 +150,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'security-principal',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.security.principal'],
@ -160,6 +166,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'security-credentials',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.security.credentials'],
@ -185,6 +192,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextValueCombo,
$value: 'new-charset-name',
width: 300,
value: newCharsetName ? newCharsetName : '',
items: CONNECT_CHARSET,
@ -221,6 +229,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'factory-object',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.factory.object'],
@ -235,6 +244,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'factory-state',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.factory.state'],
@ -249,6 +259,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'factory-url-pkgs',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.factory.url.pkgs'],
@ -263,6 +274,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'dns-url',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.dns.url'],
@ -277,6 +289,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'authoritative',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.authoritative'],
@ -291,6 +304,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'batchsize',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.batchsize'],
@ -305,6 +319,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'referral',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.referral'],
@ -319,6 +334,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'security-protocol',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.security.protocol'],
@ -333,6 +349,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'security-authentication',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.security.authentication'],
@ -347,6 +364,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'language',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.language'],
@ -361,6 +379,7 @@ export class FormJndi extends BI.Widget {
nameWidth: 200,
forms: [{
type: TextEditor,
$value: 'applet',
width: 300,
allowBlank: true,
value: contextHashtable['java.naming.applet'],

8
src/modules/pages/maintain/forms/form.server.ts

@ -1,6 +1,6 @@
import { Connection, ConnectionJDBC } from '../../../crud/crud.typings';
import { connectionType, errorCode } from '@constants/env';
import { DATA_BASE_DRIVER_LINK } from '@constants/constant';
import { DATA_BASE_DRIVER_LINK, JDBC_ODBC_DRIVER, JDBC_ODBC_DRIVER_HELP_LINK } from '@constants/constant';
import { TestStatusXtype, EVENT_RELOAD, EVENT_CLOSE } from '../../../components/test_status/test_status';
import { ApiFactory } from '../../../crud/apiFactory';
const api = new ApiFactory().create();
@ -23,6 +23,12 @@ export function testConnection(value: Connection): Promise<string[]> {
if (api.isDriverError(re.errorCode)) {
if (formValue.connectionType === connectionType.JDBC) {
const driver = (formValue.connectionData as ConnectionJDBC).driver;
// DEC-14009 1.8以上版本JDK支持ODBC连接
if (driver === JDBC_ODBC_DRIVER) {
testStatus.setFail(re.errorMsg, driver, Dec.system[DecCst.Hyperlink.DECISION_HYPERLINK_CONFIG][JDBC_ODBC_DRIVER_HELP_LINK]);
return;
}
const databaseType = (formValue.connectionData as ConnectionJDBC).database;
const databaseLink = BI.get(DATA_BASE_DRIVER_LINK.find(item => item.databaseType === databaseType), 'link');
testStatus.setFail(re.errorMsg, driver, Dec.system[DecCst.Hyperlink.DECISION_HYPERLINK_CONFIG][databaseLink]);

1
src/modules/pages/maintain/maintain.ts

@ -35,6 +35,7 @@ export class Maintain extends BI.Widget {
items: [
{
type: IconButton,
$value: 'back-databases',
cls: 'dcm-back-font',
height: 15,
invisible: this.model.isCopy || isEdit,

2
src/modules/title/title.ts

@ -44,12 +44,14 @@ export class Title extends BI.Widget {
items: [
{
text: BI.i18nText('Dec-Dcm_Connection_Management'),
$testId: 'dec-dcm-connection-tab',
selected: true,
value: PAGE_INDEX.CONNECTION,
hgap: 15,
},
{
text: BI.i18nText('Dec-Dcm_Pool_Connection_Management'),
$testId: 'dec-dcm-connection-tab',
value: PAGE_INDEX.POOL,
hgap: 15,
},

2
src/modules/title/title_database/title_datebase.ts

@ -29,6 +29,7 @@ export class TitleDatabaseWidget extends BI.Widget {
items: [
{
type: Button,
$value: 'title-database-cancel',
text: BI.i18nText('BI-Basic_Cancel'),
level: 'ignore',
handler: () => {
@ -37,6 +38,7 @@ export class TitleDatabaseWidget extends BI.Widget {
},
{
type: Button,
$value: 'title-database-save',
text: BI.i18nText('BI-Basic_Save'),
disabled: !this.model.datebaseTypeSelected,
ref: (_ref: any) => {

3
src/modules/title/title_maintain/title_maintain.ts

@ -19,6 +19,7 @@ export class TitleMaintainWidget extends BI.Widget {
items: [
{
type: Button,
$value: 'title-maintain-cancel',
text: BI.i18nText('BI-Basic_Cancel'),
level: 'ignore',
handler: () => {
@ -29,6 +30,7 @@ export class TitleMaintainWidget extends BI.Widget {
},
{
type: Button,
$value: 'title-maintain-connection-test',
text: BI.i18nText('Dec-Dcm_Connection_Test'),
level: 'ignore',
handler: () => {
@ -37,6 +39,7 @@ export class TitleMaintainWidget extends BI.Widget {
},
{
type: Button,
$value: 'title-maintain-save',
text: BI.i18nText('BI-Basic_Save'),
handler: () => {
this.store.setSaveEvent();

Loading…
Cancel
Save