removing groups, fixing deprecations, switching to paper's menu way
BUGS: error on bridge authentication, lightData not updating correctly to reflect the state, unstyled settings menu
This commit is contained in:
parent
dfa5780d0e
commit
adfe7a40d6
21 changed files with 35 additions and 478 deletions
|
|
@ -116,7 +116,6 @@ export default Component.extend({
|
||||||
|
|
||||||
clearBridgePingIntervalHandle(){
|
clearBridgePingIntervalHandle(){
|
||||||
clearInterval(this.get('bridgePingIntervalHandle'));
|
clearInterval(this.get('bridgePingIntervalHandle'));
|
||||||
this.set('bridgePingIntervalHandle', null);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
import Ember from 'ember';
|
|
||||||
|
|
||||||
const {
|
|
||||||
Component,
|
|
||||||
observer,
|
|
||||||
computed,
|
|
||||||
isEmpty,
|
|
||||||
isNone,
|
|
||||||
$
|
|
||||||
} = Ember;
|
|
||||||
|
|
||||||
export default Component.extend({
|
|
||||||
groupName: null,
|
|
||||||
selectedLights: [],
|
|
||||||
|
|
||||||
onIsShowingModalChange: observer('isShowingModal', function(){
|
|
||||||
if(this.get('isShowingModal')){
|
|
||||||
this.setProperties({
|
|
||||||
selectedLights: [],
|
|
||||||
groupName: null
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
saveDisabled: computed('groupName', 'selectedLights.[]', function(){
|
|
||||||
return isNone(this.get('groupName')) || isEmpty(this.get('selectedLights')) || isEmpty(this.get('groupName').trim());
|
|
||||||
}),
|
|
||||||
|
|
||||||
didInsertElement: function() {
|
|
||||||
$(document).keypress((event) => {
|
|
||||||
if(!this.get('saveDisabled') && event.which === 13) {
|
|
||||||
this.send('save');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
close: function(){
|
|
||||||
this.sendAction();
|
|
||||||
},
|
|
||||||
save: function(){
|
|
||||||
let newGroupData = {"name": this.get('groupName'), "lights": this.get('selectedLights')},
|
|
||||||
newGroupsData = this.get('groupsData');
|
|
||||||
|
|
||||||
$.ajax(this.get('apiURL') + '/groups', {
|
|
||||||
data: JSON.stringify(newGroupData),
|
|
||||||
contentType: 'application/json',
|
|
||||||
type: 'POST'
|
|
||||||
});
|
|
||||||
|
|
||||||
// crappy code to redraw the lights
|
|
||||||
newGroupsData['9999'] = newGroupData;
|
|
||||||
|
|
||||||
this.setProperties({
|
|
||||||
updateGroupsData: true,
|
|
||||||
groupsData: newGroupsData
|
|
||||||
});
|
|
||||||
this.sendAction();
|
|
||||||
},
|
|
||||||
clickLight: function(id) {
|
|
||||||
let selectedLights = this.get('selectedLights');
|
|
||||||
|
|
||||||
if(selectedLights.contains(id)){
|
|
||||||
selectedLights.removeObject(id);
|
|
||||||
} else {
|
|
||||||
selectedLights.pushObject(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
{{#if isShowingModal}}
|
|
||||||
{{#modal-dialog close="close" alignment="center" translucentOverlay=true}}
|
|
||||||
|
|
||||||
{{light-group lightsData=lightsData activeLights=selectedLights action="clickLight" apiURL=apiURL noHover=true}}
|
|
||||||
|
|
||||||
{{paper-input label="Group name" value=groupName max="32" max-errortext="The group name cannot exceed 32 characters"}}
|
|
||||||
|
|
||||||
{{#paper-button action="close"}}Close{{/paper-button}}
|
|
||||||
{{#paper-button class="pull-right" action="save" disabled=saveDisabled primary=true}}Save{{/paper-button}}
|
|
||||||
|
|
||||||
{{/modal-dialog}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
import Ember from 'ember';
|
|
||||||
|
|
||||||
const {
|
|
||||||
Component,
|
|
||||||
observer,
|
|
||||||
computed,
|
|
||||||
isEmpty,
|
|
||||||
isNone,
|
|
||||||
} = Ember;
|
|
||||||
|
|
||||||
export default Component.extend({
|
|
||||||
classNames: ['dropdown-menu'],
|
|
||||||
elementId: 'group-list',
|
|
||||||
tagName: null,
|
|
||||||
groupIdSelection: null,
|
|
||||||
|
|
||||||
groupsArrData: computed('groupsData', 'groupIdSelection', function(){
|
|
||||||
let groupsData = this.get('groupsData'), lightsData = this.get('lightsData'), groupsArrData = [], ids = [], groupIdSelection = this.get('groupIdSelection');
|
|
||||||
|
|
||||||
for (let key in lightsData) {
|
|
||||||
if(lightsData.hasOwnProperty(key) && lightsData[key].state.reachable){
|
|
||||||
ids.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
groupsArrData.push({name: 'All', data: {lights: ids, key: '0' }, rowClass: groupIdSelection === '0' ? 'group-row selected-row' : 'group-row', deletable: false});
|
|
||||||
|
|
||||||
for (let key in groupsData) {
|
|
||||||
if (groupsData.hasOwnProperty(key)) {
|
|
||||||
let rowClass = 'group-row';
|
|
||||||
|
|
||||||
if(key === groupIdSelection){
|
|
||||||
rowClass += ' selected-row';
|
|
||||||
}
|
|
||||||
|
|
||||||
groupsArrData.push({name: groupsData[key].name, data: {lights: groupsData[key].lights, key: key}, rowClass: rowClass, deletable: true});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return groupsArrData;
|
|
||||||
}),
|
|
||||||
|
|
||||||
onGroupIdSelectionChanged: observer('groupIdSelection', 'groupsArrData', function(){
|
|
||||||
let groupIdSelection = this.get('groupIdSelection'),
|
|
||||||
lights = [];
|
|
||||||
|
|
||||||
this.get('groupsArrData').some(function(group){
|
|
||||||
if(group.data.key === groupIdSelection){
|
|
||||||
lights = group.data.lights;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.get('storage').set('huegasm.selectedGroup', groupIdSelection);
|
|
||||||
|
|
||||||
if(!isNone(groupIdSelection) && !isEmpty(lights)){
|
|
||||||
this.set('activeLights', lights);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
didInsertElement(){
|
|
||||||
let selectGroup = '0',
|
|
||||||
storageItem = this.get('storage').get('huegasm.selectedGroup');
|
|
||||||
|
|
||||||
if(storageItem){
|
|
||||||
selectGroup = storageItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.set('groupIdSelection', selectGroup);
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
selectGroup(selection){
|
|
||||||
this.set('groupIdSelection', selection);
|
|
||||||
},
|
|
||||||
toggleConfirmDeleteGroupsModal(groupName, groupId){
|
|
||||||
this.setProperties({
|
|
||||||
deleteGroupName: groupName,
|
|
||||||
deleteGroupId: groupId
|
|
||||||
});
|
|
||||||
this.toggleProperty('isShowingConfirmDeleteModal');
|
|
||||||
},
|
|
||||||
toggleAddGroupsModal(){
|
|
||||||
this.toggleProperty('isShowingAddGroupsModal');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
import Ember from 'ember';
|
|
||||||
|
|
||||||
const {
|
|
||||||
Component,
|
|
||||||
$
|
|
||||||
} = Ember;
|
|
||||||
|
|
||||||
export default Component.extend({
|
|
||||||
actions: {
|
|
||||||
close: function(){
|
|
||||||
this.sendAction();
|
|
||||||
},
|
|
||||||
delete: function(){
|
|
||||||
let groupId = this.get('groupId');
|
|
||||||
|
|
||||||
$.ajax(this.get('apiURL') + '/groups/' + groupId, {
|
|
||||||
contentType: 'application/json',
|
|
||||||
type: 'DELETE'
|
|
||||||
});
|
|
||||||
|
|
||||||
let groupsData = this.get('groupsData'), newGroupsData = [];
|
|
||||||
for (let key in groupsData) {
|
|
||||||
if(groupsData.hasOwnProperty(key) && groupsData[key].name !== this.get('groupName') ){
|
|
||||||
newGroupsData[key] = groupsData[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(groupId === this.get('groupIdSelection')){
|
|
||||||
this.set('groupIdSelection', '0');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setProperties({
|
|
||||||
updateGroupsData: true,
|
|
||||||
groupsData: newGroupsData
|
|
||||||
});
|
|
||||||
|
|
||||||
this.sendAction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
{{#if isShowingModal}}
|
|
||||||
{{#modal-dialog close="close" alignment="center" translucentOverlay=true}}
|
|
||||||
|
|
||||||
<p>Are you sure you want to delete group "{{groupName}}"?</p>
|
|
||||||
|
|
||||||
{{#paper-button action="close"}}Close{{/paper-button}}
|
|
||||||
{{#paper-button class="pull-right" action="delete" primary=true}}Delete{{/paper-button}}
|
|
||||||
|
|
||||||
{{/modal-dialog}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
{{#paper-list}}
|
|
||||||
{{#paper-item class="new-group-row"}}
|
|
||||||
<div class="new-group" {{action "toggleAddGroupsModal"}}>{{paper-icon icon="group-add"}} Add a new group</div>
|
|
||||||
{{/paper-item}}
|
|
||||||
|
|
||||||
{{#each groupsArrData as |group|}}
|
|
||||||
{{#paper-item class=group.rowClass}}
|
|
||||||
<div class="group-select" {{action "selectGroup" group.data.key}}>{{group.name}}</div> {{#if group.deletable}}<span data-toggle="tooltip" data-placement="top auto" title="Remove Group" class="bootstrap-tooltip remove-button pointer" {{action "toggleConfirmDeleteGroupsModal" group.name group.data.key}}>{{paper-icon icon="close"}}</span>{{/if}}
|
|
||||||
{{/paper-item}}
|
|
||||||
{{/each}}
|
|
||||||
{{/paper-list}}
|
|
||||||
|
|
||||||
{{groups-list/add-group-modal lightsData=lightsData groupsData=groupsData isShowingModal=isShowingAddGroupsModal apiURL=apiURL updateGroupsData=updateGroupsData action="toggleAddGroupsModal"}}
|
|
||||||
|
|
||||||
{{groups-list/delete-group-modal groupName=deleteGroupName groupId=deleteGroupId groupsData=groupsData isShowingModal=isShowingConfirmDeleteModal apiURL=apiURL updateGroupsData=updateGroupsData groupIdSelection=groupIdSelection action="toggleConfirmDeleteGroupsModal"}}
|
|
||||||
|
|
@ -2,7 +2,6 @@ import Ember from 'ember';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
Component,
|
Component,
|
||||||
observer,
|
|
||||||
computed,
|
computed,
|
||||||
isEmpty,
|
isEmpty,
|
||||||
isNone,
|
isNone,
|
||||||
|
|
@ -16,8 +15,6 @@ export default Component.extend({
|
||||||
bridgeIp: null,
|
bridgeIp: null,
|
||||||
manualBridgeIp: null,
|
manualBridgeIp: null,
|
||||||
bridgeUsername: null,
|
bridgeUsername: null,
|
||||||
updateGroupsData: true,
|
|
||||||
groupsData: null,
|
|
||||||
lightsData: null,
|
lightsData: null,
|
||||||
activeLights: [],
|
activeLights: [],
|
||||||
tabList: ["Lights", "Music"],
|
tabList: ["Lights", "Music"],
|
||||||
|
|
@ -28,7 +25,7 @@ export default Component.extend({
|
||||||
musicTabSelected: computed.equal('selectedTab', 1),
|
musicTabSelected: computed.equal('selectedTab', 1),
|
||||||
|
|
||||||
dimmerOnClass: computed('dimmerOn', function(){
|
dimmerOnClass: computed('dimmerOn', function(){
|
||||||
return this.get('dimmerOn') ? 'dimmerOn' : null;
|
return this.get('dimmerOn') ? 'dimmerOn md-menu-origin' : 'md-menu-origin';
|
||||||
}),
|
}),
|
||||||
|
|
||||||
ready: computed('lightsData', 'trial', function() {
|
ready: computed('lightsData', 'trial', function() {
|
||||||
|
|
@ -76,7 +73,6 @@ export default Component.extend({
|
||||||
this._super();
|
this._super();
|
||||||
|
|
||||||
if(!this.get('trial')) {
|
if(!this.get('trial')) {
|
||||||
this.doUpdateGroupsData();
|
|
||||||
this.updateLightData();
|
this.updateLightData();
|
||||||
this.set('lightsDataIntervalHandle', setInterval(this.updateLightData.bind(this), 2000));
|
this.set('lightsDataIntervalHandle', setInterval(this.updateLightData.bind(this), 2000));
|
||||||
}
|
}
|
||||||
|
|
@ -86,22 +82,6 @@ export default Component.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onUpdateGroupsDataChange: observer('updateGroupsData', function(){
|
|
||||||
if(this.get('updateGroupsData')){
|
|
||||||
setTimeout(()=>{ this.doUpdateGroupsData(); }, 1000);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
doUpdateGroupsData(){
|
|
||||||
$.get(this.get('apiURL') + '/groups', (result, status)=>{
|
|
||||||
if (status === 'success' ) {
|
|
||||||
this.set('groupsData', result);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.toggleProperty('updateGroupsData');
|
|
||||||
},
|
|
||||||
|
|
||||||
updateLightData(){
|
updateLightData(){
|
||||||
let fail = ()=>{
|
let fail = ()=>{
|
||||||
clearInterval(this.get('lightsDataIntervalHandle'));
|
clearInterval(this.get('lightsDataIntervalHandle'));
|
||||||
|
|
@ -155,7 +135,7 @@ export default Component.extend({
|
||||||
{
|
{
|
||||||
element: '#music-tab',
|
element: '#music-tab',
|
||||||
intro: 'This is the music player. You\'ll use this to play music and synchronize it with your active lights.<br><br>' +
|
intro: 'This is the music player. You\'ll use this to play music and synchronize it with your active lights.<br><br>' +
|
||||||
'<i><b>TIP</b>: Control which lights are active through the <b>Lights</b> tab or through the <b>Groups</b> menu dropdown.</i>'
|
'<i><b>TIP</b>: Control which lights are active through the <b>Lights</b> tab.</i>'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
element: '#playlist',
|
element: '#playlist',
|
||||||
|
|
@ -196,11 +176,6 @@ export default Component.extend({
|
||||||
intro: 'These icons represent the hue lights in your system. Active lights will be controlled by the application while the inactive lights will have a red X over them and will not be controlled.<br>' +
|
intro: 'These icons represent the hue lights in your system. Active lights will be controlled by the application while the inactive lights will have a red X over them and will not be controlled.<br>' +
|
||||||
'You may toggle a light\'s state by clicking on it.'
|
'You may toggle a light\'s state by clicking on it.'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
element: $('.settings-item')[0],
|
|
||||||
intro: 'The Groups menu allows for saving and quickly selecting groups of lights.',
|
|
||||||
position: 'left'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
element: $('.settings-item')[1],
|
element: $('.settings-item')[1],
|
||||||
intro: 'A few miscellaneous settings can be found here.<br><br>' +
|
intro: 'A few miscellaneous settings can be found here.<br><br>' +
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,27 @@
|
||||||
{{#if ready}}
|
{{#if ready}}
|
||||||
<div class="row navigation">
|
<div class="row navigation">
|
||||||
<div class="col-sm-4 col-sm-offset-3 col-xs-8">
|
<div class="col-sm-6 col-sm-offset-3 col-xs-10">
|
||||||
{{#each tabData as |tab|}}
|
{{#each tabData as |tab|}}
|
||||||
<span class="navigation-item pointer {{if tab.selected "active"}} text-uppercase" {{action "changeTab" tab.name}}>{{tab.name}}</span>
|
<span class="navigation-item pointer {{if tab.selected "active"}} text-uppercase" {{action "changeTab" tab.name}}>{{tab.name}}</span>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
|
<div id="settings" class="col-xs-2">
|
||||||
<div id="settings" class="col-xs-4">
|
|
||||||
<div class="settings-item">
|
<div class="settings-item">
|
||||||
<span data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{paper-icon icon="group" class=dimmerOnClass}}Groups <span class="caret"></span>
|
{{#paper-menu as |menu|}}
|
||||||
</span>
|
{{#paper-button target=menu action="toggleMenu" icon-button=true}}
|
||||||
|
{{paper-icon "settings" class=dimmerOnClass}}
|
||||||
{{groups-list lightsData=lightsData groupsData=groupsData activeLights=activeLights apiURL=apiURL updateGroupsData=updateGroupsData groupControlDisplayed=groupControlDisplayed storage=storage}}
|
{{/paper-button}}
|
||||||
</div>
|
{{else}}
|
||||||
|
{{#paper-menu-item action="clearBridge"}}
|
||||||
<div class="settings-item">
|
<span class="md-menu-align-target">Switch bridge</span>
|
||||||
<span data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" id="settings-itemSettings">
|
{{/paper-menu-item}}
|
||||||
{{paper-icon icon="settings" class=dimmerOnClass}}Settings <span class="caret"></span>
|
{{#paper-menu-item action="startIntro"}}
|
||||||
</span>
|
<span>Restart tutorial</span>
|
||||||
|
{{/paper-menu-item}}
|
||||||
<ul id="app-settings" class="dropdown-menu">
|
{{#paper-menu-item action="clearAllSettings"}}
|
||||||
<li {{action "clearBridge"}}><a href="#">Switch bridge</a></li>
|
<span>Reset settings</span>
|
||||||
<li {{action "startIntro"}}><a href="#">Restart tutorial</a></li>
|
{{/paper-menu-item}}
|
||||||
<li {{action "clearAllSettings"}}><a href="#">Reset settings</a></li>
|
{{/paper-menu}}
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ export default Component.extend({
|
||||||
|
|
||||||
let activeClass = 'light-active';
|
let activeClass = 'light-active';
|
||||||
|
|
||||||
if(!this.get('activeLights').contains(key)){
|
if(!this.get('activeLights').includes(key)){
|
||||||
activeClass = 'light-inactive';
|
activeClass = 'light-inactive';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ export default Component.extend({
|
||||||
|
|
||||||
didInsertElement() {
|
didInsertElement() {
|
||||||
$(document).click((event)=>{
|
$(document).click((event)=>{
|
||||||
if(this.get('colorPickerDisplayed') && !event.target.classList.contains('color') && !$(event.target).closest('.color-picker, #color-row').length) {
|
if(this.get('colorPickerDisplayed') && !event.target.classList.includes('color') && !$(event.target).closest('.color-picker, #color-row').length) {
|
||||||
this.toggleProperty('colorPickerDisplayed');
|
this.toggleProperty('colorPickerDisplayed');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -125,11 +125,11 @@ export default Component.extend(helperMixin, visualizerMixin, {
|
||||||
for(let i=0; i < iterations; i++){
|
for(let i=0; i < iterations; i++){
|
||||||
let l = activeLights[Math.floor(Math.random()*activeLights.length)];
|
let l = activeLights[Math.floor(Math.random()*activeLights.length)];
|
||||||
|
|
||||||
if(!lights.contains(l) && !workedLights.contains(l)){
|
if(!lights.includes(l) && !workedLights.includes(l)){
|
||||||
lights.push(l);
|
lights.push(l);
|
||||||
workedLights.push(l);
|
workedLights.push(l);
|
||||||
} else if(justOneLight && workedLights.length !== activeLights.length){ // work a light if we only need one
|
} else if(justOneLight && workedLights.length !== activeLights.length){ // work a light if we only need one
|
||||||
while(workedLights.contains(l)){
|
while(workedLights.includes(l)){
|
||||||
l = activeLights[Math.floor(Math.random()*activeLights.length)];
|
l = activeLights[Math.floor(Math.random()*activeLights.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -716,7 +716,7 @@ export default Component.extend(helperMixin, visualizerMixin, {
|
||||||
// we're going to assume that the song URL is the id
|
// we're going to assume that the song URL is the id
|
||||||
do {
|
do {
|
||||||
nextSong = Math.floor(Math.random() * playQueue.length);
|
nextSong = Math.floor(Math.random() * playQueue.length);
|
||||||
} while(shufflePlayed.contains(playQueue[nextSong].url));
|
} while(shufflePlayed.includes(playQueue[nextSong].url));
|
||||||
|
|
||||||
shufflePlayed.pushObject(playQueue[nextSong].url);
|
shufflePlayed.pushObject(playQueue[nextSong].url);
|
||||||
} else if(nextSong > playQueue.length-1){
|
} else if(nextSong > playQueue.length-1){
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
@import 'ember-notify';
|
@import 'ember-notify';
|
||||||
@import 'fancy-speaker';
|
@import 'fancy-speaker';
|
||||||
@import 'introjs';
|
@import 'introjs';
|
||||||
@import 'group-controls';
|
|
||||||
@import 'hue-controls';
|
@import 'hue-controls';
|
||||||
@import 'huegasm-variables';
|
@import 'huegasm-variables';
|
||||||
@import 'light-group';
|
@import 'light-group';
|
||||||
|
|
@ -69,7 +68,7 @@ body, button {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-item .settings::before, .settings-item .group::before {
|
.settings-item .settings::before {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
transition: 0.1s all ease-in-out;
|
transition: 0.1s all ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
@ -118,4 +117,4 @@ div.ember-modal-dialog {
|
||||||
|
|
||||||
::-webkit-scrollbar-track {
|
::-webkit-scrollbar-track {
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
.group-row {
|
|
||||||
transition: 0.1s all ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-row.selected-row {
|
|
||||||
background-color: #7F7F7F !important;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-row:hover {
|
|
||||||
background-color: #DEDEDE;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-row.selected-row .group-select {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-select {
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 10px 0 10px 10px;
|
|
||||||
width: 70%;
|
|
||||||
font-family: 'Open Sans', sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-group {
|
|
||||||
font-size: 18px;
|
|
||||||
min-height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
padding: 10px 0 10px 10px;
|
|
||||||
margin: 0;
|
|
||||||
.group-add {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-group-row{
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-group-row:hover {
|
|
||||||
background-color: darken(white, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-row:hover * .close {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.group-row:hover * .close {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-row * .close {
|
|
||||||
color: white !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-row.group-row * .close:hover {
|
|
||||||
color: darken(white, 20%) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.close:hover {
|
|
||||||
color: darken(#333333, 5%) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.close:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.close {
|
|
||||||
font-size: 18px !important;
|
|
||||||
color: rgb(51, 51, 51);
|
|
||||||
display: none;
|
|
||||||
opacity: 1;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +1,3 @@
|
||||||
#app-settings {
|
|
||||||
position: absolute;
|
|
||||||
background: white;
|
|
||||||
box-shadow: 5px 10px 15px 5px rgba(0, 0, 0, 0.3);
|
|
||||||
width: 175px;
|
|
||||||
left: -85px;
|
|
||||||
top: 20px;
|
|
||||||
border: none;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
#lights-tab {
|
#lights-tab {
|
||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
}
|
}
|
||||||
|
|
@ -38,7 +27,7 @@
|
||||||
|
|
||||||
.navigation {
|
.navigation {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 30px 0;
|
padding: 30px 0 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navigation-item {
|
.navigation-item {
|
||||||
|
|
@ -85,4 +74,4 @@
|
||||||
left: 18px;
|
left: 18px;
|
||||||
top: 13px;
|
top: 13px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,3 @@
|
||||||
#group-list {
|
|
||||||
box-shadow: 5px 10px 15px 5px rgba(0, 0, 0, 0.3);
|
|
||||||
border-radius: 0 0 5px 5px;
|
|
||||||
width: 300px;
|
|
||||||
top: 20px;
|
|
||||||
left: -210px;
|
|
||||||
position: absolute;
|
|
||||||
background-color: white;
|
|
||||||
max-height: 400px;
|
|
||||||
overflow: auto;
|
|
||||||
text-align: left;
|
|
||||||
padding: 0;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.light-group {
|
.light-group {
|
||||||
margin: 0 auto 0 auto;
|
margin: 0 auto 0 auto;
|
||||||
.tooltip.top {
|
.tooltip.top {
|
||||||
|
|
@ -70,4 +55,4 @@
|
||||||
|
|
||||||
.remove-button {
|
.remove-button {
|
||||||
margin: 10px 0 10px 60px;
|
margin: 10px 0 10px 60px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,6 @@ md-progress-linear {
|
||||||
|
|
||||||
.settings-item span:hover {
|
.settings-item span:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
md-icon.group {
|
|
||||||
color: black !important;
|
|
||||||
}
|
|
||||||
md-icon.settings {
|
md-icon.settings {
|
||||||
color: black !important;
|
color: black !important;
|
||||||
}
|
}
|
||||||
|
|
@ -98,4 +95,4 @@ md-switch.md-default-theme.md-checked .md-bar {
|
||||||
|
|
||||||
md-switch.md-default-theme.md-checked .md-thumb {
|
md-switch.md-default-theme.md-checked .md-thumb {
|
||||||
background-color: $secondaryThemeColor;
|
background-color: $secondaryThemeColor;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
import { moduleForComponent, test } from 'ember-qunit';
|
|
||||||
import hbs from 'htmlbars-inline-precompile';
|
|
||||||
|
|
||||||
moduleForComponent('add-group-modal', 'Integration | Component | add group modal', {
|
|
||||||
integration: true
|
|
||||||
});
|
|
||||||
|
|
||||||
test('it renders', function(assert) {
|
|
||||||
assert.expect(2);
|
|
||||||
|
|
||||||
// Set any properties with this.set('myProperty', 'value');
|
|
||||||
// Handle any actions with this.on('myAction', function(val) { ... });
|
|
||||||
|
|
||||||
this.render(hbs`{{add-group-modal}}`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), '');
|
|
||||||
|
|
||||||
// Template block usage:
|
|
||||||
this.render(hbs`
|
|
||||||
{{#add-group-modal}}
|
|
||||||
template block text
|
|
||||||
{{/add-group-modal}}
|
|
||||||
`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), 'template block text');
|
|
||||||
});
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
import { moduleForComponent, test } from 'ember-qunit';
|
|
||||||
import hbs from 'htmlbars-inline-precompile';
|
|
||||||
|
|
||||||
moduleForComponent('delete-group-modal', 'Integration | Component | delete group modal', {
|
|
||||||
integration: true
|
|
||||||
});
|
|
||||||
|
|
||||||
test('it renders', function(assert) {
|
|
||||||
assert.expect(2);
|
|
||||||
|
|
||||||
// Set any properties with this.set('myProperty', 'value');
|
|
||||||
// Handle any actions with this.on('myAction', function(val) { ... });
|
|
||||||
|
|
||||||
this.render(hbs`{{delete-group-modal}}`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), '');
|
|
||||||
|
|
||||||
// Template block usage:
|
|
||||||
this.render(hbs`
|
|
||||||
{{#delete-group-modal}}
|
|
||||||
template block text
|
|
||||||
{{/delete-group-modal}}
|
|
||||||
`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), 'template block text');
|
|
||||||
});
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
import { moduleForComponent, test } from 'ember-qunit';
|
|
||||||
import hbs from 'htmlbars-inline-precompile';
|
|
||||||
|
|
||||||
moduleForComponent('groups-list', 'Integration | Component | groups list', {
|
|
||||||
integration: true
|
|
||||||
});
|
|
||||||
|
|
||||||
test('it renders', function(assert) {
|
|
||||||
assert.expect(2);
|
|
||||||
|
|
||||||
// Set any properties with this.set('myProperty', 'value');
|
|
||||||
// Handle any actions with this.on('myAction', function(val) { ... });
|
|
||||||
|
|
||||||
this.render(hbs`{{groups-list}}`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), '');
|
|
||||||
|
|
||||||
// Template block usage:
|
|
||||||
this.render(hbs`
|
|
||||||
{{#groups-list}}
|
|
||||||
template block text
|
|
||||||
{{/groups-list}}
|
|
||||||
`);
|
|
||||||
|
|
||||||
assert.equal(this.$().text().trim(), 'template block text');
|
|
||||||
});
|
|
||||||
|
|
@ -54,14 +54,14 @@ ansi-escapes@^1.1.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
|
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
|
||||||
|
|
||||||
ansi-regex@*, ansi-regex@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107"
|
|
||||||
|
|
||||||
ansi-regex@^0.2.0, ansi-regex@^0.2.1:
|
ansi-regex@^0.2.0, ansi-regex@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
|
||||||
|
|
||||||
|
ansi-regex@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107"
|
||||||
|
|
||||||
ansi-styles@^1.1.0:
|
ansi-styles@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
|
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
|
||||||
|
|
@ -2518,7 +2518,7 @@ iferr@^0.1.5:
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
|
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
|
||||||
|
|
||||||
imurmurhash@*, imurmurhash@^0.1.4:
|
imurmurhash@^0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
|
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue