167 lines
4.0 KiB
TypeScript
167 lines
4.0 KiB
TypeScript
import AnimeNotifier from "../AnimeNotifier"
|
|
|
|
// Save new data from an input field
|
|
export async function save(arn: AnimeNotifier, input: HTMLElement) {
|
|
let obj = {}
|
|
let isContentEditable = input.isContentEditable
|
|
let value = isContentEditable ? input.textContent : (input as HTMLInputElement).value
|
|
|
|
if(value === undefined) {
|
|
return
|
|
}
|
|
|
|
// Trim value
|
|
value = value.trim()
|
|
|
|
if((input as HTMLInputElement).type === "number" || input.dataset.type === "number") {
|
|
if(input.getAttribute("step") === "1" || input.dataset.step === "1") {
|
|
obj[input.dataset.field] = parseInt(value)
|
|
} else {
|
|
obj[input.dataset.field] = parseFloat(value)
|
|
}
|
|
} else {
|
|
obj[input.dataset.field] = value
|
|
}
|
|
|
|
if(isContentEditable) {
|
|
input.contentEditable = "false"
|
|
} else {
|
|
(input as HTMLInputElement).disabled = true
|
|
}
|
|
|
|
let apiEndpoint = arn.findAPIEndpoint(input)
|
|
|
|
try {
|
|
await arn.post(apiEndpoint, obj)
|
|
|
|
if(apiEndpoint.startsWith("/api/user/") && input.dataset.field === "Nick") {
|
|
// Update nickname based links on the page
|
|
return arn.reloadPage()
|
|
} else if(apiEndpoint.startsWith("/api/settings/") && input.dataset.field === "Theme") {
|
|
// Reload for the theme to take effect
|
|
location.reload()
|
|
} else {
|
|
return arn.reloadContent()
|
|
}
|
|
} catch(err) {
|
|
arn.reloadContent()
|
|
arn.statusMessage.showError(err)
|
|
} finally {
|
|
if(isContentEditable) {
|
|
input.contentEditable = "true"
|
|
} else {
|
|
(input as HTMLInputElement).disabled = false
|
|
}
|
|
}
|
|
}
|
|
|
|
// Enable (bool field)
|
|
export async function enable(arn: AnimeNotifier, button: HTMLButtonElement) {
|
|
let obj = {}
|
|
let apiEndpoint = arn.findAPIEndpoint(button)
|
|
|
|
obj[button.dataset.field] = true
|
|
button.disabled = true
|
|
|
|
try {
|
|
// Update boolean value
|
|
await arn.post(apiEndpoint, obj)
|
|
|
|
// Reload content
|
|
arn.reloadContent()
|
|
|
|
arn.statusMessage.showInfo("Enabled: " + button.title)
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
} finally {
|
|
button.disabled = false
|
|
}
|
|
}
|
|
|
|
// Disable (bool field)
|
|
export async function disable(arn: AnimeNotifier, button: HTMLButtonElement) {
|
|
let obj = {}
|
|
let apiEndpoint = arn.findAPIEndpoint(button)
|
|
|
|
obj[button.dataset.field] = false
|
|
button.disabled = true
|
|
|
|
try {
|
|
// Update boolean value
|
|
await arn.post(apiEndpoint, obj)
|
|
|
|
// Reload content
|
|
arn.reloadContent()
|
|
|
|
arn.statusMessage.showInfo("Disabled: " + button.title)
|
|
} catch(err) {
|
|
arn.statusMessage.showError(err)
|
|
} finally {
|
|
button.disabled = false
|
|
}
|
|
}
|
|
|
|
// Append new element to array
|
|
export function arrayAppend(arn: AnimeNotifier, element: HTMLElement) {
|
|
let field = element.dataset.field
|
|
let object = element.dataset.object || ""
|
|
let apiEndpoint = arn.findAPIEndpoint(element)
|
|
|
|
arn.post(apiEndpoint + "/field/" + field + "/append", object)
|
|
.then(() => arn.reloadContent())
|
|
.catch(err => arn.statusMessage.showError(err))
|
|
}
|
|
|
|
// Remove element from array
|
|
export function arrayRemove(arn: AnimeNotifier, element: HTMLElement) {
|
|
if(!confirm("Are you sure you want to remove this element?")) {
|
|
return
|
|
}
|
|
|
|
let field = element.dataset.field
|
|
let index = element.dataset.index
|
|
let apiEndpoint = arn.findAPIEndpoint(element)
|
|
|
|
arn.post(apiEndpoint + "/field/" + field + "/remove/" + index)
|
|
.then(() => arn.reloadContent())
|
|
.catch(err => arn.statusMessage.showError(err))
|
|
}
|
|
|
|
// Increase episode
|
|
export function increaseEpisode(arn: AnimeNotifier, element: HTMLElement) {
|
|
if(arn.isLoading) {
|
|
return
|
|
}
|
|
|
|
let prev = element.previousSibling as HTMLElement
|
|
let episodes = parseInt(prev.textContent)
|
|
prev.textContent = String(episodes + 1)
|
|
save(arn, prev)
|
|
}
|
|
|
|
// Add number
|
|
export function addNumber(arn: AnimeNotifier, element: HTMLElement) {
|
|
if(arn.isLoading) {
|
|
return
|
|
}
|
|
|
|
let input = document.getElementById(element.dataset.id) as HTMLInputElement
|
|
let add = parseInt(element.dataset.add)
|
|
let num = parseInt(input.value)
|
|
let newValue = num + add
|
|
let min = parseInt(input.min)
|
|
let max = parseInt(input.max)
|
|
|
|
if(newValue > max) {
|
|
arn.statusMessage.showError("Maximum: " + max)
|
|
return
|
|
}
|
|
|
|
if(newValue < min) {
|
|
arn.statusMessage.showError("Minimum: " + min)
|
|
return
|
|
}
|
|
|
|
input.value = newValue.toString()
|
|
save(arn, input)
|
|
} |