diff options
| -rw-r--r-- | src/components/checkbox/checkbox.scss | 1 | ||||
| -rw-r--r-- | src/components/list/list.vue | 2 | ||||
| -rw-r--r-- | src/components/selectable_list/selectable_list.js | 30 | ||||
| -rw-r--r-- | src/components/selectable_list/selectable_list.vue | 34 |
4 files changed, 52 insertions, 15 deletions
diff --git a/src/components/checkbox/checkbox.scss b/src/components/checkbox/checkbox.scss index 4dfcfe34..42556d89 100644 --- a/src/components/checkbox/checkbox.scss +++ b/src/components/checkbox/checkbox.scss @@ -4,6 +4,7 @@ position: relative; display: inline-block; padding-left: 1.2em; + min-height: 1.2em; &-indicator::before { position: absolute; diff --git a/src/components/list/list.vue b/src/components/list/list.vue index 9d4beb21..7136915b 100644 --- a/src/components/list/list.vue +++ b/src/components/list/list.vue @@ -1,7 +1,7 @@ <template> <div class="list"> <div v-for="item in items" class="list-item" :key="getKey(item)"> - <slot name="item" :item="item" :keyVal="getKey(item)" /> + <slot name="item" :item="item" /> </div> <div class="list-empty-content faint" v-if="items.length === 0 && !!$slots.empty"> <slot name="empty" /> diff --git a/src/components/selectable_list/selectable_list.js b/src/components/selectable_list/selectable_list.js index 93efa840..809133f5 100644 --- a/src/components/selectable_list/selectable_list.js +++ b/src/components/selectable_list/selectable_list.js @@ -6,14 +6,32 @@ const SelectableList = { List, Checkbox }, - props: List.props, + props: { + items: { + type: Array, + default: () => [] + }, + getKey: { + type: Function, + default: item => item.id + } + }, data () { return { selected: [] } }, + computed: { + allSelected () { + return !this.items.find(item => !this.isSelected(item)) + } + }, methods: { - toggle (checked, key) { + isSelected (item) { + return this.selected.indexOf(this.getKey(item)) !== -1 + }, + toggle (checked, item) { + const key = this.getKey(item) const oldChecked = this.isSelected(key) if (checked !== oldChecked) { if (checked) { @@ -23,8 +41,12 @@ const SelectableList = { } } }, - isSelected (key) { - return this.selected.indexOf(key) !== -1 + toggleAll (value) { + if (value) { + this.selected = this.items.map(this.getKey) + } else { + this.selected = [] + } } } } diff --git a/src/components/selectable_list/selectable_list.vue b/src/components/selectable_list/selectable_list.vue index d8938062..e8c5d09b 100644 --- a/src/components/selectable_list/selectable_list.vue +++ b/src/components/selectable_list/selectable_list.vue @@ -1,14 +1,21 @@ <template> - <List class="selectable-list" :items="items" :getKey="getKey"> - <template slot="item" scope="p"> - <div class="selectable-list-item-inner" :class="{ 'selectable-list-item-selected-inner': isSelected(p.keyVal) }"> - <div class="selectable-list-checkbox-wrapper"> - <Checkbox :checked="isSelected(p.keyVal)" @change="checked => toggle(checked, p.keyVal)" /> - </div> - <slot name="item" :item="p.item" /> + <div class="selectable-list"> + <div class="selectable-list-header"> + <div class="selectable-list-checkbox-wrapper"> + <Checkbox :checked="allSelected" @change="toggleAll" /> </div> - </template> - </List> + </div> + <List :items="items" :getKey="getKey"> + <template slot="item" scope="p"> + <div class="selectable-list-item-inner" :class="{ 'selectable-list-item-selected-inner': isSelected(p.item) }"> + <div class="selectable-list-checkbox-wrapper"> + <Checkbox :checked="isSelected(p.item)" @change="checked => toggle(checked, p.item)" /> + </div> + <slot name="item" :item="p.item" /> + </div> + </template> + </List> + </div> </template> <script src="./selectable_list.js"></script> @@ -19,6 +26,7 @@ .selectable-list { &-item-inner { display: flex; + align-items: center; } &-item-selected-inner { @@ -26,8 +34,14 @@ background-color: var(--lightBg, $fallback--lightBg); } + &-header { + display: flex; + align-items: center; + padding: 0.6em 0; + } + &-checkbox-wrapper { - padding: 10px; + padding: 0 10px; flex: none; } } |
