lifeto-shop/src/lib/old.ts

562 lines
13 KiB
TypeScript
Raw Normal View History

2025-06-20 05:41:10 +00:00
import Handsontable from 'handsontable'
import Core from 'handsontable/core'
import { textRenderer } from 'handsontable/renderers'
import numbro from 'numbro'
import { TricksterItem } from './trickster'
2022-07-01 01:27:18 +00:00
2025-06-20 05:41:10 +00:00
export const BasicColumns = ['Image', 'Name', 'Count'] as const
2022-07-01 01:27:18 +00:00
2025-06-20 05:41:10 +00:00
export const DetailsColumns = ['Desc', 'Use'] as const
2022-07-03 10:25:12 +00:00
2025-06-20 05:41:10 +00:00
export const MoveColumns = ['MoveCount', 'Move'] as const
2022-07-03 10:25:12 +00:00
2025-06-20 05:41:10 +00:00
export const TagColumns = ['All', 'Equip', 'Drill', 'Card', 'Quest', 'Consume', 'Compound'] as const
2022-07-03 10:25:12 +00:00
2025-06-20 05:41:10 +00:00
export const EquipmentColumns = ['MinLvl', 'Slots', 'RefineNumber', 'RefineState'] as const
2022-07-03 10:25:12 +00:00
export const StatsColumns = [
2025-06-20 05:41:10 +00:00
'AP',
'GunAP',
'AC',
'DX',
'MP',
'MA',
'MD',
'WT',
'DA',
'LK',
'HP',
'DP',
'HV',
2022-07-06 07:48:11 +00:00
] as const
2025-06-20 05:41:10 +00:00
export const HackColumns = [] as const
2022-07-03 10:25:12 +00:00
export const ColumnNames = [
...BasicColumns,
...MoveColumns,
...DetailsColumns,
...EquipmentColumns,
...StatsColumns,
...TagColumns,
2022-07-06 07:48:11 +00:00
...HackColumns,
] as const
2022-07-03 10:25:12 +00:00
2025-06-20 05:41:10 +00:00
export type ColumnName = (typeof ColumnNames)[number]
2022-07-03 10:25:12 +00:00
2025-06-20 05:41:10 +00:00
const c = (a: ColumnName | ColumnInfo): ColumnName => {
switch (typeof a) {
case 'string':
2022-07-03 10:25:12 +00:00
return a
2025-06-20 05:41:10 +00:00
case 'object':
2022-07-03 10:25:12 +00:00
return a.name
}
}
2025-06-20 05:41:10 +00:00
export const LazyColumn = c
2022-07-03 16:37:06 +00:00
2025-06-20 05:41:10 +00:00
export const ColumnSorter = (a: ColumnName | ColumnInfo, b: ColumnName | ColumnInfo): number => {
const n1 = ColumnNames.indexOf(c(a))
const n2 = ColumnNames.indexOf(c(b))
if (n1 === n2) {
2022-07-03 10:25:12 +00:00
return 0
}
return n1 > n2 ? 1 : -1
}
2022-07-01 01:27:18 +00:00
2025-06-20 05:41:10 +00:00
export interface ColumnInfo {
2022-07-01 01:27:18 +00:00
name: ColumnName
2025-06-20 05:41:10 +00:00
displayName: string
2022-07-03 16:37:06 +00:00
2025-06-20 05:41:10 +00:00
options?: (s: string[]) => string[]
renderer?: any
filtering?: boolean
writable?: boolean
getter(item: TricksterItem): string | number
2022-07-01 01:27:18 +00:00
}
class Image implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Image'
displayName = ' '
2022-07-01 01:27:18 +00:00
renderer = coverRenderer
2025-06-20 05:41:10 +00:00
getter(item: TricksterItem): string | number {
return item.item_image ? item.item_image : ''
2022-07-01 01:27:18 +00:00
}
}
2025-06-20 05:41:10 +00:00
function coverRenderer(
_instance: any,
td: any,
_row: any,
_col: any,
_prop: any,
value: any,
_cellProperties: any,
) {
const stringifiedValue = Handsontable.helper.stringify(value)
2022-07-01 01:27:18 +00:00
if (stringifiedValue.startsWith('http')) {
2025-06-20 05:41:10 +00:00
const img: any = document.createElement('IMG')
img.src = value
Handsontable.dom.addEvent(img, 'mousedown', event => {
event?.preventDefault()
})
Handsontable.dom.empty(td)
td.appendChild(img)
2022-07-01 01:27:18 +00:00
} else {
}
}
class Name implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Name'
displayName = 'Name'
2022-07-01 01:27:18 +00:00
filtering = true
2022-07-03 16:37:06 +00:00
renderer = nameRenderer
2025-06-20 05:41:10 +00:00
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.item_name
}
}
2025-06-20 05:41:10 +00:00
function nameRenderer(
_instance: any,
td: any,
_row: any,
_col: any,
_prop: any,
value: any,
_cellProperties: any,
) {
const stringifiedValue = Handsontable.helper.stringify(value)
const showText = stringifiedValue
const div = document.createElement('div')
2022-07-03 16:37:06 +00:00
div.innerHTML = showText
div.title = showText
2025-06-20 05:41:10 +00:00
div.style.maxWidth = '20ch'
div.style.textOverflow = 'ellipsis'
div.style.overflow = 'hidden'
div.style.whiteSpace = 'nowrap'
Handsontable.dom.addEvent(div, 'mousedown', event => {
event?.preventDefault()
})
Handsontable.dom.empty(td)
td.appendChild(div)
td.classList.add('htLeft')
2022-07-03 16:37:06 +00:00
}
2022-07-01 01:27:18 +00:00
class Count implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Count'
displayName = 'Count'
renderer = 'numeric'
2022-07-01 01:27:18 +00:00
filtering = true
2025-06-20 05:41:10 +00:00
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.item_count
}
}
class Move implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Move'
displayName = 'Target'
2022-07-01 01:27:18 +00:00
writable = true
2022-07-03 16:37:06 +00:00
options = getMoveTargets
2025-06-20 05:41:10 +00:00
getter(_item: TricksterItem): string | number {
return '---------------------------------------------'
2022-07-01 01:27:18 +00:00
}
}
2025-06-20 05:41:10 +00:00
const getMoveTargets = (invs: string[]): string[] => {
const out: string[] = []
for (const k of invs) {
2022-07-03 16:37:06 +00:00
out.push(k)
}
2025-06-20 05:41:10 +00:00
out.push('')
out.push('')
out.push('!TRASH')
2022-07-03 16:37:06 +00:00
return out
}
2022-07-01 01:27:18 +00:00
class MoveCount implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'MoveCount'
displayName = 'Move #'
2022-07-01 01:27:18 +00:00
renderer = moveCountRenderer
writable = true
2025-06-20 05:41:10 +00:00
getter(_item: TricksterItem): string | number {
return ''
2022-07-01 01:27:18 +00:00
}
}
2025-06-20 05:41:10 +00:00
function moveCountRenderer(
instance: Core,
td: any,
row: number,
col: number,
prop: any,
value: any,
cellProperties: any,
) {
let newValue = value
2022-07-01 01:27:18 +00:00
if (Handsontable.helper.isNumeric(newValue)) {
2025-06-20 05:41:10 +00:00
const numericFormat = cellProperties.numericFormat
const cellCulture = numericFormat?.culture || '-'
const cellFormatPattern = numericFormat?.pattern
const className = cellProperties.className || ''
const classArr = className.length ? className.split(' ') : []
2022-07-01 01:27:18 +00:00
if (typeof cellCulture !== 'undefined' && !numbro.languages()[cellCulture]) {
2025-06-20 05:41:10 +00:00
const shortTag: any = cellCulture.replace('-', '')
const langData = (numbro as any)[shortTag]
2022-07-01 01:27:18 +00:00
if (langData) {
2025-06-20 05:41:10 +00:00
numbro.registerLanguage(langData)
2022-07-01 01:27:18 +00:00
}
}
2025-06-20 05:41:10 +00:00
const totalCount = Number(instance.getCell(row, col - 1)?.innerHTML)
numbro.setLanguage(cellCulture)
2022-07-01 01:27:18 +00:00
const num = numbro(newValue)
2025-06-20 05:41:10 +00:00
if (totalCount < num.value()) {
2022-07-01 01:27:18 +00:00
const newNum = numbro(totalCount)
2025-06-20 05:41:10 +00:00
newValue = newNum.format(cellFormatPattern || '0')
} else {
newValue = num.format(cellFormatPattern || '0')
2022-07-01 01:27:18 +00:00
}
2025-06-20 05:41:10 +00:00
if (
classArr.indexOf('htLeft') < 0 &&
classArr.indexOf('htCenter') < 0 &&
classArr.indexOf('htRight') < 0 &&
classArr.indexOf('htJustify') < 0
) {
classArr.push('htRight')
2022-07-01 01:27:18 +00:00
}
if (classArr.indexOf('htNumeric') < 0) {
2025-06-20 05:41:10 +00:00
classArr.push('htNumeric')
2022-07-01 01:27:18 +00:00
}
2025-06-20 05:41:10 +00:00
cellProperties.className = classArr.join(' ')
2022-07-01 01:27:18 +00:00
2025-06-20 05:41:10 +00:00
td.dir = 'ltr'
newValue = `${newValue}x`
} else {
newValue = ''
2022-07-01 01:27:18 +00:00
}
2025-06-20 05:41:10 +00:00
textRenderer(instance, td, row, col, prop, newValue, cellProperties)
2022-07-01 01:27:18 +00:00
}
class Equip implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Equip'
displayName = 'equip'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.is_equip ? 1 : 0
}
}
class Drill implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Drill'
displayName = 'drill'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.is_drill ? 1 : 0
}
}
2022-07-03 10:25:12 +00:00
class All implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'All'
displayName = 'swap'
getter(_: TricksterItem): string | number {
2022-07-03 10:25:12 +00:00
return -10000
}
}
2022-07-01 01:27:18 +00:00
class Card implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Card'
displayName = 'card'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return cardFilter(item) ? 1 : 0
}
}
2025-06-20 05:41:10 +00:00
const cardFilter = (item: TricksterItem): boolean => {
return item.item_name.endsWith(' Card') || item.item_name.startsWith('Star Card')
2022-07-01 01:27:18 +00:00
}
2022-07-03 15:50:41 +00:00
class Compound implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Compound'
displayName = 'comp'
getter(item: TricksterItem): string | number {
2022-07-03 15:50:41 +00:00
return compFilter(item) ? 1 : 0
}
}
2025-06-20 05:41:10 +00:00
const compFilter = (item: TricksterItem): boolean => {
return item.item_comment.toLowerCase().includes('compound item')
2022-07-03 15:50:41 +00:00
}
2022-07-01 01:27:18 +00:00
class Quest implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Quest'
displayName = 'quest'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return questFilter(item) ? 1 : 0
}
}
2025-06-20 05:41:10 +00:00
const questFilter = (_item: TricksterItem): boolean => {
2022-07-01 01:27:18 +00:00
return false
}
class Consume implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Consume'
displayName = 'eat'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return consumeFilter(item) ? 1 : 0
}
}
2025-06-20 05:41:10 +00:00
const consumeFilter = (item: TricksterItem): boolean => {
2022-07-03 15:50:41 +00:00
const tl = item.item_use.toLowerCase()
2025-06-20 05:41:10 +00:00
return tl.includes('recover') || tl.includes('restores')
2022-07-01 01:27:18 +00:00
}
class AP implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'AP'
displayName = 'AP'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.AP : ''
2022-07-01 01:27:18 +00:00
}
}
class GunAP implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'GunAP'
displayName = 'Gun AP'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats['Gun AP'] : ''
2022-07-01 01:27:18 +00:00
}
}
class AC implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'AC'
displayName = 'AC'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.AC : ''
2022-07-01 01:27:18 +00:00
}
}
class DX implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'DX'
displayName = 'DX'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.DX : ''
2022-07-01 01:27:18 +00:00
}
}
class MP implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'MP'
displayName = 'MP'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.MP : ''
2022-07-01 01:27:18 +00:00
}
}
class MA implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'MA'
displayName = 'MA'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.MA : ''
2022-07-01 01:27:18 +00:00
}
}
class MD implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'MD'
displayName = 'MD'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.MD : ''
2022-07-01 01:27:18 +00:00
}
}
class WT implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'WT'
displayName = 'WT'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.WT : ''
2022-07-01 01:27:18 +00:00
}
}
class DA implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'DA'
displayName = 'DA'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.DA : ''
2022-07-01 01:27:18 +00:00
}
}
class LK implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'LK'
displayName = 'LK'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.LK : ''
2022-07-01 01:27:18 +00:00
}
}
class HP implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'HP'
displayName = 'HP'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.HP : ''
2022-07-01 01:27:18 +00:00
}
}
class DP implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'DP'
displayName = 'DP'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.DP : ''
2022-07-01 01:27:18 +00:00
}
}
class HV implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'HV'
displayName = 'HV'
getter(item: TricksterItem): string | number {
return item.stats ? item.stats.HV : ''
2022-07-01 01:27:18 +00:00
}
}
class MinLvl implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'MinLvl'
displayName = 'lvl'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
//TODO:
2025-06-20 05:41:10 +00:00
return item.item_min_level ? item.item_min_level : ''
2022-07-01 01:27:18 +00:00
}
}
class Slots implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Slots'
displayName = 'slots'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
//TODO:
2025-06-20 05:41:10 +00:00
return item.item_slots ? item.item_slots : ''
2022-07-01 01:27:18 +00:00
}
}
class RefineNumber implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'RefineNumber'
displayName = 'refine'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.refine_level ? item.refine_level : 0
}
}
class RefineState implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'RefineState'
displayName = 'bork'
getter(item: TricksterItem): string | number {
2022-07-01 01:27:18 +00:00
return item.refine_state ? item.refine_state : 0
}
}
2022-07-03 10:25:12 +00:00
class Desc implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Desc'
displayName = 'desc'
2022-07-03 10:25:12 +00:00
renderer = descRenderer
2025-06-20 05:41:10 +00:00
getter(item: TricksterItem): string | number {
2024-04-09 03:42:34 +00:00
return item.item_comment
2022-07-03 10:25:12 +00:00
}
}
2025-06-20 05:41:10 +00:00
function descRenderer(
_instance: any,
td: any,
_row: any,
_col: any,
_prop: any,
value: any,
_cellProperties: any,
) {
const stringifiedValue = Handsontable.helper.stringify(value)
const showText = stringifiedValue
const div = document.createElement('div')
2022-07-03 10:25:12 +00:00
div.innerHTML = showText
div.title = showText
2025-06-20 05:41:10 +00:00
div.style.maxWidth = '30ch'
div.style.textOverflow = 'ellipsis'
div.style.overflow = 'hidden'
div.style.whiteSpace = 'nowrap'
Handsontable.dom.addEvent(div, 'mousedown', event => {
event?.preventDefault()
})
Handsontable.dom.empty(td)
td.appendChild(div)
td.classList.add('htLeft')
2022-07-03 10:25:12 +00:00
}
class Use implements ColumnInfo {
2025-06-20 05:41:10 +00:00
name: ColumnName = 'Use'
displayName = 'use'
renderer = useRenderer
getter(item: TricksterItem): string | number {
2022-07-03 10:25:12 +00:00
return item.item_use
}
}
2025-06-20 05:41:10 +00:00
function useRenderer(
_instance: any,
td: any,
_row: any,
_col: any,
_prop: any,
value: any,
_cellProperties: any,
) {
const stringifiedValue = Handsontable.helper.stringify(value)
const showText = stringifiedValue
const div = document.createElement('div')
2022-07-03 10:25:12 +00:00
div.title = showText
div.innerHTML = showText
2025-06-20 05:41:10 +00:00
div.style.maxWidth = '30ch'
div.style.textOverflow = 'ellipsis'
div.style.overflow = 'hidden'
div.style.whiteSpace = 'nowrap'
Handsontable.dom.addEvent(div, 'mousedown', event => {
event?.preventDefault()
})
Handsontable.dom.empty(td)
td.appendChild(div)
td.classList.add('htLeft')
}
export const ColumnByNames = (...n: ColumnName[]) => {
2022-07-01 01:27:18 +00:00
return n.map(ColumnByName)
}
2025-06-20 05:41:10 +00:00
export const ColumnByName = (n: ColumnName) => {
2022-07-01 01:27:18 +00:00
return Columns[n]
}
2025-06-20 05:41:10 +00:00
export const test = <T extends ColumnInfo>(n: new () => T): [string, T] => {
const nn = new n()
2022-07-06 07:48:11 +00:00
return [nn.name, nn]
}
2022-07-01 01:27:18 +00:00
2025-06-20 05:41:10 +00:00
export const Columns: { [Property in ColumnName]: ColumnInfo } = {
2022-07-03 10:25:12 +00:00
Use: new Use(),
Desc: new Desc(),
2025-06-20 05:41:10 +00:00
Image: new Image(),
Name: new Name(),
Count: new Count(),
Move: new Move(),
MoveCount: new MoveCount(),
Equip: new Equip(),
Drill: new Drill(),
Card: new Card(),
Quest: new Quest(),
Consume: new Consume(),
AP: new AP(),
GunAP: new GunAP(),
AC: new AC(),
DX: new DX(),
MP: new MP(),
MA: new MA(),
MD: new MD(),
WT: new WT(),
DA: new DA(),
LK: new LK(),
HP: new HP(),
DP: new DP(),
HV: new HV(),
MinLvl: new MinLvl(),
Slots: new Slots(),
RefineNumber: new RefineNumber(),
RefineState: new RefineState(),
2022-07-03 10:25:12 +00:00
All: new All(),
2022-07-03 15:50:41 +00:00
Compound: new Compound(),
2022-07-01 01:27:18 +00:00
}