diff --git a/.eslintignore b/.eslintignore index f22f139..472d746 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,6 @@ public node_modules cache -examples/assets \ No newline at end of file +examples/assets +examples/views/docs +release \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index f22f139..472d746 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,6 @@ public node_modules cache -examples/assets \ No newline at end of file +examples/assets +examples/views/docs +release \ No newline at end of file diff --git a/examples/router/routes.js b/examples/router/routes.js index 74d8031..ca4d66e 100644 --- a/examples/router/routes.js +++ b/examples/router/routes.js @@ -54,6 +54,12 @@ const _components = [ group: '表单组件', children: [ { + path: 'input', + name: 'input', + meta: { title: 'Input 输入框' }, + component: () => import('@/views/docs/component/input.md'), + }, + { path: 'checkbox', name: 'checkbox', meta: { title: 'Checkbox 复选框' }, diff --git a/examples/views/docs/component/input.md b/examples/views/docs/component/input.md new file mode 100644 index 0000000..b263ed9 --- /dev/null +++ b/examples/views/docs/component/input.md @@ -0,0 +1,64 @@ +# Input 输入框 + +输入框组件,支持特殊业务场景格式化 + +## 基本用法 + +配置`type`属性设置类型 + +::: snippet 支持`text`, `bankCard`, `password`, `phone`, `money`, `digit`,默认为`text` + +```html + + + + + +``` + +::: + + +## API + +## Attribute 属性 + +参数|说明|类型|可选值|默认值 +-|-|-|-|- +value | 值 | String,Number | - | '' +placeholder | 值 | String,Number | - | '' +type | 类型 | String | text,bankCard,password,phone,money,digit | text +clearable | 是否可清除 | Boolean | - | false +disabled | 是否禁用 | Boolean | - | false +readonly | 是否只读 | Boolean | - | false diff --git a/packages/icon/index.vue b/packages/icon/index.vue index 5e6f245..16e486a 100644 --- a/packages/icon/index.vue +++ b/packages/icon/index.vue @@ -1,5 +1,5 @@ @@ -38,13 +38,6 @@ export default { }; }, }, - methods: { - onClick: function () { - if (this.$listeners['click']) { - this.$emit('click'); - } - }, - }, }; diff --git a/packages/input/cursor.js b/packages/input/cursor.js new file mode 100644 index 0000000..a0629f3 --- /dev/null +++ b/packages/input/cursor.js @@ -0,0 +1,50 @@ +/** + * get position of input cursor + */ +export function getCursorsPosition(ctrl) { + /* istanbul ignore if */ + if (!ctrl) { + return 0; + } + let CaretPos = 0; // IE Support + /* istanbul ignore next */ + if (document.selection) { + ctrl.focus(); + const Sel = document.selection.createRange(); + Sel.moveStart('character', -ctrl.value.length); + CaretPos = Sel.text.length; + } else if (ctrl.selectionStart || ctrl.selectionStart === '0') { + // Firefox support + CaretPos = ctrl.selectionStart; + } + return CaretPos; +} + +let timer = null; +/** + * set position of input cursor + */ +export function setCursorsPosition(ctrl, pos) { + /* istanbul ignore if */ + if (!ctrl) { + return; + } + /* istanbul ignore if */ + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(() => { + /* istanbul ignore next */ + if (ctrl.setSelectionRange) { + ctrl.focus(); + ctrl.setSelectionRange(pos, pos); + } else if (ctrl.createTextRange) { + const range = ctrl.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, 50); +} diff --git a/packages/input/formate-value.js b/packages/input/formate-value.js new file mode 100644 index 0000000..e94d90c --- /dev/null +++ b/packages/input/formate-value.js @@ -0,0 +1,76 @@ +export function formatValueByGapRule(gapRule, value, gap = ' ', range, isAdd = 1) { + const arr = value ? value.split('') : []; + let showValue = ''; + const rule = []; + gapRule.split('|').some((n, j) => { + rule[j] = +n + (rule[j - 1] ? +rule[j - 1] : 0); + }); + let j = 0; + arr.some((n, i) => { + // Remove the excess part + if (i > rule[rule.length - 1] - 1) { + return; + } + if (i > 0 && i === rule[j]) { + showValue = showValue + gap + n; + j++; + } else { + showValue = showValue + '' + n; + } + }); + let adapt = 0; + rule.some((n, j) => { + if (range === +n + 1 + j) { + adapt = 1 * isAdd; + } + }); + range = typeof range !== 'undefined' ? (range === 0 ? 0 : range + adapt) : showValue.length; + return { value: showValue, range: range }; +} + +export function formatValueByGapStep(step, value, gap = ' ', direction = 'right', range, isAdd = 1, oldValue = '') { + if (value.length === 0) { + return { value, range }; + } + + const arr = value && value.split(''); + let _range = range; + let showValue = ''; + + if (direction === 'right') { + for (let j = arr.length - 1, k = 0; j >= 0; j--, k++) { + const m = arr[j]; + showValue = k > 0 && k % step === 0 ? m + gap + showValue : m + '' + showValue; + } + if (isAdd === 1) { + // 在添加的情况下,如果添加前字符串的长度减去新的字符串的长度为2,说明多了一个间隔符,需要调整range + if (oldValue.length - showValue.length === -2) { + _range = range + 1; + } + } else { + // 在删除情况下,如果删除前字符串的长度减去新的字符串的长度为2,说明少了一个间隔符,需要调整range + if (oldValue.length - showValue.length === 2) { + _range = range - 1; + } + // 删除到最开始,range 保持 0 + if (_range <= 0) { + _range = 0; + } + } + } else { + arr.some((n, i) => { + showValue = i > 0 && i % step === 0 ? showValue + gap + n : showValue + '' + n; + }); + const adapt = range % (step + 1) === 0 ? 1 * isAdd : 0; + _range = typeof range !== 'undefined' ? (range === 0 ? 0 : range + adapt) : showValue.length; + } + + return { value: showValue, range: _range }; +} + +export function trimValue(value, gap = ' ') { + value = typeof value === 'undefined' ? '' : value; + const reg = new RegExp(gap, 'g'); + value = value.toString().replace(reg, ''); + return value; +} diff --git a/packages/input/index.vue b/packages/input/index.vue new file mode 100644 index 0000000..96c43ad --- /dev/null +++ b/packages/input/index.vue @@ -0,0 +1,278 @@ + + + + + -- libgit2 0.21.0