Update views and routes for #1078

This commit is contained in:
James Cole
2017-12-30 14:25:11 +01:00
parent 73051d7d42
commit 3fba741f1b
11 changed files with 153 additions and 108 deletions

View File

@@ -26,12 +26,14 @@ namespace FireflyIII\Http\Controllers\Transaction;
use ExpandedForm; use ExpandedForm;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\MassEditBulkJournalRequest; use FireflyIII\Http\Requests\BulkEditJournalRequest;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log;
use Preferences; use Preferences;
use Session; use Session;
use View; use View;
@@ -65,7 +67,7 @@ class BulkController extends Controller
* *
* @return View * @return View
*/ */
public function edit(Collection $journals) public function edit(Request $request, Collection $journals)
{ {
$subTitle = trans('firefly.mass_bulk_journals'); $subTitle = trans('firefly.mass_bulk_journals');
@@ -101,11 +103,11 @@ class BulkController extends Controller
} }
if (count($messages) > 0) { if (count($messages) > 0) {
Session::flash('info', $messages); $request->session()->flash('info', $messages);
} }
// put previous url in session // put previous url in session
$this->rememberPreviousUri('transactions.mass-edit-bulk.uri'); $this->rememberPreviousUri('transactions.bulk-edit.uri');
// get list of budgets: // get list of budgets:
/** @var BudgetRepositoryInterface $repository */ /** @var BudgetRepositoryInterface $repository */
@@ -119,33 +121,58 @@ class BulkController extends Controller
); );
if (0 === $filtered->count()) { if (0 === $filtered->count()) {
Session::flash('error', trans('firefly.no_edit_multiple_left')); $request->session()->flash('error', trans('firefly.no_edit_multiple_left'));
} }
$journals = $filtered; $journals = $filtered;
return view('transactions.bulk.edit', compact('journals', 'subTitle','budgetList')); return view('transactions.bulk.edit', compact('journals', 'subTitle', 'budgetList'));
} }
/** /**
* @param MassEditBulkJournalRequest $request * @param BulkEditJournalRequest $request
* @param JournalRepositoryInterface $repository * @param JournalRepositoryInterface $repository
* *
* @return mixed * @return mixed
*/ */
public function updateBulk(MassEditBulkJournalRequest $request, JournalRepositoryInterface $repository) public function update(BulkEditJournalRequest $request, JournalRepositoryInterface $repository)
{ {
$journalIds = $request->get('journals'); $journalIds = $request->get('journals');
$count = 0; $ignoreCategory = intval($request->get('ignore_category')) === 1;
$ignoreBudget = intval($request->get('ignore_budget')) === 1;
$ignoreTags = intval($request->get('ignore_tags')) === 1;
$count = 0;
if (is_array($journalIds)) { if (is_array($journalIds)) {
$count = $repository->updateBulk($journalIds, $request->get('category'), $request->get('tags')); foreach ($journalIds as $journalId) {
$journal = $repository->find(intval($journalId));
if (!is_null($journal)) {
$count++;
Log::debug(sprintf('Found journal #%d', $journal->id));
// update category if not told to ignore
if ($ignoreCategory === false) {
Log::debug(sprintf('Set category to %s', $request->string('category')));
$repository->updateCategory($journal, $request->string('category'));
}
// update budget if not told to ignore (and is withdrawal)
if ($ignoreBudget === false) {
Log::debug(sprintf('Set budget to %d', $request->integer('budget_id')));
$repository->updateBudget($journal, $request->integer('budget_id'));
}
if ($ignoreTags === false) {
Log::debug(sprintf('Set tags to %s', $request->string('budget_id')));
$repository->updateTags($journal, explode(',', $request->string('tags')));
}
// update tags if not told to ignore (and is withdrawal)
}
}
} }
Preferences::mark(); Preferences::mark();
Session::flash('success', trans('firefly.mass_edited_transactions_success', ['amount' => $count])); $request->session()->flash('success', trans('firefly.mass_edited_transactions_success', ['amount' => $count]));
// redirect to previous URL: // redirect to previous URL:
return redirect($this->getPreviousUri('transactions.mass-edit-bulk.uri')); return redirect($this->getPreviousUri('transactions.bulk-edit.uri'));
} }
} }

