1

For each .round div, there is a data-value(%) which is static at the moment, but eventually going to be dynamic. Trying to call it in my JS for if data-value <= 0.50 display the bar as red, if data-value >0.50 && data-value <=0.75 display the bar as yellow and if data-value > 0.75 display it as green to call that value and wrap the Circle function in a conditional, how would I go about that?

I tried the following and it told Cannot read property 'getAttribute' of null: I tried this.getAttribute('data-value');

This is the JS with the above "solution" but doesn't populate anything:

function Circle(el){

var a = document.querySelector("a");
console.log(a.getAttribute('data-value'));

if(a.getAttribute('data-value') <= 0.50){
    $(el).circleProgress({fill: {color: 'red'}})
    .on('circle-animation-progress', function(event,
    progress, stepValue){

        $(this).find('strong').text(String(stepValue.toFixed(2)).substr(2) + '%');
    });
    }
if(a.getAttribute('data-value') > 0.50 && a.getAttribute('data-value') <= 0.75){
    $(el).circleProgress({fill: {color: 'yellow'}})
    .on('circle-animation-progress', function(event,
    progress, stepValue){

        $(this).find('strong').text(String(stepValue.toFixed(2)).substr(2) + '%');
    });
    }
if(a.getAttribute('data-value') > 0.75){
    $(el).circleProgress({fill: {color: 'green'}})
    .on('circle-animation-progress', function(event,
    progress, stepValue){

        $(this).find('strong').text(String(stepValue.toFixed(2)).substr(2) + '%');
    });
    }

 };

Circle('.round');

Here is my working snippet:

function Circle(el){
    //if(data-value < 0.50){
    $(el).circleProgress({fill: {color: 'red'}})
    .on('circle-animation-progress', function(event,
    progress, stepValue){

        $(this).find('strong').text(String(stepValue.toFixed(2)).substr(2) + '%');
    });
    //}
    //if(data-value )
};

Circle('.round');
#circleBar {
    margin-top: 50px;
    text-align: center;
    font-family: tahoma;
}

#circleBar .round{
    min-height: 255px;
    margin-top: 30px;
    position: relative;
    margin-bottom: 20px;
}

#circleBar .round strong{
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -50px;
    transform: translate(-50%);
    font-size: 40px;
    color: #212121;
    font-weight: 100;
}

#circleBar span{
    display: block;
    color: #999;
    font-size: 17px;
    margin-top: 10px;
}

#circleBar span i{
    color: #104723;
    font-size: 22px;
    margin-right: 7px;
}

section button:active{
    background-color: #104723;
    border-color: #b3ab7d;
}

