Completed
Pull Request — master (#1728)
by Aristeides
04:08 queued 01:53
created

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

Complexity

Total Complexity 54
Complexity/F 3.86

Size

Lines of Code 155
Function Count 14

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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

4 Functions

Rating   Name   Duplication   Size   Complexity  
B kirkiDependencies.init 0 30 1
B kirkiDependencies.showKirkiControl 0 48 5
C kirkiDependencies.evaluate 0 50 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
			var requirementShow;
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...
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...
Unused Code introduced by
The assignment to variable found seems to be never used. Consider removing it.
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
				found = false;
124
				_.each( value2, function( value ) {
125
					if ( value == value1 ) { // jshint ignore:line
126
						found = true;
127
					}
128
				} );
129
				return found;
130
			} else if ( _.isObject( value2 ) ) {
131
				found = false;
132
				if ( ! _.isUndefined( value2[ value1 ] ) ) {
133
					found = true;
134
				}
135
136
				_.each( value2, function( subValue ) {
137
					if ( value1 === subValue ) {
138
						found = true;
139
					}
140
				} );
141
				return found;
142
			} else if ( _.isString( value2 ) ) {
143
				return value1.indexOf( value2 ) > -1;
144
			}
145
		}
146
		if ( null === result ) {
147
			return true;
148
		}
149
		return result;
150
	}
151
};
152
153
jQuery( document ).ready( function() {
154
	kirkiDependencies.init();
155
} );
156