Skip to content

Commit d04c0c0

Browse files
author
MHA
committed
feat: lock overlay
1 parent b8fc541 commit d04c0c0

File tree

5 files changed

+172
-77
lines changed

5 files changed

+172
-77
lines changed

dist/slider-button-card.js

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

src/editor.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
} from 'lit-element';
1414
import { HomeAssistant, fireEvent, LovelaceCardEditor, stateIcon, computeDomain } from 'custom-card-helpers';
1515
import { localize } from './localize/localize';
16-
import { ActionButtonConfig, ActionButtonConfigDefault, ActionButtonMode, Domain, IconConfig, IconConfigDefault, SliderBackground, SliderButtonCardConfig, SliderConfig, SliderConfigDefault, SliderDirections } from './types';
16+
import { ActionButtonConfig, ActionButtonConfigDefault, ActionButtonMode, Domain, IconConfig, IconConfigDefault, LockConfigDefault, SliderBackground, SliderButtonCardConfig, SliderConfig, SliderConfigDefault, SliderDirections } from './types';
1717
import { applyPatch, getEnumValues, getSliderDefaultForEntity } from './utils';
1818

1919
@customElement('slider-button-card-editor')
@@ -237,6 +237,33 @@ export class SliderButtonCardEditor extends LitElement implements LovelaceCardEd
237237
></ha-switch>
238238
</ha-formfield>
239239
</div>
240+
<div class="side-by-side">
241+
<ha-formfield .label=${localize('tabs.slider.lock.enabled')}>
242+
<ha-switch
243+
.checked=${this._slider.lock?.enabled}
244+
.configValue=${'slider.lock.enabled'}
245+
@change=${this._valueChanged}
246+
></ha-switch>
247+
</ha-formfield>
248+
${this._slider.lock?.enabled
249+
? html`
250+
<paper-input
251+
pattern="[0-9]+([\\\\.][0-9]+)?"
252+
.label=${localize('tabs.slider.lock.duration')}
253+
.noLabelFloat=${false}
254+
.min=${1}
255+
.max=${10}
256+
.value=${this._slider.lock?.duration || LockConfigDefault.duration}
257+
.step=${0.1}
258+
type="number"
259+
auto-validate
260+
.configValue=${'slider.lock.duration'}
261+
@value-changed=${this._numberChanged}
262+
></paper-input>
263+
`
264+
:
265+
''}
266+
</div>
240267
</div>
241268
</div>
242269
@@ -381,6 +408,15 @@ export class SliderButtonCardEditor extends LitElement implements LovelaceCardEd
381408
this._changeValue(target.configValue, target.checked !== undefined ? target.checked : value);
382409
}
383410

