0.11.34 • Published 4 months ago

loong-component v0.11.34

Weekly downloads
-
License
-
Repository
-
Last release
4 months ago

Loong-Component 组件库

cover

基于 Vue + ElementUI

介绍:

  • 借助快速搭建平台能够快速生成页面;
  • 内置常用一些业务组件,例如列表、编辑表单、查看表单、弹窗等等;
  • 基于elementUI组件二次封装,将参数进行规范统一;
  • 支持动态插槽、绑定事件等;
  • 等等

开发指南

引入与全局配置

安装

yarn add loong-component --save

全局引入

loong-component组件自带了许多常用功能,包括axios的封装引入,element-UI的一些常用组件.

import Vue from "Vue" ;
import loong,{elementUI} from "loong-component";//elementUI引入以及其他公共函数引入
import "loong-component/lib/loong-component.css";

Vue.use(loong,{options})// 引入组件,并进行全局默认配置
Vue.use(elementUI);//项目用了loong组件库,可不需在单独安装elementUI

全局axios封装

组件中统一使用的axios,为了和系统中的axios统一,可以对同一个axios进行统一封装拦截
将原来引用的axios改为import {ljAxios} from "loong-component";即可

options配置参数api:

类型:【Object】
可在全局引入时定义全局的组件参数,该参数定义权重较低,可在单独页面使用中通过对象绑定进行覆盖

options.inputConfig 输入组件配置

类型:【Object】

options.inputConfig.action

类型:【String】
文件上传地址

options.inputConfig.paramName

类型:【String】
文件上传请求时,文件传输的键,默认为file

options.inputConfig.renderFile

类型:【Function】
文件渲染的请求方法,异步方法,返回值为url,name。url需要可以在img标签的src中直接展示
参数:data为当前文件对象

renderFile: async (data) => {
   try {
       if (typeof data === 'string') {
           data = await getAttachment(data);
       }
       let url;
       let ext = "bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,wmf,webp,avif,apng";
       if (ext.indexOf(data.extension.toLowerCase()) > -1) {
           let responseData = await downloadFile(data.downPath);
           let blob = new Blob([responseData.data])
           url = window.URL.createObjectURL(blob);
           console.log('url :>> ', url);
       }
       return {
           url: url || "??",
           name: `${data.fileName}.${data.extension}`,
           ext: data.extension,
           _file: data
       }
    } catch (e) {
    }
}

options.inputConfig.downloadFile

类型:【Function】
文件下载方法,可定义下载的请求方法
参数:data=文件列表当前对象

async downloadFile(data) {
        let responseData = await downLoadFile({fileId: data.id, fileName: data.name, d: 0}, 'blob');
        let blob = new Blob([responseData.data])
        let downloadElement = document.createElement('a')
        let href = window.URL.createObjectURL(blob); //创建下载的链接
        downloadElement.href = href;
        downloadElement.download = data.name; //下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click(); //点击下载
        document.body.removeChild(downloadElement); //下载完成移除元素
        window.URL.revokeObjectURL(href); //释放blob对象
    }

options.list 列表相关配置

类型:【Object】

options.list.renderDataFiltersItems

