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
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ <h1>Connect TypeDB server</h1>
@if (advancedForm.controls.address.getError("errorText")) {
<mat-error>{{ advancedForm.controls.address.getError("errorText") }}</mat-error>
}
@if (addressMissingPort) {
<mat-hint class="port-warning">No port specified - will use default (80 for http, 443 for https)</mat-hint>
}
</mat-form-field>
</div>
<tp-form-input [form]="advancedForm" field="username" label="Username"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,7 @@ tp-form.form {
box-sizing: border-box;
border-left: shapes.$border;
}

.port-warning {
color: colors.$secondary-yellow;
}
24 changes: 21 additions & 3 deletions src/module/connection/create/connection-creator.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,24 @@ const connectionUrlValidator: ValidatorFn = (control: AbstractControl<string>) =
};

const addressValidator: ValidatorFn = (control: AbstractControl<string>) => {
if (control.value.startsWith(`http://`) || control.value.startsWith(`https://`)) return null;
else return { errorText: `Please specify http:// or https://` };
const value = control.value;
if (!value.startsWith(`http://`) && !value.startsWith(`https://`)) {
return { errorText: `Please specify http:// or https://` };
}
return null;
}

function addressHasPort(address: string): boolean {
// Check for port format: http(s)://<address>:<port>
// Match http(s):// followed by address content, then :port (digits)
const portPattern = /^https?:\/\/.+:\d+/;
return portPattern.test(address);
}

function isSafari(): boolean {
return window.navigator.userAgent.includes("Safari");
const ua = window.navigator.userAgent;
// Chrome's user agent contains "Safari", so we must exclude it
return ua.includes("Safari") && !ua.includes("Chrome") && !ua.includes("Chromium");
}

const safariMixedContentValidator: ValidatorFn = (control: AbstractControl<string>) => {
Expand Down Expand Up @@ -143,6 +155,12 @@ export class ConnectionCreatorComponent {
return (this.form.dirty || this.advancedForm.dirty) && this.form.valid;
}

get addressMissingPort(): boolean {
const address = this.advancedForm.controls.address.value;
if (!address || this.advancedForm.controls.address.invalid) return false;
return !addressHasPort(address);
}

private buildConnectionConfigOrNull(): ConnectionConfig | null {
if (this.form.invalid || !this.form.value.url) return null;
const connectionParams = parseConnectionUrlOrNull(this.form.value.url);
Expand Down