View File

@@ -214,7 +214,7 @@ class MassController extends Controller
if (is_array($journalIds)) { if (is_array($journalIds)) {
foreach ($journalIds as $journalId) { foreach ($journalIds as $journalId) {
$journal = $repository->find(intval($journalId)); $journal = $repository->find(intval($journalId));
if ($journal) { if (!is_null($journal)) {
// get optional fields: // get optional fields:
$what = strtolower($journal->transactionTypeStr()); $what = strtolower($journal->transactionTypeStr());
$sourceAccountId = $request->get('source_account_id')[$journal->id] ?? 0; $sourceAccountId = $request->get('source_account_id')[$journal->id] ?? 0;

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* MassEditJournalRequest.php * BulkEditJournalRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com * Copyright (c) 2017 thegrumpydictator@gmail.com
* *
* This file is part of Firefly III. * This file is part of Firefly III.
@@ -25,7 +25,7 @@ namespace FireflyIII\Http\Requests;
/** /**
* Class MassEditBulkJournalRequest. * Class MassEditBulkJournalRequest.
*/ */
class MassEditBulkJournalRequest extends Request class BulkEditJournalRequest extends Request
{ {
/** /**
* @return bool * @return bool
@@ -41,8 +41,10 @@ class MassEditBulkJournalRequest extends Request
*/ */
public function rules() public function rules()
{ {
// fixed
return []; // fixed
return [
'journals.*' => 'required|belongsToUser:transaction_journals,id',
];
} }
} }

View File

@@ -143,7 +143,7 @@ class Request extends FormRequest
* *
* @return int * @return int
*/ */
protected function integer(string $field): int public function integer(string $field): int
{ {
return intval($this->get($field)); return intval($this->get($field));
} }

View File

@@ -22,14 +22,15 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\Journal; namespace FireflyIII\Repositories\Journal;
use DB;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Category;
use FireflyIII\Models\Note; use FireflyIII\Models\Note;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
@@ -435,44 +436,40 @@ class JournalRepository implements JournalRepositoryInterface
} }
/** /**
* @param array $journals * @param TransactionJournal $journal
* @param var $category * @param int $budgetId
* @param var $tags
* *
* @return int * @return TransactionJournal
*/ */
public function updateBulk(array $journals, $category, $tags): int public function updateBudget(TransactionJournal $journal, int $budgetId): TransactionJournal
{ {
$count = 0; if ($budgetId === 0) {
foreach ($journals as $journalId) { $journal->budgets()->detach();
$journal = $this->find(intval($journalId)); $journal->save();
if ($journal) {
// update category:
if (isset($category)) {
$categoryToReplace = Category::firstOrCreateEncrypted(['name' => strval($category), 'user_id' => $journal->user->id]);
$journal->categories()->sync([$categoryToReplace->id]);
/** @var Transaction $transaction */
foreach ($journal->transactions()->getResults() as $transaction) {
$transaction->categories()->sync([$categoryToReplace->id]);
$transaction->touch();
}
}
// update tags: return $journal;
if (isset($tags)) {
$tagsToReplace = [];
foreach (explode(',', strval($tags)) as $tag) {
array_push($tagsToReplace, Tag::firstOrCreateEncrypted(['tag' => $tag, 'user_id' => $journal->user->id])->id);
}
$journal->tags()->sync($tagsToReplace);
}
$journal->touch();
++$count;
}
} }
$this->storeBudgetWithJournal($journal, $budgetId);
return $count; return $journal;
}
/**
* @param TransactionJournal $journal
* @param string $category
*
* @return TransactionJournal
*/
public function updateCategory(TransactionJournal $journal, string $category): TransactionJournal
{
Log::debug(sprintf('In updateCategory("%s")', $category));
$journal->categories()->detach();
if (strlen($category) === 0) {
return $journal;
}
$this->storeCategoryWithJournal($journal, $category);
return $journal;
} }
/** /**
@@ -535,4 +532,48 @@ class JournalRepository implements JournalRepositoryInterface
return $journal; return $journal;
} }
/**
* Update tags.
*
* @param TransactionJournal $journal
* @param array $array
*
* @return bool
*/
public function updateTags(TransactionJournal $journal, array $array): bool
{
// create tag repository
/** @var TagRepositoryInterface $tagRepository */
$tagRepository = app(TagRepositoryInterface::class);
// find or create all tags:
$tags = [];
$ids = [];
foreach ($array as $name) {
if (strlen(trim($name)) > 0) {
$tag = Tag::firstOrCreateEncrypted(['tag' => $name, 'user_id' => $journal->user_id]);
$tags[] = $tag;
$ids[] = $tag->id;
}
}
// delete all tags connected to journal not in this array:
if (count($ids) > 0) {
DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal->id)->whereNotIn('tag_id', $ids)->delete();
}
// if count is zero, delete them all:
if (0 === count($ids)) {
DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal->id)->delete();
}
// connect each tag to journal (if not yet connected):
/** @var Tag $tag */
foreach ($tags as $tag) {
Log::debug(sprintf('Will try to connect tag #%d to journal #%d.', $tag->id, $journal->id));
$tagRepository->connect($journal, $tag);
}
return true;
}
} }

