| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 | export default {  props: {    localdata: {      type: [Array, Object],      default () {        return []      }    },    spaceInfo: {      type: Object,      default () {        return {}      }    },    collection: {      type: String,      default: ''    },    action: {      type: String,      default: ''    },    field: {      type: String,      default: ''    },    orderby: {      type: String,      default: ''    },    where: {      type: [String, Object],      default: ''    },    pageData: {      type: String,      default: 'add'    },    pageCurrent: {      type: Number,      default: 1    },    pageSize: {      type: Number,      default: 20    },    getcount: {      type: [Boolean, String],      default: false    },    getone: {      type: [Boolean, String],      default: false    },    gettree: {      type: [Boolean, String],      default: false    },    manual: {      type: Boolean,      default: false    },    value: {      type: [Array, String, Number],      default () {        return []      }    },    modelValue: {      type: [Array, String, Number],      default () {        return []      }    },    preload: {      type: Boolean,      default: false    },    stepSearh: {      type: Boolean,      default: true    },    selfField: {      type: String,      default: ''    },    parentField: {      type: String,      default: ''    },    multiple: {      type: Boolean,      default: false    },    map: {      type: Object,      default() {        return {          text: "text",          value: "value"        }      }    }  },  data() {    return {      loading: false,      errorMessage: '',      loadMore: {        contentdown: '',        contentrefresh: '',        contentnomore: ''      },      dataList: [],      selected: [],      selectedIndex: 0,      page: {        current: this.pageCurrent,        size: this.pageSize,        count: 0      }    }  },  computed: {    isLocaldata() {      return !this.collection.length    },    postField() {      let fields = [this.field];      if (this.parentField) {        fields.push(`${this.parentField} as parent_value`);      }      return fields.join(',');    },    dataValue() {      let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined)      return isModelValue ? this.modelValue : this.value    },    hasValue() {      if (typeof this.dataValue === 'number') {        return true      }      return (this.dataValue != null) && (this.dataValue.length > 0)    }  },  created() {    this.$watch(() => {      var al = [];      ['pageCurrent',        'pageSize',        'spaceInfo',        'value',        'modelValue',        'localdata',        'collection',        'action',        'field',        'orderby',        'where',        'getont',        'getcount',        'gettree'      ].forEach(key => {        al.push(this[key])      });      return al    }, (newValue, oldValue) => {      let needReset = false      for (let i = 2; i < newValue.length; i++) {        if (newValue[i] != oldValue[i]) {          needReset = true          break        }      }      if (newValue[0] != oldValue[0]) {        this.page.current = this.pageCurrent      }      this.page.size = this.pageSize      this.onPropsChange()    })    this._treeData = []  },  methods: {    onPropsChange() {      this._treeData = []    },    getCommand(options = {}) {      /* eslint-disable no-undef */      let db = uniCloud.database(this.spaceInfo)      const action = options.action || this.action      if (action) {        db = db.action(action)      }      const collection = options.collection || this.collection      db = db.collection(collection)      const where = options.where || this.where      if (!(!where || !Object.keys(where).length)) {        db = db.where(where)      }      const field = options.field || this.field      if (field) {        db = db.field(field)      }      const orderby = options.orderby || this.orderby      if (orderby) {        db = db.orderBy(orderby)      }      const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current      const size = options.pageSize !== undefined ? options.pageSize : this.page.size      const getCount = options.getcount !== undefined ? options.getcount : this.getcount      const getTree = options.gettree !== undefined ? options.gettree : this.gettree      const getOptions = {        getCount,        getTree      }      if (options.getTreePath) {        getOptions.getTreePath = options.getTreePath      }      db = db.skip(size * (current - 1)).limit(size).get(getOptions)      return db    },		getNodeData(callback) {		  if (this.loading) {		    return		  }		  this.loading = true		  this.getCommand({		    field: this.postField,				where: this._pathWhere()		  }).then((res) => {		    this.loading = false		    this.selected = res.result.data		    callback && callback()		  }).catch((err) => {		    this.loading = false		    this.errorMessage = err		  })		},    getTreePath(callback) {      if (this.loading) {        return      }      this.loading = true      this.getCommand({        field: this.postField,        getTreePath: {          startWith: `${this.selfField}=='${this.dataValue}'`        }      }).then((res) => {        this.loading = false        let treePath = []        this._extractTreePath(res.result.data, treePath)        this.selected = treePath        callback && callback()      }).catch((err) => {        this.loading = false        this.errorMessage = err      })    },    loadData() {      if (this.isLocaldata) {        this._processLocalData()        return      }      if (this.dataValue != null) {        this._loadNodeData((data) => {          this._treeData = data          this._updateBindData()          this._updateSelected()        })        return      }      if (this.stepSearh) {        this._loadNodeData((data) => {          this._treeData = data          this._updateBindData()        })      } else {        this._loadAllData((data) => {          this._treeData = []          this._extractTree(data, this._treeData, null)          this._updateBindData()        })      }    },    _loadAllData(callback) {      if (this.loading) {        return      }      this.loading = true      this.getCommand({        field: this.postField,        gettree: true,        startwith: `${this.selfField}=='${this.dataValue}'`      }).then((res) => {        this.loading = false        callback(res.result.data)        this.onDataChange()      }).catch((err) => {        this.loading = false        this.errorMessage = err      })    },    _loadNodeData(callback, pw) {      if (this.loading) {        return      }      this.loading = true      this.getCommand({        field: this.postField,        where: pw || this._postWhere(),        pageSize: 500      }).then((res) => {        this.loading = false        callback(res.result.data)        this.onDataChange()      }).catch((err) => {        this.loading = false        this.errorMessage = err      })    },    _pathWhere() {      let result = []      let where_field = this._getParentNameByField();      if (where_field) {        result.push(`${where_field} == '${this.dataValue}'`)      }      if (this.where) {        return `(${this.where}) && (${result.join(' || ')})`      }      return result.join(' || ')    },    _postWhere() {      let result = []      let selected = this.selected      let parentField = this.parentField      if (parentField) {        result.push(`${parentField} == null || ${parentField} == ""`)      }      if (selected.length) {        for (var i = 0; i < selected.length - 1; i++) {          result.push(`${parentField} == '${selected[i].value}'`)        }      }      let where = []      if (this.where) {        where.push(`(${this.where})`)      }      if (result.length) {        where.push(`(${result.join(' || ')})`)      }      return where.join(' && ')    },    _nodeWhere() {      let result = []      let selected = this.selected      if (selected.length) {        result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`)      }      if (this.where) {        return `(${this.where}) && (${result.join(' || ')})`      }      return result.join(' || ')    },    _getParentNameByField() {      const fields = this.field.split(',');      let where_field = null;      for (let i = 0; i < fields.length; i++) {        const items = fields[i].split('as');        if (items.length < 2) {          continue;        }        if (items[1].trim() === 'value') {          where_field = items[0].trim();          break;        }      }      return where_field    },    _isTreeView() {      return (this.parentField && this.selfField)    },    _updateSelected() {      var dl = this.dataList      var sl = this.selected      let textField = this.map.text      let valueField = this.map.value      for (var i = 0; i < sl.length; i++) {        var value = sl[i].value        var dl2 = dl[i]        for (var j = 0; j < dl2.length; j++) {          var item2 = dl2[j]          if (item2[valueField] === value) {            sl[i].text = item2[textField]            break          }        }      }    },    _updateBindData(node) {      const {        dataList,        hasNodes      } = this._filterData(this._treeData, this.selected)      let isleaf = this._stepSearh === false && !hasNodes      if (node) {        node.isleaf = isleaf      }      this.dataList = dataList      this.selectedIndex = dataList.length - 1      if (!isleaf && this.selected.length < dataList.length) {        this.selected.push({          value: null,          text: "请选择"        })      }      return {        isleaf,        hasNodes      }    },    _filterData(data, paths) {      let dataList = []      let hasNodes = true      dataList.push(data.filter((item) => {        return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '')      }))      for (let i = 0; i < paths.length; i++) {        var value = paths[i].value        var nodes = data.filter((item) => {          return item.parent_value === value        })        if (nodes.length) {          dataList.push(nodes)        } else {          hasNodes = false        }      }      return {        dataList,        hasNodes      }    },    _extractTree(nodes, result, parent_value) {      let list = result || []      let valueField = this.map.value      for (let i = 0; i < nodes.length; i++) {        let node = nodes[i]        let child = {}        for (let key in node) {          if (key !== 'children') {            child[key] = node[key]          }        }        if (parent_value !== null && parent_value !== undefined && parent_value !== '') {          child.parent_value = parent_value        }        result.push(child)        let children = node.children        if (children) {          this._extractTree(children, result, node[valueField])        }      }    },    _extractTreePath(nodes, result) {      let list = result || []      for (let i = 0; i < nodes.length; i++) {        let node = nodes[i]        let child = {}        for (let key in node) {          if (key !== 'children') {            child[key] = node[key]          }        }        result.push(child)        let children = node.children        if (children) {          this._extractTreePath(children, result)        }      }    },    _findNodePath(key, nodes, path = []) {      let textField = this.map.text      let valueField = this.map.value      for (let i = 0; i < nodes.length; i++) {        let node = nodes[i]        let children = node.children        let text = node[textField]        let value = node[valueField]        path.push({          value,          text        })        if (value === key) {          return path        }        if (children) {          const p = this._findNodePath(key, children, path)          if (p.length) {            return p          }        }        path.pop()      }      return []    },    _processLocalData() {      this._treeData = []      this._extractTree(this.localdata, this._treeData)      var inputValue = this.dataValue      if (inputValue === undefined) {        return      }      if (Array.isArray(inputValue)) {        inputValue = inputValue[inputValue.length - 1]        if (typeof inputValue === 'object' && inputValue[this.map.value]) {          inputValue = inputValue[this.map.value]        }      }      this.selected = this._findNodePath(inputValue, this.localdata)    }  }}
 |