diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm.tsx index fcfecbbefa4bd..7cf266bcbe296 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm.tsx @@ -19,7 +19,7 @@ import React, { FormEvent, useState } from 'react'; import { SupersetTheme, JsonObject } from '@superset-ui/core'; import { InputProps } from 'antd/lib/input'; -import { Input, Select, Upload, Button} from 'src/common/components'; +import { Input, Select, Upload, Button } from 'src/common/components'; import ValidatedInput from 'src/components/Form/LabeledErrorBoundInput'; import { StyledFormHeader, @@ -42,7 +42,7 @@ interface FieldPropTypes { required: boolean; changeMethods: { onParametersChange: (value: any) => string } & { onChange: (value: any) => string; - }; + } & { onParametersUploadFileChange: (value: any) => string }; validationErrors: JsonObject | null; getValidation: () => void; } @@ -59,27 +59,37 @@ const credentialsInfo = ({ Upload JSON file {uploadOption === 'paste' ? (
- +
) : ( - - - + { + const file = event?.target?.files[0]; + const credentials = JSON.parse(await file.text()); + const encrypted_extra = JSON.stringify({ + credentials_info: credentials, + }); + changeMethods.onParametersUploadFileChange({ + target: { + name: 'encrypted_extra', + value: encrypted_extra, + }, + }); + }} + /> )} ); }; - const hostField = ({ required, changeMethods, @@ -201,6 +211,7 @@ const DatabaseConnectionForm = ({ dbModel: { name, parameters }, onParametersChange, onChange, + onParametersUploadFileChange, validationErrors, getValidation, }: { @@ -211,6 +222,9 @@ const DatabaseConnectionForm = ({ onChange: ( event: FormEvent | { target: HTMLInputElement }, ) => void; + onParametersUploadFileChange: ( + event: FormEvent | { target: HTMLInputElement }, + ) => void; validationErrors: JsonObject | null; getValidation: () => void; }) => ( @@ -236,7 +250,11 @@ const DatabaseConnectionForm = ({ ).map(field => FORM_FIELD_MAP[field]({ required: parameters.required.includes(field), - changeMethods: { onParametersChange, onChange }, + changeMethods: { + onParametersChange, + onChange, + onParametersUploadFileChange, + }, validationErrors, getValidation, key: field, diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx index 60d74fc9f8ca6..f183eac0f536e 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx @@ -82,6 +82,7 @@ enum ActionType { parametersChange, reset, textChange, + parametersUploadFileChange, } interface DBReducerPayloadType { @@ -99,7 +100,8 @@ type DBReducerActionType = | ActionType.textChange | ActionType.inputChange | ActionType.editorChange - | ActionType.parametersChange; + | ActionType.parametersChange + | ActionType.parametersUploadFileChange; payload: DBReducerPayloadType; } | { @@ -170,6 +172,11 @@ function dbReducer( return { ...action.payload, }; + case ActionType.parametersUploadFileChange: + return { + ...trimmedState, + [action.payload.name]: action.payload.value, + }; case ActionType.reset: default: return {}; @@ -516,6 +523,16 @@ const DatabaseModal: FunctionComponent = ({ value: target.value, }) } + onParametersUploadFileChange={({ + target, + }: { + target: HTMLInputElement; + }) => + onChange(ActionType.parametersUploadFileChange, { + name: target.name, + value: target.value, + }) + } getValidation={() => getValidation(db)} validationErrors={validationErrors} />