类型:【Function】
列表数据权限统一管理,对单位、部门、人员进行不同权限数据过滤展示,实现对数据进行过滤. 可参考网办系统-案件列表

 async renderDataFiltersItems: (listVue) => {
            const _this = listVue.$parent;
            const user = listVue.$store.state.user;//id depId unitId
            let page = 1;
            let items = [
                {
                    // labelWidth: "60px",
                    elementType: "select",
                    name: "unitId",
                    value: "",
                    clearable: true,
                    filterable: true,
                    options: [],
                    label: "单位",
                    placeholder: "请选择单位",
                    span: 6,
                    width: "100%",
                    event: {
                        change: (e) => {
                            getDepTreeData(e);
                        }
                    }
                },
                {
                    labelWidth: "80px",
                    elementType: "treeSelect",
                    value: [],
                    noOptionsText: '暂无部门数据',
                    placeholder: "请选择部门",
                    label: "部门",
                    name: "depIds",
                    defaultExpandLevel: 999,
                    options: [],
                    clearable: true,
                    zIndex: 3001,
                    appendToBody: true,
                    multiple: true,
                    limit: 1,
                    showCount: true,
                    noChildrenText: "当前无下级部门",
                    // branchNodesFirst: true,
                    valueConsistsOf: "ALL",
                    limitText: (count) => {
                        return `+${count}`
                    },
                    normalizer: (d) => {
                        return {
                            ...d,
                            children: d.sub === null ? [] : d.sub,
                            value: d.id,
                            label: d.name,
                        }
                    },
                    span: 7,
                    width: "100%",
                    event: {
                        input: (value, instanceId) => {
                            page = 1;
                            getLoginUserAvailableUser(value)
                        }
                    }
                },
                {
                    // labelWidth: "60px",
                    elementType: "select",
                    name: "userId",
                    value: "",
                    selectLoadMore: () => {
                        page++;
                        const depItemValue = _this.search.formData.formItems.find(s => s.name === 'depIds')?.value;
                        getLoginUserAvailableUser(depItemValue);
                    },
                    clearable: true,
                    filterable: true,
                    options: [],
                    label: "人员",
                    placeholder: "请选择人员",
                    span: 5,
                    width: "100%",
                },
            ];
            if (_this.search.dataFiltersOverrideItems && _this.search.dataFiltersOverrideItems.length > 0) {
                items = items.map(item => {
                    const overrideItem = _this.search.dataFiltersOverrideItems.find(s => s.name === item.name);
                    if (overrideItem) {
                        item = {
                            ...item,
                            ...overrideItem
                        }
                    }
                    return item
                });
                items = items.filter(s => typeof s.show === 'undefined' || s.show);
            }

            if (_this.search.dataFiltersOverrideCallback && typeof _this.search.dataFiltersOverrideCallback === 'function') {
                items = _this.search.dataFiltersOverrideCallback({
                    items
                });
            }
            _this.search.formData.formItems.unshift(...items);

            //获取部门数据
            let getDepTreeData = async (unitId = null) => {
                if (!_this.search.formData.formItems.find(s => s.name === 'depIds'))
                    return;
                const depsData = await getLoginUserAvailableDepForTreeOptionApi({unitId});
                _this.search.formData.formItems.setOptions("depIds", depsData);
                if (depsData && depsData.length > 0) {
                    let result;
                    if (_this.search.formData.formItems.find(s => s.name === 'depIds')?.multiple) {
                        result = [depsData[0].id];
                        let data = depsData[0];
                        utils.findTreeData(data.sub, result, "id", "sub");
                    } else {
                        result = depsData[0].id;
                    }

                    _this.search.formData.formItems.setValue("depIds", result).setValue('depIds', result, 'name', 'default');

                    //如果部门返回有仅一条数据并且还是当前登录用户的部门时,默认隐藏
                    if (result.length === 1 && depsData[0].id === user.depId && depsData[0].id !== 'all') {
                        _this.search.formData.formItems.setShow("depIds", false);
                    }
                    await getLoginUserAvailableUser(result)
                } else {
                    _this.search.formData.formItems.setValue("depIds", []).setValue('depIds', [], 'name', 'default');
                    _this.search.formData.formItems.setShow("depIds", false);
                    await getLoginUserAvailableUser([])
                }
            };

            //获取当前登录用户可访问用户下拉数据
            let getLoginUserAvailableUser = async (depIds) => {
                if (!_this.search.formData.formItems.find(s => s.name === 'userId'))
                    return;
                let params = {
                    depIds,
                    page: page,
                    limit: 20,
                    unitId: _this.search.formData.formItems.find(s => s.name === 'unitId')?.value
                };
                const userData = await getLoginUserAvailableUserForOptionApi(params);
                const userOption = _this.search.formData.formItems.find(s => s.name === 'userId')?.options;
                let newOptions = userData.list.map(s => {
                    return {label: s.name, value: s.id}
                });
                _this.search.formData.formItems.setOptions("userId", page === 1 ? newOptions : [...userOption, ...newOptions]);
                if (page === 1) {
                    if (newOptions && newOptions.length > 0) {
                        //如果用户返回有仅一条数据并且还是当前登录用户时,默认隐藏
                        if (newOptions.length === 1 && newOptions[0].value === user.id) {
                            _this.search.formData.formItems.setShow("userId", false);
                        }
                        _this.search.formData.formItems.setValue("userId", newOptions[0].value).setValue('userId', newOptions[0].value, 'name', 'default');
                    } else {
                        _this.search.formData.formItems.setValue("userId", "");
                        _this.search.formData.formItems.setShow("userId", false);
                    }
                }
            };

            //初始化
            const unitData = await getLoginUserAvailableUnitForOptionApi({});
            if (unitData && unitData.length > 0) {
                _this.search.formData.formItems.setValue("unitId", unitData[0].id).setValue('unitId', unitData[0].id, 'name', 'default');
                _this.search.formData.formItems.setOptions("unitId", unitData.map(s => {
                    return {label: s.name, value: s.id}
                }))
                let defaultUnitId = unitData[0].id;
                if (unitData.length === 1 && defaultUnitId === user.unitId) {
                    _this.search.formData.formItems.setShow("unitId", false);
                }
                await getDepTreeData(defaultUnitId)
            } else {
                _this.search.formData.formItems.setShow("unitId", false);
                await getDepTreeData()
            }

            listVue.searchLoad = true;
        }

需要此功能需要在指定页面lj-list组件配置,如下:

<template>
<lj-list use-data-filters></lj-list>
</template>

::: tip 提示 如果需要对过滤下拉框下拉框名称以及不展示等详细配置见lj-list组件使用文档 :::

options.list.parseData

类型:【Function】
列表数据渲染方法,其返回参数为接口请求返回体(经过axios过滤后),需抛出页面所需的total及list

 parseData: (res) => {
            return {
                total: res.total,
                list: res.list
            }
        }

options.list.table

类型:【Object】
完美支持element-UI中表格的所有属性 ,其中属性名已转化为小驼峰形式

table: {
        size: "small",
        border: true,
        rowStyle: () => {
            return {
                fontSize: '14px'
            }
        },
        headerCellStyle: () => {
            return {
                fontSize: '14px'
            }
        },
        listType: "card-apart",//可选值 card-apart|simple,推荐使用前者.前者将查询栏、操作栏、表格栏清晰分层.案件产品目前使用该配置
        searchAlone: true
    }
},

options.permission 权限

类型:【Function】
参数:【el:元素dom】【bind:参数对象】
页面元素的权限控制,如果不满足条件可自行对dom进行删除等动作

1.使用了loong-component组件的,组件内部已经加了v-permission,需要在控制元素的对象中添加permissionCode属性作为权限标识
2.其他元素权限控制需在标签上加上 v-permission="yourPermissionCode"

