From 839dda529e205c35db741a22a64fd092a6d7688f Mon Sep 17 00:00:00 2001 From: Mathieu TUDISCO Date: Mon, 6 Nov 2017 14:39:38 +0100 Subject: [PATCH 01/22] =?UTF-8?q?Complete=20french=20translation=20?= =?UTF-8?q?=F0=9F=87=AB=F0=9F=87=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locale/lang/fr.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/locale/lang/fr.js b/src/locale/lang/fr.js index af6e4c56c..808c557b4 100644 --- a/src/locale/lang/fr.js +++ b/src/locale/lang/fr.js @@ -16,11 +16,11 @@ export default { startTime: 'Horaire début', endDate: 'Date fin', endTime: 'Horaire fin', - prevYear: 'Previous Year', // to be translated - nextYear: 'Next Year', // to be translated - prevMonth: 'Previous Month', // to be translated - nextMonth: 'Next Month', // to be translated - year: '', + prevYear: 'Année précédente', + nextYear: 'Année suivante', + prevMonth: 'Mois précédent', + nextMonth: 'Mois suivant', + year: 'Année', month1: 'Janvier', month2: 'Février', month3: 'Mars', @@ -81,7 +81,7 @@ export default { error: 'Erreur' }, upload: { - deleteTip: 'press delete to remove', // to be translated + deleteTip: 'Cliquer sur supprimer pour retirer le fichier', delete: 'Supprimer', preview: 'Aperçu', continue: 'Continuer' @@ -91,7 +91,7 @@ export default { confirmFilter: 'Confirmer', resetFilter: 'Réinitialiser', clearFilter: 'Tous', - sumText: 'Sum' // to be translated + sumText: 'Somme' }, tree: { emptyText: 'Aucune donnée' @@ -99,10 +99,10 @@ export default { transfer: { noMatch: 'Aucune correspondance', noData: 'Aucune donnée', - titles: ['List 1', 'List 2'], // to be translated - filterPlaceholder: 'Enter keyword', // to be translated - noCheckedFormat: '{total} items', // to be translated - hasCheckedFormat: '{checked}/{total} checked' // to be translated + titles: ['Liste 1', 'Liste 2'], + filterPlaceholder: 'Entrer un mot clef', + noCheckedFormat: '{total} elements', + hasCheckedFormat: '{checked}/{total} coché(s)' } } }; From 651b517fd09d03538a78e5780e5ef03912269cb7 Mon Sep 17 00:00:00 2001 From: alexdee2007 Date: Wed, 8 Nov 2017 06:20:52 +0200 Subject: [PATCH 02/22] Core: Add plugin eslint-plugin-json (#7869) * Add plugin eslint-plugin-json Add plugin eslint-plugin-json for parse build/salad.config.json * Add plugin eslint-plugin-json Add plugin eslint-plugin-json for parse build/salad.config.json --- .eslintrc | 2 +- package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index ba8a1b188..efb7c4f79 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,7 +6,7 @@ "expect": true, "sinon": true }, - "plugins": ['vue'], + "plugins": ['vue','json'], "extends": 'elemefe', "parserOptions": { "ecmaFeatures": { diff --git a/package.json b/package.json index 33bbfd39b..d6fae6758 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "css-loader": "^0.28.7", "es6-promise": "^4.0.5", "eslint": "^3.10.2", + "eslint-plugin-json": "^1.2.0", "extract-text-webpack-plugin": "^3.0.1", "file-loader": "^1.1.5", "file-save": "^0.2.0", From 4ea53ab89608e376cad3ac71e2977ae517aeffd1 Mon Sep 17 00:00:00 2001 From: Joe Wong Date: Wed, 8 Nov 2017 12:24:29 +0800 Subject: [PATCH 03/22] Cascader: optimize hover to expand experience (#8010) * Cascader: optimize hover to expand experience pass eslint * Cascader: hoverThreshold configuable --- packages/cascader/src/main.vue | 5 +++ packages/cascader/src/menu.vue | 78 +++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/packages/cascader/src/main.vue b/packages/cascader/src/main.vue index 8165be79a..a5bdc4ffa 100644 --- a/packages/cascader/src/main.vue +++ b/packages/cascader/src/main.vue @@ -149,6 +149,10 @@ export default { beforeFilter: { type: Function, default: () => (() => {}) + }, + hoverThreshold: { + type: Number, + default: 500 } }, @@ -224,6 +228,7 @@ export default { this.menu.expandTrigger = this.expandTrigger; this.menu.changeOnSelect = this.changeOnSelect; this.menu.popperClass = this.popperClass; + this.menu.hoverThreshold = this.hoverThreshold; this.popperElm = this.menu.$el; this.menu.$on('pick', this.handlePick); this.menu.$on('activeItemChange', this.handleActiveItemChange); diff --git a/packages/cascader/src/menu.vue b/packages/cascader/src/menu.vue index 6785b78ae..07dff214a 100644 --- a/packages/cascader/src/menu.vue +++ b/packages/cascader/src/menu.vue @@ -39,7 +39,8 @@ value: [], expandTrigger: 'click', changeOnSelect: false, - popperClass: '' + popperClass: '', + hoverTimer: 0 }; }, @@ -135,9 +136,35 @@ activeOptions, visible, expandTrigger, - popperClass + popperClass, + hoverThreshold } = this; + let hoverMenuRefs = {}; + const hoverMenuHandler = e => { + const offsetX = e.offsetX; + const width = hoverMenuRefs.activeMenu.offsetWidth; + const height = hoverMenuRefs.activeMenu.offsetHeight; + + if (e.target === hoverMenuRefs.activeItem) { + clearTimeout(this.hoverTimer); + const {activeItem} = hoverMenuRefs; + const offsetY_top = activeItem.offsetTop; + const offsetY_Bottom = offsetY_top + activeItem.offsetHeight; + + hoverMenuRefs.hoverZone.innerHTML = ` + + + `; + } else { + if (!this.hoverTimer) { + this.hoverTimer = setTimeout(() => { + hoverMenuRefs.hoverZone.innerHTML = ''; + }, hoverThreshold); + } + } + }; + const menus = this._l(activeOptions, (menu, menuIndex) => { let isFlat = false; const items = this._l(menu, item => { @@ -177,6 +204,7 @@ 'is-active': item.value === activeValue[menuIndex], 'is-disabled': item.disabled }} + ref={item.value === activeValue[menuIndex] ? 'activeItem' : null} {...events} > {item.label} @@ -188,19 +216,65 @@ menuStyle.minWidth = this.inputWidth + 'px'; } + const isHoveredMenu = expandTrigger === 'hover' && activeValue.length - 1 === menuIndex; + const hoverMenuEvent = { + on: { + } + }; + + if (isHoveredMenu) { + hoverMenuEvent.on.mousemove = hoverMenuHandler; + menuStyle.position = 'relative'; + } + return (
    {items} + { + isHoveredMenu + ? () : null + }
); }); + + if (expandTrigger === 'hover') { + this.$nextTick(() => { + const activeItem = this.$refs.activeItem; + + if (activeItem) { + const activeMenu = activeItem.parentElement; + const hoverZone = this.$refs.hoverZone; + + hoverMenuRefs = { + activeMenu, + activeItem, + hoverZone + }; + } else { + hoverMenuRefs = {}; + } + }); + } + return (
Date: Wed, 8 Nov 2017 20:21:27 -0600 Subject: [PATCH 04/22] Accessibility for Cascader & Dropdown (#7973) --- packages/cascader/src/main.vue | 32 +++++++ packages/cascader/src/menu.vue | 66 +++++++++++++- packages/dropdown/src/dropdown-item.vue | 2 + packages/dropdown/src/dropdown.vue | 111 ++++++++++++++++++++++-- packages/theme-chalk/src/cascader.scss | 4 +- packages/theme-chalk/src/dropdown.scss | 10 ++- 6 files changed, 213 insertions(+), 12 deletions(-) diff --git a/packages/cascader/src/main.vue b/packages/cascader/src/main.vue index a5bdc4ffa..c02b70799 100644 --- a/packages/cascader/src/main.vue +++ b/packages/cascader/src/main.vue @@ -10,9 +10,12 @@ ]" @click="handleClick" @mouseenter="inputHover = true" + @focus="inputHover = true" @mouseleave="inputHover = false" + @blur="inputHover = false" ref="reference" v-clickoutside="handleClickoutside" + @keydown="handleKeydown" > { @@ -257,6 +272,23 @@ export default { }); this.$emit('active-item-change', value); }, + handleKeydown(e) { + const keyCode = e.keyCode; + if (keyCode === 13) { + this.handleClick(); + } else if (keyCode === 40) { // down + this.menuVisible = true; // 打开 + setTimeout(() => { + const firstMenu = this.popperElm.querySelectorAll('.el-cascader-menu')[0]; + firstMenu.querySelectorAll("[tabindex='-1']")[0].focus(); + }); + e.stopPropagation(); + e.preventDefault(); + } else if (keyCode === 27 || keyCode === 9) { // esc tab + this.inputValue = ''; + if (this.menu) this.menu.visible = false; + } + }, handlePick(value, close = true) { this.currentValue = value; this.$emit('input', value); diff --git a/packages/cascader/src/menu.vue b/packages/cascader/src/menu.vue index 07dff214a..09aeb0076 100644 --- a/packages/cascader/src/menu.vue +++ b/packages/cascader/src/menu.vue @@ -1,6 +1,7 @@ From 363a80b18430aed6ce02b696d984ae9e2305b2ed Mon Sep 17 00:00:00 2001 From: maranran Date: Wed, 8 Nov 2017 21:21:20 -0600 Subject: [PATCH 06/22] Accessibility for Popover, Tooltip, Message & Notification (#8009) * Accessibility for Tooltip & Popover * Accessibility for message & notification * fixbug for popover with nodeType --- examples/docs/zh-CN/popover.md | 2 +- examples/docs/zh-CN/tooltip.md | 2 +- packages/message/src/main.vue | 47 ++++++++++---------------- packages/notification/src/main.vue | 21 ++++++++++-- packages/popover/src/main.vue | 45 +++++++++++++++++++++++-- packages/theme-chalk/src/tooltip.scss | 3 ++ packages/tooltip/src/main.js | 48 ++++++++++++++++++++++----- 7 files changed, 123 insertions(+), 45 deletions(-) diff --git a/examples/docs/zh-CN/popover.md b/examples/docs/zh-CN/popover.md index 449874882..b3c52c3fa 100644 --- a/examples/docs/zh-CN/popover.md +++ b/examples/docs/zh-CN/popover.md @@ -146,7 +146,7 @@ Popover 的属性与 Tooltip 很类似,它们都是基于`Vue-popper`开发的 width="200" trigger="focus" content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"> - focus 激活 + focus 激活 ``` ::: diff --git a/examples/docs/zh-CN/tooltip.md b/examples/docs/zh-CN/tooltip.md index 07eb8d03f..83aeeba5b 100644 --- a/examples/docs/zh-CN/tooltip.md +++ b/examples/docs/zh-CN/tooltip.md @@ -63,7 +63,7 @@
- 上左 + 上左 上边 diff --git a/packages/message/src/main.vue b/packages/message/src/main.vue index 882b76f4d..c6f9956d8 100644 --- a/packages/message/src/main.vue +++ b/packages/message/src/main.vue @@ -9,15 +9,15 @@ v-show="visible" @mouseenter="clearTimer" @mouseleave="startTimer" - role="alertdialog" + role="alert" > -

{{ message }}

-

+

{{ message }}

+

- +
@@ -44,9 +44,7 @@ closed: false, timer: null, dangerouslyUseHTMLString: false, - center: false, - initFocus: null, - originFocus: null + center: false }; }, @@ -87,18 +85,18 @@ if (typeof this.onClose === 'function') { this.onClose(this); } - if (!this.originFocus || !this.originFocus.getBoundingClientRect) return; - - // restore keyboard focus - const { top, left, bottom, right } = this.originFocus.getBoundingClientRect(); - const viewportHeight = window.innerHeight || document.documentElement.clientHeight; - const viewportWidth = window.innerWidth || document.documentElement.clientWidth; - if (top >= 0 && - left >= 0 && - bottom <= viewportHeight && - right <= viewportWidth) { - this.originFocus.focus(); - } +// if (!this.originFocus || !this.originFocus.getBoundingClientRect) return; +// +// // restore keyboard focus +// const { top, left, bottom, right } = this.originFocus.getBoundingClientRect(); +// const viewportHeight = window.innerHeight || document.documentElement.clientHeight; +// const viewportWidth = window.innerWidth || document.documentElement.clientWidth; +// if (top >= 0 && +// left >= 0 && +// bottom <= viewportHeight && +// right <= viewportWidth) { +// this.originFocus.focus(); +// } }, clearTimer() { @@ -115,24 +113,15 @@ } }, keydown(e) { - if (e.keyCode === 46 || e.keyCode === 8) { - this.clearTimer(); // detele 取消倒计时 - } else if (e.keyCode === 27) { // esc关闭消息 + if (e.keyCode === 27) { // esc关闭消息 if (!this.closed) { this.close(); } - } else { - this.startTimer(); // 恢复倒计时 } } }, mounted() { this.startTimer(); - this.originFocus = document.activeElement; - this.initFocus = this.showClose ? this.$el.querySelector('.el-icon-close') : this.$el.querySelector('.el-message__content'); - setTimeout(() => { - this.initFocus && this.initFocus.focus(); - }); document.addEventListener('keydown', this.keydown); }, beforeDestroy() { diff --git a/packages/notification/src/main.vue b/packages/notification/src/main.vue index 4b98c1244..ee47e46be 100644 --- a/packages/notification/src/main.vue +++ b/packages/notification/src/main.vue @@ -6,7 +6,9 @@ :style="positionStyle" @mouseenter="clearTimer()" @mouseleave="startTimer()" - @click="click"> + @click="click" + role="alert" + > 0) { this.timer = setTimeout(() => { @@ -130,6 +142,11 @@ } }, this.duration); } + document.addEventListener('keydown', this.keydown); + }, + beforeDestroy() { + document.removeEventListener('keydown', this.keydown); } }; + diff --git a/packages/popover/src/main.vue b/packages/popover/src/main.vue index 88ff571a3..3e498336d 100644 --- a/packages/popover/src/main.vue +++ b/packages/popover/src/main.vue @@ -6,7 +6,11 @@ :class="[popperClass, content && 'el-popover--plain']" ref="popper" v-show="!disabled && showPopper" - :style="{ width: width + 'px' }"> + :style="{ width: width + 'px' }" + role="tooltip" + :id="tooltipId" + :aria-hidden="(disabled || !showPopper) ? 'true' : 'false'" + >
{{ content }}
@@ -14,10 +18,10 @@ -