-
-
-
-
-
- Model Selector
-
-
+
Selected: {{ selectedItem }}
@@ -176,14 +148,7 @@ export const DefaultIcons: Story = {
},
template: `
-
-
-
-
-
- Files
-
-
+
`
})
@@ -228,14 +193,7 @@ export const LongLabels: Story = {
},
template: `
-
-
-
-
-
- Settings
-
-
+
`
})
diff --git a/src/components/widget/panel/LeftSidePanel.vue b/src/components/widget/panel/LeftSidePanel.vue
index 53d195029..3711897f8 100644
--- a/src/components/widget/panel/LeftSidePanel.vue
+++ b/src/components/widget/panel/LeftSidePanel.vue
@@ -1,47 +1,41 @@
-
-
-
-
-
-
-
-
-
@@ -52,8 +46,6 @@ import NavItem from '@/components/widget/nav/NavItem.vue'
import NavTitle from '@/components/widget/nav/NavTitle.vue'
import type { NavGroupData, NavItemData } from '@/types/navTypes'
-import PanelHeader from './PanelHeader.vue'
-
const { navItems = [], modelValue } = defineProps<{
navItems?: (NavItemData | NavGroupData)[]
modelValue?: string | null
diff --git a/src/components/widget/panel/PanelHeader.vue b/src/components/widget/panel/PanelHeader.vue
deleted file mode 100644
index cdcc4eb20..000000000
--- a/src/components/widget/panel/PanelHeader.vue
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/src/components/widget/panel/RightSidePanel.vue b/src/components/widget/panel/RightSidePanel.vue
deleted file mode 100644
index 85e5aee69..000000000
--- a/src/components/widget/panel/RightSidePanel.vue
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/src/platform/assets/components/AssetBadgeGroup.vue b/src/platform/assets/components/AssetBadgeGroup.vue
index 5c85713e4..46c39e917 100644
--- a/src/platform/assets/components/AssetBadgeGroup.vue
+++ b/src/platform/assets/components/AssetBadgeGroup.vue
@@ -1,5 +1,7 @@
-
+
+
+
+
+ {{ displayTitle }}
+
+
-
-
-
-
- {{ displayTitle }}
-
-
+ />
diff --git a/src/platform/assets/components/AssetCard.vue b/src/platform/assets/components/AssetCard.vue
index ccaf546c1..2b1b6fbe4 100644
--- a/src/platform/assets/components/AssetCard.vue
+++ b/src/platform/assets/components/AssetCard.vue
@@ -7,7 +7,7 @@
:tabindex="interactive ? 0 : -1"
:class="
cn(
- 'rounded-2xl overflow-hidden transition-all duration-200 bg-modal-card-background p-2 gap-2 flex flex-col h-full',
+ 'select-none rounded-2xl overflow-hidden transition-all duration-200 bg-modal-card-background p-2 gap-2 flex flex-col h-full',
interactive &&
'group appearance-none bg-transparent m-0 outline-none text-left hover:bg-secondary-background focus:bg-secondary-background border-none focus:outline-solid outline-base-foreground outline-4',
focused && 'bg-secondary-background outline-solid'
diff --git a/src/platform/assets/components/AssetFilterBar.vue b/src/platform/assets/components/AssetFilterBar.vue
index 040b1bc87..61ad40ec8 100644
--- a/src/platform/assets/components/AssetFilterBar.vue
+++ b/src/platform/assets/components/AssetFilterBar.vue
@@ -79,8 +79,9 @@ const fileFormats = ref([])
const baseModels = ref([])
const sortBy = ref('recent')
-const { availableFileFormats, availableBaseModels } =
- useAssetFilterOptions(assets)
+const { availableFileFormats, availableBaseModels } = useAssetFilterOptions(
+ () => assets
+)
const emit = defineEmits<{
filterChange: [filters: FilterState]
diff --git a/src/platform/assets/components/AssetGrid.vue b/src/platform/assets/components/AssetGrid.vue
index 05e0b0a10..03c624a79 100644
--- a/src/platform/assets/components/AssetGrid.vue
+++ b/src/platform/assets/components/AssetGrid.vue
@@ -15,7 +15,7 @@
diff --git a/src/platform/assets/components/modelInfo/ModelInfoField.vue b/src/platform/assets/components/modelInfo/ModelInfoField.vue
index 13a3206e7..448c9a0b6 100644
--- a/src/platform/assets/components/modelInfo/ModelInfoField.vue
+++ b/src/platform/assets/components/modelInfo/ModelInfoField.vue
@@ -1,7 +1,7 @@
- {{ label }}
+ {{ label }}
diff --git a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
index 834f33afa..589aab257 100644
--- a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
+++ b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue
@@ -5,7 +5,7 @@
>
-
+
{{ t('assetBrowser.modelInfo.basicInfo') }}
@@ -58,7 +58,7 @@
-
+
{{ t('assetBrowser.modelInfo.modelTagging') }}
@@ -134,7 +134,7 @@
-
+
{{ t('assetBrowser.modelInfo.modelDescription') }}
diff --git a/src/stores/assetsStore.ts b/src/stores/assetsStore.ts
index 0293f9b32..619c2ac26 100644
--- a/src/stores/assetsStore.ts
+++ b/src/stores/assetsStore.ts
@@ -279,12 +279,15 @@ export const useAssetsStore = defineStore('assets', () => {
const pendingRequestByKey = new Map()
- function createState(): ModelPaginationState {
+ function createState(
+ existingAssets?: Map
+ ): ModelPaginationState {
+ const assets = new Map(existingAssets)
return reactive({
- assets: new Map(),
+ assets,
offset: 0,
hasMore: true,
- isLoading: false
+ isLoading: true
})
}
@@ -336,8 +339,10 @@ export const useAssetsStore = defineStore('assets', () => {
key: string,
fetcher: (options: PaginationOptions) => Promise
): Promise {
- const state = createState()
- state.isLoading = true
+ const existingState = modelStateByKey.value.get(key)
+ const state = createState(existingState?.assets)
+
+ const seenIds = new Set()
const hasExistingData = modelStateByKey.value.has(key)
if (hasExistingData) {
@@ -363,19 +368,15 @@ export const useAssetsStore = defineStore('assets', () => {
pendingRequestByKey.delete(key)
modelStateByKey.value.set(key, state)
}
- state.assets = new Map(newAssets.map((a) => [a.id, a]))
- } else {
- const assetsToAdd = newAssets.filter(
- (a) => !state.assets.has(a.id)
- )
- if (assetsToAdd.length > 0) {
- assetsArrayCache.delete(key)
- for (const asset of assetsToAdd) {
- state.assets.set(asset.id, asset)
- }
- }
}
+ // Merge new assets into existing map and track seen IDs
+ for (const asset of newAssets) {
+ seenIds.add(asset.id)
+ state.assets.set(asset.id, asset)
+ }
+ state.assets = new Map(state.assets)
+
state.offset += newAssets.length
state.hasMore = newAssets.length === MODEL_BATCH_SIZE
@@ -388,17 +389,24 @@ export const useAssetsStore = defineStore('assets', () => {
}
} catch (err) {
if (isStale(key, state)) return
+ console.error(`Error loading batch for ${key}:`, err)
+
state.error = err instanceof Error ? err : new Error(String(err))
state.hasMore = false
- console.error(`Error loading batch for ${key}:`, err)
- if (state.offset === 0) {
- state.isLoading = false
- pendingRequestByKey.delete(key)
- // TODO: Add toast indicator for first-batch load failures
- }
+ state.isLoading = false
+ pendingRequestByKey.delete(key)
+
return
}
}
+
+ const staleIds = [...state.assets.keys()].filter(
+ (id) => !seenIds.has(id)
+ )
+ for (const id of staleIds) {
+ state.assets.delete(id)
+ }
+ assetsArrayCache.delete(key)
}
await loadBatches()
diff --git a/src/workbench/extensions/manager/components/manager/ManagerDialog.vue b/src/workbench/extensions/manager/components/manager/ManagerDialog.vue
index ad7657645..887243315 100644
--- a/src/workbench/extensions/manager/components/manager/ManagerDialog.vue
+++ b/src/workbench/extensions/manager/components/manager/ManagerDialog.vue
@@ -4,15 +4,12 @@
:content-title="$t('manager.discoverCommunityContent')"
class="manager-dialog"
>
+
+
+ {{ $t('manager.title') }}
+
-
-
-
-
-
- {{ $t('manager.title') }}
-
-
+