作者:管理员  历史版本:1  最后编辑:龚清  更新时间:2024-11-20 15:41

基础功能

将列表数据以卡片得形式展示。


当ibps-card-list元素中注入对应得参数属性后得效果,一般作为容器使用。

<template>
  <ibps-card-list
    ref="crud"
    :title="title"
    :height="height"
    :data="listData"
    :width="width"
    :pagination="pagination"
    :pk-key="pkKey"
    :toolbars="listConfig.toolbars"
    :search-form="listConfig.searchForm"
    :columns="listConfig.columns"
    :row-handle="listConfig.rowHandle"
    :loading="loading"
    :create-text="createText"
    :identity="identity"
    @action-event="handleAction"
    @sort-change="handleSortChange"
    @pagination-change="handlePaginationChange"
  >
    <template slot="west">
      <ibps-type-tree
        :width="width"
        :height="treeHeight"
        :has-contextmenu="true"
        :category-key="categoryKey"
        :identity="DATATEMPLATE_TREE"
        :title="$t('platform.data.data-template.data-template-classification')"
        position="west"
        @node-click="handleNodeClick"
        @expand-collapse="handleExpandCollapse"
      />
    </template>
    <template slot="searchForm">
      <el-form class="search-form" inline @keyup.enter.native.stop="search">
        <el-form-item>
          <ibps-toolbar
            :identity="identity"
            :actions="listConfig.toolbars"
            @action-event="handleActionEvent"
          />
        </el-form-item>
        <el-form-item class="ibps-fr ibps-mr-20">
          <el-select
            v-model="searchTemplateType"
            :placeholder="$t('platform.data.data-template.select-type')"
            style="width: 100px;"
            class="ibps-pr-5 international-group ibps-fl"
            clearable
            @change="search"
          >
            <el-option
              v-for="item in templateTypeOptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
          <template v-if="i18nEnable">
            <el-select
              v-model="searchName"
              :placeholder="$t('common.placeholder.please-select')"
              style="width: 100px;"
              class="ibps-pr-5 international-group ibps-fl"
              @change="changeSearchField"
            >
              <el-option
                v-for="option in searchFieldOptions"
                :key="option.value"
                :label="option.label"
                :value="option.value"
              />
            </el-select>
            <!-- 国际化搜索框 模板名称使用国际化,模板key不使用国际化-->
            <ibps-international-select
              v-if="isShowInternationSelect"
              v-model="searchField"
              :placeholder="searchPlaceholder"
              class="data-template-international-select-search"
              @change="search"
            />
            <el-input
              v-else
              v-model="searchField"
              :placeholder="searchPlaceholder"
              style="width: 199px;margin-left: -6px;"
              class="data-template-input-key ibps-fl ibps-mr-15"
              clearable
              @change="search"
            />
          </template>
          <template v-else>
            <el-input
              v-model="searchField"
              :placeholder="searchPlaceholder"
              clearable
              class="input-with-select"
              @change="search"
            >
              <el-select
                slot="prepend"
                v-model="searchName"
                :placeholder="$t('common.placeholder.please-select')"
                @change="changeSearchField"
              >
                <el-option
                  v-for="option in searchFieldOptions"
                  :key="option.value"
                  :label="option.label"
                  :value="option.value"
                />
              </el-select>
            </el-input>
          </template>
          <ibps-toolbar
            :actions="listConfig.searchToolbars"
            :identity="identity"
            position="search"
            @action-event="handleActionEvent"
          />
        </el-form-item>
      </el-form>
    </template>

    <template slot="item-symbol" slot-scope="scope">
      <template v-if="scope.data.type === 'default'">
        <i
          class="symbol-icon"
          :class="
            scope.data.showType === 'list'
              ? 'ibps-icon-table'
              : scope.data.showType === 'tree'
                ? 'ibps-icon-tree'
                : 'ibps-icon-puzzle-piece'
          "
        />
      </template>
      <template v-else-if="scope.data.type === 'dialog'">
        <span class="ibps-icon-stack symbol-icon" style="font-size: 0.55em">
          <i class="ibps-icon-window-maximize ibps-icon-stack-2x" />
          <i
            :class="
              scope.data.showType === 'list'
                ? 'ibps-icon-table'
                : scope.data.showType === 'tree'
                  ? 'ibps-icon-tree'
                  : 'ibps-icon-puzzle-piece'
            "
            class="ibps-icon-stack-1x"
            style="top: 5px"
          />
        </span>
      </template>
      <template v-else>
        <i class="symbol-icon ibps-icon-database" />
      </template>
    </template>

    <!-- 导入数据 -->
    <import-data
      :id="editId"
      :visible="importFormVisible"
      @callback="search"
      @close="(visible) => (importFormVisible = visible)"
    />
    <!-- 复制数据模版 -->
    <copy
      :id="editId"
      :copy-data="copyData"
      :visible="copyDialogFormVisible"
      @close="(visible) => (copyDialogFormVisible = visible)"
    />
    <!--创建数据模版-->
    <create
      :title="createText"
      :type-id="typeId"
      :visible="dialogFormVisible"
      @callback="search"
      @close="(visible) => (dialogFormVisible = visible)"
    />
    <template-builder
      :id="editId"
      :visible="templatebuilderDialogVisible"
      @callback="search"
      @close="(visible) => (templatebuilderDialogVisible = visible)"
    />

    <!--数据模版预览-动态参数-->
    <dynamic-params-preview
      :visible="dynamicParamsDialogVisible"
      :conditions="conditions"
      @close="(visible) => (dynamicParamsDialogVisible = visible)"
      @callback="handleDynamicParams"
    />
    <!--数据模版预览-->
    <data-template-render-preview
      :visible="templateRendererDialogVisible"
      :data="dataTemplate"
      :value="selectedValue"
      :multiple="multiple"
      :label-key="labelKey"
      :dynamic-params="dynamicParams"
      preview
      @close="(visible) => (templateRendererDialogVisible = visible)"
      @action-event="handleTemplaterenderActionEvent"
    />
    <!--数据模版预览-数据-->
    <data-template-render-preview-data
      :visible="previewDialogVisible"
      :data="previewFormData"
      @close="(visible) => (previewDialogVisible = visible)"
    />
  </ibps-card-list>