411+
private _numberChanged(ev): void {
412+
ev.stopPropagation();
413+
const target = ev.target;
414+
const value = target.value === '' || isNaN(target.value)
415+
? LockConfigDefault.duration as number
416+
: Number(target.value);
417+
this._changeValue(target.configValue, value);
418+
}
419+
384420
private _changeValue(configValue: string, value: string | boolean | number): void {
385421
if (!this._config || !this.hass) {
386422
return;
@@ -471,7 +507,7 @@ export class SliderButtonCardEditor extends LitElement implements LovelaceCardEd
471507
input.tab-checkbox:checked ~ .tab-content {
472508
max-height: 100vh;
473509
padding: 1em;
474-
}
510+
}
475511
`;
476512
}
477513
}

src/localize/languages/en.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@
2828
"use_brightness": "Use brightness?",
2929
"show_track": "Show track?",
3030
"toggle_on_click": "Act as a toggle (disable sliding)",
31-
"force_square": "Force square?"
31+
"force_square": "Force square?",
32+
"lock": {
33+
"enabled": "Lock enabled?",
34+
"duration": "Lock duration in seconds"
35+
}
3236
},
3337
"action_button": {
3438
"title": "Action button",

src/slider-button-card.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
4242
@query('.button') button;
4343
@query('.action') action;
4444
@query('.slider') slider;
45+
@query('.type-custom-slider-button-card') card;
4546
private changing = false;
4647
private changed = false;
4748
private ctrl!: Controller;
@@ -148,9 +149,9 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
148149
<ha-card
149150
tabindex="0"
150151
.label=${`SliderButton: ${this.config.entity || 'No Entity Defined'}`}
151-
class="${classMap({ 'square': this.config.slider?.force_square || false, 'hide-name': !this.config.show_name, 'hide-state': !this.config.show_state, 'hide-action': !this.config.action_button?.show , 'compact': this.config.compact === true })}"
152+
class="${classMap({ 'square': this.config.slider?.force_square || false, 'hide-name': !this.config.show_name, 'hide-state': !this.config.show_state, 'hide-action': !this.config.action_button?.show , 'compact': this.config.compact === true, 'locked': this.locked })}"
152153
>
153-
<div class="button ${classMap({ off: this.ctrl.isOff, unavailable: this.ctrl.isUnavailable, 'locked': this.locked})}"
154+
<div class="button ${classMap({ off: this.ctrl.isOff, unavailable: this.ctrl.isUnavailable})}"
154155
data-lock-layout="${this.config.slider?.lock?.layout || LockLayout.CORNER}"
155156
style=${styleMap({
156157
'--slider-value': `${this.ctrl.percentage}%`,
@@ -314,13 +315,13 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
314315
private lockCard(): void {
315316
clearTimeout(this.lockTimeout);
316317
this.locked = true;
317-
this.button.classList.add('locked');
318+
this.card.classList.add('locked');
318319
}
319320

320321
private unlockCard(): void {
321322
clearTimeout(this.lockTimeout);
322323
this.locked = false;
323-
this.button.classList.remove('locked');
324+
this.card.classList.remove('locked');
324325
this.lockTimeout = setTimeout(()=> {
325326
this.lockCard();
326327
}, (this.config.slider?.lock?.duration || 5) * 1000)
@@ -419,8 +420,8 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
419420
}
420421

421422
private onPointerDown(event: PointerEvent): void {
422-
/*event.preventDefault();*/
423-
/*event.stopPropagation();*/
423+
event.preventDefault();
424+
event.stopPropagation();
424425
if (this.ctrl.isSliderDisabled) {
425426
return;
426427
}
@@ -474,7 +475,10 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
474475
}
475476
ha-card.compact {
476477
min-height: 3rem !important;
477-
}
478+
}
479+
ha-card.locked {
480+
touch-action: auto;
481+
}
478482
:host {
479483
--slider-bg-default-color: var(--primary-color, rgb(95, 124, 171));
480484
--slider-bg: var(--slider-color);
@@ -519,7 +523,10 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
519523
.button.off {
520524
background-color: var(--btn-bg-color-off);
521525
}
522-
526+
ha-card.locked .button {
527+
touch-action: auto;
528+
}
529+
523530
/* --- ICON --- */
524531
525532
.icon {
@@ -638,14 +645,11 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
638645
background-color: var( --ha-card-background, var(--card-background-color, var(--btn-bg-color-on, black)) );
639646
cursor: ew-resize;
640647
z-index: 0;
641-
/*touch-action: pan-x;*/
642648
}
643649
.slider[data-mode="bottom-top"] {
644-
/*touch-action: pan-y;*/
645-
cursor: ns-resize;
650+
cursor: ns-resize;
646651
}
647652
.slider[data-mode="top-bottom"] {
648-
/*touch-action: pan-y;*/
649653
cursor: ns-resize;
650654
}
651655
.slider:active {
@@ -683,6 +687,15 @@ export class SliderButtonCard extends LitElement implements LovelaceCard {
683687
[data-lock-layout="corner"] .lock-overlay ha-icon {
684688
margin: 0.4rem;
685689
}
690+
.compact [data-lock-layout="corner"] .lock-overlay ha-icon {
691+
margin: 0;
692+
bottom: unset;
693+
top: 1.2rem;
694+
right: 3.2rem;
695+
}
696+
.compact.hide-action [data-lock-layout="corner"] .lock-overlay ha-icon {
697+
right: 1.2rem;
698+
}
686699
[data-lock-layout="overlay"] .lock-overlay ha-icon {
687700
--mdc-icon-size: 30px;
688701
bottom: unset;

src/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export interface SliderConfig {
5555

5656
export interface LockConfig {
5757
enabled?: boolean;
58-
show_icon?: boolean;
5958
layout?: LockLayout;
6059
duration?: number;
6160
}
@@ -113,6 +112,12 @@ export const IconConfigDefault: IconConfig = {
113112
},
114113
};
115114

115+
export const LockConfigDefault: LockConfig = {
116+
enabled: false,
117+
duration: 5,
118+
layout: LockLayout.CORNER,
119+
};
120+
116121
export const SliderConfigDefault: SliderConfig = {
117122
direction: SliderDirections.LEFT_RIGHT,
118123
background: SliderBackground.SOLID,
@@ -121,6 +126,7 @@ export const SliderConfigDefault: SliderConfig = {
121126
show_track: false,
122127
toggle_on_click: false,
123128
force_square: false,
129+
lock: LockConfigDefault,
124130
};
125131

126132
export const SliderConfigDefaultDomain: Map<string, SliderConfig> = new Map([

0 commit comments

Comments
 (0)