curls/server/static/dashboard/js/main/select.js

380 lines
7.9 KiB
JavaScript

/*
Used for selecting items in the container
*/
class Select {
static selected_class = `selected`
static selected_id = 0
static mouse_down = false
static mouse_selected = false
static setup() {
this.block = new Block()
}
static curl(curl) {
let item = Container.get_item(curl)
if (item) {
this.select(item)
}
}
static curls(curls) {
for (let curl of curls) {
this.curl(curl)
}
}
static check(item) {
let selected = this.get()
if (!selected.includes(item)) {
this.single(item)
}
}
static range(item) {
let selected = this.get()
if (!selected.length) {
this.single(item)
return
}
let items = Container.get_visible()
if (items.length <= 1) {
return
}
let history = this.history()
let prev = history[0]
let prev_prev = history[1] || prev
if (item === prev) {
return
}
let index = items.indexOf(item)
let prev_index = items.indexOf(prev)
let prev_prev_index = items.indexOf(prev_prev)
let direction
if (prev_index === prev_prev_index) {
if (index < prev_index) {
direction = `up`
}
else {
direction = `down`
}
}
else if (prev_index < prev_prev_index) {
direction = `up`
}
else {
direction = `down`
}
let action = (a, b) => {
this.do_range(a, b, direction)
}
if (direction === `up`) {
if (index < prev_index) {
action(index, prev_index)
}
else {
action(index, prev_prev_index)
}
}
else if (direction === `down`) {
if (index > prev_index) {
action(prev_index, index)
}
else {
action(prev_prev_index, index)
}
}
this.id_item(item)
}
static do_range(start, end, direction) {
let items = Container.get_visible()
let select = []
for (let i = 0; i < items.length; i++) {
if (i < start) {
if (direction === `up`) {
this.deselect(items[i])
}
continue
}
if (i > end) {
if (direction === `down`) {
this.deselect(items[i])
}
continue
}
select.push(items[i])
}
if (direction === `up`) {
select.reverse()
}
for (let item of select) {
this.select(item)
}
}
static vertical(direction, shift) {
if (this.block.add_charge()) {
return
}
let items = Container.get_visible()
if (!items.length) {
return
}
if (items.length === 1) {
this.single(items[0])
return
}
let selected = this.get()
let history = this.history()
let prev = history[0]
let prev_index = items.indexOf(prev)
let first_index = items.indexOf(selected[0])
if (!selected.length) {
let item
if (direction === `up`) {
item = Utils.last(items)
}
else if (direction === `down`) {
item = items[0]
}
this.single(item)
return
}
if (direction === `up`) {
if (shift) {
let item = items[prev_index - 1]
if (!item) {
return
}
this.range(item)
}
else {
let item
if (selected.length > 1) {
item = selected[0]
}
else {
let index = first_index - 1
if (index < 0) {
index = items.length - 1
}
item = items[index]
}
if (!item) {
return
}
this.single(item)
}
}
else if (direction === `down`) {
if (shift) {
let item = items[prev_index + 1]
if (!item) {
return
}
this.range(item)
}
else {
let item
if (selected.length > 1) {
item = Utils.last(selected)
}
else {
let index = first_index + 1
if (index >= items.length) {
index = 0
}
item = items[index]
}
if (!item) {
return
}
this.single(item)
}
}
}
static history() {
let items = this.get()
items = items.filter(item => {
return parseInt(item.dataset.selected_id) > 0
})
items.sort((a, b) => {
return parseInt(b.dataset.selected_id) - parseInt(a.dataset.selected_id)
})
return items
}
static get() {
return DOM.els(`#container .item.${this.selected_class}`)
}
static get_curls() {
let selected = this.get()
return selected.map(item => Container.extract_curl(item))
}
static id_item(item) {
this.selected_id += 1
item.dataset.selected_id = this.selected_id
}
static select(item, set_id = false) {
item.classList.add(this.selected_class)
if (set_id) {
this.id_item(item)
}
Utils.scroll_element({item: item})
Infobar.update_curls()
}
static deselect(item) {
item.classList.remove(this.selected_class)
item.dataset.selected_id = 0
Infobar.update_curls()
}
static toggle(item) {
if (item.classList.contains(this.selected_class)) {
this.deselect(item)
}
else {
this.select(item, true)
}
}
static deselect_all() {
let items = this.get()
for (let item of items) {
this.deselect(item)
}
this.selected_id = 0
}
static single(item) {
this.deselect_all()
this.selected_id = 0
this.select(item, true)
}
static mousedown(e) {
let item = Container.extract_item(e)
if (item) {
return
}
this.mouse_down = true
this.mouse_selected = false
e.preventDefault()
}
static mouseup() {
this.mouse_down = false
this.mouse_selected = false
}
static mouseover(e) {
if (!this.mouse_down) {
return
}
let item = Container.extract_item(e)
if (!item) {
return
}
let items = Container.get_visible()
let index = items.indexOf(item)
for (let i = 0; i < items.length; i++) {
if (i < index) {
this.deselect(items[i])
}
else {
this.select(items[i])
}
}
this.id_item(item)
}
static all() {
let items = Container.get_items()
for (let item of items) {
if (Container.is_visible(item)) {
this.select(item)
}
else {
this.deselect(item)
}
}
}
static toggle_all() {
let visible = Container.get_visible()
let selected = this.get()
if (selected.length === visible.length) {
this.deselect_all()
}
else {
this.all()
}
}
}