View File

@@ -161,13 +161,20 @@ interface JournalRepositoryInterface
public function update(TransactionJournal $journal, array $data): TransactionJournal; public function update(TransactionJournal $journal, array $data): TransactionJournal;
/** /**
* @param array $journals * @param TransactionJournal $journal
* @param var $category * @param int $budgetId
* @param var $tags
* *
* @return int * @return TransactionJournal
*/ */
public function updateBulk(array $journals, $category, $tags): int; public function updateBudget(TransactionJournal $journal, int $budgetId): TransactionJournal;
/**
* @param TransactionJournal $journal
* @param string $category
*
* @return TransactionJournal
*/
public function updateCategory(TransactionJournal $journal, string $category): TransactionJournal;
/** /**
* @param TransactionJournal $journal * @param TransactionJournal $journal
@@ -176,4 +183,12 @@ interface JournalRepositoryInterface
* @return TransactionJournal * @return TransactionJournal
*/ */
public function updateSplitJournal(TransactionJournal $journal, array $data): TransactionJournal; public function updateSplitJournal(TransactionJournal $journal, array $data): TransactionJournal;
/**
* @param TransactionJournal $journal
* @param array $tags
*
* @return bool
*/
public function updateTags(TransactionJournal $journal, array $tags): bool;
} }

View File

@@ -100,6 +100,7 @@ trait SupportJournalsTrait
$budget = Budget::find($budgetId); $budget = Budget::find($budgetId);
$journal->budgets()->save($budget); $journal->budgets()->save($budget);
} }
$journal->touch();
} }
/** /**
@@ -112,6 +113,7 @@ trait SupportJournalsTrait
$category = Category::firstOrCreateEncrypted(['name' => $category, 'user_id' => $journal->user_id]); $category = Category::firstOrCreateEncrypted(['name' => $category, 'user_id' => $journal->user_id]);
$journal->categories()->save($category); $journal->categories()->save($category);
} }
$journal->touch();
} }
/** /**

View File

@@ -37,6 +37,7 @@ use Log;
*/ */
trait UpdateJournalsTrait trait UpdateJournalsTrait
{ {
/** /**
* When the user edits a split journal, each line is missing crucial data:. * When the user edits a split journal, each line is missing crucial data:.
* *
@@ -121,47 +122,5 @@ trait UpdateJournalsTrait
$transaction->save(); $transaction->save();
} }
/**
* Update tags.
*
* @param TransactionJournal $journal
* @param array $array
*
* @return bool
*/
protected function updateTags(TransactionJournal $journal, array $array): bool
{
// create tag repository
/** @var TagRepositoryInterface $tagRepository */
$tagRepository = app(TagRepositoryInterface::class);
// find or create all tags:
$tags = [];
$ids = [];
foreach ($array as $name) {
if (strlen(trim($name)) > 0) {
$tag = Tag::firstOrCreateEncrypted(['tag' => $name, 'user_id' => $journal->user_id]);
$tags[] = $tag;
$ids[] = $tag->id;
}
}
// delete all tags connected to journal not in this array:
if (count($ids) > 0) {
DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal->id)->whereNotIn('tag_id', $ids)->delete();
}
// if count is zero, delete them all:
if (0 === count($ids)) {
DB::table('tag_transaction_journal')->where('transaction_journal_id', $journal->id)->delete();
}
// connect each tag to journal (if not yet connected):
/** @var Tag $tag */
foreach ($tags as $tag) {
Log::debug(sprintf('Will try to connect tag #%d to journal #%d.', $tag->id, $journal->id));
$tagRepository->connect($journal, $tag);
}
return true;
}
} }