permission(el, bind) {
    const { value } = bind;
    if (value) {
        // 权限值 需要在系统中心的权限管理添加并在角色管理中配置才生效
        const permissionList = store.state?.permissionList;
        // all表示带有管理员权限
        if (permissionList.find(n => n.code === 'all')) {
            return;
        }
        const routerName = router.app._route.name;
        // 根据路由name来区分页面权限
        const target = permissionList.find(item => (item.code === routerName));
        let permissionValue = new Set();
        if (typeof value === 'string') {
            permissionValue = new Set(value.split(","));
        } else if (typeof value === 'object' && Array.isArray(value)) {
            permissionValue = new Set(value);
        }
        const hasPermission = target?.visibleElementCodes.some(s => permissionValue.has(s));
        if (!hasPermission) {
            el.parentNode && el.parentNode.removeChild(el)
        }
    }
}

options.store 状态管理

类型:【Function】
直接传入项目store,组件内部弹窗内部后期可对项目store进行管理及操作.

完整示例

部分函数及接口定义可钉我(@hzw)获取

//引入
import loongComponent, {elementUI} from 'loong-component'
import 'loong-component/lib/loong-component.css'

const inputConfig = {
    action: uploadFileSrc,//上传地址
    paramName: "webFile",//上传请求键,默认为file
    //转换上传回来的数据
    parseData: (data) => {
        let res = data.data;
        //未登录或登录超时,需要重新登录
        switch (res.code) {
            case setting.responseCode.ok://操作成功
                return data.data.data
            case setting.responseCode.noLogin://需要重新登录(跳转)
            case setting.responseCode.sessionTimeout://需要续签 TODO 暂时不处理
                toLogin();
                break;
            default:
                message.error(res.msg);
                toLogin();
                break;
        }
    },
    //渲染数据
    renderFile: async (data) => {
        try {
            if (typeof data === 'string') {
                data = await getAttachment(data);
            }
            let url;
            let ext = "bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,wmf,webp,avif,apng";
            if (ext.indexOf(data.extension.toLowerCase()) > -1) {
                let responseData = await downloadFile(data.downPath);
                let blob = new Blob([responseData.data])
                url = window.URL.createObjectURL(blob);
                console.log('url :>> ', url);
            }
            return {
                url: url || "??",
                name: `${data.fileName}.${data.extension}`,
                ext: data.extension,
                _file: data
            }
        } catch (e) {
        }
    },
    // //下载文件
    async downloadFile(data) {
        const responseData = await downloadFile(data._file.downPath);
        const blob = new Blob([responseData.data])
        const href = window.URL.createObjectURL(blob);
        let downloadElement = document.createElement('a')
        downloadElement.href = href;
        downloadElement.download = data.name; //下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click(); //点击下载
        document.body.removeChild(downloadElement); //下载完成移除元素
        window.URL.revokeObjectURL(href); //释放blob对象
    }
}


