Skip to content

Commit d61f000

Browse files
committed
nextalarm refactoring
1 parent 7d5f130 commit d61f000

File tree

6 files changed

+582
-127
lines changed

6 files changed

+582
-127
lines changed

dist/kobold-alarm-clock-card.js

Lines changed: 275 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/kobold-alarm-clock-card.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/alarm-controller.ts

Lines changed: 120 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export class AlarmController {
115115
enabled: true,
116116
snooze: true,
117117
time: nextAlarmTime.format('HH:mm'),
118-
dateTime: nextAlarmTime.format('YYYY-MM-DD HH:mm')
118+
date_time: nextAlarmTime.format('YYYY-MM-DD HH:mm')
119119
}
120120
}
121121

@@ -143,26 +143,26 @@ export class AlarmController {
143143
static createNextAlarmNew(alarm: TimeObject, forToday = false): NextAlarmObject {
144144
let alarmDate = dayjs();
145145
// TODO: is forToday named correctly? should it be notToday?
146-
if (!((alarm.time >= alarmDate.format('HH:mm')) && forToday)) {
146+
if (!((alarm.time >= alarmDate.format('HH:mm:ss')) && forToday)) {
147147
alarmDate = alarmDate.add(1, 'day');
148148
}
149149

150150
return {
151151
...alarm,
152152
date: alarmDate.format('YYYY-MM-DD'),
153-
dateTime: `${alarmDate.format('YYYY-MM-DD')} ${alarm.time}`,
153+
date_time: `${alarmDate.format('YYYY-MM-DD')} ${alarm.time}`,
154154
}
155155
}
156156

157157
get nextAlarm(): NextAlarmObject {
158158
// console.log('*** get nextAlarm on contoller');
159159
// const nextAlarm = this.controllersAlarmConfig.nextAlarm;
160-
const nextAlarm = Object.assign({}, this._config.nextAlarm);
160+
const nextAlarm = Object.assign({}, this._config.next_alarm);
161161
// const nextAlarm = this._config.nextAlarm;
162162

163163
if (!nextAlarm) {
164-
// return { enabled: false, time: '07:00', date: '', dateTime: '' };
165-
return Helpers.defaultConfig.nextAlarm;
164+
// return { enabled: false, time: '07:00', date: '', date_time: '' };
165+
return Helpers.defaultConfig.next_alarm;
166166
}
167167
return nextAlarm;
168168
}
@@ -219,7 +219,7 @@ export class AlarmController {
219219

220220
// const newConfig =
221221
// console.log('*** newConfig: ', newConfig);
222-
this._saveConfig('nextAlarm', keyValue);
222+
this._saveConfig('next_alarm', keyValue);
223223
}
224224

225225
get isAlarmEnabled() {
@@ -229,7 +229,7 @@ export class AlarmController {
229229
return true;
230230
}
231231
// return this.controllersAlarmConfig.alarmsEnabled && nextAlarm.enabled;
232-
return this._config.alarmsEnabled && nextAlarm.enabled; //create accessor on this?
232+
return this._config.alarms_enabled && nextAlarm.enabled; //create accessor on this?
233233
}
234234

235235
async _saveConfig(key, value) {
@@ -390,7 +390,7 @@ export class AlarmController {
390390

391391
const configurationWithLastUpdated = {
392392
...actualConfiguration,
393-
lastUpdated: dayjs().format('YYYY-MM-DD HH:mm:ss')
393+
last_updated: dayjs().format('YYYY-MM-DD HH:mm:ss')
394394
}
395395

396396
const alarmClockVariableEntityName = 'sensor.' + this._config.name;
@@ -416,7 +416,7 @@ export class AlarmController {
416416
export class AlarmConfiguration {
417417

418418
public alarmsEnabled: boolean = false;
419-
public nextAlarm: NextAlarmObject = { enabled: false, time: '08:00', date: '', dateTime: '' };
419+
public nextAlarm: NextAlarmObject = { enabled: false, time: '08:00', date: '', date_time: '' };
420420
public mo: TimeObject = { enabled: false, time: '07:00' };
421421
public tu: TimeObject = { enabled: false, time: '07:00' };
422422
public we: TimeObject = { enabled: false, time: '07:00' };
@@ -430,7 +430,7 @@ export class AlarmConfiguration {
430430
public snoozeDurationDefault: TimeObject = { enabled: true, time: '00:15' };
431431
public alarmDurationDefault: TimeObject = { enabled: true, time: '00:30' };
432432
public napDurationDefault: TimeObject = { enabled: true, time: '00:30' };
433-
public lastUpdated: string;
433+
public last_updated: string;
434434

435435
snooze(snoozeTime: string) {
436436
const nextAlarmTime = dayjs(this.nextAlarm.time, 'HH:mm').add(dayjs.duration(Helpers.convertToMinutes(snoozeTime)));
@@ -439,7 +439,7 @@ export class AlarmConfiguration {
439439
enabled: true,
440440
snooze: true,
441441
time: nextAlarmTime.format('HH:mm'),
442-
dateTime: nextAlarmTime.format('YYYY-MM-DD HH:mm')
442+
date_time: nextAlarmTime.format('YYYY-MM-DD HH:mm')
443443
}
444444
}
445445

@@ -459,7 +459,7 @@ export class AlarmConfiguration {
459459
return {
460460
...alarm,
461461
date: alarmDate.format('YYYY-MM-DD'),
462-
dateTime: `${alarmDate.format('YYYY-MM-DD')} ${alarm.time}`,
462+
date_time: `${alarmDate.format('YYYY-MM-DD')} ${alarm.time}`,
463463
}
464464
}
465465
}
@@ -485,6 +485,103 @@ export class Helpers {
485485
return result;
486486
}
487487

488+
// returns object containing all and only changed properties
489+
static deepCompareObj(original, current) {
490+
if (original === current) return null;
491+
492+
// Handle non-object types (including null)
493+
if (
494+
typeof original !== 'object' ||
495+
typeof current !== 'object' ||
496+
original === null ||
497+
current === null
498+
) {
499+
// return {
500+
// oldValue: original,
501+
// newValue: current
502+
// };
503+
return current;
504+
}
505+
506+
// // Handle arrays
507+
// if (Array.isArray(original) && Array.isArray(current)) {
508+
// if (original.length !== current.length) {
509+
// return {
510+
// oldValue: original,
511+
// newValue: current
512+
// };
513+
// }
514+
515+
// const arrayDiffs = {};
516+
// let hasChanges = false;
517+
518+
// for (let i = 0; i < original.length; i++) {
519+
// const diff = deepObjectDiff(original[i], current[i]);
520+
// if (diff !== null) {
521+
// arrayDiffs[i] = diff;
522+
// hasChanges = true;
523+
// }
524+
// }
525+
526+
// return hasChanges ? arrayDiffs : null;
527+
// }
528+
529+
const changes = {};
530+
let hasChanges = false;
531+
532+
// Check for changes in current object
533+
for (const key of Object.keys(current)) {
534+
if (!(key in original)) {
535+
// changes[key] = {
536+
// oldValue: undefined,
537+
// newValue: current[key]
538+
// };
539+
changes[key] = current[key];
540+
hasChanges = true;
541+
continue;
542+
}
543+
544+
const diff = this.deepCompareObj(original[key], current[key]);
545+
if (diff !== null) {
546+
changes[key] = diff;
547+
hasChanges = true;
548+
}
549+
}
550+
551+
// Check for deleted keys
552+
for (const key of Object.keys(original)) {
553+
if (!(key in current)) {
554+
// changes[key] = {
555+
// oldValue: original[key],
556+
// newValue: undefined
557+
// };
558+
changes[key] = undefined;
559+
hasChanges = true;
560+
}
561+
}
562+
563+
return hasChanges ? changes : null;
564+
}
565+
566+
// // identical or not? returns boolean
567+
// static deepCompareBool(a: any, b: any) {
568+
// if (a === b) return true;
569+
// if (typeof a !== typeof b) return false;
570+
// if (!(a instanceof Object && b instanceof Object)) return false;
571+
// for (const x in a) {
572+
// if (!a.hasOwnProperty(x)) continue;
573+
// if (!b.hasOwnProperty(x)) return false;
574+
// if (a[x] === b[x]) continue;
575+
// if (typeof a[x] !== "object") return false;
576+
// if (!this.deepCompare(a[x], b[x])) return false;
577+
// }
578+
// for (const x in b) {
579+
// if (!b.hasOwnProperty(x)) continue;
580+
// if (!a.hasOwnProperty(x)) return false;
581+
// }
582+
// return true;
583+
// }
584+
488585
// static findNested(obj, key, value) {
489586
// if (obj[key] === value) {
490587
// return obj;
@@ -511,18 +608,18 @@ export class Helpers {
511608
return found;
512609
};
513610

514-
static getHA = () => {
611+
static getHa = () => {
515612
let root: any = document.querySelector('home-assistant');
516613
return root;
517614
}
518615

519-
// static getEditor = () => {
520-
// let root: any = this.getHA();
521-
// root = root && root.shadowRoot;
522-
// root = root && root.querySelector('hui-dialog-edit-card');
523-
// // console.log('*** getEditor(); root: ', root);
524-
// return root;
525-
// };
616+
static getEditor = () => {
617+
let root: any = this.getHa();
618+
root = root && root.shadowRoot;
619+
root = root && root.querySelector('hui-dialog-edit-card');
620+
// console.log('*** getEditor(); root: ', root);
621+
return root;
622+
};
526623

527624
// static getConfigContent = () => {
528625
// let root: any = this.getEditor();
@@ -589,7 +686,7 @@ export class Helpers {
589686
// };
590687

591688
static getLovelace = () => {
592-
let root: any = this.getHA();
689+
let root: any = this.getHa();
593690
root = root && root.shadowRoot;
594691
root = root && root.querySelector('home-assistant-main');
595692
root = root && root.shadowRoot;
@@ -623,7 +720,7 @@ export class Helpers {
623720
static defaultConfig = {
624721
name: 'alarm_clock',
625722
alarms_enabled: false,
626-
nextAlarm: { enabled: false, time: '07:00', date: '', dateTime: '' },
723+
next_alarm: { enabled: false, time: '07:00', date: '', date_time: '' },
627724
mo: { enabled: false, time: '07:00:00' },
628725
tu: { enabled: false, time: '07:00:00' },
629726
we: { enabled: false, time: '07:00:00' },

src/alarm-picker.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import dayjs from 'dayjs';
77
import customParseFormat from 'dayjs/plugin/customParseFormat';
88
dayjs.extend(customParseFormat);
99

10-
import type { NextAlarmObject } from './types';
10+
import type { CardConfig, NextAlarmObject } from './types';
1111

1212
@customElement('alarm-picker')
1313
class AlarmPicker extends LitElement {
@@ -17,6 +17,7 @@ class AlarmPicker extends LitElement {
1717
@state() private _displayedValueH: string;
1818
@state() private _displayedValueM: string;
1919

20+
@property({ reflect: false }) config: CardConfig;
2021
@property({ reflect: false }) alarmConfiguration: AlarmConfiguration;
2122
@property({ reflect: false }) alarm: NextAlarmObject;
2223
@property({ reflect: false }) time: string;
@@ -28,7 +29,6 @@ class AlarmPicker extends LitElement {
2829
@query('#alarmPicker', true) _alarmPickerQ: HTMLElement;
2930

3031
render() {
31-
3232
return html`
3333
<div class="alarm" id="alarmPicker">
3434
${this.getAttribute('show-icon') ? html`
@@ -62,7 +62,7 @@ class AlarmPicker extends LitElement {
6262
maxlength="8"
6363
?disabled=${this.disabled}
6464
.value=${!this.alarm ? '' : dayjs(this.alarm.time, 'HH:mm').format(this._alarmTimeFormat())}
65-
?overridden=${this.id === 'alarmpicker' && this.alarmConfiguration.nextAlarm.overridden}
65+
?overridden=${this.id === 'alarmpicker' && this.config?.next_alarm.overridden}
6666
@click=${this._clickHandler}
6767
readonly
6868
>
@@ -189,7 +189,8 @@ class AlarmPicker extends LitElement {
189189
if (this.id === 'alarmpicker') {
190190
if (!this._alarmPickerQ.classList.contains('open')) this.dispatchEvent(new CustomEvent('toggle-logo-visibility'));
191191
const isEnabled = this.alarm.enabled;
192-
const isOverridden = this.alarmConfiguration.nextAlarm.overridden;
192+
// const isOverridden = this.alarmConfiguration.nextAlarm.overridden;
193+
const isOverridden = this.config.next_alarm.overridden;
193194
if (isEnabled && !isOverridden || !isEnabled && !isOverridden) {
194195
// set sliders to current time
195196
timeArray = dayjs(this.time, 'h:mm A').format('HH:mm').split(':');

0 commit comments

Comments
 (0)