|
|
|
@ -264,6 +264,18 @@ onMounted(async () => {
|
|
|
|
|
|
|
|
|
|
<template> |
|
|
|
|
<ExtensionsExtensionWrapper> |
|
|
|
|
<template v-if="fullscreen" #headerExtra> |
|
|
|
|
<NcTooltip class="flex" placement="topRight" :disabled="!isExporting"> |
|
|
|
|
<template #title> The CSV file is being prepared in the background. You'll be notified once it's ready. </template> |
|
|
|
|
<NcButton |
|
|
|
|
:disabled="!exportPayload?.viewId || isExporting" |
|
|
|
|
:loading="isExporting" |
|
|
|
|
size="small" |
|
|
|
|
@click="exportDataAsync" |
|
|
|
|
>{{ isExporting ? 'Generating' : 'Export' }}</NcButton |
|
|
|
|
> |
|
|
|
|
</NcTooltip> |
|
|
|
|
</template> |
|
|
|
|
<div |
|
|
|
|
ref="dataExporterRef" |
|
|
|
|
class="data-exporter" |
|
|
|
@ -272,70 +284,12 @@ onMounted(async () => {
|
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<div |
|
|
|
|
v-if="!fullscreen" |
|
|
|
|
class="p-3 flex flex-col gap-3" |
|
|
|
|
:class="{ |
|
|
|
|
'bg-white': fullscreen, |
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<div v-if="fullscreen" class="flex items-center gap-3 max-w-full"> |
|
|
|
|
<div class="flex flex-col gap-2 w-[calc(50%_-_6px)]"> |
|
|
|
|
<div>Separator</div> |
|
|
|
|
<a-form-item class="!my-0 flex-1"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.delimiter" |
|
|
|
|
placeholder="-select separator-" |
|
|
|
|
:disabled="isExporting" |
|
|
|
|
class="nc-data-exporter-separator nc-select-shadow" |
|
|
|
|
dropdown-class-name="w-[180px]" |
|
|
|
|
@change="saveChanges" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="delimiter of csvColumnSeparatorOptions" :key="delimiter.value" :value="delimiter.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ delimiter.label }}</template> |
|
|
|
|
<span>{{ delimiter.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.delimiter === delimiter.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex flex-col gap-2 w-[calc(50%_-_6px)]"> |
|
|
|
|
<div class="min-w-[65px]">Encoding</div> |
|
|
|
|
<a-form-item class="!my-0 flex-1"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.encoding" |
|
|
|
|
placeholder="-select encoding-" |
|
|
|
|
class="nc-data-exporter-encoding nc-select-shadow" |
|
|
|
|
dropdown-class-name="w-[190px]" |
|
|
|
|
:filter-option="filterOption" |
|
|
|
|
show-search |
|
|
|
|
@change="saveChanges" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="encoding of charsetOptions" :key="encoding.label" :value="encoding.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ encoding.label }}</template> |
|
|
|
|
<span>{{ encoding.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.encoding === encoding.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex items-center justify-between gap-2.5 flex-wrap"> |
|
|
|
|
<div |
|
|
|
|
class="nc-data-exporter-select-wrapper flex-1 flex items-center border-1 border-nc-border-gray-medium rounded-lg relative shadow-default" |
|
|
|
@ -435,112 +389,245 @@ onMounted(async () => {
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div |
|
|
|
|
class="data-exporter-body flex-1 flex flex-col" |
|
|
|
|
class="data-exporter-body flex-1 flex" |
|
|
|
|
:class="{ |
|
|
|
|
'rounded-lg border-1 m-3': fullscreen, |
|
|
|
|
'': fullscreen, |
|
|
|
|
'flex-col': !fullscreen, |
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<div class="data-exporter-header">Recent Exports</div> |
|
|
|
|
<div v-if="exportedFiles.length" class="flex-1 flex flex-col nc-scrollbar-thin max-h-[calc(100%_-_25px)]"> |
|
|
|
|
<template v-for="exp of exportedFiles"> |
|
|
|
|
<div |
|
|
|
|
v-if="exp.status === JobStatus.COMPLETED ? exp.result : true" |
|
|
|
|
:key="exp.id" |
|
|
|
|
class="p-3 flex gap-2 justify-between border-b-1" |
|
|
|
|
:class="{ |
|
|
|
|
'px-4 py-3': fullscreen, |
|
|
|
|
'px-3 py-2': !fullscreen, |
|
|
|
|
'bg-white hover:bg-gray-50': exp.status === JobStatus.COMPLETED, |
|
|
|
|
'bg-nc-bg-red-light': exp.status !== JobStatus.COMPLETED, |
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<div |
|
|
|
|
v-if="fullscreen" |
|
|
|
|
class="w-[320px] border-r-1 border-r-nc-border-gray-medium bg-white p-4 pt-t flex flex-col gap-5 nc-scrollbar-thin" |
|
|
|
|
> |
|
|
|
|
<div class="text-base font-bold text-nc-content-gray-extreme">Settings</div> |
|
|
|
|
<div class="flex flex-col gap-2"> |
|
|
|
|
<div class="text-nc-content-gray font-medium">Table</div> |
|
|
|
|
<a-form-item class="!my-0"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.tableId" |
|
|
|
|
placeholder="-select table-" |
|
|
|
|
:disabled="isExporting" |
|
|
|
|
class="nc-data-exporter-table-select-sidebar nc-select-shadow" |
|
|
|
|
:filter-option="filterOption" |
|
|
|
|
dropdown-class-name="w-[250px]" |
|
|
|
|
show-search |
|
|
|
|
@change="onTableSelect" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="table of tableList" :key="table.label" :value="table.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<div class="min-w-5 flex items-center justify-center"> |
|
|
|
|
<GeneralTableIcon :meta="{ meta: table.meta }" class="text-gray-500" /> |
|
|
|
|
</div> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ table.label }}</template> |
|
|
|
|
<span>{{ table.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.tableId === table.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex flex-col gap-2"> |
|
|
|
|
<div class="text-nc-content-gray font-medium">View</div> |
|
|
|
|
<a-form-item class="!my-0 min-w-1/2"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.viewId" |
|
|
|
|
placeholder="-select view-" |
|
|
|
|
:disabled="isExporting" |
|
|
|
|
class="nc-data-exporter-view-select-sidebar nc-select-shadow" |
|
|
|
|
dropdown-class-name="w-[250px]" |
|
|
|
|
:filter-option="filterOption" |
|
|
|
|
show-search |
|
|
|
|
placement="bottomRight" |
|
|
|
|
@change="onViewSelect" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="view of viewList" :key="view.label" :value="view.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<div class="min-w-5 flex items-center justify-center"> |
|
|
|
|
<GeneralViewIcon :meta="{ meta: view.meta, type: view.type }" class="flex-none text-gray-500" /> |
|
|
|
|
</div> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ view.label }}</template> |
|
|
|
|
<span>{{ view.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.viewId === view.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex flex-col gap-2"> |
|
|
|
|
<div>Separator</div> |
|
|
|
|
<a-form-item class="!my-0 flex-1"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.delimiter" |
|
|
|
|
placeholder="-select separator-" |
|
|
|
|
:disabled="isExporting" |
|
|
|
|
class="nc-data-exporter-separator nc-select-shadow" |
|
|
|
|
dropdown-class-name="w-[180px]" |
|
|
|
|
@change="saveChanges" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="delimiter of csvColumnSeparatorOptions" :key="delimiter.value" :value="delimiter.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ delimiter.label }}</template> |
|
|
|
|
<span>{{ delimiter.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.delimiter === delimiter.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex flex-col gap-2"> |
|
|
|
|
<div class="min-w-[65px]">Encoding</div> |
|
|
|
|
<a-form-item class="!my-0 flex-1"> |
|
|
|
|
<NcSelect |
|
|
|
|
v-model:value="exportPayload.encoding" |
|
|
|
|
placeholder="-select encoding-" |
|
|
|
|
class="nc-data-exporter-encoding nc-select-shadow" |
|
|
|
|
dropdown-class-name="w-[190px]" |
|
|
|
|
:filter-option="filterOption" |
|
|
|
|
show-search |
|
|
|
|
@change="saveChanges" |
|
|
|
|
> |
|
|
|
|
<a-select-option v-for="encoding of charsetOptions" :key="encoding.label" :value="encoding.value"> |
|
|
|
|
<div class="w-full flex items-center gap-2"> |
|
|
|
|
<NcTooltip class="flex-1 truncate" show-on-truncate-only> |
|
|
|
|
<template #title>{{ encoding.label }}</template> |
|
|
|
|
<span>{{ encoding.label }}</span> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<component |
|
|
|
|
:is="iconMap.check" |
|
|
|
|
v-if="exportPayload.encoding === encoding.value" |
|
|
|
|
id="nc-selected-item-icon" |
|
|
|
|
class="flex-none text-primary w-4 h-4" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-select-option> |
|
|
|
|
</NcSelect> |
|
|
|
|
</a-form-item> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="flex flex-col flex-1 nc-scrollbar-thin"> |
|
|
|
|
<div class="data-exporter-header sticky top-0 z-100">Recent Exports</div> |
|
|
|
|
<div v-if="exportedFiles.length" class="flex-1 flex flex-col max-h-[calc(100%_-_25px)]"> |
|
|
|
|
<template v-for="exp of exportedFiles"> |
|
|
|
|
<div |
|
|
|
|
class="flex-1 flex items-start gap-3" |
|
|
|
|
v-if="exp.status === JobStatus.COMPLETED ? exp.result : true" |
|
|
|
|
:key="exp.id" |
|
|
|
|
class="p-3 flex gap-2 justify-between border-b-1" |
|
|
|
|
:class="{ |
|
|
|
|
'max-w-[calc(100%_-_74px)]': exp.status === JobStatus.COMPLETED && !exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_113px)]': exp.status === JobStatus.COMPLETED && exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_48px)]': exp.status !== JobStatus.COMPLETED && !exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_85px)]': exp.status !== JobStatus.COMPLETED && exp.result.isNew, |
|
|
|
|
'px-4 py-3': fullscreen, |
|
|
|
|
'px-3 py-2': !fullscreen, |
|
|
|
|
'bg-white hover:bg-gray-50': exp.status === JobStatus.COMPLETED, |
|
|
|
|
'bg-nc-bg-red-light': exp.status !== JobStatus.COMPLETED, |
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<NcTooltip v-if="[JobStatus.COMPLETED, JobStatus.FAILED].includes(exp.status)" class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ jobStatusTooltip[exp.status] }} |
|
|
|
|
</template> |
|
|
|
|
<GeneralIcon |
|
|
|
|
:icon="exp.status === JobStatus.COMPLETED ? 'circleCheckSolid' : 'alertTriangleSolid'" |
|
|
|
|
class="flex-none h-5 w-5" |
|
|
|
|
:class="{ |
|
|
|
|
'!text-green-700': exp.status === JobStatus.COMPLETED, |
|
|
|
|
'!text-red-700': exp.status === JobStatus.FAILED, |
|
|
|
|
}" |
|
|
|
|
/> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<div v-else class="h-5 flex items-center"> |
|
|
|
|
<GeneralLoader size="regular" class="flex-none" /> |
|
|
|
|
</div> |
|
|
|
|
<div |
|
|
|
|
class="flex-1 flex items-start gap-3" |
|
|
|
|
:class="{ |
|
|
|
|
'max-w-[calc(100%_-_74px)]': exp.status === JobStatus.COMPLETED && !exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_113px)]': exp.status === JobStatus.COMPLETED && exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_48px)]': exp.status !== JobStatus.COMPLETED && !exp.result.isNew, |
|
|
|
|
'max-w-[calc(100%_-_85px)]': exp.status !== JobStatus.COMPLETED && exp.result.isNew, |
|
|
|
|
}" |
|
|
|
|
> |
|
|
|
|
<NcTooltip v-if="[JobStatus.COMPLETED, JobStatus.FAILED].includes(exp.status)" class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ jobStatusTooltip[exp.status] }} |
|
|
|
|
</template> |
|
|
|
|
<GeneralIcon |
|
|
|
|
:icon="exp.status === JobStatus.COMPLETED ? 'circleCheckSolid' : 'alertTriangleSolid'" |
|
|
|
|
class="flex-none h-5 w-5" |
|
|
|
|
:class="{ |
|
|
|
|
'!text-green-700': exp.status === JobStatus.COMPLETED, |
|
|
|
|
'!text-red-700': exp.status === JobStatus.FAILED, |
|
|
|
|
}" |
|
|
|
|
/> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<div v-else class="h-5 flex items-center"> |
|
|
|
|
<GeneralLoader size="regular" class="flex-none" /> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="flex-1 max-w-[calc(100%_-_28px)] flex flex-col gap-1"> |
|
|
|
|
<div class="inline-flex gap-1 text-sm text-gray-800 -ml-[1px]"> |
|
|
|
|
<span class="inline-flex items-center h-5"> |
|
|
|
|
<GeneralIcon icon="file" class="flex-none text-gray-600/80 h-3.5 w-3.5" /> |
|
|
|
|
</span> |
|
|
|
|
<NcTooltip class="truncate max-w-[calc(100%_-_20px)]" show-on-truncate-only> |
|
|
|
|
<template #title> |
|
|
|
|
<div class="flex-1 max-w-[calc(100%_-_28px)] flex flex-col gap-1"> |
|
|
|
|
<div class="inline-flex gap-1 text-sm text-gray-800 -ml-[1px]"> |
|
|
|
|
<span class="inline-flex items-center h-5"> |
|
|
|
|
<GeneralIcon icon="file" class="flex-none text-gray-600/80 h-3.5 w-3.5" /> |
|
|
|
|
</span> |
|
|
|
|
<NcTooltip class="truncate max-w-[calc(100%_-_20px)]" show-on-truncate-only> |
|
|
|
|
<template #title> |
|
|
|
|
{{ exp.result.title || titleHelper() }} |
|
|
|
|
</template> |
|
|
|
|
{{ exp.result.title || titleHelper() }} |
|
|
|
|
</template> |
|
|
|
|
{{ exp.result.title || titleHelper() }} |
|
|
|
|
</NcTooltip> |
|
|
|
|
</div> |
|
|
|
|
</NcTooltip> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div v-if="exp.result.timestamp" name="error" class="text-small leading-[18px] text-nc-content-gray-muted"> |
|
|
|
|
{{ timeAgo(dayjs(exp.result.timestamp).toString()) }} |
|
|
|
|
<div v-if="exp.result.timestamp" name="error" class="text-small leading-[18px] text-nc-content-gray-muted"> |
|
|
|
|
{{ timeAgo(dayjs(exp.result.timestamp).toString()) }} |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div v-if="exp.result.isNew" class="flex h-7 flex items-center"> |
|
|
|
|
<NcBadge color="green" :border="false" class="!bg-nc-bg-green-light !text-nc-content-green-dark">{{ |
|
|
|
|
$t('general.new') |
|
|
|
|
}}</NcBadge> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="exp.status === JobStatus.COMPLETED" class="flex" @click="handleDownload(urlHelper(exp.result.url))"> |
|
|
|
|
<NcTooltip class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ $t('general.download') }} |
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<NcButton type="secondary" size="xs" class="!px-[5px]"> |
|
|
|
|
<div class="flex items-center gap-2"> |
|
|
|
|
<GeneralIcon icon="download" /> |
|
|
|
|
</div> |
|
|
|
|
</NcButton> |
|
|
|
|
</NcTooltip> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="exp.result.isNew" class="flex h-7 flex items-center"> |
|
|
|
|
<NcBadge color="green" :border="false" class="!bg-nc-bg-green-light !text-nc-content-green-dark">{{ |
|
|
|
|
$t('general.new') |
|
|
|
|
}}</NcBadge> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="exp.status === JobStatus.COMPLETED" class="flex" @click="handleDownload(urlHelper(exp.result.url))"> |
|
|
|
|
<NcTooltip class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ $t('general.download') }} |
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<NcButton type="secondary" size="xs" class="!px-[5px]"> |
|
|
|
|
<div class="flex items-center gap-2"> |
|
|
|
|
<GeneralIcon icon="download" /> |
|
|
|
|
</div> |
|
|
|
|
</NcButton> |
|
|
|
|
</NcTooltip> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="flex"> |
|
|
|
|
<NcTooltip class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ $t('general.remove') }} |
|
|
|
|
</template> |
|
|
|
|
<div class="flex"> |
|
|
|
|
<NcTooltip class="flex"> |
|
|
|
|
<template #title> |
|
|
|
|
{{ $t('general.remove') }} |
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<NcButton type="text" size="xs" class="!px-[5px]" @click="onRemoveExportedFile(exp.id)"> |
|
|
|
|
<GeneralIcon icon="close" /> |
|
|
|
|
</NcButton> |
|
|
|
|
</NcTooltip> |
|
|
|
|
<NcButton type="text" size="xs" class="!px-[5px]" @click="onRemoveExportedFile(exp.id)"> |
|
|
|
|
<GeneralIcon icon="close" /> |
|
|
|
|
</NcButton> |
|
|
|
|
</NcTooltip> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<div v-else class="px-3 py-2 flex-1 flex items-center justify-center text-gray-800"> |
|
|
|
|
<a-empty |
|
|
|
|
:image-style="{ |
|
|
|
|
height: '24px', |
|
|
|
|
}" |
|
|
|
|
:image="Empty.PRESENTED_IMAGE_SIMPLE" |
|
|
|
|
description="No exports" |
|
|
|
|
class="!my-0" |
|
|
|
|
/> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<div v-else class="px-3 py-2 flex-1 flex items-center justify-center text-gray-800"> |
|
|
|
|
<a-empty |
|
|
|
|
:image-style="{ |
|
|
|
|
height: '24px', |
|
|
|
|
}" |
|
|
|
|
:image="Empty.PRESENTED_IMAGE_SIMPLE" |
|
|
|
|
description="No exports" |
|
|
|
|
class="!my-0" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|