Vue.use(loongComponent, {
    //列表相关配置
    list: {
        /**
         * 数据权限过滤
         * @param listVue
         * @return {Promise<void>}
         */
        async renderDataFiltersItems(listVue) {
            const _this = listVue.$parent;
            const user = listVue.$store.state.user;//id depId unitId
            let page = 1;
            let items = [
                {
                    // labelWidth: "60px",
                    elementType: "select",
                    name: "unitId",
                    value: "",
                    clearable: true,
                    filterable: true,
                    options: [],
                    label: "单位",
                    placeholder: "请选择单位",
                    span: 6,
                    width: "100%",
                    event: {
                        change: (e) => {
                            getDepTreeData(e);
                        }
                    }
                },
                {
                    labelWidth: "80px",
                    elementType: "treeSelect",
                    value: [],
                    noOptionsText: '暂无部门数据',
                    placeholder: "请选择部门",
                    label: "部门",
                    name: "depIds",
                    defaultExpandLevel: 999,
                    options: [],
                    clearable: true,
                    zIndex: 3001,
                    appendToBody: true,
                    multiple: true,
                    limit: 1,
                    showCount: true,
                    noChildrenText: "当前无下级部门",
                    // branchNodesFirst: true,
                    valueConsistsOf: "ALL",
                    limitText: (count) => {
                        return `+${count}`
                    },
                    normalizer: (d) => {
                        return {
                            ...d,
                            children: d.sub === null ? [] : d.sub,
                            value: d.id,
                            label: d.name,
                        }
                    },
                    span: 7,
                    width: "100%",
                    event: {
                        input: (value, instanceId) => {
                            page = 1;
                            getLoginUserAvailableUser(value)
                        }
                    }
                },
                {
                    // labelWidth: "60px",
                    elementType: "select",
                    name: "userId",
                    value: "",
                    selectLoadMore: () => {
                        page++;
                        const depItemValue = _this.search.formData.formItems.find(s => s.name === 'depIds')?.value;
                        getLoginUserAvailableUser(depItemValue);
                    },
                    clearable: true,
                    filterable: true,
                    options: [],
                    label: "人员",
                    placeholder: "请选择人员",
                    span: 5,
                    width: "100%",
                },
            ];
            if (_this.search.dataFiltersOverrideItems && _this.search.dataFiltersOverrideItems.length > 0) {
                items = items.map(item => {
                    const overrideItem = _this.search.dataFiltersOverrideItems.find(s => s.name === item.name);
                    if (overrideItem) {
                        item = {
                            ...item,
                            ...overrideItem
                        }
                    }
                    return item
                });
                items = items.filter(s => typeof s.show === 'undefined' || s.show);
            }

            if (_this.search.dataFiltersOverrideCallback && typeof _this.search.dataFiltersOverrideCallback === 'function') {
                items = _this.search.dataFiltersOverrideCallback({
                    items
                });
            }
            _this.search.formData.formItems.unshift(...items);

            //获取部门数据
            let getDepTreeData = async (unitId = null) => {
                if (!_this.search.formData.formItems.find(s => s.name === 'depIds'))
                    return;
                const depsData = await getLoginUserAvailableDepForTreeOptionApi({unitId});
                _this.search.formData.formItems.setOptions("depIds", depsData);
                if (depsData && depsData.length > 0) {
                    let result;
                    if (_this.search.formData.formItems.find(s => s.name === 'depIds')?.multiple) {
                        result = [depsData[0].id];
                        let data = depsData[0];
                        utils.findTreeData(data.sub, result, "id", "sub");
                    } else {
                        result = depsData[0].id;
                    }

                    _this.search.formData.formItems.setValue("depIds", result).setValue('depIds', result, 'name', 'default');

                    //如果部门返回有仅一条数据并且还是当前登录用户的部门时,默认隐藏
                    if (result.length === 1 && depsData[0].id === user.depId && depsData[0].id !== 'all') {
                        _this.search.formData.formItems.setShow("depIds", false);
                    }
                    await getLoginUserAvailableUser(result)
                } else {
                    _this.search.formData.formItems.setValue("depIds", []).setValue('depIds', [], 'name', 'default');
                    _this.search.formData.formItems.setShow("depIds", false);
                    await getLoginUserAvailableUser([])
                }
            };

            //获取当前登录用户可访问用户下拉数据
            let getLoginUserAvailableUser = async (depIds) => {
                if (!_this.search.formData.formItems.find(s => s.name === 'userId'))
                    return;
                let params = {
                    depIds,
                    page: page,
                    limit: 20,
                    unitId: _this.search.formData.formItems.find(s => s.name === 'unitId')?.value
                };
                const userData = await getLoginUserAvailableUserForOptionApi(params);
                const userOption = _this.search.formData.formItems.find(s => s.name === 'userId')?.options;
                let newOptions = userData.list.map(s => {
                    return {label: s.name, value: s.id}
                });
                _this.search.formData.formItems.setOptions("userId", page === 1 ? newOptions : [...userOption, ...newOptions]);
                if (page === 1) {
                    if (newOptions && newOptions.length > 0) {
                        //如果用户返回有仅一条数据并且还是当前登录用户时,默认隐藏
                        if (newOptions.length === 1 && newOptions[0].value === user.id) {
                            _this.search.formData.formItems.setShow("userId", false);
                        }
                        _this.search.formData.formItems.setValue("userId", newOptions[0].value).setValue('userId', newOptions[0].value, 'name', 'default');
                    } else {
                        _this.search.formData.formItems.setValue("userId", "");
                        _this.search.formData.formItems.setShow("userId", false);
                    }
                }
            };

            //初始化
            const unitData = await getLoginUserAvailableUnitForOptionApi({});
            if (unitData && unitData.length > 0) {
                _this.search.formData.formItems.setValue("unitId", unitData[0].id).setValue('unitId', unitData[0].id, 'name', 'default');
                _this.search.formData.formItems.setOptions("unitId", unitData.map(s => {
                    return {label: s.name, value: s.id}
                }))
                let defaultUnitId = unitData[0].id;
                if (unitData.length === 1 && defaultUnitId === user.unitId) {
                    _this.search.formData.formItems.setShow("unitId", false);
                }
                await getDepTreeData(defaultUnitId)
            } else {
                _this.search.formData.formItems.setShow("unitId", false);
                await getDepTreeData()
            }

            listVue.searchLoad = true;
        },
        parseData: ({list, total}) => {
            return {
                total: total,
                list: list
            }
        },
        table: {
            size: "small",
            border: true,
            rowStyle: () => {
                return {
                    fontSize: '14px'
                }
            },
            headerCellStyle: () => {
                return {
                    fontSize: '14px'
                }
            },
        },
        listType: "card-apart",
        searchAlone: true
    },
    inputConfig,
    store: store,
    //权限控制
    //1.使用了loong-component组件的,组件内部已经加了v-permission,无需单独添加,但需加 permissionCode 作为权限标识
    //2.未使用loong-component的,自己需要在标签上添加v-permission自定义属性
    permission(el, bind) {
        const {value} = bind;
        if (value) {
            // 权限值 需要在系统中心的权限管理添加并在角色管理中配置才生效
            const permissionList = store.state?.permissionList;
            // all表示带有管理员权限
            if (permissionList.find(n => n.code === 'all')) {
                return;
            }
            const routerName = router.app._route.name;
            // 根据路由name来区分页面权限
            const target = permissionList.find(item => (item.code === routerName));
            let permissionValue = new Set();
            if (typeof value === 'string') {
                permissionValue = new Set(value.split(","));
            } else if (typeof value === 'object' && Array.isArray(value)) {
                permissionValue = new Set(value);
            }
            const hasPermission = target?.visibleElementCodes.some(s => permissionValue.has(s));
            if (!hasPermission) {
                el.parentNode && el.parentNode.removeChild(el)
            }
        }
    }
});
Vue.use(elementUI);
0.11.27

5 months ago

0.11.28

5 months ago

0.11.29

5 months ago

0.11.30

5 months ago

0.11.31

5 months ago

0.11.32

5 months ago

0.11.33

5 months ago

0.11.34

4 months ago

0.11.26

