廖井涛
2024-07-10 78809560f4315777e770acec0e24cb42e2ca97a7
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -5,14 +5,17 @@
import {ElDatePicker, ElMessage} from "element-plus"
import useProductGlassTypeStore from "@/stores/sd/product/productGlassType"
import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
import {Search} from "@element-plus/icons-vue"
import {ArrowLeftBold, Search} from "@element-plus/icons-vue"
import GlassType from "@/components/sd/product/GlassType.vue"
import {useRouter} from 'vue-router'
import Sortable from 'sortablejs'
import BasicTable from '@/components/basic/BasicTable.vue'
import BasicTable from '@/components/sd/product/BasicTable.vue'
import {VXETable} from "vxe-table";
import useUserInfoStore from "@/stores/userInfo";
import {useI18n} from 'vue-i18n'
import footSum from "@/hook/footSum"
//语言获取
const {t} = useI18n()
let productGlassTypeStore = useProductGlassTypeStore()
let router = useRouter()
const userStore = useUserInfoStore()
@@ -23,18 +26,14 @@
      router.push({path: '/main/processCard/PrintFlowCard', query: {id: row.id}})
      break
    }
    case 'setType': {
      alert('我接收到子组件传送的删除信息')
      break
    }
    case 'delete': {
      request.post(`/processCard/deleteFlowCard/${row.orderId}/${row.processId}`).then((res) => {
        if (res.code == 200) {
          ElMessage.success("删除成功")
          ElMessage.success(t('workOrder.deleteOk'))
          location.reload();
        } else {
          ElMessage.warning(res.msg)
          router.push("/login")
          // router.push("/login")
        }
      })
      break
@@ -142,8 +141,8 @@
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
  id: 'CustomerList',
  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮
  id: 'AddProcessCardRight',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
@@ -155,10 +154,13 @@
    useKey: true
  },
  filterConfig: {   //筛选配置项
                    //remote: true
    //remote: true
  },
  customConfig: {
    storage: true
  },
  sortConfig:{
    multiple:true
  },
  editConfig: {
    trigger: 'click',
@@ -166,17 +168,17 @@
    showStatus: true
  },//表头参数
  columns: [
    {type: 'checkbox', fixed: "left", title: '选择'},
    {type: 'checkbox', fixed: "left", title: t('basicData.check')},
    {
      field: 'orderNumber',
      title: '订序',
      title: t('order.OrderNum'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
    },
    {
      field: 'shape',
      title: '形状',
      title: t('order.shape'),
      showOverflow: "ellipsis",
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
@@ -184,7 +186,7 @@
    },
    {
      field: 'width',
      title: '宽',
      title: t('order.width'),
      sortable: true,
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
@@ -193,18 +195,18 @@
    },
    {
      field: 'height',
      title: '高',
      title: t('order.height'),
      sortable: true,
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width: '60px'
    },
    {field: 'baiscQuantity', title: '待分数量', showOverflow: "ellipsis", width: '60px'},
    {field: 'computeGrossArea', title: '待分面积', width: '60px'},
    {field: 'totalThickness', title: '总厚度', width: '80px'},
    {field: 'thickness', title: '玻璃厚度', width: '60px'},
    {field: 'weight', title: '重量'}
    {field: 'baiscQuantity', title: t('processCard.quantityToDivided'), showOverflow: "ellipsis", width: '60px'},
    {field: 'computeGrossArea', title: t('processCard.areaToDivided'), width: '60px'},
    {field: 'totalThickness', title: t('processCard.totalThickness'), width: '80px'},
    {field: 'thickness', title: t('processCard.glassThickness'), width: '60px'},
    {field: 'weight', title: t('processCard.weight'),slots:{default:'weight_sum'}}
  ],//表头按钮
  toolbarConfig: {
@@ -219,20 +221,30 @@
  },
  data: [],//table body实际数据
  //脚部求和
  footerMethod({columns, data}) {//页脚函数
    let footList = ['', '', '', '', '']
    return [
  footerMethod ({ columns, data }) {//页脚函数
    let count = 0
    return[
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return '合计:'
          return t('basicData.total')
        }
        if (footList.includes(column.field)) {
          return sumNum(data, column.field)
        const List = ["baiscQuantity",'computeGrossArea']
        if (List.includes(column.field)) {
          return footSum(data, column.field)
        }
        if (column.field === 'weight'){
          data.forEach(row => {
            count += weightSum(row)
          })
          return  parseFloat(count.toFixed(2))
        }
        return ''
      })
    ]
  }
  },
})
@@ -243,8 +255,8 @@
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
  id: 'CustomerList',
  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮
  id: 'AddProcessCardLeft',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
