mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.8 KiB
157 lines
5.8 KiB
<script lang="ts" setup> |
|
const { activeIntegration, categories, activeCategory } = useIntegrationStore() |
|
|
|
const { copy } = useCopy() |
|
|
|
const copyIp = async () => { |
|
await copy('52.15.226.51') |
|
message.success('Copied to clipboard') |
|
} |
|
|
|
const panelsRef = ref<HTMLElement | null>(null) |
|
|
|
onMounted(() => { |
|
if (!panelsRef.value) return |
|
|
|
const panels = panelsRef.value.querySelectorAll('.panel') |
|
panels.forEach((panel) => { |
|
categories.value.push({ |
|
label: panel.getAttribute('data-label') as string, |
|
icon: panel.getAttribute('data-icon'), |
|
}) |
|
}) |
|
|
|
// focus first input |
|
nextTick(() => { |
|
const firstInput = panels[0].querySelector('input') |
|
if (firstInput) firstInput.focus() |
|
}) |
|
}) |
|
|
|
const onInputFocus = () => { |
|
const target = document.activeElement |
|
const panel = target?.closest('.panel') |
|
if (panel) { |
|
activeCategory.value = { |
|
label: panel.getAttribute('data-label') as string, |
|
icon: panel.getAttribute('data-icon'), |
|
} |
|
} |
|
} |
|
</script> |
|
|
|
<template> |
|
<div ref="panelsRef" class="panels"> |
|
<WorkspaceIntegrationsPanel title="Integration Details" icon="info"> |
|
<template #header-info> |
|
<div |
|
class="text-gray-500 !text-xs font-weight-normal flex items-center gap-2 cursor-pointer flex items-center" |
|
@click="copyIp" |
|
> |
|
<GeneralIcon icon="info" class="text-primary" /> |
|
Whitelist our ip: 52.15.226.51 to allow database access |
|
<GeneralIcon icon="duplicate" class="text-gray-800 w-5 h-5 p-1 border-1 rounded-md border-gray-200" /> |
|
</div> |
|
</template> |
|
<div> |
|
<div class="flex flex-col w-1/2 pr-3"> |
|
<label class="!text-xs font-weight-normal pb-1">Title</label> |
|
<a-input v-model:value="activeIntegration.payload.title" class="input-text" :maxlength="255" @focus="onInputFocus" /> |
|
</div> |
|
</div> |
|
</WorkspaceIntegrationsPanel> |
|
<WorkspaceIntegrationsPanel title="Connection Details" icon="link"> |
|
<div class="input-group"> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Host</label> |
|
<a-input v-model:value="activeIntegration.payload.host" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Port</label> |
|
<a-input v-model:value="activeIntegration.payload.port" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">User</label> |
|
<a-input v-model:value="activeIntegration.payload.user" class="input-text" autocomplete="off" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Password</label> |
|
<a-input |
|
v-model:value="activeIntegration.payload.password" |
|
class="input-text" |
|
type="password" |
|
autocomplete="off" |
|
@focus="onInputFocus" |
|
/> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Schema</label> |
|
<a-input v-model:value="activeIntegration.payload.schema" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Database</label> |
|
<a-input v-model:value="activeIntegration.payload.database" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
</div> |
|
</WorkspaceIntegrationsPanel> |
|
<WorkspaceIntegrationsPanel title="SSL & Advanced Parameters" icon="lock" :collapsible="true"> |
|
<div class="input-group"> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">SSL Mode</label> |
|
<a-select v-model:value="activeIntegration.payload.sslMode" class="input-text" @focus="onInputFocus"> |
|
<a-select-option value="disable">Disable</a-select-option> |
|
<a-select-option value="require">Require</a-select-option> |
|
<a-select-option value="verify-ca">Verify CA</a-select-option> |
|
<a-select-option value="verify-full">Verify Full</a-select-option> |
|
</a-select> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">SSL Root Certificate</label> |
|
<a-input v-model:value="activeIntegration.payload.sslRootCert" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">SSL Certificate</label> |
|
<a-input v-model:value="activeIntegration.payload.sslCert" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">SSL Key</label> |
|
<a-input v-model:value="activeIntegration.payload.sslKey" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
</div> |
|
<div class="w-full border-t-1 mt-2 mb-4"></div> |
|
<div class="input-group"> |
|
<div class="input-item"> |
|
<label class="!text-xs font-weight-normal pb-1">Extra Connection Parameters</label> |
|
<a-input v-model:value="activeIntegration.payload.sslCert" class="input-text" @focus="onInputFocus" /> |
|
</div> |
|
</div> |
|
</WorkspaceIntegrationsPanel> |
|
<WorkspaceIntegrationsPanel title="Connection JSON" icon="code">DUMMY</WorkspaceIntegrationsPanel> |
|
</div> |
|
</template> |
|
|
|
<style lang="scss" scoped> |
|
.panels { |
|
@apply w-3/4 flex flex-col; |
|
|
|
.panel { |
|
@apply border-1 border-gray-200 px-4 py-4 rounded-lg mb-4; |
|
|
|
.panel-label { |
|
@apply text-md font-weight-bold; |
|
} |
|
|
|
.input-text { |
|
@apply w-full rounded-md; |
|
} |
|
|
|
.input-group { |
|
@apply flex flex-wrap w-full; |
|
|
|
.input-item { |
|
@apply flex flex-col w-1/2 pr-3 mb-3; |
|
} |
|
} |
|
} |
|
} |
|
</style>
|
|
|