11 months ago

0.11.25

1 year ago

0.11.24-rc.9

1 year ago

0.11.24-rc.8

1 year ago

0.11.24-rc.7

1 year ago

0.11.24-rc.6

1 year ago

0.11.24-rc.5

1 year ago

0.11.24-rc.4

1 year ago

0.11.24-rc.3

1 year ago

0.11.24-rc.2

1 year ago

0.11.23

1 year ago

0.11.24

1 year ago

0.11.23-rc.1

1 year ago

0.11.22

1 year ago

0.11.21

1 year ago

0.11.1-9.bata02

1 year ago

0.11.20

1 year ago

0.11.19

1 year ago

0.11.16

2 years ago

0.11.17

2 years ago

0.11.18

2 years ago

0.11.15

2 years ago

0.11.13-beta.4

2 years ago

0.11.13-beta.3

2 years ago

0.11.13-beta.2

2 years ago

0.11.8

2 years ago

0.11.9

2 years ago

0.11.1

2 years ago

0.11.2

2 years ago

0.11.3

2 years ago

0.11.4

2 years ago

0.11.5

2 years ago

0.11.6

2 years ago

0.11.7

2 years ago

0.11.10

2 years ago

0.11.11

2 years ago

0.11.12

2 years ago

0.11.14

2 years ago

0.11.13-beta

2 years ago

0.10.97

2 years ago

0.11.0

2 years ago

0.10.98

2 years ago

0.10.99

2 years ago

0.10.97-beta.1

2 years ago

0.10.97-beta.2

2 years ago

0.10.96-beta.4

2 years ago

0.10.96-beta.5

2 years ago

0.10.95-beta.2

2 years ago

0.10.95-beta.1

2 years ago

0.10.96

2 years ago

0.10.96-beta.3

2 years ago

0.10.96-beta.2

2 years ago

0.10.96-beta.1

2 years ago

0.10.94

3 years ago

0.10.95

3 years ago

0.10.90

3 years ago

0.10.91

3 years ago

0.10.92

3 years ago

0.10.93

3 years ago

0.10.94-beta.4

3 years ago

0.10.94-beta.3

3 years ago

0.10.94-beta.2

3 years ago

0.10.94-beta.1

3 years ago

0.10.94-beta.5

3 years ago

0.10.58

3 years ago

0.10.59

3 years ago

0.10.56

3 years ago

0.10.57

3 years ago

0.10.61

3 years ago

0.10.62

3 years ago

0.10.63

3 years ago

0.10.64

3 years ago

0.10.60

3 years ago

0.10.69

3 years ago

0.10.65

3 years ago

0.10.66

3 years ago

0.10.67

3 years ago

0.10.68

3 years ago

0.10.72

3 years ago

0.10.73

3 years ago

0.10.74

3 years ago

0.10.75

3 years ago

0.10.70

3 years ago

0.10.71

3 years ago

0.10.76

3 years ago

0.10.77

3 years ago

0.10.78

3 years ago

0.10.79

3 years ago

0.10.80

3 years ago

0.10.81

3 years ago

0.10.92-lc

3 years ago

0.10.92-lc.3

3 years ago

0.10.92-lc.2

3 years ago

0.10.50

3 years ago

0.10.51

3 years ago

0.10.52

3 years ago

0.10.53

3 years ago

0.10.54

3 years ago

0.10.55

3 years ago

0.10.37

3 years ago

0.10.38

3 years ago

0.10.39

3 years ago

0.10.40

3 years ago

0.10.41

3 years ago

0.10.42

3 years ago

0.10.48

3 years ago

0.10.49

3 years ago

0.10.43

3 years ago

0.10.44

3 years ago

0.10.45

3 years ago

0.10.46

3 years ago

0.9.200

3 years ago

0.10.9

3 years ago

0.10.1

3 years ago

0.10.2

3 years ago

0.10.3

3 years ago

0.10.5

3 years ago

0.10.6

3 years ago

0.10.7

3 years ago

0.10.8

3 years ago

0.10.18

3 years ago

0.10.19

3 years ago

0.10.14

3 years ago

0.10.15

3 years ago

0.10.16

3 years ago

0.10.17

3 years ago

0.10.10

3 years ago

0.10.11

3 years ago

0.10.12

3 years ago

0.10.13

3 years ago

0.10.20

3 years ago

0.10.29

3 years ago

0.10.25

3 years ago

0.10.26

3 years ago

0.10.27

3 years ago

0.10.28

3 years ago

0.10.21

3 years ago

0.10.22

3 years ago

0.10.23

3 years ago

0.10.24

3 years ago

0.10.30

3 years ago

0.10.31

3 years ago

0.10.36

3 years ago

0.10.32

3 years ago

0.10.33

3 years ago

0.10.34

3 years ago

0.10.35

3 years ago

0.9.165

3 years ago

0.9.167

3 years ago

0.9.166

3 years ago

0.9.176

3 years ago

0.9.175

3 years ago

0.9.178

3 years ago

0.9.177

3 years ago

0.9.172

3 years ago

0.9.171

3 years ago

0.9.174

3 years ago

0.9.173

3 years ago

0.9.170

3 years ago

0.9.169

3 years ago

0.9.168

3 years ago

0.9.187

3 years ago

0.9.186

3 years ago

0.9.189

3 years ago

0.9.188

3 years ago

0.9.183

3 years ago

0.9.182

3 years ago

0.9.185

3 years ago

0.9.184

3 years ago

0.9.181

3 years ago

0.9.180

3 years ago

