content-warn.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <!-- eslint-disable vue/multi-word-component-names -->
  2. <template>
  3. <!-- 主体内容部分 -->
  4. <div class="content">
  5. <!-- 背景 -->
  6. <img v-if="background.show && background.type === 'image'" class="content__background" :src="background.link" />
  7. <video
  8. v-if="background.show && background.type === 'video'"
  9. class="content__background content__background_video"
  10. width="100%"
  11. autoplay
  12. loop
  13. muted
  14. disablepictureinpicture
  15. playsinline
  16. >
  17. <source :src="background.link" />
  18. Not Supportted Link Or Browser
  19. </video>
  20. <div class="flex w-full h-full" :style="{ flexDirection: layout.direction }">
  21. <div v-for="config in layoutConfig" :key="config.name" :style="{ flexBasis: config.basis, overflow: config.overflow ? 'hidden' : 'hidden' }">
  22. <!-- 告示板部分 -->
  23. <template v-if="config.name === 'board'">
  24. <div class="content__module flex flex-justify-around flex-items-center flex-wrap">
  25. <MiniBoard
  26. v-for="item in config.items"
  27. :key="item.prop"
  28. :label="item.label"
  29. :value="item.value"
  30. :dw="item.dw"
  31. :type="config.type"
  32. :layout="config.layout"
  33. />
  34. </div>
  35. </template>
  36. <template v-if="config.name === 'dz_list'">
  37. <DzList :deviceType="deviceType" :listOption="config.config.listOption" :listData="config.data"></DzList>
  38. </template>
  39. <template v-if="config.name === 'dz_card'">
  40. <DzCard
  41. :deviceType="deviceType"
  42. :titleLeft="config.config.leftTitle"
  43. :titleRight="config.config.rightTitle"
  44. :paramData="config.data"
  45. ></DzCard>
  46. </template>
  47. <!-- <template v-if="config.name === 'yj_risk'">
  48. <yjRisk :riskData="config.data"></yjRisk>
  49. </template> -->
  50. <template v-if="config.name === 'yj_chart'">
  51. <yjChart :paramData="config.data"></yjChart>
  52. </template>
  53. <template v-if="config.name === 'yj_gas'">
  54. <yjGas :type="config.config.type" :titleData="config.config.titleData" :gasData="config.data"></yjGas>
  55. </template>
  56. <template v-if="config.name === 'yj_ventWarn'">
  57. <yjVentWarn :ventData="config.data"></yjVentWarn>
  58. </template>
  59. </div>
  60. </div>
  61. </div>
  62. </template>
  63. <script lang="ts" setup>
  64. import { computed } from 'vue';
  65. import {
  66. CommonItem,
  67. Config,
  68. ModuleDataBoard,
  69. ModuleDataChart,
  70. ModuleDataList,
  71. ModuleDataPreset,
  72. ModuleDataTable,
  73. } from '../../../../deviceManager/configurationTable/types';
  74. import DzList from '../../green/components/dz-list.vue';
  75. import DzCard from '../../green/components/dz-card.vue';
  76. import yjRisk from './yj_risk.vue';
  77. import yjChart from './yj_chart.vue';
  78. import yjGas from './yj_gasWarn.vue';
  79. import MiniBoard from './detail/MiniBoard-Warn.vue';
  80. import yjVentWarn from './yj_ventWarn.vue';
  81. import { clone } from 'lodash-es';
  82. import { getData, getFormattedText } from '../../hooks/helper';
  83. const props = defineProps<{
  84. data: any;
  85. moduleData: Config['moduleData'];
  86. deviceType: string;
  87. }>();
  88. const { background, layout } = props.moduleData;
  89. // 获取当原始配置带 items 项时的最终 items 配置
  90. function getItems(raw, items: CommonItem[]) {
  91. return items.map((i) => {
  92. return {
  93. ...i,
  94. label: getFormattedText(raw, i.label, i.trans),
  95. value: getFormattedText(raw, i.value, i.trans),
  96. };
  97. });
  98. }
  99. // 获取当 List 组件配置带 items 项时的最终 items 配置
  100. function getListItems(raw: any, items: CommonItem[], mapFromData?: boolean) {
  101. if (mapFromData && Array.isArray(raw)) {
  102. return raw.map((data) => {
  103. const item = items[0];
  104. return {
  105. ...item,
  106. label: getFormattedText(data, item.label, item.trans),
  107. value: getFormattedText(data, item.value, item.trans),
  108. };
  109. });
  110. }
  111. return getItems(raw, items);
  112. }
  113. /** 根据配置里的layout将配置格式化为带 key 的具体配置,例如:[{ key: 'list', value: any, ...ModuleDataList }] */
  114. const layoutConfig = computed(() => {
  115. const refData = props.data;
  116. const board = clone(props.moduleData.board) || [];
  117. const list = clone(props.moduleData.list) || [];
  118. const gallery = clone(props.moduleData.gallery) || [];
  119. const complex_list = clone(props.moduleData.complex_list) || [];
  120. const gallery_list = clone(props.moduleData.gallery_list) || [];
  121. const tabs = clone(props.moduleData.tabs) || [];
  122. const chart = clone(props.moduleData.chart) || [];
  123. const table = clone(props.moduleData.table) || [];
  124. const preset = clone(props.moduleData.preset) || [];
  125. return layout.items.reduce((arr: any[], item) => {
  126. switch (item.name) {
  127. case 'board': {
  128. const cfg = board.shift();
  129. if (!cfg) break;
  130. const data = getData(refData, cfg.readFrom, cfg.parser);
  131. arr.push({
  132. overflow: true,
  133. ...item,
  134. ...cfg,
  135. items: getItems(data, cfg.items),
  136. });
  137. break;
  138. }
  139. case 'list': {
  140. const cfg = list.shift();
  141. if (!cfg) break;
  142. const data = getData(refData, cfg.readFrom, cfg.parser);
  143. arr.push({
  144. overflow: true,
  145. ...item,
  146. ...cfg,
  147. items: getListItems(data, cfg.items, cfg.mapFromData),
  148. });
  149. break;
  150. }
  151. case 'gallery': {
  152. const cfg = gallery.shift();
  153. if (!cfg) break;
  154. const data = getData(refData, cfg.readFrom, cfg.parser);
  155. arr.push({
  156. overflow: true,
  157. ...item,
  158. ...cfg,
  159. items: getItems(data, cfg.items),
  160. });
  161. break;
  162. }
  163. case 'complex_list': {
  164. const cfg = complex_list.shift();
  165. if (!cfg) break;
  166. const data = getData(refData, cfg.readFrom, cfg.parser);
  167. if (cfg.mapFromData) {
  168. const firstListItem = cfg.items[0];
  169. arr.push({
  170. overflow: true,
  171. ...item,
  172. ...cfg,
  173. items: (data || []).map((d) => {
  174. return {
  175. title: getFormattedText(d, firstListItem.title, firstListItem.trans),
  176. contents: firstListItem.contents.map((e) => {
  177. return {
  178. ...e,
  179. label: getFormattedText(d, e.label, e.trans),
  180. value: getFormattedText(d, e.value, e.trans),
  181. };
  182. }),
  183. };
  184. }),
  185. });
  186. } else {
  187. arr.push({
  188. overflow: true,
  189. ...item,
  190. ...cfg,
  191. items: cfg.items.map((i) => {
  192. return {
  193. title: getFormattedText(data, i.title, i.trans),
  194. contents: i.contents.map((e) => {
  195. return {
  196. ...e,
  197. label: getFormattedText(data, e.label, e.trans),
  198. value: getFormattedText(data, e.value, e.trans),
  199. };
  200. }),
  201. };
  202. }),
  203. });
  204. }
  205. break;
  206. }
  207. case 'gallery_list': {
  208. const cfg = gallery_list.shift();
  209. if (!cfg) break;
  210. const data = getData(refData, cfg.readFrom, cfg.parser);
  211. arr.push({
  212. overflow: true,
  213. ...item,
  214. ...cfg,
  215. items: getItems(data, cfg.items),
  216. galleryItems: getItems(data, cfg.galleryItems),
  217. });
  218. break;
  219. }
  220. case 'tabs': {
  221. const cfg = tabs.shift();
  222. if (!cfg) break;
  223. const data = getData(refData, cfg.readFrom, cfg.parser);
  224. if (cfg.mapFromData) {
  225. const firstListItem = cfg.items[0];
  226. arr.push({
  227. overflow: true,
  228. ...item,
  229. ...cfg,
  230. items: (data || []).map((d) => {
  231. return {
  232. title: getFormattedText(d, firstListItem.title, firstListItem.trans),
  233. contents: firstListItem.contents.map((e) => {
  234. return {
  235. ...e,
  236. label: getFormattedText(d, e.label, e.trans),
  237. value: getFormattedText(d, e.value, e.trans),
  238. };
  239. }),
  240. };
  241. }),
  242. });
  243. } else {
  244. arr.push({
  245. overflow: true,
  246. ...item,
  247. ...cfg,
  248. items: cfg.items.map((i) => {
  249. return {
  250. title: getFormattedText(data, i.title, i.trans),
  251. contents: i.contents.map((e) => {
  252. return {
  253. ...e,
  254. label: getFormattedText(data, e.label, e.trans),
  255. value: getFormattedText(data, e.value, e.trans),
  256. };
  257. }),
  258. };
  259. }),
  260. });
  261. }
  262. break;
  263. }
  264. case 'chart': {
  265. const cfg = chart.shift();
  266. if (!cfg) break;
  267. const data = getData(refData, cfg.readFrom, cfg.parser);
  268. arr.push({
  269. ...item,
  270. config: cfg,
  271. data,
  272. });
  273. break;
  274. }
  275. case 'table': {
  276. const cfg = table.shift();
  277. if (!cfg) break;
  278. const data = getData(refData, cfg.readFrom, cfg.parser);
  279. arr.push({
  280. ...cfg,
  281. ...item,
  282. columns: cfg.columns,
  283. data,
  284. });
  285. break;
  286. }
  287. default: {
  288. const cfg = preset.shift();
  289. if (!cfg) break;
  290. const data = getData(refData, cfg.readFrom, cfg.parser);
  291. arr.push({
  292. ...item,
  293. data,
  294. config: cfg,
  295. });
  296. break;
  297. }
  298. }
  299. return arr;
  300. }, []);
  301. });
  302. </script>
  303. <style lang="less" scoped>
  304. @import '@/design/theme.less';
  305. .content {
  306. height: calc(100% - 30px);
  307. position: relative;
  308. // z-index: -2;
  309. display: flex;
  310. flex-direction: column;
  311. }
  312. .content__background {
  313. width: 100%;
  314. height: 100%;
  315. position: absolute;
  316. top: 0;
  317. left: 0;
  318. z-index: 0;
  319. object-fit: fill;
  320. }
  321. .content__module {
  322. width: 100%;
  323. height: 100%;
  324. }
  325. // .content__module:first-of-type {
  326. // margin-top: 0;
  327. // }
  328. // .content__module:last-of-type {
  329. // margin-bottom: 0;
  330. // }
  331. ::-webkit-scrollbar {
  332. width: 5px !important;
  333. }
  334. ::-webkit-scrollbar-thumb {
  335. width: 5px !important;
  336. }
  337. :deep(.zxm-select:not(.zxm-select-customize-input) .zxm-select-selector) {
  338. /* background-color: transparent; */
  339. color: #fff;
  340. }
  341. :deep(.zxm-select-arrow) {
  342. color: #fff;
  343. }
  344. :deep(.zxm-select-selection-item) {
  345. color: #fff !important;
  346. }
  347. :deep(.zxm-select-selection-placeholder) {
  348. color: #fff !important;
  349. }
  350. :deep(.dialog-overlay) {
  351. width: 100%;
  352. height: 100%;
  353. position: unset;
  354. box-shadow: unset;
  355. }
  356. ::-webkit-scrollbar {
  357. width: 5px !important;
  358. }
  359. ::-webkit-scrollbar-thumb {
  360. width: 5px !important;
  361. }
  362. </style>