From 8aca2ed1971ff1519b54c1fbc899616e3c2cc5f7 Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Wed, 28 Jan 2026 14:25:07 -0800 Subject: [PATCH 1/3] feat: Change the card description to the filename (#8348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary No longer duplicates the badge info for the Model type. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8348-feat-Change-the-card-description-to-the-filename-2f66d73d3650818d99e1de479d1f8486) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action Co-authored-by: Amp --- .../assets/components/AssetCard.stories.ts | 21 ++++++++++--------- src/platform/assets/components/AssetCard.vue | 4 ++-- .../modelInfo/ModelInfoPanel.test.ts | 2 +- .../composables/useAssetBrowser.test.ts | 6 +++--- .../assets/composables/useAssetBrowser.ts | 16 ++++++-------- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/platform/assets/components/AssetCard.stories.ts b/src/platform/assets/components/AssetCard.stories.ts index c1753033e..49464259c 100644 --- a/src/platform/assets/components/AssetCard.stories.ts +++ b/src/platform/assets/components/AssetCard.stories.ts @@ -10,7 +10,7 @@ const createAssetData = ( overrides: Partial = {} ): AssetDisplayItem => ({ ...baseAsset, - description: + secondaryText: 'High-quality realistic images with perfect detail and natural lighting effects for professional photography', badges: [ { label: 'checkpoints', type: 'type' }, @@ -131,20 +131,21 @@ export const EdgeCases: Story = { // Default case for comparison createAssetData({ name: 'Complete Data', - description: 'Asset with all data present for comparison' + secondaryText: 'Asset with all data present for comparison' }), // No badges createAssetData({ id: 'no-badges', name: 'No Badges', - description: 'Testing graceful handling when badges are not provided', + secondaryText: + 'Testing graceful handling when badges are not provided', badges: [] }), // No stars createAssetData({ id: 'no-stars', name: 'No Stars', - description: 'Testing missing stars data gracefully', + secondaryText: 'Testing missing stars data gracefully', stats: { downloadCount: '1.8k', formattedDate: '3/15/25' @@ -154,7 +155,7 @@ export const EdgeCases: Story = { createAssetData({ id: 'no-downloads', name: 'No Downloads', - description: 'Testing missing downloads data gracefully', + secondaryText: 'Testing missing downloads data gracefully', stats: { stars: '4.2k', formattedDate: '3/15/25' @@ -164,7 +165,7 @@ export const EdgeCases: Story = { createAssetData({ id: 'no-date', name: 'No Date', - description: 'Testing missing date data gracefully', + secondaryText: 'Testing missing date data gracefully', stats: { stars: '4.2k', downloadCount: '1.8k' @@ -174,21 +175,21 @@ export const EdgeCases: Story = { createAssetData({ id: 'no-stats', name: 'No Stats', - description: 'Testing when all stats are missing', + secondaryText: 'Testing when all stats are missing', stats: {} }), - // Long description + // Long secondaryText createAssetData({ id: 'long-desc', name: 'Long Description', - description: + secondaryText: 'This is a very long description that should demonstrate how the component handles text overflow and truncation with ellipsis. The description continues with even more content to ensure we test the 2-line clamp behavior properly and see how it renders when there is significantly more text than can fit in the allocated space.' }), // Minimal data createAssetData({ id: 'minimal', name: 'Minimal', - description: 'Basic model', + secondaryText: 'Basic model', tags: ['models'], badges: [], stats: {} diff --git a/src/platform/assets/components/AssetCard.vue b/src/platform/assets/components/AssetCard.vue index 2b1b6fbe4..822b2498e 100644 --- a/src/platform/assets/components/AssetCard.vue +++ b/src/platform/assets/components/AssetCard.vue @@ -82,14 +82,14 @@

- {{ asset.description }} + {{ asset.secondaryText }}

diff --git a/src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts b/src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts index 981c1a01e..272d66b25 100644 --- a/src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts +++ b/src/platform/assets/components/modelInfo/ModelInfoPanel.test.ts @@ -34,7 +34,7 @@ describe('ModelInfoPanel', () => { created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z', last_access_time: '2024-01-01T00:00:00Z', - description: 'A test model description', + secondaryText: 'A test model description', badges: [], stats: {}, ...overrides diff --git a/src/platform/assets/composables/useAssetBrowser.test.ts b/src/platform/assets/composables/useAssetBrowser.test.ts index f6f4d75c9..22b51bbf6 100644 --- a/src/platform/assets/composables/useAssetBrowser.test.ts +++ b/src/platform/assets/composables/useAssetBrowser.test.ts @@ -84,14 +84,14 @@ describe('useAssetBrowser', () => { expect(result.name).toBe(apiAsset.name) // Adds display properties - expect(result.description).toBe('Test model') + expect(result.secondaryText).toBe('test-asset.safetensors') expect(result.badges).toContainEqual({ label: 'checkpoints', type: 'type' }) }) - it('creates fallback description from tags when metadata missing', () => { + it('creates secondaryText from filename when metadata missing', () => { const apiAsset = createApiAsset({ tags: ['models', 'loras'], user_metadata: undefined @@ -100,7 +100,7 @@ describe('useAssetBrowser', () => { const { filteredAssets } = useAssetBrowser(ref([apiAsset])) const result = filteredAssets.value[0] - expect(result.description).toBe('loras model') + expect(result.secondaryText).toBe('test-asset.safetensors') }) it('removes category prefix from badge labels', () => { diff --git a/src/platform/assets/composables/useAssetBrowser.ts b/src/platform/assets/composables/useAssetBrowser.ts index 0b1af9c5d..b83ab5094 100644 --- a/src/platform/assets/composables/useAssetBrowser.ts +++ b/src/platform/assets/composables/useAssetBrowser.ts @@ -9,8 +9,8 @@ import type { FilterState } from '@/platform/assets/components/AssetFilterBar.vu import type { AssetItem } from '@/platform/assets/schemas/assetSchema' import { getAssetBaseModels, - getAssetDescription, - getAssetDisplayName + getAssetDisplayName, + getAssetFilename } from '@/platform/assets/utils/assetMetadataUtils' import { useAssetDownloadStore } from '@/stores/assetDownloadStore' import type { NavGroupData, NavItemData } from '@/types/navTypes' @@ -70,7 +70,7 @@ type AssetBadge = { // Display properties for transformed assets export interface AssetDisplayItem extends AssetItem { - description: string + secondaryText: string badges: AssetBadge[] stats: { formattedDate?: string @@ -116,15 +116,11 @@ export function useAssetBrowser( // Transform API asset to display asset function transformAssetForDisplay(asset: AssetItem): AssetDisplayItem { - // Extract description from metadata or create from tags - const typeTag = asset.tags.find((tag) => tag !== 'models') - const description = - getAssetDescription(asset) || - `${typeTag || t('assetBrowser.unknown')} model` + const secondaryText = getAssetFilename(asset) - // Create badges from tags and metadata const badges: AssetBadge[] = [] + const typeTag = asset.tags.find((tag) => tag !== 'models') // Type badge from non-root tag if (typeTag) { // Remove category prefix from badge label (e.g. "checkpoint/model" → "model") @@ -152,7 +148,7 @@ export function useAssetBrowser( return { ...asset, - description, + secondaryText, badges, stats } From d5e9be6a64393100e4b98784c098d12d612875b1 Mon Sep 17 00:00:00 2001 From: AustinMroz Date: Wed, 28 Jan 2026 15:22:41 -0800 Subject: [PATCH 2/3] Additional linear tweaks (#8375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Textareas have a fixed (larger) height. This was requested by design and I thought I fixed it while back. | Before | After | | ------ | ----- | | before | after| - Since the typeform survey popover doesn't work well on mobile, the button will instead open the survey in a new tab for mobile users. - Workaround for the first linear output on local not being automatically selected for display - Add the linear mode toggle to the bottom left of mobile layout image - Adds a hamburger menu to the mobile layout providing buttons for opening workflows, templates, and an additional exit linear option. - Button takes up a full line of space, so it doesn't provide much space savings currently. May need some design iteration. image And an unrelated tweak requested by Comfy: when opening templates, the searchbar is autofocused. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8375-Additional-linear-tweaks-2f66d73d36508172a5e7e716d0cba873) by [Unito](https://www.unito.io) --- .../widget/WorkflowTemplateSelectorDialog.vue | 7 ++- .../sidebar/tabs/SidebarTabTemplate.vue | 10 +++- src/components/ui/TypeformPopoverButton.vue | 18 +++++- .../extensions/linearMode/LinearControls.vue | 4 +- .../extensions/linearMode/MobileMenu.vue | 58 +++++++++++++++++++ .../extensions/linearMode/OutputHistory.vue | 6 +- src/views/LinearView.vue | 15 +++-- 7 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 src/renderer/extensions/linearMode/MobileMenu.vue diff --git a/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue b/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue index acb39e2e8..ab16acac3 100644 --- a/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue +++ b/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue @@ -14,7 +14,12 @@