From ca83e3b16e57ff1e0344f7193aea76bf7d935588 Mon Sep 17 00:00:00 2001 From: Marcos Moura Date: Thu, 27 Oct 2016 03:52:58 -0200 Subject: [PATCH] Add sort buttons with ripple effect --- docs/src/pages/components/Table.vue | 21 ++--- src/components/mdTable/index.js | 4 + src/components/mdTable/mdTable.scss | 120 ++++++++++++++++++++----- src/components/mdTable/mdTable.vue | 11 ++- src/components/mdTable/mdTableCard.vue | 2 +- src/components/mdTable/mdTableCell.vue | 22 +++++ src/components/mdTable/mdTableHead.vue | 57 ++++++++++++ src/components/mdTable/mdTableRow.vue | 10 ++- 8 files changed, 210 insertions(+), 37 deletions(-) create mode 100644 src/components/mdTable/mdTableCell.vue create mode 100644 src/components/mdTable/mdTableHead.vue diff --git a/docs/src/pages/components/Table.vue b/docs/src/pages/components/Table.vue index fe1cfd3..f9f18cb 100644 --- a/docs/src/pages/components/Table.vue +++ b/docs/src/pages/components/Table.vue @@ -14,22 +14,23 @@ - + - Head 1 - Head 2 - Head 3 - Head 4 + Dessert (100g serving) + Calories (g) + Fat (g) + Carbs (g) + Protein (g) + Sodium (mg) + Calcium (%) + Iron (%) - - Cell 1 - Cell 2 - Cell 3 - Cell 4 + + Cell diff --git a/src/components/mdTable/index.js b/src/components/mdTable/index.js index bbff5d9..9cf31d1 100644 --- a/src/components/mdTable/index.js +++ b/src/components/mdTable/index.js @@ -1,11 +1,15 @@ import mdTable from './mdTable.vue'; import mdTableCard from './mdTableCard.vue'; +import mdTableHead from './mdTableHead.vue'; +import mdTableCell from './mdTableCell.vue'; import mdTableRow from './mdTableRow.vue'; import mdTableTheme from './mdTable.theme'; export default function install(Vue) { Vue.component('md-table', Vue.extend(mdTable)); Vue.component('md-table-card', Vue.extend(mdTableCard)); + Vue.component('md-table-head', Vue.extend(mdTableHead)); + Vue.component('md-table-cell', Vue.extend(mdTableCell)); Vue.component('md-table-row', Vue.extend(mdTableRow)); Vue.material.styles.push(mdTableTheme); diff --git a/src/components/mdTable/mdTable.scss b/src/components/mdTable/mdTable.scss index 1813e85..b3979d5 100644 --- a/src/components/mdTable/mdTable.scss +++ b/src/components/mdTable/mdTable.scss @@ -18,34 +18,21 @@ border-collapse: collapse; } - tr { - transition: $swift-ease-out; - } - tbody tr { border-top: 1px solid #e0e0e0; - &:hover { - background-color: #eee; - } - - &.md-selected { + &.md-selected .md-table-cell { background-color: #f5f5f5; } - } - th, - td { - padding-right: 32px; - padding-left: 24px; - - &:last-child { - padding-right: 24px; + &:hover .md-table-cell { + background-color: #eee; } } - th { + .md-table-head { height: 56px; + padding: 0; position: relative; overflow: hidden; color: rgba(#000, .54); @@ -54,20 +41,113 @@ text-align: left; text-overflow: ellipsis; white-space: nowrap; + + &:last-child .md-table-head-container { + padding-right: 24px; + } } - td { + .md-table-head-container { + height: 100%; + padding-right: 32px; + padding-left: 24px; + display: flex; + align-items: center; + transition: $swift-ease-out; + } + + .md-sortable { + cursor: pointer; + + &:first-of-type { + .md-icon { + left: auto; + right: 10px; + } + } + + &:hover, + &.md-sorted { + .md-icon { + opacity: 1; + } + } + + &:hover { + color: rgba(#000, .87); + } + + &.md-sorted { + .md-icon { + color: rgba(#000, .87); + } + } + + &.md-sorted-descending { + .md-icon { + transform: translateY(-50%) rotate(180deg); + } + } + + .md-icon { + $size: 16px; + + width: $size; + min-width: $size; + height: $size; + min-height: $size; + position: absolute; + top: 50%; + left: 2px; + transition: $swift-ease-out; + transform: translateY(-50%); + opacity: 0; + color: rgba(#000, .38); + font-size: $size; + } + + .md-ink-ripple { + color: rgba(#000, .87); + } + } + + .md-table-cell { height: 48px; + transition: $swift-ease-out; color: rgba(#000, .87); font-size: 13px; line-height: 18px; + + &:last-child .md-table-cell-container { + padding-right: 24px; + } + + .md-table-cell-container { + padding: 0 24px 0 32px; + } + + &.md-numeric { + text-align: right; + } } .md-table-selection { width: 20px; - padding-right: 0; + position: relative; vertical-align: middle; + + { + .md-table-cell .md-table-cell-container, + .md-table-head .md-table-head-container { + padding-left: 8px; + } + } + + .md-table-cell-container { + padding-right: 16px; + padding-left: 24px; + } + .md-checkbox { margin: 3px 0 0; } diff --git a/src/components/mdTable/mdTable.vue b/src/components/mdTable/mdTable.vue index 54a72c4..2747dcb 100644 --- a/src/components/mdTable/mdTable.vue +++ b/src/components/mdTable/mdTable.vue @@ -11,10 +11,14 @@ diff --git a/src/components/mdTable/mdTableHead.vue b/src/components/mdTable/mdTableHead.vue new file mode 100644 index 0000000..9b41c46 --- /dev/null +++ b/src/components/mdTable/mdTableHead.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/mdTable/mdTableRow.vue b/src/components/mdTable/mdTableRow.vue index a509bdd..1f87647 100644 --- a/src/components/mdTable/mdTableRow.vue +++ b/src/components/mdTable/mdTableRow.vue @@ -1,8 +1,8 @@