Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a88cdbc
feat: Refactor spoolman to support FilaMan integration
ManuelW77 May 24, 2026
f1a0e9b
fix: remove unnecessary empty line in SpoolSelectionDialog.vue
ManuelW77 May 24, 2026
a93cf39
feat: add filaman to Globals with appropriate dispatch
ManuelW77 May 24, 2026
0d4dc15
feat: add FilaMan icons and update FilamanCard and SpoolSelectionDial…
ManuelW77 May 24, 2026
63db6a2
feat: add FilaMan types and update socket actions for Filaman integra…
ManuelW77 May 24, 2026
d0a7a3a
feat: implement getSpoolRemainingPercent method for accurate spool we…
ManuelW77 May 24, 2026
6800ebd
feat: enhance serverFilamanProxyGetAvailableSpools to support paginat…
ManuelW77 May 24, 2026
8f3c5fb
feat: enhance supportsSpoolTracking to include Filaman support
ManuelW77 May 24, 2026
bafb831
feat: update FilaMan labels and titles in localization files for impr…
ManuelW77 May 24, 2026
18673dd
fix: update registered date fallback in mapFilamanSpoolToSpoolmanSpoo…
ManuelW77 May 24, 2026
81f72ee
feat: improve Filaman integration by enhancing spool fetching and loc…
ManuelW77 May 24, 2026
8ac22d1
feat: update server spool ID handling to support null values and impr…
ManuelW77 May 24, 2026
9410acf
feat: add notifications for Filaman active spool and status changes
ManuelW77 May 24, 2026
b596896
feat: enhance Filaman integration by adding info retrieval and updati…
ManuelW77 May 24, 2026
69652dd
feat: add serverFilamanProxyGetInfo action to retrieve Filaman server…
ManuelW77 May 24, 2026
e58343a
feat: enhance init action to support optional payload and check for F…
ManuelW77 May 24, 2026
21e930b
feat: enhance initComponents to conditionally pass payload for spoolm…
ManuelW77 May 24, 2026
01e3c8b
Update src/api/socketActions.ts
ManuelW77 May 31, 2026
d5ee593
Update src/store/spoolman/actions.ts
ManuelW77 May 31, 2026
2809b1c
Merge branch 'develop' into develop
ManuelW77 May 31, 2026
55dda36
feat: add FilamanCard and SpoolSelectionDialog components
ManuelW77 May 24, 2026
d011b20
fix: resolve CI type errors and lint warning
ManuelW77 May 31, 2026
0f93f0e
feat: enhance FilamanCard with progress tracking and macro spool entries
ManuelW77 Jun 1, 2026
cd687a1
feat: implement extruder spool management in FilamanCard and SpoolSel…
ManuelW77 Jun 1, 2026
a54e720
feat: implement extruder spool management and update state handling i…
ManuelW77 Jun 1, 2026
a909b2f
feat: enhance SpoolSelectionDialog to support extruder-based spool se…
ManuelW77 Jun 1, 2026
13a84b9
feat: update FilamanCard to enhance spool color handling and improve …
ManuelW77 Jun 1, 2026
4b17f56
Merge branch 'fluidd-core:develop' into develop
ManuelW77 Jun 1, 2026
86fbf46
chore: merge upstream fluidd-core/develop
ManuelW77 Jul 16, 2026
9827760
refactor: isolate FilaMan code for overlay reuse
ManuelW77 Jul 21, 2026
e97dd29
Implement feature X to enhance user experience and optimize performance
ManuelW77 Jul 29, 2026
2e70ca9
feat(filaman): repush button replaces spool picker
ManuelW77 Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6,982 changes: 6,982 additions & 0 deletions filaman-widget.patch

Large diffs are not rendered by default.

Binary file added public/img/icons/filaman-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions public/img/icons/filaman-spool.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
76 changes: 76 additions & 0 deletions src/api/filamanActions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import Vue from 'vue'
import type { NotifyOptions } from '@/plugins/socketClient'
import { consola } from 'consola'

const baseEmit = async <T = unknown>(method: string, options: NotifyOptions): Promise<T> => {
if (!Vue.$socket) {
consola.warn('Socket emit denied, socket not ready.', method, options)

throw new Error('Socket not ready')
} else {
const result = await Vue.$socket.emit(method, options)

return result as T
}
}

