This commit is contained in:
Leon Liu 2025-01-05 15:14:40 +09:00
parent ed6bf05a59
commit 1ac7b925a2
12 changed files with 682 additions and 450 deletions

BIN
bun.lockb

Binary file not shown.

View File

@ -14,6 +14,7 @@
},
"dependencies": {
"@tauri-apps/plugin-fs": "~2",
"@tauri-apps/plugin-http": "~2",
"file-saver": "^2.0.5",
"fp-ts": "^2.16.9",
"pinia": "^2.3.0",

368
src-tauri/Cargo.lock generated
View File

@ -100,6 +100,7 @@ dependencies = [
"tauri",
"tauri-build",
"tauri-plugin-fs",
"tauri-plugin-http",
"tauri-plugin-log",
]
@ -132,6 +133,12 @@ dependencies = [
"system-deps",
]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
version = "1.4.0"
@ -464,7 +471,7 @@ dependencies = [
"bitflags 2.6.0",
"block",
"cocoa-foundation",
"core-foundation",
"core-foundation 0.10.0",
"core-graphics",
"foreign-types",
"libc",
@ -479,7 +486,7 @@ checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d"
dependencies = [
"bitflags 2.6.0",
"block",
"core-foundation",
"core-foundation 0.10.0",
"core-graphics-types",
"libc",
"objc",
@ -507,10 +514,39 @@ version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
dependencies = [
"percent-encoding",
"time",
"version_check",
]
[[package]]
name = "cookie_store"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9"
dependencies = [
"cookie",
"document-features",
"idna",
"log",
"publicsuffix",
"serde",
"serde_derive",
"serde_json",
"time",
"url",
]
[[package]]
name = "core-foundation"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "core-foundation"
version = "0.10.0"
@ -534,7 +570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
dependencies = [
"bitflags 2.6.0",
"core-foundation",
"core-foundation 0.10.0",
"core-graphics-types",
"foreign-types",
"libc",
@ -547,7 +583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
dependencies = [
"bitflags 2.6.0",
"core-foundation",
"core-foundation 0.10.0",
"libc",
]
@ -666,6 +702,12 @@ dependencies = [
"syn 2.0.94",
]
[[package]]
name = "data-url"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
[[package]]
name = "deranged"
version = "0.3.11"
@ -760,6 +802,15 @@ dependencies = [
"syn 2.0.94",
]
[[package]]
name = "document-features"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
dependencies = [
"litrs",
]
[[package]]
name = "dpi"
version = "0.1.1"
@ -816,6 +867,15 @@ version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
[[package]]
name = "encoding_rs"
version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
"cfg-if",
]
[[package]]
name = "env_filter"
version = "0.1.3"
@ -1146,8 +1206,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
"wasm-bindgen",
]
[[package]]
@ -1304,6 +1366,25 @@ dependencies = [
"syn 2.0.94",
]
[[package]]
name = "h2"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
dependencies = [
"atomic-waker",
"bytes",
"fnv",
"futures-core",
"futures-sink",
"http",
"indexmap 2.7.0",
"slab",
"tokio",
"tokio-util",
"tracing",
]
[[package]]
name = "hashbrown"
version = "0.12.3"
@ -1400,6 +1481,7 @@ dependencies = [
"bytes",
"futures-channel",
"futures-util",
"h2",
"http",
"http-body",
"httparse",
@ -1410,6 +1492,24 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.27.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
"futures-util",
"http",
"hyper",
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
"webpki-roots",
]
[[package]]
name = "hyper-util"
version = "0.1.10"
@ -1819,6 +1919,12 @@ version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
[[package]]
name = "litrs"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
[[package]]
name = "lock_api"
version = "0.4.12"
@ -2582,6 +2688,12 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "psl-types"
version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"
[[package]]
name = "ptr_meta"
version = "0.1.4"
@ -2602,6 +2714,16 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "publicsuffix"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf"
dependencies = [
"idna",
"psl-types",
]
[[package]]
name = "quick-xml"
version = "0.32.0"
@ -2611,6 +2733,58 @@ dependencies = [
"memchr",
]
[[package]]
name = "quinn"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
dependencies = [
"bytes",
"pin-project-lite",
"quinn-proto",
"quinn-udp",
"rustc-hash",
"rustls",
"socket2",
"thiserror 2.0.9",
"tokio",
"tracing",
]
[[package]]
name = "quinn-proto"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
dependencies = [
"bytes",
"getrandom 0.2.15",
"rand 0.8.5",
"ring",
"rustc-hash",
"rustls",
"rustls-pki-types",
"slab",
"thiserror 2.0.9",
"tinyvec",
"tracing",
"web-time",
]
[[package]]
name = "quinn-udp"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904"
dependencies = [
"cfg_aliases 0.2.1",
"libc",
"once_cell",
"socket2",
"tracing",
"windows-sys 0.59.0",
]
[[package]]
name = "quote"
version = "1.0.38"
@ -2779,12 +2953,17 @@ checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
dependencies = [
"base64 0.22.1",
"bytes",
"cookie",
"cookie_store",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-util",
"ipnet",
"js-sys",
@ -2793,11 +2972,17 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls",
"rustls-pemfile",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"system-configuration",
"tokio",
"tokio-rustls",
"tokio-util",
"tower",
"tower-service",
@ -2806,9 +2991,25 @@ dependencies = [
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
"webpki-roots",
"windows-registry",
]
[[package]]
name = "ring"
version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
"getrandom 0.2.15",
"libc",
"spin",
"untrusted",
"windows-sys 0.52.0",
]
[[package]]
name = "rkyv"
version = "0.7.45"
@ -2860,6 +3061,12 @@ version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc-hash"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497"
[[package]]
name = "rustc_version"
version = "0.4.1"
@ -2869,6 +3076,49 @@ dependencies = [
"semver",
]
[[package]]
name = "rustls"
version = "0.23.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b"
dependencies = [
"once_cell",
"ring",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-pemfile"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37"
dependencies = [
"web-time",
]
[[package]]
name = "rustls-webpki"
version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
"rustls-pki-types",
"untrusted",
]
[[package]]
name = "ryu"
version = "1.0.18"
@ -3208,6 +3458,12 @@ dependencies = [
"system-deps",
]
[[package]]
name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
[[package]]
name = "stable_deref_trait"
version = "1.2.0"
@ -3246,6 +3502,12 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "swift-rs"
version = "1.0.7"
@ -3311,6 +3573,27 @@ dependencies = [
"syn 2.0.94",
]
[[package]]
name = "system-configuration"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags 2.6.0",
"core-foundation 0.9.4",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "system-deps"
version = "6.2.2"
@ -3332,7 +3615,7 @@ checksum = "cc6b53216f32e60efc27dfa111268481e4dfba53e553e4cdebcaed9db36c11bb"
dependencies = [
"bitflags 2.6.0",
"cocoa",
"core-foundation",
"core-foundation 0.10.0",
"core-graphics",
"crossbeam-channel",
"dispatch",
@ -3538,6 +3821,28 @@ dependencies = [
"uuid",
]
[[package]]
name = "tauri-plugin-http"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e62a9bde54d6a0218b63f5a248f02056ad4316ba6ad81dfb9e4f73715df5deb1"
dependencies = [
"data-url",
"http",
"regex",
"reqwest",
"schemars",
"serde",
"serde_json",
"tauri",
"tauri-plugin",
"tauri-plugin-fs",
"thiserror 2.0.9",
"tokio",
"url",
"urlpattern",
]
[[package]]
name = "tauri-plugin-log"
version = "2.2.0"
@ -3779,9 +4084,31 @@ dependencies = [
"mio",
"pin-project-lite",
"socket2",
"tokio-macros",
"windows-sys 0.52.0",
]
[[package]]
name = "tokio-macros"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.94",
]
[[package]]
name = "tokio-rustls"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
dependencies = [
"rustls",
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.13"
@ -3992,6 +4319,12 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
version = "2.5.4"
@ -4209,6 +4542,16 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "web-time"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "webkit2gtk"
version = "2.0.1"
@ -4253,6 +4596,15 @@ dependencies = [
"system-deps",
]
[[package]]
name = "webpki-roots"
version = "0.26.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "webview2-com"
version = "0.34.0"
@ -4811,6 +5163,12 @@ dependencies = [
"synstructure",
]
[[package]]
name = "zeroize"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
[[package]]
name = "zerovec"
version = "0.10.4"

View File

@ -24,3 +24,4 @@ log = "0.4"
tauri = { version = "2.2.0", features = [] }
tauri-plugin-log = "2.0.0-rc"
tauri-plugin-fs = "2"
tauri-plugin-http = "2"

View File

@ -10,11 +10,26 @@
"fs:default",
{
"identifier": "fs:scope",
"allow": [{ "path": "$DOCUMENT/My Games/Path of Exile 2" }, { "path": "$DOCUMENT/My Games/Path of Exile 2/**" }]
"allow": [
{
"path": "$DOCUMENT/My Games/Path of Exile 2"
},
{
"path": "$DOCUMENT/My Games/Path of Exile 2/**"
}
]
},
{
"identifier": "fs:allow-write-text-file",
"allow": [ { "path": "$DOCUMENT/My Games/Path of Exile 2/*" }]
"allow": [
{
"path": "$DOCUMENT/My Games/Path of Exile 2/*"
}
]
},
{
"identifier": "http:default",
"allow": [{ "url": "https://raw.githubusercontent.com/NeverSinkDev/NeverSink-PoE2litefilter/refs/heads/main/NeverSinks%20Litefilter.filter" }]
}
]
}

View File

@ -1,6 +1,7 @@
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_http::init())
.plugin(tauri_plugin_fs::init())
.setup(|app| {
if cfg!(debug_assertions) {

View File

@ -7,6 +7,7 @@ import { computed, ref, toRaw, watch } from 'vue'
import { generateFilterText, type Filter, type FilterConfig, type FilterNode } from './models'
import { filterToTreeNode, treeNodeToFilter } from './services/filter'
import { BaseDirectory, writeTextFile, lstat, readDir, readTextFile } from '@tauri-apps/plugin-fs';
import { fetch } from '@tauri-apps/plugin-http';
const darkMode = ref(document.documentElement.classList.contains('dark'))
@ -45,10 +46,10 @@ const FILTER_SUFFIX = 'filter'
const BASE_DIR = BaseDirectory.Document
async function save(toastOnComplete?: boolean) {
if (nodes.value && !!filterName.value) {
if (nodes.value && !!filterName.value && !!neversinkBaseFilter.value) {
const filters = toRaw(nodes.value).map(treeNodeToFilter)
let text = generateFilterText(filters)
let text = neversinkBaseFilter.value + "\n\n" + generateFilterText(filters)
await Promise.all([writeTextFile(`${POE2_FOLDER}/${PREFIX} ${filterName.value}.${CONFIG_SUFFIX}`, JSON.stringify({ filters }, null, 2), {
baseDir: BASE_DIR,
}), writeTextFile(`${POE2_FOLDER}/${PREFIX} ${filterName.value}.${FILTER_SUFFIX}`, text, {
@ -114,6 +115,17 @@ const loadName = ref()
const saveName = ref()
const overwrite = computed(() => filterNames.value.includes(saveName.value))
const neversinkBaseFilter = ref("")
async function fetchBaseFilter() {
const response = await fetch('https://raw.githubusercontent.com/NeverSinkDev/NeverSink-PoE2litefilter/refs/heads/main/NeverSinks%20Litefilter.filter', {
method: 'GET',
});
neversinkBaseFilter.value = await response.text()
}
fetchBaseFilter();
</script>
<template>

View File

@ -1,9 +1,10 @@
<script setup lang="ts">
import { toDisplayLines, type Filter, type FilterNode, type FilterRule } from '@/models';
import { toDisplayLines, type Filter, type FilterNode, type FilterRule, type GameColor, type Shape } from '@/models';
import { computed, ref, watchEffect } from 'vue'
import { Button, ColorPicker, ScrollPanel, Tabs, Tab, TabPanels, TabList, TabPanel, ToggleButton, InputText, InputNumber, Select, ToggleSwitch, MultiSelect } from 'primevue'
import { useConfirm } from "primevue/useconfirm";
import { useToast } from "primevue/usetoast";
import RuleLine from './RuleLine.vue'
import { CLASSES, COLORS, BASE_TYPES, RARITIES, SHAPES, OPERATORS, ARMOUR_TYPES } from '@/models/settings';
const confirm = useConfirm();
@ -128,247 +129,99 @@ function mergeLookup([childValue, childLookup]: any, [parentValue, parentLookup]
<col class="w-full">
</colgroup>
<tbody>
<tr>
<td class="pr-4 whitespace-nowrap">
Class
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].class != 'inherit'" class="align-middle"
:model-value="filter.rule.class != undefined"
@update:model-value="filter.rule.class = $event ? [] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11">
<MultiSelect v-if="ruleWithLookup[1].class != 'inherit' && filter.rule.class"
v-model="filter.rule.class" display="chip" :options="CLASSES.slice()" filter
placeholder="Select Classes" class="w-full" :maxSelectedLabels=3 fluid />
<RuleLine v-slot="slotProps" title="Class" :inherit-value="ruleWithLookup[0].class"
:inherit="ruleWithLookup[1].class == 'inherit'" :default-value="[]" v-model="filter.rule.class">
<MultiSelect v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value"
@update:model-value="filter.rule.class = $event" display="chip" :options="CLASSES.slice()" filter
placeholder="Select Classes" class="w-full" :maxSelectedLabels=3 fluid />
</RuleLine>
<RuleLine v-slot="slotProps" title="BaseType" :inherit-value="ruleWithLookup[0].base_type"
:inherit="ruleWithLookup[1].base_type == 'inherit'" :default-value="[]" v-model="filter.rule.base_type">
<MultiSelect v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value"
@update:model-value="filter.rule.base_type = $event" display="chip" :options="BASE_TYPES.slice()"
filter placeholder="Select Base Types" class="w-full" :maxSelectedLabels=3 fluid />
</RuleLine>
<RuleLine v-if="filter.type === 'leaf'" title="ArmourType" :default-value="[]" :inherit="false"
:inherit-value="undefined" v-model="filter.leafRule.armour_type" v-slot="slotProps">
<MultiSelect v-if="slotProps.value" v-model="filter.leafRule.armour_type" display="chip"
:options="ARMOUR_TYPES.slice()" filter placeholder="Select Armour Types" class="w-full"
:maxSelectedLabels=3 fluid />
</RuleLine>
<RuleLine title="Rarity" :default-value="['=', 'Normal']" :inherit="ruleWithLookup[1].rarity == 'inherit'"
:inherit-value="ruleWithLookup[0].rarity" v-model="filter.rule.rarity" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.rarity![0] = $event" :options="OPERATORS.slice()" />
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[1]"
@update:model-value="filter.rule.rarity![1] = $event" :options="RARITIES.slice()" />
</RuleLine>
<RuleLine title="Sockets" :default-value="['>', 0]" :inherit="ruleWithLookup[1].sockets == 'inherit'"
:inherit-value="ruleWithLookup[0].sockets" v-model="filter.rule.sockets" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.sockets![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.sockets![1] = $event"
:min="0" />
</RuleLine>
<RuleLine title="Quality" :default-value="['>', 0]" :inherit="ruleWithLookup[1].quality == 'inherit'"
:inherit-value="ruleWithLookup[0].quality" v-model="filter.rule.quality" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.quality![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.quality![1] = $event"
:min="0" />
</RuleLine>
<RuleLine title="StackSize" :default-value="['>', 0]" :inherit="ruleWithLookup[1].stack_size == 'inherit'"
:inherit-value="ruleWithLookup[0].stack_size" v-model="filter.rule.stack_size" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.stack_size![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.stack_size![1] = $event"
:min="0" />
</RuleLine>
<RuleLine title="AreaLevel" :default-value="['>', 0]" :inherit="ruleWithLookup[1].area_level == 'inherit'"
:inherit-value="ruleWithLookup[0].area_level" v-model="filter.rule.area_level" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.area_level![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.area_level![1] = $event"
:min="0" />
</RuleLine>
<RuleLine title="DropLevel" :default-value="['>', 0]" :inherit="ruleWithLookup[1].drop_level == 'inherit'"
:inherit-value="ruleWithLookup[0].drop_level" v-model="filter.rule.drop_level" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.drop_level![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.drop_level![1] = $event"
:min="0" />
</RuleLine>
<RuleLine title="ItemLevel" :default-value="['>', 0]" :inherit="ruleWithLookup[1].item_level == 'inherit'"
:inherit-value="ruleWithLookup[0].item_level" v-model="filter.rule.item_level" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.item_level![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number" @update:model-value="filter.rule.item_level![1] = $event"
:min="0" />
</RuleLine>
<RuleLine v-if="filter.type === 'leaf'" title="(Area - Drop)Level" :default-value="['>', 0]"
:inherit="false" :inherit-value="undefined" v-model="filter.leafRule.area_minus_drop_level"
v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.leafRule.area_minus_drop_level![0] = $event"
:options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number"
@update:model-value="filter.leafRule.area_minus_drop_level![1] = $event" :min="0" />
</RuleLine>
<MultiSelect disabled v-if="ruleWithLookup[1].class == 'inherit'"
:model-value="ruleWithLookup[0].class" display="chip" :options="CLASSES.slice()" filter
placeholder="Select Classes" class="w-full" :maxSelectedLabels=3 fluid />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
BaseType
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].base_type != 'inherit'" class="align-middle"
:model-value="filter.rule.base_type != undefined"
@update:model-value="filter.rule.base_type = $event ? [] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11">
<MultiSelect v-if="ruleWithLookup[1].base_type != 'inherit' && filter.rule.base_type"
v-model="filter.rule.base_type" display="chip" :options="BASE_TYPES.slice()" filter
placeholder="Select Base Types" class="w-full" :maxSelectedLabels=3 fluid />
<MultiSelect disabled v-if="ruleWithLookup[1].base_type == 'inherit'"
:model-value="ruleWithLookup[0].base_type" display="chip" :options="BASE_TYPES.slice()" filter
placeholder="Select Base Types" class="w-full" :maxSelectedLabels=3 fluid />
</td>
</tr>
<tr v-if="filter.type === 'leaf'">
<td class="pr-4 whitespace-nowrap">
ArmourType
</td>
<td class="pr-4">
<ToggleSwitch class="align-middle" :model-value="filter.leafRule.armour_type != undefined"
@update:model-value="filter.leafRule.armour_type = $event ? [] : undefined" />
</td>
<td class="h-11">
<MultiSelect v-if="filter.leafRule.armour_type" v-model="filter.leafRule.armour_type" display="chip"
:options="ARMOUR_TYPES.slice()" filter placeholder="Select Base Types" class="w-full"
:maxSelectedLabels=3 fluid />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
Rarity
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].rarity != 'inherit'" class="align-middle"
:model-value="filter.rule.rarity != undefined"
@update:model-value="filter.rule.rarity = $event ? ['=', 'Normal'] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].rarity != 'inherit' && filter.rule.rarity"
v-model="filter.rule.rarity[0]" :options="OPERATORS.slice()" />
<Select v-if="ruleWithLookup[1].rarity != 'inherit' && filter.rule.rarity"
v-model="filter.rule.rarity[1]" :options="RARITIES.slice()" />
<Select disabled v-if="ruleWithLookup[1].rarity == 'inherit'"
:model-value="ruleWithLookup[0].rarity![0]" :options="OPERATORS.slice()" />
<Select disabled v-if="ruleWithLookup[1].rarity == 'inherit'"
:model-value="ruleWithLookup[0].rarity![1]" :options="RARITIES.slice()" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
Sockets
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].sockets != 'inherit'" class="align-middle"
:model-value="filter.rule.sockets != undefined"
@update:model-value="filter.rule.sockets = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].sockets != 'inherit' && filter.rule.sockets"
v-model="filter.rule.sockets[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid v-if="ruleWithLookup[1].sockets != 'inherit' && filter.rule.sockets"
v-model="filter.rule.sockets[1]" />
<Select disabled v-if="ruleWithLookup[1].sockets == 'inherit'"
:model-value="ruleWithLookup[0].sockets![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].sockets == 'inherit'"
:model-value="ruleWithLookup[0].sockets![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
Quality
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].quality != 'inherit'" class="align-middle"
:model-value="filter.rule.quality != undefined"
@update:model-value="filter.rule.quality = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].quality != 'inherit' && filter.rule.quality"
v-model="filter.rule.quality[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid v-if="ruleWithLookup[1].quality != 'inherit' && filter.rule.quality"
v-model="filter.rule.quality[1]" />
<Select disabled v-if="ruleWithLookup[1].quality == 'inherit'"
:model-value="ruleWithLookup[0].quality![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].quality == 'inherit'"
:model-value="ruleWithLookup[0].quality![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
StackSize
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].stack_size != 'inherit'" class="align-middle"
:model-value="filter.rule.stack_size != undefined"
@update:model-value="filter.rule.stack_size = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].stack_size != 'inherit' && filter.rule.stack_size"
v-model="filter.rule.stack_size[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].stack_size != 'inherit' && filter.rule.stack_size"
v-model="filter.rule.stack_size[1]" />
<Select disabled v-if="ruleWithLookup[1].stack_size == 'inherit'"
:model-value="ruleWithLookup[0].stack_size![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].stack_size == 'inherit'"
:model-value="ruleWithLookup[0].stack_size![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
AreaLevel
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].area_level != 'inherit'" class="align-middle"
:model-value="filter.rule.area_level != undefined"
@update:model-value="filter.rule.area_level = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].area_level != 'inherit' && filter.rule.area_level"
v-model="filter.rule.area_level[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].area_level != 'inherit' && filter.rule.area_level"
v-model="filter.rule.area_level[1]" />
<Select disabled v-if="ruleWithLookup[1].area_level == 'inherit'"
:model-value="ruleWithLookup[0].area_level![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].area_level == 'inherit'"
:model-value="ruleWithLookup[0].area_level![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
DropLevel
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].drop_level != 'inherit'" class="align-middle"
:model-value="filter.rule.drop_level != undefined"
@update:model-value="filter.rule.drop_level = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].drop_level != 'inherit' && filter.rule.drop_level"
v-model="filter.rule.drop_level[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].drop_level != 'inherit' && filter.rule.drop_level"
v-model="filter.rule.drop_level[1]" />
<Select disabled v-if="ruleWithLookup[1].drop_level == 'inherit'"
:model-value="ruleWithLookup[0].drop_level![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].drop_level == 'inherit'"
:model-value="ruleWithLookup[0].drop_level![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
ItemLevel
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].item_level != 'inherit'" class="align-middle"
:model-value="filter.rule.item_level != undefined"
@update:model-value="filter.rule.item_level = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].item_level != 'inherit' && filter.rule.item_level"
v-model="filter.rule.item_level[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].item_level != 'inherit' && filter.rule.item_level"
v-model="filter.rule.item_level[1]" />
<Select disabled v-if="ruleWithLookup[1].item_level == 'inherit'"
:model-value="ruleWithLookup[0].item_level![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].item_level == 'inherit'"
:model-value="ruleWithLookup[0].item_level![1]" />
</td>
</tr>
<tr v-if="filter.type === 'leaf'">
<td class="pr-4 whitespace-nowrap">
(Area - Drop)Level
</td>
<td class="pr-4">
<ToggleSwitch class="align-middle" :model-value="filter.leafRule.area_minus_drop_level != undefined"
@update:model-value="filter.leafRule.area_minus_drop_level = $event ? ['>', 0] : undefined" />
</td>
<td class="h-11 flex gap-2">
<Select v-if="filter.leafRule.area_minus_drop_level"
v-model="filter.leafRule.area_minus_drop_level[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid v-if="filter.leafRule.area_minus_drop_level"
v-model="filter.leafRule.area_minus_drop_level[1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
WaystoneTier
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].waystone_tier != 'inherit'" class="align-middle"
:model-value="filter.rule.waystone_tier != undefined"
@update:model-value="filter.rule.waystone_tier = $event ? ['>', 0] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].waystone_tier != 'inherit' && filter.rule.waystone_tier"
v-model="filter.rule.waystone_tier[0]" :options="OPERATORS.slice()" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].waystone_tier != 'inherit' && filter.rule.waystone_tier"
v-model="filter.rule.waystone_tier[1]" />
<Select disabled v-if="ruleWithLookup[1].waystone_tier == 'inherit'"
:model-value="ruleWithLookup[0].waystone_tier![0]" :options="OPERATORS.slice()" />
<InputNumber disabled class="w-16" fluid v-if="ruleWithLookup[1].waystone_tier == 'inherit'"
:model-value="ruleWithLookup[0].waystone_tier![1]" />
</td>
</tr>
<RuleLine title="WaystoneTier" :default-value="['>', 0]"
:inherit="ruleWithLookup[1].waystone_tier == 'inherit'" :inherit-value="ruleWithLookup[0].waystone_tier"
v-model="filter.rule.waystone_tier" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[0]"
@update:model-value="filter.rule.waystone_tier![0] = $event" :options="OPERATORS.slice()" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1] as number"
@update:model-value="filter.rule.waystone_tier![1] = $event" :min="0" />
</RuleLine>
</tbody>
</table>
</TabPanel>
@ -381,148 +234,94 @@ function mergeLookup([childValue, childLookup]: any, [parentValue, parentLookup]
<col class="w-full">
</colgroup>
<tbody>
<tr>
<td class="pr-4 whitespace-nowrap">
SetFontSize
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].set_font_size != 'inherit'" class="align-middle"
:model-value="filter.rule.set_font_size != undefined"
@update:model-value="filter.rule.set_font_size = $event ? 40 : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11">
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].set_font_size != 'inherit' && filter.rule.set_font_size"
v-model="filter.rule.set_font_size" />
<RuleLine title="SetFontSize" :default-value="33" :inherit="ruleWithLookup[1].set_font_size == 'inherit'"
:inherit-value="ruleWithLookup[0].set_font_size" v-model="filter.rule.set_font_size" v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value" @update:model-value="filter.rule.set_font_size = $event" :min="1"
:max="45" />
</RuleLine>
<RuleLine title="SetTextColor" :default-value="{ r: 0, g: 0, b: 0, a: 0 }"
:inherit="ruleWithLookup[1].set_text_color == 'inherit'"
:inherit-value="ruleWithLookup[0].set_text_color" v-model="filter.rule.set_text_color"
v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.r" @update:model-value="filter.rule.set_text_color!.r = $event" :min="0"
:max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.g" @update:model-value="filter.rule.set_text_color!.g = $event" :min="0"
:max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.b" @update:model-value="filter.rule.set_text_color!.b = $event" :min="0"
:max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.a" @update:model-value="filter.rule.set_text_color!.a = $event" :min="0"
:max="255" />
</RuleLine>
<InputNumber class="w-16" fluid disabled v-if="ruleWithLookup[1].set_font_size == 'inherit'"
:model-value="ruleWithLookup[0].set_font_size" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
SetTextColor
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].set_text_color != 'inherit'" class="align-middle"
:model-value="filter.rule.set_text_color != undefined"
@update:model-value="filter.rule.set_text_color = $event ? { r: 100, g: 102, b: 241 } : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<ColorPicker class="flex items-center" format="rgb"
v-if="ruleWithLookup[1].set_text_color != 'inherit' && filter.rule.set_text_color"
v-model="filter.rule.set_text_color" />
<ColorPicker class="flex items-center" format="rgb" disabled
v-if="ruleWithLookup[1].set_text_color == 'inherit'"
:model-value="ruleWithLookup[0].set_text_color" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
SetBackgroundColor
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].set_background_color != 'inherit'" class="align-middle"
:model-value="filter.rule.set_background_color != undefined"
@update:model-value="filter.rule.set_background_color = $event ? { r: 100, g: 102, b: 241 } : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<ColorPicker class="flex items-center" format="rgb"
v-if="ruleWithLookup[1].set_background_color != 'inherit' && filter.rule.set_background_color"
v-model="filter.rule.set_background_color" />
<ColorPicker class="flex items-center" format="rgb" disabled
v-if="ruleWithLookup[1].set_background_color == 'inherit'"
:model-value="ruleWithLookup[0].set_background_color" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
SetBorderColor
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].set_border_color != 'inherit'" class="align-middle"
:model-value="filter.rule.set_border_color != undefined"
@update:model-value="filter.rule.set_border_color = $event ? { r: 100, g: 102, b: 241 } : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<ColorPicker class="flex items-center" format="rgb"
v-if="ruleWithLookup[1].set_border_color != 'inherit' && filter.rule.set_border_color"
v-model="filter.rule.set_border_color" />
<ColorPicker class="flex items-center" format="rgb" disabled
v-if="ruleWithLookup[1].set_border_color == 'inherit'"
:model-value="ruleWithLookup[0].set_border_color" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
PlayAlertSound
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].play_alert_sound != 'inherit'" class="align-middle"
:model-value="filter.rule.play_alert_sound != undefined"
@update:model-value="filter.rule.play_alert_sound = $event ? [2, 300] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].play_alert_sound != 'inherit' && filter.rule.play_alert_sound"
v-model="filter.rule.play_alert_sound[0]" />
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].play_alert_sound != 'inherit' && filter.rule.play_alert_sound"
v-model="filter.rule.play_alert_sound[1]" />
<InputNumber class="w-16" fluid disabled v-if="ruleWithLookup[1].play_alert_sound == 'inherit'"
:model-value="ruleWithLookup[0].play_alert_sound![0]" />
<InputNumber class="w-16" fluid disabled v-if="ruleWithLookup[1].play_alert_sound == 'inherit'"
:model-value="ruleWithLookup[0].play_alert_sound![1]" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
MinimapIcon
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].minimap_icon != 'inherit'" class="align-middle"
:model-value="filter.rule.minimap_icon != undefined"
@update:model-value="filter.rule.minimap_icon = $event ? [2, 'White', 'Circle'] : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<InputNumber class="w-16" fluid
v-if="ruleWithLookup[1].minimap_icon != 'inherit' && filter.rule.minimap_icon"
v-model="filter.rule.minimap_icon[0]" />
<Select v-if="ruleWithLookup[1].minimap_icon != 'inherit' && filter.rule.minimap_icon"
v-model="filter.rule.minimap_icon[1]" :options="COLORS.slice()" />
<Select v-if="ruleWithLookup[1].minimap_icon != 'inherit' && filter.rule.minimap_icon"
v-model="filter.rule.minimap_icon[2]" :options="SHAPES.slice()" />
<InputNumber class="w-16" fluid v-if="ruleWithLookup[1].minimap_icon == 'inherit'" disabled
:model-value="ruleWithLookup[0].minimap_icon![0]" />
<Select v-if="ruleWithLookup[1].minimap_icon == 'inherit'" disabled
:model-value="ruleWithLookup[0].minimap_icon![1]" :options="COLORS.slice()" />
<Select v-if="ruleWithLookup[1].minimap_icon == 'inherit'" disabled
:model-value="ruleWithLookup[0].minimap_icon![2]" :options="SHAPES.slice()" />
</td>
</tr>
<tr>
<td class="pr-4 whitespace-nowrap">
PlayEffect
</td>
<td class="pr-4">
<ToggleSwitch v-if="ruleWithLookup[1].play_effect != 'inherit'" class="align-middle"
:model-value="filter.rule.play_effect != undefined"
@update:model-value="filter.rule.play_effect = $event ? 'White' : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<Select v-if="ruleWithLookup[1].play_effect != 'inherit' && filter.rule.play_effect"
v-model="filter.rule.play_effect" :options="COLORS.slice()" />
<Select v-if="ruleWithLookup[1].play_effect == 'inherit'" disabled
:model-value="ruleWithLookup[0].play_effect" :options="COLORS.slice()" />
</td>
</tr>
<RuleLine title="SetBackgroundColor" :default-value="{ r: 0, g: 0, b: 0, a: 0 }"
:inherit="ruleWithLookup[1].set_background_color == 'inherit'"
:inherit-value="ruleWithLookup[0].set_background_color" v-model="filter.rule.set_background_color"
v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.r" @update:model-value="filter.rule.set_background_color!.r = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.g" @update:model-value="filter.rule.set_background_color!.g = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.b" @update:model-value="filter.rule.set_background_color!.b = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.a" @update:model-value="filter.rule.set_background_color!.a = $event"
:min="0" :max="255" />
</RuleLine>
<RuleLine title="SetBorderColor" :default-value="{ r: 0, g: 0, b: 0, a: 0 }"
:inherit="ruleWithLookup[1].set_border_color == 'inherit'"
:inherit-value="ruleWithLookup[0].set_border_color" v-model="filter.rule.set_border_color"
v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.r" @update:model-value="filter.rule.set_border_color!.r = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.g" @update:model-value="filter.rule.set_border_color!.g = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.b" @update:model-value="filter.rule.set_border_color!.b = $event"
:min="0" :max="255" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value.a" @update:model-value="filter.rule.set_border_color!.a = $event"
:min="0" :max="255" />
</RuleLine>
<RuleLine title="PlayAlertSound" :default-value="[2, 300]"
:inherit="ruleWithLookup[1].play_alert_sound == 'inherit'"
:inherit-value="ruleWithLookup[0].play_alert_sound" v-model="filter.rule.play_alert_sound"
v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[0]" @update:model-value="filter.rule.play_alert_sound![0] = $event"
:min="1" :max="16" />
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[1]" @update:model-value="filter.rule.play_alert_sound![1] = $event"
:min="0" :max="300" />
</RuleLine>
<RuleLine title="MinimapIcon" :default-value="[2, 'White', 'Circle']"
:inherit="ruleWithLookup[1].minimap_icon == 'inherit'" :inherit-value="ruleWithLookup[0].minimap_icon"
v-model="filter.rule.minimap_icon" v-slot="slotProps">
<InputNumber v-if="slotProps.value" :disabled="slotProps.disabled" class="w-16" fluid
:model-value="slotProps.value[0] as number"
@update:model-value="filter.rule.minimap_icon![0] = $event" :min="0" :max="2" />
<Select v-if="slotProps.value" :disabled="slotProps.disabled"
:model-value="slotProps.value[1] as GameColor"
@update:model-value="filter.rule.minimap_icon![1] = $event" :options="COLORS.slice()" />
<Select v-if="slotProps.value" :disabled="slotProps.disabled" :model-value="slotProps.value[2] as Shape"
@update:model-value="filter.rule.minimap_icon![2] = $event" :options="SHAPES.slice()" />
</RuleLine>
<RuleLine title="PlayEffect" :default-value="'White'"
:inherit="ruleWithLookup[1].play_effect == 'inherit'" :inherit-value="ruleWithLookup[0].play_effect"
v-model="filter.rule.play_effect" v-slot="slotProps">
<Select v-if="slotProps.value" :disabled="slotProps.disabled"
:model-value="slotProps.value as GameColor" @update:model-value="filter.rule.play_effect = $event"
:options="COLORS.slice()" />
</RuleLine>
</tbody>
</table>
</TabPanel>

