UNPKG

2.44 kBJavaScriptView Raw
1/**
2 * React Blessed Update Schemes
3 * =============================
4 *
5 * Applying updates to blessed nodes correctly.
6 */
7import _ from 'lodash';
8
9const RAW_ATTRIBUTES = new Set([
10
11 // Alignment, Orientation & Presentation
12 'align',
13 'valign',
14 'orientation',
15 'shrink',
16 'padding',
17 'tags',
18 'shadow',
19
20 // Font-related
21 'font',
22 'fontBold',
23 'fch',
24 'ch',
25 'bold',
26 'underline',
27
28 // Flags
29 'clickable',
30 'input',
31 'keyable',
32 'hidden',
33 'visible',
34 'scrollable',
35 'draggable',
36 'interactive',
37
38 // Position
39 'left',
40 'right',
41 'top',
42 'bottom',
43 'aleft',
44 'aright',
45 'atop',
46 'abottom',
47
48 // Size
49 'width',
50 'height',
51
52 // Checkbox
53 'checked',
54
55 // Misc
56 'name'
57]);
58
59/**
60 * Updates the given blessed node.
61 *
62 * @param {BlessedNode} node - Node to update.
63 * @param {object} options - Props of the component without children.
64 */
65export default function update(node, options) {
66
67 // TODO: enforce some kind of shallow equality?
68 // TODO: handle position
69
70 const selectQue = []
71
72 for (let key in options) {
73 let value = options[key];
74
75 if (key === 'selected' && node.select)
76 selectQue.push({
77 node,
78 value: (typeof value === 'string' ? +value : value)
79 })
80
81 // Setting label
82 else if (key === 'label')
83 node.setLabel(value);
84
85 // Removing hoverText
86 else if (key === 'hoverText' && !value) node.removeHover()
87
88 // Setting hoverText
89 else if (key === 'hoverText' && value) node.setHover(value)
90
91 // Setting content
92 else if (key === 'content')
93 node.setContent(value);
94
95 // Updating style
96 else if (key === 'style')
97 node.style = _.merge({}, node.style, value);
98
99 // Updating items
100 else if (key === 'items')
101 node.setItems(value);
102
103 // Border edge case
104 else if (key === 'border')
105 node.border = _.merge({}, node.border, value);
106
107 // Textarea value
108 else if (key === 'value' && node.setValue)
109 node.setValue(value);
110
111 // Progress bar
112 else if (key === 'filled' && node.filled !== value)
113 node.setProgress(value);
114
115 // Table / ListTable rows / data
116 else if ((key === 'rows' || key === 'data') && node.setData)
117 node.setData(value);
118
119 else if (key === 'focused' && value && !node[key]) node.focus()
120
121 // Raw attributes
122 else if (RAW_ATTRIBUTES.has(key))
123 node[key] = value;
124 }
125
126 selectQue.forEach(({node, value}) => node.select(value))
127}