How to use Sprite objects/animations in Vue Konva?











up vote
1
down vote

favorite












I'm trying to create a spritesheet animation in Vue with konva.js (utilizing vue-konva).



In pure konva.js, the Sprite object is created this way - in short, the Image object is created at first, and then the Sprite object is created in the onload callback of Image object.



var imageObj = new Image();
imageObj.onload = function() {
var blob = new Konva.Sprite({
x: 50,
y: 50,
image: imageObj,
animation: 'idle',
animations: animations, // object defined earlier
frameRate: 7,
frameIndex: 0
});

// add the shape to the layer
layer.add(blob);

// add the layer to the stage
stage.add(layer);

// start sprite animation
blob.start();
};
imageObj.src = '/assets/blob-sprite.png';


On the other hand, in vue-konva it is possible to create Konva objects as components directly in the <template> section of the .vue file, like this:



<template>
<v-stage :config="configKonva">
<v-layer>
<v-circle :config="configCircle"></v-circle>
</v-layer>
</v-stage>
</template>


My questions are:




  1. is it possible to create <v-sprite :config="configSprite"></v-sprite> component? There are no mentions of this in the documentation.

  2. If so, how should one correctly provide the necessary image attribute for the configSprite object?

  3. How can one control the animations of v-sprite (starting/stopping)?

  4. If all of this is not possible by using a v-sprite component, is it possible to somehow create the Sprite object manually and add it to the necessary v-layer?


Thank you!










