| 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)        }    }}
 |