zidane-ui 9.1.13 → 9.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +2 -2
- package/dist/adapters/live.d.ts +29 -3
- package/dist/adapters/live.js +9 -1
- package/dist/adapters/server-composer-host.js +17 -2
- package/dist/adapters/server-extensions-host.d.ts +0 -1
- package/dist/adapters/server-extensions-host.js +5 -16
- package/dist/adapters/server-git-host.js +7 -16
- package/dist/adapters/server-host.js +181 -43
- package/dist/adapters/server-machines-host.d.ts +2 -0
- package/dist/adapters/server-machines-host.js +24 -25
- package/dist/adapters/server-onboarding-host.d.ts +1 -1
- package/dist/adapters/server-onboarding-host.js +3 -4
- package/dist/adapters/server-session-host.js +22 -3
- package/dist/adapters/server-settings-accounts.js +2 -2
- package/dist/adapters/server-settings-host.js +3 -3
- package/dist/adapters/server-settings-performance.js +7 -9
- package/dist/adapters/server-settings-sections.js +13 -14
- package/dist/adapters/server-sidebar-host.js +2 -2
- package/dist/adapters/sse-host.js +68 -3
- package/dist/adapters/sse-protocol.d.ts +12 -2
- package/dist/adapters/sse-protocol.js +4 -2
- package/dist/app/AppHostProvider.js +4 -3
- package/dist/app/ModalProvider.d.ts +13 -3
- package/dist/app/ModalProvider.js +103 -24
- package/dist/app/NoticeStack.d.ts +33 -0
- package/dist/app/NoticeStack.js +90 -0
- package/dist/app/index.d.ts +3 -2
- package/dist/app/index.js +3 -2
- package/dist/appearance/AppearanceProvider.js +2 -2
- package/dist/appearance/headless/index.js +1 -1
- package/dist/approvals/headless/index.js +2 -2
- package/dist/chat/SessionFilterMenu.d.ts +1 -1
- package/dist/chat/SessionFilterMenu.js +2 -1
- package/dist/chat/Transcript.js +1 -1
- package/dist/chat/composer/Composer.js +9 -6
- package/dist/chat/composer/ComposerEditor.js +1 -1
- package/dist/chat/composer/ConversationBadges.js +1 -1
- package/dist/chat/composer/ModelChainList.js +17 -8
- package/dist/chat/composer/ModelChainTooltip.js +5 -2
- package/dist/chat/composer/use-composer-stores.js +1 -1
- package/dist/chat/composer/use-draft-target.d.ts +20 -1
- package/dist/chat/composer/use-draft-target.js +122 -6
- package/dist/chat/composer/use-new-session-defaults.d.ts +5 -1
- package/dist/chat/composer/use-new-session-defaults.js +17 -4
- package/dist/chat/composer/use-run-meter.js +1 -1
- package/dist/chat/composer/use-send-prompt.js +1 -1
- package/dist/chat/headless/chip-labels.d.ts +1 -0
- package/dist/chat/headless/chip-labels.js +1 -0
- package/dist/chat/headless/composer/index.js +2 -2
- package/dist/chat/headless/draft-target.d.ts +21 -1
- package/dist/chat/headless/fixture-host.js +17 -2
- package/dist/chat/headless/host.d.ts +3 -3
- package/dist/chat/headless/index.d.ts +9 -9
- package/dist/chat/headless/index.js +15 -15
- package/dist/chat/headless/labels.d.ts +13 -4
- package/dist/chat/headless/labels.js +8 -5
- package/dist/chat/headless/session-list.d.ts +20 -6
- package/dist/chat/headless/session-list.js +1 -0
- package/dist/chat/headless/sidebar/directory.d.ts +56 -14
- package/dist/chat/headless/sidebar/directory.js +149 -70
- package/dist/chat/headless/sidebar/index.d.ts +3 -3
- package/dist/chat/headless/sidebar/index.js +3 -3
- package/dist/chat/headless/sidebar/labels.d.ts +15 -6
- package/dist/chat/headless/sidebar/types.d.ts +3 -1
- package/dist/chat/headless/sidebar/view.d.ts +13 -5
- package/dist/chat/headless/sidebar/view.js +31 -11
- package/dist/chat/headless/streams/actions.d.ts +5 -3
- package/dist/chat/headless/streams/actions.js +3 -2
- package/dist/chat/headless/streams/index.d.ts +3 -3
- package/dist/chat/headless/streams/merge.d.ts +6 -10
- package/dist/chat/headless/streams/merge.js +7 -21
- package/dist/chat/headless/streams/session-streams.d.ts +29 -4
- package/dist/chat/headless/streams/session-streams.js +86 -0
- package/dist/chat/headless/streams/store.d.ts +162 -16
- package/dist/chat/headless/streams/store.js +334 -38
- package/dist/chat/headless/streams/types.d.ts +10 -7
- package/dist/chat/headless/transcript-labels.d.ts +1 -0
- package/dist/chat/interactions/PlanCard.js +10 -3
- package/dist/chat/interactions/QuestionForm.js +7 -3
- package/dist/chat/interactions/card-ui.d.ts +5 -3
- package/dist/chat/interactions/card-ui.js +9 -7
- package/dist/chat/sidebar/SessionSidebar.js +5 -5
- package/dist/chat/sidebar/SidebarFilterMenu.js +3 -1
- package/dist/chat/sidebar/SidebarFrame.d.ts +4 -0
- package/dist/chat/sidebar/SidebarFrame.js +27 -9
- package/dist/chat/sidebar/SidebarGroupHeader.js +1 -1
- package/dist/chat/sidebar/SidebarHostProvider.d.ts +8 -5
- package/dist/chat/sidebar/SidebarHostProvider.js +13 -9
- package/dist/chat/sidebar/SidebarToggleButton.js +7 -3
- package/dist/chat/sidebar/index.d.ts +2 -2
- package/dist/chat/sidebar/session-menu.js +4 -4
- package/dist/chat/sidebar/useSaveViewAsSpace.js +2 -2
- package/dist/chat/testing/contract.js +2 -2
- package/dist/chat/transcript/AuthFailureCard.js +11 -8
- package/dist/chat/transcript/BadgeMenu.js +13 -2
- package/dist/chat/transcript/MermaidDiagram.js +7 -3
- package/dist/chat/transcript/fold.d.ts +4 -0
- package/dist/chat/transcript/fold.js +53 -22
- package/dist/chat/transcript/script-input.d.ts +1 -1
- package/dist/chat/transcript/shell-block.js +8 -4
- package/dist/chat/transcript/useStickToBottom.js +12 -0
- package/dist/components/BrowserSignIn.js +23 -21
- package/dist/components/Form.d.ts +6 -4
- package/dist/components/Form.js +16 -8
- package/dist/components/LoadError.d.ts +4 -2
- package/dist/components/LoadError.js +13 -9
- package/dist/components/Notice.d.ts +29 -0
- package/dist/components/Notice.js +63 -0
- package/dist/components/PanelEmpty.d.ts +1 -1
- package/dist/components/PanelEmpty.js +4 -2
- package/dist/components/Restricted.d.ts +1 -1
- package/dist/components/palette/PaletteList.js +8 -1
- package/dist/components/palette/PalettePanel.js +14 -6
- package/dist/core.css +24 -5
- package/dist/dist/{index-Bq87OcGy.d.ts → index-C6rzc-tt.d.ts} +28 -3
- package/dist/dist/index.d.ts +2 -2
- package/dist/dist/{timeout-B5pO5I5a.d.ts → timeout-Cz9dRF8Q.d.ts} +1 -1
- package/dist/extensions/ExtensionSettingsPage.js +2 -5
- package/dist/extensions/ExtensionSettingsSection.js +5 -4
- package/dist/extensions/ExtensionSettingsSidebar.js +3 -7
- package/dist/extensions/SettingsWireForm.d.ts +1 -7
- package/dist/extensions/SettingsWireForm.js +7 -5
- package/dist/extensions/headless/fixture-host.d.ts +1 -5
- package/dist/extensions/headless/fixture-host.js +2 -5
- package/dist/extensions/headless/host.d.ts +1 -11
- package/dist/extensions/headless/index.d.ts +3 -3
- package/dist/extensions/headless/index.js +6 -6
- package/dist/extensions/headless/select.d.ts +1 -11
- package/dist/extensions/headless/select.js +1 -18
- package/dist/extensions/hooks.js +1 -1
- package/dist/files/EditorColumn.js +13 -2
- package/dist/files/MediaDiff.js +1 -1
- package/dist/files/TreeColumn.js +13 -20
- package/dist/files/useEntryActions.js +1 -1
- package/dist/files/useOpenFiles.js +3 -1
- package/dist/git/BranchMenu.js +6 -4
- package/dist/git/ImportRepoDialog.js +18 -9
- package/dist/git/MoveSessionDialog.js +16 -8
- package/dist/git/RemoteFolderPicker.js +35 -17
- package/dist/git/SyncChip.js +17 -17
- package/dist/git/WherePicker.d.ts +16 -1
- package/dist/git/WherePicker.js +81 -37
- package/dist/git/headless/environment.d.ts +33 -3
- package/dist/git/headless/environment.js +33 -5
- package/dist/git/headless/index.d.ts +2 -2
- package/dist/git/headless/index.js +2 -2
- package/dist/git/headless/labels.d.ts +15 -2
- package/dist/git/headless/labels.js +17 -4
- package/dist/git/useEnvironmentChoices.d.ts +3 -1
- package/dist/git/useEnvironmentChoices.js +7 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/keybindings/KeyCommands.js +1 -1
- package/dist/keybindings/KeybindingsProvider.js +1 -1
- package/dist/keybindings/headless/index.js +2 -2
- package/dist/keybindings/headless/overrides.js +1 -1
- package/dist/labels.d.ts +5 -0
- package/dist/labels.js +5 -0
- package/dist/machines/AddMachineDialog.d.ts +34 -0
- package/dist/machines/AddMachineDialog.js +464 -0
- package/dist/machines/Banners.d.ts +33 -4
- package/dist/machines/Banners.js +64 -3
- package/dist/machines/DaemonMenu.js +27 -4
- package/dist/machines/HostCapabilities.d.ts +1 -3
- package/dist/machines/HostCapabilities.js +24 -45
- package/dist/machines/HostSyncPanel.js +124 -130
- package/dist/machines/HostsSection.d.ts +4 -1
- package/dist/machines/HostsSection.js +30 -7
- package/dist/machines/MachinesExplainer.d.ts +17 -0
- package/dist/machines/MachinesExplainer.js +71 -0
- package/dist/machines/MachinesProvider.d.ts +14 -2
- package/dist/machines/MachinesProvider.js +35 -1
- package/dist/machines/ServerAddedCard.d.ts +31 -0
- package/dist/machines/ServerAddedCard.js +72 -0
- package/dist/machines/ServerCard.js +91 -215
- package/dist/machines/ServerMachinesPanel.d.ts +2 -2
- package/dist/machines/ServerMachinesPanel.js +184 -323
- package/dist/machines/ServerUpdatePanel.js +51 -40
- package/dist/machines/ShareThisComputerForm.d.ts +19 -0
- package/dist/machines/ShareThisComputerForm.js +133 -0
- package/dist/machines/SyncOutcomeBadge.js +1 -1
- package/dist/machines/TokensPanel.d.ts +5 -3
- package/dist/machines/TokensPanel.js +98 -78
- package/dist/machines/headless/fixture-host.d.ts +19 -3
- package/dist/machines/headless/fixture-host.js +43 -6
- package/dist/machines/headless/fixtures.js +4 -6
- package/dist/machines/headless/host.d.ts +40 -19
- package/dist/machines/headless/index.d.ts +3 -3
- package/dist/machines/headless/index.js +3 -3
- package/dist/machines/headless/labels.d.ts +63 -20
- package/dist/machines/headless/labels.js +88 -25
- package/dist/machines/headless/messages.js +8 -0
- package/dist/machines/headless/stores.d.ts +9 -2
- package/dist/machines/headless/stores.js +28 -1
- package/dist/machines/index.d.ts +7 -3
- package/dist/machines/index.js +8 -4
- package/dist/machines/testing/contract.d.ts +15 -3
- package/dist/machines/testing/contract.js +68 -14
- package/dist/motion/grow.d.ts +8 -1
- package/dist/motion/grow.js +10 -4
- package/dist/onboarding/headless/labels.d.ts +13 -0
- package/dist/onboarding/headless/labels.js +8 -0
- package/dist/onboarding/sources/SourceBrowser.js +11 -7
- package/dist/onboarding/steps/ImportStep.js +4 -1
- package/dist/onboarding/steps/ReadyStep.js +9 -2
- package/dist/onboarding/steps/connect/KeyForm.js +6 -2
- package/dist/onboarding/steps/connect/ProviderPanel.js +6 -2
- package/dist/onboarding/steps/connect/ProviderReady.js +25 -20
- package/dist/onboarding/steps/tasks.js +17 -14
- package/dist/palette/app-sources.js +1 -1
- package/dist/server/sse-handler.js +141 -19
- package/dist/session/ArtifactsPanel.js +40 -18
- package/dist/session/PlanTracker.js +13 -8
- package/dist/session/ProjectHome.js +13 -11
- package/dist/session/RemindersPanel.js +35 -17
- package/dist/session/RunningWorkDialog.js +6 -2
- package/dist/session/SecretsPanel.js +29 -10
- package/dist/session/SessionDetailsDialog.d.ts +1 -1
- package/dist/session/SessionDetailsDialog.js +18 -10
- package/dist/session/SideChat.js +10 -7
- package/dist/session/TurnDetailsDialog.js +19 -5
- package/dist/session/UsagePanel.js +10 -4
- package/dist/session/headless/host.d.ts +2 -0
- package/dist/session/headless/index.js +2 -2
- package/dist/session/headless/labels.d.ts +19 -1
- package/dist/session/headless/labels.js +15 -1
- package/dist/session/headless/queue.js +2 -1
- package/dist/session/headless/reminder-labels.d.ts +4 -0
- package/dist/session/headless/reminder-labels.js +4 -0
- package/dist/settings/SettingsRestricted.d.ts +1 -1
- package/dist/settings/SettingsRestricted.js +4 -4
- package/dist/settings/SettingsShell.d.ts +7 -0
- package/dist/settings/SettingsShell.js +6 -1
- package/dist/settings/headless/fixture-performance.d.ts +1 -1
- package/dist/settings/headless/host.d.ts +2 -2
- package/dist/settings/headless/index.js +1 -1
- package/dist/settings/headless/labels.d.ts +3 -3
- package/dist/settings/headless/labels.js +3 -3
- package/dist/settings/headless/performance.d.ts +3 -4
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/index.d.ts +2 -1
- package/dist/settings/index.js +2 -1
- package/dist/settings/sections/appearance/AppearanceSection.js +2 -2
- package/dist/settings/sections/claude-import/ClaudeImportDialog.js +1 -1
- package/dist/settings/sections/editor/EditorSection.js +8 -5
- package/dist/settings/sections/editor/labels.d.ts +1 -0
- package/dist/settings/sections/editor/labels.js +1 -0
- package/dist/settings/sections/environments/EnvironmentsSection.js +21 -14
- package/dist/settings/sections/environments/labels.d.ts +1 -0
- package/dist/settings/sections/environments/labels.js +2 -1
- package/dist/settings/sections/extensions/ChangeOriginDialog.js +1 -1
- package/dist/settings/sections/extensions/CreateExtensionDialog.js +1 -1
- package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +1 -3
- package/dist/settings/sections/extensions/ExtensionConfigRows.js +20 -19
- package/dist/settings/sections/extensions/ExtensionOptionsSection.js +2 -1
- package/dist/settings/sections/extensions/ExtensionsSection.js +1 -1
- package/dist/settings/sections/extensions/options-labels.d.ts +2 -1
- package/dist/settings/sections/extensions/options-labels.js +2 -1
- package/dist/settings/sections/host-catalog/HostCatalogSection.js +1 -1
- package/dist/settings/sections/index.d.ts +2 -1
- package/dist/settings/sections/index.js +2 -1
- package/dist/settings/sections/instructions/InstructionsSection.js +1 -1
- package/dist/settings/sections/logs/LogsSection.d.ts +2 -2
- package/dist/settings/sections/logs/LogsSection.js +2 -2
- package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
- package/dist/settings/sections/mcp/McpSection.js +13 -7
- package/dist/settings/sections/mcp/McpServerRow.js +21 -14
- package/dist/settings/sections/mcp/labels.d.ts +8 -2
- package/dist/settings/sections/mcp/labels.js +8 -2
- package/dist/settings/sections/models/ModelRows.js +1 -1
- package/dist/settings/sections/models/NewChatPlaceRow.d.ts +26 -0
- package/dist/settings/sections/models/NewChatPlaceRow.js +78 -0
- package/dist/settings/sections/models/SpacesDefaultsSection.js +15 -3
- package/dist/settings/sections/models/labels.d.ts +7 -0
- package/dist/settings/sections/models/labels.js +7 -0
- package/dist/settings/sections/models/model-test.js +7 -4
- package/dist/settings/sections/performance/PerformanceSection.js +16 -6
- package/dist/settings/sections/performance/labels.d.ts +1 -1
- package/dist/settings/sections/performance/labels.js +1 -1
- package/dist/settings/sections/providers/ProvidersSection.d.ts +1 -1
- package/dist/settings/sections/providers/ProvidersSection.js +15 -8
- package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
- package/dist/settings/sections/providers/ServerProvidersSection.js +12 -6
- package/dist/settings/sections/providers/labels.d.ts +2 -2
- package/dist/settings/sections/providers/labels.js +2 -2
- package/dist/settings/sections/shared/catalog.js +1 -1
- package/dist/settings/sections/skills/SkillsSection.js +1 -1
- package/dist/settings/testing/performance.contract.js +8 -12
- package/dist/styles.css +32 -3
- package/dist/terminal/HostTerminalSurface.js +17 -7
- package/dist/terminal/TerminalPanel.js +30 -17
- package/dist/terminal/TerminalSurface.js +11 -4
- package/dist/terminal/headless/labels.d.ts +5 -0
- package/dist/terminal/headless/labels.js +5 -0
- package/dist/terminal/headless/store.d.ts +1 -1
- package/dist/terminal/headless/store.js +6 -3
- package/dist/workspace/LayoutBudget.d.ts +5 -1
- package/dist/workspace/LayoutBudget.js +14 -1
- package/dist/workspace/PanelContentView.d.ts +1 -1
- package/dist/workspace/PanelContentView.js +17 -6
- package/dist/workspace/WorkspaceProvider.js +4 -3
- package/dist/workspace/extension-tabs.js +1 -1
- package/dist/workspace/headless/index.js +1 -1
- package/dist/workspace/headless/labels.d.ts +1 -0
- package/dist/workspace/headless/labels.js +1 -0
- package/package.json +3 -3
- package/src/styles/motion.css +8 -0
- package/src/styles/primitives.css +7 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SessionPresence } from "./headless/presence.js";
|
|
2
2
|
import { MachinesLabels } from "./headless/labels.js";
|
|
3
|
-
import { MachinesAction, MachinesHost } from "./headless/host.js";
|
|
3
|
+
import { MachineInfo, MachinesAction, MachinesHost } from "./headless/host.js";
|
|
4
4
|
import { ConfirmOptions } from "../components/ConfirmDialog.js";
|
|
5
5
|
import { ReactNode } from "react";
|
|
6
6
|
//#region src/machines/MachinesProvider.d.ts
|
|
@@ -23,6 +23,11 @@ interface MachinesProviderProps {
|
|
|
23
23
|
* @param props - Provider props: the `host`, optional `labels` and `confirm`, and the `children` to render.
|
|
24
24
|
*/
|
|
25
25
|
declare function MachinesProvider({ host, labels, confirm, children }: MachinesProviderProps): import("react").JSX.Element;
|
|
26
|
+
/**
|
|
27
|
+
* Wraps a subtree rendered elsewhere (a modal layer, mounted above the providers) in this provider's host,
|
|
28
|
+
* confirm and labels, so it reads what the place that opened it reads.
|
|
29
|
+
*/
|
|
30
|
+
declare function useMachinesBridge(): (node: ReactNode) => ReactNode;
|
|
26
31
|
/** Returns the {@link MachinesHost} from the nearest {@link MachinesProvider}, or an empty host outside one. */
|
|
27
32
|
declare function useMachinesHost(): MachinesHost;
|
|
28
33
|
/** Returns how the machines components ask before a destructive action. */
|
|
@@ -42,6 +47,13 @@ declare function usePermitted(action: MachinesAction): boolean;
|
|
|
42
47
|
* @param enabled - Whether to listen (the app has servers and shows a picker).
|
|
43
48
|
*/
|
|
44
49
|
declare function useLentServers(enabled: boolean): ReadonlySet<string>;
|
|
50
|
+
/**
|
|
51
|
+
* The machines of each of `hostIds`, by host id, kept current (a machine that joins or leaves shows at once).
|
|
52
|
+
* Empty without the host's `machines`, or when the token cannot list them.
|
|
53
|
+
*
|
|
54
|
+
* @param hostIds - The servers to list.
|
|
55
|
+
*/
|
|
56
|
+
declare function useServerMachines(hostIds: readonly string[]): ReadonlyMap<string, readonly MachineInfo[]>;
|
|
45
57
|
/** The names of the machines last heard online, from every host; empty without the host's `machines`. */
|
|
46
58
|
declare function useOnlineMachines(): ReadonlySet<string>;
|
|
47
59
|
/** Every live session's presence, by session id (list-level decisions: ordering, counts); empty without `presence`. */
|
|
@@ -53,4 +65,4 @@ declare function usePresenceMap(): ReadonlyMap<string, SessionPresence>;
|
|
|
53
65
|
*/
|
|
54
66
|
declare function useSessionPresence(sessionId: string | null): SessionPresence | null;
|
|
55
67
|
//#endregion
|
|
56
|
-
export { MachinesConfirm, MachinesProvider, MachinesProviderProps, useLentServers, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useSessionPresence };
|
|
68
|
+
export { MachinesConfirm, MachinesProvider, MachinesProviderProps, useLentServers, useMachinesBridge, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useServerMachines, useSessionPresence };
|
|
@@ -3,6 +3,7 @@ import { ConfirmDialog } from "../components/ConfirmDialog.js";
|
|
|
3
3
|
import { Overlay } from "../components/Overlay.js";
|
|
4
4
|
import { constant, useReadable } from "../chat/headless/store.js";
|
|
5
5
|
import { isPermitted } from "./headless/host.js";
|
|
6
|
+
import { machinesByHost } from "./headless/stores.js";
|
|
6
7
|
import { DEFAULT_MACHINES_LABELS } from "./headless/labels.js";
|
|
7
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
9
|
import { createContext, useCallback, useContext, useMemo, useState } from "react";
|
|
@@ -71,6 +72,21 @@ function MachinesProvider({ host, labels, confirm, children }) {
|
|
|
71
72
|
})
|
|
72
73
|
});
|
|
73
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Wraps a subtree rendered elsewhere (a modal layer, mounted above the providers) in this provider's host,
|
|
77
|
+
* confirm and labels, so it reads what the place that opened it reads.
|
|
78
|
+
*/
|
|
79
|
+
function useMachinesBridge() {
|
|
80
|
+
const value = useContext(MachinesContext);
|
|
81
|
+
const labels = useMachinesLabels();
|
|
82
|
+
return useCallback((node) => /* @__PURE__ */ jsx(MachinesContext.Provider, {
|
|
83
|
+
value,
|
|
84
|
+
children: /* @__PURE__ */ jsx(LabelsProvider, {
|
|
85
|
+
labels,
|
|
86
|
+
children: node
|
|
87
|
+
})
|
|
88
|
+
}), [value, labels]);
|
|
89
|
+
}
|
|
74
90
|
/** Returns the {@link MachinesHost} from the nearest {@link MachinesProvider}, or an empty host outside one. */
|
|
75
91
|
function useMachinesHost() {
|
|
76
92
|
return useContext(MachinesContext).host;
|
|
@@ -111,6 +127,24 @@ function useLentServers(enabled) {
|
|
|
111
127
|
const value = useReadable(enabled && links ? links.state : NO_LINKS);
|
|
112
128
|
return useMemo(() => value ? lentServerMachines(value) : NO_NAMES, [value]);
|
|
113
129
|
}
|
|
130
|
+
const NO_SERVER_MACHINES = constant(/* @__PURE__ */ new Map());
|
|
131
|
+
/**
|
|
132
|
+
* The machines of each of `hostIds`, by host id, kept current (a machine that joins or leaves shows at once).
|
|
133
|
+
* Empty without the host's `machines`, or when the token cannot list them.
|
|
134
|
+
*
|
|
135
|
+
* @param hostIds - The servers to list.
|
|
136
|
+
*/
|
|
137
|
+
function useServerMachines(hostIds) {
|
|
138
|
+
const machines = useMachinesHost().machines;
|
|
139
|
+
const canList = usePermitted("machines.list");
|
|
140
|
+
const key = hostIds.join("\n");
|
|
141
|
+
const store = useMemo(() => machines && canList && key ? machinesByHost(key.split("\n").map((hostId) => [hostId, machines.list(hostId).state])) : NO_SERVER_MACHINES, [
|
|
142
|
+
machines,
|
|
143
|
+
canList,
|
|
144
|
+
key
|
|
145
|
+
]);
|
|
146
|
+
return useReadable(store);
|
|
147
|
+
}
|
|
114
148
|
/** The names of the machines last heard online, from every host; empty without the host's `machines`. */
|
|
115
149
|
function useOnlineMachines() {
|
|
116
150
|
const machines = useMachinesHost().machines;
|
|
@@ -134,4 +168,4 @@ function useSessionPresence(sessionId) {
|
|
|
134
168
|
return useReadable(presence && sessionId ? presence.session(sessionId) : NO_PRESENCE);
|
|
135
169
|
}
|
|
136
170
|
//#endregion
|
|
137
|
-
export { MachinesProvider, useLentServers, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useSessionPresence };
|
|
171
|
+
export { MachinesProvider, useLentServers, useMachinesBridge, useMachinesConfirm, useMachinesHost, useMachinesLabels, useOnlineMachines, usePermitted, usePresenceMap, useServerMachines, useSessionPresence };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { HostSummary } from "./headless/host.js";
|
|
2
|
+
import { CSSProperties } from "react";
|
|
3
|
+
//#region src/machines/ServerAddedCard.d.ts
|
|
4
|
+
/** Where new chats start, as the app holds it: which server they start on, and how to change it. */
|
|
5
|
+
interface NewChatsServer {
|
|
6
|
+
/** The server new chats start on now; `null`: this computer (or a place not on a server). */
|
|
7
|
+
hostId: string | null;
|
|
8
|
+
/** Makes `host` where new chats start (`on`), or puts them back on this computer. */
|
|
9
|
+
set: (host: HostSummary, on: boolean) => void;
|
|
10
|
+
}
|
|
11
|
+
/** Props for {@link ServerAddedCard}. */
|
|
12
|
+
interface ServerAddedCardProps {
|
|
13
|
+
/** The server just added. */
|
|
14
|
+
host: HostSummary;
|
|
15
|
+
/** Where new chats start. Absent: no switch. */
|
|
16
|
+
newChats?: NewChatsServer;
|
|
17
|
+
/** Closes the card. */
|
|
18
|
+
onDone: () => void;
|
|
19
|
+
/** Extra classes on the root. */
|
|
20
|
+
className?: string;
|
|
21
|
+
/** Inline styles on the root. */
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Renders what to do with a server just added.
|
|
26
|
+
*
|
|
27
|
+
* @param props - The server, where new chats start, and Done.
|
|
28
|
+
*/
|
|
29
|
+
declare function ServerAddedCard({ host, newChats, onDone, className, style }: ServerAddedCardProps): import("react").JSX.Element;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { NewChatsServer, ServerAddedCard, ServerAddedCardProps };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { BTN_SECONDARY } from "../components/button.js";
|
|
2
|
+
import { Tray } from "../components/Surface.js";
|
|
3
|
+
import { SwitchRow } from "../components/Form.js";
|
|
4
|
+
import { useMachinesHost, useMachinesLabels } from "./MachinesProvider.js";
|
|
5
|
+
import { useAddMachine } from "./AddMachineDialog.js";
|
|
6
|
+
import { MachinesExplainer } from "./MachinesExplainer.js";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/machines/ServerAddedCard.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Renders what to do with a server just added.
|
|
11
|
+
*
|
|
12
|
+
* @param props - The server, where new chats start, and Done.
|
|
13
|
+
*/
|
|
14
|
+
function ServerAddedCard({ host, newChats, onDone, className = "", style }) {
|
|
15
|
+
const labels = useMachinesLabels();
|
|
16
|
+
const { links } = useMachinesHost();
|
|
17
|
+
const openAdd = useAddMachine();
|
|
18
|
+
const canShare = Boolean(openAdd && links?.shareStart);
|
|
19
|
+
const onNewChats = newChats?.hostId === host.id;
|
|
20
|
+
return /* @__PURE__ */ jsxs(Tray, {
|
|
21
|
+
radius: "xl",
|
|
22
|
+
className: `p-4 space-y-3 ${className}`.trimEnd(),
|
|
23
|
+
style,
|
|
24
|
+
"data-testid": "server-added",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: "space-y-1",
|
|
28
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
29
|
+
className: "text-sm font-medium text-[var(--zg-text)]",
|
|
30
|
+
children: labels.machinesAddedTitle(host.name)
|
|
31
|
+
}), /* @__PURE__ */ jsx(MachinesExplainer, { className: "pt-2" })]
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ jsxs("div", {
|
|
34
|
+
className: "space-y-1",
|
|
35
|
+
children: [newChats && /* @__PURE__ */ jsx(SwitchRow, {
|
|
36
|
+
label: labels.machinesAddedNewChats(host.name),
|
|
37
|
+
description: labels.machinesAddedNewChatsHint,
|
|
38
|
+
on: onNewChats,
|
|
39
|
+
onToggle: () => newChats.set(host, !onNewChats)
|
|
40
|
+
}), canShare && /* @__PURE__ */ jsxs("div", {
|
|
41
|
+
className: "flex items-center gap-3 px-1 py-1.5",
|
|
42
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
43
|
+
className: "flex-1 min-w-0",
|
|
44
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
45
|
+
className: "text-sm text-[var(--zg-text)]",
|
|
46
|
+
children: labels.machinesAddedShare(host.name)
|
|
47
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
48
|
+
className: "text-xs text-[var(--zg-text-muted)]",
|
|
49
|
+
children: labels.machinesAddedShareHint
|
|
50
|
+
})]
|
|
51
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
52
|
+
type: "button",
|
|
53
|
+
className: BTN_SECONDARY,
|
|
54
|
+
onClick: () => openAdd?.(host.id, { tab: "this" }),
|
|
55
|
+
children: labels.machinesShareOpen
|
|
56
|
+
})]
|
|
57
|
+
})]
|
|
58
|
+
}),
|
|
59
|
+
/* @__PURE__ */ jsx("div", {
|
|
60
|
+
className: "flex justify-end",
|
|
61
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
62
|
+
type: "button",
|
|
63
|
+
className: BTN_SECONDARY,
|
|
64
|
+
onClick: onDone,
|
|
65
|
+
children: labels.machinesInviteDone
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { ServerAddedCard };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { IconButton } from "../components/IconButton.js";
|
|
2
2
|
import { BTN_PRIMARY, BTN_SECONDARY } from "../components/button.js";
|
|
3
|
-
import { CopyButton } from "../components/CopyButton.js";
|
|
4
3
|
import { FormCard, INPUT_CLASS, MetaChip, OpLine } from "../components/Form.js";
|
|
5
4
|
import { RowActionsMenu } from "../components/RowActionsMenu.js";
|
|
6
5
|
import { machinesError } from "./headless/host.js";
|
|
@@ -19,13 +18,6 @@ import { useEffect, useRef, useState } from "react";
|
|
|
19
18
|
* a new URL keeps the saved token and is saved once the same server answers
|
|
20
19
|
* there) and Remove (asks first). What an action answers shows under the
|
|
21
20
|
* card, as does the last connect's error.
|
|
22
|
-
*
|
|
23
|
-
* A chip says what this app's token may do there. With a chat token, Get
|
|
24
|
-
* admin shows the server's own command for an admin token (its binary, user
|
|
25
|
-
* and data dir, from the hello) and, where the app can save one
|
|
26
|
-
* (`addHost`), a field to paste it: the saved server keeps its URL and
|
|
27
|
-
* reconnects with it. Without `addHost` (the web app's own server) the
|
|
28
|
-
* command is the pairing one.
|
|
29
21
|
*/
|
|
30
22
|
/** The desktop app's `hosts:*` limits, mirrored so a field can't take more than it accepts. */
|
|
31
23
|
const HOST_NAME_MAX = 200;
|
|
@@ -92,9 +84,8 @@ function ServerCard({ host, saved = host, onChanged, badge, confirm, now, classN
|
|
|
92
84
|
const [busy, setBusy] = useState(null);
|
|
93
85
|
const [line, setLine] = useState(null);
|
|
94
86
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
95
|
-
const [getAdmin, setGetAdmin] = useState(false);
|
|
96
87
|
const menuButtonRef = useRef(null);
|
|
97
|
-
const { testHost, renameHost, setHostUrl, removeHost
|
|
88
|
+
const { testHost, renameHost, setHostUrl, removeHost } = machines;
|
|
98
89
|
const changed = async () => {
|
|
99
90
|
await onChanged?.();
|
|
100
91
|
};
|
|
@@ -205,221 +196,106 @@ function ServerCard({ host, saved = host, onChanged, badge, confirm, now, classN
|
|
|
205
196
|
"data-testid": `host-${host.id}`,
|
|
206
197
|
...className ? { className } : {},
|
|
207
198
|
...style ? { style } : {},
|
|
208
|
-
children: [
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
className: "flex-1 flex items-center gap-2",
|
|
217
|
-
onSubmit: (event) => {
|
|
218
|
-
event.preventDefault();
|
|
219
|
-
save();
|
|
220
|
-
},
|
|
221
|
-
onKeyDown: escapeCancels(stopEditing),
|
|
222
|
-
children: [
|
|
223
|
-
/* @__PURE__ */ jsx("input", {
|
|
224
|
-
"aria-label": editing === "name" ? labels.machinesHostName : labels.machinesServerUrl,
|
|
225
|
-
className: INPUT_CLASS,
|
|
226
|
-
value: draft,
|
|
227
|
-
maxLength: editing === "name" ? 200 : HOST_URL_MAX,
|
|
228
|
-
autoFocus: true,
|
|
229
|
-
spellCheck: false,
|
|
230
|
-
onChange: (event) => setDraft(event.target.value)
|
|
231
|
-
}),
|
|
232
|
-
/* @__PURE__ */ jsx("button", {
|
|
233
|
-
type: "submit",
|
|
234
|
-
className: BTN_PRIMARY,
|
|
235
|
-
disabled: busy !== null || !draft.trim(),
|
|
236
|
-
children: busy && editing === "url" ? busy : labels.machinesSave
|
|
237
|
-
}),
|
|
238
|
-
/* @__PURE__ */ jsx("button", {
|
|
239
|
-
type: "button",
|
|
240
|
-
className: BTN_SECONDARY,
|
|
241
|
-
onClick: stopEditing,
|
|
242
|
-
children: labels.machinesCancel
|
|
243
|
-
})
|
|
244
|
-
]
|
|
245
|
-
}) : /* @__PURE__ */ jsxs("div", {
|
|
246
|
-
className: "flex-1 min-w-0 flex flex-col gap-2.5",
|
|
247
|
-
children: [
|
|
248
|
-
/* @__PURE__ */ jsxs("div", {
|
|
249
|
-
className: "flex flex-wrap items-center gap-3 min-h-7",
|
|
250
|
-
children: [/* @__PURE__ */ jsxs("span", {
|
|
251
|
-
className: "flex-1 basis-40 min-w-0 inline-flex items-center gap-2",
|
|
252
|
-
children: [
|
|
253
|
-
/* @__PURE__ */ jsx("span", {
|
|
254
|
-
className: "truncate text-sm font-medium text-[var(--zg-text)]",
|
|
255
|
-
children: host.name
|
|
256
|
-
}),
|
|
257
|
-
/* @__PURE__ */ jsx(HostStatusDot, { host }),
|
|
258
|
-
host.status !== "connected" && /* @__PURE__ */ jsx(MetaChip, {
|
|
259
|
-
tone: hostStatusTone(host),
|
|
260
|
-
children: hostStatusText(host, labels)
|
|
261
|
-
}),
|
|
262
|
-
host.scope && /* @__PURE__ */ jsx(MetaChip, { children: labels.machinesAccess(host.scope) }),
|
|
263
|
-
badge
|
|
264
|
-
]
|
|
265
|
-
}), (testHost || menuItems.length > 0 || host.scope === "chat") && /* @__PURE__ */ jsxs("span", {
|
|
266
|
-
className: "flex items-center gap-1 shrink-0",
|
|
267
|
-
children: [
|
|
268
|
-
host.scope === "chat" && /* @__PURE__ */ jsx("button", {
|
|
269
|
-
type: "button",
|
|
270
|
-
className: BTN_SECONDARY,
|
|
271
|
-
"aria-expanded": getAdmin,
|
|
272
|
-
onClick: () => setGetAdmin((open) => !open),
|
|
273
|
-
children: labels.machinesGetAdmin
|
|
274
|
-
}),
|
|
275
|
-
testHost && /* @__PURE__ */ jsx("button", {
|
|
276
|
-
type: "button",
|
|
277
|
-
className: BTN_SECONDARY,
|
|
278
|
-
onClick: () => void test(),
|
|
279
|
-
disabled: busy !== null,
|
|
280
|
-
children: busy === labels.machinesTesting ? labels.machinesTesting : labels.machinesTest
|
|
281
|
-
}),
|
|
282
|
-
menuItems.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(IconButton, {
|
|
283
|
-
ref: menuButtonRef,
|
|
284
|
-
icon: "i-ph-dots-three",
|
|
285
|
-
label: labels.machinesHostActions(host.name),
|
|
286
|
-
"aria-haspopup": "menu",
|
|
287
|
-
"aria-expanded": menuOpen,
|
|
288
|
-
active: menuOpen,
|
|
289
|
-
disabled: busy !== null,
|
|
290
|
-
onClick: () => setMenuOpen((open) => !open)
|
|
291
|
-
}), /* @__PURE__ */ jsx(RowActionsMenu, {
|
|
292
|
-
open: menuOpen,
|
|
293
|
-
anchorRef: menuButtonRef,
|
|
294
|
-
onClose: () => setMenuOpen(false),
|
|
295
|
-
items: menuItems
|
|
296
|
-
})] })
|
|
297
|
-
]
|
|
298
|
-
})]
|
|
299
|
-
}),
|
|
300
|
-
host.url && /* @__PURE__ */ jsx(CopyText, {
|
|
301
|
-
text: host.url,
|
|
302
|
-
field: true
|
|
303
|
-
}),
|
|
304
|
-
facts.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
305
|
-
className: "flex flex-wrap items-center gap-1.5",
|
|
306
|
-
children: facts.map((fact) => /* @__PURE__ */ jsx(MetaChip, { children: fact }, fact))
|
|
307
|
-
})
|
|
308
|
-
]
|
|
309
|
-
})]
|
|
310
|
-
}),
|
|
311
|
-
getAdmin && host.scope === "chat" && /* @__PURE__ */ jsx(GetAdmin, {
|
|
312
|
-
host,
|
|
313
|
-
...addHost && host.url ? { save: (token) => addHost({
|
|
314
|
-
url: host.url,
|
|
315
|
-
token,
|
|
316
|
-
name: host.name
|
|
317
|
-
}) } : {},
|
|
318
|
-
onSaved: async () => {
|
|
319
|
-
setGetAdmin(false);
|
|
320
|
-
setLine({
|
|
321
|
-
kind: "notice",
|
|
322
|
-
text: labels.machinesGetAdminSaved
|
|
323
|
-
});
|
|
324
|
-
await changed();
|
|
325
|
-
}
|
|
326
|
-
}),
|
|
327
|
-
(line || host.error && host.status !== "connected") && /* @__PURE__ */ jsxs("div", {
|
|
328
|
-
className: "pl-14 pr-4 pb-3.5 space-y-2",
|
|
329
|
-
children: [line && /* @__PURE__ */ jsx(OpLine, {
|
|
330
|
-
kind: line.kind,
|
|
331
|
-
children: line.text
|
|
332
|
-
}), !line && host.error && host.status !== "connected" && /* @__PURE__ */ jsx(OpLine, {
|
|
333
|
-
kind: "error",
|
|
334
|
-
children: host.error
|
|
335
|
-
})]
|
|
336
|
-
})
|
|
337
|
-
]
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
/** The server's command for an admin token, and a field to use the token it prints (when the app can save one). */
|
|
341
|
-
function GetAdmin({ host, save, onSaved }) {
|
|
342
|
-
const labels = useMachinesLabels();
|
|
343
|
-
const [token, setToken] = useState("");
|
|
344
|
-
const [busy, setBusy] = useState(false);
|
|
345
|
-
const [error, setError] = useState(null);
|
|
346
|
-
const command = save ? host.adminCommands?.token ?? "zidane server token create --name <device> --scope admin" : host.adminCommands?.pair ?? "zidane server pair --scope admin";
|
|
347
|
-
const submit = async () => {
|
|
348
|
-
if (!save) return;
|
|
349
|
-
setBusy(true);
|
|
350
|
-
setError(null);
|
|
351
|
-
const result = await save(token.trim()).catch((err) => ({
|
|
352
|
-
ok: false,
|
|
353
|
-
error: "unknown",
|
|
354
|
-
message: labels.machinesError(machinesError("update", err))
|
|
355
|
-
}));
|
|
356
|
-
setBusy(false);
|
|
357
|
-
if (!result.ok) {
|
|
358
|
-
setError(hostCheckMessage(result, labels));
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
setToken("");
|
|
362
|
-
await onSaved();
|
|
363
|
-
};
|
|
364
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
365
|
-
className: "pl-14 pr-4 pb-3.5 space-y-2",
|
|
366
|
-
"data-testid": `get-admin-${host.id}`,
|
|
367
|
-
children: [
|
|
368
|
-
/* @__PURE__ */ jsx("p", {
|
|
369
|
-
className: "m-0 text-xs text-[var(--zg-text-muted)]",
|
|
370
|
-
children: labels.machinesGetAdminRun
|
|
371
|
-
}),
|
|
372
|
-
/* @__PURE__ */ jsxs("div", {
|
|
373
|
-
className: "zg-well flex items-center gap-2 rounded-zg-md px-2.5 py-1.5",
|
|
374
|
-
children: [/* @__PURE__ */ jsx("code", {
|
|
375
|
-
className: "flex-1 min-w-0 break-all font-mono text-xs text-[var(--zg-text)]",
|
|
376
|
-
children: command
|
|
377
|
-
}), /* @__PURE__ */ jsx(CopyButton, {
|
|
378
|
-
text: command,
|
|
379
|
-
label: labels.machinesGetAdminCopy
|
|
380
|
-
})]
|
|
381
|
-
}),
|
|
382
|
-
save ? /* @__PURE__ */ jsxs("form", {
|
|
383
|
-
className: "space-y-2",
|
|
199
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
200
|
+
className: "flex items-start gap-3 px-4 py-3.5",
|
|
201
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
202
|
+
"aria-hidden": true,
|
|
203
|
+
className: HOST_CARD_ICON_CLASS,
|
|
204
|
+
children: /* @__PURE__ */ jsx("span", { className: "i-ph-hard-drives" })
|
|
205
|
+
}), editing ? /* @__PURE__ */ jsxs("form", {
|
|
206
|
+
className: "flex-1 flex items-center gap-2",
|
|
384
207
|
onSubmit: (event) => {
|
|
385
208
|
event.preventDefault();
|
|
386
|
-
|
|
209
|
+
save();
|
|
387
210
|
},
|
|
211
|
+
onKeyDown: escapeCancels(stopEditing),
|
|
388
212
|
children: [
|
|
389
|
-
/* @__PURE__ */ jsx("
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
213
|
+
/* @__PURE__ */ jsx("input", {
|
|
214
|
+
"aria-label": editing === "name" ? labels.machinesHostName : labels.machinesServerUrl,
|
|
215
|
+
className: INPUT_CLASS,
|
|
216
|
+
value: draft,
|
|
217
|
+
maxLength: editing === "name" ? 200 : HOST_URL_MAX,
|
|
218
|
+
autoFocus: true,
|
|
219
|
+
spellCheck: false,
|
|
220
|
+
onChange: (event) => setDraft(event.target.value)
|
|
393
221
|
}),
|
|
222
|
+
/* @__PURE__ */ jsx("button", {
|
|
223
|
+
type: "submit",
|
|
224
|
+
className: BTN_PRIMARY,
|
|
225
|
+
disabled: busy !== null || !draft.trim(),
|
|
226
|
+
children: busy && editing === "url" ? busy : labels.machinesSave
|
|
227
|
+
}),
|
|
228
|
+
/* @__PURE__ */ jsx("button", {
|
|
229
|
+
type: "button",
|
|
230
|
+
className: BTN_SECONDARY,
|
|
231
|
+
onClick: stopEditing,
|
|
232
|
+
children: labels.machinesCancel
|
|
233
|
+
})
|
|
234
|
+
]
|
|
235
|
+
}) : /* @__PURE__ */ jsxs("div", {
|
|
236
|
+
className: "flex-1 min-w-0 flex flex-col gap-2.5",
|
|
237
|
+
children: [
|
|
394
238
|
/* @__PURE__ */ jsxs("div", {
|
|
395
|
-
className: "flex items-center gap-
|
|
396
|
-
children: [/* @__PURE__ */
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
239
|
+
className: "flex flex-wrap items-center gap-3 min-h-7",
|
|
240
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
241
|
+
className: "flex-1 basis-40 min-w-0 inline-flex items-center gap-2",
|
|
242
|
+
children: [
|
|
243
|
+
/* @__PURE__ */ jsx("span", {
|
|
244
|
+
className: "truncate text-sm font-medium text-[var(--zg-text)]",
|
|
245
|
+
children: host.name
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ jsx(HostStatusDot, { host }),
|
|
248
|
+
host.status !== "connected" && /* @__PURE__ */ jsx(MetaChip, {
|
|
249
|
+
tone: hostStatusTone(host),
|
|
250
|
+
children: hostStatusText(host, labels)
|
|
251
|
+
}),
|
|
252
|
+
badge
|
|
253
|
+
]
|
|
254
|
+
}), (testHost || menuItems.length > 0) && /* @__PURE__ */ jsxs("span", {
|
|
255
|
+
className: "flex items-center gap-1 shrink-0",
|
|
256
|
+
children: [testHost && /* @__PURE__ */ jsx("button", {
|
|
257
|
+
type: "button",
|
|
258
|
+
className: BTN_SECONDARY,
|
|
259
|
+
onClick: () => void test(),
|
|
260
|
+
disabled: busy !== null,
|
|
261
|
+
children: busy === labels.machinesTesting ? labels.machinesTesting : labels.machinesTest
|
|
262
|
+
}), menuItems.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(IconButton, {
|
|
263
|
+
ref: menuButtonRef,
|
|
264
|
+
icon: "i-ph-dots-three",
|
|
265
|
+
label: labels.machinesHostActions(host.name),
|
|
266
|
+
"aria-haspopup": "menu",
|
|
267
|
+
"aria-expanded": menuOpen,
|
|
268
|
+
active: menuOpen,
|
|
269
|
+
disabled: busy !== null,
|
|
270
|
+
onClick: () => setMenuOpen((open) => !open)
|
|
271
|
+
}), /* @__PURE__ */ jsx(RowActionsMenu, {
|
|
272
|
+
open: menuOpen,
|
|
273
|
+
anchorRef: menuButtonRef,
|
|
274
|
+
onClose: () => setMenuOpen(false),
|
|
275
|
+
items: menuItems
|
|
276
|
+
})] })]
|
|
411
277
|
})]
|
|
412
278
|
}),
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
279
|
+
host.url && /* @__PURE__ */ jsx(CopyText, {
|
|
280
|
+
text: host.url,
|
|
281
|
+
field: true
|
|
282
|
+
}),
|
|
283
|
+
facts.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
284
|
+
className: "flex flex-wrap items-center gap-1.5",
|
|
285
|
+
children: facts.map((fact) => /* @__PURE__ */ jsx(MetaChip, { children: fact }, fact))
|
|
416
286
|
})
|
|
417
287
|
]
|
|
418
|
-
})
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
288
|
+
})]
|
|
289
|
+
}), (line || host.error && host.status !== "connected") && /* @__PURE__ */ jsxs("div", {
|
|
290
|
+
className: "pl-14 pr-4 pb-3.5 space-y-2",
|
|
291
|
+
children: [line && /* @__PURE__ */ jsx(OpLine, {
|
|
292
|
+
kind: line.kind,
|
|
293
|
+
children: line.text
|
|
294
|
+
}), !line && host.error && host.status !== "connected" && /* @__PURE__ */ jsx(OpLine, {
|
|
295
|
+
kind: "error",
|
|
296
|
+
children: host.error
|
|
297
|
+
})]
|
|
298
|
+
})]
|
|
423
299
|
});
|
|
424
300
|
}
|
|
425
301
|
//#endregion
|
|
@@ -16,9 +16,9 @@ interface ServerMachinesPanelProps {
|
|
|
16
16
|
style?: CSSProperties;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Renders a server's machine links and
|
|
19
|
+
* Renders a server's machine links, where work runs on it, and Add a machine.
|
|
20
20
|
*
|
|
21
|
-
* @param props - The server, `confirm`, `className` and `style`.
|
|
21
|
+
* @param props - The server, `confirm`, `now`, `className` and `style`.
|
|
22
22
|
*/
|
|
23
23
|
declare function ServerMachinesPanel({ host, confirm, now, className, style }: ServerMachinesPanelProps): import("react").JSX.Element;
|
|
24
24
|
//#endregion
|