View File

@ -0,0 +1,32 @@
<script setup lang="ts" generic="T">
import { computed, ref, watch } from 'vue'
import { ToggleSwitch } from 'primevue';
const props = defineProps<{
title: string,
inherit: boolean,
inheritValue: T,
defaultValue: T
}>()
const model = defineModel<T>({ required: true })
const value = computed(() => props.inherit ? props.inheritValue : model.value)
</script>
<template>
<tr>
<td class="pr-4 whitespace-nowrap">
{{ title }}
</td>
<td class="pr-4">
<ToggleSwitch v-if="!inherit" class="align-middle" :model-value="value != undefined"
@update:model-value="model = $event ? defaultValue : undefined" />
<label v-else>Inherit</label>
</td>
<td class="h-11 flex gap-2">
<slot :value :disabled="inherit"></slot>
</td>
</tr>
</template>

View File

@ -60,6 +60,7 @@ export interface Color {
r: number
g: number
b: number
a: number
}
export type Class = (typeof CLASSES)[number]
@ -187,7 +188,7 @@ export function toLines(rule: FilterRuleRaw): string[] {
}
function formatColor(color: Color) {
return `${color.r} ${color.g} ${color.b}`
return `${color.r} ${color.g} ${color.b} ${color.a}`
}
export function generateFilterText(filters: Filter[]): string {
@ -241,7 +242,7 @@ function expandLeaf(leaf: FilterLeaf): FilterRuleRaw[] {
let result = [leaf.rule]
if (leaf.leafRule.area_minus_drop_level) {
result = []
for (let area_level = 1; area_level <= 100; area_level++) {
for (let area_level = 1; area_level <= 70; area_level++) {
let rule = { ...leaf.rule }
let op: Op
switch (leaf.leafRule.area_minus_drop_level[0]) {

View File

@ -1,5 +1,70 @@
export const OPERATORS = ['=', '==', '!=', '<', '<=', '>', '>='] as const
export const CLASSES = [
'Stackable Currency',
'Socketable',
// flasks
'Life Flasks',
'Mana Flasks',
// armours
'Helmets',
'Boots',
'Gloves',
'Body Armours',
// weapons
'Sceptres',
'Shields',
'Wands',
'Quarterstaves',
'Staves',
'One Hand Maces',
'Two Hand Maces',
'Crossbows',
'Bows',
'Foci',
] as const
export const BASE_TYPES = [
'Uncut Skill Gem',
'Uncut Support Gem',
'Uncut Spirit Gem',
'Soul Core',
'Timeless',
'Breach Ring',
// C
"Gemcutter's Prism",
'Vaal Orb',
'Chaos Orb',
"Lesser Jeweller's Orb",
'Regal Orb',
"Artificer's Orb",
"Glassblower's Bauble",
'Orb of Alchemy',
'Chance Shard',
// B
'Exalted Orb',
'Exotic Coinage',
// A
'Orb of Annulment',
'Orb of Chance',
"Greater Jeweller's Orb",
'Distilled Fear',
'Distilled Despair',
// S
'Mirror',
'Divine',
"Perfect Jeweller's Orb",
'Distilled Isolation',
'Distilled Suffering',
] as const
export const COLORS = [
'Red',
'Green',
@ -31,62 +96,6 @@ export const SHAPES = [
export const RARITIES = ['Normal', 'Magic', 'Rare', 'Unique'] as const
export const CLASSES = [
'Currency',
'Stackable Currency',
'Jewel',
'Abyss Jewel',
'Divination Card',
'Gem',
'Flask',
'Map',
'Map Fragment',
'Fishing Rods',
'Amulet',
'Ring',
'Claw',
'Dagger',
'Wand',
'One Hand Sword',
'One Hand Axe',
'One Hand Mace',
'Sceptre',
'Bow',
'Staff',
'Two Hand Sword',
'Two Hand Axe',
'Two Hand Mace',
'Body Armour',
'Boots',
'Gloves',
'Helmet',
'Shield',
'Quiver',
] as const
export const BASE_TYPES = [
'Exalted Orb',
'Mirror of Kalandra',
'Eternal Orb',
'Divine Orb',
'Orb of Annulment',
'Chaos Orb',
'Vaal Orb',
'Regal Orb',
'Orb of Alchemy',
'Orb of Fusing',
'Blessed Orb',
"Cartographer's Chisel",
'Orb of Scouring',
"Jeweller's Orb",
'Chromatic Orb',
'Orb of Chance',
'Orb of Alteration',
'Orb of Transmutation',
'Scroll of Wisdom',
'Portal Scroll',
] as const
export const ARMOUR_TYPES = [
'Armour',
'Evasion',

View File

@ -25,7 +25,10 @@ export default defineConfig({
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_ENV_DEBUG,
},
plugins: [vue(), vueDevTools()],
plugins: [
vue(),
// vueDevTools()
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),