-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsetting.js
More file actions
92 lines (84 loc) · 2.42 KB
/
setting.js
File metadata and controls
92 lines (84 loc) · 2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
* Base setting type used by UnderScript settings.
*/
export default class SettingType {
constructor(name) {
const isString = typeof name === 'string';
/**
* @type {String}
*/
this.name = name && isString ? name.trim() : name;
if (!isString || !this.name) throw new Error('Name not provided');
}
/**
* Convert data into processed value. Can be the `default` value, or the encoded string
* @param {*} val Raw data to convert
* @param {*} data Optional data of the setting
* @returns {*} value
*/
value(val, data = undefined) {
throw new Error('Value not implemented');
}
/**
* Encode value to make it safe for storage. By default it stringifies Objects, otherwise it returns the original value.
*
* Override this function to encode differently
* @param {*} value object to encode
* @returns encoded object
*/
encode(value) {
if (typeof value === 'object') return JSON.stringify(value);
return value;
}
/**
* Get default value for setting type.
* @param {*} data Optional data of the setting
* @returns {* | null} default value for setting
*/
default(data = undefined) {
return null;
}
/**
* Create element
* @param {*} value current value to generate document element
* @param {Function} update set the value of the setting. Pass `undefined` to delete the value from storage
* @param {object} data Optional data attached to setting
* @param {Boolean} data.remove true if expects "undefined" on removal
* @param {HTMLElement | JQuery} data.container child container you can manipulate, placed after main setting
* @param {String} data.key setting key, for use in `container`
* @returns {HTMLElement | JQueryElement} element that controls the setting
*/
element(value, update, {
data = undefined,
remove = false,
container,
key = '',
}) {
throw new Error('Element not implemented');
}
/**
* Styles to apply on settings
* @returns {String[]} styles to apply on registration
*/
styles() {
return [];
}
/**
* Controls if element label is prepended or appended
* @returns {Boolean | null} True (default) to prepend label.
*
* False to append label.
*
* Null to not add the label at all.
*/
labelFirst() {
return true;
}
get isBasic() {
// return typeof this.default() === 'string';
return false;
}
toString() {
return this.name;
}
}