Commit 16b76f30 by Vladislav

#19462 Добавление в настройки городов переменных.

1 parent fcad6cb7
<?php
namespace App\Http\Controllers;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Inertia\Inertia;
class CampaignVarsController extends Controller
{
protected $rule_name = 'required|alpha|regex:/[a-zA-z]/';
protected $rule_default_value = 'required';
function __invoke(Tokens $token, $campaign_id)
{
if (!$token->isMain()) {
return Redirect::back();
}
$campaign = $token->campaigns()->with('vars')->find($campaign_id);
if (!$campaign) {
return Redirect::back();
};
switch (request()->method()) {
case 'GET':
return Inertia::render('CampaignVars/Edit', [
'token' => $token,
'campaign' => $campaign,
]);
break;
case 'POST':
request()->validate([
'name' => $this->rule_name,
'default_value' => $this->rule_default_value,
]);
$campaign->vars()->create(request()->only('name', 'default_value'));
return back()->with('success', 'Campaign var added.');
break;
case 'PATCH':
$campaign_var = $campaign->vars()->find(request('id'));
if (!$campaign_var) {
return back();
}
if (
request()->has('name')
&&
request()->validate(['name' => $this->rule_name])
) {
$campaign_var->update(request()->only('name'));
} elseif (request()->has('default_value')
&&
request()->validate(['name' => $this->rule_default_value])
) {
$campaign_var->update(request()->only('default_value'));
}
return back()->with('success', 'Campaign var updated.');
break;
case 'DELETE':
$campaign_var = $campaign->vars()->find(request('id'));
if (!$campaign_var) {
return back();
}
$campaign_var->delete();
return back()->with('success', 'Campaign var deleted.');
break;
}
return back();
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class CampaignVar extends Model
{
protected $fillable = [
'campaign_id',
'name',
'default_value',
];
protected $casts = [
'campaign_id' => 'int',
];
public function campaign()
{
return $this->belongsTo(Campaigns::class, 'campaign_id');
}
}
...@@ -37,6 +37,11 @@ class Campaigns extends Model ...@@ -37,6 +37,11 @@ class Campaigns extends Model
'groups_loaded_at' => 'datetime', 'groups_loaded_at' => 'datetime',
]; ];
public function vars()
{
return $this->hasMany(CampaignVar::class, 'campaign_id');
}
public function scopeForUpdated($query) public function scopeForUpdated($query)
{ {
$query->whereNotNull('updated'); $query->whereNotNull('updated');
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
namespace App\Models; namespace App\Models;
use App\Models\Pivots\TokenDictionaryPivot;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class Tokens extends Model class Tokens extends Model
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCampaignVarsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('campaign_vars', function (Blueprint $table) {
$table->id();
$table->bigInteger('campaign_id')->unsigned();
$table->string('name', 255);
$table->string('default_value', 255);
$table->timestamps();
$table->foreign('campaign_id')->references('id')->on('campaigns');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('campaign_vars');
}
}
<template>
<div>
<h1 class="mb-8 font-bold text-3xl">Campaign vars</h1>
<div class="mb-6 flex justify-between items-center">
<div class="mt-4 flex flex-wrap">
<text-input v-model="name"
class="pr-6"
placeholder="Name"
>
</text-input>
<text-input v-model="default_value"
class="pr-6"
placeholder="Default value"
>
</text-input>
<button class="btn-indigo hover:underline"
tabindex="-1"
type="button"
@click="add"
>
Add
</button>
</div>
</div>
<div class="bg-white rounded-md shadow overflow-x-auto">
<table class="w-full whitespace-nowrap">
<tr class="text-left font-bold">
<th class="px-6 pt-6 pb-4">Name</th>
<th class="px-6 pt-6 pb-4">Default value</th>
</tr>
<tr v-for="campaign_var in campaign.vars" :key="campaign_var.id" class="hover:bg-gray-100 focus-within:bg-gray-100">
<td class="px-6 py-4 border-t">
<div v-if="!inputs[campaign_var.id] || !inputs[campaign_var.id].name || !inputs[campaign_var.id].name.editable"
class="hover:text-indigo-500 focus:text-indigo-500 cursor-pointer"
@click="edit(campaign_var.id, 'name', campaign_var.name)"
>
{{ campaign_var.name }}
</div>
<div v-else class="inline-flex">
<text-input v-model="inputs[campaign_var.id].name.val"
class="pr-6"
>
</text-input>
<button class="btn-indigo hover:underline mr-6"
tabindex="-1"
type="button"
@click="save(campaign_var.id, 'name')"
>
Save
</button>
<button class="btn-indigo hover:underline"
tabindex="-1"
type="button"
@click="editCancel(campaign_var.id, 'name')"
>
Cancel
</button>
</div>
</td>
<td class="px-6 py-4 border-t">
<div v-if="!inputs[campaign_var.id] || !inputs[campaign_var.id].default_value || !inputs[campaign_var.id].default_value.editable"
class="hover:text-indigo-500 focus:text-indigo-500 cursor-pointer"
@click="edit(campaign_var.id, 'default_value', campaign_var.default_value)"
>
{{ campaign_var.default_value }}
</div>
<div v-else class="inline-flex">
<text-input v-model="inputs[campaign_var.id].default_value.val"
class="pr-6"
>
</text-input>
<button class="btn-indigo hover:underline mr-6"
tabindex="-1"
type="button"
@click="save(campaign_var.id, 'default_value')"
>
Save
</button>
<button class="btn-indigo hover:underline"
tabindex="-1"
type="button"
@click="editCancel(campaign_var.id, 'default_value')"
>
Cancel
</button>
</div>
</td>
<td class="px-6 py-4 border-t w-px">
<button class="px-4 flex items-center"
type="button"
tabindex="-1"
@click="destroy(campaign_var.id)"
>
<icon name="trash" class="block w-6 h-6 fill-gray-400"/>
</button>
</td>
</tr>
<tr v-if="campaign.vars.length === 0">
<td class="border-t px-6 py-4" colspan="4">No campaign vars found.</td>
</tr>
</table>
</div>
</div>
</template>
<script>
import Layout from '@/Shared/Layout'
import Icon from '@/Shared/Icon'
import TextInput from '@/Shared/TextInput'
export default {
metaInfo: { title: 'Campaign vars' },
components: {
Icon,
TextInput,
},
layout: Layout,
props: {
token: Object,
campaign: Object,
errors: Object,
},
data() {
return {
name: '',
default_value: '',
inputs: {},
}
},
watch: {
},
methods: {
add() {
this.$inertia.post(this.route('token.campaign.vars', [this.token.id, this.campaign.id]), {
name: this.name,
default_value: this.default_value,
});
this.name = '';
this.default_value = '';
},
edit(campaign_var_id, key, val) {
this.inputs = {
...this.inputs,
[campaign_var_id]: {
...this.inputs[campaign_var_id],
[key]: {
editable: true,
val: val,
}
}
};
},
editCancel(campaign_var_id, key) {
this.inputs = {
...this.inputs,
[campaign_var_id]: {
...this.inputs[campaign_var_id],
[key]: {
...this.inputs[campaign_var_id][key],
editable: false,
}
}
};
},
save(campaign_var_id, key) {
this.$inertia.patch(this.route('token.campaign.vars', [this.token.id, this.campaign.id]), {
id: campaign_var_id,
[key]: this.inputs[campaign_var_id][key].val,
});
this.editCancel(campaign_var_id, key);
},
destroy(campaign_var_id) {
if (confirm('Are you sure you want to delete this campaign var?')) {
this.$inertia.delete(this.route('token.campaign.vars', [this.token.id, this.campaign.id]), {
id: campaign_var_id,
});
}
},
},
}
</script>
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{{ campaign.name }} {{ campaign.name }}
</option> </option>
</select-input> </select-input>
<button class="btn-indigo hover:underline pl-6" <button class="btn-indigo hover:underline"
tabindex="-1" tabindex="-1"
type="button" type="button"
@click="add" @click="add"
...@@ -26,14 +26,18 @@ ...@@ -26,14 +26,18 @@
<table class="w-full whitespace-nowrap"> <table class="w-full whitespace-nowrap">
<tr class="text-left font-bold"> <tr class="text-left font-bold">
<th class="px-6 pt-6 pb-4">Name</th> <th class="px-6 pt-6 pb-4">Name</th>
<th class="px-6 pt-6 pb-4">Action</th> <th class="px-6 pt-6 pb-4" colspan="2">Action</th>
</tr> </tr>
<tr v-for="campaign in token.campaigns" :key="campaign.id" <tr v-for="campaign in token.campaigns" :key="campaign.id"
class="hover:bg-gray-100 focus-within:bg-gray-100"> class="hover:bg-gray-100 focus-within:bg-gray-100">
<td class="border-t py-3"> <td class="border-t px-6 py-3">
{{ campaign.name }} <inertia-link class="hover:text-indigo-500 focus:text-indigo-500"
:href="route('token.campaign.vars', [token.id, campaign.id])"
>
{{ campaign.name }}
</inertia-link>
</td> </td>
<td class="border-t py-3"> <td class="border-t px-6 py-3">
<input :id="'campaign-enabled-' + campaign.id" :checked="campaign.enabled" <input :id="'campaign-enabled-' + campaign.id" :checked="campaign.enabled"
@change="enabled(campaign.id, !campaign.enabled)" @change="enabled(campaign.id, !campaign.enabled)"
type="checkbox" type="checkbox"
...@@ -47,9 +51,17 @@ ...@@ -47,9 +51,17 @@
Delete Campaign Delete Campaign
</button> </button>
</td> </td>
<td class="border-t w-px">
<inertia-link class="px-4 flex items-center"
:href="route('token.campaign.vars', [token.id, campaign.id])"
tabindex="-1"
>
<icon name="cheveron-right" class="block w-6 h-6 fill-gray-400" />
</inertia-link>
</td>
</tr> </tr>
<tr v-if="token.campaigns.length === 0"> <tr v-if="token.campaigns.length === 0">
<td class="border-t px-6 py-4" colspan="4">No campaigns found.</td> <td class="border-t px-6 py-4" colspan="5">No campaigns found.</td>
</tr> </tr>
</table> </table>
</div> </div>
...@@ -91,7 +103,7 @@ ...@@ -91,7 +103,7 @@
enabled(campaign_id, enabled) { enabled(campaign_id, enabled) {
this.$emit('enabled', campaign_id, enabled) this.$emit('enabled', campaign_id, enabled)
}, },
delete(campaign_id) { destroy(campaign_id) {
this.$emit('delete', campaign_id) this.$emit('delete', campaign_id)
}, },
} }
......
<?php <?php
use App\Http\Controllers\Auth\LoginController; use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\CampaignVarsController;
use App\Http\Controllers\ContactsController; use App\Http\Controllers\ContactsController;
use App\Http\Controllers\DashboardController; use App\Http\Controllers\DashboardController;
use App\Http\Controllers\ImagesController; use App\Http\Controllers\ImagesController;
...@@ -179,6 +180,9 @@ Route::post('token/campaigns/managed/{token}/{campaign_id}', [TokensController:: ...@@ -179,6 +180,9 @@ Route::post('token/campaigns/managed/{token}/{campaign_id}', [TokensController::
Route::post('token/campaigns/enabled/{token}/{campaign_id}', [TokensController::class, 'enabledCampaign']) Route::post('token/campaigns/enabled/{token}/{campaign_id}', [TokensController::class, 'enabledCampaign'])
->name('token.campaign.enabled') ->name('token.campaign.enabled')
->middleware('auth'); ->middleware('auth');
Route::any('token/campaigns/vars/{token}/{campaign_id}', CampaignVarsController::class)
->name('token.campaign.vars')
->middleware('auth');
Route::post('token/city/store/{token}/{city}', [TokensController::class, 'storeCity']) Route::post('token/city/store/{token}/{city}', [TokensController::class, 'storeCity'])
->name('token.city.store') ->name('token.city.store')
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!