Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion resources/js/components/ui/tags-input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ export function TagsInput({
};

const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
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) {
Expand Down
30 changes: 26 additions & 4 deletions resources/js/pages/sites/components/create-site.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -48,6 +59,7 @@ export default function CreateSite({
}) {
const page = usePage<SharedData>();
const [open, setOpen] = useState(defaultOpen || false);
const [userManuallyEdited, setUserManuallyEdited] = useState(false);

useEffect(() => {
if (defaultOpen !== undefined) {
Expand All @@ -64,7 +76,7 @@ export default function CreateSite({

const form = useForm<CreateSiteForm>({
server: server?.id.toString() || '',
type: 'php',
type: 'laravel',
domain: '',
aliases: [],
php_version: '',
Expand Down Expand Up @@ -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"
/>
<InputError message={form.errors.domain} />
Expand Down Expand Up @@ -292,7 +311,7 @@ export default function CreateSite({
<Tooltip>
<TooltipTrigger asChild>
<DialogTrigger asChild>
<button type="button" className="text-muted-foreground hover:text-foreground">
<button type="button" tabIndex={-1} className="text-muted-foreground hover:text-foreground">
<HelpCircle className="h-4 w-4" />
</button>
</DialogTrigger>
Expand All @@ -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"
/>
<p className="text-muted-foreground text-xs">The isolated user for the site. Must be unique on the server.</p>
Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/Models/ServerModelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down