@@ -256,7 +268,7 @@
    useKey: true
  },
  filterConfig: {   //筛选配置项
                    //remote: true
    //remote: true
  },
  customConfig: {
    storage: true
@@ -267,18 +279,18 @@
    showStatus: true
  },//表头参数
  columns: [
    {type: 'checkbox', fixed: "left", title: '选择'},
    {type: 'checkbox', fixed: "left", title: t('basicData.check')},
    {
      field: 'processId',
      title: '流程卡号',
      title: t('processCard.processId'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      width: 130,
      width: 100,
      filterMethod: filterChanged
    },
    {
      field: 'orderNumber',
      title: '订序',
      title: t('order.OrderNum'),
      showOverflow: "ellipsis",
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'}
@@ -286,21 +298,27 @@
    },
    {
      field: 'landingSequence',
      title: '小片顺序',
      title: t('processCard.landingSequence'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
    },
    {field: 'shape', title: '形状', filters: [{data: ''}], slots: {filter: 'num1_filter'}, filterMethod: filterChanged},
    {field: 'width', title: '宽', showOverflow: "ellipsis"},
    {field: 'height', title: '高'},
    {field: 'quantity', title: '总数量'},
    {field: 'totalThickness', title: '总厚度'},
    {
      field: 'shape',
      title: t('order.shape'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
    },
    {field: 'width', title: t('order.width'), showOverflow: "ellipsis"},
    {field: 'height', title: t('order.height')},
    {field: 'quantity', title: t('order.quantity')},
    {field: 'totalThickness', title: t('processCard.totalThickness')},
  ],//表头按钮
  toolbarConfig: {
    buttons: [
      {code: 'saveFlowCard', name: '保存', status: 'primary', icon: 'vxe-icon-save'},
      {code: 'saveFlowCard', name: t('basicData.save'), status: 'primary', icon: 'vxe-icon-save'},
    ],
    // import: false,
    // export: true,
@@ -310,15 +328,15 @@
  },
  data: [],//table body实际数据
  //脚部求和
  footerMethod({columns, data}) {//页脚函数
    let footList = ['']
    return [
  footerMethod ({ columns, data }) {//页脚函数
    return[
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return '合计:'
          return t('basicData.total')
        }
        if (footList.includes(column.field)) {
          return sumNum(data, column.field)
        const List = ["quantity",'goodsQuantity','area']
        if (List.includes(column.field)) {
          return footSum(data, column.field)
        }
        return ''
      })
@@ -334,7 +352,7 @@
  const checkedList = $grid.getCheckboxRecords()
  if (checkedList.length === 0) {
    ElMessage.warning("请先选择右侧数据")
    ElMessage.warning(t('processCard.schedulingOk'))
    return
  }
  //productionId
@@ -345,40 +363,39 @@
    index = leftData[0].landingSequence + 1
    //index = index.toString().padStart(2, '0')
  }
  const processId = productionId + index.toString().padStart(2, '0')
  const processId = productionId + index.toString().padStart(3, '0')
  const regex = /^(\d+|)$/;
  if (!regex.test(checkedNum.value)) {
    ElMessage.warning("请输入正整数")
    ElMessage.warning(t('processCard.schedulingNo'))
    return
  }
  //判断正整数
  if (/^[1-9]\d*$/.test(checkedNum.value)) {
    checkedList.forEach((item) => {
      //定义key值保持
      //判断可用数量是否大于等于输入的数量,不满足则抛出异常
      if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error("请输入小于等于可用数量的数字");
      item.quantity =  checkedNum.value
      if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error(t('processCard.schedulingQuantity'));
      item.quantity = checkedNum.value
      item.processId = processId
      item.landingSequence = index
      item.baiscQuantity=item.baiscQuantity - checkedNum.value
    })
    //删除key
    checkedList.forEach((item) => {
      item.baiscQuantity = item.baiscQuantity - checkedNum.value
      item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2)
      //删除key
      let key = item._X_ROW_KEY
      delete item._X_ROW_KEY
      if (item.baiscQuantity===0){
        $grid.remove(checkedList)
      if (item.baiscQuantity === 0) {
        $grid.remove(item)
      }
      $gridLeft.insertAt(checkedList)
      $gridLeft.insertAt(item)
      //重新赋值key
      item._X_ROW_KEY = key
    })
//清除两边复选框
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  }
  else if (checkedNum.value === '') {//判断数量输入框无输入数字
  } else if (checkedNum.value === '') {//判断数量输入框无输入数字
    checkedList.forEach((item) => {
      item.processId = processId
@@ -395,11 +412,7 @@
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  }
}
//向右边表格添加数据
@@ -413,12 +426,12 @@
    const checkedList = $gridLeft.getCheckboxRecords()
    //判断左边表格是否有选中的数据
    if (checkedList.length === 0) {
      ElMessage.warning("请先选择左侧数据")
      ElMessage.warning(t('processCard.schedulingArea'))
      return
    }
    const regex = /^(\d+|)$/;
    if (!regex.test(checkedNum.value)) {
      ElMessage.warning("请输入正整数")
      ElMessage.warning(t('processCard.schedulingNo'))
      return
    }
    //判断正整数
@@ -426,8 +439,11 @@
      //对选中的左边表格数据进行循环
      checkedList.forEach((item) => {
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.quantity < checkedNum.value) throw new Error("请输入小于等于可用数量的数字");
        //左边表格可用数量减去输入的数量
       // if (item.quantity < checkedNum.value*1) throw new Error(t('processCard.schedulingQuantity'));
        if (item.quantity < checkedNum.value*1){
          ElMessage.warning(t('processCard.schedulingQuantity'))
        }
            //左边表格可用数量减去输入的数量
        item.quantity = item.quantity - checkedNum.value
        //右边表格数据
        let rightData = $grid.getTableData().fullData
@@ -435,31 +451,64 @@
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //如果右边表格数据中存在当前数据则数量相加
        if (filterIndex >= 0) {
          //数量
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + checkedNum.value * 1
          //面积
          rightData[filterIndex].computeGrossArea=(rightData[filterIndex].width*rightData[filterIndex].height*rightData[filterIndex].baiscQuantity/1000000).toFixed(2)
          //如果左边数量为0时删除此条数据
          if (item.quantity === 0) {
            $gridLeft.remove(item)
          //删除key
          let key = item._X_ROW_KEY
          delete item._X_ROW_KEY
          if (item.baiscQuantity === 0) {
            $grid.remove(item)
          }
          item._X_ROW_KEY = key
        } else {
          //右边表格没有此条数据则往右边表格插入数据
          item.baiscQuantity = checkedNum.value
          item.computeGrossArea=(item.width*item.height*checkedNum.value/1000000).toFixed(2)
          if (item.quantity === 0) {
            $gridLeft.remove(item)
          }
          $grid.insert(item)
        }
        if (item.quantity === 0) {
          $gridLeft.remove(item)
        }
      })
    } else if (checkedNum.value === '') {//判断数量输入框无输入数字
      checkedList.forEach((item) => {
        //右侧表格
        let rightData = $grid.getTableData().fullData
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //左侧表格
        let leftData = $gridLeft.getTableData().fullData
        let leftfilterIndex = leftData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //无输入并且如果右边表格数据中存在当前数据则数量相加
        if (filterIndex > -1) {
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + item.quantity * 1
          //面积
          rightData[filterIndex].computeGrossArea=(rightData[filterIndex].width*rightData[filterIndex].height*rightData[filterIndex].baiscQuantity/1000000).toFixed(2)
        } else {
          delete item._X_ROW_KEY
          $grid.insert(item)
          // item.baiscQuantity = item.baiscQuantity * 1 + leftData[leftfilterIndex].quantity * 1
          // item.computeGrossArea=(item.width*item.height*item.baiscQuantity/1000000).toFixed(2)
          //item.computeGrossArea=(item.width*item.height*item.baiscQuantity/1000000).toFixed(2)
          // for (let i = 0; i <checkedList.length ; i++) {
          //
          //   if (checkedList[i].orderNumber === item.orderNumber){
          //     console.log(item.baiscQuantity  +"---"+ checkedList[i].quantity )
          //     item.baiscQuantity = item.baiscQuantity * 1 + checkedList[i].quantity * 1
          //   }
          // }
            delete item._X_ROW_KEY
            $grid.insert(item)
        }
        $gridLeft.remove(item)
@@ -487,24 +536,25 @@
    const checkedListLeft = $gridLeft.getCheckboxRecords()
    //判断右边表格是否有选中的数据
    if (checkedList.length * 1 === 0) {
      ElMessage.warning("请先选择右侧数据")
      ElMessage.warning(t('processCard.schedulingOk'))
      return
    }
    if (checkedListLeft.length !== 1) {
      ElMessage.warning("请先选择左侧一条数据")
      ElMessage.warning(t('processCard.schedulingTime'))
      return
    }
    const regex = /^(\d+|)$/;
    if (!regex.test(checkedNum.value)) {
      ElMessage.warning("请输入正整数")
      ElMessage.warning(t('processCard.schedulingNo'))
      return
    }
    //判断正整数
    if (/^[1-9]\d*$/.test(checkedNum.value)) {
      checkedList.forEach((item) => {
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error("请输入小于等于可用数量的数字");
        if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error("请输入小于等于待分数量的数字");
        item.baiscQuantity = item.baiscQuantity - checkedNum.value
        item.computeGrossArea=(item.computeGrossArea-item.width*item.height*checkedNum.value/1000000).toFixed(2)
        //定义key值保持
        let key = item._X_ROW_KEY
        //左边表格数据
@@ -517,15 +567,17 @@
          //如果右边表格数据中存在当前数据则数量相加
          if (filterIndex >= 0) {
            leftData[filterIndex].quantity = leftData[filterIndex].quantity * 1 + checkedNum.value * 1
            leftData[filterIndex].computeGrossArea=(leftData[filterIndex].computeGrossArea-leftData[filterIndex].width*leftData[filterIndex].height*leftData[filterIndex].baiscQuantity/1000000).toFixed(2)
            if (item.baiscQuantity === 0) {
              $grid.remove(checkedList)
              $grid.remove(item)
            }
            //delete item._X_ROW_KEY
          } else {
            item.quantity = checkedNum.value
            item.processId = checkedListLeft[0].processId
            item.landingSequence = checkedListLeft[0].landingSequence
            item.computeGrossArea=(item.computeGrossArea-checkedListLeft[0].width*checkedListLeft[0].height*checkedNum.value/1000000).toFixed(2)
            delete item._X_ROW_KEY
            $gridLeft.insert(item)
            item._X_ROW_KEY = key
@@ -536,28 +588,33 @@
          item.quantity = checkedNum.value
          item.processId = checkedListLeft[0].processId
          item.landingSequence = checkedListLeft[0].landingSequence
          // /item.computeGrossArea=item.computeGrossArea
          if (item.baiscQuantity === 0) {
            $grid.remove(checkedList)
            $grid.remove(item)
          }
          for (let i = 0; i < leftData.length; i++) {
            if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId === item.processId) {
              leftData[i].quantity = leftData[i].quantity * 1 + checkedNum.value * 1
              leftData[i].computeGrossArea=(leftData[i].computeGrossArea-leftData[i].width*leftData[i].height*leftData[i].baiscQuantity/1000000).toFixed(2)
              break
            } else if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            } else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            }else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId == item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            }
            else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            }
          }
        }
@@ -567,6 +624,8 @@
        item.processId = checkedListLeft[0].processId
        item.landingSequence = checkedListLeft[0].landingSequence
        item.quantity = checkedListLeft[0].baiscQuantity
        item.computeGrossArea=(item.computeGrossArea-checkedListLeft[0].width*checkedListLeft[0].height*checkedListLeft[0].baiscQuantity/1000000).toFixed(2)
        delete item._X_ROW_KEY
      })
      $gridLeft.insertAt(checkedList)
@@ -595,15 +654,15 @@
          const $tableRight = xGrid.value
          if ($table) {
            const selectRecords = $table.getCheckboxRecords()
          //  const selectRight = $tableRight.getCheckboxRecords()
            //  const selectRight = $tableRight.getCheckboxRecords()
            let leftData = $tableRight.getTableData().fullData
            if (selectRecords.length === 0) {
              ElMessage.warning("请先选择保存的数据")
              ElMessage.warning(t('processCard.pleaseSelectTheSavedDataFirst'))
              return
            }
            if (leftData.length > 0) {
              ElMessage.warning("请先将右侧数据全部建立流程卡后保存")
              ElMessage.warning(t('processCard.pleaseFirstCreateAProcessCardForAllTheDataOnTheRightSideAndSaveIt'))
              return;
            }
            let flowCardData = ref({
@@ -614,7 +673,7 @@
            request.post("/processCard/addFlowCard", flowCardData.value).then((res) => {
              if (res.code == 200) {
                ElMessage.success("保存成功")
                ElMessage.success(t('basicData.msg.saveSuccess'))
                //router.push('/main/processCard/SplittingDetails?orderId=${orderId}')
                router.push({
                  path: '/main/processCard/AddProcessCard',
@@ -637,6 +696,25 @@
  },
}
const weightSum =  (row) =>{
    return parseFloat((row.baiscQuantity*row.thickness*row.width*row.height*2.5/1000000).toFixed(2))
}
let quantit = ref('')
let weight = ref('')
const handleCheckboxChange=({ row}) =>{
  const $grid = xGrid.value
  //获取右边表格checkbox选中的数据
  const checkedList = $grid.getCheckboxRecords()
  let quantitySum = 0;
  let weightsum=0;
  checkedList.forEach(item => {
    quantitySum += item.baiscQuantity;
    weightsum += weightSum(item);
  });
  quantit.value = quantitySum;
  weight.value = parseFloat(weightsum.toFixed(2));
}
</script>
<template>
@@ -652,7 +730,7 @@
            style="float: left"
            type="primary"
            @click="intoCreateProduct">
          {{ flag ? '返回' : '返回' }}
          {{ flag ? t('processCard.return') : t('processCard.return') }}
        </el-button>
        <!--      <el-button  type="primary">保存分架</el-button>-->
        <!--              <el-button type="primary" :hidden="true">分架汇总</el-button>-->
@@ -665,9 +743,11 @@
          <vxe-grid
              ref="xGridLeft"
              class="mytable-scrollbar"
              height="650px"
              max-height="100%"
              v-bind="gridLeftOptions"
              v-on="gridEvents"
              checkbox-config="{ reserve: true, strict: true }"
          >
            <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
            <!--      下拉显示所有信息插槽-->
@@ -682,12 +762,6 @@
                </li>
              </ul>
            </template>
            <!--左边固定显示的插槽-->
            <template #button_slot="{ row }">
              <el-button link size="small" type="primary" @click="getTableRow(row,'edit')">打印</el-button>
              <el-button link size="small" type="primary" @click="getTableRow(row,'setType')">排版</el-button>
              <el-button link size="small" type="primary" @click="getTableRow(row,'delete')">删除</el-button>
            </template>
            <template #num1_filter="{ column, $panel }">
              <div>
                <div v-for="(option, index) in column.filters" :key="index">
@@ -699,20 +773,27 @@
            </template>
          </vxe-grid>
        </el-aside>
        <div width="12%">
          <el-main style="">
            <span>选中数量:<el-input v-model="checkedNum" clearable type="number"></el-input></span><br>
            <div>
              <span><el-input v-model="quantit"  style="width: 80px;"/></span>
              <span><el-input v-model="weight"  style="width: 80px;"/></span>
            </div>
            <span>{{ $t('processCard.selectedQuantity') }}:<el-input v-model="checkedNum" clearable
                                                                     type="number"></el-input></span><br>
            <el-button type="primary" @click="addRight"> →</el-button>
            <br>
            <br>
            <el-button type="primary" @click="addLeft"> ←</el-button>
            <br>
            <br>
            <el-button type="primary" @click="createProcessCard">建立流程卡</el-button>
            <el-button type="primary" @click="createProcessCard">{{ $t('processCard.establishProcessCards') }}
            </el-button>
          </el-main>
        </div>
@@ -725,8 +806,11 @@
                ref="xGrid"
                class="mytable-scrollbar"
                height="650px"
                max-height="100%"
                v-bind="gridOptions"
                checkbox-config="{ reserve: true, strict: true }"
                @checkbox-change="handleCheckboxChange"
            >
              <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
              <!--      下拉显示所有信息插槽-->
@@ -741,6 +825,9 @@
                  </li>
                </ul>
              </template>
              <template #weight_sum="{ row }">
                <span>{{ weightSum(row) }} </span>
              </template>
              <template #num1_filter="{ column, $panel }">
                <div>