fix(dui): prevents empty publish selection state

This commit is contained in:
Björn Steinhagen
2026-02-25 10:23:19 +02:00
parent ed4aa92ce1
commit a37b3389d6
2 changed files with 39 additions and 10 deletions
+22 -7
View File
@@ -32,13 +32,18 @@
<FilterListSelect :filter="modelCard.sendFilter" @update:filter="updateFilter" />
<div class="mt-4 flex justify-end items-center space-x-2">
<FormButton size="sm" color="outline" @click.stop="saveFilter()">
<FormButton
size="sm"
color="outline"
:disabled="isSaveDisabled"
@click.stop="saveFilter()"
>
Save
</FormButton>
<div v-tippy="!canCreateVersionPerm ? canCreateVersionMessage : ''">
<FormButton
size="sm"
:disabled="!canCreateVersionPerm"
:disabled="!canCreateVersionPerm || isSaveDisabled"
@click.stop="saveFilterAndSend()"
>
Save & Publish
@@ -206,22 +211,32 @@ const sendOrCancel = () => {
hasSetVersionMessage.value = false
}
let newFilter: ISendFilter
const newFilter = ref<ISendFilter>()
const updateFilter = (filter: ISendFilter) => {
newFilter = filter
newFilter.value = filter
}
const isSaveDisabled = computed(() => {
const f = newFilter.value || props.modelCard.sendFilter
return (
f?.name === 'Selection' &&
(!f.selectedObjectIds || f.selectedObjectIds.length === 0)
)
})
const saveFilter = async () => {
if (!newFilter.value) return
void trackEvent('DUI3 Action', {
name: 'Publish Card Filter Change',
filter: newFilter.typeDiscriminator
filter: newFilter.value.typeDiscriminator
})
// do not reset idmap while creating a new one because it is managed by host app
newFilter.idMap = props.modelCard.sendFilter?.idMap
newFilter.value.idMap = props.modelCard.sendFilter?.idMap
await store.patchModel(props.modelCard.modelCardId, {
sendFilter: newFilter,
sendFilter: newFilter.value,
expired: true
})
openFilterDialog.value = false
+17 -3
View File
@@ -48,7 +48,7 @@
>
<FormButton
full-width
:disabled="!canPublish || isLoadingPermissions"
:disabled="isPublishDisabled"
:loading="isLoadingPermissions"
@click="addModel"
>
@@ -62,6 +62,7 @@
</CommonDialog>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { storeToRefs } from 'pinia'
import { useSubscription } from '@vue/apollo-composable'
import type {
@@ -72,6 +73,7 @@ import type { ISendFilter } from '~/lib/models/card/send'
import { SenderModelCard } from '~/lib/models/card/send'
import { useHostAppStore } from '~/store/hostApp'
import { useAccountStore } from '~/store/accounts'
import { useSelectionStore } from '~/store/selection'
import { useMixpanel } from '~/lib/core/composables/mixpanel'
import { useSettingsTracking } from '~/lib/core/composables/trackSettings'
import type { CardSetting } from '~/lib/models/card/setting'
@@ -103,6 +105,19 @@ const { canCreateModelIngestion, canCreateVersion } = useCheckGraphql()
const canPublish = ref(false)
const publishLimitMessage = ref<string | undefined>(undefined)
const isLoadingPermissions = ref(false)
const hostAppStore = useHostAppStore()
const selectionStore = useSelectionStore()
const isSelectionEmpty = computed(() => {
return (
filter.value?.name === 'Selection' &&
(!selectionStore.selectionInfo.selectedObjectIds ||
selectionStore.selectionInfo.selectedObjectIds.length === 0)
)
})
const isPublishDisabled = computed(() => {
return !canPublish.value || isLoadingPermissions.value || isSelectionEmpty.value
})
const updateSearchText = (text: string | undefined) => {
urlParseError.value = undefined
@@ -119,6 +134,7 @@ watch(urlParsedData, (newVal) => {
watch(showSendDialog, (newVal) => {
if (newVal) {
urlParseError.value = undefined
void selectionStore.refreshSelectionFromHostApp()
}
})
@@ -204,8 +220,6 @@ const selectModel = (model: ModelListModelItemFragment) => {
void trackEvent('DUI3 Action', { name: 'Publish Wizard', step: 'model selected' })
}
const hostAppStore = useHostAppStore()
// accountId, serverUrl, projectId, modelId, sendFilter, settings
const addModel = async () => {
void trackEvent('DUI3 Action', {