1.4.3 • Published 1 month ago

tbl-custom-components v1.4.3

Weekly downloads
-
License
MIT
Repository
-
Last release
1 month ago

tbl-custom-components

项目地址

基于element-ui@2.15.14 二次封装一些小组件,提高插拔性,便于多项目使用

一、安装文档

安装

npm i tbl-custom-components;

注册

main.js中注册,依赖于 element-ui,因此注册的时候得同步注册 element-ui

import ElementUI from 'element-ui';
Vue.use(ElementUI, { size: 'small', zIndex: 3000 }); // 声明使用ElementUI

import 'element-ui/lib/theme-chalk/index.css'; // element-ui样式表
全局注册
import TblCustomComponents from 'tbl-custom-components';  // 引入自定义组件
Vue.use(TblComponents); // 声明使用TblComponents自定义组件

import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表
按需引入
import { TblDaterangePicker,TblTooltipOver } from 'tbl-custom-components';  // 按需引入自定义组件(也可以不加大括号引入)
Vue.use(TblDaterangePicker); // 声明使用TblComponents自定义组件
Vue.use(TblTooltipOver); // 声明使用TblComponents自定义组件

import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表
配置国际化
// 全局配置
import TblCustomComponents from 'tbl-custom-components';  // 引入自定义组件
import locale from 'tbl-custom-components/lib/locale/lang/en'; // 全局配置自定义组件的国际化
Vue.use(TblCustomComponents,{ locale }); // 声明使用TblComponents自定义组件并配置国际化

import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表

二、组件使用说明

tbl-daterange-picker 时间范围选择器

介绍

基于element-ui,二次封装 DateTimePicker组件,继承 该组件的所有属性、事件和方法

添加了昨日、今日、上周、本周、上月、本月、过去 7 天、过去 30 天、过去 90 天等快捷按钮

使用示例
<tbl-daterange-picker
  lang="en"
  v-model="defaultValue"
  align="left"
  format="yyyy-MM-dd HH:mm:ss"
  value-format="yyyy-MM-dd HH:mm:ss"
  :btnOption="btnOption"
  :picker-options="pickerOptions"
  @change="onChange"
></tbl-daterange-picker>

export default {
  name: 'App',
  data() {
    return {
      defaultValue: [this.$moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),this.$moment(new Date()).format('YYYY-MM-DD HH:mm:ss')],
      btnOption: {
        isYesterday: true, // 显示 昨日 按钮
        isToday: true, // 今日
        isPreWeek: true, // 上周
        isThisWeek: true, // 本周
        isPreMonth: true, // 上月
        isThisMonth: true, // 本月
        isLast7days: true, // 过去7天
      },
      pickerOptions: {
        shortcuts: [],
        disabledDate(date) {
          return date.getTime() > Date.now();
        },
      },
    }
  },
  methods:{
    onChange(val) {
      console.log(val, '获取到绑定的时间范围值');
      this.defaultValue = val;
    },
  },
}
问题解决、配置项、属性等
  1. btnOption 不配置的话默认所有按钮都显示,配置为{}空对象时 所有按钮钧不显示

    参数说明类型可选值默认值
    isYesterday是否显示 昨日 的按钮booleanfalse/truetrue
    isToday是否显示 今日 的按钮booleanfalse/truetrue
    isPreWeek是否显示 上周 的按钮booleanfalse/truetrue
    isThisWeek是否显示 本周 的按钮booleanfalse/truetrue
    isPreMonth是否显示 上月 的按钮booleanfalse/truetrue
    isThisMonth是否显示 本月 的按钮booleanfalse/truetrue
    isLast7days是否显示 过去 7 天 的按钮booleanfalse/truetrue
    isLast30days是否显示 过去 30 天 的按钮booleanfalse/truetrue
    isLast90days是否显示 过去 90 天 的按钮booleanfalse/truetrue
  2. 如使用 picker-options 来限制日期选择范围,或者设置周起始日 firstDayOfWeek,或者设置日期的类名 cellClassName 时,当需要显示快捷按钮,则必须加上 shortcuts: [],否则无快捷按钮; 不配置 picker-options 时,默认是有快捷按钮的

  3. picker-options 所有属性和参数 详见 picker-options 参考地址;

  4. 继承 DateTimePicker 的所有属性、事件和方法

  5. activeShortcut 属性:

    参数说明类型可选值默认值
    activeShortcut默认高亮的快捷项按钮string0/1/2/3/4/5/6/7/8''

    0-8 分别对应 btnOption 中的 9 个按钮

  6. 方法 getActiveShortcut(index,picker) 参数为快捷项下标和快捷项本身

  7. lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

    参数说明类型可选值默认值
    lang国际化配置stringcn/encn

