WidgetWrapper.vue
2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<script lang="ts" setup>
  import { useUpdateCenter } from '../../hook/useUpdateCenter';
  import { FrontDataSourceRecord } from '../../types/type';
  import { createVisualBoardContext } from '../../hook/useVisualBoardContext';
  const props = defineProps<{
    dataSource: FrontDataSourceRecord[];
  }>();
  const { update, add, remove } = useUpdateCenter();
  createVisualBoardContext({ update, add, remove });
  defineExpose({ update });
</script>
<template>
  <section class="widget !dark:bg-dark-900">
    <slot name="header"></slot>
    <div class="widget-content">
      <div
        v-for="item in props.dataSource"
        :key="item.id"
        :style="{ width: `${item.width || 100}%`, height: `${item.height || 100}%` }"
        class="widget-item"
      >
        <div class="widget-box">
          <div class="widget-controls-container">
            <slot
              name="controls"
              :record="item"
              :add="add"
              :remove="remove"
              :update="update"
            ></slot>
          </div>
        </div>
      </div>
    </div>
    <slot name="footer"></slot>
  </section>
</template>
<style scoped>
  .widget {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    background-color: #fff;
    border-radius: 3px;
    box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1);
  }
  .widget-content {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    width: 100%;
    height: 100%;
  }
  .widget-box .widget-charts {
    display: flex;
  }
  .widget-item {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    justify-content: center;
    align-items: center;
  }
  .widget-box {
    position: relative;
    width: 100%;
    height: 100%;
  }
  .widget-controls-container {
    flex: 1 1 auto;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .widget-controls-container > div {
    width: 100%;
    height: 100%;
    background-color: red;
  }
  .widget-value {
    font-size: 14px;
    position: absolute;
    width: 100%;
    top: 0;
    text-align: center;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .widget-label {
    font-size: 14px;
    line-height: 1.2;
    text-align: center;
    overflow: hidden;
    text-overflow: ellipsis;
  }
</style>