</template>
<script>
import {
  queryPageList,
  remove,
  exportFile,
  getByKey
} from '@/api/platform/data/dataTemplate'
import ActionUtils from '@/utils/action'
import fecha from '@/utils/fecha'
import FixHeight from '@/mixins/height'
import Identity from '@/constants/identity'
import { templateTypeOptions } from '@/business/platform/data/constants'
import PreviewMixin from '@/business/platform/data/templaterender/preview/mixins/preview'
import IbpsCardList from '@/components/ibps-card-list'
import IbpsTypeTree from '@/business/platform/cat/type/tree'
import Create from './create'
import TemplateBuilder from '@/business/platform/data/templatebuilder/dialog'
import ImportData from './import'
import Copy from './copy'
import DynamicParamsPreview from '@/business/platform/data/templaterender/preview/dynamic-params'
import DataTemplateRenderPreview from '@/business/platform/data/templaterender/preview'
import DataTemplateRenderPreviewData from '@/business/platform/data/templaterender/preview/preview-data'
// 国际化select远程搜索 at 3.18
import IbpsInternationalSelect from '@/views/platform/international/components/ibps-international-select'
// 读取常量是否启用i18n
import { I18N_ENABLE } from '@/constant'
export default {
  components: {
    IbpsTypeTree,
    IbpsCardList,
    Create,
    Copy,
    ImportData,
    TemplateBuilder,
    DynamicParamsPreview,
    DataTemplateRenderPreview,
    DataTemplateRenderPreviewData,
    IbpsInternationalSelect
  },
  mixins: [FixHeight, PreviewMixin],
  data() {
    return {
      width: 220,
      height: 500,
      title: this.$t('platform.data.data-template.data-template-manage'),
      createText: this.$t('platform.data.data-template.create-data-template'),
      categoryKey: 'DATA_TEMPLATE_TYPE',
      typeId: '',
      pkKey: 'id', // 主键  如果主键不是pk需要传主键
      loading: false,
      dialogFormVisible: false,
      templatebuilderDialogVisible: false,
      importFormVisible: false,
      copyDialogFormVisible: false,
      identity: Identity.IBPS.DATA.DATATEMPLATE,
      DATATEMPLATE_TREE: Identity.IBPS.DATA.DATATEMPLATE_TREE,
      dataTemplate: {},
      isShowInternationSelect: true, // 显示国际化搜索框
      copyData: {},

      searchField: '',
      searchName: 'Q^name_^SL',
      searchPlaceholder: this.$t(
        'platform.data.data-template.please-input-template-name'
      ),
      searchFieldOptions: [
        {
          label: this.$t('platform.data.data-template.common.template-name'),
          value: 'Q^name_^SL'
        },
        {
          label: this.$t('platform.data.data-template.common.template-key'),
          value: 'Q^key_^SL'
        }
      ],
      searchTemplateType: '',
      templateTypeOptions,

      editId: '',
      listData: [],
      listConfig: {
        // 查询条件
        searchForm: {
          prop: 'Q^name_^SL',
          label: this.$t('platform.data.data-template.common.template-name')
        },
        searchToolbars: [
          { key: 'search', accessControl: false },
          { key: 'resetSearch', accessControl: false }
        ],
        // 工具栏
        toolbars: [{ key: 'import', type: 'primary' }, { key: 'export' }],

        // 表格字段配置
        columns: [
          {
            prop: 'name',
            label: this.$t('platform.data.data-template.common.template-name')
          }
        ],
        // 管理列
        rowHandle: {
          actions: [
            {
              key: 'preview',
              label: this.$t('platform.data.data-template.preview')
            },
            { key: 'edit', label: this.$t('common.buttons.edit') },
            { key: 'remove', label: this.$t('common.buttons.remove') },
            { key: 'copy', label: this.$t('common.buttons.copy') }
          ]
        }
      },
      pagination: {},
      sorts: {}
    }
  },
  computed: {
    treeHeight() {
      return this.height
    },
    i18nEnable() {
      return I18N_ENABLE
    }
  },
  created() {
    this.loadData()
  },
  beforeDestroy() {
    this.dataTemplate = null
    this.copyData = null
    this.searchFieldOptions = null
    this.listData = null
    this.listConfig = null
    this.pagination = null
    this.sorts = null
  },
  methods: {
    // 加载数据
    loadData() {
      this.loading = true
      queryPageList(this.getSearcFormData())
        .then((response) => {
          ActionUtils.handleListData(this, response.data)
          this.loading = false
        })
        .catch(() => {
          this.loading = false
        })
    },
    /**
     * 获取格式化参数
     */
    getSearcFormData() {
      const params = {}
      if (this.$utils.isNotEmpty(this.searchField)) {
        params[this.searchName] = this.searchField
      }
      if (this.$utils.isNotEmpty(this.typeId)) {
        params['Q^TYPE_ID_^S'] = this.typeId
      }
      if (this.$utils.isNotEmpty(this.searchTemplateType)) {
        params['Q^TYPE_^S'] = this.searchTemplateType
      }
      return ActionUtils.formatParams(params, this.pagination, this.sorts)
    },
    /**
     * 处理分页事件
     */
    handlePaginationChange(page) {
      ActionUtils.setPagination(this.pagination, page)
      this.loadData()
    },
    /**
     * 处理排序
     */
    handleSortChange(sort) {
      ActionUtils.setSorts(this.sorts, sort)
      this.loadData()
    },
    /**
     * 查询
     */
    search() {
      ActionUtils.setFirstPagination(this.pagination)
      this.loadData()
    },

    /**
     * 重置查询
     */
    resetSearch() {
      this.resetSearchForm()
      this.search()
    },
    /**
     * 重置表单
     */
    resetSearchForm() {
      this.searchField = ''
      this.searchTemplateType = ''
      this.searchName = 'Q^name_^SL'
      this.changeSearchField(this.searchName)
    },
    changeSearchField(value) {
      const option = this.searchFieldOptions.find((option) => {
        return option.value === value
      })
      this.searchPlaceholder =
        this.$t('common.placeholder.please-select') + option.label

      if (value === 'Q^name_^SL') {
        this.isShowInternationSelect = true
      } else if (value === 'Q^key_^SL') {
        this.isShowInternationSelect = false
      }
    },
    /**
     * @description 处理按钮的事件 【包含增删改查】
     * @param {*} buttonKey
     * @param {*} position
     * @param {*} data
     */
    handleActionEvent(action, position, data, index) {
      const buttonKey = action.key
      let selection = []
      if (this.$refs.crud) {
        selection = this.$refs.crud.getSelectedIds()
      }
      this.handleAction(buttonKey, position, selection, data)
    },
    handleAction(command, position, selection, data) {
      switch (command) {
        case 'search': // 查询
          this.search()
          break
        case 'resetSearch': // 重置查询
          this.resetSearch()
          break
        case 'add': // 添加
          this.dialogFormVisible = true
          break
        case 'edit': // 编辑
          this.handleEdit(selection)
          break
        case 'remove': // 删除
          ActionUtils.removeRecord(selection)
            .then((ids) => {
              this.handleRemove(ids)
            })
            .catch(() => {})
          break
        case 'import': // 导入
          this.handleImport()
          break
        case 'export': // 导出
          ActionUtils.selectedMultiRecord(selection)
            .then((ids) => {
              this.handleExport(ids)
            })
            .catch(() => {})
          break
        case 'preview': // 预览
          this.handlePreview(data.key)
          break
        case 'copy': // 复制
          this.handleCopy(data)
          break
      }
    },
    handleImport() {
      this.importFormVisible = true
    },
    handleExport(ids) {
      exportFile({ templateIds: ids })
        .then((response) => {
          if (!response) {
            return
          }
          ActionUtils.exportFile(
            response.data,
            'dataTemplate_' + fecha.formatDate('yyyyMMddHHmmss') + '.zip'
          )
        })
        .catch(() => {})
    },
    handleEdit(id) {
      this.templatebuilderDialogVisible = true
      this.editId = id
    },
    handleCopy(data) {
      this.copyDialogFormVisible = true
      this.editId = data.id
      this.copyData = data
    },
    /**
     * 处理删除
     */
    handleRemove(ids) {
      remove({ dataTemplateIds: ids })
        .then((response) => {
          ActionUtils.removeSuccessMessage()
          this.search()
        })
        .catch(() => {})
    },
    handleNodeClick(typeId) {
      this.typeId = typeId
      this.loadData()
    },
    handleExpandCollapse(isExpand) {
      this.width = isExpand ? 200 : 30
    },
    // 预览
    handlePreview(key) {
      // this.dialogLoading = true
      this.dataTemplate = {}
      getByKey({
        dataTemplateKey: key
      })
        .then((response) => {
          // 从后台获取数据
          this.dataTemplate = this.$utils.parseData(response.data)
          setTimeout(() => {
            this.previewTemplate()
          }, 100)
          // this.dialogLoading = false
        })
        .catch(() => {
          // this.dialogLoading = false
        })
    }
  }
}
</script>

<style lang="scss">
.international-group .el-input__inner {
  border-radius: 3px 0 0 3px;
}

.international-group .el-input {
  display: inline-block;
}

.data-template-international-select-search {
  float: left;
  margin-right: 15px;
  margin-left: -6px;
  width: 199px;
  .el-select .el-input.is-focus .el-input__inner {
    border-radius: 0 3px 3px 0;
  }
}
.data-template-international-select-search .el-input__inner {
  border-radius: 0 3px 3px 0;
}
.data-template-input-key {
  .el-input__inner {
    border-radius: 0 3px 3px 0;
  }
}
</style>