Browse Source

Improved printer's slot card detail modal "link to spoolman" function

maziggy 4 months ago
parent
commit
0f229889fb

+ 11 - 2
frontend/src/components/FilamentHoverCard.tsx

@@ -14,6 +14,7 @@ interface FilamentData {
 interface SpoolmanConfig {
 interface SpoolmanConfig {
   enabled: boolean;
   enabled: boolean;
   onLinkSpool?: (trayUuid: string) => void;
   onLinkSpool?: (trayUuid: string) => void;
+  hasUnlinkedSpools?: boolean; // Whether there are spools available to link
 }
 }
 
 
 interface FilamentHoverCardProps {
 interface FilamentHoverCardProps {
@@ -268,9 +269,17 @@ export function FilamentHoverCard({ data, children, disabled, className = '', sp
                     <button
                     <button
                       onClick={(e) => {
                       onClick={(e) => {
                         e.stopPropagation();
                         e.stopPropagation();
-                        spoolman.onLinkSpool?.(data.trayUuid!);
+                        if (spoolman.hasUnlinkedSpools !== false) {
+                          spoolman.onLinkSpool?.(data.trayUuid!);
+                        }
                       }}
                       }}
-                      className="w-full flex items-center justify-center gap-1.5 px-2 py-1.5 bg-bambu-green/20 hover:bg-bambu-green/30 text-bambu-green text-xs font-medium rounded transition-colors"
+                      disabled={spoolman.hasUnlinkedSpools === false}
+                      className={`w-full flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs font-medium rounded transition-colors ${
+                        spoolman.hasUnlinkedSpools === false
+                          ? 'bg-bambu-gray/10 text-bambu-gray cursor-not-allowed'
+                          : 'bg-bambu-green/20 hover:bg-bambu-green/30 text-bambu-green'
+                      }`}
+                      title={spoolman.hasUnlinkedSpools === false ? 'No unlinked spools available' : 'Link this spool to a Spoolman spool'}
                     >
                     >
                       <Link2 className="w-3.5 h-3.5" />
                       <Link2 className="w-3.5 h-3.5" />
                       Link to Spoolman
                       Link to Spoolman

+ 16 - 0
frontend/src/pages/PrintersPage.tsx

@@ -862,6 +862,7 @@ function PrinterCard({
   viewMode = 'expanded',
   viewMode = 'expanded',
   amsThresholds,
   amsThresholds,
   spoolmanEnabled = false,
   spoolmanEnabled = false,
+  hasUnlinkedSpools = false,
 }: {
 }: {
   printer: Printer;
   printer: Printer;
   hideIfDisconnected?: boolean;
   hideIfDisconnected?: boolean;
@@ -874,6 +875,7 @@ function PrinterCard({
     tempFair: number;
     tempFair: number;
   };
   };
   spoolmanEnabled?: boolean;
   spoolmanEnabled?: boolean;
+  hasUnlinkedSpools?: boolean;
 }) {
 }) {
   const queryClient = useQueryClient();
   const queryClient = useQueryClient();
   const navigate = useNavigate();
   const navigate = useNavigate();
@@ -1923,6 +1925,7 @@ function PrinterCard({
                                         data={filamentData}
                                         data={filamentData}
                                         spoolman={{
                                         spoolman={{
                                           enabled: spoolmanEnabled,
                                           enabled: spoolmanEnabled,
+                                          hasUnlinkedSpools,
                                           onLinkSpool: spoolmanEnabled && filamentData.trayUuid ? (uuid) => {
                                           onLinkSpool: spoolmanEnabled && filamentData.trayUuid ? (uuid) => {
                                             setLinkSpoolModal({
                                             setLinkSpoolModal({
                                               trayUuid: uuid,
                                               trayUuid: uuid,
@@ -2082,6 +2085,7 @@ function PrinterCard({
                                     data={filamentData}
                                     data={filamentData}
                                     spoolman={{
                                     spoolman={{
                                       enabled: spoolmanEnabled,
                                       enabled: spoolmanEnabled,
+                                      hasUnlinkedSpools,
                                       onLinkSpool: spoolmanEnabled && filamentData.trayUuid ? (uuid) => {
                                       onLinkSpool: spoolmanEnabled && filamentData.trayUuid ? (uuid) => {
                                         setLinkSpoolModal({
                                         setLinkSpoolModal({
                                           trayUuid: uuid,
                                           trayUuid: uuid,
@@ -2186,6 +2190,7 @@ function PrinterCard({
                               data={extFilamentData}
                               data={extFilamentData}
                               spoolman={{
                               spoolman={{
                                 enabled: spoolmanEnabled,
                                 enabled: spoolmanEnabled,
+                                hasUnlinkedSpools,
                                 onLinkSpool: spoolmanEnabled && extFilamentData.trayUuid ? (uuid) => {
                                 onLinkSpool: spoolmanEnabled && extFilamentData.trayUuid ? (uuid) => {
                                   setLinkSpoolModal({
                                   setLinkSpoolModal({
                                     trayUuid: uuid,
                                     trayUuid: uuid,
@@ -3372,6 +3377,15 @@ export function PrintersPage() {
   });
   });
   const spoolmanEnabled = spoolmanStatus?.enabled && spoolmanStatus?.connected;
   const spoolmanEnabled = spoolmanStatus?.enabled && spoolmanStatus?.connected;
 
 
+  // Fetch unlinked spools to know if link button should be enabled
+  const { data: unlinkedSpools } = useQuery({
+    queryKey: ['unlinked-spools'],
+    queryFn: api.getUnlinkedSpools,
+    enabled: !!spoolmanEnabled,
+    staleTime: 30 * 1000, // 30 seconds
+  });
+  const hasUnlinkedSpools = unlinkedSpools && unlinkedSpools.length > 0;
+
   // Create a map of printer_id -> maintenance info for quick lookup
   // Create a map of printer_id -> maintenance info for quick lookup
   const maintenanceByPrinter = maintenanceOverview?.reduce(
   const maintenanceByPrinter = maintenanceOverview?.reduce(
     (acc, overview) => {
     (acc, overview) => {
@@ -3647,6 +3661,7 @@ export function PrintersPage() {
                       tempFair: Number(settings.ams_temp_fair) || 35,
                       tempFair: Number(settings.ams_temp_fair) || 35,
                     } : undefined}
                     } : undefined}
                     spoolmanEnabled={spoolmanEnabled}
                     spoolmanEnabled={spoolmanEnabled}
+                    hasUnlinkedSpools={hasUnlinkedSpools}
                   />
                   />
                 ))}
                 ))}
               </div>
               </div>
@@ -3668,6 +3683,7 @@ export function PrintersPage() {
               maintenanceInfo={maintenanceByPrinter[printer.id]}
               maintenanceInfo={maintenanceByPrinter[printer.id]}
               viewMode={viewMode}
               viewMode={viewMode}
               spoolmanEnabled={spoolmanEnabled}
               spoolmanEnabled={spoolmanEnabled}
+              hasUnlinkedSpools={hasUnlinkedSpools}
               amsThresholds={settings ? {
               amsThresholds={settings ? {
                 humidityGood: Number(settings.ams_humidity_good) || 40,
                 humidityGood: Number(settings.ams_humidity_good) || 40,
                 humidityFair: Number(settings.ams_humidity_fair) || 60,
                 humidityFair: Number(settings.ams_humidity_fair) || 60,

File diff suppressed because it is too large
+ 0 - 0
static/assets/index-CfJSg4r6.js


+ 1 - 1
static/index.html

@@ -23,7 +23,7 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-ByHF_LDf.js"></script>
+    <script type="module" crossorigin src="/assets/index-CfJSg4r6.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-j3n1gAEX.css">
     <link rel="stylesheet" crossorigin href="/assets/index-j3n1gAEX.css">
   </head>
   </head>
   <body>
   <body>

Some files were not shown because too many files changed in this diff