Skip to content
Open
Show file tree
Hide file tree
Changes from 10 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
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.
35 changes: 35 additions & 0 deletions src/api/socketActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1068,6 +1068,15 @@ export const SocketActions = {
)
},

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

serverSpoolmanPostSpoolId (spoolId: number | undefined, options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.SpoolIdResponse>(
'server.spoolman.post_spool_id', {
Expand All @@ -1080,6 +1089,18 @@ export const SocketActions = {
)
},

serverFilamanPostSpoolId (spoolId: number | undefined, options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.SpoolIdResponse>(
'server.filaman.post_spool_id', {
dispatch: 'spoolman/onActiveSpool',
...options,
params: {
spool_id: spoolId
}
}
)
},

serverSpoolmanProxyGetAvailableSpools (options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.ProxyResponse<Moonraker.Spoolman.Spool[]>>(
'server.spoolman.proxy', {
Expand All @@ -1094,6 +1115,20 @@ export const SocketActions = {
)
},

serverFilamanProxyGetAvailableSpools (page = 1, pageSize = 200, options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.ProxyResponse<Moonraker.Spoolman.FilamanPaginatedResponse>>(
'server.filaman.proxy', {
...options,
params: {
request_method: 'GET',
path: '/api/v1/spools',
query: `page=${page}&page_size=${pageSize}`,
Comment thread
ManuelW77 marked this conversation as resolved.
Outdated
use_v2_response: true
}
}
)
},

serverSpoolmanProxyGetInfo (options?: NotifyOptions) {
return baseEmit<Moonraker.Spoolman.ProxyResponse<Moonraker.Spoolman.Info>>(
'server.spoolman.proxy', {
Expand Down
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')
? 'FilaMan'
Comment thread
ManuelW77 marked this conversation as resolved.
Outdated
: 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
80 changes: 46 additions & 34 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,41 +18,43 @@
/>
</app-setting>

<v-divider />
<app-setting
:title="$tc('app.spoolman.setting.auto_open_qr_camera')"
>
<v-select
v-model="autoOpenQRDetectionCameraId"
filled
dense
single-line
hide-details="auto"
:items="supportedCameras"
/>
</app-setting>
<template v-if="supportsQRCodeScanSettings">
<v-divider />
<app-setting
:title="$tc('app.spoolman.setting.auto_open_qr_camera')"
>
<v-select
v-model="autoOpenQRDetectionCameraId"
filled
dense
single-line
hide-details="auto"
:items="supportedCameras"
/>
</app-setting>

<v-divider />
<app-setting
:title="$t('app.spoolman.setting.prefer_device_camera')"
>
<v-switch
v-model="preferDeviceCamera"
hide-details
class="mt-0 mb-4"
/>
</app-setting>
<v-divider />
<app-setting
:title="$t('app.spoolman.setting.prefer_device_camera')"
>
<v-switch
v-model="preferDeviceCamera"
hide-details
class="mt-0 mb-4"
/>
</app-setting>

<v-divider />
<app-setting
:title="$t('app.spoolman.setting.auto_select_spool_on_match')"
>
<v-switch
v-model="autoSelectSpoolOnMatch"
hide-details
class="mt-0 mb-4"
/>
</app-setting>
<v-divider />
<app-setting
:title="$t('app.spoolman.setting.auto_select_spool_on_match')"
>
<v-switch
v-model="autoSelectSpoolOnMatch"
hide-details
class="mt-0 mb-4"
/>
</app-setting>
</template>

<v-divider />
<app-setting
Expand Down Expand Up @@ -135,6 +137,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')
? 'FilaMan'
Comment thread
ManuelW77 marked this conversation as resolved.
Outdated
: 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
16 changes: 8 additions & 8 deletions src/components/widgets/afc/AfcCardUnitLaneBody.vue
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ export default class AfcCardUnitLaneBody extends Mixins(StateMixin, AfcMixin) {
readonly name!: string

showInfintiyDialog = false
showSpoolmanDialog = false
showSpoolTrackingDialog = false
showFilamentDialog = false
spoolmanSelection = false
spoolTrackingSelection = false

get lane (): Klipper.AfcLaneState | undefined {
return this.getAfcLaneObject(this.name)
Expand Down Expand Up @@ -174,7 +174,7 @@ export default class AfcCardUnitLaneBody extends Mixins(StateMixin, AfcMixin) {
}

get spoolFilamentName (): string {
return this.afcExistsSpoolman
return this.afcHasSpoolTracking
? this.spool?.filament?.name ?? this.$t('app.afc.Unknown').toString()
: ''
}
Expand All @@ -192,7 +192,7 @@ export default class AfcCardUnitLaneBody extends Mixins(StateMixin, AfcMixin) {
}

handleSelectSpool () {
this.spoolmanSelection = true
this.spoolTrackingSelection = true
this.$typedCommit('spoolman/setDialogState', {
show: true,
spoolSelectionOnly: true,
Expand All @@ -201,12 +201,12 @@ export default class AfcCardUnitLaneBody extends Mixins(StateMixin, AfcMixin) {
}

@Watch('$typedState.spoolman.dialog')
onSpoolmanChanged (dialog: SpoolSelectionDialogState) {
onSpoolTrackingDialogChanged (dialog: SpoolSelectionDialogState) {
if (
!dialog.show &&
this.spoolmanSelection
this.spoolTrackingSelection
) {
this.spoolmanSelection = false
this.spoolTrackingSelection = false

if (dialog.selectedSpoolId !== this.spoolId) {
this.sendGcode(`SET_SPOOL_ID LANE=${this.name} SPOOL_ID=${dialog.selectedSpoolId ?? ''}`)
Expand All @@ -215,7 +215,7 @@ export default class AfcCardUnitLaneBody extends Mixins(StateMixin, AfcMixin) {
}

onFilamentClick () {
if (this.afcExistsSpoolman) {
if (this.afcHasSpoolTracking) {
this.handleSelectSpool()
return
}
Expand Down
Loading