+ {/* Draggable header */}
+
+
+
+
+
+ {provider.name}
- {isConnected && (
-
- {connectionCount}
+
+ {/* Capability tag */}
+
+ {provider.capability}
- )}
+ {isConnected && (
+
+ {connectionCount}
+
+ )}
+
-
- {/* Action buttons */}
-
- {/* Start/Stop/Setup buttons for local providers */}
- {!isCloud && onStart && onStop && (
- <>
- {isStarting ? (
-
-
-
- ) : needsSetup && canStart ? (
-
- ) : canStart ? (
-
- ) : canStop ? (
-
- ) : null}
- >
- )}
-
- {provider.isTemplate && onCreateServiceConfig && (
-
- )}
- {!provider.isTemplate && onDelete && (
+ {/* Action buttons */}
+
+ {/* Start/Stop/Setup buttons for local providers */}
+ {!isCloud && onStart && onStop && (
+ <>
+ {isStarting ? (
+
+
+
+ ) : needsSetup && canStart ? (
+
+ ) : canStart ? (
+
+ ) : canStop ? (
+
+ ) : null}
+ >
+ )}
- )}
-
-
-
-
-
- {/* Config vars display - show missing required first, then configured */}
- {(missingRequiredVars.length > 0 || configuredVars.length > 0) && (
-
-
- {/* Missing required fields - shown first with warning */}
- {missingRequiredVars.slice(0, 2).map((v) => (
-
handleButtonClick(e, onCreateServiceConfig)}
+ className="p-1 text-neutral-400 hover:text-primary-600 dark:hover:text-primary-400 hover:bg-neutral-100 dark:hover:bg-neutral-700 rounded"
+ title="Create new instance"
+ data-testid={`provider-create-instance-${provider.id}`}
>
- *
- {v.label}:{' '}
- Not set
-
- ))}
- {missingRequiredVars.length > 2 && (
-
- +{missingRequiredVars.length - 2} required
-
+
+
+ )}
+ {!provider.isTemplate && onDelete && (
+
)}
- {/* Configured fields - color code overrides */}
- {configuredVars.slice(0, 3 - Math.min(missingRequiredVars.length, 2)).map((v) => {
- // Check if this value is overridden from template
- const isOverridden = templateProvider &&
- templateProvider.configVars.find(tv => tv.key === v.key)?.value !== v.value
+
+
+
+
- return (
+ {/* Config vars display - show missing required first, then configured */}
+ {(missingRequiredVars.length > 0 || configuredVars.length > 0) && (
+
+
+ {/* Missing required fields - shown first with warning */}
+ {missingRequiredVars.slice(0, 2).map((v) => (
- {v.required && *}
- {v.label}:{' '}
- {v.value}
+ *
+ {v.label}:{' '}
+ Not set
- )
- })}
- {configuredVars.length > (3 - Math.min(missingRequiredVars.length, 2)) && (
-
- +{configuredVars.length - (3 - Math.min(missingRequiredVars.length, 2))} more
-
- )}
+ ))}
+ {missingRequiredVars.length > 2 && (
+
+ +{missingRequiredVars.length - 2} required
+
+ )}
+ {/* Configured fields - color code overrides */}
+ {configuredVars.slice(0, 3 - Math.min(missingRequiredVars.length, 2)).map((v) => {
+ // Check if this value is overridden from template
+ const isOverridden = templateProvider &&
+ templateProvider.configVars.find(tv => tv.key === v.key)?.value !== v.value
+
+ return (
+
+ {v.required && *}
+ {v.label}:{' '}
+ {v.value}
+
+ )
+ })}
+ {configuredVars.length > (3 - Math.min(missingRequiredVars.length, 2)) && (
+
+ +{configuredVars.length - (3 - Math.min(missingRequiredVars.length, 2))} more
+
+ )}
+
-
+ )}
+