Completed
Pull Request — master (#18)
by Matthew
04:19
created

LocatorControllerExtension   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 124
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 60
dl 0
loc 124
ccs 58
cts 58
cp 1
rs 10
c 0
b 0
f 0
wmc 11

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getClientConfig() 0 21 1
A categoriesString() 0 19 3
A onBeforeInit() 0 23 2
A customScript() 0 38 5
1
<?php
2
3
namespace Dynamic\Locator\React\Extensions;
4
5
use Dynamic\SilverStripeGeocoder\GoogleGeocoder;
6
use SilverStripe\Control\Director;
7
use SilverStripe\Core\Config\Config;
8
use SilverStripe\Core\Convert;
9
use SilverStripe\Core\Extension;
10
use SilverStripe\Core\Manifest\ModuleResourceLoader;
11
use SilverStripe\Security\SecurityToken;
12
use SilverStripe\View\Requirements;
13
14
/**
15
 * Class LocatorControllerExtension
16
 * @package Dynamic\Locator\React\Extensions
17
 */
18
class LocatorControllerExtension extends Extension
19
{
20
21
    /**
22
     *
23
     */
24 1
    public function onBeforeInit()
25
    {
26
        // stops script from loading
27 1
        Requirements::block('jquery-locator');
28
29
        // require i18n translation stuff
30 1
        Requirements::javascript('silverstripe/admin: client/dist/js/i18n.js');
31 1
        Requirements::add_i18n_javascript('dynamic/silverstripe-locator-react: client/lang');
0 ignored issues
show
Deprecated Code introduced by
The function SilverStripe\View\Requir...::add_i18n_javascript() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

31
        /** @scrutinizer ignore-deprecated */ Requirements::add_i18n_javascript('dynamic/silverstripe-locator-react: client/lang');
Loading history...
32
33
        // because we need another library when using autocomplete
34 1
        if ($this->owner->Autocomplete) {
35
            // google maps api key
36 1
            $key = Config::inst()->get(GoogleGeocoder::class, 'geocoder_api_key');
37 1
            Requirements::block("https://maps.google.com/maps/api/js?key={$key}");
38 1
            Requirements::javascript("https://maps.google.com/maps/api/js?key={$key}&libraries=places");
39
        }
40
41 1
        Requirements::customScript("
42
            window.ss = window.ss || {};
43 1
            window.ss.config = " . $this->owner->getClientConfig() . ";
44
        ");
45
46 1
        $this->owner->customScript();
47
    }
48
49
    /**
50
     * Generates the custom script for settings
51
     */
52 2
    public function customScript()
53
    {
54 2
        $radii = $this->owner->getShowRadius() ? $this->owner->getRadii() : [];
55 2
        $radiiString = json_encode($radii);
56
57 2
        $categories = $this->owner->getUsedCategories();
58 2
        $categoriesString = $this->owner->categoriesString($categories);
59
60 2
        $unit = $this->owner->Unit ? $this->owner->Unit : 'm';
61
        // otherwise this is 0 or 1
62 2
        $clusters = $this->owner->Clusters ? 'true' : 'false';
63 2
        $autocomplete = $this->owner->Autocomplete ? 'true' : 'false';
64
65 2
        $stylePath = ModuleResourceLoader::singleton()->resolveURL($this->owner->getMapStyle());
66 2
        $markerIconPath = ModuleResourceLoader::singleton()->resolveURL($this->owner->getMarkerIcon());
67
68
        // force to float
69 2
        $defaultLat = (float) $this->owner->DefaultLat;
70 2
        $defaultLng = (float) $this->owner->DefaultLng;
71
72 2
        Requirements::customScript("
73
            window.dynamic_locator = {
74 2
                'radii': {$radiiString},
75 2
                'categories': {$categoriesString},
76 2
                'unit': '{$unit}',
77 2
                'limit': {$this->owner->getLimit()},
78 2
                'clusters': {$clusters},
79 2
                'infoWindowTemplatePath': '{$this->owner->getInfoWindowTemplate()}',
80 2
                'listTemplatePath': '{$this->owner->getListTemplate()}',
81 2
                'mapStylePath': '{$stylePath}',
82 2
                'markerImagePath': '{$markerIconPath}',
83
                'defaultCenter': {
84 2
                    'lat': {$defaultLat},
85 2
                    'lng': {$defaultLng}
86
                },
87 2
                'autocomplete': {$autocomplete}
88
            };
89 2
        ", 'react-locator');
90
    }
91
92
    /**
93
     * @param $categories
94
     *
95
     * @return string
96
     */
97 3
    public function categoriesString($categories)
98
    {
99 3
        $string = '[';
100 3
        for ($i = 0; $i < $categories->count(); $i++) {
101 1
            $cat = $categories[$i];
102 1
            $ID = $cat->ID;
103 1
            $Name = $cat->Name;
104
            $string .= "{
105 1
                'ID': {$ID},
106 1
                'Name': '{$Name}'
107
            }";
108
109 1
            if ($i !== $categories->count() - 1) {
110 1
                $string .= ',';
111
            }
112
        }
113 3
        $string .= ']';
114
115 3
        return $string;
116
    }
117
118
    /**
119
     * @return string
120
     */
121 1
    public function getClientConfig()
122
    {
123 1
        $token = SecurityToken::inst();
124
125
        $clientConfig = [
126 1
            'name' => static::class,
127 1
            'url' => trim($this->owner->Link(), '/'),
128 1
            'baseUrl' => Director::baseURL(),
129 1
            'absoluteBaseUrl' => Director::absoluteBaseURL(),
130 1
            $token->getName() => $token->getValue(),
131
            'sections' => [
132
                [
133
                    'name'=> '',
134
                    'url' => '',
135
                ],
136
            ],
137
        ];
138
139 1
        $this->owner->extend('updateClientConfig', $clientConfig);
140
141 1
        return Convert::raw2json($clientConfig);
142
    }
143
}
144