|
10 | 10 | var ms=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; |
11 | 11 | var timerCount = 0; |
12 | 12 | var maxTimers = 64; |
13 | | - var presets = {}; |
14 | | - var sortedPresetOptions = ''; |
| 13 | + var presets = []; |
| 14 | + var sPO = ''; |
15 | 15 | const TIMER_SUNRISE = 255; |
16 | 16 | const TIMER_SUNSET = 254; |
17 | 17 | const TIMER_WEEKDAYS_ALL = 255; |
|
26 | 26 | if (loc) d.Sf.action = getURL('/settings/time'); |
27 | 27 | } |
28 | 28 | function populatePresets(fromls) { |
29 | | - let json = null; |
30 | 29 | if (fromls) { |
31 | 30 | try { |
32 | | - json = JSON.parse(localStorage.getItem("wledP")); |
33 | | - } catch (e) {} |
34 | | - } |
35 | | - if (!json) { |
36 | | - fetch(getURL(`/presets.json`), { |
37 | | - method: 'get' |
38 | | - }) |
39 | | - .then(res => { |
40 | | - if (!res.ok) showToast("Error loading presets.", true); |
41 | | - return res.json(); |
42 | | - }) |
43 | | - .then(json => { |
| 31 | + let json = JSON.parse(localStorage.getItem("wledP")); |
44 | 32 | onPresetsLoaded(json); |
45 | | - }) |
46 | | - .catch((error)=>{ |
47 | | - showToast("Loading presets failed.", true); |
48 | | - }); |
| 33 | + return; |
| 34 | + } catch (e) {} |
49 | 35 | } |
| 36 | + fetch(getURL(`/presets.json`), { |
| 37 | + method: 'get' |
| 38 | + }) |
| 39 | + .then(res => { |
| 40 | + if (!res.ok) showToast("Error loading presets.", true); |
| 41 | + return res.json(); |
| 42 | + }) |
| 43 | + .then(json => { |
| 44 | + onPresetsLoaded(json); |
| 45 | + }) |
| 46 | + .catch((error)=>{ |
| 47 | + showToast("Loading presets failed.", true); |
| 48 | + }); |
50 | 49 | } |
51 | 50 | function onPresetsLoaded(json) { |
52 | | - presets = json; |
53 | | - delete presets["0"]; |
54 | | - bSPO(); |
| 51 | + let sortByName = true; |
| 52 | + presets = Object.entries(json); |
| 53 | + presets.shift(); |
| 54 | + try { |
| 55 | + let cfg = JSON.parse(localStorage.getItem('wledUiCfg')); |
| 56 | + sortByName = !cfg.comp.idsort; |
| 57 | + } catch (e) {} |
| 58 | + if (sortByName) { |
| 59 | + presets.sort((a,b)=>{ |
| 60 | + let nameA = (a[1].n || ("Preset " + a[0])).toLowerCase(); |
| 61 | + let nameB = (b[1].n || ("Preset " + b[0])).toLowerCase(); |
| 62 | + return nameA.localeCompare(nameB); |
| 63 | + }); |
| 64 | + } else { |
| 65 | + presets.sort((a,b)=> parseInt(a[0]) - parseInt(b[0])); |
| 66 | + } |
| 67 | + bSPO(sortByName); |
55 | 68 | pMP(); |
56 | 69 | rTOPO(); |
57 | 70 | rBPO(); |
58 | 71 | } |
59 | | - function bSPO() { // buildSortedPresetOptions |
60 | | - sortedPresetOptions = ''; |
61 | | - for (var p of Object.entries(presets)) { |
| 72 | + function bSPO(sortByName = false) { // build sPO |
| 73 | + sPO = ''; |
| 74 | + for (var p of presets) { |
62 | 75 | var id = p[0]; |
63 | 76 | var name = p[1].n || ("Preset " + id); |
64 | | - sortedPresetOptions += `<option value="${id}">${id}: ${name}</option>`; |
| 77 | + let txt = sortByName ? `${name} : ${id}` : `${id} : ${name}`; |
| 78 | + sPO += `<option value="${id}">${txt}</option>`; |
65 | 79 | } |
66 | 80 | } |
67 | 81 | function sPSV(sel, value, attrName) { // setPresetSelectValue |
|
113 | 127 | var dow = weekdays >> 1; |
114 | 128 | var container = gId("TMT").querySelector("table"); |
115 | 129 | var hourVal = isSpecial ? 0 : hour; |
116 | | - var presetOpts = '<option value="0">Delete Timer</option>' + sortedPresetOptions; |
| 130 | + var presetOpts = '<option value="0">Delete Timer</option>' + sPO; |
117 | 131 |
|
118 | 132 | var weekdayTable = '<table class="tw"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>'; |
119 | 133 | for (j=1;j<8;j++) weekdayTable += `<td><input id="W${i}${j}" type="checkbox" ${(dow>>(j-1))&1?'checked':''}></td>`; |
|
183 | 197 | } |
184 | 198 | } |
185 | 199 | function pMP() { // populateMacroPresets |
186 | | - var presetOpts = '<option value="0">Default Action (0)</option>' + sortedPresetOptions; |
| 200 | + var presetOpts = '<option value="0">Default Action (0)</option>' + sPO; |
187 | 201 | var fields = ['A0','A1','MC','MN']; |
188 | 202 | for (var f of fields) { |
189 | 203 | var inp = gN(f); |
|
205 | 219 | } |
206 | 220 | } |
207 | 221 | function rTOPO() { // refreshTimerPresetOptions |
208 | | - var presetOpts = '<option value="0">Delete Timer</option>' + sortedPresetOptions; |
| 222 | + var presetOpts = '<option value="0">Delete Timer</option>' + sPO; |
209 | 223 | for (var i=0; i<timerCount; i++) { |
210 | 224 | var sel = gId("T"+i); |
211 | 225 | if (!sel) continue; |
|
234 | 248 | } |
235 | 249 | } |
236 | 250 | function rBPO() { // refreshButtonPresetOptions |
237 | | - var presetOpts = '<option value="0">Default Action (0)</option>' + sortedPresetOptions; |
| 251 | + var presetOpts = '<option value="0">Default Action (0)</option>' + sPO; |
238 | 252 | var analogOpts = bAO(); |
239 | 253 | var container = gId("macros"); |
240 | 254 | if (!container) return; |
|
276 | 290 | function addBRow(i,p,l,d,t) { |
277 | 291 | if (t===undefined) t = 0; |
278 | 292 | var b = chrID(i); |
279 | | - var presetOpts = '<option value="0">Default Action (0)</option>' + sortedPresetOptions; |
| 293 | + var presetOpts = '<option value="0">Default Action (0)</option>' + sPO; |
280 | 294 | var typeName = btnTypeName(t); |
281 | 295 | var buttonBlock = document.createElement('div'); |
282 | 296 | buttonBlock.className = 'bb'; |
@@ -395,12 +409,7 @@ <h3>Clock</h3> |
395 | 409 | Countdown Goal:<br> |
396 | 410 | Date: <nowrap>20<input name="CY" class="xs" type="number" min="0" max="99" required>-<input name="CI" class="xs" type="number" min="1" max="12" required>-<input name="CD" class="xs" type="number" min="1" max="31" required></nowrap><br> |
397 | 411 | Time: <nowrap><input name="CH" class="xs" type="number" min="0" max="23" required>:<input name="CM" class="xs" type="number" min="0" max="59" required>:<input name="CS" class="xs" type="number" min="0" max="59" required></nowrap><br> |
398 | | - <h3>Macro presets</h3> |
399 | | - Sort Dropdowns: <input type="radio" id="sortById" name="sortOrder" onchange="updateSort(false)" checked><label for="sortById">by ID</label> <input type="radio" id="sortByName" name="sortOrder" onchange="updateSort(true)"><label for="sortByName">by name</label><br> |
400 | | - <b>Macros have moved!</b><br> |
401 | | - <i>Presets now also can be used as macros to save both JSON and HTTP API commands.<br> |
402 | | - Just enter the preset ID below!</i> |
403 | | - <i>Use 0 for the default action instead of a preset</i><br> |
| 412 | + <h3>Presets</h3> |
404 | 413 | Alexa On/Off Preset: <input name="A0" class="m" type="number" min="0" max="250" required> <input name="A1" class="m" type="number" min="0" max="250" required><br> |
405 | 414 | Countdown-Over Preset: <input name="MC" class="m" type="number" min="0" max="250" required><br> |
406 | 415 | Timed-Light-Over Presets: <input name="MN" class="m" type="number" min="0" max="250" required><br> |
|
0 commit comments