tbl-tooltip-over 文字超出范围

介绍

基于element-ui,二次封装Tooltip组件,继承Tooltip 的所有属性和方法

当文本超出既定宽度显示 ... ,并自动提示 tooltips 的小组件

使用示例
<div style="width:500px;margin-left: 15px">
  <p>2.1 无slot:</p>
  <tbl-tooltip-over :content="content" refName="tooltipOver" effect="dark" placement="top-start" popper-class="test-tooltip"></tbl-tooltip-over>
  <p>2.1 有slot:</p>
  <tbl-tooltip-over refName="tooltipOver" effect="dark" popper-class="test-tooltip">
    <span slot="contentTip" style="color:#00f;">{{ content2 }}</span>
    <span slot="contentOver" style="color:#f00;font-size: 40px">{{ content1 }}</span>
  </tbl-tooltip-over>
</div>

export default {
  name: 'App',
  data() {
    return {
      content: `他找来半张红纸和一支毛笔,让村里的一名小学老师为他写了一张告示。告示的大概内容是:因收入微薄无法承担太多应酬,除丧葬、嫁娶之外`,
      content1: `恶风读wùfēng。指病人遇风觉冷,避风则缓解之症。外感内伤俱可见恶风之证。指病邪,《素问·脉要精微论》:“来徐去疾,上虚下实`,
      content2: 112233445566,
    }
  },
}
问题解决、配置项、属性等
  1. 继承 Tooltip 的所有属性和方法

  2. content 显示文字

    参数说明类型可选值默认值
    content文本显示string/number--
  3. lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

    参数说明类型可选值默认值
    lang国际化配置stringcn/encn
  4. slot 插槽

    参数说明类型可选值默认值
    contentTip具名插槽,可用来显示 tooltip 的弹出层string/number--
    contentOver具名插槽,用来页面显示(即有省略号的那部分)string/number--

tbl-icon-picker 图标选择器

介绍

基于element-ui,使用Input 组件和Popover 组件,将 2.15.14 版本的所有图标+自定义的 TBL 图标库 阿里图标做成选择器,用于图标选择。

使用示例
<tbl-icon-picker v-model="iconValue" placeholder="请选择图标"></tbl-icon-picker>

export default {
  name: 'App',
  data() {
    return {
      iconValue: '',
    }
  },
}
问题解决、配置项、属性等
  1. 引入

    /* 引入自定义tbl图标(在线引用,项目中还是推荐下载下来使用) */
    @import '//at.alicdn.com/t/c/font_4403618_ujpcwclle8.css';

2) 可配参数

