Showing alert on second occurrence - javascript

I have given a call for the below javascript function on drop down selection.
Basically what my requirement is that ,there can be a lot of vndrCd .
But,When ever the first time vndrCd is "SFGL", alert should not open .
If "SFGL is coming second time then an alert should come . I am not able to put this condition as the call to the method is at every click . Is there a way I can achive this .
function GetOptions(var1) {
varId = var1.id;
var vndrNbrCdList = document.getElementById('TouchCellDetailForm:vendorNbrCodeList').value;
var splitVndrList = vndrNbrCdList.split(',');
if (var1.value == '0') {
varhiddBox.value = '0';
return;
}
for (var j = 0; j < splitVndrList.length; j++) {
if (splitVndrList[j].split('-')[0] == (var1.value)) {
var vndrCd = splitVndrList[j].split('-')[1];
break;
}
}
localStorage.setItem("vendorName", vndrCd);
var vendorName1 = localStorage.getItem("vendorName");
if (vendorName1 == 'SFGL') {
alert("Salesforce vendor has already been selected.Please select some other vendor");
}
}

You can use closure to hold a private variable to indicate whether 'SFGL' has been encountered or not:
function GetOptionsHelp() {
'use strict';
let called = false;
return function GetOptions(var1) {
// ... your code block
if (vendorName1 == 'SFGL') {
if (called) {
alert("Salesforce vendor has already been selected.Please select some other vendor");
} else {
called = true;
}
}
}
And you can call the function like this GetOptionsHelp()(var1)

Try doing something like this as an easy solution:
(function () {
var firstTimeFlag = true;
function GetOptions(var1) {
varId = var1.id;
var vndrNbrCdList = document.getElementById('TouchCellDetailForm:vendorNbrCodeList').value;
var splitVndrList = vndrNbrCdList.split(',');
if (var1.value == '0') {
varhiddBox.value = '0';
return;
}
for (var j = 0; j < splitVndrList.length; j++) {
if (splitVndrList[j].split('-')[0] == (var1.value)) {
var vndrCd = splitVndrList[j].split('-')[1];
break;
}
}
localStorage.setItem("vendorName", vndrCd);
var vendorName1 = localStorage.getItem("vendorName");
if (vendorName1 == 'SFGL') {
if(!firstTimeFlag) {
alert("Salesforce vendor has already been selected.Please select some other vendor");
}
firstTimeFlag = false;
}
}
}());

Related

sendBackwards which would not pass a certain object (fabricjs)

I want to make so that an object with the name of mainImage would work as a background image and no other object could pass it when the user would try to use "sendBackwards" method.
So, in my thinking I need to know that
1.If the mainImage is at index 0
2.If active selected object is at index 1 when I should not allow to use sendBackwards
This is what I tried so far, but I guess you will be able to see where this is failing:
$scope.getActiveIndex = function() {
for (var i = 0; i < canvas.fabric._objects.length; i++) {
console.log("not active");
if (canvas.fabric._objects[i].status === "active") {
console.log("active");
return i;
}
}
}
$scope.sendBackwards = function() {
var currentObject = canvas.fabric.getActiveObject();
for (var i = 0; i < canvas.fabric._objects.length; i++) {
console.log($scope.getActiveIndex());
if (canvas.fabric._objects[i].name === "mainImage" && $scope.getActiveIndex() == 1) {
console.log("Can not pass the background");
return;
} else {
canvas.fabric.sendBackwards(currentObject);
}
}
canvas.fabric.renderAll();
};
Thanks.
Solved this quite easily:
$scope.sendBackwards = function() {
var currentObject = canvas.fabric.getActiveObject();
var zIndex = canvas.fabric.getObjects().indexOf(currentObject);
if (zIndex == 1) {
return false;
} else {
canvas.fabric.sendBackwards(currentObject);
}
canvas.fabric.renderAll();
};

How to check whether specific items inside an array have a value? Javascript

I have a function which gets values from elements:
function getTransactionValues() {
var o = {};
o.reservations = [];
$('#custom-headers option:selected').each(function (i, selected) {
o.reservations[i] = $(selected).val();
});
o.amount = $('input[name=amount-price]').val();
o.currency_value = $('input[name=currency-value]').val();
o.currency_name = $('.currency_appendto option:selected').html();
o.actual_amount = $('input[name=actual-amount]').val();
o.actual_remaining = $('input[name=actual-remaining]').val();
o.funds_arrival_date = $('input[name=funds-arrival]').val();
o.paid_to = $('.paidto option:selected').html();
o.checkbox = $('.multi-transaction:checked').map(function () {
return this.value
}).get();
return o;
}
Now i want to check whether amount, actual_amount and funds_arrival_date are filled. if they are i will release the disabled class from a button. i've tried
var check_review = function () {
var a = getTransactionValues();
var options = [a.amount, a.actual_amount, a.funds_arrival_date];
for(i = 0; i < options.length; i++) {
if(options[i].length > 0) {
$('a[name=review_button]').removeClass('disabled');
}
else{
//this array is empty
alert('There is a problem!');
}
}
}
$('.test').click(function() {
check_review();
});
But it doesn't seems to be working..
Remove disabled attribute using JQuery?
Can you please look at above link, I think we should use $('.inputDisabled').prop("disabled", false);
Even if a single array element will be non empty then your code will remove the class disabled from the a. To make sure that all the elements of array are non empty and then only you want to remove the class then the way is:
for(i = 0; i < options.length; i++) {
if(options[i].length > 0) {
$('a[name=review_button]').removeClass('disabled');
}
else{
$('a[name=review_button]').addClass('disabled');
}
}
Or the other way is
var check = true;
for(i = 0; i < options.length; i++) {
if(options[i].length == 0) {
check = false;
}
}
if(check ) $('a[name=review_button]').removeClass('disabled');
Try using Array.prototype.every()
if (options.every(Boolean)) {
$("a[name=review_button]").removeClass("disabled");
} else {
// do other stuff
}

Recursive function to traverse grid goes crazy

When the user clicks on one of the blocks in the table ( see screenshot ) I want to find all neighbouring blocks with the same color. I am trying to do this recursively, but if I try it with more than three blocks it sometimes goes crazy and calls itself over and over until the program crashes.
As far as I can see, the objects are added to the array, but somehow my tests fails and the same object is added over and over and over.
Any insight on what the problem might be and how to solve it would be much appriciated!
Here's a screenshot
This is the function that is called when the user clicks on a block:
var $matchArray;
$('.block').click(function () {
$matchArray = [$(this)];
var $colorClass;
if ($(this).hasClass('red')) {
$colorClass = 'red';
} else if ($(this).hasClass('green')) {
$colorClass = 'green';
} else if ($(this).hasClass('blue')) {
$colorClass = 'blue';
} else {
$colorClass = 'error';
}
findAllSameColorNeighbours($(this), $colorClass);
});
And this is the recursive method:
findAllSameColorNeighbours = function ($this, $colorClass) {
$this.css('border-style', 'solid');
//LEFT
var $leftBlock = isLeftBlockSameColor($this, $colorClass);
if ($leftBlock != null) {
if (!(arrayContains($matchArray, $leftBlock))) {
$matchArray.push($leftBlock);
findAllSameColorNeighbours($leftBlock, $colorClass);
}
}
//ABOVE
//same as for LEFT
//RIGHT
//same as for LEFT
//BELOW
//same as for LEFT
}
This is how I find the neighboring cells, as far as I can see these work just fine. I have one for each direction:
isLeftBlockSameColor = function ($block, $color) {
var $this = $block;
var $tr = $this.parent().parent();
var col = $tr.children().index($this.parent().prev());
var $leftBlock = $this.parent().siblings().eq(col).children();
var $blockClassMatch = $leftBlock.hasClass($color);
if ($blockClassMatch) {
return $leftBlock;
}
else {
return null;
}
};
Here are some help methods to find out if the object is already in the array or not. I use the index of the row and cell to create a sort of latitude and longditude thing.
arrayContains = function ($array, $object) {
for (i = 0; i < Array.length; i++) {
if (compareIndex($array[i], $object)) {
say('true');
return true;
}
};
return false;
};
compareIndex = function ($obj1, $obj2) {
if ((getRowIndex($obj1)) === (getRowIndex($obj2)) {
if ((getCellIndex($obj1)) === (getCellIndex($obj2)) {
return true;
} else {
return false;
}
} else {
return false;
}
};
getCellIndex = function ($this) {
var $tr = $this.parent().parent();
var index = $tr.children().index($this.parent());
return index;
};
getRowIndex = function ($this) {
var $tr = $this.parent().parent();
var index = $tr.index();
return index;
};
There is a bug in the arrayContains function. The loop will iterates only once, because Array.length is equals to 1(As I tested with chrome browser, but I don't know why). You should use $array.length instead.
arrayContains = function ($array, $object) {
//for (i = 0; i < Array.length; i++) {
for (i = 0; i < $array.length; i++) {
if (compareIndex($array[i], $object)) {
say('true');
return true;
}
};
return false;
};

Save the ultimate expression in selectbox

I wrote this code to save the expressions in a "memory" (textarea) in a select box, the code apparently works.
I would, however, prevent to save an expression already present in the select statement. In this case the code does not work. How so? It seems that there are no errors.
var flag = false;
for (var i = 0; i < select.options.length; i++) {
if (select.options[i].value == document.getElementById('textarea').value) {
flag = true;
break;
}
}
if(!flag){
select.options[select.options.length] = new Option(result, result); //salvo l'operazione in selectbox
document.getElementById('operazione').disabled = true;
}else{
alert("Memoria occupata");
}
Try this
function save()
{
var savedmemory = document.getElementById('operations');
var expression = document.getElementById('code').innerHTML;
var flag = false;
for (var i = 0; i < savedmemory.options.length; ++i)
{
if (savedmemory.options[i].text == result)
{
flag = true;
break;
}
}
if (flag)
{
alert("no.");
}
else
{
//
savedmemory.options[savedmemory.options.length] = new Option(result, result);
}
}
operations is the reference toselect.
code to the textarea.

Get values from check boxes using id or name passed through function

function checkSelect(field_id)
{
var oParent = document.getElementById(field_id);
alert(oParent);
var aElements = oParent.getElementsByTagName('input');
alert(aElements);
var c_value = "";
for (var i = 0; i < aElements.length; i++)
{
if (aElements[i].type == 'checkbox')
{
if(aElements[i].checked )
{
c_value=aElements[i].checked.value;
alert(c_value);
}
}
}
//alert(c_value);
}
The code i have searched from here. Please let me know what I'm doing wrong. I want to get the values of checkboxes by it's fieldname or fieldid passed through function. Javascript is not getting the value "fieldid" as the name of checkbox causes an error. If I give the hardcoded value then it works like function given below.
function checkSelect()
{
var bool=false;
var field=document.countryManagementForm.country_ids;
var length=1;
if(field.length==null)
{
//alert("yes");
}
else
{
///alert("No");
length=field.length;
}
for (i = 0; i < length; i++)
{
if(field[i].checked == true)
{
bool=true;
}
}
if(!bool)
{
alert("Please select atleast one country");
return false;
}
else
{
return true;
}
}
I would recommend using a javascript framework for this. It's a breeze to do what you want to do:
For ID:
$('#id').val();
For names:
$('[name="name"]').val();
Jquery and the Docs
change
c_value=aElements[i].checked.value;
to
c_value=aElements[i].value;
and try it again
Looks like country_ids is the name of your checkbox inputs. If so, you can replace this line
var aElements = oParent.getElementsByTagName('input');
by
var aElements = document.getElementsByName(field_id);
and ignore the lines above it. Call your function as checkSelect('country_ids')

Categories