refactor: use Laravel route() helper for shared variable URLs

- Replace hardcoded URL paths in getScopeUrl() with Laravel's route() helper
- Add scopeUrls property to EnvVarInput component with named routes
- Pass projectUuid and environmentUuid to enable context-specific environment links
- Environment scope link now navigates to the specific project/environment shared variables page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Andras Bacsai 2025-11-25 10:11:49 +01:00
parent 01d3f07934
commit 4147cfa537
3 changed files with 23 additions and 10 deletions

View file

@ -14,6 +14,8 @@ class EnvVarInput extends Component
public ?string $htmlId = null;
public array $scopeUrls = [];
public function __construct(
public ?string $id = null,
public ?string $name = null,
@ -33,6 +35,8 @@ public function __construct(
public mixed $canResource = null,
public bool $autoDisable = true,
public array $availableVars = [],
public ?string $projectUuid = null,
public ?string $environmentUuid = null,
) {
// Handle authorization-based disabling
if ($this->canGate && $this->canResource && $this->autoDisable) {
@ -68,6 +72,18 @@ public function render(): View|Closure|string
$this->name = $this->modelBinding !== 'null' ? $this->modelBinding : (string) $this->id;
}
$this->scopeUrls = [
'team' => route('shared-variables.team.index'),
'project' => route('shared-variables.project.index'),
'environment' => $this->projectUuid && $this->environmentUuid
? route('shared-variables.environment.show', [
'project_uuid' => $this->projectUuid,
'environment_uuid' => $this->environmentUuid,
])
: route('shared-variables.environment.index'),
'default' => route('shared-variables.index'),
];
return view('components.forms.env-var-input');
}
}

View file

@ -18,6 +18,7 @@
currentScope: null,
availableScopes: ['team', 'project', 'environment'],
availableVars: @js($availableVars),
scopeUrls: @js($scopeUrls),
isAutocompleteDisabled() {
const hasAnyVars = Object.values(this.availableVars).some(vars => vars.length > 0);
@ -28,13 +29,14 @@
const input = this.$refs.input;
if (!input) return;
const value = input.value || '';
if (this.isAutocompleteDisabled()) {
this.showDropdown = false;
return;
}
this.cursorPosition = input.selectionStart || 0;
const value = input.value || '';
const textBeforeCursor = value.substring(0, this.cursorPosition);
const openBraces = '{' + '{';
@ -107,14 +109,7 @@
},
getScopeUrl(scope) {
if (scope === 'team') {
return '/shared-variables/team';
} else if (scope === 'project') {
return '/shared-variables/projects';
} else if (scope === 'environment') {
return '/shared-variables/environments';
}
return '/shared-variables';
return this.scopeUrls[scope] || this.scopeUrls['default'];
},
selectSuggestion(suggestion) {

View file

@ -3,7 +3,9 @@
<x-forms.textarea x-show="$wire.is_multiline === true" x-cloak id="value" label="Value" required />
<x-forms.env-var-input x-show="$wire.is_multiline === false" x-cloak placeholder="production" id="value"
x-bind:label="$wire.is_multiline === false && 'Value'" required
:availableVars="$shared ? [] : $this->availableSharedVariables" />
:availableVars="$shared ? [] : $this->availableSharedVariables"
:projectUuid="data_get($parameters, 'project_uuid')"
:environmentUuid="data_get($parameters, 'environment_uuid')" />
@if (!$shared)
<div x-show="$wire.is_multiline === false" x-cloak class="text-xs text-neutral-500 dark:text-neutral-400 -mt-1">