diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 5dcbe252cb..64d1d22701 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -168,41 +168,23 @@ class TagController extends Controller */ public function index(TagRepositoryInterface $repository) { - $title = 'Tags'; - $mainTitleIcon = 'fa-tags'; - $types = ['nothing', 'balancingAct', 'advancePayment']; - $hasTypes = 0; // which types of tag the user actually has. - $counts = []; // how many of each type? - $count = $repository->count(); - // loop each types and get the tags, group them by year. - $collection = []; - foreach ($types as $type) { + // collect tags by year: + /** @var Carbon $start */ + $start = clone(session('first')); + $now = new Carbon; + $clouds = []; + $clouds['no-date'] = $repository->tagCloud(null); + while ($now > $start) { + $year = $now->year; + $clouds[$year] = $repository->tagCloud($year); - /** @var Collection $tags */ - $tags = $repository->getByType($type); - $tags = $tags->sortBy( - function (Tag $tag) { - $date = !is_null($tag->date) ? $tag->date->format('Ymd') : '000000'; - - return strtolower($date . $tag->tag); - } - ); - if ($tags->count() > 0) { - $hasTypes++; - } - $counts[$type] = $tags->count(); - - /** @var Tag $tag */ - foreach ($tags as $tag) { - $year = is_null($tag->date) ? trans('firefly.no_year') : $tag->date->year; - $monthFormatted = is_null($tag->date) ? trans('firefly.no_month') : $tag->date->formatLocalized($this->monthFormat); - - $collection[$type][$year][$monthFormatted][] = $tag; - } + $now->subYear(); } + $count = $repository->count(); - return view('tags.index', compact('title', 'mainTitleIcon', 'counts', 'hasTypes', 'types', 'collection', 'count')); + + return view('tags.index', compact('clouds', 'count')); } /** @@ -274,7 +256,6 @@ class TagController extends Controller return view('tags.show', compact('apiKey', 'tag', 'periods', 'subTitle', 'subTitleIcon', 'journals', 'sum', 'start', 'end', 'moment')); } - /** * @param TagFormRequest $request * @@ -371,4 +352,6 @@ class TagController extends Controller return $collection; } + + } diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index e81201ef0b..01910c3a0f 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -253,11 +253,61 @@ class TagRepository implements TagRepositoryInterface } $collector->setAllAssetAccounts()->setTag($tag); - $sum = $collector->getJournals()->sum('transaction_amount'); + $journals = $collector->getJournals(); + $sum = '0'; + foreach ($journals as $journal) { + $sum = bcadd($sum, app('steam')->positive(strval($journal->transaction_amount))); + } return strval($sum); } + /** + * Generates a tag cloud. + * + * @param int|null $year + * + * @return array + */ + public function tagCloud(?int $year): array + { + $min = null; + $max = 0; + $query = $this->user->tags(); + $return = []; + if (!is_null($year)) { + $start = $year . '-01-01'; + $end = $year . '-12-31'; + $query->where('date', '>=', $start)->where('date', '<=', $end); + } + if (is_null($year)) { + $query->whereNull('date'); + } + $tags = $query->orderBy('id','desc')->get(); + $temporary = []; + foreach ($tags as $tag) { + $amount = floatval($this->sumOfTag($tag, null, null)); + $min = $amount < $min || is_null($min) ? $amount : $min; + $max = $amount > $max ? $amount : $max; + $temporary[] = [ + 'amount' => $amount, + 'tag' => $tag, + ]; + } + /** @var array $entry */ + foreach ($temporary as $entry) { + $scale = $this->cloudScale([12, 20], $entry['amount'], $min, $max); + $tagId = $entry['tag']->id; + $return[$tagId] = [ + 'scale' => $scale, + 'tag' => $entry['tag'], + ]; + } + + return $return; + } + + /** * @param Tag $tag * @param array $data @@ -277,4 +327,21 @@ class TagRepository implements TagRepositoryInterface return $tag; } + /** + * @param array $range + * @param float $amount + * @param float $min + * @param float $max + * + * @return int + */ + private function cloudScale(array $range, float $amount, float $min, float $max): int + { + $amountDiff = $max - $min; + $diff = $range[1] - $range[0]; + $step = $amountDiff / $diff; + $extra = round($amount / $step); + + return intval($range[0] + $extra); + } } diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php index 8cc71547ba..6ed8ec4edd 100644 --- a/app/Repositories/Tag/TagRepositoryInterface.php +++ b/app/Repositories/Tag/TagRepositoryInterface.php @@ -135,6 +135,15 @@ interface TagRepositoryInterface */ public function sumOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): string; + /** + * Generates a tag cloud. + * + * @param int|null $year + * + * @return array + */ + public function tagCloud(?int $year): array; + /** * Update a tag. * diff --git a/public/css/firefly.css b/public/css/firefly.css index 4957efdbfa..b5fd1b056c 100644 --- a/public/css/firefly.css +++ b/public/css/firefly.css @@ -17,6 +17,10 @@ background: url('/images/error.png') no-repeat center center; } +p.tagcloud .label { + line-height:2; +} + .handle { cursor: move; } diff --git a/resources/views/tags/index.twig b/resources/views/tags/index.twig index 6d1531cd7a..7365efda52 100644 --- a/resources/views/tags/index.twig +++ b/resources/views/tags/index.twig @@ -8,54 +8,81 @@ {% if count == 0 %} {% include 'partials.empty' with {what: 'default', type: 'tags',route: route('tags.create')} %} {% else %} -
- {% for type in types %} - {% if counts[type] > 0 %} -
-
-
-

{{ ('tag_title_'~type)|_ }}

-
-
- {% for year,months in collection[type] %} -

{{ year }}

- - {% for month,tags in months %} -
{{ month }}
-

- {% for tag in tags %} - - {% if tag.tagMode == 'nothing' %} - - {% endif %} - {% if tag.tagMode == 'balancingAct' %} - - {% endif %} - {% if tag.tagMode == 'advancePayment' %} - - {% endif %} - {{ tag.tag }} - - {% endfor %} -

- {% endfor %} + {% for period,entries in clouds %} + {% if entries|length > 0 %} +
+
+
+
+

+ {% if period == 'no-date' %}{{ 'without_date'|_ }}{% else %}{{ period }}{% endif %} +

+
+
+

+ {% for tagInfo in entries %} + {{ tagInfo.tag.tag }} {% endfor %} - - -

- +

+
+
{% endif %} - {% endfor %} + {% endfor %} + {# + +
+ + {% for type in types %} + {% if counts[type] > 0 %} +
+
+
+

{{ ('tag_title_'~type)|_ }}

+
+
+ {% for year,months in collection[type] %} +

{{ year }}

+ + {% for month,tags in months %} +
{{ month }}
+

+ {% for tag in tags %} + + {% if tag.tagMode == 'nothing' %} + + {% endif %} + {% if tag.tagMode == 'balancingAct' %} + + {% endif %} + {% if tag.tagMode == 'advancePayment' %} + + {% endif %} + {{ tag.tag }} + + {% endfor %} +

+ {% endfor %} + {% endfor %} + + +
+ +
+
+ {% endif %} + {% endfor %} +
+ #} {% endif %} {% endblock %} diff --git a/resources/views/tags/show.twig b/resources/views/tags/show.twig index 3237078e90..acd4a376ad 100644 --- a/resources/views/tags/show.twig +++ b/resources/views/tags/show.twig @@ -109,14 +109,14 @@ {% if periods.count > 0 %}

- + {{ 'show_all_no_filter'|_ }}

{% else %}

- + {{ 'show_the_current_period_and_overview'|_ }}