I'm using protractor with Jasmine and I use page object pattern. In one of my page object I'm trying to hover the mouse over a pie chart. But when I use the following method it fails to get value for x coordinate using getDisHoverPoint(). When I put a logger for getDisHoverPoint(), it returns ManagedPromise::2516 {[[PromiseStatus]]: "pending"}. Please help.
this.hoverMouse = function() {
var dis = element(by
.css('#piecontainer .highcharts-series>path[fill="#434348"]'));
function getDisHoverPoint() {
return dis.getSize().then(function(text) {
return (text['height'] / 2).toFixed(0);
});
}
browser.actions().mouseMove(dis, {
x : getDisHoverPoint(),
y : 0
}).perform();
}
You have to resolve getDisHoverPoint() to get the actual value for x:
this.hoverMouse = function() {
var dis = element(by
.css('#piecontainer .highcharts-series>path[fill="#434348"]'));
function getDisHoverPoint() {
return dis.getSize().then(function(text) {
return (text['height'] / 2).toFixed(0);
});
}
getDisHoverPoint().then(function (value) {
browser.actions().mouseMove(dis, {
x : value,
y : 0
}).perform();
});
}
Related
I am new to Protractor and I am trying to write a function that will accept 2 values and has to return the element like this
this.getinput = function(x, y) {
var text123 = "by." + x + "('" + y + "')"
return element(text123);
So x and y here can be any values like
x: "buttonText" y:"save"
x: "class" y: ".css"
This works
element(by.buttonText('save'))
but if I try to send the same through the variables as in the function, it fails as "Invalid element locator". Is there a nicer way to get this done dynamically?
Setup a object to mapping by API as following:
var byMap = {
buttontext: by.buttonText,
css: by.css,
xpath: by.xpath,
id: by.id,
tagname: by.tagName,
name: by.name,
linktext: by.linkText,
};
function buildLocator(using, value) {
return byMap[using.toLowerCase()](value);
}
function getInput(using, value) {
return element(buildLocator(using, value));
}
I try to make a flac file player with Appcelerator and Hyperloopusing the OrigamiEngine
It works as I can play, pause and stop the player. But I can't get the "addEventListener" mode working. I read some examples and something about the delegate methods. But I'm not a native iOS coder and all my tryings failed.
Can anybody tells me how to code the eventlistener for the didChangeState function?
This is my unfortunately not working code
//Application Window Component Constructor
function ApplicationWindow() {
Ti.Media.audioSessionCategory = Ti.Media.AUDIO_SESSION_CATEGORY_PLAYBACK;
var NSURL = require('Foundation/NSURL');
var ORGMEngine = require('OrigamiEngine/ORGMEngine');
var audioPlayer = new ORGMEngine();
var self = Ti.UI.createWindow({
backgroundColor : '#ffffff'
});
var startStopButton = Ti.UI.createButton({
title : 'Start/Stop Streaming',
top : 100,
width : 200,
height : 40
});
var pauseResumeButton = Ti.UI.createButton({
title : 'Pause/Resume Streaming',
top : 140,
width : 200,
height : 40,
enabled : false
});
self.add(startStopButton);
self.add(pauseResumeButton);
startStopButton.addEventListener('click', function() {
console.log('audioPlayer.currentState: ' + audioPlayer.currentState);
// When paused, playing returns false.
// If both are false, playback is stopped.
if (audioPlayer.currentState == 1) {
audioPlayer.stop();
audioPlayer.release();
pauseResumeButton.enabled = false;
} else {
var url = NSURL.URLWithString('http://faq.fantasticlibrary.de/test.flac');
audioPlayer.playUrl(url);
setTimeout(function(){
console.log(audioPlayer.metadata());
}, 10000);
pauseResumeButton.enabled = true;
}
});
pauseResumeButton.addEventListener('click', function() {
console.log('audioPlayer.currentState: ' + audioPlayer.currentState);
if (audioPlayer.currentState == 1) {
audioPlayer.pause();
} else {
audioPlayer.resume();
}
});
var StateChangeDelegate = Hyperloop.defineClass('MyDelegate', 'NSObject', ['ORGMEngineDelegate']);
StateChangeDelegate.addMethod({
selector: 'engine:didChangeState:',
instance: true,
arguments: ['ORGMEngine', 'ORGMEngineState'],
callback: function (engine, state) {
if (this.didChangeState) {
this.didChangeState(engine, state);
}
}
});
var delegate = new StateChangeDelegate();
delegate.didChangeState = function(ORMEngine,state) {
console.log('does the state change???');
};
self.addEventListener('close', function() {
audioPlayer.stop();
audioPlayer.release();
});
return self;
}
module.exports = ApplicationWindow;
Running demo project to download: http://lightapps.de/files/flactest.zip
Try it:
delegate.on('didChangeState', function(ORMEngine,state){
console.log('does the state change???');
});
I can't test this in the moment, but i think that will work for you.
I am trying to access a method called filterCurrent() within the menuTags() method but vue is throwing an error that it doesn't recognise this.
I feel this has got to do with scope. Could anyone provide some insight as to why?
methods: {
filterCurrent() {
var self = this;
// var results = this.results;
var activeTags = this.currentTags.tags;
//console.log(activeTags);
this.results.filter(function (result) {
// Reset current result to false;
result.active = false;
// Loop throigh current result tags
result.tags.some(function (tag) {
// Loop through activeTags
activeTags.filter(function (activeTag) {
// If one of the tags in the current result match any of the activeTag set it to active
if (tag.indexOf(activeTag) != -1) {
//console.log(activeTags);
result.active = true;
//console.log(activeTag);
}
})
})
}, this)
},
menuTags(label) {
//this.currentTags.push(label.tags);
//this.filterCurrent();
let self = this;
var passedTags = label.tags;
console.log(passedTags);
passedTags.filter(function(tag) {
this.currentTags.push(tag);
}, this)
this.filterCurrent();
}
},
I am trying to use mCustomScrollbar on jqgrid( 4.9.2). The design of the scrollbar is getting changed but when scrolling horizontally the top headers does not move as they do normally.
The example I am trying to work on is of collapsable grid.
and for the mCustomScroll
$(".ui-jqgrid-bdiv").mCustomScrollbar({
axis:"yx",
});
Is it not possible at all to use any custom scroll bar on jqgrid ?
I had made some customized changes to jqgr so migrating to the other version will be a tough task, so Instead, I made the changes in the mcustomscrollbar and posting the answer so if any one else come across the same problem it will be beneficial.
so there is a methods _tweetTo, which is called for the container on which the scrollbar is assigned by the initializing as
$(".ui-jqgrid-bdiv").mCustomScrollbar({
axis:"yx",
});
now just after the method call _tweenTo(line# 2131 for V:3.1.5) insert the following code
if ($(".ui-jqgrid-hdiv").length > 0) {
$(".ui-jqgrid-view").css("overflow", "hidden");
$(".ui-jqgrid-hdiv").css("width", $("#grid1").width() + "px"); // grid1 is the id of your gridcontainer/table
_tweenTo($(".ui-jqgrid-hdiv")[0], property, Math.round(scrollTo[0]), dur[0], options.scrollEasing, options.overwrite, {
onStart: function () {
if (options.callbacks && options.onStart && !d.tweenRunning) {
/* callbacks: onScrollStart */
if (_cb("onScrollStart")) { _mcs(); o.callbacks.onScrollStart.call(el[0]); }
d.tweenRunning = true;
_onDragClasses(mCSB_dragger);
d.cbOffsets = _cbOffsets();
}
}, onUpdate: function () {
if (options.callbacks && options.onUpdate) {
/* callbacks: whileScrolling */
if (_cb("whileScrolling")) { _mcs(); o.callbacks.whileScrolling.call(el[0]); }
}
}, onComplete: function () {
if (options.callbacks && options.onComplete) {
if (o.axis === "yx") { clearTimeout(mCSB_container[0].onCompleteTimeout); }
var t = mCSB_container[0].idleTimer || 0;
mCSB_container[0].onCompleteTimeout = setTimeout(function () {
/* callbacks: onScroll, onTotalScroll, onTotalScrollBack */
if (_cb("onScroll")) { _mcs(); o.callbacks.onScroll.call(el[0]); }
if (_cb("onTotalScroll") && scrollTo[1] >= limit[1] - totalScrollOffset && d.cbOffsets[0]) { _mcs(); o.callbacks.onTotalScroll.call(el[0]); }
if (_cb("onTotalScrollBack") && scrollTo[1] <= totalScrollBackOffset && d.cbOffsets[1]) { _mcs(); o.callbacks.onTotalScrollBack.call(el[0]); }
d.tweenRunning = false;
mCSB_container[0].idleTimer = 0;
_onDragClasses(mCSB_dragger, "hide");
}, t);
}
}
});
}
and in the method definition of _tweenTo there is another method _tween
update that method as
function _tween() {
// added condition so the top headers remains fixed
if (el.classList.contains("ui-jqgrid-hdiv") && prop == "top") {
return;
}
//ends here
if (duration > 0) {
tobj.currVal = _ease(tobj.time, from, diff, duration, easing);
elStyle[prop] = Math.round(tobj.currVal) + "px";
} else {
elStyle[prop] = to + "px";
}
onUpdate.call();
}
and the scrollbar is up and running.. !!
I have a piechart I'm displaying using the following dimension -
var types = facts.dimension(function (d) {
if (d.types === 2)
return "Type 2";
else if (d.types === 3)
return "Type 3";
else
return "Other";
});
I would like to not return, ignore, all other types, so the pie chart would just display Type 2 and Type 3. I cannot seem to get this working though I'm sure it's simple. Can I do something within that dimension or do I need to filter before?
Thanks for any help.
Have you tried creating a new type and then creating a dimension on top of that?
facts.forEach(function(d) {
if (d.types == 2) {
d._type = "Type 2";
} else if (d.types == 3) {
d._type = "Type 3";
} else {
d._type = "Other";
}
});
var types = facts.dimension(dc.pluck('_type'))
You need to (1) Filter your data then (2) remove it from the bin. Run your data through ensure_group_bins(myGroup) you'll get the chart you're after
function remove_empty_bins(source_group) {
return {
all:function () {
return source_group.all().filter(function(d) {
return d.key != "unwanted" ;
});
}
};}
function ensure_group_bins(source_group, bins) {
return {
all:function () {
var result = source_group.all().slice(0), // copy original results (we mustn't modify them)
found = {};
result.forEach(function(d) {
found[d.key] = true;
});
bins.forEach(function(d) {
if(!found[d])
result.push({key: d, value: 0});
});
return result;
}
};};
dc.js Github