Skip to content

Commit a1733d2

Browse files
adamintCopilot
andcommitted
Move Import button to main playground toolbar
Import is now a top-level action next to Share/Reset instead of being hidden inside the Code tab. The import panel expands below the header with clear instructions and a larger textarea. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c1956b4 commit a1733d2

1 file changed

Lines changed: 44 additions & 39 deletions

File tree

AspireAcademy.Web/src/pages/PlaygroundPage.tsx

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,12 +1112,56 @@ export default function PlaygroundPage() {
11121112
>
11131113
<TbShare /> {shareCopied ? 'Link copied!' : 'Share'}
11141114
</Button>
1115+
<Button size="sm" variant={showImport ? 'solid' : 'outline'} colorPalette="purple"
1116+
onClick={() => setShowImport(!showImport)} data-testid="import-btn" aria-label="Import AppHost code"
1117+
>
1118+
<TbUpload /> Import
1119+
</Button>
11151120
<Button size="sm" variant="outline" colorPalette="red" onClick={reset} data-testid="reset-btn">
11161121
<TbRefresh /> Reset
11171122
</Button>
11181123
</Flex>
11191124
</Flex>
11201125

1126+
{/* Import panel — shown below header when active */}
1127+
{showImport && (
1128+
<Box mb="4" p="4" bg="dark.surface" borderRadius="md" border="2px solid" borderColor="aspire.600">
1129+
<Flex justify="space-between" align="center" mb="2">
1130+
<Text {...pixelFontProps} fontSize="2xs" color="aspire.accent">📋 Import AppHost Code</Text>
1131+
<Button size="xs" variant="ghost" onClick={() => { setShowImport(false); setImportText(''); }}></Button>
1132+
</Flex>
1133+
<Text fontSize="xs" color="dark.muted" mb="2">
1134+
Paste your C# AppHost Program.cs code below. All current resources will be replaced.
1135+
</Text>
1136+
<Textarea
1137+
size="sm" value={importText}
1138+
onChange={(e) => setImportText(e.target.value)}
1139+
placeholder={"var builder = DistributedApplication.CreateBuilder(args);\nvar postgres = builder.AddPostgres(\"pg\");\nvar api = builder.AddProject<Projects.Api>(\"api\")\n .WithReference(postgres);\nbuilder.Build().Run();"}
1140+
rows={8}
1141+
fontFamily="mono" fontSize="12px"
1142+
bg="dark.bg" color="dark.text"
1143+
borderColor="dark.border"
1144+
aria-label="AppHost code to import"
1145+
/>
1146+
<Flex gap="2" mt="3">
1147+
<Button size="sm" colorPalette="purple" onClick={handleImport}
1148+
disabled={!importText.trim()}
1149+
>
1150+
<TbUpload /> Import Resources
1151+
</Button>
1152+
<Button size="sm" variant="ghost" onClick={() => { setShowImport(false); setImportText(''); }}>
1153+
Cancel
1154+
</Button>
1155+
</Flex>
1156+
</Box>
1157+
)}
1158+
1159+
{importFeedback && (
1160+
<Box mb="3" p="2" bg={importFeedback.startsWith('No') ? 'red.950' : 'green.950'} borderRadius="sm" border="1px solid" borderColor={importFeedback.startsWith('No') ? 'red.700' : 'green.700'}>
1161+
<Text fontSize="xs" color={importFeedback.startsWith('No') ? 'red.300' : 'green.300'}>{importFeedback}</Text>
1162+
</Box>
1163+
)}
1164+
11211165
{/* Resource Palette */}
11221166
<Card.Root variant="outline" {...retroCardProps} bg="game.retroBg" mb="6" data-testid="resource-palette" role="region" aria-label="Resource palette">
11231167
<Card.Body p="5">
@@ -1606,48 +1650,9 @@ export default function PlaygroundPage() {
16061650
>
16071651
<TbDownload /> Download
16081652
</Button>
1609-
<Button size="xs" variant={showImport ? 'solid' : 'outline'} colorPalette="purple"
1610-
onClick={() => setShowImport(!showImport)} aria-label="Import AppHost code"
1611-
>
1612-
<TbUpload /> Import
1613-
</Button>
16141653
</Flex>
16151654
</Flex>
16161655

1617-
{/* Import panel */}
1618-
{showImport && (
1619-
<Box mb="4" p="3" bg="dark.surface" borderRadius="sm" border="1px solid" borderColor="dark.border">
1620-
<Text fontSize="xs" color="dark.muted" mb="2">
1621-
Paste C# AppHost code to import resources:
1622-
</Text>
1623-
<Textarea
1624-
size="sm" value={importText}
1625-
onChange={(e) => setImportText(e.target.value)}
1626-
placeholder="var builder = DistributedApplication.CreateBuilder(args);&#10;var postgres = builder.AddPostgres(&quot;pg&quot;);&#10;..."
1627-
rows={6}
1628-
fontFamily="mono" fontSize="12px"
1629-
bg="#0D0B1A" color="dark.text"
1630-
aria-label="AppHost code to import"
1631-
/>
1632-
<Flex gap="2" mt="2">
1633-
<Button size="xs" colorPalette="purple" onClick={handleImport}
1634-
disabled={!importText.trim()}
1635-
>
1636-
Import Resources
1637-
</Button>
1638-
<Button size="xs" variant="ghost" onClick={() => { setShowImport(false); setImportText(''); }}>
1639-
Cancel
1640-
</Button>
1641-
</Flex>
1642-
</Box>
1643-
)}
1644-
1645-
{importFeedback && (
1646-
<Box mb="3" p="2" bg={importFeedback.startsWith('No') ? 'red.950' : 'green.950'} borderRadius="sm" border="1px solid" borderColor={importFeedback.startsWith('No') ? 'red.700' : 'green.700'}>
1647-
<Text fontSize="xs" color={importFeedback.startsWith('No') ? 'red.300' : 'green.300'}>{importFeedback}</Text>
1648-
</Box>
1649-
)}
1650-
16511656
{/* Name warnings */}
16521657
{nameWarnings.length > 0 && (
16531658
<Box mb="3" p="2" bg="red.950" borderRadius="sm" border="1px solid" borderColor="red.700">

0 commit comments

Comments
 (0)