export const FilamanActions = {
getSpoolId (options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.SpoolIdResponse>(
'server.filaman.get_spool_id', {
dispatch: 'spoolman/onActiveSpool',
...options
}
)
},

getSpoolIds (options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.FilamanExtruderSpoolsResponse>(
'server.filaman.spool_ids', {
dispatch: 'spoolman/onExtruderSpoolsChanged',
...options
}
)
},

postSpoolId (spoolId: number | undefined, extruder?: string, options?: NotifyOptions) {
const params: Record<string, unknown> = spoolId != null ? { spool_id: spoolId } : {}
if (extruder != null) params.extruder = extruder

return baseEmit<Moonraker.Spoolman.SpoolIdResponse>(
'server.filaman.post_spool_id', {
dispatch: extruder != null ? 'spoolman/onExtruderSpoolsChanged' : 'spoolman/onActiveSpool',
...options,
params
}
)
},

repush (options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.FilamanExtruderSpoolsResponse>(
'server.filaman.repush', {
dispatch: 'spoolman/onExtruderSpoolsChanged',
...options
}
)
},

proxyGetAvailableSpools (page = 1, pageSize = 200, options?: NotifyOptions) {
const query = new URLSearchParams({
page: String(page),
page_size: String(pageSize)
}).toString()

return baseEmit<Moonraker.Spoolman.ProxyResponse<Moonraker.Spoolman.FilamanPaginatedResponse>>(
'server.filaman.proxy', {
...options,
params: {
request_method: 'GET',
path: '/api/v1/spools',
query,
use_v2_response: true
}
}
)
}
}
15 changes: 12 additions & 3 deletions src/components/layout/AppSettingsNav.vue
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,17 @@ export default class AppSettingsNav extends Vue {
{ name: this.$t('app.setting.title.gcode_preview'), hash: '#gcodePreview', visible: true },
{ name: this.$t('app.general.title.timelapse'), hash: '#timelapse', visible: this.supportsTimelapse },
{ name: this.$t('app.mmu.title.headline'), hash: '#mmu', visible: this.supportsMmu },
{ name: this.$t('app.spoolman.title.spoolman'), hash: '#spoolman', visible: this.supportsSpoolman },
{ name: this.spoolTrackingSettingsTitle, hash: '#spoolman', visible: this.supportsSpoolTracking },
{ name: this.$t('app.version.title'), hash: '#versions', visible: this.supportsVersions }
]
}

get spoolTrackingSettingsTitle (): string {
return this.$typedGetters['server/componentSupport']('filaman')
? this.$t('app.filaman.title.filaman').toString()
: this.$t('app.spoolman.title.spoolman').toString()
}

get supportsVersions (): boolean {
return this.$typedGetters['server/componentSupport']('update_manager')
}
Expand All @@ -61,8 +67,11 @@ export default class AppSettingsNav extends Vue {
return this.$typedGetters['server/componentSupport']('timelapse')
}

get supportsSpoolman (): boolean {
return this.$typedGetters['server/componentSupport']('spoolman')
get supportsSpoolTracking (): boolean {
return (
this.$typedGetters['server/componentSupport']('spoolman') ||
this.$typedGetters['server/componentSupport']('filaman')
)
}

get supportsMmu (): boolean {
Expand Down
21 changes: 17 additions & 4 deletions src/components/settings/SpoolmanSettings.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div>
<v-subheader id="spoolman">
{{ $t('app.spoolman.title.spoolman') }}
{{ headingTitle }}
</v-subheader>
<v-card
:elevation="5"
Expand All @@ -18,8 +18,9 @@
/>
</app-setting>

<v-divider />
<v-divider v-if="supportsQRCodeScanSettings" />
<app-setting
v-if="supportsQRCodeScanSettings"
:title="$tc('app.spoolman.setting.auto_open_qr_camera')"
>
<v-select
Expand All @@ -32,8 +33,9 @@
/>
</app-setting>

<v-divider />
<v-divider v-if="supportsQRCodeScanSettings" />
<app-setting
v-if="supportsQRCodeScanSettings"
:title="$t('app.spoolman.setting.prefer_device_camera')"
>
<v-switch
Expand All @@ -43,8 +45,9 @@
/>
</app-setting>

<v-divider />
<v-divider v-if="supportsQRCodeScanSettings" />
<app-setting
v-if="supportsQRCodeScanSettings"
:title="$t('app.spoolman.setting.auto_select_spool_on_match')"
>
<v-switch
Expand Down Expand Up @@ -135,6 +138,16 @@ import type { SpoolmanRemainingFilamentUnit } from '@/store/config/types'
components: {}
})
export default class SpoolmanSettings extends Mixins(StateMixin) {
get headingTitle (): string {
return this.$typedGetters['server/componentSupport']('filaman')
? this.$t('app.filaman.title.filaman').toString()
: this.$t('app.spoolman.title.spoolman').toString()
}

get supportsQRCodeScanSettings (): boolean {
return !this.$typedGetters['server/componentSupport']('filaman')
}

get autoSpoolSelectionDialog (): boolean {
return this.$typedState.config.uiSettings.spoolman.autoSpoolSelectionDialog
}
Expand Down
Loading