share|improve this question


























    up vote
    1
    down vote

    favorite












    I'm trying to create a spritesheet animation in Vue with konva.js (utilizing vue-konva).



    In pure konva.js, the Sprite object is created this way - in short, the Image object is created at first, and then the Sprite object is created in the onload callback of Image object.



    var imageObj = new Image();
    imageObj.onload = function() {
    var blob = new Konva.Sprite({
    x: 50,
    y: 50,
    image: imageObj,
    animation: 'idle',
    animations: animations, // object defined earlier
    frameRate: 7,
    frameIndex: 0
    });

    // add the shape to the layer
    layer.add(blob);

    // add the layer to the stage
    stage.add(layer);

    // start sprite animation
    blob.start();
    };
    imageObj.src = '/assets/blob-sprite.png';


    On the other hand, in vue-konva it is possible to create Konva objects as components directly in the <template> section of the .vue file, like this:



    <template>
    <v-stage :config="configKonva">
    <v-layer>
    <v-circle :config="configCircle"></v-circle>
    </v-layer>
    </v-stage>
    </template>


    My questions are:




    1. is it possible to create <v-sprite :config="configSprite"></v-sprite> component? There are no mentions of this in the documentation.

    2. If so, how should one correctly provide the necessary image attribute for the configSprite object?

    3. How can one control the animations of v-sprite (starting/stopping)?

    4. If all of this is not possible by using a v-sprite component, is it possible to somehow create the Sprite object manually and add it to the necessary v-layer?


    Thank you!










    share|improve this question
























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I'm trying to create a spritesheet animation in Vue with konva.js (utilizing vue-konva).



      In pure konva.js, the Sprite object is created this way - in short, the Image object is created at first, and then the Sprite object is created in the onload callback of Image object.



      var imageObj = new Image();
      imageObj.onload = function() {
      var blob = new Konva.Sprite({
      x: 50,
      y: 50,
      image: imageObj,
      animation: 'idle',
      animations: animations, // object defined earlier
      frameRate: 7,
      frameIndex: 0
      });

      // add the shape to the layer
      layer.add(blob);

      // add the layer to the stage
      stage.add(layer);

      // start sprite animation
      blob.start();
      };
      imageObj.src = '/assets/blob-sprite.png';


      On the other hand, in vue-konva it is possible to create Konva objects as components directly in the <template> section of the .vue file, like this:



      <template>
      <v-stage :config="configKonva">
      <v-layer>
      <v-circle :config="configCircle"></v-circle>
      </v-layer>
      </v-stage>
      </template>


      My questions are:




      1. is it possible to create <v-sprite :config="configSprite"></v-sprite> component? There are no mentions of this in the documentation.

      2. If so, how should one correctly provide the necessary image attribute for the configSprite object?

      3. How can one control the animations of v-sprite (starting/stopping)?

      4. If all of this is not possible by using a v-sprite component, is it possible to somehow create the Sprite object manually and add it to the necessary v-layer?


      Thank you!










      share|improve this question













      I'm trying to create a spritesheet animation in Vue with konva.js (utilizing vue-konva).



      In pure konva.js, the Sprite object is created this way - in short, the Image object is created at first, and then the Sprite object is created in the onload callback of Image object.



      var imageObj = new Image();
      imageObj.onload = function() {
      var blob = new Konva.Sprite({
      x: 50,
      y: 50,
      image: imageObj,
      animation: 'idle',
      animations: animations, // object defined earlier
      frameRate: 7,
      frameIndex: 0
      });

      // add the shape to the layer
      layer.add(blob);

      // add the layer to the stage
      stage.add(layer);

      // start sprite animation
      blob.start();
      };
      imageObj.src = '/assets/blob-sprite.png';


      On the other hand, in vue-konva it is possible to create Konva objects as components directly in the <template> section of the .vue file, like this:



      <template>
      <v-stage :config="configKonva">
      <v-layer>
      <v-circle :config="configCircle"></v-circle>
      </v-layer>
      </v-stage>
      </template>


      My questions are:




      1. is it possible to create <v-sprite :config="configSprite"></v-sprite> component? There are no mentions of this in the documentation.

      2. If so, how should one correctly provide the necessary image attribute for the configSprite object?

      3. How can one control the animations of v-sprite (starting/stopping)?

      4. If all of this is not possible by using a v-sprite component, is it possible to somehow create the Sprite object manually and add it to the necessary v-layer?


      Thank you!







      javascript vue.js konvajs






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 at 16:13









      Arx

      24329




      24329
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          The sprite component is very similar to v-image component. You can take a look into images demos: https://konvajs.github.io/docs/vue/Images.html



          To start/pause sprite you have to access native Konva object and control animation manually. You can do this using references:



          <template>
          <v-stage ref="stage" :config="stageSize">
          <v-layer ref="layer">
          <v-sprite
          @click="handleClick"
          ref="sprite"
          :config="{
          image: image,
          animation: 'idle',
          animations: animations,
          frameRate: 7,
          frameIndex: 0,
          animations: {
          idle: [
          2,
          2,
          70,
          119,
          71,
          2,
          74,
          119,
          146,
          2,
          81,
          119,
          226,
          2,
          76,
          119
          ],
          punch: [2, 138, 74, 122, 76, 138, 84, 122, 346, 138, 120, 122]
          }
          }"
          />
          </v-layer>
          </v-stage>
          </template>

          <script>
          const width = window.innerWidth;
          const height = window.innerHeight;

          export default {
          data() {
          return {
          stageSize: {
          width: width,
          height: height
          },
          image: null
          };
          },
          created() {
          const image = new window.Image();
          image.src = "https://konvajs.github.io/assets/blob-sprite.png";
          image.onload = () => {
          // set image only when it is loaded
          this.image = image;
          };
          },
          methods: {
          handleClick() {
          const node = this.$refs.sprite.getNode();
          if (node.isRunning()) {
          node.stop();
          } else {
          node.start();
          }
          }
          }
          };
          </script>


          Online demo: https://codesandbox.io/s/lxlqzok2m9






          share|improve this answer





















          • Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
            – Arx
            Nov 23 at 14:00






          • 1




            @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
            – lavrton
            Nov 23 at 14:25










          • Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
            – Arx
            Nov 23 at 15:49










          • That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
            – lavrton
            Nov 23 at 15:53











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53434820%2fhow-to-use-sprite-objects-animations-in-vue-konva%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          2
          down vote



          accepted










          The sprite component is very similar to v-image component. You can take a look into images demos: https://konvajs.github.io/docs/vue/Images.html



          To start/pause sprite you have to access native Konva object and control animation manually. You can do this using references:



          <template>
          <v-stage ref="stage" :config="stageSize">
          <v-layer ref="layer">
          <v-sprite
          @click="handleClick"
          ref="sprite"
          :config="{
          image: image,
          animation: 'idle',
          animations: animations,
          frameRate: 7,
          frameIndex: 0,
          animations: {
          idle: [
          2,
          2,
          70,
          119,
          71,
          2,
          74,
          119,
          146,
          2,
          81,
          119,
          226,
          2,
          76,
          119
          ],
          punch: [2, 138, 74, 122, 76, 138, 84, 122, 346, 138, 120, 122]
          }
          }"
          />
          </v-layer>
          </v-stage>
          </template>

          <script>
          const width = window.innerWidth;
          const height = window.innerHeight;

          export default {
          data() {
          return {
          stageSize: {
          width: width,
          height: height
          },
          image: null
          };
          },
          created() {
          const image = new window.Image();
          image.src = "https://konvajs.github.io/assets/blob-sprite.png";
          image.onload = () => {
          // set image only when it is loaded
          this.image = image;
          };
          },
          methods: {
          handleClick() {
          const node = this.$refs.sprite.getNode();
          if (node.isRunning()) {
          node.stop();
          } else {
          node.start();
          }
          }
          }
          };
          </script>


          Online demo: https://codesandbox.io/s/lxlqzok2m9






          share|improve this answer





















          • Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
            – Arx
            Nov 23 at 14:00






          • 1




            @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
            – lavrton
            Nov 23 at 14:25










          • Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
            – Arx
            Nov 23 at 15:49










          • That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
            – lavrton
            Nov 23 at 15:53















          up vote
          2
          down vote



          accepted










          The sprite component is very similar to v-image component. You can take a look into images demos: https://konvajs.github.io/docs/vue/Images.html



          To start/pause sprite you have to access native Konva object and control animation manually. You can do this using references:



          <template>
          <v-stage ref="stage" :config="stageSize">
          <v-layer ref="layer">
          <v-sprite
          @click="handleClick"
          ref="sprite"
          :config="{
          image: image,
          animation: 'idle',
          animations: animations,
          frameRate: 7,
          frameIndex: 0,
          animations: {
          idle: [
          2,
          2,
          70,
          119,
          71,
          2,
          74,
          119,
          146,
          2,
          81,
          119,
          226,
          2,
          76,
          119
          ],
          punch: [2, 138, 74, 122, 76, 138, 84, 122, 346, 138, 120, 122]
          }
          }"
          />
          </v-layer>
          </v-stage>
          </template>

          <script>
          const width = window.innerWidth;
          const height = window.innerHeight;

          export default {
          data() {
          return {
          stageSize: {
          width: width,
          height: height
          },
          image: null
          };
          },
          created() {
          const image = new window.Image();
          image.src = "https://konvajs.github.io/assets/blob-sprite.png";
          image.onload = () => {
          // set image only when it is loaded
          this.image = image;
          };
          },
          methods: {
          handleClick() {
          const node = this.$refs.sprite.getNode();
          if (node.isRunning()) {
          node.stop();
          } else {
          node.start();
          }
          }
          }
          };
          </script>


          Online demo: https://codesandbox.io/s/lxlqzok2m9






          share|improve this answer





















          • Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
            – Arx
            Nov 23 at 14:00






          • 1




            @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
            – lavrton
            Nov 23 at 14:25










          • Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
            – Arx
            Nov 23 at 15:49










          • That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
            – lavrton
            Nov 23 at 15:53













          up vote
          2
          down vote



          accepted







          up vote
          2
          down vote



          accepted






          The sprite component is very similar to v-image component. You can take a look into images demos: https://konvajs.github.io/docs/vue/Images.html



          To start/pause sprite you have to access native Konva object and control animation manually. You can do this using references:



          <template>
          <v-stage ref="stage" :config="stageSize">
          <v-layer ref="layer">
          <v-sprite
          @click="handleClick"
          ref="sprite"
          :config="{
          image: image,
          animation: 'idle',
          animations: animations,
          frameRate: 7,
          frameIndex: 0,
          animations: {
          idle: [
          2,
          2,
          70,
          119,
          71,
          2,
          74,
          119,
          146,
          2,
          81,
          119,
          226,
          2,
          76,
          119
          ],
          punch: [2, 138, 74, 122, 76, 138, 84, 122, 346, 138, 120, 122]
          }
          }"
          />
          </v-layer>
          </v-stage>
          </template>

          <script>
          const width = window.innerWidth;
          const height = window.innerHeight;

          export default {
          data() {
          return {
          stageSize: {
          width: width,
          height: height
          },
          image: null
          };
          },
          created() {
          const image = new window.Image();
          image.src = "https://konvajs.github.io/assets/blob-sprite.png";
          image.onload = () => {
          // set image only when it is loaded
          this.image = image;
          };
          },
          methods: {
          handleClick() {
          const node = this.$refs.sprite.getNode();
          if (node.isRunning()) {
          node.stop();
          } else {
          node.start();
          }
          }
          }
          };
          </script>


          Online demo: https://codesandbox.io/s/lxlqzok2m9






          share|improve this answer












          The sprite component is very similar to v-image component. You can take a look into images demos: https://konvajs.github.io/docs/vue/Images.html



          To start/pause sprite you have to access native Konva object and control animation manually. You can do this using references:



          <template>
          <v-stage ref="stage" :config="stageSize">
          <v-layer ref="layer">
          <v-sprite
          @click="handleClick"
          ref="sprite"
          :config="{
          image: image,
          animation: 'idle',
          animations: animations,
          frameRate: 7,
          frameIndex: 0,
          animations: {
          idle: [
          2,
          2,
          70,
          119,
          71,
          2,
          74,
          119,
          146,
          2,
          81,
          119,
          226,
          2,
          76,
          119
          ],
          punch: [2, 138, 74, 122, 76, 138, 84, 122, 346, 138, 120, 122]
          }
          }"
          />
          </v-layer>
          </v-stage>
          </template>

          <script>
          const width = window.innerWidth;
          const height = window.innerHeight;

          export default {
          data() {
          return {
          stageSize: {
          width: width,
          height: height
          },
          image: null
          };
          },
          created() {
          const image = new window.Image();
          image.src = "https://konvajs.github.io/assets/blob-sprite.png";
          image.onload = () => {
          // set image only when it is loaded
          this.image = image;
          };
          },
          methods: {
          handleClick() {
          const node = this.$refs.sprite.getNode();
          if (node.isRunning()) {
          node.stop();
          } else {
          node.start();
          }
          }
          }
          };
          </script>


          Online demo: https://codesandbox.io/s/lxlqzok2m9







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 at 18:32









          lavrton

          6,64221229




          6,64221229












          • Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
            – Arx
            Nov 23 at 14:00






          • 1




            @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
            – lavrton
            Nov 23 at 14:25










          • Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
            – Arx
            Nov 23 at 15:49










          • That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
            – lavrton
            Nov 23 at 15:53


















          • Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
            – Arx
            Nov 23 at 14:00






          • 1




            @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
            – lavrton
            Nov 23 at 14:25










          • Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
            – Arx
            Nov 23 at 15:49










          • That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
            – lavrton
            Nov 23 at 15:53
















          Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
          – Arx
          Nov 23 at 14:00




          Thank you, this works! It should be noted, however, that the config for the sprite must either be directly in the template (as is the case in your example), or it has to be extracted as a computed property - example here. When using the data() for the config, it doesn't work, as the image is loaded after mounting. Example of what I mean (using data, not working)
          – Arx
          Nov 23 at 14:00




          1




          1




          @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
          – lavrton
          Nov 23 at 14:25




          @Arx you demo is not correct. this.image doesn't exist and image is not defined in data (instead it is defined deeply under configSprite). So vue doesn't know it needs to update the component when you use this.image = image. Here is fixed version: codesandbox.io/s/llj376q6z9
          – lavrton
          Nov 23 at 14:25












          Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
          – Arx
          Nov 23 at 15:49




          Hmm - but in my example, this.image in fact exists - it is right under configSprite object, not nested inside it (please check the brackets again). Here is the same example where I moved the image property higher so that it is clearer. Anyway, the approach in your example (setting this.configSprite.image directly) works, thank you for that!
          – Arx
          Nov 23 at 15:49












          That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
          – lavrton
          Nov 23 at 15:53




          That property is here. But later you use this.image in configSprite. What it refers to? I think vm instance don't have that property defined when data is called. And it will be not automatically redefined when you set this.image = image.
          – lavrton
          Nov 23 at 15:53


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53434820%2fhow-to-use-sprite-objects-animations-in-vue-konva%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          What visual should I use to simply compare current year value vs last year in Power BI desktop

          How to ignore python UserWarning in pytest?

          Alexandru Averescu