layout03UserWidgetS.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <div>
  3. <div class="inner--header--wrap">
  4. <h2
  5. v-if="totalPage > 0"
  6. class="inner--component--title none--after"
  7. >
  8. 상세 현황 ({{ page }}/{{ totalPage }})
  9. </h2>
  10. <h2 v-else>
  11. 상세 현황
  12. </h2>
  13. <p class="inner--component--total">
  14. Total : <span>{{ props.totalCnt }}</span>
  15. </p>
  16. </div>
  17. <div class="inner--content df--block pt--1rem equip--conmp--wrap">
  18. <swiper
  19. :autoplay="{
  20. delay:20000,
  21. disableOnInteraction: false,
  22. }"
  23. :loop="true"
  24. :touch-ratio="0"
  25. :space-between="spaceBetween"
  26. :slides-per-view="1"
  27. :modules="[Autoplay]"
  28. @slide-change="onSlideChange"
  29. >
  30. <swiper-slide
  31. v-for="(slide, index) in props.items"
  32. :key="`user-swiper-slide-${index}`"
  33. >
  34. <div class="tenant--card--wrap">
  35. <div
  36. v-for="(item, idx) in slide"
  37. :key="`user-swiper-slide-item-${idx}`"
  38. :class="item.level"
  39. class="tenant--card"
  40. >
  41. <div class="tenant--name">
  42. <p>{{ item.tenantName }}</p>
  43. </div>
  44. <div class="tenant--per--wrap">
  45. <div class="tenant--per--num">
  46. <span>{{ item.perSubscriber }}</span><span>%</span>
  47. </div>
  48. <div class="tenant--per--bar">
  49. <div class="bg--bar">
  50. <div
  51. class="fill--bar"
  52. style="width: 50%"
  53. >
  54. {{ toRoundFix(item.curSubscriber, 0) }} / {{ toRoundFix(item.maxSubscriber, 0) }}
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </swiper-slide>
  62. </swiper>
  63. </div>
  64. </div>
  65. </template>
  66. <script setup>
  67. /***********************
  68. * import
  69. ************************/
  70. import { useI18n } from "vue-i18n"
  71. import apiUrl from '@/composables/useApi';
  72. import useAxios from '@/composables/useAxios';
  73. import useUtil from '@/composables/useUtil';
  74. import { Swiper, SwiperSlide } from 'swiper/vue';
  75. import { Navigation, Pagination, Autoplay } from 'swiper/modules';
  76. import 'swiper/css';
  77. import 'swiper/swiper-bundle.css'
  78. /***********************
  79. * plugins inject
  80. ************************/
  81. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  82. // props
  83. const props = defineProps({
  84. items: {
  85. type: Array,
  86. default: () => []
  87. },
  88. totalCnt: {
  89. type: Number,
  90. default: 0
  91. }
  92. })
  93. // 참조가능 데이터 설정
  94. defineExpose({})
  95. // 발신 이벤트 선언
  96. const emit = defineEmits([""]);
  97. const i18n = useI18n();
  98. /***********************
  99. * data & created
  100. ************************/
  101. const page = ref(1);
  102. const totalPage = computed(() => Math.floor(props.totalCnt / 8) + (props.totalCnt % 8 == 0 ? 0 : 1))
  103. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  104. const spaceRem = 0.62; // 원하는 rem 값
  105. const spaceRemPx = spaceRem * remToPx();
  106. const spaceBetween = spaceRemPx;
  107. /***********************
  108. * Methods
  109. ************************/
  110. /** Slide onChang Event */
  111. function onSlideChange(swiper) {
  112. if(swiper.realIndex != page.value + 1)
  113. page.value = swiper.realIndex + 1
  114. }
  115. const toRoundFix = (data, digit) => parseFloat(data).toFixed(digit);
  116. </script>