Commit 12de07a9 by Vladislav

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

1 parent a2df7886
......@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Models\Campaigns;
use App\Models\Tokens;
use App\Models\Variable;
use Illuminate\Support\Facades\Redirect;
......@@ -13,7 +14,8 @@ class CampaignVariablesController extends Controller
protected $rule_variable = 'required|exists:variables,id';
protected $rule_variable_name = 'required|alpha|regex:/[a-zA-z]/';
protected $rule_value = 'required';
protected $rule_default_value = 'required';
protected $rule_value = '';
function __invoke(Tokens $token, $campaign_id)
{
......@@ -21,7 +23,7 @@ class CampaignVariablesController extends Controller
return Redirect::back();
}
$campaign = Tokens::where('type', Tokens::MAIN)->get()->first()->campaignsForEnabled()->with('variables')->find($campaign_id);
$campaign = Tokens::where('type', Tokens::MAIN)->get()->first()->campaignsForManaged()->with('variables')->find($campaign_id);
if (!$campaign) {
return Redirect::back();
......@@ -29,88 +31,113 @@ class CampaignVariablesController extends Controller
switch (request()->method()) {
case 'GET':
$variables = Variable::defaultOrderBy()->get()->transform(function (Variable $variable) use ($campaign) {
$variable->campaign = $variable->campaigns()
->where('campaign_id', $campaign->getKey())->first();
return $variable;
});
return Inertia::render('CampaignVariables/Edit', [
'variables' => Variable::defaultOrderBy()->get(),
'variables' => $variables,
'token' => $token,
'campaign' => $campaign,
]);
break;
case 'POST':
if (request('variable') === 'add') {
Request::validate([
'name' => $this->rule_variable_name,
'value' => $this->rule_value,
'default_value' => $this->rule_default_value,
]);
$variable_new = Variable::create([
'name' => request('name'),
]);
$variable_new = Variable::create(Request::only([
'name',
'default_value',
]));
$variable_id = $variable_new->getKey();
$value = request('value');
} else {
Request::validate([
'variable' => $this->rule_variable,
'value' => $this->rule_value,
]);
$variable_id = request('variable');
$value = request('value');
}
$campaign->variables()->syncWithoutDetaching([
$variable_id => [
'value' => $value,
],
]);
$this->putCampaignVariableValue($campaign, $variable_id, $value);
return Redirect::back()->with('success', 'Campaign variable added.');
break;
case 'PUT':
$campaign_variable = $campaign->variables()->find(request('id'));
if (!$campaign_variable) {
return Redirect::back();
}
$campaign_variable->update([
Request::validate(['name' => $this->rule_variable_name])
Request::validate([
'value' => $this->rule_value
]);
return Redirect::back()->with('success', 'Variable name updated.');
$this->putCampaignVariableValue($campaign, request('id'), request('value'));
return Redirect::back()->with('success', 'Campaign variable updated.');
break;
case 'PATCH':
$campaign_variable = $campaign->variables()->find(request('id'));
$variable = Variable::find(request('id'));
if (!$campaign_variable) {
if (!$variable) {
return Redirect::back();
}
if (request()->validate(['value' => $this->rule_value])) {
$campaign_variable->update(request()->only('value'));
}
$variable->update(Request::validate([
'name' => $this->rule_variable_name,
'default_value' => $this->rule_default_value,
]));
return Redirect::back()->with('success', 'Campaign variable updated.');
return Redirect::back()->with('success', 'Variable name updated.');
break;
case 'DELETE':
}
$campaign_variable = $campaign->vars()->find(request('id'));
return Redirect::back();
}
if (!$campaign_variable) {
public function destroy(Tokens $token, $campaign_id, $variable_id)
{
if ($token->isMain()) {
return Redirect::back();
}
$campaign_variable->delete();
$variable = Variable::find($variable_id);
if (!$variable) {
return Redirect::back();
};
$variable->delete();
return Redirect::back()->with('success', 'Campaign variable deleted.');
break;
}
return Redirect::back();
/**
* @param Campaigns $campaign
* @param integer $variable_id
* @param string|null $value
*/
private function putCampaignVariableValue(Campaigns $campaign, $variable_id, $value = null)
{
if (is_null($value)) {
$campaign->variables()->detach($variable_id);
} else {
$campaign->variables()->syncWithoutDetaching([
$variable_id => [
'value' => $value,
],
]);
}
}
}
......@@ -157,7 +157,7 @@ class TokensController extends Controller
return Redirect::back();
}
$token_main = Tokens::with('campaignsForEnabled')->where('type', Tokens::MAIN)->first();
$token_main = Tokens::with('campaignsForManaged')->where('type', Tokens::MAIN)->first();
if (!$token_main) {
return Redirect::back();
......@@ -168,9 +168,9 @@ class TokensController extends Controller
$token->cities()->save($city);
if ($token_main->campaignsForEnabled->count()) {
if ($token_main->campaignsForManaged->count()) {
$city->campaigns()->syncWithoutDetaching(
$token_main->campaignsForEnabled->keyBy($token_main->campaignsForEnabled->first()->getKeyName())->transform(function (Campaigns $campaign) {
$token_main->campaignsForManaged->keyBy($token_main->campaignsForManaged->first()->getKeyName())->transform(function (Campaigns $campaign) {
return DictionaryCampaign::copyPropertyInCampaign($campaign);
})->all()
);
......
......@@ -17,6 +17,11 @@ class Dictionary extends Model
'update' => 'boolean',
];
public function scopeDefaultOrderBy(Builder $query)
{
return $query->orderBy('name');
}
public function token()
{
return $this->belongsTo(Tokens::class, 'token_id');
......@@ -30,9 +35,4 @@ class Dictionary extends Model
->withTimestamps();
}
public function scopeDefaultOrderBy(Builder $query)
{
return $query->orderBy('name');
}
}
......@@ -18,6 +18,12 @@ class DictionaryCampaign extends Pivot
'updated',
];
protected $cast = [
'campaign_id' => 'int',
'dictionary_id' => 'int',
'updated' => 'boolean',
];
static public function getWithPivot()
{
return [
......@@ -39,12 +45,6 @@ class DictionaryCampaign extends Pivot
})->flatMap(fn($val) => $val)->all();
}
protected $cast = [
'campaign_id' => 'int',
'dictionary_id' => 'int',
'updated' => 'boolean',
];
public function dictionary()
{
return $this->belongsTo(Dictionary::class, 'dictionary_id');
......
......@@ -39,11 +39,6 @@ class Tokens extends Model
->orderBy('updated_at', 'DESC');
}
public function campaignsForEnabled()
{
return $this->campaigns()->forEnabled();
}
public function cities()
{
return $this->hasMany(Dictionary::class, 'token_id', 'id')
......
......@@ -7,6 +7,10 @@ use Illuminate\Database\Eloquent\Builder;
class Variable extends Model
{
protected $fillable = [
'name',
'default_value',
];
public function scopeDefaultOrderBy(Builder $query)
{
......
......@@ -21,8 +21,10 @@ class CreateCampaignVariablesTable extends Migration
$table->timestamps();
$table->foreign('campaign_id')->references('id')->on('campaigns');
$table->foreign('variable_id')->references('id')->on('variables');
$table->foreign('campaign_id')->references('id')->on('campaigns')
->cascadeOnDelete();
$table->foreign('variable_id')->references('id')->on('variables')
->cascadeOnDelete();
});
}
......
<template>
<div>
<h1 class="mb-8 font-bold text-3xl">Campaign variables</h1>
<h1 class="mb-8 font-bold text-3xl">
<inertia-link class="text-indigo-400 hover:text-indigo-600" :href="route('tokens')">
Tokens
</inertia-link>
<span class="text-indigo-400 font-medium">/</span>
<inertia-link class="text-indigo-400 hover:text-indigo-600" :href="route('token.edit', token.id)">
{{ token.login }}
</inertia-link>
<span class="text-indigo-400 font-medium">/</span>
{{ campaign.name }}
</h1>
<div class="mb-6 flex justify-between items-center">
<div class="mt-4 flex flex-wrap">
<select-input v-model="variable"
......@@ -21,10 +31,17 @@
label="New variable name"
>
</text-input>
<text-input v-if="variable === 'add'"
v-model="default_value"
:error="errors.default_value"
class="pr-6"
label="New variable default value"
>
</text-input>
<text-input v-model="value"
:error="errors.value"
class="pr-6"
label="Default value"
label="Campaign default value"
>
</text-input>
<button class="btn-indigo hover:underline"
......@@ -42,23 +59,39 @@
<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="variable in campaign.variables" :key="variable.id" class="hover:bg-gray-100 focus-within:bg-gray-100">
<tr v-for="variable in variables" :key="variable.id" class="hover:bg-gray-100 focus-within:bg-gray-100">
<td class="px-6 py-4 border-t">
<div v-if="!inputs[variable.id] || !inputs[variable.id].name || !inputs[variable.id].name.editable"
<div
v-if="!inputs[variable.id] || !inputs[variable.id].name || !inputs[variable.id].name.editable"
class="hover:text-indigo-500 focus:text-indigo-500 cursor-pointer"
@click="edit(variable.id, 'name', variable.name)"
@click="edit(variable.id, [
{
name: 'default_value',
val: variable.default_value,
},
{
name: 'name',
val: variable.name,
}
])"
>
{{ variable.name }}
</div>
<div v-else class="inline-flex">
<text-input v-model="inputs[variable.id].name.val"
class="pr-6"
label="Variable name"
>
</text-input>
<text-input v-model="inputs[variable.id].default_value.val"
class="pr-6"
label="Variable default value"
>
</text-input>
<button class="btn-indigo hover:underline mr-6"
tabindex="-1"
type="button"
@click="save(variable.id, 'name')"
@click="save(variable.id, ['name', 'default_value'])"
>
Save
......@@ -74,21 +107,32 @@
</div>
</td>
<td class="px-6 py-4 border-t">
<div v-if="!inputs[variable.id] || !inputs[variable.id].value || !inputs[variable.id].value.editable"
<div
v-if="!inputs[variable.id] || !inputs[variable.id].value || !inputs[variable.id].value.editable"
class="hover:text-indigo-500 focus:text-indigo-500 cursor-pointer"
@click="edit(variable.id, 'value', variable.pivot.value)"
@click="edit(variable.id, [
{
name: 'value',
val: !variable.campaign
? ''
: variable.campaign.pivot.value,
},
])"
>
{{ variable.pivot.value }}
{{ !variable.campaign
? variable.default_value
: variable.campaign.pivot.value }}
</div>
<div v-else class="inline-flex">
<text-input v-model="inputs[variable.id].value.val"
class="pr-6"
label="Campaign default value"
>
</text-input>
<button class="btn-indigo hover:underline mr-6"
tabindex="-1"
type="button"
@click="save(variable.id, 'value')"
@click="save(variable.id, ['value'])"
>
Save
......@@ -113,8 +157,8 @@
</button>
</td>
</tr>
<tr v-if="campaign.variables.length === 0">
<td class="border-t px-6 py-4" colspan="4">No campaign variables found.</td>
<tr v-if="variables.length === 0">
<td class="border-t px-6 py-4" colspan="4">No variables found.</td>
</tr>
</table>
</div>
......@@ -128,7 +172,9 @@
import SelectInput from "../../Shared/SelectInput";
export default {
metaInfo: { title: 'Campaign variables' },
metaInfo() {
return {title: this.campaign.name}
},
components: {
Icon,
TextInput,
......@@ -144,17 +190,18 @@
data() {
return {
variable: this.variables.length ? null : 'add',
default_value: '',
name: '',
value: '',
inputs: {},
}
},
watch: {
},
watch: {},
methods: {
add() {
this.$inertia.post(this.route('token.campaign.variables', [this.token.id, this.campaign.id]), {
variable: this.variable,
default_value: this.default_value,
name: this.name,
value: this.value,
});
......@@ -162,17 +209,19 @@
this.name = '';
this.value = '';
},
edit(campaign_var_id, key, val) {
edit(campaign_var_id, options) {
options.map((option) => {
this.inputs = {
...this.inputs,
[campaign_var_id]: {
...this.inputs[campaign_var_id],
[key]: {
[option.name]: {
editable: true,
val: val,
val: option.val,
}
}
};
});
},
editCancel(campaign_var_id, key) {
this.inputs = {
......@@ -186,22 +235,26 @@
}
};
},
save(campaign_var_id, key) {
const method = key === 'name'
? 'post'
: 'patch';
save(campaign_var_id, names) {
const method = names.indexOf('name') !== -1
? 'patch'
: 'put';
this.$inertia[method](this.route('token.campaign.variables', [this.token.id, this.campaign.id]), {
let data = {
id: campaign_var_id,
[key]: this.inputs[campaign_var_id][key].val,
};
names.map((name) => {
data[name] = this.inputs[campaign_var_id][name].val;
this.editCancel(campaign_var_id, name);
});
this.editCancel(campaign_var_id, key);
this.$inertia[method](this.route('token.campaign.variables', [this.token.id, this.campaign.id]), data);
},
destroy(campaign_var_id) {
if (confirm('Are you sure you want to delete this campaign var?')) {
this.$inertia.delete(this.route('token.campaign.variables', [this.token.id, this.campaign.id]), {
id: campaign_var_id,
});
this.$inertia.delete(this.route('token.campaign.variable.destroy', [this.token.id, this.campaign.id, campaign_var_id]));
}
},
},
......
......@@ -75,14 +75,7 @@
type="checkbox"
>
</td>
<td class="border-t">
<inertia-link class="px-4 flex items-center"
tabindex="-1"
:href="route('token.campaign.variables', [token.id, campaign.id])"
>
<icon name="book" class="block w-6 h-6 fill-gray-400"/>
</inertia-link>
</td>
<td class="border-t"></td>
</tr>
</template>
<tr v-if="token.cities.length === 0">
......
......@@ -180,9 +180,13 @@ Route::post('token/campaigns/managed/{token}/{campaign_id}', [TokensController::
Route::post('token/campaigns/enabled/{token}/{campaign_id}', [TokensController::class, 'enabledCampaign'])
->name('token.campaign.enabled')
->middleware('auth');
Route::any('token/campaigns/vars/{token}/{campaign_id}', CampaignVariablesController::class)
->name('token.campaign.variables')
->middleware('auth');
Route::delete('token/campaigns/vars/{token}/{campaign_id}/{variable_id}', [CampaignVariablesController::class, 'destroy'])
->name('token.campaign.variable.destroy')
->middleware('auth');
Route::post('token/city/store/{token}/{city}', [TokensController::class, 'storeCity'])
->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!