Completed
Push — master ( 76cf76...26fe42 )
by Alexey
13:19
created

Alert::initFlashWidget()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 8
cts 8
cp 1
rs 9.2
c 0
b 0
f 0
cc 4
eloc 6
nc 3
nop 1
crap 4
1
<?php
2
3
namespace dominus77\sweetalert2;
4
5
use Yii;
6
use yii\bootstrap\Widget;
7
use yii\helpers\Json;
8
use yii\helpers\ArrayHelper;
9
use dominus77\sweetalert2\assets\SweetAlert2Asset;
10
use dominus77\sweetalert2\assets\AnimateCssAsset;
11
12
/**
13
 * Alert widget renders a message from session flash or custom messages.
14
 * @see https://sweetalert2.github.io/
15
 * @package dominus77\sweetalert2
16
 */
17
class Alert extends Widget
18
{
19
    // Modal Type
20
    const TYPE_INFO = 'info';
21
    const TYPE_ERROR = 'error';
22
    const TYPE_SUCCESS = 'success';
23
    const TYPE_WARNING = 'warning';
24
    const TYPE_QUESTION = 'question';
25
26
    // Input Type
27
    const INPUT_TYPE_TEXT = 'text';
28
    const INPUT_TYPE_EMAIL = 'email';
29
    const INPUT_TYPE_PASSWORD = 'password';
30
    const INPUT_TYPE_NUMBER = 'number';
31
    const INPUT_TYPE_RANGE = 'range';
32
    const INPUT_TYPE_TEXTAREA = 'textarea';
33
    const INPUT_TYPE_SELECT = 'select';
34
    const INPUT_TYPE_RADIO = 'radio';
35
    const INPUT_TYPE_CHECKBOX = 'checkbox';
36
    const INPUT_TYPE_FILE = 'file';
37
38
    /**
39
     * All the flash messages stored for the session are displayed and removed from the session
40
     * Defaults to false.
41
     * @var bool
42
     */
43
    public $useSessionFlash = false;
44
45
    /**
46
     * @var string alert callback
47
     */
48
    public $callback = 'function() {}';
49
50
    /**
51 4
     * @inheritdoc
52
     */
53 4
    public function init()
54 4
    {
55 4
        parent::init();
56
        SweetAlert2Asset::register($this->view);
57
    }
58
59
    /**
60 3
     * @param array $steps
61
     */
62 3
    public function initFlashWidget($steps = [])
63 2
    {
64 2
        if (!empty($steps)) {
65 2
            if (isset($steps[0]['text']) && !is_array($steps[0]['text'])) {
66 2
                $this->initSwalQueue($steps);
67 2
            } else {
68 2
                $this->processFlashWidget($steps);
69
            }
70 2
        }
71
    }
72 2
73 2
    /**
74 1
     * @param array $steps
75
     */
76 1
    public function initSwalQueue($steps = [])
77 1
    {
78 1
        $view = $this->getView();
79 1
        $js = "swal.queue(" . Json::encode($steps) . ");";
80
        $this->view->registerJs($js, $view::POS_END);
81
    }
82 1
83 1
    /**
84 2
     * @param string $options
85
     * @param string $callback
86
     */
87
    public function initSwal($options = '', $callback = '')
88 1
    {
89
        $view = $this->getView();
90 3
        $js = "swal({$options}).then({$callback}).catch(swal.noop);";
91
        $this->view->registerJs($js, $view::POS_END);
92
    }
93
94
    /**
95
     * @inheritdoc
96
     */
97 3
    public function run()
98
    {
99 3
        if ($session = $this->getSession()) {
100 2
            $this->initFlashWidget($this->processFlashSession($session));
101
        } else {
102 3
            $this->initSwal($this->getOptions(), $this->callback);
103 1
        }
104 1
    }
105 1
106
    /**
107 1
     * @param $session bool|mixed|\yii\web\Session
108
     * @return array
109 2
     */
110
    public function processFlashSession($session)
111
    {
112
        $flashes = $session->getAllFlashes();
113
        $steps = [];
114
        foreach ($flashes as $type => $data) {
115 1
            $data = (array)$data;
116
            foreach ($data as $message) {
117 1
                array_push($steps, ['type' => $type, 'text' => $message]);
118 1
            }
119 1
            $session->removeFlash($type);
120 1
        }
121
        return $steps;
122
    }
123
124
    /**
125
     * @param array $steps
126 2
     */
127
    public function processFlashWidget($steps = [])
128 2
    {
129 2
        $params = [];
130 2
        if ($params['options'] = $steps[0]['text']) {
131 2
            $params['options']['type'] = isset($params['options']['type']) ? $params['options']['type'] : $steps[0]['type'];
132
            $params['callback'] = isset($steps[1]['text']['callback']) ? $steps[1]['text']['callback'] : $this->callback;
133
            $this->options = $params['options'];
134
            $this->callback = $params['callback'];
135
            $this->initSwal($this->getOptions(), $this->callback);
136 2
        }
137
    }
138 2
139 2
    /**
140
     * Get widget options
141
     *
142
     * @return string
143
     */
144 4
    public function getOptions()
145
    {
146 4
        if (isset($this->options['id']))
147 4
            unset($this->options['id']);
148 1
149 1
        $this->registerAnimateCss();
150
151
        if (ArrayHelper::isIndexed($this->options)) {
152 4
            $str = '';
153
            foreach ($this->options as $value) {
154
                $str .= '"' . $value . '",';
155
            }
156
            return chop($str, ' ,');
157 3
        }
158
        return Json::encode($this->options);
159 3
    }
160
161
    /**
162
     * Add support Animate.css
163
     * @see https://daneden.github.io/animate.css/
164
     */
165
    public function registerAnimateCss()
166
    {
167
        if (isset($this->options['animation']) && $this->options['animation'] === false) {
168
            if (isset($this->options['customClass'])) {
169
                AnimateCssAsset::register($this->view);
170
            }
171
        }
172
    }
173
174
    /**
175
     * @return bool|mixed|\yii\web\Session
176
     */
177
    private function getSession()
178
    {
179
        return $this->useSessionFlash ? Yii::$app->session : false;
180
    }
181
}
182