|
63 | 63 | // Figure out our formats. |
64 | 64 | o.fmtTime = o.clockMode === 12 ? 'h:mmtt' : 'HH:mm'; |
65 | 65 | o.fmtTimeEmpty = o.clockMode === 12 ? '12:00am' : '00:00'; |
66 | | - |
| 66 | + |
67 | 67 | var line = $('<div></div>').addClass('schedule-circuit').appendTo(pnl); |
| 68 | + if ($('div.dashOuter').data('controllertype').includes('Nixie')) { |
| 69 | + $('<div></div>').appendTo(line).checkbox({ labelText: 'Disabled', binding: binding + 'disabled', display: 'inline-block' }); |
| 70 | + } |
| 71 | + line = $('<div></div>').addClass('schedule-circuit').appendTo(pnl); |
68 | 72 | $('<input type="hidden" data-datatype="int"></input>').attr('data-bind', 'id').appendTo(line); |
69 | 73 | $('<div></div>').appendTo(line).pickList({ |
70 | 74 | required: true, bindColumn: 0, displayColumn: 1, labelText: 'Circuit', binding: binding + 'circuit', |
|
83 | 87 | items: o.displayTypes, inputAttrs: { style: { width: '6.7rem' } }, labelAttrs: { style: { marginLeft: '.25rem' } } |
84 | 88 | }); |
85 | 89 | } |
86 | | - var line_outer = $('<div></div>').appendTo(pnl); |
87 | | - line = $('<div></div>').addClass('schedule-heatsource').css({display: 'inline-block'}).appendTo(line_outer).hide();$('<div></div>').appendTo(line).pickList({ |
| 90 | + var line_outer = $('<div></div>').appendTo(pnl); |
| 91 | + line = $('<div></div>').addClass('schedule-heatsource').css({ display: 'inline-block' }).appendTo(line_outer).hide(); $('<div></div>').appendTo(line).pickList({ |
88 | 92 | required: true, bindColumn: 0, displayColumn: 1, labelText: 'Heat Source', binding: binding + 'heatSource', |
89 | 93 | columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'Heat Source', style: { whiteSpace: 'nowrap' } }], |
90 | 94 | items: o.heatSources, inputAttrs: { style: { width: '8rem' } }, labelAttrs: { style: { width: '5.75rem', marginLeft: '.25rem' } } |
|
96 | 100 | } |
97 | 101 | else { |
98 | 102 | p.find('div.picValueSpinner[data-bind=heatSetpoint]').show()[0].required(true); |
99 | | - if (evt.newItem.hasCoolSetpoint === true && ($('div.dashOuter').data('controllertype')).includes('center')) |
| 103 | + if (evt.newItem.hasCoolSetpoint === true && $('div.dashOuter').data('controllertype').indexOf('touch') === -1) |
100 | 104 | p.find('div.picValueSpinner[data-bind=coolSetpoint]').show()[0].required(true); |
101 | 105 | else |
102 | 106 | p.find('div.picValueSpinner[data-bind=coolSetpoint]').hide()[0].required(false); |
|
105 | 109 | }); |
106 | 110 | $('<div></div>').appendTo(line).valueSpinner({ canEdit: true, labelText: 'Heat', binding: binding + 'heatSetpoint', min: 0, max: 104, step: 1, maxlength: 5, units: '°' + o.tempUnits.name, labelAttrs: { style: { marginLeft: '1rem', marginRight: '.25rem' } } }); |
107 | 111 | $('<div></div>').appendTo(line).valueSpinner({ canEdit: true, labelText: 'Cool', binding: binding + 'coolSetpoint', min: 0, max: 104, step: 1, maxlength: 5, units: '°' + o.tempUnits.name, labelAttrs: { style: { marginLeft: '1rem', marginRight: '.25rem' } } }).hide(); |
108 | | - if ($('div.dashOuter').data('controllertype').includes('Nixie')){ |
109 | | - $('<div></div>').appendTo(line_outer).checkbox({ labelText: 'Disabled', binding: binding + 'disabled', display: 'inline-block' }); |
110 | | - } |
111 | 112 | $('<hr></hr>').appendTo(pnl); |
112 | | - var inline = $('<div></div>').addClass('inline-line').appendTo(pnl); |
| 113 | + var pnlTime = $('<div></div>').appendTo(pnl).css({ display: 'table-row' }); |
| 114 | + var inline = $('<div></div>').addClass('inline-line').appendTo(pnlTime).css({ display: 'table-cell', width: '100%' }); |
113 | 115 |
|
114 | 116 | line = $('<div></div>').addClass('schedule-time').addClass('start-time').appendTo(inline); |
115 | | - $('<label></label>').appendTo(line).text('Start Time').css({ marginLeft: '.25rem', width: '5.75rem', display: 'inline-block' }); |
| 117 | + $('<label></label>').appendTo(line).text('Start Time').css({ marginLeft: '.25rem', width: '5rem', display: 'inline-block' }); |
116 | 118 | $('<div></div>').appendTo(line).pickList({ |
117 | 119 | required: true, bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'startTimeType', |
118 | 120 | columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'Start Type', style: { whiteSpace: 'nowrap' } }], |
119 | 121 | items: o.scheduleTimeTypes, inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } } |
120 | 122 | }).css({ marginRight: '.25rem' }); |
121 | 123 | $('<div></div>').appendTo(line).timeSpinner({ labelText: '', binding: binding + 'startTime', min: 0, max: 1440, step: 30, fmtMask: o.fmtTime, emptyMask: o.fmtTimeEmpty, inputAttrs: { maxlength: 7 }, labelAttrs: {} }); |
| 124 | + $('<div></div>').appendTo(line).pickList({ |
| 125 | + value: -1, |
| 126 | + bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'startTimeMult', |
| 127 | + columns: [{ binding: 'val', hidden: true, text: 'mult' }, { binding: 'direction', text: 'Offset' }, { binding: 'desc', text: 'Description', style: { whiteSpace: 'nowrap' } }], |
| 128 | + items: [{ val: -1, direction: 'minus', desc: 'Shedule time will start before sunrise/sunset' }, { val: 1, direction: 'plus', desc: 'Shedule time will start after sunrise/sunset' }], |
| 129 | + inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }, style: {} |
| 130 | + }); |
122 | 131 |
|
123 | | - line = $('<div></div>').addClass('schedule-time').addClass('end-time').appendTo(inline); |
124 | | - $('<label></label>').appendTo(line).text('End Time').css({ marginLeft: '.25rem', width: '5.75rem', display: 'inline-block' }); |
| 132 | + var line1 = $('<div></div>').addClass('schedule-time').addClass('timeoffset').appendTo(line); |
| 133 | + $('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'startTimeOffsetHours', min: 0, max: 6, step: 1, units: 'hrs', inputAttrs: { maxlength: 2 }, labelAttrs: { style: { marginLeft: '.25rem', width: '5rem' } }, style: { marginRight: '.25rem' } }); |
| 134 | + $('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'startTimeOffsetMins', min: 0, max: 59, step: 1, units: 'min', inputAttrs: { maxlength: 3 }, labelAttrs: {} }); |
| 135 | + |
| 136 | + line = $('<div></div>').addClass('schedule-time').addClass('end-time').appendTo(inline).css({ marginTop: '3px' }); |
| 137 | + $('<label></label>').appendTo(line).text('End Time').css({ marginLeft: '.25rem', width: '5rem', display: 'inline-block' }); |
125 | 138 | $('<div></div>').appendTo(line).pickList({ |
126 | 139 | required: true, bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'endTimeType', |
127 | 140 | columns: [{ binding: 'val', hidden: true, text: 'Id', style: { whiteSpace: 'nowrap' } }, { binding: 'desc', text: 'End Type', style: { whiteSpace: 'nowrap' } }], |
128 | 141 | items: o.scheduleTimeTypes, inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } } |
129 | 142 | }).css({ marginRight: '.25rem' }); |
130 | 143 | $('<div></div>').appendTo(line).timeSpinner({ labelText: '', binding: binding + 'endTime', min: 0, max: 1440, step: 30, fmtMask: o.fmtTime, emptyMask: o.fmtTimeEmpty, inputAttrs: { maxlength: 7 }, labelAttrs: {} }); |
| 144 | + $('<div></div>').appendTo(line).pickList({ |
| 145 | + value: -1, |
| 146 | + bindColumn: 0, displayColumn: 1, labelText: '', binding: binding + 'endTimeMult', |
| 147 | + columns: [{ binding: 'val', hidden: true, text: 'mult' }, { binding: 'direction', text: 'Offset' }, { binding: 'desc', text: 'Description', style: { whiteSpace: 'nowrap' } }], |
| 148 | + items: [{ val: -1, direction: 'minus', desc: 'Shedule time will end before sunrise/sunset' }, { val: 1, direction: 'plus', desc: 'Shedule time will end after sunrise/sunset' }], |
| 149 | + inputAttrs: { style: { width: '4rem' } }, labelAttrs: { style: { display: 'none' } }, style: {} |
| 150 | + }); |
| 151 | + line1 = $('<div></div>').addClass('schedule-time').addClass('timeoffset').appendTo(line); |
| 152 | + $('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'endTimeOffsetHours', min: 0, max: 6, step: 1, units: 'hrs', inputAttrs: { maxlength: 2 }, labelAttrs: { style: { marginLeft: '.25rem', width: '5rem' } }, style: { marginRight: '.25rem' } }); |
| 153 | + $('<div></div>').appendTo(line1).valueSpinner({ canEdit: true, labelText: '', binding: binding + 'endTimeOffsetMins', min: 0, max: 59, step: 1, units: 'min', inputAttrs: { maxlength: 3 }, labelAttrs: {} }); |
131 | 154 |
|
132 | | - inline = $('<div></div>').addClass('inline-line').appendTo(pnl); |
| 155 | + inline = $('<div></div>').addClass('inline-line').appendTo(pnlTime).css({ display: 'table-cell', paddingRight: '7px' }); |
133 | 156 | $('<div></div>').appendTo(inline).pnlScheduleDays({ singleSelect: false, days: o.scheduleDays, binding: binding + 'scheduleDays' }).css({ paddingLeft: '.25rem' }); |
134 | 157 | line = $('<div></div>').appendTo(inline); |
135 | 158 | $('<div></div>').appendTo(line).dateField({ |
136 | 159 | labelText: 'Schedule Date', binding: binding + 'startDate', canEdit: true, |
137 | 160 | labelAttrs: {}, inputAttrs: { maxlength: 15, style: { width: '7rem' } } |
138 | | - }); |
| 161 | + }).css({ whiteSpace: 'nowrap' }); |
139 | 162 | var btnPnl = $('<div class="picBtnPanel btn-panel"></div>').appendTo(pnl); |
140 | 163 | var btnSave = $('<div id="btnSaveBody"></div>').appendTo(btnPnl).actionButton({ text: 'Save Schedule', icon: '<i class="fas fa-save"></i>' }); |
141 | 164 | el.on('selchanged', 'div.picPickList[data-bind=circuit]', function (evt) { |
|
152 | 175 | el.on('selchanged', 'div.picPickList[data-bind$=TimeType]', function (evt) { |
153 | 176 | var p = $(evt.currentTarget).parents('div.schedule-time:first'); |
154 | 177 | var spin = p.find('div.picValueSpinner[data-bind$=Time]:first'); |
| 178 | + var mult = p.find('div.picPickList[data-bind$=Mult]:first'); |
| 179 | + var off = p.find('div.timeoffset:first'); |
155 | 180 | if (evt.newItem.name !== 'manual') { |
156 | 181 | spin.hide(); |
| 182 | + mult.show(); |
| 183 | + off.show(); |
157 | 184 | spin[0].required(false); |
158 | 185 | } |
159 | 186 | else { |
160 | 187 | spin.show(); |
| 188 | + mult.hide(); |
| 189 | + off.hide(); |
161 | 190 | spin[0].required(true); |
162 | 191 | } |
163 | 192 | }); |
164 | 193 | el.on('selchanged', 'div.picPickList[data-bind=scheduleType]', function (evt) { self._setScheduleType(evt.newItem.val); }); |
165 | 194 | btnSave.on('click', function (e) { |
166 | 195 | var p = $(e.target).parents('div.picAccordian-contents:first'); |
167 | 196 | var v = dataBinder.fromElement(p); |
| 197 | + let st = o.scheduleTimeTypes.find(elem => elem.val === v.startTimeType); |
| 198 | + let et = o.scheduleTimeTypes.find(elem => elem.val === v.endTimeType); |
| 199 | + let ct = $('body').attr('data-controllertype'); |
168 | 200 | if (dataBinder.checkRequired(el, true)) { |
| 201 | + // Ok so lets calculate the startTime offset. |
| 202 | + if (st.name !== 'manual') { |
| 203 | + if (ct !== 'nixie' && st.name === 'sunset' && et.name === 'sunrise') { |
| 204 | + $('<div></div>') |
| 205 | + .appendTo(p.find('div[data-bind$=startTime]')) |
| 206 | + .fieldTip({ message: 'The start time must be less than the end time' }); |
| 207 | + return; |
| 208 | + } |
| 209 | + v.startTimeOffset = v.startTimeMult * ((v.startTimeOffsetHours * 60) + v.startTimeOffsetMins); |
| 210 | + if (Math.abs(v.startTimeOffset) > (6 * 60)) { |
| 211 | + $('<div></div>') |
| 212 | + .appendTo(p.find('div[data-bind$=startTimeOffsetHours]')) |
| 213 | + .fieldTip({ message: 'You may only provide an offset<br/>of 6 hours or less' }); |
| 214 | + return; |
| 215 | + } |
| 216 | + } |
| 217 | + else { |
| 218 | + v.startTimeOffset = 0; |
| 219 | + if (ct !== 'nixie' && et.name === 'manual' && v.startTime > v.endTime) { |
| 220 | + $('<div></div>') |
| 221 | + .appendTo(p.find('div[data-bind$=startTime]')) |
| 222 | + .fieldTip({ message: 'The start time must be less than the end time' }); |
| 223 | + return; |
| 224 | + } |
| 225 | + } |
| 226 | + if (et.name !== 'manual') { |
| 227 | + v.endTimeOffset = v.endTimeMult * ((v.endTimeOffsetHours * 60) + v.endTimeOffsetMins); |
| 228 | + if (Math.abs(v.endTimeOffset) > (6 * 60)) { |
| 229 | + $('<div></div>') |
| 230 | + .appendTo(p.find('div[data-bind$=endTimeOffsetHours]')) |
| 231 | + .fieldTip({ message: 'You may only provide an offset<br/>of 6 hours or less' }); |
| 232 | + return; |
| 233 | + } |
| 234 | + } |
| 235 | + else v.endTimeOffset = 0; |
| 236 | + delete v.endTimeMult; |
| 237 | + delete v.endTimeOffsetHours; |
| 238 | + delete v.endTimeOffsetMins; |
| 239 | + delete v.startTimeMult; |
| 240 | + delete v.startTimeOffsetHours; |
| 241 | + delete v.startTimeOffsetMins; |
169 | 242 | console.log(v); |
170 | 243 | $.putApiService('/config/schedule', v, 'Saving Schedule...', function (data, status, xhr) { |
171 | 244 | console.log({ data: data, status: status, xhr: xhr }); |
|
282 | 355 | if (typeof obj.display === 'undefined') obj.display = 0; |
283 | 356 | if (!obj.isActive || obj.disabled) cols[0].elGlyph().css({ color: 'silver' }); |
284 | 357 | else cols[0].elGlyph().css({ color: '' }); |
| 358 | + // Convert our data for the start/end time offsets. |
| 359 | + var stOffset = Math.abs(obj.startTimeOffset || 0); |
| 360 | + obj.startTimeMult = (obj.startTimeOffset || 0) >= 0 ? 1 : -1; |
| 361 | + obj.startTimeOffsetHours = Math.floor(stOffset / 60); |
| 362 | + obj.startTimeOffsetMins = (stOffset) - (obj.startTimeOffsetHours * 60); |
| 363 | + var etOffset = Math.abs(obj.endTimeOffset || 0); |
| 364 | + obj.endTimeMult = (obj.endTimeOffset || 0) >= 0 ? 1 : -1; |
| 365 | + obj.endTimeOffsetHours = Math.floor(etOffset / 60); |
| 366 | + obj.endTimeOffsetMins = (etOffset) - (obj.endTimeOffsetHours * 60); |
285 | 367 | console.log(obj); |
286 | 368 | dataBinder.bind(el, obj); |
287 | 369 | if (o.scheduleTimeTypes.length <= 1) el.find('div.picPickList[data-bind$=TimeType]').hide()[0].required(false); |
|
0 commit comments