Files
nocodb/packages/nc-gui/components/nc/Button.vue
Pranav C 9de25471b8 Nc feat/integrations (#8903)
* feat: integrations backend (WIP)

* feat: migration - source table

* feat: updated migration

* feat: integration APIs - WIP

* feat: integration - crud, acl, api tests

* feat: integration - crud, acl, api tests

* feat: integration - GUI integration

* feat: private integration config

* feat: integration GUI

* feat: delete api and source creation

* feat: add hint for input fields

* fix: source creation bugs

* refactor: placeholder text correction

* refactor: include context

* feat: integration delete with transaction

* refactor: permission scope correction and move ee logic

* refactor: migration correction and improvements

* feat: confirm dialog

* refactor: review comments

* refactor: meta service changes

* feat: add oss support - WIP

* feat: add oss support

* refactor: coderabbt suggestions

* refactor: exclude config from api response

* refactor: coderabbit review comments

* refactor: rename migration names

* fix: method name correction

* fix(nc-gui): integration ui changes

* fix(nc-gui): add edit integration ui changes

* fix(nc-gui): add shared badge in integrations list

* feat(nc-gui): duplicate integration

* fix(nocodb): add copy from id integration support in create integration api

* fix(nc-gui): update useIntegration store

* fix(nc-gui): test connection btn style update

* fix(nc-gui): update new integration modal

* feat(nc-gui): add sort integration list support

* fix(nc-gui): integration table to be center aligned

* fix(nc-gui): move form item required mark to right side

* fix: remove divider

* fix(nc-gui): add input shadow

* fix(nc-gui): base name validator error message

* fix(nc-gui): add border if search connection input has some value

* fix(nc-gui): add close btn in integration modal

* chore(nc-gui): lint

* fix(nc-gui): pr review changes

* chore(nc-gui): cleanup unused code

* chore(nc-gui): lint

* fix(nc-gui): integrationsType not found issue

* fix(nc-gui): update data source table

* fix(nc-gui): populate integration name only on input value change

* fix(nc-gui): create data source form update

* fix: type correction

* fix: label correction

* fix: font corrections

* fix: remove help text

* fix: grammar in help text

* fix(nc-gui): edit source ui changes

* fix(nc-gui): base settings modal changes & datasource search feat

* fix(nc-gui): update data source table

* fix(nc-gui): move integrations outside team & settings

* fix(nc-gui): make connections table full width

* fix(nc-gui): modal height issue in small screen

* fix(nc-gui): disable editing selected connection in edit data source

* fix(nc-gui): add data sources in base settings tab

* fix(nc-gui): ant design multiple warnings issue

* fix(nc-gui): create source page scrollbar issue

* feat(nc-gui): create connection from create source page

* chore(nc-gui): lint

* fix(nc-gui): update project members tab content margin

* chore: label text change

* fix: font changes

* chore: font corrections

* chore: integration => connection

* fix(nc-gui): disable auto editing database name on changing connection name

* fix(nc-gui): table header overflow issue

* fix(nc-gui): show connection crud operation messages in toast

* feat(nc-gui): request new integration ui

* fix(nc-gui): text area height adjust issue

* fix(nc-gui): add connection from source create issue

* fix(nc-gui): show data source details in modal

* fix(nc-gui): hide private connection option

* fix(nc-gui): user should able to edit & save connection without test connection if only title updated

* fix(nc-gui): add integration page in oss

* fix(nc-gui): typo currection

* fix(nc-gui): oss create base ui changes

* misc: minor formatting changes

* misc: formatting corrections

* fix(nc-gui): overlay close btn issue

* fix(nc-gui): some review changes

* fix(nc-gui): remove link beetween connection name & database name

* fix(nc-gui): update edit base/source modal oss

* fix(nc-gui): add db type icon in select connection

* chore(nc-gui): lint

* fix: integration list - allow access based on base level role

* fix(nc-gui): load integrations on creating integration from source create issue

* fix(nc-gui): add connection count in tab

* fix: correction in soft delete logic

* fix(nc-gui): reset use ssl on panel collapse

* fix(nc-gui): reduce select input font weight

* fix(nc-gui): update connection edit access control

* fix: integration read api correction

* fix(nc-gui): some review changes

* fix(nc-gui): labels update

* fix(nc-gui): udpate text in delete modal integration -> connection

* fix: remove permission from wrong scope

* refactor: swagger description correction

* fix(nc-gui): remove connection between source name & database name

* fix(nc-gui): test connection is not needed form source name. inflection field changes

* refactor: include integration title with source

* feat: integration pagination

* fix: remove unused prop

* fix(nc-gui): update all tables tab btns tooltip

* feat: new integration request

* refactor: replace delete statement and use assigning undefined for better performance

* feat(nc-gui): sync data support in project page

* fix(nc-gui): all sync data type list

* fix(nc-gui): close sync data modal issue

* fix(nc-gui): add bg gray color on db icon of tooltip

* fix(nc-gui): make connection as required field

* fix(nc-gui): show connection name if not found and reload page

* fix(nc-gui): show connection name in ds list

* fix(nc-gui): ssl related changes

* fix: oss permission

* fix(nc-gui): active tab issue on clicking source

* feat: include source count and sources in api response

* fix(nc-gui): add getIntegration fun in useIntegrationStore

* fix(nc-gui): source list udpate issue on updating source details

* fix(nc-gui): fix external source icon alignment

* feat: include base name and source count

* fix: query correction

* fix(nc-gui): show liked sources list in delete connection modal

* fix(nc-gui): display connection usage information in list

* fix(nc-gui): add sync data types icons

* fix(nc-gui): add pagination support in connection list

* fix(nc-gui): connection pagination issue

* fix(nc-gui): connection tab count update issue

* test(nc-gui): some of test cases updated

* fix(nc-gui): some minor review changes

* fix(nc-gui): minor ui changes

* fix(nc-gui): Cannot read properties of undefined (reading 'sub_type')

* fix(nc-gui): udpate all tables btn text

* fix(nc-gui): ui changes

* fix(nc-gui): overflow issue

* fix(nc-gui): add connection icon & back btn in modal

* fix(nc-gui): some minor ui changes

* test(nc-gui): update source restriction test cases

* chore(test): remove only from test

* fix(nc-gui): update style of delete connection modal

* test(nc-gui): update acl pw test cases

* fix(test): ws collaboration role accss test fail issue

* fix(nc-gui): add connection successfully added modal

* fix(nc-gui): update connection added modal

* fix(nc-gui): trigger sync request event on upvote

* chore(nc-gui): lint

* fix(nc-gui): add learn more btn in connection successfull modal

* fix(nc-gui): add integration docs link support

* fix(nc-gui): integration table name field text truncate issue

* fix: misc corrections

* misc: button width change

* fix(nc-gui): update icons

* fix(nc-gui): update test connection btn icons

* fix(nc-gui): all tables btn gap issue

* feat(nc-gui): search option in sync data modal

* feat(nc-gui): search connection through api

* fix(nc-gui): add base and source icon in delete connection modal

* fix: update sync request event

* fix(nc-gui): rebase conflict issue

* fix: connections text length

* fix(nc-gui): enable integration/create source supported docs option

* fix(nc-gui): update advanced option header style

---------

Co-authored-by: mertmit <mertmit99@gmail.com>
Co-authored-by: Ramesh Mane <101566080+rameshmane7218@users.noreply.github.com>
Co-authored-by: Raju Udava <86527202+dstala@users.noreply.github.com>
2024-08-04 15:36:20 +05:30

239 lines
5.2 KiB
Vue

<script lang="ts" setup>
import type { ButtonType } from 'ant-design-vue/lib/button'
import { useSlots } from 'vue'
/**
* @description
* Button component
*
* @example
* <NcButton type="primary" size="medium" :loading="loading" @click="onClick">
* Save
* <template #loading> Saving </template>
* </NcButton>
*/
interface Props {
loading?: boolean
disabled?: boolean
type?: ButtonType | 'danger' | 'secondary' | undefined
size?: NcButtonSize
centered?: boolean
fullWidth?: boolean
iconOnly?: boolean
iconPosition?: 'left' | 'right'
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
size: 'medium',
type: 'primary',
fullWidth: false,
centered: true,
iconPosition: 'left',
})
const emits = defineEmits(['update:loading'])
const slots = useSlots()
const NcButton = ref<HTMLElement | null>(null)
const size = computed(() => props.size)
const type = computed(() => props.type)
const loading = useVModel(props, 'loading', emits)
const isFocused = ref(false)
const isClicked = ref(false)
const onFocus = (e: FocusEvent) => {
// Only focus when coming from another element which is not a mouse click
nextTick(() => {
if (isClicked.value) {
isFocused.value = false
} else {
const relatedTarget = e.relatedTarget as HTMLElement | null
isFocused.value = !!relatedTarget
}
isClicked.value = false
})
}
const onBlur = () => {
isFocused.value = false
isClicked.value = false
}
useEventListener(NcButton, 'mousedown', () => {
isClicked.value = true
})
</script>
<template>
<a-button
ref="NcButton"
:class="{
'small': size === 'small',
'medium': size === 'medium',
'xsmall': size === 'xsmall',
'xxsmall': size === 'xxsmall',
'size-xs': size === 'xs',
'focused': isFocused,
}"
:disabled="props.disabled"
:loading="loading"
:tabindex="props.disabled ? -1 : 0"
:type="type"
class="nc-button"
@blur="onBlur"
@focus="onFocus"
>
<div
:class="{
'justify-center': props.centered,
'justify-start': !props.centered,
}"
class="flex flex-row gap-x-2.5 w-full"
>
<template v-if="iconPosition === 'left'">
<GeneralLoader
v-if="loading"
:class="{
'!text-white': type === 'primary' || type === 'danger',
'!text-gray-800': type !== 'primary' && type !== 'danger',
}"
class="flex !bg-inherit"
size="medium"
/>
<slot v-else name="icon" />
</template>
<div
v-if="!(size === 'xxsmall' && loading) && !props.iconOnly"
:class="{
'font-medium': type === 'primary' || type === 'danger',
'w-full': props.fullWidth,
}"
class="flex flex-row items-center"
>
<slot v-if="loading && slots.loading" name="loading" />
<slot v-else />
</div>
<template v-if="iconPosition === 'right'">
<GeneralLoader
v-if="loading"
:class="{
'!text-white': type === 'primary' || type === 'danger',
'!text-gray-800': type !== 'primary' && type !== 'danger',
}"
class="flex !bg-inherit"
size="medium"
/>
<slot v-else name="icon" />
</template>
</div>
</a-button>
</template>
<style lang="scss">
.ant-btn:before {
display: none !important;
}
.nc-button {
// Not Icon
:not(.nc-icon):not(.material-symbols) {
line-height: 0.95;
}
> .ant-btn-loading-icon {
display: none !important;
}
}
.nc-button {
@apply !xs:(outline-none)
box-shadow: 0px 5px 3px -2px rgba(0, 0, 0, 0.02), 0px 3px 1px -2px rgba(0, 0, 0, 0.06);
outline: none;
}
.desktop {
.nc-button.ant-btn.focused {
box-shadow: 0px 0px 0px 2px #fff, 0px 0px 0px 4px #3069fe;
}
.nc-button.ant-btn-text.focused {
@apply text-brand-500;
}
}
.nc-button.ant-btn {
@apply rounded-lg font-medium;
}
.nc-button.ant-btn.small {
@apply py-1 px-1.75 h-8 min-w-8;
}
.nc-button.ant-btn.medium {
@apply py-2 px-4 h-10 min-w-10 xs:(h-10.5 max-h-10.5 min-w-10.5 !px-3);
}
.nc-button.ant-btn.size-xs {
@apply px-2 py-0 h-7 min-w-7 rounded-lg text-small leading-[18px];
& > div {
@apply gap-x-2;
}
}
.nc-button.ant-btn.xsmall {
@apply p-0.25 h-6.25 min-w-6.25 rounded-md;
}
.nc-button.ant-btn.xxsmall {
@apply p-0 h-5.75 min-w-5.75 rounded-md;
}
.nc-button.ant-btn[disabled],
.ant-btn-text.nc-button.ant-btn[disabled] {
box-shadow: none !important;
@apply bg-gray-50 border-0 text-gray-300 !cursor-not-allowed md:(hover:bg-gray-50);
}
.nc-button.ant-btn-text.ant-btn[disabled] {
@apply bg-transparent hover:bg-transparent;
}
.nc-button.ant-btn-secondary[disabled] {
@apply bg-white hover:bg-white border-1 border-gray-100 text-gray-300;
}
.nc-button.ant-btn-primary {
@apply bg-brand-500 border-0 text-white xs:(hover:border-0) md:(hover:bg-brand-600);
}
.nc-button.ant-btn-secondary {
@apply bg-white border-1 border-gray-200 text-gray-700 md:(hover:bg-gray-100);
}
.nc-button.ant-btn-danger {
@apply bg-red-500 border-0 hover:border-0 md:(hover:bg-red-600);
}
.nc-button.ant-btn-text {
box-shadow: none;
@apply bg-transparent border-0 text-gray-700 hover:text-gray-900 hover:bg-gray-100;
&:focus {
box-shadow: none;
}
}
</style>