pleroma-fe/src/components/list/list.js

132 lines
2.7 KiB
JavaScript
Raw Normal View History

2026-06-08 04:13:17 +03:00
import Checkbox from 'src/components/checkbox/checkbox.vue'
const List = {
props: {
boxOnly: {
type: Boolean,
default: false,
},
items: {
type: Array,
default: [],
2026-06-08 04:13:17 +03:00
},
fetchFunction: {
type: Function,
default: null,
},
itemsFunction: {
type: Function,
default: null,
},
getKey: {
type: Function,
default: (item) => item.id,
},
getClass: {
type: Function,
default: () => '',
},
nonInteractive: {
type: Boolean,
default: false,
},
scrollable: {
type: Boolean,
default: false,
},
selectable: {
type: Boolean,
default: false,
},
loading: {
type: Boolean,
default: true,
},
bottomedOut: {
type: Boolean,
default: false,
},
error: {
type: String,
default: null,
},
2026-06-08 04:13:17 +03:00
},
emits: ['fetchRequested'],
2026-06-08 04:13:17 +03:00
components: {
Checkbox,
},
data() {
return {
selected: [],
}
},
computed: {
allKeys() {
return this.items.map(this.getKey)
2026-06-08 04:13:17 +03:00
},
filteredSelected() {
return this.allKeys.filter((key) => this.selected.indexOf(key) !== -1)
},
allSelected() {
return this.filteredSelected.length === this.items.length
2026-06-08 04:13:17 +03:00
},
noneSelected() {
return this.filteredSelected.length === 0
},
someSelected() {
return !this.allSelected && !this.noneSelected
},
},
created() {
window.addEventListener('scroll', this.scrollLoad)
2026-06-08 04:13:17 +03:00
if (this.items.length === 0) {
this.fetchEntries()
2026-06-08 04:13:17 +03:00
}
},
unmounted() {
window.removeEventListener('scroll', this.scrollLoad)
},
methods: {
fetchEntries() {
this.$emit('fetchRequested')
2026-06-08 04:13:17 +03:00
},
scrollLoad(e) {
if (this.fetchFunction) {
const bodyBRect = document.body.getBoundingClientRect()
const height = Math.max(bodyBRect.height, -bodyBRect.y)
if (
this.$el.offsetHeight > 0 &&
window.innerHeight + window.pageYOffset >= height - 750
) {
this.fetchEntries()
}
}
},
isSelected(item) {
return this.filteredSelected.indexOf(this.getKey(item)) !== -1
},
toggle(checked, item) {
const key = this.getKey(item)
const oldChecked = this.isSelected(key)
if (checked !== oldChecked) {
if (checked) {
this.selected.push(key)
} else {
this.selected.splice(this.selected.indexOf(key), 1)
}
}
this.$emit('selected', this.selected)
2026-06-08 04:13:17 +03:00
},
toggleAll(value) {
if (value) {
this.selected = this.allKeys.slice(0)
} else {
this.selected = []
}
this.$emit('selected', this.selected)
2026-06-08 04:13:17 +03:00
},
},
}
export default List