Completed
Push — master ( 82cd1d...312098 )
by Nikolas
163:59 queued 138:22
created

ActionPanelRenderer::makeUrl()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 3
eloc 8
nc 2
nop 1
1
<?php
2
namespace rtens\domin\delivery\web\renderers\dashboard;
3
4
use rtens\domin\ActionRegistry;
5
use rtens\domin\delivery\FieldRegistry;
6
use rtens\domin\delivery\RendererRegistry;
7
use rtens\domin\delivery\web\Element;
8
use rtens\domin\delivery\web\renderers\dashboard\types\ActionPanel;
9
use rtens\domin\delivery\web\renderers\dashboard\types\Panel;
10
use rtens\domin\delivery\web\WebRenderer;
11
use rtens\domin\Parameter;
12
13
class ActionPanelRenderer implements WebRenderer {
14
15
    /** @var RendererRegistry */
16
    private $renderers;
17
18
    /** @var ActionRegistry */
19
    private $actions;
20
21
    private $results = [];
22
23
    /** @var FieldRegistry */
24
    private $fields;
25
26
    /**
27
     * @param RendererRegistry $renderers
28
     * @param ActionRegistry $actions
29
     * @param FieldRegistry $fields
30
     */
31
    public function __construct(RendererRegistry $renderers, ActionRegistry $actions, FieldRegistry $fields) {
32
        $this->renderers = $renderers;
33
        $this->actions = $actions;
34
        $this->fields = $fields;
35
    }
36
37
    /**
38
     * @param mixed $value
39
     * @return bool
40
     */
41
    public function handles($value) {
42
        return $value instanceof ActionPanel;
43
    }
44
45
    /**
46
     * @param ActionPanel $value
47
     * @return mixed
48
     */
49
    public function render($value) {
50
        $heading = $this->actions->getAction($value->getActionId())->caption();
51
        return (string)(new Panel($heading, $this->getContent($value)))
52
            ->setMaxHeight($value->getMaxHeight())
53
            ->setRightHeading([new Element('a', [
54
                'href' => $this->makeUrl($value)
55
            ], [new Element('span', ['class' => 'glyphicon glyphicon-circle-arrow-right'])])])
56
            ->render($this->renderers);
57
    }
58
59
    private function makeUrl(ActionPanel $panel) {
60
        $url = $panel->getActionId();
61
62
        if ($panel->getParameters()) {
63
            $keyValues = [];
64
            foreach ($panel->getParameters() as $key => $value) {
65
                $keyValues[] = urlencode($key) . '=' . urlencode($value);
66
            }
67
            $url .= '?' . implode('&', $keyValues);
68
        }
69
70
        return $url;
71
    }
72
73
    /**
74
     * @param mixed $value
75
     * @return array|Element[]
76
     */
77
    public function headElements($value) {
78
        $content = $this->getContent($value);
79
        $renderer = $this->renderers->getRenderer($content);
80
        if ($renderer instanceof WebRenderer) {
81
            return $renderer->headElements($content);
82
        }
83
        return [];
84
    }
85
86
    private function getContent(ActionPanel $value) {
87
        $key = spl_object_hash($value);
88
89
        if (!isset($this->results[$key])) {
90
            $action = $this->actions->getAction($value->getActionId());
91
            $this->results[$key] = $action->execute($this->inflate($action->parameters(), $value->getParameters()));
92
        }
93
        return $this->results[$key];
94
    }
95
96
    /**
97
     * @param Parameter[] $parameters
98
     * @param mixed[] $values
99
     * @return mixed[]
100
     */
101
    private function inflate($parameters, $values) {
102
        $inflated = [];
103
        foreach ($parameters as $parameter) {
104
            $name = $parameter->getName();
105
            if (isset($values[$name])) {
106
                $inflated[$name] = $this->fields->getField($parameter)->inflate($parameter, $values[$name]);
107
            }
108
        }
109
        return $inflated;
110
    }
111
}