section button:hover{
    background-color: #104723;
    border-color: #b3ab7d;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initialscale=1.0">
    <title>Morning Report Tracker</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/progressbar.js/1.1.0/progressbar.min.js" integrity="sha512-EZhmSl/hiKyEHklogkakFnSYa5mWsLmTC4ZfvVzhqYNLPbXKAXsjUYRf2O9OlzQN33H0xBVfGSEIUeqt9astHQ==" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="/site.css">
</head>
<body>
    <section id="circleBar">
        <h1>Morning Report Tracker</h1>
        <p>By Location</p>

        <div class="container">
            <div class="row">
                <div class="col-md-3">
                    <div class="round" data-value="0.87" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Kuwait
                        </span>
                    </div>
                </div>

                <div class="col-md-3">
                    <div class="round" data-value="0.74" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Albania
                        </span>
                    </div>
                </div>

                <div class="col-md-3">
                    <div class="round" data-value="0.44" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Australia
                        </span>
                    </div>
                </div>

                <div class="col-md-3">
                    <div class="round" data-value="0.15" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Guam
                        </span>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-md-3">
                    <div class="round" data-value="0.77" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Thailand
                        </span>
                    </div>
                </div>

                <div class="col-md-3">
                    <div class="round" data-value="0.74" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Syria
                        </span>
                    </div>
                </div>

                <div class="col-md-3">
                    <div class="round" data-value="0.54" data-size="200" data-thickness="12">
                        <strong></strong>
                        <span><i class="fa fa-map-marker"></i>
                        Japan
                        </span>
                    </div>
                </div>
            </div>
        </div>
        <button class="btn" onclick="Circle('.round')">Load Attendance</button>
    </section>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-circle-progress/1.2.2/circle-progress.min.js" integrity="sha512-6kvhZ/39gRVLmoM/6JxbbJVTYzL/gnbDVsHACLx/31IREU4l3sI7yeO0d4gw8xU5Mpmm/17LMaDHOCf+TvuC2Q==" crossorigin="anonymous"></script>

</body>
</html>

1 Answer 1

1

To read the data attribute of each element in the set you'll need to get a reference to it. As the fill.color property of the library only accepts a string, not a function, then you'll need to use an each() loop to do that.

From there it's a straightforward condition to determine the value and return the relevant colour. Try this:

function Circle(selector) {
  $(selector).each((i, el) => {
    let $el = $(el);
    let value = $el.data('value');
    $el.circleProgress({
      fill: { color: value < 0.5 ? 'red' : value < 0.75 ? 'yellow' : 'green' }
    }).on('circle-animation-progress', function(event, progress, stepValue) {
      $(this).find('strong').text((stepValue * 100).toFixed(0) + '%');
    });
  });
};

Circle('.round');
$('.btn').on('click', () => Circle('.round'));
#circleBar {
  margin-top: 50px;
  text-align: center;
  font-family: tahoma;
}

#circleBar .round {
  min-height: 255px;
  margin-top: 30px;
  position: relative;
  margin-bottom: 20px;
}

#circleBar .round strong {
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -50px;
  transform: translate(-50%);
  font-size: 40px;
  color: #212121;
  font-weight: 100;
}

#circleBar span {
  display: block;
  color: #999;
  font-size: 17px;
  margin-top: 10px;
}

#circleBar span i {
  color: #104723;
  font-size: 22px;
  margin-right: 7px;
}

section button:active {
  background-color: #104723;
  border-color: #b3ab7d;
}

section button:hover {
  background-color: #104723;
  border-color: #b3ab7d;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="/site.css">
<section id="circleBar">
  <h1>Morning Report Tracker</h1>
  <p>By Location</p>

  <div class="container">
    <div class="row">
      <div class="col-md-3">
        <div class="round" data-value="0.87" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Kuwait</span>
        </div>
      </div>
      <div class="col-md-3">
        <div class="round" data-value="0.74" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Albania</span>
        </div>
      </div>
      <div class="col-md-3">
        <div class="round" data-value="0.44" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Australia</span>
        </div>
      </div>
      <div class="col-md-3">
        <div class="round" data-value="0.15" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Guam</span>
        </div>
      </div>
    </div>
    <div class="row">
      <div class="col-md-3">
        <div class="round" data-value="0.77" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Thailand</span>
        </div>
      </div>
      <div class="col-md-3">
        <div class="round" data-value="0.74" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Syria</span>
        </div>
      </div>
      <div class="col-md-3">
        <div class="round" data-value="0.54" data-size="200" data-thickness="12">
          <strong></strong>
          <span><i class="fa fa-map-marker"></i>Japan</span>
        </div>
      </div>
    </div>
  </div>
  <button class="btn">Load Attendance</button>
</section>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-circle-progress/1.2.2/circle-progress.min.js" integrity="sha512-6kvhZ/39gRVLmoM/6JxbbJVTYzL/gnbDVsHACLx/31IREU4l3sI7yeO0d4gw8xU5Mpmm/17LMaDHOCf+TvuC2Q==" crossorigin="anonymous"></script>

Note that I tweaked the code slightly by removing the inline onclick attribute, which are bad practice and should be avoided where possible, and also converting the toFixed()/substr() calls to work with the step value as an integer and display it without decimal precision.

Sign up to request clarification or add additional context in comments.

1 Comment

How can I make the data visuals smaller? the data size property shrinks when say I change it from 200 -> 100, but the data value I cannot change the size to insert back into the data visualization

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.