页面树结构
转至元数据结尾
转至元数据起始

接口对象文档

https://smartbi.feishu.cn/docx/NMCmdBVh0ogQBDx3maOc0lVin2g

涉及二开接口对象方法

接口对象:

IDatasetPanel(数据面板)

接口方法:

setFieldsChecked(fieldIds, checked, type)

作用:根据字段ID设置字段勾选状态


名称

类型

说明

输入参数

fieldIds

String || Array

字段ID或ID数组,要设置状态的字段


checked

boolean

true表示选中,false表示取消选中


type

String

可选,字段类型(DIMENSION_NODE/MEASURE_NODE/NAMEDSET_NODE)

返回值



onLocateToTree(fieldId)

作用:根据字段ID定位到树中对应节点


名称

类型

说明

输入参数

fieldId

String

字段ID

返回值



setDatasetHeader(slot)

作用:用于在数据面板顶部添加自定义组件


名称

类型

说明

输入参数

slot

SlotDefine

插槽定义

返回值



二开示例

// 以透视分析为例
import CustomTree from '../control/CustomTree.vue'
this.on(AD_HOC_DATA_PANEL_ON_INIT, (IAdHocDatasetPanel, iAdHocAnalysis) => {
    // 设置自定义树
    IAdHocDatasetPanel.setDatasetHeader({
        component: CustomTree, //自定义常用字段树组件
        props: {
            name: 'customTree',
            title: '常用字段',
            initialData: customTreeData, //自定义常用字段树组件数据
            showCheckbox: true,
            draggable: false
        },
        listeners: {
            'node-click': function ({
                data,
                node
            }) {
                console.log('节点点击:', data)
                if (data.type === 'field') {
                    IAdHocDatasetPanel.onLocateToTree(data.id) // 实现点击字段定位到产品原本数据面板对应字段
                }
            },
            'check': function ({
                data,
                checked
            }) {
                console.log('节点选中状态变化:', data, checked)
                // 只处理叶子节点(字段节点)
                if (data.type === 'field') {
                    IAdHocDatasetPanel.setFieldsChecked([data.id], checked) // 实现勾选取消常用字段树,联动勾选产品数据面板中的字段
                }
            }
        }
    })
 

========== customTreeData 数据 ==========
let customTreeData = [{
        id: 'dimension-folder',
        name: '常用维度',
        label: '常用维度',
        type: 'folder',
        children: [{
                id: 'AUGMENTED_DATASET_LEVEL.I8aaa8015017d97839783ea38017d980a686901b2.Field-SmartbiDemo-null-PUBLIC-orders-ShipRegion-LEVEL-1624587737403',
                name: '发货区域',
                label: '发货区域',
                type: 'field',
                dataType: 'STRING'
            }, {
                id: 'AUGMENTED_DATASET_FIELD.I8aaa8015017d97839783ea38017d980a686901b2.Field-SmartbiDemo-null-PUBLIC-categories-CategoryName',
                name: '产品类别',
                label: '产品类别',
                type: 'field',
                dataType: 'DATE'
            }
        ]
    }, {
        id: 'measure-folder',
        name: '常用度量',
        label: '常用度量',
        type: 'folder',
        children: [{
                id: 'AUGMENTED_DATASET_MEASURE.I8aaa8015017d97839783ea38017d980a686901b2.Field-SmartbiDemo-null-PUBLIC-orders-Freight_1638935325218',
                name: '运费',
                label: '运费',
                type: 'field',
                dataType: 'DOUBLE'
            }, {
                id: 'AUGMENTED_DATASET_MEASURE.I8aaa8015017d97839783ea38017d980a686901b2.Field-SmartbiDemo-null-PUBLIC-orders-Freight_1638935325218',
                name: '运费',
                label: '运费',
                type: 'field',
                dataType: 'DOUBLE'
            }, {
                id: 'AUGMENTED_DATASET_MEASURE.I8aaa8015017d97839783ea38017d980a686901b2.Field-SmartbiDemo-null-PUBLIC-orders-OrderID_1638935571561',
                name: '订单量',
                label: '订单量',
                type: 'field',
                dataType: 'INTEGER'
            }
        ]
    }
]


========== 自定义CustomTree文件 ==========
<!-- src/components/custom-tree/CustomTree.vue -->
<template>
  <div class="custom-tree-container">
    <el-tree
      ref="tree"
      :data="treeData"
      :props="defaultProps"
      node-key="id"
      :highlight-current="true"
      :expand-on-click-node="true"
      :show-checkbox="showCheckbox"
      :default-expand-all="false"
      :accordion="false"
      @node-click="handleNodeClick"
      @check-change="handleCheck">
      <span class="custom-tree-node" slot-scope="{ node }">
        <span>{{ node.label }}</span>
      </span>
    </el-tree>
  </div>
</template>

<script>
export default {
  name: 'CustomTree',
  props: {
    // 初始数据
    initialData: {
      type: Array,
      default: () => []
    },
    // 是否显示复选框
    showCheckbox: {
      type: Boolean,
      default: false
    },
    // 是否允许拖拽
    draggable: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      treeData: [],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    }
  },
  created() {
    // 初始化数据
    this.treeData = this.initialData
  },
  watch: {
    // 监听initialData变化,更新firstLevelKeys
    initialData: {
      handler(newVal) {
        this.treeData = newVal
      },
      deep: true
    }
  },
  methods: {
    // 节点点击事件
    handleNodeClick(data, node) {
      this.$emit('node-click', { data, node })
    },
    // 节点选中事件
    handleCheck(data, checked) {
      this.$emit('check', { data, checked })
    },
    // 对外暴露的方法:设置树数据
    setTreeData(data) {
      this.treeData = data
    },
    // 对外暴露的方法:获取选中的节点
    getCheckedNodes() {
      return this.$refs.tree.getCheckedNodes()
    },
    // 对外暴露的方法:展开指定节点
    expandNode(nodeId) {
      const node = this.$refs.tree.store.nodesMap[nodeId]
      if (node) {
        node.expanded = true
      }
    }
  }
}
</script>

<style scoped>
.custom-tree-container {
  padding: 1px 0 4px 22px;
}

.custom-tree-node {
  flex: 1;
  display: flex;
  align-items: center;
  font-size: 14px;
  padding-right: 8px;
}

/* 使用 Element UI 默认的树节点样式 */
:deep(.el-tree-node__content) {
  height: 32px;
  line-height: 32px;
}

:deep(.el-tree-node__content:hover) {
  background-color: #f5f7fa;
}

:deep(.el-tree-node.is-current > .el-tree-node__content) {
  background-color: #ecf5ff;
}

:deep(.el-tree-node__expand-icon) {
  font-size: 12px;
  margin-right: 4px;
  transition: transform 0.3s ease-in-out;
}

:deep(.el-tree-node__expand-icon.expanded) {
  transform: rotate(90deg);
}

:deep(.el-tree-node__expand-icon.is-leaf) {
  display: none;
}

:deep(.el-checkbox) {
  margin-right: 4px;
}
</style>


  • 无标签