0.9.179

3 years ago

0.9.198

3 years ago

0.9.197

3 years ago

0.9.199

3 years ago

0.9.194

3 years ago

0.9.193

3 years ago

0.9.196

3 years ago

0.9.195

3 years ago

0.9.190

3 years ago

0.9.192

3 years ago

0.9.191

3 years ago

0.9.164

3 years ago

0.9.161

3 years ago

0.9.160

3 years ago

0.9.163

3 years ago

0.9.162

3 years ago

0.9.158

3 years ago

0.9.157

3 years ago

0.9.159

3 years ago

0.9.134

3 years ago

0.9.133

3 years ago

0.9.143

3 years ago

0.9.142

3 years ago

0.9.145

3 years ago

0.9.144

3 years ago

0.9.141

3 years ago

0.9.140

3 years ago

0.9.139

3 years ago

0.9.136

3 years ago

0.9.135

3 years ago

0.9.138

3 years ago

0.9.137

3 years ago

0.9.154

3 years ago

0.9.153

3 years ago

0.9.156

3 years ago

0.9.155

3 years ago

0.9.150

3 years ago

0.9.152

3 years ago

0.9.151

3 years ago

0.9.147

3 years ago

0.9.146

3 years ago

0.9.149

3 years ago

0.9.148

3 years ago

0.9.56

4 years ago

0.9.57

4 years ago

0.9.58

3 years ago

0.9.59

3 years ago

0.9.52

4 years ago

0.9.53

4 years ago

0.9.54

4 years ago

0.9.55

4 years ago

0.9.50

4 years ago

0.9.51

4 years ago

0.9.45

4 years ago

0.9.46

4 years ago

0.9.47

4 years ago

0.9.48

4 years ago

0.9.41

4 years ago

0.9.42

4 years ago

0.9.43

4 years ago

0.9.44

4 years ago

0.9.49

4 years ago

0.9.40

4 years ago

0.9.34

4 years ago

0.9.35

4 years ago

0.9.36

4 years ago

0.9.37

4 years ago

0.9.32

4 years ago

0.9.33

4 years ago

0.9.38

4 years ago

0.9.39

4 years ago

0.9.101

3 years ago

0.9.100

3 years ago

0.9.110

3 years ago

0.9.112

3 years ago

0.9.111

3 years ago

0.9.96

3 years ago

0.9.97

3 years ago

0.9.98

3 years ago

0.9.99

3 years ago

0.9.107

3 years ago

0.9.92

3 years ago

0.9.106

3 years ago

0.9.93

3 years ago

0.9.109

3 years ago

0.9.94

3 years ago

0.9.108

3 years ago

0.9.95

3 years ago

0.9.103

3 years ago

0.9.102

3 years ago

0.9.105

3 years ago

0.9.90

3 years ago

0.9.104

3 years ago

0.9.91

3 years ago

0.9.121

3 years ago

0.9.89

3 years ago

0.9.120

3 years ago

0.9.123

3 years ago

0.9.122

3 years ago

0.9.85

3 years ago

0.9.86

3 years ago

0.9.87

3 years ago

0.9.88

3 years ago

0.9.118

3 years ago

0.9.81

3 years ago

0.9.117

3 years ago

0.9.82

3 years ago

0.9.83

3 years ago

0.9.119

3 years ago

0.9.84

3 years ago

0.9.114

3 years ago

0.9.113

3 years ago

0.9.116

3 years ago

0.9.115

3 years ago

0.9.80

3 years ago

0.9.132

3 years ago

0.9.78

3 years ago

0.9.131

3 years ago

0.9.79

3 years ago

0.9.74

3 years ago

0.9.75

3 years ago

0.9.130

3 years ago

0.9.76

3 years ago

0.9.77

3 years ago

0.9.129

3 years ago

0.9.70

3 years ago

0.9.128

3 years ago

0.9.71

3 years ago

0.9.72

3 years ago

0.9.73

3 years ago

0.9.125

3 years ago

0.9.124

3 years ago

0.9.127

3 years ago

0.9.126

3 years ago

0.9.67

3 years ago

0.9.69

3 years ago

0.9.63

3 years ago

0.9.64

3 years ago

0.9.65

3 years ago

0.9.66

3 years ago

0.9.60

3 years ago

0.9.61

3 years ago

0.9.62

3 years ago

0.9.30

4 years ago

0.9.31

4 years ago

0.9.26

4 years ago

0.9.27

4 years ago

0.9.28

4 years ago

0.9.29

4 years ago

0.9.23

4 years ago

0.9.24

4 years ago

0.9.25

4 years ago

0.9.20

4 years ago

0.9.21

4 years ago

0.9.22

4 years ago

0.9.12

4 years ago

0.9.13

4 years ago

0.9.14

4 years ago

0.9.15

4 years ago

0.9.16

4 years ago

0.9.17

4 years ago

0.9.18

4 years ago

0.9.19

4 years ago

0.9.8

4 years ago

0.9.7

4 years ago

0.9.9

4 years ago

0.9.6

4 years ago

0.9.10

4 years ago

0.9.11

4 years ago

0.9.4

4 years ago

0.9.3

4 years ago

0.9.5

4 years ago

0.8.117

4 years ago

0.8.116

4 years ago

0.8.115

4 years ago

0.8.114

4 years ago

0.8.119

4 years ago

0.8.118

4 years ago

0.8.120

4 years ago

0.8.124

4 years ago

0.8.123

4 years ago

0.8.122

4 years ago

0.8.121

4 years ago