View File

@@ -730,7 +730,10 @@ return [
'mass_edit_journals' => 'Edit a number of transactions', 'mass_edit_journals' => 'Edit a number of transactions',
'mass_bulk_journals' => 'Bulk edit a number of transactions', 'mass_bulk_journals' => 'Bulk edit a number of transactions',
'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.', 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.', 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
'no_bulk_category' => 'Don\'t update category',
'no_bulk_budget' => 'Don\'t update budget',
'no_bulk_tags' => 'Don\'t update tag(s)',
'bulk_edit' => 'Bulk edit', 'bulk_edit' => 'Bulk edit',
'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.', 'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.',
'no_budget' => 'none', 'no_budget' => 'none',

View File

@@ -5,14 +5,8 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<form method="POST" action="{{ route('transactions.mass.update-bulk') }}" accept-charset="UTF-8" class="form-horizontal" id="destroy"> <form method="POST" action="{{ route('transactions.bulk.update') }}" accept-charset="UTF-8" class="form-horizontal" id="update">
<input name="_token" type="hidden" value="{{ csrf_token() }}"> <input name="_token" type="hidden" value="{{ csrf_token() }}">
{% for journal in journals %}
{% if journal.transaction_count == 2 %}
<input type="hidden" name="journals[]" value="{{ journal.id }}"/>
{% endif %}
{% endfor %}
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="box box-default"> <div class="box box-default">
@@ -38,6 +32,8 @@
</thead> </thead>
<tbody> <tbody>
{% for journal in journals %} {% for journal in journals %}
{% if journal.transaction_count == 2 %}
<input type="hidden" name="journals[]" value="{{ journal.id }}"/>
<tr> <tr>
<td> <td>
<a href="{{ route('transactions.show', [journal.id]) }}"> <a href="{{ route('transactions.show', [journal.id]) }}">
@@ -63,6 +59,7 @@
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>
{% endif %}
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>

View File

@@ -787,7 +787,6 @@ Route::group(
Route::get('edit/bulk/{journalList}', ['uses' => 'MassController@editBulk', 'as' => 'edit-bulk']); Route::get('edit/bulk/{journalList}', ['uses' => 'MassController@editBulk', 'as' => 'edit-bulk']);
Route::get('delete/{journalList}', ['uses' => 'MassController@delete', 'as' => 'delete']); Route::get('delete/{journalList}', ['uses' => 'MassController@delete', 'as' => 'delete']);
Route::post('update', ['uses' => 'MassController@update', 'as' => 'update']); Route::post('update', ['uses' => 'MassController@update', 'as' => 'update']);
Route::post('update/bulk', ['uses' => 'MassController@updateBulk', 'as' => 'update-bulk']);
Route::post('destroy', ['uses' => 'MassController@destroy', 'as' => 'destroy']); Route::post('destroy', ['uses' => 'MassController@destroy', 'as' => 'destroy']);
} }
); );