Test Setup Failed
Push — develop ( e26438...bc23fe )
by Aristeides
01:55
created

modules/field-dependencies/field-dependencies.js   C

Complexity

Total Complexity 54
Complexity/F 3.86

Size

Lines of Code 153
Function Count 14

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 2 Features 0
Metric Value
cc 0
wmc 54
nc 1
mnd 12
bc 36
fnc 14
dl 0
loc 153
rs 6.8539
bpm 2.5714
cpm 3.8571
noi 7
c 2
b 2
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
B kirkiDependencies.init 0 30 1
B kirkiDependencies.showKirkiControl 0 48 5
D kirkiDependencies.evaluate 0 48 26
A $(document).ready 0 3 1

How to fix   Complexity   

Complexity

Complex classes like modules/field-dependencies/field-dependencies.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
var kirkiDependencies = {
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
2
3
	listenTo: {},
4
5
	init: function() {
6
		var self = this;
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
7
8
		wp.customize.control.each( function( control ) {
9
			self.showKirkiControl( control );
10
		} );
11
12
		_.each( self.listenTo, function( slaves, master ) {
13
			_.each( slaves, function( slave ) {
14
				wp.customize( master, function( setting ) {
15
				    var setupControl = function( control ) {
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
16
				        var setActiveState,
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
17
						    isDisplayed;
18
19
						isDisplayed = function() {
20
							return self.showKirkiControl( wp.customize.control( slave ) );
21
						};
22
						setActiveState = function() {
23
							control.active.set( isDisplayed() );
24
						};
25
26
						setActiveState();
27
						setting.bind( setActiveState );
28
						control.active.validate = isDisplayed;
29
				    };
30
				    wp.customize.control( slave, setupControl );
31
				} );
32
			});
33
		});
34
	},
35
36
	/**
37
	 * Should we show the control?
38
	 *
39
	 * @since 3.0.17
40
	 * @param {string|object} control - The control-id or the control object.
41
	 * @returns {bool}
42
	 */
43
	showKirkiControl: function( control ) {
44
		var self = this,
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
45
		    show = true;
46
47
		if ( _.isString( control ) ) {
48
			control = wp.customize.control( control );
0 ignored issues
show
Comprehensibility Best Practice introduced by
This re-assigns to the parameter control. Re-assigning to parameters often makes code less readable, consider introducing a new variable instead.
Loading history...
49
		}
50
51
		// Exit early if control not found or if "required" argument is not defined.
52
		if ( 'undefined' === typeof control || ( control.params && _.isEmpty( control.params.required ) ) ) {
53
			return true;
54
		}
55
56
		// Loop control requirements.
57
		_.each( control.params.required, function( requirement ) {
58
			let requirementShow;
59
60
			// Tweak for using active callbacks with serialized options instead of theme_mods.
61
			if (
62
				control.params && // Check if control.params exists.
63
				control.params.kirkiOptionType &&  // Check if option_type exists.
64
				'option' === control.params.kirkiOptionType &&  // We're using options.
65
				control.params.kirkiOptionName && // Check if option_name exists.
66
				! _.isEmpty( control.params.kirkiOptionName ) && // Check if option_name is not empty.
67
				-1 === requirement.setting.indexOf( control.params.kirkiOptionName + '[' ) // Make sure we don't already have the option_name in there.
68
			) {
69
				requirement.setting = control.params.kirkiOptionName + '[' + requirement.setting + ']';
70
			}
71
72
			// Early exit if setting is not defined.
73
			if ( 'undefined' === typeof wp.customize.control( requirement.setting ) ) {
74
				show = true;
75
				return;
76
			}
77
78
			requirementShow = self.evaluate( requirement.value, wp.customize.control( requirement.setting ).setting._value, requirement.operator );
79
80
			self.listenTo[ requirement.setting ] = self.listenTo[ requirement.setting ] || [];
81
			if ( -1 === self.listenTo[ requirement.setting ].indexOf( control.id ) ) {
82
				self.listenTo[ requirement.setting ].push( control.id );
83
			}
84
85
			if ( ! requirementShow ) {
86
				show = false;
87
			}
88
		} );
89
		return show;
90
	},
91
92
	/**
93
	 * Figure out if the 2 values have the relation we want.
94
	 *
95
	 * @since 3.0.17
96
	 * @param {mixed} value1 - The 1st value.
97
	 * @param {mixed} value2 - The 2nd value.
98
	 * @param {string} operator - The comparison to use.
99
	 * @returns {bool}
100
	 */
101
	evaluate: function( value1, value2, operator ) {
102
		var found  = false,
0 ignored issues
show
Coding Style introduced by
As per coding-style, prefer block-scoped variables using let or const which have better semantics than var.

Since ECMAScript 6, you can create block-scoped vars or constants with the keywords let or const. These variables/constants are only valid in the code block where they have been declared.

Consider the following two pieces of code:

if (true)
 {
    var x = "Hello, Stonehenge!";
}

console.log(x); //prints Hello, Stonehenge! to the console

and

if (true)
 {
    let x = "Hello, Stonehenge!";
}

console.log(x); //ReferenceError: x is not defined

The variable is not defined otuside of its block. This limits bleeding of variables into other contexts.

To know more about this ECMA6 feature, look at the MDN pages on let and const.

Loading history...
103
		    result = null;
104
105
		if ( '===' === operator ) {
106
			result = value1 === value2;
107
		} else if ( '==' === operator || '=' === operator || 'equals' === operator || 'equal' === operator ) {
108
			result = value1 == value2; // jshint ignore:line
109
		} else if ( '!==' === operator ) {
110
			result = value1 !== value2;
111
		} else if ( '!=' === operator || 'not equal' === operator ) {
112
			result = value1 != value2; // jshint ignore:line
113
		} else if ( '>=' === operator || 'greater or equal' === operator || 'equal or greater' === operator ) {
114
			result = value2 >= value1;
115
		} else if ( '<=' === operator || 'smaller or equal' === operator || 'equal or smaller' === operator ) {
116
			result = value2 <= value1;
117
		} else if ( '>' === operator || 'greater' === operator ) {
118
			result = value2 > value1;
119
		} else if ( '<' === operator || 'smaller' === operator ) {
120
			result = value2 < value1;
121
		} else if ( 'contains' === operator || 'in' === operator ) {
122
			if ( _.isArray( value2 ) ) {
123
				_.each( value2, function( value ) {
124
					if ( value == value1 ) { // jshint ignore:line
125
						found = true;
126
					}
127
				} );
128
				return found;
129
			} else if ( _.isObject( value2 ) ) {
130
				if ( ! _.isUndefined( value2[ value1 ] ) ) {
131
					found = true;
132
				}
133
134
				_.each( value2, function( subValue ) {
135
					if ( value1 === subValue ) {
136
						found = true;
137
					}
138
				} );
139
				return found;
140
			} else if ( _.isString( value2 ) ) {
141
				return value1.indexOf( value2 ) > -1;
142
			}
143
		}
144
		if ( null === result ) {
145
			return true;
146
		}
147
		return result;
148
	}
149
};
150
151
jQuery( document ).ready( function() {
152
	kirkiDependencies.init();
153
} );
154