Completed
Push — master ( a31174...af3b49 )
by Antonio
10s
created

Renderer.js ➔ ... ➔ ???   B

Complexity

Conditions 7
Paths 7

Size

Total Lines 32
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 0 Features 0
Metric Value
eloc 7
dl 0
loc 32
rs 8
c 5
b 0
f 0
cc 7
nc 7
nop 0
1
define(
2
    [
3
        'flagbit/JsonGenerator/Observer',
4
        'flagbit/JsonGenerator/Renderer/Number',
5
        'flagbit/JsonGenerator/Renderer/Select',
6
        'flagbit/JsonGenerator/Renderer/SelectFromUrl',
7
        'flagbit/JsonGenerator/Renderer/Constraint',
8
        'flagbit/JsonGenerator/Renderer/Default'
9
    ],
10
    function(
11
        JsonGeneratorObserver,
12
        JsonGeneratorRendererNumber,
13
        JsonGeneratorRendererSelect,
14
        JsonGeneratorRendererSelectFromUrl,
15
        JsonGeneratorRendererConstraint,
16
        JsonGeneratorRendererDefault
17
    ) {
18
19
    /**
20
     * @class
21
     * @param {Boolean} $editable
22
     * @param {HTMLElement} $container
23
     */
24
    var JsonGeneratorRenderer = function($editable, $container, $types) {
25
26
        /**
27
         * @public
28
         * @type {JsonGeneratorObserver}
29
         */
30
        this.observer = new JsonGeneratorObserver();
31
32
        var $renderer = null;
33
34
35
        /**
36
         * @public
37
         */
38
        this.render = function($data) {
39
40
            return getRenderer().render($data);
41
        };
42
43
44
        /**
45
         * @public
46
         * @returns {Object}
47
         */
48
        this.read = function() {
49
50
            return getRenderer().read();
51
        };
52
53
54
        /**
55
         * @protected
56
         * @returns {*}
57
         */
58
        var getRenderer = function() {
59
60
            var renderers = {
61
                'select': JsonGeneratorRendererSelect,
62
                'select_from_url': JsonGeneratorRendererSelectFromUrl,
63
                'text': JsonGeneratorRendererDefault,
64
                'number': JsonGeneratorRendererNumber
65
            };
66
67
            if($renderer === null) {
68
                if($container.querySelector('.json-select-generator')) {
69
                    $renderer = new JsonGeneratorRendererSelect($editable, $container);
70
                }
71
                else if($container.querySelector('.json-select_from_url-generator')) {
72
                    $renderer = new JsonGeneratorRendererSelectFromUrl($editable, $container);
73
                }
74
                else if($container.querySelector('.json-number-generator')) {
75
                    $renderer = new JsonGeneratorRendererNumber($editable, $container);
76
                }
77
                else if($container.querySelector('.json-constraint-generator')) {
78
                    $renderer = new JsonGeneratorRendererConstraint($editable, $container);
79
                }
80
                else if($container.querySelector('.json-text-generator')) {
81
                    $renderer = new JsonGeneratorRendererDefault($editable, $container);
82
                }
83
                else {
84
                    $renderer = new renderers[$types[0].type]($editable, $container);
85
                }
86
            }
87
88
            return $renderer;
89
        }.bind(this);
0 ignored issues
show
unused-code introduced by
The call to bind does not seem necessary since the function does not use this. Consider calling it directly.
Loading history...
90
91
92
        /**
93
         * @protected
94
         */
95
        var persist = function() {
96
97
            this.observer.notify('persist');
98
        }.bind(this);
99
100
101
        /**
102
         * @protected
103
         */
104
        var save = function() {
105
106
            this.observer.notify('save');
107
        }.bind(this);
108
109
110
        /**
111
         * @protected
112
         */
113
        var addObserver = function() {
114
115
            getRenderer().observer.watch('update', persist);
116
            getRenderer().observer.watch('update', callDebounce(save));
117
        }.bind(this);
0 ignored issues
show
unused-code introduced by
The call to bind does not seem necessary since the function does not use this. Consider calling it directly.
Loading history...
118
119
120
        /**
121
         * @protected
122
         * @param {Function} $callable
123
         */
124
        var callDebounce = function($callable) {
125
126
            var $debounceTimer = null;
127
128
            return function() {
129
130
                if($debounceTimer) {
131
                    window.clearTimeout($debounceTimer);
132
                }
133
134
                $debounceTimer = window.setTimeout($callable, 300);
135
            }.bind(this)
0 ignored issues
show
unused-code introduced by
The call to bind does not seem necessary since the function does not use this. Consider calling it directly.
Loading history...
136
        }.bind(this);
137
138
139
        addObserver();
140
    };
141
142
    return JsonGeneratorRenderer;
143
});
144