From 4ed7c8062a87db93f444a4894df40cf1dc33510d Mon Sep 17 00:00:00 2001 From: Leon Liu Date: Thu, 2 Jan 2025 09:28:40 +0900 Subject: [PATCH] update --- bun.lockb | Bin 168140 -> 168870 bytes package.json | 2 + src/App.vue | 68 +++++-- src/components/FilterDetail.vue | 316 ++++++++++++++++++++++++++------ src/components/FilterNode.vue | 24 ++- src/components/Info.md | 45 +++++ src/components/Info.vue | 63 ++++++- src/components/TreeNav.vue | 70 ++++--- src/main.ts | 6 +- src/models/index.ts | 197 +++++++++++++++----- src/services/filter.ts | 16 +- src/style.css | 1 + 12 files changed, 648 insertions(+), 160 deletions(-) create mode 100644 src/components/Info.md diff --git a/bun.lockb b/bun.lockb index 660d487c5ffb13c016079515fdc2c39491dab272..312f77445a813d36ac6401dd1dabb77480c3f759 100755 GIT binary patch delta 30611 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 W;g-nXS(+n#ywz4e_PDpD_x}Se{DU0; delta 30038 zcmeIbdz_8c`~QEh&1N=@a~NYV&Zik?Gt)2|A!8dkq%jUl)qc!tU+a3UYaOm@9q#+y z`<{D0|3ZlmmXvrrw!x(bw!TyPz{DNfhPB?(rpm}qzwYdvo6 zYmzYqDGj%94DzFqQgFBvRx1r7u@8rr_?Dwr(r|wo5V;&(8vM=D4Sm(}&SFy=wa}H% zBWs~Qh?H;+Mbh5U@%!Q(TthFU{uMf~iEq)2{SBz?$lz)o zP=RDT)ILe3Uq|OdR`k!iF*x^((Rj&vT}xHjLw}jdWbb5 zH+ys|tW#-KW?t@uVKL*hUoMb6PBv=+5%KtXrvY_${Zm}#nnm+`| zkmbJ$FX6il9d8Eb?}Csu(*o-n$Z(_>o*}*x*Hdks{A313X3)MQr^D|cMPC|pI`TTY z#POcon2d?za?)qDbM&b?qF6mupxYO#l=nynr%d#%PMIm__GCdyNH4=n5WYv2M9%N% z@EH>`hNKgO=Q=t36G&-$rmIgwN-)Nx=j3L@jLOYHm%cQ<%^7Q%WHBQ%x=zY;4F|dg zJ&@rTc1D&!F7M(*^PbFM<8v}{tuD#VBuOM+I&>OcIvUi`#j8ixfR$b0bGjzo*^3mb z-0?$l(sMJcRyw_SrMwE=9hP}MI`f`M)^90}UL0Q9u8mG?^M_?+52ga^!`qz+`!-U7 zvl=P2dJ}XMoA#LW+}s!8#cAEsv3m$9_2u<)_+ChS%FA!q+i|WsghXXMx=hTKNU8WZ zyvTpw;Z$$|DZ%(dMgLV#qdT3c`p0@AaY#Bw0JF0u;GFa!jK1~JK&RrH?{e&h>Gpw2$yM)m*p6;3 ziAd?rsEnLp8O<%r<4#_!?Q7?YDRjuVO;&$Tyo*%FoVR%SSUJdKoH{?I+n*0TZ00RX>;j?2kl0LYgX zmk|S*Y8km%nWM*9*7OmMCnu27N>;{%(GsUaF2Bu{yOHAI(2R^RF`2p6v%~FW(D1*G z`;nuZ3dd7G8tj3rgY2Yt)7`C9E@5Bq$}urn*+bIDQD;^r#|vwHwv*qAQqrAnW1QOV z$x0tLE@P-QGGo#N>E1rI8uA>P2lI2qE-rxX1zAlF~QtBOdpW}$^CFw+D1ocS%ok;sIo;}&w zz1u=WkTH#stcG+$l)nXCdj1+xW{P(d%*q~`o(t!N)QjA5xBzy8v$L}Xv*&pYe>ctH z7Z641z`{J@FJq-i$k;tjhV+=I*;Dm{e5b**>CR!O9a1{D|9?w z#XDM5J{5ky%c|jnHL?7=OE*w|V6hICEk!Qu0@SI%w+JdWmPpwqAWYyrNni zRyyn^T{&`$s;>(ogZ`z;vbyOxk%@l4&$2q(snFHbzeshlxpGA;>lR6=ZaNSZRFCRp z-goH&-lKG3RM4NnHN`D@XH=s4Oea?h`aAe7tFKO}mgs+)lwGs$j9-_io}^-Qa`m9P zR~PWUTo+ak2Ew?W=tXapo*NbC?}ye=r&MiIltc%+eJjkZLv_}H=%AXTlX-tz7eohr zzl7->(MkT%#Ji2&8J*~VkrZ8tPE;p!LCv7Q26H+| RhxQkR9+9|H*c8OC@>*QKN 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 -import { Button, Splitter, SplitterPanel } from 'primevue' +import { Button, Dialog, ConfirmPopup, Toast, Splitter, SplitterPanel, ScrollPanel, useToast } from 'primevue' import TreeNav from './components/TreeNav.vue' import FilterDetail from './components/FilterDetail.vue' import Info from './components/Info.vue' -import { computed, ref, watch } from 'vue' -import type { TreeNode } from 'primevue/treenode' +import { computed, ref, toRaw, watch } from 'vue' import * as O from 'fp-ts/Option' import * as A from 'fp-ts/lib/Array'; import { pipe } from 'fp-ts/function' -import * as uuid from 'uuid'; -import type { Filter, FilterConfig, FilterNode } from './models' -import { filterToTreeNode } from './services/filter' +import FileSaver from 'file-saver' +import { generateFilterText, type Filter, type FilterConfig, type FilterNode } from './models' +import { filterToTreeNode, treeNodeToFilter } from './services/filter' const darkMode = ref(document.documentElement.classList.contains('dark')) const icon = computed(() => `pi pi-${darkMode.value ? "moon" : "sun"}`) +const toast = useToast() + watch(darkMode, (dark) => { document.documentElement.classList.toggle( 'dark', @@ -24,19 +25,11 @@ watch(darkMode, (dark) => { localStorage.theme = dark ? 'dark' : 'light' }) -let defaultFilters: Filter[] = [ - { type: 'leaf', id: uuid.v4(), name: "", show: true, enabled: true, rule: {} }, - { - type: 'group', id: uuid.v4(), name: "", enabled: true, rule: {}, filters: [ - { type: 'leaf', id: uuid.v4(), name: "", show: true, enabled: true, rule: {} } - ] - } -] +let defaultFilters: Filter[] = [] const nodes = ref(pipe( localStorage.getItem("filters"), O.fromNullable, - O.map((value): FilterConfig => JSON.parse(value)), - O.map(value => value.filters), + O.map((value): Filter[] => JSON.parse(value)), O.getOrElse(() => defaultFilters), A.map(filterToTreeNode) )) @@ -53,13 +46,56 @@ function onDelete() { selectedFilter.value = undefined } +const previewText = ref() + +function exportFilter() { + let text = generateFilterText(toRaw(nodes.value).map(treeNodeToFilter)) + console.log(text) + previewText.value = text + exportDialogVisible.value = true; +} + +function download() { + var blob = new Blob([previewText.value], { type: "text/plain;charset=utf-8" }); + FileSaver.saveAs(blob, "poe2.filter") +} + +const exportDialogVisible = ref(false); + +function save() { + if (nodes.value) { + const filters = toRaw(nodes.value).map(treeNodeToFilter) + localStorage.setItem("filters", JSON.stringify(filters)) + } +} + +setInterval(save, 5000) +