web 模块 statistics 新页面开发,及相关逻辑接口对接
This commit is contained in:
		
							parent
							
								
									900abc7adc
								
							
						
					
					
						commit
						20a868d203
					
				
							
								
								
									
										486
									
								
								src/views/statistics/Statistics/statistics/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								src/views/statistics/Statistics/statistics/index.vue
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,486 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <div style="height: 100%">
 | 
			
		||||
    <a-card :bordered="false" style="margin-left: 20px; height: 100%">
 | 
			
		||||
      <div class="layout-header">
 | 
			
		||||
        <a-row type="flex" :gutter="20" style="margin-bottom: 20px">
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label">Type</span>
 | 
			
		||||
            <a-select
 | 
			
		||||
              style="width: 234px"
 | 
			
		||||
              v-model="queryParams.systemType"
 | 
			
		||||
              placeholder="select..."
 | 
			
		||||
              show-arrow
 | 
			
		||||
              allowClear
 | 
			
		||||
              :options="typeOptions"
 | 
			
		||||
              @change="typeChange"
 | 
			
		||||
            >
 | 
			
		||||
              <img slot="suffixIcon" src="@/assets/images/global/select-down.png" alt="" />
 | 
			
		||||
            </a-select>
 | 
			
		||||
          </a-col>
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label" style="width: 60px">Stations</span>
 | 
			
		||||
            <a-select
 | 
			
		||||
              style="width: 234px"
 | 
			
		||||
              v-model="stationIds"
 | 
			
		||||
              mode="multiple"
 | 
			
		||||
              placeholder="select..."
 | 
			
		||||
              show-arrow
 | 
			
		||||
              allowClear
 | 
			
		||||
              :options="stationOptions"
 | 
			
		||||
              @change="stationChange"
 | 
			
		||||
            >
 | 
			
		||||
              <img slot="suffixIcon" src="@/assets/images/global/select-down.png" alt="" />
 | 
			
		||||
            </a-select>
 | 
			
		||||
          </a-col>
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label">Nuclide</span>
 | 
			
		||||
            <a-select
 | 
			
		||||
              style="width: 234px"
 | 
			
		||||
              v-model="queryParams.nuclideNames"
 | 
			
		||||
              mode="multiple"
 | 
			
		||||
              :maxTagCount="1"
 | 
			
		||||
              placeholder="select..."
 | 
			
		||||
              show-arrow
 | 
			
		||||
              allowClear
 | 
			
		||||
              :options="nuclideOptions"
 | 
			
		||||
            >
 | 
			
		||||
              <img slot="suffixIcon" src="@/assets/images/global/select-down.png" alt="" />
 | 
			
		||||
            </a-select>
 | 
			
		||||
          </a-col>
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label">Data Source</span>
 | 
			
		||||
            <a-select
 | 
			
		||||
              style="width: 237px"
 | 
			
		||||
              v-model="queryParams.dbName"
 | 
			
		||||
              placeholder="select..."
 | 
			
		||||
              show-arrow
 | 
			
		||||
              allowClear
 | 
			
		||||
              :options="sourceOptions"
 | 
			
		||||
            >
 | 
			
		||||
              <img slot="suffixIcon" src="@/assets/images/global/select-down.png" alt="" />
 | 
			
		||||
            </a-select>
 | 
			
		||||
          </a-col>
 | 
			
		||||
        </a-row>
 | 
			
		||||
        <a-row type="flex" :gutter="20">
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label">Time</span>
 | 
			
		||||
            <a-date-picker style="width: 234px" :value="moment(queryParams.startDate)" @change="startDateChange" />
 | 
			
		||||
          </a-col>
 | 
			
		||||
          <a-col>
 | 
			
		||||
            <span class="item-label" style="width: 60px; text-align: right">to</span>
 | 
			
		||||
            <a-date-picker style="width: 234px" :value="moment(queryParams.endDate)" @change="endDateChange" />
 | 
			
		||||
          </a-col>
 | 
			
		||||
        </a-row>
 | 
			
		||||
        <div class="layout-header-btns">
 | 
			
		||||
          <a-button class="search-btn" type="primary" @click="handleSearch">
 | 
			
		||||
            <img src="@/assets/images/global/search.png" alt="" />
 | 
			
		||||
            Search
 | 
			
		||||
          </a-button>
 | 
			
		||||
          <a-button type="primary" @click="handleExport">
 | 
			
		||||
            <img src="@/assets/images/spectrum/download.png" />
 | 
			
		||||
            Export to Excel
 | 
			
		||||
          </a-button>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="layout-chart">
 | 
			
		||||
        <a-spin :spinning="spinning" style="height: 100%; width: 100%">
 | 
			
		||||
          <!-- 一个台站 -->
 | 
			
		||||
          <div v-if="!isCharts" class="layout-chart-one">
 | 
			
		||||
            <BoxTitle :title="titleOne" />
 | 
			
		||||
            <div class="layout-chart-one-one" id="chartOne"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- 两个台站 -->
 | 
			
		||||
          <template v-if="isCharts">
 | 
			
		||||
            <div class="layout-chart-left">
 | 
			
		||||
              <BoxTitle :title="titleLeft" />
 | 
			
		||||
              <div class="layout-chart-left-left" id="chartLeft"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="layout-chart-right">
 | 
			
		||||
              <BoxTitle :title="titleRight" />
 | 
			
		||||
              <div class="layout-chart-right-right" id="chartRight"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </template>
 | 
			
		||||
        </a-spin>
 | 
			
		||||
      </div>
 | 
			
		||||
    </a-card>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import * as echarts from 'echarts'
 | 
			
		||||
