summaryrefslogtreecommitdiffstats
path: root/library/Icingadb/Web/Navigation/Action.php
blob: d02f933afbd2763f5deafbb5237f8d871ccf4ad3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php

/* Icinga DB Web | (c) 2021 Icinga GmbH | GPLv2 */

namespace Icinga\Module\Icingadb\Web\Navigation;

use Icinga\Module\Icingadb\Common\Auth;
use Icinga\Module\Icingadb\Common\Macros;
use Icinga\Module\Icingadb\Model\Host;
use Icinga\Module\Icingadb\Model\Service;
use Icinga\Web\Navigation\NavigationItem;
use ipl\Web\Url;

class Action extends NavigationItem
{
    use Auth;
    use Macros;

    /**
     * Whether this action's macros were already resolved
     *
     * @var bool
     */
    protected $resolved = false;

    /**
     * This action's object
     *
     * @var Host|Service
     */
    protected $object;

    /**
     * The filter to use when being asked whether to render this action
     *
     * @var string
     */
    protected $filter;

    /**
     * This action's raw url attribute
     *
     * @var string
     */
    protected $rawUrl;

    /**
     * Set this action's object
     *
     * @param  Host|Service $object
     *
     * @return $this
     */
    public function setObject($object): self
    {
        $this->object = $object;

        return $this;
    }

    /**
     * Get this action's object
     *
     * @return Host|Service
     */
    protected function getObject()
    {
        return $this->object;
    }

    /**
     * Set the filter to use when being asked whether to render this action
     *
     * @param   string  $filter
     *
     * @return  $this
     */
    public function setFilter(string $filter): self
    {
        $this->filter = $filter;

        return $this;
    }

    /**
     * Get the filter to use when being asked whether to render this action
     *
     * @return  ?string
     */
    public function getFilter(): ?string
    {
        return $this->filter;
    }

    /**
     * Set this item's url
     *
     * @param \Icinga\Web\Url|string $url
     *
     * @return $this
     */
    public function setUrl($url): self
    {
        if (is_string($url)) {
            $this->rawUrl = $url;
        } else {
            parent::setUrl($url);
        }

        return $this;
    }

    public function getUrl(): ?\Icinga\Web\Url
    {
        $url = parent::getUrl();
        if (! $this->resolved && $url === null && $this->rawUrl !== null) {
            $this->setUrl(Url::fromPath($this->expandMacros($this->rawUrl, $this->getObject())));
            $this->resolved = true;
            return parent::getUrl();
        } else {
            return $url;
        }
    }

    public function getRender(): bool
    {
        if ($this->render === null) {
            $filter = $this->getFilter();
            $this->render = ! $filter || $this->isMatchedOn($filter, $this->getObject());
        }

        return $this->render;
    }
}