0.8.128

4 years ago

0.8.127

4 years ago

0.8.126

4 years ago

0.8.125

4 years ago

0.8.129

4 years ago

0.8.131

4 years ago

0.8.130

4 years ago

0.8.133

4 years ago

0.8.132

4 years ago

0.9.2

4 years ago

0.9.1

4 years ago

0.8.113

4 years ago

0.8.112

4 years ago

0.8.111

4 years ago

0.8.110

4 years ago

0.8.102

4 years ago

0.8.101

4 years ago

0.8.100

4 years ago

0.8.99

4 years ago

0.8.96

4 years ago

0.8.95

4 years ago

0.8.98

4 years ago

0.8.97

4 years ago

0.8.92

4 years ago

0.8.91

4 years ago

0.8.94

4 years ago

0.8.93

4 years ago

0.8.106

4 years ago

0.8.105

4 years ago

0.8.104

4 years ago

0.8.103

4 years ago

0.8.109

4 years ago

0.8.108

4 years ago

0.8.107

4 years ago

0.8.89

4 years ago

0.8.88

4 years ago

0.8.87

4 years ago

0.8.85

4 years ago

0.8.84

4 years ago

0.8.86

4 years ago

0.8.83

4 years ago

0.8.82

4 years ago

0.8.81

4 years ago

0.8.80

4 years ago

0.8.78

4 years ago

0.8.79

4 years ago

0.8.77

4 years ago

0.8.74

4 years ago

0.8.73

4 years ago

0.8.76

4 years ago

0.8.75

4 years ago

0.8.70

4 years ago

0.8.72

4 years ago

0.8.71

4 years ago

0.8.67

4 years ago

0.8.66

4 years ago

0.8.69

4 years ago

0.8.68

4 years ago

0.8.63

4 years ago

0.8.62

4 years ago

0.8.65

4 years ago

0.8.64

4 years ago

0.8.61

4 years ago

0.8.60

4 years ago

0.8.59

4 years ago

0.8.56

4 years ago

0.8.55

4 years ago

0.8.58

4 years ago

0.8.57

4 years ago

0.8.52

4 years ago

0.8.51

4 years ago

0.8.54

4 years ago

0.8.53

4 years ago

0.8.50

4 years ago

0.8.49

4 years ago

0.8.48

4 years ago

0.8.45

4 years ago

0.8.44

4 years ago

0.8.47

4 years ago

0.8.46

4 years ago

0.8.43

4 years ago

0.8.42

4 years ago

0.8.41

4 years ago

0.8.40

4 years ago

0.8.34

4 years ago

0.8.33

4 years ago

0.8.36

4 years ago

0.8.35

4 years ago

0.8.30

4 years ago

0.8.32

4 years ago

0.8.31

4 years ago

0.8.38

4 years ago

0.8.37

4 years ago

0.8.39

4 years ago

0.8.23

4 years ago

0.8.22

4 years ago

0.8.25

4 years ago

0.8.24

4 years ago

0.8.21

4 years ago

0.8.20

4 years ago

0.8.27

4 years ago

0.8.26

4 years ago

0.8.29

4 years ago

0.8.28

4 years ago

0.8.19

4 years ago

0.8.16

4 years ago

0.8.15

4 years ago

0.8.18

4 years ago

0.8.17

4 years ago

0.8.9

4 years ago

0.8.8

4 years ago

0.8.5

4 years ago

0.8.4

4 years ago

0.8.7

4 years ago

0.8.6

4 years ago

0.8.3

4 years ago

0.8.12

4 years ago

0.8.11

4 years ago

0.8.14

4 years ago

0.8.13

4 years ago

0.8.10

4 years ago

0.8.2

4 years ago

0.7.99

4 years ago

0.7.98

4 years ago

0.7.95

4 years ago

0.7.94

4 years ago

0.7.97

4 years ago

0.7.96

4 years ago

0.7.91

4 years ago

0.7.93

4 years ago

0.7.92

4 years ago

0.8.1

4 years ago

0.7.90

4 years ago

0.7.88

4 years ago

0.7.87

4 years ago

0.7.89

4 years ago

0.7.84

4 years ago

0.7.86

4 years ago

0.7.85

4 years ago

0.7.83

4 years ago

0.7.80

4 years ago

0.7.82

4 years ago

0.7.81

4 years ago

0.7.79

4 years ago

0.7.78

4 years ago

0.7.77

4 years ago

0.7.76

4 years ago

0.7.73

4 years ago

0.7.75

4 years ago

0.7.74

4 years ago

0.7.72

4 years ago

0.7.71

4 years ago

0.7.70

4 years ago

0.7.66

4 years ago

0.7.65

4 years ago

0.7.68

4 years ago

0.7.67

4 years ago

0.7.62

4 years ago

0.7.61

4 years ago

0.7.64

4 years ago

0.7.63

4 years ago

0.7.69

4 years ago

0.7.60

4 years ago

0.7.57

4 years ago

0.7.59

4 years ago

0.7.58

4 years ago

0.7.55

4 years ago

0.7.56

4 years ago

0.7.54

4 years ago

0.7.51

4 years ago

0.7.50

4 years ago

0.7.53

4 years ago

0.7.52

4 years ago

0.7.48

4 years ago

0.7.47

4 years ago

0.7.49

4 years ago

0.7.37

4 years ago

0.7.36

4 years ago

0.7.39

4 years ago

0.7.38

4 years ago

0.7.44

4 years ago

0.7.43

4 years ago

0.7.45

4 years ago