| 参数        | 说明                                                                                      | 类型    | 可选值                                                                                                    | 默认值 |
| :---------- | :---------------------------------------------------------------------------------------- | :------ | :-------------------------------------------------------------------------------------------------------- | :----- |
| placeholder | 占位字符,继承 [Input](https://element.eleme.cn/#/zh-CN/component/input#input-attributes) | string  | -                                                                                                         | -      |
| disabled    | 是否禁用,继承 [Input](https://element.eleme.cn/#/zh-CN/component/input#input-attributes) | boolean | false/true                                                                                                | false  |
| placement   | 弹出框位置,继承 [Popover](https://element.eleme.cn/#/zh-CN/component/popover#attributes) | string  | top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end | bottom |

3) lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

| 参数 | 说明       | 类型   | 可选值 | 默认值 |
| :--- | :--------- | :----- | :----- | :----- |
| lang | 国际化配置 | string | cn/en  | cn     |

tbl-table-transfer 表格穿梭框

介绍

基于element-ui,使用Input 组件、Table 组件以及 Pagination 组件,组合成一个带分页的表格穿梭框。

使用示例
<tbl-table-transfer
  class="eltTransfer"
  ref="eltTransfer"
  :show-query="true"
  :show-pagination="true"
  :pagination-call-back="paginationCallBack"
  :left-columns="leftColumns"
  :title-texts="['全部设备', '已绑设备']"
  :query-texts="['筛选', '筛选']"
  :table-row-key="row => row.id"
  maxHeight="900px"
  minHeight="470px"
  v-model="tableData"
>
  <!-- 可以使用插槽获取到列信息和行信息,从而进行数据的处理 -->
  <template v-slot:default="{ scope }">
    <div>
      <span v-if="scope.col.id === 'state'">
        <span v-if="scope.row.state == 0">离线</span>
        <span v-if="scope.row.state == 1">在线</span>
      </span>
      <span v-else>{{ scope.row[scope.col.id] }}</span>
    </div>
  </template>
  <template v-slot:leftCondition="{ scope }">
    <el-form-item label="">
      <el-input v-model="scope.deviceName" clearable placeholder="请输入设备名称"></el-input>
    </el-form-item>
  </template>
  <template v-slot:rightCondition="{ scope }">
    <el-form-item label="">
      <el-input v-model="scope.deviceName" clearable placeholder="请输入设备名称"></el-input>
    </el-form-item>
  </template>
</tbl-table-transfer>

export default {
  name: 'App',
  data() {
    return {
      // 表头
      leftColumns: [
        { label: '设备名称', id: 'deviceName' },
        { label: '设备编号', id: 'deviceCode' },
        { label: '网络状态', id: 'state', width: '80px' },
      ],
      // 已绑定数据
      tableData: [
        {
          id: 1,
          deviceName: '设备1',
          deviceCode: '0001',
          state: 0,
        },
        {
          id: 2,
          deviceName: '设备2',
          deviceCode: '0002',
          state: 1,
        },
      ],
      // 全部数据
      allDeviceData: [
        {
          id: 1,
          deviceName: '设备1',
          deviceCode: '0001',
          state: 0,
        },
        {
          id: 2,
          deviceName: '设备2',
          deviceCode: '0002',
          state: 1,
        },
        {
          id: 3,
          deviceName: '设备3',
          deviceCode: '0003',
          state: 0,
        },
        {
          id: 4,
          deviceName: '设备4',
          deviceCode: '0004',
          state: 1,
        },
      ],
    }
  },

  methods:{
    // 未选数据加载和检索
    paginationCallBack(obj) {
      let abcData;
      var filtersObj = {
        deviceName: obj.deviceName,
      };

      // 如果筛选条件全为空,查全部;否则按条件筛选
      var objIsEmpty = true;
      for (var key in filtersObj) {
        if (typeof filtersObj[key] != 'undefined' && typeof filtersObj[key] != 'null' && filtersObj[key] != null && filtersObj[key] != '') {
          objIsEmpty = false;
          break;
        }
      }

      if (objIsEmpty) {
        abcData = this.allDeviceData;
      } else {
        // 拿到有值的参数
        let tempFilter = {};
        for (var key in filtersObj) {
          if (typeof filtersObj[key] != 'undefined' && typeof filtersObj[key] != 'null' && filtersObj[key] != null && filtersObj[key] != '') {
            tempFilter[key] = filtersObj[key];
          }
        }
        abcData = this.allDeviceData.filter(item => {
          let flag = false;
          for (key in tempFilter) {
            // console.log(key,'输出key')
            if (item[key].toString().indexOf(tempFilter[key].toString()) >= 0) {
              flag = true;
            } else {
              flag = false;
              break;
            }
          }
          if (flag) {
            return item;
          }
        });
      }

      let newData = abcData.filter((item, index) => {
        if (index >= (obj.pageIndex - 1) * obj.pageSize && index < obj.pageIndex * obj.pageSize) {
          return true;
        }
        return false;
      });
      return new Promise((resolve, reject) => {
        try {
          resolve({ total: abcData.length, data: newData });
        } catch (e) {
          reject();
        }
      });
    },
  }
}
问题解决、配置项、属性等
  1. 可配参数:

    参数说明类型可选值默认值
    maxHeight表格最大高度string-'500px'
    maxHeight表格最小高度string-'300px'
    tableStripe表格斑马线stringfalse/truefalse
    tableBorder表格边框booleanfalse/truefalse
    tableRowKey表格行数据的 keystring/number-row.id
    showQuery显示查询条件booleanfalse/truefalse
    showPagination显示分页booleanfalse/truefalse
    paginationCallBack左侧分页回调Function(obj) // obj-参数为查询条件的返回值--
    titleTexts标题文本Array[string]-['待选项', '已选项']
    buttonTexts按钮文本Array[string]-[]
    queryTexts查询按钮文本Array[string]-['查询', '筛选']
    leftColumns左侧参数Array[{}]-[]
    rightColumns右侧参数Array[{}]-[]
  2. lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

    参数说明类型可选值默认值
    lang国际化配置stringcn/encn

tbl-cron cron 表达式选择器

介绍

基于element-ui,参考vue-cron 组件进行重新开发和改造。

使用示例
<!-- cron表达式输入框 -->
<el-input v-model="form.cronExpression" placeholder="请输入运行周期" clearable>
<el-tooltip slot="append" effect="dark" content="打开表达式配置" placement="top">
  <el-button icon="el-icon-thumb" @click="openCronDialog(form.cronExpression)"></el-button>
</el-tooltip>
</el-input>

<!-- cron表达式选择器 -->
<el-dialog title="cron表达式" :visible.sync="showCronBox" width="40%" :append-to-body="true" :before-close="closeCron" destroy-on-close>
<tbl-cron v-model="cronVal" lang="cn"></tbl-cron>
<span slot="footer" class="dialog-footer">
  <el-button @click="closeCron">取 消</el-button>
  <el-button type="primary" @click="cronConfirm(cronVal)">确 定</el-button>
</span>
</el-dialog>

export default {
  name: 'App',
  data() {
    return {
      showCronBox: false,
      form: {
        cronExpression: '',
      },
      cronVal: '',
    }
  },
}
问题解决、配置项、属性等
  1. lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

    参数说明类型可选值默认值
    lang国际化配置stringcn/encn

tbl-dynamic-tables 动态表格

介绍

基于element-ui,二次封装Table+Pagination 组件,实现表格+分页的封装,另外配置了动态表头,使表格能根据自定义选择的表头动态渲染。

将列表、分页三者的交互逻辑封装到组件中,节省开发者代码量 配置化的表格项,跟 el-table-column 的配置属性类似 配置化的分页,跟 el-pagination 的配置属性类似 自定义是否显示搜索和分页 自定义工具栏 丰富的插槽提供功能扩展

使用示例
<tbl-dynamic-tables
  :request="getList"
  :columns="columns"
  :pagination="paginationConfig"
  :dynamicColumns="true"
  storageKey="testTableColumns"
  lang="cn"
  @columns-change="columnsChange"
>
  <template #isEnable="scope">
    <el-switch v-model="scope.row.isEnable" :active-value="1" :inactive-value="0"></el-switch>
  </template>
  <template #operate="scope">
    <el-button size="mini" type="primary">编辑{{ scope.row.index }}</el-button>
    <el-button size="mini" type="danger">删除</el-button>
  </template>
</tbl-dynamic-tables>

export default {
  name: 'App',
  data() {
    return {
      // 表格
      columns: [
        { label: '', type: 'selection', show: true },
        { label: '序号', type: 'index', show: false },
        { label: '角色名称', prop: 'nickName', show: true, required: true },
        { label: '邮箱', prop: 'userEmail', show: true },
        { label: '电话', prop: 'tel', show: true },
        {
          label: '性别',
          prop: 'sex',
          show: true,
          formatter: function(row, column, cellValue, index) {
            if (cellValue == '男') {
              return (
                <span>
                  <i style='background-color:#f00;display: inline-block;border-radius: 50%;width:6px;height:6px;margin-right:3px'></i>
                  {cellValue}
                </span>
              ); // 此处注意jsx的语法规则
            } else {
              return (
                <span>
                  <i style='backgroundColor:#0f0;display: inline-block;border-radius: 50%;width:6px;height:6px;margin-right:3px'></i>
                  {cellValue}
                </span>
              ); // 此处注意jsx的语法规则
            }
          },
        },
        {
          label: '启用',
          prop: 'isEnable',
          show: true,
          tdSlot: 'isEnable', // 自定义单元格内容的插槽名称
        },
        {
          label: '操作',
          fixed: 'right',
          width: 180,
          align: 'center',
          tdSlot: 'operate', // 自定义单元格内容的插槽名称
        },
      ],
      dynamicTableData: {
        list: [
          {
            nickName: '李逍遥',
            userEmail: '123@163.com',
            tel: '15189764540',
            sex: '男',
            isEnable: 1,
          },
          {
            nickName: '赵灵儿',
            userEmail: '456@163.com',
            tel: '15189764541',
            sex: '女',
            isEnable: 1,
          },
          {
            nickName: '林月如',
            userEmail: '789@163.com',
            tel: '15189764542',
            sex: '女',
            isEnable: 0,
          },
        ],
        total: 3,
      },
      // 分页配置
      paginationConfig: {
        layout: 'total, prev, pager, next, sizes', // 分页组件显示哪些功能
        pageSize: 5, // 每页条数
        pageSizes: [5, 10, 20, 50],
        background: true,
      },
    }
  },
}

// 请求函数
async getList(params) {
  // console.log(params, 'params');
  // params是从组件接收的,包含分页字段。

  // 1.静态数据
  const _dynamicTableData = this.dynamicTableData;
  // 必须要返回一个对象,包含data数组和total总数
  return {
    data: _dynamicTableData.list,
    total: _dynamicTableData.total,
  };

  // 2.动态数据
  await this.$api
    .listUser({
      page: params.pageNum,
      limit: params.pageSize,
      searchName: this.filters[0].value,
      phone: this.filters[1].value,
    })
    .then(data => {
      if (data.code == 0) {
        this.dynamicTableData.list = data.data;
        this.dynamicTableData.total = data.count;
      } else {
        this.$message.error(data.msg);
      }
    });
  // 必须要返回一个对象,包含data数组和total总数
  return {
    data: this.dynamicTableData.list,
    total: this.dynamicTableData.total,
  };
},

// 表头改变
columnsChange(columns1, columns2) {
  console.log(columns1, columns2);
},
问题解决、配置项、属性等
  1. request,请求列表数据的函数:组件加载的时候会自动执行 request 函数

    1. 函数接收参数:包含搜索表单的所有字段和分页的 pageNum 和 pageSize
    2. 函数必须返回一个对象,包含:

      1. data: 列表数据的数组(数组 Array)
      2. total:总数,用于分页(数值 Number)

        // 请求函数
        async getList(params) {
          // console.log(params, 'params');
          // params是从组件接收的,包含分页字段。
          // 1.静态数据
          const _dynamicTableData = this.dynamicTableData;
          // 必须要返回一个对象,包含data数组和total总数
          return {
            data: _dynamicTableData.list,
            total: _dynamicTableData.total,
          };
        
          // 2.动态数据
          await this.$api
            .listUser({
              page: params.pageNum,
              limit: params.pageSize,
              searchName: this.filters[0].value,
              phone: this.filters[1].value,
            })
            .then(data => {
              if (data.code == 0) {
                this.dynamicTableData.list = data.data;
                this.dynamicTableData.total = data.count;
              } else {
                this.$message.error(data.msg);
              }
            });
          // 必须要返回一个对象,包含data数组和total总数
          return {
            data: this.dynamicTableData.list,
            total: this.dynamicTableData.total,
          };
        },
  2. table 表格配置:支持Table的所有属性

  3. columns 列配置(数组 Array)

    参数说明类型可选值默认值
    label对应 el-table-column 的 labelstring--
    type对应 el-table-column 的 typestringselection/index/expand-
    prop对应 el-table-column 的 propstring--
    width对应 el-table-column 的 widthstring,number--
    minWidth对应 el-table-column 的 min-widthstring,number--
    align对应 el-table-column 的 alignstringleft/center/rightleft
    fixed对应 el-table-column 的 fixedstring,booleantrue, left, right-
    sortable对应 el-table-column 的 sortablebooleanfalse/truefalse
    filters对应 el-table-column 的 filtersArray[{ text, value }]--
    formatter对应 el-table-column 的 formatterFunction(row, column, cellValue, index)--
    ...............
    以上 ↑↑↑支持el-table-column的所有属性
    新增 ↓↓↓
    tdSlot单元格要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据string--
    labelSlot表头要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据string--
    show设置动态表头时,是否显示该列booleanfalse/truetrue
    required设置动态表头时,某列必选,不可在下拉中隐藏booleanfalse/true当 columns 中都不填写 required 或者 required 都为 false 时,默认除 type=index/section/expend 后的第一列为 required=true
  4. pagination 分页配置(对象 Object),如果不想显示分页,将 pagination 设置为 false

    参数说明类型可选值默认值
    layout组件布局stringtotal, sizes, prev, pager, next, jumpertotal, sizes, prev, pager, next, jumper
    pageSize每页显示条目个数number-10
    pageSizes每页显示个数选择器的选项设置Array[number]-[10, 20, 30, 40, 50, 100]
    background是否为分页按钮添加背景色boolean-false
  5. dynamicColumns 显示动态表头

    参数说明类型可选值默认值
    dynamicColumns是否显示动态表头booleanfalse/truetrue
  6. storageKey 表头存储到 localStorage 的键值

    参数说明类型可选值默认值
    storageKey将当前设置好的表头存入 localStorage,防止页面刷新后,恢复到初始表头。如果 storageKey 不传值,则无法存储 localStorage,表格恢复至初始表头。配合组件内部方法**getColumns() 、setColumns()**string--
  7. lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置

    参数说明类型可选值默认值
    lang国际化配置stringcn/encn
  8. 工具栏配置,工具栏默认是空的,提供一个具名插槽 toolbar,来自定义工具栏的内容

  9. 事件 columns-change,表头动态修改后的返回函数,函数返回两个值 column1:改变后的所有表头数据、column2:改变后的当前显示的表头数据

    columnsChange(columns1, columns2) {
        console.log(columns1, columns2);
    },
  10. 组件内部方法

    1. getColumns()

      tips: 必须先配置 storageKey 属性,给存储表头数据一个键值

      配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**getColumns()**方法获取存储到 localStorage 的表头信息

    2. setColumns()

      tips: 必须先配置 storageKey 属性,给存储表头数据一个键值

      配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**setColumns()**方法重新设置表格的表头信息

      // 页面初始化的时候,在mounted中重载表格的表头
      mounted() {
        var newColumns = this.$refs.dynamicTable.getColumns();
        this.$refs.dynamicTable.setColumns(newColumns);
      },
    3. reSet()

      配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**reSet()**方法,将表格分页信息初始化

      reSet(){
        this.$refs.dynamicTable.reSet();
        this.getList();
      },
1.4.3

1 month ago

1.4.0

4 months ago

1.3.8

4 months ago

1.3.7

4 months ago

1.3.6

4 months ago

1.2.0

1 year ago

1.0.19

1 year ago

1.0.18

1 year ago

1.0.17

1 year ago

1.0.16

1 year ago

1.2.8

1 year ago

1.2.7

1 year ago

1.2.6

1 year ago

1.2.5

1 year ago

1.2.4

1 year ago

1.2.3

1 year ago

1.2.2

1 year ago

1.2.1

1 year ago

1.0.20

1 year ago

1.1.1

1 year ago

1.1.0

1 year ago

1.1.8

1 year ago

1.3.5

1 year ago

1.1.7

1 year ago

1.3.4

1 year ago

1.1.6

1 year ago

1.3.3

1 year ago

1.1.5

1 year ago

1.3.2

1 year ago

1.1.4

1 year ago

1.3.1

1 year ago

1.1.3

1 year ago

1.3.0

1 year ago

1.1.2

1 year ago

1.1.61

1 year ago

1.2.9

1 year ago

1.0.11

1 year ago

1.0.10

1 year ago

1.0.15

1 year ago

1.0.14

1 year ago

1.0.13

1 year ago

1.0.12

1 year ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago

0.1.3

1 year ago

0.1.2

1 year ago

0.1.1

1 year ago

0.1.0

1 year ago