import { cloneDeep } from 'lodash'
 | 
			
		||||
import BoxTitle from '@/views/abnormalAlarm/components/boxTitle.vue'
 | 
			
		||||
import { getAction, getFileAction } from '../../../../api/manage'
 | 
			
		||||
import { saveAs } from 'file-saver'
 | 
			
		||||
import moment from 'moment'
 | 
			
		||||
const commonOptions = {
 | 
			
		||||
  grid: {
 | 
			
		||||
    top: 30,
 | 
			
		||||
    left: 20,
 | 
			
		||||
    right: 18,
 | 
			
		||||
    bottom: 35,
 | 
			
		||||
    containLabel: true,
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: {
 | 
			
		||||
    trigger: 'axis',
 | 
			
		||||
  },
 | 
			
		||||
  legend: {
 | 
			
		||||
    inactiveColor: '#333',
 | 
			
		||||
    lineStyle: {
 | 
			
		||||
      inactiveColor: '#333',
 | 
			
		||||
    },
 | 
			
		||||
    textStyle: {
 | 
			
		||||
      color: '#9ab1bc',
 | 
			
		||||
    },
 | 
			
		||||
    data: [],
 | 
			
		||||
  },
 | 
			
		||||
  toolbox: {
 | 
			
		||||
    feature: {
 | 
			
		||||
      saveAsImage: {},
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  xAxis: {
 | 
			
		||||
    type: 'category',
 | 
			
		||||
    name: 'Collect Start',
 | 
			
		||||
    nameLocation: 'middle',
 | 
			
		||||
    nameTextStyle: {
 | 
			
		||||
      fontSize: 18,
 | 
			
		||||
    },
 | 
			
		||||
    nameGap: 35,
 | 
			
		||||
    boundaryGap: false,
 | 
			
		||||
    splitLine: {
 | 
			
		||||
      show: true,
 | 
			
		||||
      interval: 'auto',
 | 
			
		||||
      lineStyle: {
 | 
			
		||||
        color: 'rgba(119, 181, 213, .3)',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    axisTick: {
 | 
			
		||||
      show: false,
 | 
			
		||||
    },
 | 
			
		||||
    axisLine: {
 | 
			
		||||
      lineStyle: {
 | 
			
		||||
        color: 'rgba(119, 181, 213, .3)',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    axisLabel: {
 | 
			
		||||
      fontSize: 12,
 | 
			
		||||
      color: '#ade6ee',
 | 
			
		||||
    },
 | 
			
		||||
    data: [],
 | 
			
		||||
  },
 | 
			
		||||
  yAxis: {
 | 
			
		||||
    type: 'value',
 | 
			
		||||
    splitLine: {
 | 
			
		||||
      lineStyle: {
 | 
			
		||||
        color: 'rgba(119, 181, 213, .3)',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    axisTick: {
 | 
			
		||||
      show: false,
 | 
			
		||||
    },
 | 
			
		||||
    axisLine: {
 | 
			
		||||
      lineStyle: {
 | 
			
		||||
        color: 'rgba(119, 181, 213, .3)',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    axisLabel: {
 | 
			
		||||
      fontSize: 12,
 | 
			
		||||
      color: '#ade6ee',
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  series: [],
 | 
			
		||||
}
 | 
			
		||||
export default {
 | 
			
		||||
  components: {
 | 
			
		||||
    BoxTitle,
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    this.chartOneOption = cloneDeep(commonOptions)
 | 
			
		||||
    this.chartLeftOption = cloneDeep(commonOptions)
 | 
			
		||||
    this.chartRightOption = cloneDeep(commonOptions)
 | 
			
		||||
    return {
 | 
			
		||||
      typeOptions: [
 | 
			
		||||
        {
 | 
			
		||||
          label: 'Particulate',
 | 
			
		||||
          value: 'Particulate',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          label: 'Noble Gas HPGe',
 | 
			
		||||
          value: 'gamma',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          label: 'Noble Gas Beta-Gamma',
 | 
			
		||||
          value: 'beta',
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      sourceOptions: [
 | 
			
		||||
        {
 | 
			
		||||
          label: ' Auto DB',
 | 
			
		||||
          value: 'auto',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          label: 'Interactive DB',
 | 
			
		||||
          value: 'interactive',
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      stationOptions: [],
 | 
			
		||||
      nuclideOptions: [],
 | 
			
		||||
      dataSouceOptions: [],
 | 
			
		||||
      stationIds: undefined,
 | 
			
		||||
      queryParams: {
 | 
			
		||||
        systemType: undefined,
 | 
			
		||||
        nuclideNames: undefined,
 | 
			
		||||
        dbName: undefined,
 | 
			
		||||
        startDate: moment().format('YYYY-MM-DD'),
 | 
			
		||||
        endDate: moment().format('YYYY-MM-DD'),
 | 
			
		||||
      },
 | 
			
		||||
      menuName: '',
 | 
			
		||||
      titleOne: 'Nuclide History',
 | 
			
		||||
      titleLeft: 'Nuclide History',
 | 
			
		||||
      titleRight: 'Nuclide History',
 | 
			
		||||
      chartOne: null,
 | 
			
		||||
      chartLeft: null,
 | 
			
		||||
      chartRight: null,
 | 
			
		||||
      spinning: false,
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    isCharts() {
 | 
			
		||||
      return Array.isArray(this.stationIds) && this.stationIds.length == 2 ? true : false
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    moment,
 | 
			
		||||
    typeChange(val) {
 | 
			
		||||
      this.queryParams.systemType = val
 | 
			
		||||
      if ('Particulate') this.menuName = 'Particulate'
 | 
			
		||||
      if ('gamma') this.menuName = 'Noble Gas HPGe'
 | 
			
		||||
      if ('beta') this.menuName = 'Noble Gas Beta-Gamma'
 | 
			
		||||
      this.getStations()
 | 
			
		||||
      this.getNuclide()
 | 
			
		||||
    },
 | 
			
		||||
    getStations() {
 | 
			
		||||
      getAction('/webStatistics/findStationList', { menuName: this.menuName }).then((res) => {
 | 
			
		||||
        if (res.success) {
 | 
			
		||||
          if (res.result.length > 0) {
 | 
			
		||||
            this.stationOptions = res.result.map((res) => ({
 | 
			
		||||
              label: res.stationCode,
 | 
			
		||||
              value: res.stationId,
 | 
			
		||||
              disabled: false,
 | 
			
		||||
            }))
 | 
			
		||||
          } else {
 | 
			
		||||
            this.stationList = []
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this.$message.warning('This operation fails. Contact your system administrator')
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    getNuclide() {
 | 
			
		||||
      getAction('/webStatistics/findNuclideList', { systemType: this.queryParams.systemType }).then((res) => {
 | 
			
		||||
        if (res.success) {
 | 
			
		||||
          if (res.result.length > 0) {
 | 
			
		||||
            this.nuclideOptions = res.result.map((res) => ({ label: res.nuclideName, value: res.nuclideName }))
 | 
			
		||||
          } else {
 | 
			
		||||
            this.nuclideOptions = []
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this.$message.warning('This operation fails. Contact your system administrator')
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    stationChange(val) {
 | 
			
		||||
      if (this.chartOne) this.chartOne.dispose()
 | 
			
		||||
      if (this.chartLeft) this.chartLeft.dispose()
 | 
			
		||||
      if (this.chartRight) this.chartRight.dispose()
 | 
			
		||||
      this.stationIds = val
 | 
			
		||||
      if (val.length == 2) {
 | 
			
		||||
        this.stationOptions.forEach((item) => {
 | 
			
		||||
          if (!val.includes(item.value)) {
 | 
			
		||||
            item.disabled = true
 | 
			
		||||
          } else {
 | 
			
		||||
            item.disabled = false
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      } else {
 | 
			
		||||
        this.stationOptions.forEach((item) => (item.disabled = false))
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    startDateChange(date, dateString) {
 | 
			
		||||
      this.queryParams.startDate = dateString
 | 
			
		||||
    },
 | 
			
		||||
    endDateChange(date, dateString) {
 | 
			
		||||
      this.queryParams.endDate = dateString
 | 
			
		||||
    },
 | 
			
		||||
    handleSearch() {
 | 
			
		||||
      if (this.chartOne) this.chartOne.clear()
 | 
			
		||||
      if (this.chartLeft) this.chartLeft.clear()
 | 
			
		||||
      if (this.chartRight) this.chartRight.clear()
 | 
			
		||||
      if (this.stationIds.length == 1) {
 | 
			
		||||
        this.chartOne = echarts.init(document.getElementById('chartOne'))
 | 
			
		||||
        // this.queryParams.stationId = this.stationIds[0]
 | 
			
		||||
        let params = {
 | 
			
		||||
          ...this.queryParams,
 | 
			
		||||
          stationId: this.stationIds[0],
 | 
			
		||||
        }
 | 
			
		||||
        this.chartOneOption.series = []
 | 
			
		||||
        this.getChartDate(params, this.chartOne, this.chartOneOption, 'one')
 | 
			
		||||
      } else {
 | 
			
		||||
        this.stationIds.forEach((id, index) => {
 | 
			
		||||
          // this.queryParams.stationId = id
 | 
			
		||||
          let params = {
 | 
			
		||||
            ...this.queryParams,
 | 
			
		||||
            stationId: id,
 | 
			
		||||
          }
 | 
			
		||||
          if (index == 0) {
 | 
			
		||||
            this.chartLeftOption.series = []
 | 
			
		||||
            this.chartLeft = echarts.init(document.getElementById('chartLeft'))
 | 
			
		||||
            this.getChartDate(params, this.chartLeft, this.chartLeftOption, 'left')
 | 
			
		||||
          } else {
 | 
			
		||||
            this.chartRightOption.series = []
 | 
			
		||||
            this.chartRight = echarts.init(document.getElementById('chartRight'))
 | 
			
		||||
            this.getChartDate(params, this.chartRight, this.chartRightOption, 'right')
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    async getChartDate(params, chart, option, type) {
 | 
			
		||||
      this.spinning = true
 | 
			
		||||
      let { legend, xAxis, series, toolbox } = option
 | 
			
		||||
      const { success, message, result } = await getAction('/webStatistics/findNuclideStatistics', {
 | 
			
		||||
        ...params,
 | 
			
		||||
      })
 | 
			
		||||
      if (success) {
 | 
			
		||||
        this.spinning = false
 | 
			
		||||
        if (type === 'one') this.titleOne = `${result.STATION_NAME}:Nuclide History`
 | 
			
		||||
        if (type === 'left') this.titleLeft = `${result.STATION_NAME}:Nuclide History`
 | 
			
		||||
        if (type === 'right') this.titleRight = `${result.STATION_NAME}:Nuclide History`
 | 
			
		||||
        legend.data = Object.keys(result).filter((item) => item !== 'CollectStart')
 | 
			
		||||
        xAxis.data = result.CollectStart
 | 
			
		||||
        toolbox.feature.saveAsImage.name = `${result.STATION_NAME}:Nuclide History`
 | 
			
		||||
        for (const key in result) {
 | 
			
		||||
          let param = null
 | 
			
		||||
          if (Object.hasOwnProperty.call(result, key) && key !== 'CollectStart') {
 | 
			
		||||
            const element = result[key]
 | 
			
		||||
            param = {
 | 
			
		||||
              type: 'line',
 | 
			
		||||
              name: key,
 | 
			
		||||
              smooth: true,
 | 
			
		||||
              showSymbol: false,
 | 
			
		||||
              animation: false,
 | 
			
		||||
              lineStyle: {
 | 
			
		||||
                normal: {
 | 
			
		||||
                  width: 2,
 | 
			
		||||
                },
 | 
			
		||||
              },
 | 
			
		||||
              data: element,
 | 
			
		||||
            }
 | 
			
		||||
            series.push(param)
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        chart.setOption(option)
 | 
			
		||||
      } else {
 | 
			
		||||
        this.spinning = false
 | 
			
		||||
        this.$message.warning('This operation fails. Contact your system administrator')
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleExport() {
 | 
			
		||||
      if (this.stationIds && this.stationIds.length > 0) {
 | 
			
		||||
        let params = {
 | 
			
		||||
          stationIds: this.stationIds,
 | 
			
		||||
          ...this.queryParams,
 | 
			
		||||
        }
 | 
			
		||||
        getFileAction('/webStatistics/exportNuclideStatistics', params).then((res) => {
 | 
			
		||||
          if (res.code && res.code == 500) {
 | 
			
		||||
            this.$message.warning('This operation fails. Contact your system administrator')
 | 
			
		||||
          } else {
 | 
			
		||||
            const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
 | 
			
		||||
            saveAs(blob, `Statistics-${moment().format('YYYY-MM-DD hh:mm:ss')}`)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      } else {
 | 
			
		||||
        this.$message.warning('No downloadable data')
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    filterOption(input, option) {
 | 
			
		||||
      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="less" scoped>
 | 
			
		||||
.ant-select {
 | 
			
		||||
  .ant-select-arrow-icon {
 | 
			
		||||
    transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
 | 
			
		||||
  }
 | 
			
		||||
  &-open {
 | 
			
		||||
    .ant-select-arrow-icon {
 | 
			
		||||
      transform: rotate(180deg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.layout-header {
 | 
			
		||||
  padding: 10px;
 | 
			
		||||
  height: 106px;
 | 
			
		||||
  border-top: 1px solid rgba(12, 235, 201, 0.3);
 | 
			
		||||
  border-bottom: 1px solid rgba(12, 235, 201, 0.3);
 | 
			
		||||
  background-color: rgba(12, 235, 201, 0.05);
 | 
			
		||||
  position: relative;
 | 
			
		||||
  margin-bottom: 20px;
 | 
			
		||||
  .item-label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-family: MicrosoftYaHei;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    margin-right: 10px;
 | 
			
		||||
    letter-spacing: 1px;
 | 
			
		||||
    color: #ade6ee;
 | 
			
		||||
  }
 | 
			
		||||
  &-btns {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    right: 10px;
 | 
			
		||||
    bottom: 10px;
 | 
			
		||||
    .search-btn {
 | 
			
		||||
      margin-right: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    img {
 | 
			
		||||
      margin-right: 10px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
.layout-chart {
 | 
			
		||||
  height: calc(100% - 126px);
 | 
			
		||||
  // display: flex;
 | 
			
		||||
  // gap: 20px;
 | 
			
		||||
  /deep/.ant-spin-container {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  &-one {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    &-one {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: calc(100% - 40px);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  &-left {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 50%;
 | 
			
		||||
    &-left {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: calc(100% - 40px);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  &-right {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 50%;
 | 
			
		||||
    &-right {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: calc(100% - 40px);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user