0.7.40

4 years ago

0.7.42

4 years ago

0.7.41

4 years ago

0.7.35

4 years ago

0.7.33

4 years ago

0.7.34

4 years ago

0.7.32

4 years ago

0.7.31

4 years ago

0.7.30

4 years ago

0.7.29

4 years ago

0.7.22

4 years ago

0.7.21

4 years ago

0.7.24

4 years ago

0.7.23

4 years ago

0.7.26

4 years ago

0.7.25

4 years ago

0.7.28

4 years ago

0.7.27

4 years ago

0.7.20

4 years ago

0.7.19

4 years ago

0.7.18

4 years ago

0.7.15

4 years ago

0.7.14

4 years ago

0.7.17

4 years ago

0.7.16

4 years ago

0.7.11

4 years ago

0.7.10

4 years ago

0.7.12

4 years ago

0.7.9

4 years ago

0.7.8

4 years ago

0.7.7

4 years ago

0.7.2

4 years ago

0.7.1

4 years ago

0.7.4

4 years ago

0.7.3

4 years ago

0.7.6

4 years ago

0.7.0

4 years ago

0.6.98

4 years ago

0.6.99

4 years ago

0.6.97

4 years ago

0.6.94

4 years ago

0.6.93

4 years ago

0.6.96

4 years ago

0.6.95

4 years ago

0.6.90

4 years ago

0.6.92

4 years ago

0.6.91

4 years ago

0.6.87

4 years ago

0.6.86

4 years ago

0.6.89

4 years ago

0.6.88

4 years ago

0.6.83

4 years ago

0.6.82

4 years ago

0.6.85

4 years ago

0.6.84

4 years ago

0.6.81

4 years ago

0.6.80

4 years ago

0.6.65

4 years ago

0.6.64

4 years ago

0.6.67

4 years ago

0.6.66

4 years ago

0.6.61

4 years ago

0.6.60

4 years ago

0.6.63

4 years ago

0.6.62

4 years ago

0.6.69

4 years ago

0.6.68

4 years ago

0.6.54

4 years ago

0.6.53

4 years ago

0.6.56

4 years ago

0.6.55

4 years ago

0.6.50

4 years ago

0.6.52

4 years ago

0.6.51

4 years ago

0.6.58

4 years ago

0.6.57

4 years ago

0.6.59

4 years ago

0.6.76

4 years ago

0.6.75

4 years ago

0.6.78

4 years ago

0.6.77

4 years ago

0.6.72

4 years ago

0.6.71

4 years ago

0.6.74

4 years ago

0.6.73

4 years ago

0.6.79

4 years ago

0.6.70

4 years ago

0.6.43

4 years ago

0.6.42

4 years ago

0.6.45

4 years ago

0.6.44

4 years ago

0.6.41

4 years ago

0.6.40

4 years ago

0.6.47

4 years ago

0.6.46

4 years ago

0.6.49

4 years ago

0.6.39

4 years ago

0.6.38

4 years ago

0.6.37

4 years ago

0.6.36

4 years ago

0.6.29

4 years ago

0.6.28

4 years ago

0.6.32

4 years ago

0.6.31

4 years ago

0.6.34

4 years ago

0.6.33

4 years ago

0.6.30

4 years ago

0.6.35

4 years ago

0.6.21

4 years ago

0.6.23

4 years ago

0.6.22

4 years ago

0.6.7

4 years ago

0.6.6

4 years ago

0.6.9

4 years ago

0.6.8

4 years ago

0.6.25

4 years ago

0.6.24

4 years ago

0.6.27

4 years ago

0.6.26

4 years ago

0.6.10

4 years ago

0.6.12

4 years ago

0.6.11

4 years ago

0.6.18

4 years ago

0.6.17

4 years ago

0.6.19

4 years ago

0.6.14

4 years ago

0.6.13

4 years ago

0.6.16

4 years ago

0.6.15

4 years ago

0.6.3

4 years ago

0.6.2

4 years ago

0.6.5

4 years ago

0.6.4

4 years ago

0.6.1

4 years ago

0.6.0

4 years ago

0.5.6

4 years ago

0.5.5

4 years ago

0.5.8

4 years ago

0.5.7

4 years ago

0.5.9

4 years ago

0.5.4

4 years ago

0.5.3

4 years ago

0.5.2

4 years ago

0.5.1

4 years ago

0.5.0

4 years ago

0.4.9

4 years ago

0.4.8

4 years ago

0.4.7

4 years ago

0.4.6

4 years ago

0.4.5

4 years ago

0.4.4

4 years ago

0.4.3

4 years ago

0.4.2

4 years ago

0.4.1

4 years ago

0.4.0

4 years ago

0.3.9

4 years ago

0.3.8

4 years ago

0.3.7

4 years ago

0.3.6

4 years ago

0.3.5

4 years ago

0.3.4

4 years ago

0.3.3

4 years ago

0.3.2

4 years ago

0.3.1

4 years ago

0.3.0

4 years ago

0.2.9

4 years ago

0.2.8

4 years ago

0.2.7

4 years ago

0.2.6

4 years ago

0.2.5

4 years ago

0.2.3

4 years ago

0.2.2

4 years ago

0.2.1

4 years ago

0.2.0

4 years ago

0.1.8

4 years ago

0.1.7

4 years ago

0.1.6

4 years ago

0.1.5

4 years ago

0.1.4

4 years ago

0.1.3

4 years ago

0.1.2

4 years ago

0.1.1

4 years ago

0.1.0

4 years ago