diff --git a/resources/js/components/ui/tags-input.tsx b/resources/js/components/ui/tags-input.tsx index 3966f55a..05f66776 100644 --- a/resources/js/components/ui/tags-input.tsx +++ b/resources/js/components/ui/tags-input.tsx @@ -57,7 +57,10 @@ export function TagsInput({ }; const handleInputKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' || e.key === 'Tab') { + if (e.key === 'Enter') { + e.preventDefault(); + addTag(inputValue); + } else if (e.key === 'Tab' && inputValue.trim()) { e.preventDefault(); addTag(inputValue); } else if (e.key === 'Backspace' && !inputValue && tags.length > 0) { diff --git a/resources/js/pages/sites/components/create-site.tsx b/resources/js/pages/sites/components/create-site.tsx index cfd26df1..1cca491e 100644 --- a/resources/js/pages/sites/components/create-site.tsx +++ b/resources/js/pages/sites/components/create-site.tsx @@ -35,6 +35,17 @@ type CreateSiteForm = { user: string; }; +function extractNameFromDomain(domain: string): string { + if (!domain) return ''; + let name = domain.replace(/^https?:\/\//, ''); + name = name.replace(/^www\./, ''); + const parts = name.split('.'); + if (parts.length > 0 && parts[0]) { + return parts[0].toLowerCase().replace(/[^a-z0-9]/g, ''); + } + return ''; +} + export default function CreateSite({ server, defaultOpen, @@ -48,6 +59,7 @@ export default function CreateSite({ }) { const page = usePage(); const [open, setOpen] = useState(defaultOpen || false); + const [userManuallyEdited, setUserManuallyEdited] = useState(false); useEffect(() => { if (defaultOpen !== undefined) { @@ -64,7 +76,7 @@ export default function CreateSite({ const form = useForm({ server: server?.id.toString() || '', - type: 'php', + type: 'laravel', domain: '', aliases: [], php_version: '', @@ -260,7 +272,14 @@ export default function CreateSite({ id="domain" type="text" value={form.data.domain} - onChange={(e) => form.setData('domain', e.target.value)} + onChange={(e) => { + const newDomain = e.target.value; + form.setData('domain', newDomain); + if (!userManuallyEdited) { + const extractedName = extractNameFromDomain(newDomain); + form.setData('user', extractedName); + } + }} placeholder="vitodeploy.com" /> @@ -292,7 +311,7 @@ export default function CreateSite({ - @@ -316,7 +335,10 @@ export default function CreateSite({ id="user" type="text" value={form.data.user} - onChange={(e) => form.setData('user', e.target.value)} + onChange={(e) => { + setUserManuallyEdited(true); + form.setData('user', e.target.value); + }} placeholder="e.g. mysite" />

The isolated user for the site. Must be unique on the server.

diff --git a/tests/Unit/Models/ServerModelTest.php b/tests/Unit/Models/ServerModelTest.php index 33eca1fd..ec2eb786 100644 --- a/tests/Unit/Models/ServerModelTest.php +++ b/tests/Unit/Models/ServerModelTest.php @@ -99,7 +99,7 @@ public function test_exec_wraps_command_when_using_custom_user(): void $expected = <<<'BASH' sudo -u deploy bash <<'EOF' -pwd +set -e; pwd ls -la EOF BASH;