Skip to content

Commit

Permalink
feat: refactor all components and controllers to glimmer and octane
Browse files Browse the repository at this point in the history
  • Loading branch information
anehx authored and knownasilya committed Oct 20, 2021
1 parent 979cbc5 commit 1dd0739
Show file tree
Hide file tree
Showing 17 changed files with 365 additions and 842 deletions.
14 changes: 14 additions & 0 deletions addon/components/x-toggle-label.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{{#if @show}}
<label
for={{@switchId}}
class="toggle-text toggle-prefix {{this.type}}-label"
...attributes
{{on 'click' this.clickLabel}}
>
{{#if (has-block)}}
{{yield @label}}
{{else}}
{{@label}}
{{/if}}
</label>
{{/if}}
16 changes: 16 additions & 0 deletions addon/components/x-toggle-label.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { action } from '@ember/object';
import Component from '@glimmer/component';

export default class XToggleLabel extends Component {
get type() {
return this.args.value ? 'on' : 'off';
}

@action
clickLabel(e) {
e.stopPropagation();
e.preventDefault();

this.args.sendToggle(this.args.value);
}
}
33 changes: 0 additions & 33 deletions addon/components/x-toggle-label/component.js

This file was deleted.

14 changes: 0 additions & 14 deletions addon/components/x-toggle-label/template.hbs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
onPan=this.handlePan
pointerTypes=(array 'touch' 'mouse')
}}
{{will-destroy this.removeListener}}
>
<input
class='x-toggle'
Expand All @@ -18,7 +19,7 @@
disabled={{@disabled}}
id={{@forId}}
name={{@name}}
{{on 'change' (action @sendToggle value='target.checked')}}
{{on 'change' this.onChange}}
/>

<label for={{this.effectiveForId}}>
Expand All @@ -27,7 +28,7 @@
role='checkbox'
class="x-toggle-btn
{{this.themeClass}}
{{this.variant}}
{{@variant}}
{{@size}}
{{if @disabled ' x-toggle-disabled'}}
"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
import classic from 'ember-classic-decorator';
import { tagName, layout as templateLayout } from '@ember-decorators/component';
import { action, computed } from '@ember/object';
import Component from '@ember/component';
import { action } from '@ember/object';
import Component from '@glimmer/component';
import { next } from '@ember/runloop';
import layout from './template';
import { tracked } from '@glimmer/tracking';

@classic
@templateLayout(layout)
@tagName('')
export default class XToggleSwitch extends Component {
labelDisabled = false;
@tracked labelDisabled = false;

@computed('forId', 'labelDisabled')
get effectiveForId() {
return this.labelDisabled ? null : this.forId;
return this.labelDisabled ? null : this.args.forId;
}

@computed('theme')
get themeClass() {
let theme = this.theme || 'default';
let theme = this.args.theme || 'default';

return `x-toggle-${theme}`;
}

@action
handlePan(touchData) {
if (this.disabled) {
if (this.args.disabled) {
return;
}

const isToggled = touchData.current.distanceX > 0;

this.sendToggle(isToggled);
this.args.sendToggle(isToggled);
this._disableLabelUntilMouseUp();
}

willDestroyElement() {
super.willDestroyElement(...arguments);
@action
onChange(e) {
if (this.args.disabled) {
return;
}

this.args.sendToggle(e.target.checked);
}

@action
removeListener() {
this._removeListener();
}

Expand All @@ -60,14 +62,12 @@ export default class XToggleSwitch extends Component {
}

this._removeListener();
this.set('labelDisabled', false);
this.labelDisabled = false;
});
};

this.setProperties({
labelDisabled: true,
_listener,
});
this.labelDisabled = true;
this._listener = _listener;

document.addEventListener('mouseup', _listener);
}
Expand All @@ -77,7 +77,7 @@ export default class XToggleSwitch extends Component {

if (_listener) {
document.removeEventListener('mouseup', _listener);
this.set('_listener', null);
this._listener = null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
class="x-toggle-component {{if this.focused 'x-toggle-focused'}}"
tabindex={{this.tabindex}}
...attributes
{{did-insert this.setContainer}}
{{on 'focusin' this.handleFocusIn}}
{{on 'focusout' this.handleFocusOut}}
{{on 'keydown' this.spacebarToggle}}
{{on 'keypress' this.spacebarToggle}}
>
{{#if (has-block)}}
{{yield
Expand Down Expand Up @@ -49,34 +50,34 @@
)
}}
{{else}}
{{x-toggle-label
label=this.offLabel
show=this.showLabels
switchId=this.forId
value=false
sendToggle=this.sendToggle
}}
<XToggleLabel
@label={{this.offLabel}}
@show={{this.showLabels}}
@switchId={{this.forId}}
@value={{false}}
@sendToggle={{this.sendToggle}}
/>

{{x-toggle-switch
disabled=this.disabled
forId=this.forId
name=this.name
offLabel=this.offLabel
onLabel=this.onLabel
size=this.size
theme=this.theme
variant=this.variant
toggled=this.toggled
value=this.value
sendToggle=this.sendToggle
}}
<XToggleSwitch
@disabled={{this.disabled}}
@forId={{this.forId}}
@name={{this.name}}
@offLabel={{this.offLabel}}
@onLabel={{this.onLabel}}
@size={{this.size}}
@theme={{this.theme}}
@variant={{this.variant}}
@toggled={{this.toggled}}
@value={{this.value}}
@sendToggle={{this.sendToggle}}
/>

{{x-toggle-label
label=this.onLabel
show=this.showLabels
switchId=this.forId
value=true
sendToggle=this.sendToggle
}}
<XToggleLabel
@label={{this.onLabel}}
@show={{this.showLabels}}
@switchId={{this.forId}}
@value={{true}}
@sendToggle={{this.sendToggle}}
/>
{{/if}}
</div>
104 changes: 104 additions & 0 deletions addon/components/x-toggle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import { action } from '@ember/object';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { getOwner } from '@ember/application';
import { guidFor } from '@ember/object/internals';

function configValue(configName, defaultValue) {
return function (target, name) {
return {
get() {
return (
this.args[name] ||
(configName && this.config?.[configName]) ||
defaultValue
);
},
};
};
}

export default class XToggle extends Component {
@tracked focused = false;

container;
tabindex = '0';

@configValue(null, false) disabled;
@configValue(null, false) value;
@configValue(null, 'default') name;
@configValue('defaultOnLabel', 'On') onLabel;
@configValue('defaultOffLabel', 'Off') offLabel;
@configValue('defaultTheme', 'default') theme;
@configValue('defaultVariant', '') variant;
@configValue('defaultShowLabels', false) showLabels;
@configValue('defaultSize', 'medium') size;

get config() {
return (
getOwner(this).resolveRegistration('config:environment')[
'ember-toggle'
] || {}
);
}

get toggled() {
return this.value;
}

get forId() {
return guidFor(this) + '-x-toggle';
}

toggleSwitch(value) {
let onToggle = this.args.onToggle;
let disabled = this.disabled;

if (!disabled && value !== this.value && typeof onToggle === 'function') {
let name = this.name;

onToggle(value, name);

// The click on input/label will toggle the input unconditionally.
// Input state has to be updated manually to prevent it going out of
// sync in case the action didn't update value.
const checkbox = this.container.querySelector('.x-toggle');
const newValue = this.value;

if (checkbox.checked !== newValue) {
checkbox.checked = newValue;
}
}
}

@action
setContainer(element) {
this.container = element;
}

@action
sendToggle(value) {
this.toggleSwitch(value);
}

@action
spacebarToggle(event) {
// spacebar: 32
if (event.which === 32) {
let value = this.value;

this.sendToggle(!value);
event.preventDefault();
}
}

@action
handleFocusIn() {
this.focused = true;
}

@action
handleFocusOut() {
this.focused = false;
}
}
Loading

0 comments on commit 1dd0739

Please sign in to comment.