@@ -17,6 +17,10 @@ class TelegramSettings extends Component
|
|||||||
'team.telegram_notifications_deployments' => 'nullable|boolean',
|
'team.telegram_notifications_deployments' => 'nullable|boolean',
|
||||||
'team.telegram_notifications_status_changes' => 'nullable|boolean',
|
'team.telegram_notifications_status_changes' => 'nullable|boolean',
|
||||||
'team.telegram_notifications_database_backups' => 'nullable|boolean',
|
'team.telegram_notifications_database_backups' => 'nullable|boolean',
|
||||||
|
'team.telegram_notifications_test_message_thread_id' => 'nullable|string',
|
||||||
|
'team.telegram_notifications_deployments_message_thread_id' => 'nullable|string',
|
||||||
|
'team.telegram_notifications_status_changes_message_thread_id' => 'nullable|string',
|
||||||
|
'team.telegram_notifications_database_backups_message_thread_id' => 'nullable|string',
|
||||||
];
|
];
|
||||||
protected $validationAttributes = [
|
protected $validationAttributes = [
|
||||||
'team.telegram_token' => 'Token',
|
'team.telegram_token' => 'Token',
|
||||||
|
@@ -5,21 +5,84 @@ namespace App\Http\Livewire\Project\Shared\EnvironmentVariable;
|
|||||||
use App\Models\EnvironmentVariable;
|
use App\Models\EnvironmentVariable;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use Visus\Cuid2\Cuid2;
|
use Visus\Cuid2\Cuid2;
|
||||||
|
use Str;
|
||||||
|
|
||||||
class All extends Component
|
class All extends Component
|
||||||
{
|
{
|
||||||
public $resource;
|
public $resource;
|
||||||
|
public bool $showPreview = false;
|
||||||
public string|null $modalId = null;
|
public string|null $modalId = null;
|
||||||
|
public ?string $variables = null;
|
||||||
|
public ?string $variablesPreview = null;
|
||||||
|
public string $view = 'normal';
|
||||||
protected $listeners = ['refreshEnvs', 'submit'];
|
protected $listeners = ['refreshEnvs', 'submit'];
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
|
$resourceClass = get_class($this->resource);
|
||||||
|
$resourceWithPreviews = ['App\Models\Application'];
|
||||||
|
$simpleDockerfile = !is_null(data_get($this->resource, 'dockerfile'));
|
||||||
|
if (Str::of($resourceClass)->contains($resourceWithPreviews) && !$simpleDockerfile) {
|
||||||
|
$this->showPreview = true;
|
||||||
|
}
|
||||||
$this->modalId = new Cuid2(7);
|
$this->modalId = new Cuid2(7);
|
||||||
|
$this->getDevView();
|
||||||
|
}
|
||||||
|
public function getDevView()
|
||||||
|
{
|
||||||
|
$this->variables = $this->resource->environment_variables->map(function ($item) {
|
||||||
|
return "$item->key=$item->value";
|
||||||
|
})->sort()->join('
|
||||||
|
');
|
||||||
|
if ($this->showPreview) {
|
||||||
|
$this->variablesPreview = $this->resource->environment_variables_preview->map(function ($item) {
|
||||||
|
return "$item->key=$item->value";
|
||||||
|
})->sort()->join('
|
||||||
|
');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function switch()
|
||||||
|
{
|
||||||
|
$this->view = $this->view === 'normal' ? 'dev' : 'normal';
|
||||||
|
}
|
||||||
|
public function saveVariables($isPreview)
|
||||||
|
{
|
||||||
|
if ($isPreview) {
|
||||||
|
$variables = parseEnvFormatToArray($this->variablesPreview);
|
||||||
|
$existingVariables = $this->resource->environment_variables_preview();
|
||||||
|
$this->resource->environment_variables_preview()->delete();
|
||||||
|
} else {
|
||||||
|
$variables = parseEnvFormatToArray($this->variables);
|
||||||
|
$existingVariables = $this->resource->environment_variables();
|
||||||
|
$this->resource->environment_variables()->delete();
|
||||||
|
}
|
||||||
|
foreach ($variables as $key => $variable) {
|
||||||
|
$found = $existingVariables->where('key', $key)->first();
|
||||||
|
if ($found) {
|
||||||
|
$found->value = $variable;
|
||||||
|
$found->save();
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
$environment = new EnvironmentVariable();
|
||||||
|
$environment->key = $key;
|
||||||
|
$environment->value = $variable;
|
||||||
|
$environment->is_build_time = false;
|
||||||
|
$environment->is_preview = $isPreview ? true : false;
|
||||||
|
if ($this->resource->type() === 'application') {
|
||||||
|
$environment->application_id = $this->resource->id;
|
||||||
|
}
|
||||||
|
if ($this->resource->type() === 'standalone-postgresql') {
|
||||||
|
$environment->standalone_postgresql_id = $this->resource->id;
|
||||||
|
}
|
||||||
|
$environment->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->refreshEnvs();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function refreshEnvs()
|
public function refreshEnvs()
|
||||||
{
|
{
|
||||||
$this->resource->refresh();
|
$this->resource->refresh();
|
||||||
|
$this->getDevView();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function submit($data)
|
public function submit($data)
|
||||||
@@ -43,7 +106,7 @@ class All extends Component
|
|||||||
$environment->standalone_postgresql_id = $this->resource->id;
|
$environment->standalone_postgresql_id = $this->resource->id;
|
||||||
}
|
}
|
||||||
$environment->save();
|
$environment->save();
|
||||||
$this->resource->refresh();
|
$this->refreshEnvs();
|
||||||
$this->emit('success', 'Environment variable added successfully.');
|
$this->emit('success', 'Environment variable added successfully.');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return general_error_handler(err: $e, that: $this);
|
return general_error_handler(err: $e, that: $this);
|
||||||
|
@@ -15,7 +15,7 @@ class IsBoardingFlow
|
|||||||
*/
|
*/
|
||||||
public function handle(Request $request, Closure $next): Response
|
public function handle(Request $request, Closure $next): Response
|
||||||
{
|
{
|
||||||
ray()->showQueries()->color('orange');
|
// ray()->showQueries()->color('orange');
|
||||||
if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
|
if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
|
||||||
return redirect('boarding');
|
return redirect('boarding');
|
||||||
}
|
}
|
||||||
|
@@ -46,6 +46,10 @@ class DatabaseBackupJob implements ShouldQueue
|
|||||||
$this->backup = $backup;
|
$this->backup = $backup;
|
||||||
$this->team = Team::find($backup->team_id);
|
$this->team = Team::find($backup->team_id);
|
||||||
$this->database = $this->backup->database;
|
$this->database = $this->backup->database;
|
||||||
|
if (!$this->database) {
|
||||||
|
ray('Database not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
$this->database_type = $this->database->type();
|
$this->database_type = $this->database->type();
|
||||||
$this->server = $this->database->destination->server;
|
$this->server = $this->database->destination->server;
|
||||||
$this->database_status = $this->database->status;
|
$this->database_status = $this->database->status;
|
||||||
|
@@ -31,6 +31,7 @@ class SendMessageToTelegramJob implements ShouldQueue
|
|||||||
public array $buttons,
|
public array $buttons,
|
||||||
public string $token,
|
public string $token,
|
||||||
public string $chatId,
|
public string $chatId,
|
||||||
|
public ?string $topicId = null,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +64,9 @@ class SendMessageToTelegramJob implements ShouldQueue
|
|||||||
'chat_id' => $this->chatId,
|
'chat_id' => $this->chatId,
|
||||||
'text' => $this->text,
|
'text' => $this->text,
|
||||||
];
|
];
|
||||||
ray($payload);
|
if ($this->topicId) {
|
||||||
|
$payload['message_thread_id'] = $this->topicId;
|
||||||
|
}
|
||||||
$response = Http::post($url, $payload);
|
$response = Http::post($url, $payload);
|
||||||
if ($response->failed()) {
|
if ($response->failed()) {
|
||||||
throw new \Exception('Telegram notification failed with ' . $response->status() . ' status code.' . $response->body());
|
throw new \Exception('Telegram notification failed with ' . $response->status() . ' status code.' . $response->body());
|
||||||
|
@@ -105,7 +105,7 @@ class Application extends BaseModel
|
|||||||
|
|
||||||
public function environment_variables(): HasMany
|
public function environment_variables(): HasMany
|
||||||
{
|
{
|
||||||
return $this->hasMany(EnvironmentVariable::class)->where('is_preview', false);
|
return $this->hasMany(EnvironmentVariable::class)->where('is_preview', false)->orderBy('key', 'asc');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function runtime_environment_variables(): HasMany
|
public function runtime_environment_variables(): HasMany
|
||||||
@@ -127,7 +127,7 @@ class Application extends BaseModel
|
|||||||
|
|
||||||
public function environment_variables_preview(): HasMany
|
public function environment_variables_preview(): HasMany
|
||||||
{
|
{
|
||||||
return $this->hasMany(EnvironmentVariable::class)->where('is_preview', true);
|
return $this->hasMany(EnvironmentVariable::class)->where('is_preview', true)->orderBy('key', 'asc');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function runtime_environment_variables_preview(): HasMany
|
public function runtime_environment_variables_preview(): HasMany
|
||||||
|
@@ -20,13 +20,16 @@ class EnvironmentVariable extends Model
|
|||||||
{
|
{
|
||||||
static::created(function ($environment_variable) {
|
static::created(function ($environment_variable) {
|
||||||
if ($environment_variable->application_id && !$environment_variable->is_preview) {
|
if ($environment_variable->application_id && !$environment_variable->is_preview) {
|
||||||
ModelsEnvironmentVariable::create([
|
$found = ModelsEnvironmentVariable::where('key', $environment_variable->key)->where('application_id', $environment_variable->application_id)->where('is_preview',true)->first();
|
||||||
'key' => $environment_variable->key,
|
if (!$found) {
|
||||||
'value' => $environment_variable->value,
|
ModelsEnvironmentVariable::create([
|
||||||
'is_build_time' => $environment_variable->is_build_time,
|
'key' => $environment_variable->key,
|
||||||
'application_id' => $environment_variable->application_id,
|
'value' => $environment_variable->value,
|
||||||
'is_preview' => true,
|
'is_build_time' => $environment_variable->is_build_time,
|
||||||
]);
|
'application_id' => $environment_variable->application_id,
|
||||||
|
'is_preview' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,6 @@ class StandaloneDocker extends BaseModel
|
|||||||
|
|
||||||
public function attachedTo()
|
public function attachedTo()
|
||||||
{
|
{
|
||||||
return $this->applications->count() > 0 || $this->databases->count() > 0;
|
return $this->applications?->count() > 0 || $this->databases?->count() > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,7 @@ class Team extends Model implements SendsDiscord, SendsEmail
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
"token" => data_get($this, 'telegram_token', null),
|
"token" => data_get($this, 'telegram_token', null),
|
||||||
"chat_id" => data_get($this, 'telegram_chat_id', null)
|
"chat_id" => data_get($this, 'telegram_chat_id', null),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,16 +10,30 @@ class TelegramChannel
|
|||||||
{
|
{
|
||||||
$data = $notification->toTelegram($notifiable);
|
$data = $notification->toTelegram($notifiable);
|
||||||
$telegramData = $notifiable->routeNotificationForTelegram();
|
$telegramData = $notifiable->routeNotificationForTelegram();
|
||||||
|
|
||||||
$message = data_get($data, 'message');
|
$message = data_get($data, 'message');
|
||||||
$buttons = data_get($data, 'buttons', []);
|
$buttons = data_get($data, 'buttons', []);
|
||||||
ray($message, $buttons);
|
|
||||||
$telegramToken = data_get($telegramData, 'token');
|
$telegramToken = data_get($telegramData, 'token');
|
||||||
$chatId = data_get($telegramData, 'chat_id');
|
$chatId = data_get($telegramData, 'chat_id');
|
||||||
|
$topicId = null;
|
||||||
|
$topicsInstance = get_class($notification);
|
||||||
|
|
||||||
if (!$telegramToken || !$chatId || !$message) {
|
switch ($topicsInstance) {
|
||||||
throw new \Exception('Telegram token, chat id and message are required');
|
case 'App\Notifications\StatusChange':
|
||||||
|
$topicId = data_get($notifiable, 'telegram_notifications_status_changes_message_thread_id');
|
||||||
|
break;
|
||||||
|
case 'App\Notifications\Test':
|
||||||
|
$topicId = data_get($notifiable, 'telegram_notifications_test_message_thread_id');
|
||||||
|
break;
|
||||||
|
case 'App\Notifications\Deployment':
|
||||||
|
$topicId = data_get($notifiable, 'telegram_notifications_deployments_message_thread_id');
|
||||||
|
break;
|
||||||
|
case 'App\Notifications\DatabaseBackup':
|
||||||
|
$topicId = data_get($notifiable, 'telegram_notifications_database_backups_message_thread_id');
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
dispatch(new SendMessageToTelegramJob($message, $buttons, $telegramToken, $chatId));
|
if (!$telegramToken || !$chatId || !$message) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dispatch(new SendMessageToTelegramJob($message, $buttons, $telegramToken, $chatId, $topicId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -296,3 +296,25 @@ function setNotificationChannels($notifiable, $event)
|
|||||||
}
|
}
|
||||||
return $channels;
|
return $channels;
|
||||||
}
|
}
|
||||||
|
function parseEnvFormatToArray($env_file_contents) {
|
||||||
|
$env_array = array();
|
||||||
|
$lines = explode("\n", $env_file_contents);
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
if ($line === '' || substr($line, 0, 1) === '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$equals_pos = strpos($line, '=');
|
||||||
|
if ($equals_pos !== false) {
|
||||||
|
$key = substr($line, 0, $equals_pos);
|
||||||
|
$value = substr($line, $equals_pos + 1);
|
||||||
|
if (substr($value, 0, 1) === '"' && substr($value, -1) === '"') {
|
||||||
|
$value = substr($value, 1, -1);
|
||||||
|
}
|
||||||
|
elseif (substr($value, 0, 1) === "'" && substr($value, -1) === "'") {
|
||||||
|
$value = substr($value, 1, -1);
|
||||||
|
}
|
||||||
|
$env_array[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $env_array;
|
||||||
|
}
|
||||||
|
@@ -7,7 +7,7 @@ return [
|
|||||||
|
|
||||||
// The release version of your application
|
// The release version of your application
|
||||||
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
||||||
'release' => '4.0.0-beta.27',
|
'release' => '4.0.0-beta.28',
|
||||||
'server_name' => env('APP_ID', 'coolify'),
|
'server_name' => env('APP_ID', 'coolify'),
|
||||||
// When left empty or `null` the Laravel environment will be used
|
// When left empty or `null` the Laravel environment will be used
|
||||||
'environment' => config('app.env'),
|
'environment' => config('app.env'),
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return '4.0.0-beta.27';
|
return '4.0.0-beta.28';
|
||||||
|
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('teams', function (Blueprint $table) {
|
||||||
|
$table->text('telegram_notifications_test_message_thread_id')->nullable();
|
||||||
|
$table->text('telegram_notifications_deployments_message_thread_id')->nullable();
|
||||||
|
$table->text('telegram_notifications_status_changes_message_thread_id')->nullable();
|
||||||
|
$table->text('telegram_notifications_database_backups_message_thread_id')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('teams', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('telegram_message_thread_id');
|
||||||
|
$table->dropColumn('telegram_notifications_test_message_thread_id');
|
||||||
|
$table->dropColumn('telegram_notifications_deployments_message_thread_id');
|
||||||
|
$table->dropColumn('telegram_notifications_status_changes_message_thread_id');
|
||||||
|
$table->dropColumn('telegram_notifications_database_backups_message_thread_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@@ -16,27 +16,50 @@
|
|||||||
<x-forms.checkbox instantSave id="team.telegram_enabled" label="Notification Enabled" />
|
<x-forms.checkbox instantSave id="team.telegram_enabled" label="Notification Enabled" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.input type="password" helper="Get it from the <a class='inline-block text-white underline' href='https://t.me/botfather' target='_blank'>BotFather Bot</a> on Telegram." required
|
<x-forms.input type="password"
|
||||||
id="team.telegram_token" label="Token" />
|
helper="Get it from the <a class='inline-block text-white underline' href='https://t.me/botfather' target='_blank'>BotFather Bot</a> on Telegram."
|
||||||
<x-forms.input type="password" helper="Recommended to add your bot to a group chat and add its Chat ID here." required
|
required id="team.telegram_token" label="Token" />
|
||||||
|
<x-forms.input
|
||||||
|
helper="Recommended to add your bot to a group chat and add its Chat ID here." required
|
||||||
id="team.telegram_chat_id" label="Chat ID" />
|
id="team.telegram_chat_id" label="Chat ID" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
@if (data_get($team, 'telegram_enabled'))
|
@if (data_get($team, 'telegram_enabled'))
|
||||||
<h3 class="mt-4">Subscribe to events</h3>
|
<h2 class="mt-4">Subscribe to events</h2>
|
||||||
<div class="w-64">
|
<div class="w-96">
|
||||||
@if (isDev())
|
@if (isDev())
|
||||||
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_test" label="Test" />
|
<h3 class="mt-4">Test</h3>
|
||||||
|
<div class="flex items-end gap-10">
|
||||||
|
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_test" label="Enabled" />
|
||||||
|
<x-forms.input
|
||||||
|
helper="If you are using Group chat with Topics, you can specify the topics ID. If empty, General topic will be used."
|
||||||
|
id="team.telegram_notifications_test_message_thread_id" label="Custom Topic ID" />
|
||||||
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<h4 class="mt-4">General</h4>
|
<h3 class="mt-4">Container Status Changes</h3>
|
||||||
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_status_changes"
|
<div class="flex items-end gap-10">
|
||||||
label="Container Status Changes" />
|
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_status_changes"
|
||||||
<h4 class="mt-4">Applications</h4>
|
label="Enabled" />
|
||||||
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_deployments"
|
<x-forms.input
|
||||||
label="Deployments" />
|
helper="If you are using Group chat with Topics, you can specify the topics ID. If empty, General topic will be used."
|
||||||
<h4 class="mt-4">Databases</h4>
|
id="team.telegram_notifications_status_changes_message_thread_id" label="Custom Topic ID" />
|
||||||
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_database_backups"
|
</div>
|
||||||
label="Backup Statuses" />
|
<h3 class="mt-4">Application Deployments</h3>
|
||||||
|
<div class="flex items-end gap-10">
|
||||||
|
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_deployments"
|
||||||
|
label="Enabled" />
|
||||||
|
<x-forms.input
|
||||||
|
helper="If you are using Group chat with Topics, you can specify the topics ID. If empty, General topic will be used."
|
||||||
|
id="team.telegram_notifications_deployments_message_thread_id" label="Custom Topic ID" />
|
||||||
|
</div>
|
||||||
|
<h3 class="mt-4">Backup Status</h3>
|
||||||
|
<div class="flex items-end gap-10">
|
||||||
|
<x-forms.checkbox instantSave="saveModel" id="team.telegram_notifications_database_backups"
|
||||||
|
label="Enabled" />
|
||||||
|
<x-forms.input
|
||||||
|
helper="If you are using Group chat with Topics, you can specify the topics ID. If empty, General topic will be used."
|
||||||
|
id="team.telegram_notifications_database_backups_message_thread_id" label="Custom Topic ID" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -4,23 +4,40 @@
|
|||||||
<h2>Environment Variables</h2>
|
<h2>Environment Variables</h2>
|
||||||
<x-forms.button class="btn" onclick="newVariable.showModal()">+ Add</x-forms.button>
|
<x-forms.button class="btn" onclick="newVariable.showModal()">+ Add</x-forms.button>
|
||||||
<livewire:project.shared.environment-variable.add />
|
<livewire:project.shared.environment-variable.add />
|
||||||
|
<x-forms.button
|
||||||
|
wire:click='switch'>{{ $view === 'normal' ? 'Developer view' : 'Normal view' }}</x-forms.button>
|
||||||
</div>
|
</div>
|
||||||
<div>Environment (secrets) variables for this resource.</div>
|
<div>Environment variables (secrets) for this resource.</div>
|
||||||
</div>
|
</div>
|
||||||
@forelse ($resource->environment_variables as $env)
|
@if ($view === 'normal')
|
||||||
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
@forelse ($resource->environment_variables as $env)
|
||||||
:env="$env" />
|
|
||||||
@empty
|
|
||||||
<div class="text-neutral-500">No environment variables found.</div>
|
|
||||||
@endforelse
|
|
||||||
@if ($resource->type() === 'application' && $resource->environment_variables_preview->count() > 0)
|
|
||||||
<div>
|
|
||||||
<h3>Preview Deployments</h3>
|
|
||||||
<div>Environment (secrets) variables for Preview Deployments.</div>
|
|
||||||
</div>
|
|
||||||
@foreach ($resource->environment_variables_preview as $env)
|
|
||||||
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
||||||
:env="$env" />
|
:env="$env" />
|
||||||
@endforeach
|
@empty
|
||||||
|
<div class="text-neutral-500">No environment variables found.</div>
|
||||||
|
@endforelse
|
||||||
|
@if ($resource->type() === 'application' && $resource->environment_variables_preview->count() > 0 && $showPreview)
|
||||||
|
<div>
|
||||||
|
<h3>Preview Deployments</h3>
|
||||||
|
<div>Environment (secrets) variables for Preview Deployments.</div>
|
||||||
|
</div>
|
||||||
|
@foreach ($resource->environment_variables_preview as $env)
|
||||||
|
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
||||||
|
:env="$env" />
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
@else
|
||||||
|
<form wire:submit.prevent='saveVariables(false)' class="flex flex-col gap-2">
|
||||||
|
<x-forms.textarea rows=5 class="whitespace-pre-wrap" label="Environment Variables"
|
||||||
|
id="variables"></x-forms.textarea>
|
||||||
|
<x-forms.button type="submit" class="btn btn-primary">Save</x-forms.button>
|
||||||
|
</form>
|
||||||
|
@if ($showPreview)
|
||||||
|
<form wire:submit.prevent='saveVariables(true)' class="flex flex-col gap-2">
|
||||||
|
<x-forms.textarea rows=5 class="whitespace-pre-wrap" label="Preview Environment Variables"
|
||||||
|
id="variablesPreview"></x-forms.textarea>
|
||||||
|
<x-forms.button type="submit" class="btn btn-primary">Save</x-forms.button>
|
||||||
|
</form>
|
||||||
|
@endif
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"version": "3.12.36"
|
"version": "3.12.36"
|
||||||
},
|
},
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.27"
|
"version": "4.0.0-beta.28"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user