Many Changes

Added a 'default' image for spots where one is missing. Not the best solution, but it looks better on the site.
Cleaned up my code to avoid some duplication.
Added better 'Select All' logic to the event filter.
This commit is contained in:
Annika Merris 2024-01-23 18:33:55 -05:00
parent abe48cd902
commit 255f15798a
24 changed files with 323 additions and 783 deletions

BIN
public/images/isl_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
public/images/unknown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View file

@ -20,7 +20,7 @@
"isEventItem": false "isEventItem": false
}, },
"ddd29671-ca7f-4132-8784-80346e154059": { "ddd29671-ca7f-4132-8784-80346e154059": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Blessing Power Gachapon", "itemName": "Blessing Power Gachapon",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 30, "maxItemPower": 30,
@ -30,7 +30,7 @@
"isEventItem": true "isEventItem": true
}, },
"c1e029ff-b82c-48bd-a1f1-ea6291fad948": { "c1e029ff-b82c-48bd-a1f1-ea6291fad948": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Mandrake", "itemName": "Mandrake",
"minItemPower": 1, "minItemPower": 1,
"maxItemPower": 3, "maxItemPower": 3,
@ -40,7 +40,7 @@
"isEventItem": true "isEventItem": true
}, },
"52cd4a48-ff8a-4493-8030-b4e7754cd227": { "52cd4a48-ff8a-4493-8030-b4e7754cd227": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Muddled Mushroom", "itemName": "Muddled Mushroom",
"minItemPower": 2, "minItemPower": 2,
"maxItemPower": 5, "maxItemPower": 5,
@ -50,7 +50,7 @@
"isEventItem": true "isEventItem": true
}, },
"636b7384-1389-4012-933c-9063baa7a38d": { "636b7384-1389-4012-933c-9063baa7a38d": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Grassy Bunny", "itemName": "Grassy Bunny",
"minItemPower": 3, "minItemPower": 3,
"maxItemPower": 6, "maxItemPower": 6,
@ -60,7 +60,7 @@
"isEventItem": true "isEventItem": true
}, },
"2563b5f8-8fd5-4795-af86-33200605cf3e": { "2563b5f8-8fd5-4795-af86-33200605cf3e": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Chirping Chick", "itemName": "Chirping Chick",
"minItemPower": 4, "minItemPower": 4,
"maxItemPower": 10, "maxItemPower": 10,
@ -70,7 +70,7 @@
"isEventItem": true "isEventItem": true
}, },
"54e9bcf5-f1a5-4350-a75d-88af02b4fc13": { "54e9bcf5-f1a5-4350-a75d-88af02b4fc13": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Gorgeous Horse", "itemName": "Gorgeous Horse",
"minItemPower": 5, "minItemPower": 5,
"maxItemPower": 16, "maxItemPower": 16,
@ -80,7 +80,7 @@
"isEventItem": true "isEventItem": true
}, },
"e736d2b9-a8ec-4a4e-a721-24880c8a6038": { "e736d2b9-a8ec-4a4e-a721-24880c8a6038": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Blooming Fox", "itemName": "Blooming Fox",
"minItemPower": 7, "minItemPower": 7,
"maxItemPower": 24, "maxItemPower": 24,
@ -90,7 +90,7 @@
"isEventItem": true "isEventItem": true
}, },
"9fb7f9ba-e7ed-4e99-b161-386f48299443": { "9fb7f9ba-e7ed-4e99-b161-386f48299443": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Frozen Dragon", "itemName": "Frozen Dragon",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 32, "maxItemPower": 32,
@ -100,7 +100,7 @@
"isEventItem": true "isEventItem": true
}, },
"e2472929-1218-4cd6-a73b-b783c17bbc31": { "e2472929-1218-4cd6-a73b-b783c17bbc31": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Flaming Lion", "itemName": "Flaming Lion",
"minItemPower": 14, "minItemPower": 14,
"maxItemPower": 48, "maxItemPower": 48,
@ -110,7 +110,7 @@
"isEventItem": true "isEventItem": true
}, },
"0e21a6ea-8262-44f7-91c3-0c51ace7613f": { "0e21a6ea-8262-44f7-91c3-0c51ace7613f": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Touno Souvenir 1", "itemName": "Touno Souvenir 1",
"minItemPower": 5, "minItemPower": 5,
"maxItemPower": 5, "maxItemPower": 5,
@ -120,7 +120,7 @@
"isEventItem": true "isEventItem": true
}, },
"700ffd61-c0bf-4f41-abd1-b6fd74a645bb": { "700ffd61-c0bf-4f41-abd1-b6fd74a645bb": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Touno Souvenir 2", "itemName": "Touno Souvenir 2",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 10, "maxItemPower": 10,

View file

@ -1,6 +1,6 @@
{ {
"1f7aff96-030d-4007-9a70-82db7a8be3e3": { "1f7aff96-030d-4007-9a70-82db7a8be3e3": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Contestant Portrait (Wolf)", "itemName": "Contestant Portrait (Wolf)",
"minItemPower": 15000, "minItemPower": 15000,
"maxItemPower": 40000, "maxItemPower": 40000,
@ -10,7 +10,7 @@
"isEventItem": true "isEventItem": true
}, },
"2006c92e-8e32-4c9f-a913-3b2d1ed8dea0": { "2006c92e-8e32-4c9f-a913-3b2d1ed8dea0": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Potion of Bravery", "itemName": "Potion of Bravery",
"minItemPower": 800, "minItemPower": 800,
"maxItemPower": 800, "maxItemPower": 800,
@ -20,7 +20,7 @@
"isEventItem": false "isEventItem": false
}, },
"30d05d98-a615-4e3a-94da-8aa6e4ad03a9": { "30d05d98-a615-4e3a-94da-8aa6e4ad03a9": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Basic Elixir", "itemName": "Basic Elixir",
"minItemPower": 3000, "minItemPower": 3000,
"maxItemPower": 3000, "maxItemPower": 3000,
@ -30,7 +30,7 @@
"isEventItem": false "isEventItem": false
}, },
"3eccaaac-5afe-415a-ac8f-55df213cf015": { "3eccaaac-5afe-415a-ac8f-55df213cf015": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Potion of Freedom", "itemName": "Potion of Freedom",
"minItemPower": 800, "minItemPower": 800,
"maxItemPower": 800, "maxItemPower": 800,
@ -40,7 +40,7 @@
"isEventItem": false "isEventItem": false
}, },
"68a7a68a-2123-4a8e-b64d-9dbdf0637521": { "68a7a68a-2123-4a8e-b64d-9dbdf0637521": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Potion of Erudition", "itemName": "Potion of Erudition",
"minItemPower": 800, "minItemPower": 800,
"maxItemPower": 800, "maxItemPower": 800,
@ -50,7 +50,7 @@
"isEventItem": false "isEventItem": false
}, },
"7075da2f-a617-42a1-b142-fe2401ad87ec": { "7075da2f-a617-42a1-b142-fe2401ad87ec": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Potion of Inspiration", "itemName": "Potion of Inspiration",
"minItemPower": 800, "minItemPower": 800,
"maxItemPower": 800, "maxItemPower": 800,
@ -60,7 +60,7 @@
"isEventItem": false "isEventItem": false
}, },
"762a2775-ca50-4c13-8797-2f03b045ed10": { "762a2775-ca50-4c13-8797-2f03b045ed10": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Contestant Portrait (Lion)", "itemName": "Contestant Portrait (Lion)",
"minItemPower": 10000, "minItemPower": 10000,
"maxItemPower": 25000, "maxItemPower": 25000,
@ -70,7 +70,7 @@
"isEventItem": true "isEventItem": true
}, },
"9c95396d-e5d8-4f7d-9d37-1469e7dc0ee1": { "9c95396d-e5d8-4f7d-9d37-1469e7dc0ee1": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Signed Towel (Yellow)", "itemName": "Signed Towel (Yellow)",
"minItemPower": 4500, "minItemPower": 4500,
"maxItemPower": 10000, "maxItemPower": 10000,
@ -80,7 +80,7 @@
"isEventItem": true "isEventItem": true
}, },
"a351a27b-765b-46b5-95fc-99c47e63176d": { "a351a27b-765b-46b5-95fc-99c47e63176d": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Potion of Diligence", "itemName": "Potion of Diligence",
"minItemPower": 800, "minItemPower": 800,
"maxItemPower": 800, "maxItemPower": 800,
@ -90,7 +90,7 @@
"isEventItem": false "isEventItem": false
}, },
"a44b763b-833b-49d0-91d6-e5fcb8c6ce7c": { "a44b763b-833b-49d0-91d6-e5fcb8c6ce7c": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Signed Handkerchief (Yellow)", "itemName": "Signed Handkerchief (Yellow)",
"minItemPower": 2000, "minItemPower": 2000,
"maxItemPower": 5000, "maxItemPower": 5000,
@ -100,7 +100,7 @@
"isEventItem": true "isEventItem": true
}, },
"bc5fc5c6-65e1-41c8-822d-d6e06ec0894e": { "bc5fc5c6-65e1-41c8-822d-d6e06ec0894e": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Advanced Elixir", "itemName": "Advanced Elixir",
"minItemPower": 30000, "minItemPower": 30000,
"maxItemPower": 30000, "maxItemPower": 30000,
@ -110,7 +110,7 @@
"isEventItem": false "isEventItem": false
}, },
"cd50f711-36a4-4b3b-b4ef-84b52c8a18e2": { "cd50f711-36a4-4b3b-b4ef-84b52c8a18e2": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Champion's Statue", "itemName": "Champion's Statue",
"minItemPower": 30000, "minItemPower": 30000,
"maxItemPower": 80000, "maxItemPower": 80000,
@ -120,7 +120,7 @@
"isEventItem": true "isEventItem": true
}, },
"ce522371-80bd-4266-b473-8f5ace7099c7": { "ce522371-80bd-4266-b473-8f5ace7099c7": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Signed Handkerchief (Red)", "itemName": "Signed Handkerchief (Red)",
"minItemPower": 3000, "minItemPower": 3000,
"maxItemPower": 8000, "maxItemPower": 8000,
@ -130,7 +130,7 @@
"isEventItem": true "isEventItem": true
}, },
"d7d705d3-9562-4f03-98d8-3b0da81fcf47": { "d7d705d3-9562-4f03-98d8-3b0da81fcf47": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Champion's Belt", "itemName": "Champion's Belt",
"minItemPower": 20000, "minItemPower": 20000,
"maxItemPower": 50000, "maxItemPower": 50000,
@ -140,7 +140,7 @@
"isEventItem": true "isEventItem": true
}, },
"ed1663c2-aff0-41b4-b5ed-7f86463c1d69": { "ed1663c2-aff0-41b4-b5ed-7f86463c1d69": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Signed Towel (Red)", "itemName": "Signed Towel (Red)",
"minItemPower": 6000, "minItemPower": 6000,
"maxItemPower": 15000, "maxItemPower": 15000,
@ -150,7 +150,7 @@
"isEventItem": true "isEventItem": true
}, },
"472d229e-3541-4115-8104-53af579f24a4": { "472d229e-3541-4115-8104-53af579f24a4": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Demonic Exercise Bike", "itemName": "Demonic Exercise Bike",
"minItemPower": 20000, "minItemPower": 20000,
"maxItemPower": 50000, "maxItemPower": 50000,
@ -160,7 +160,7 @@
"isEventItem": true "isEventItem": true
}, },
"6214eeeb-c77b-415c-a055-6d15b04ca026": { "6214eeeb-c77b-415c-a055-6d15b04ca026": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Steel Barbell", "itemName": "Steel Barbell",
"minItemPower": 15000, "minItemPower": 15000,
"maxItemPower": 40000, "maxItemPower": 40000,
@ -170,7 +170,7 @@
"isEventItem": true "isEventItem": true
}, },
"732f16e3-6de7-4bc7-af77-9cdbaf68b695": { "732f16e3-6de7-4bc7-af77-9cdbaf68b695": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Pac-Ball", "itemName": "Pac-Ball",
"minItemPower": 4500, "minItemPower": 4500,
"maxItemPower": 10000, "maxItemPower": 10000,
@ -180,7 +180,7 @@
"isEventItem": true "isEventItem": true
}, },
"a64b4819-5b32-41c5-8fe0-293ea8695a0c": { "a64b4819-5b32-41c5-8fe0-293ea8695a0c": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Stone Dumbbell", "itemName": "Stone Dumbbell",
"minItemPower": 3000, "minItemPower": 3000,
"maxItemPower": 8000, "maxItemPower": 8000,
@ -190,7 +190,7 @@
"isEventItem": true "isEventItem": true
}, },
"b282b9cb-1802-4563-88a1-e7e267a0bcd4": { "b282b9cb-1802-4563-88a1-e7e267a0bcd4": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Rock Kettlebell", "itemName": "Rock Kettlebell",
"minItemPower": 6000, "minItemPower": 6000,
"maxItemPower": 15000, "maxItemPower": 15000,
@ -200,7 +200,7 @@
"isEventItem": true "isEventItem": true
}, },
"bf1611c0-ddec-4ad8-8299-a2e19818186f": { "bf1611c0-ddec-4ad8-8299-a2e19818186f": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Screaming Punching Bag", "itemName": "Screaming Punching Bag",
"minItemPower": 30000, "minItemPower": 30000,
"maxItemPower": 80000, "maxItemPower": 80000,
@ -210,7 +210,7 @@
"isEventItem": true "isEventItem": true
}, },
"daca4964-69c4-4167-b7bf-2e8eb49a8f1b": { "daca4964-69c4-4167-b7bf-2e8eb49a8f1b": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Ivy Jump Rope", "itemName": "Ivy Jump Rope",
"minItemPower": 2000, "minItemPower": 2000,
"maxItemPower": 5000, "maxItemPower": 5000,
@ -220,7 +220,7 @@
"isEventItem": true "isEventItem": true
}, },
"fff5a89a-1691-47ea-af30-c811f1c1dbfc": { "fff5a89a-1691-47ea-af30-c811f1c1dbfc": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Fairy Shuttlecock", "itemName": "Fairy Shuttlecock",
"minItemPower": 10000, "minItemPower": 10000,
"maxItemPower": 25000, "maxItemPower": 25000,

View file

@ -1,6 +1,6 @@
{ {
"09b1fff4-c1a3-49d5-acf1-b996d93a7217": { "09b1fff4-c1a3-49d5-acf1-b996d93a7217": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Unhappy Elder\"", "itemName": "Song: \"Unhappy Elder\"",
"minItemPower": 2, "minItemPower": 2,
"maxItemPower": 5, "maxItemPower": 5,
@ -10,7 +10,7 @@
"isEventItem": true "isEventItem": true
}, },
"0dbbda4c-0e4c-4cc2-b204-0301178ae667": { "0dbbda4c-0e4c-4cc2-b204-0301178ae667": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Gold Ring", "itemName": "Gold Ring",
"minItemPower": 1, "minItemPower": 1,
"maxItemPower": 1, "maxItemPower": 1,
@ -20,7 +20,7 @@
"isEventItem": false "isEventItem": false
}, },
"590ebe99-0fdd-4216-bb51-88d48f07d518": { "590ebe99-0fdd-4216-bb51-88d48f07d518": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Forbidden Love\"", "itemName": "Song: \"Forbidden Love\"",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 32, "maxItemPower": 32,
@ -30,7 +30,7 @@
"isEventItem": true "isEventItem": true
}, },
"62c5fe6d-92d2-458d-8ce4-c206eeb6245a": { "62c5fe6d-92d2-458d-8ce4-c206eeb6245a": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Prince's Wish\"", "itemName": "Song: \"Prince's Wish\"",
"minItemPower": 4, "minItemPower": 4,
"maxItemPower": 10, "maxItemPower": 10,
@ -40,7 +40,7 @@
"isEventItem": true "isEventItem": true
}, },
"67e7598f-f687-4ea0-b9f5-f89aaa965d44": { "67e7598f-f687-4ea0-b9f5-f89aaa965d44": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Otherworld Stars\"", "itemName": "Song: \"Otherworld Stars\"",
"minItemPower": 7, "minItemPower": 7,
"maxItemPower": 24, "maxItemPower": 24,
@ -50,7 +50,7 @@
"isEventItem": true "isEventItem": true
}, },
"71c7537b-ef33-4f64-91d4-e7e9c3915cad": { "71c7537b-ef33-4f64-91d4-e7e9c3915cad": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Diamond Ring", "itemName": "Diamond Ring",
"minItemPower": 5, "minItemPower": 5,
"maxItemPower": 5, "maxItemPower": 5,
@ -60,7 +60,7 @@
"isEventItem": false "isEventItem": false
}, },
"73ddfbbf-3071-4103-9893-b9b77af05ce9": { "73ddfbbf-3071-4103-9893-b9b77af05ce9": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Single Golden Mushroom\"", "itemName": "Song: \"Single Golden Mushroom\"",
"minItemPower": 5, "minItemPower": 5,
"maxItemPower": 16, "maxItemPower": 16,
@ -70,7 +70,7 @@
"isEventItem": true "isEventItem": true
}, },
"910cfd8f-9e75-4ca1-b776-e6b4df78e80b": { "910cfd8f-9e75-4ca1-b776-e6b4df78e80b": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Starry Love\"", "itemName": "Song: \"Starry Love\"",
"minItemPower": 1, "minItemPower": 1,
"maxItemPower": 3, "maxItemPower": 3,
@ -80,7 +80,7 @@
"isEventItem": true "isEventItem": true
}, },
"b2536feb-7dcb-4cec-93e5-581bc64e693b": { "b2536feb-7dcb-4cec-93e5-581bc64e693b": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Princess's Wish\"", "itemName": "Song: \"Princess's Wish\"",
"minItemPower": 3, "minItemPower": 3,
"maxItemPower": 6, "maxItemPower": 6,
@ -90,7 +90,7 @@
"isEventItem": true "isEventItem": true
}, },
"b2ebc786-79c3-47df-b0d9-330bb8e85a5f": { "b2ebc786-79c3-47df-b0d9-330bb8e85a5f": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Song: \"Unlucky Succubus\"", "itemName": "Song: \"Unlucky Succubus\"",
"minItemPower": 14, "minItemPower": 14,
"maxItemPower": 48, "maxItemPower": 48,
@ -100,7 +100,7 @@
"isEventItem": true "isEventItem": true
}, },
"d5eb513d-68e0-4cd3-bb44-e3e8d36cfecd": { "d5eb513d-68e0-4cd3-bb44-e3e8d36cfecd": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Gemstone Ring", "itemName": "Gemstone Ring",
"minItemPower": 2, "minItemPower": 2,
"maxItemPower": 2, "maxItemPower": 2,
@ -110,7 +110,7 @@
"isEventItem": false "isEventItem": false
}, },
"bcd9068a-c3b1-4914-ac50-af3369a7a8e5": { "bcd9068a-c3b1-4914-ac50-af3369a7a8e5": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Intamacy Gachapon", "itemName": "Intamacy Gachapon",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 30, "maxItemPower": 30,
@ -119,7 +119,7 @@
"isEventItem": true "isEventItem": true
}, },
"6459b278-9e0d-48ab-b6bb-aa4bfc88011b": { "6459b278-9e0d-48ab-b6bb-aa4bfc88011b": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Touno Speciality 1", "itemName": "Touno Speciality 1",
"minItemPower": 5, "minItemPower": 5,
"maxItemPower": 5, "maxItemPower": 5,
@ -128,7 +128,7 @@
"origin": "Touno Island" "origin": "Touno Island"
}, },
"223aafe8-450f-4343-8df3-d96117d28642": { "223aafe8-450f-4343-8df3-d96117d28642": {
"iconURL": "", "iconURL": "isl_logo.png",
"itemName": "Touno Speciality 2", "itemName": "Touno Speciality 2",
"minItemPower": 10, "minItemPower": 10,
"maxItemPower": 10, "maxItemPower": 10,

View file

@ -1,13 +1,25 @@
<script setup lang="ts"> <script setup lang="ts">
import { RouterView } from 'vue-router' import { RouterView } from 'vue-router'
import GlobalHeader from '@/components/GlobalHeader.vue' import GlobalHeader from '@/components/GlobalHeader.vue'
import { storeToRefs } from 'pinia'
import { usePowerItems } from './stores/powerItems'
import { computed } from 'vue'
const { blessingPowerItems, fellowPowerItems, intimacyPowerItems } = storeToRefs(usePowerItems())
const isLoaded = computed(
() =>
!blessingPowerItems.value.keys().next().done &&
!fellowPowerItems.value.keys().next().done &&
!intimacyPowerItems.value.keys().next().done
)
</script> </script>
<template> <template>
<v-app> <v-app>
<GlobalHeader /> <GlobalHeader />
<v-main class="d-flex"> <v-main class="d-flex">
<RouterView /> <RouterView v-if="isLoaded" />
</v-main> </v-main>
<v-footer app> <v-footer app>
<div>Copyright Annika Merris 2024</div> <div>Copyright Annika Merris 2024</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

View file

@ -1,187 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems'
import { storeToRefs } from 'pinia'
import type { Ref } from 'vue';
import { computed, ref } from 'vue'
const {
specialBlessingItems,
specialBlessingItemsMinTotal,
specialBlessingItemsMaxTotal,
specialBlessingItemsAveTotal
} = storeToRefs(usePowerItems())
const headers = ref([
{
title: "Event",
align: ' d-none d-lg-table-cell start',
sortable: true,
value: '1.origin'
},
{
title: 'Name',
align: 'start',
sortable: true,
value: '1.itemName'
},
{
title: 'Min.',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.minItemPower'
},
{
title: 'Max.',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.maxItemPower'
},
{
title: 'Owned',
align: 'end',
sortable: true,
key: `1.owned`
},
{
title: 'Min. Total',
align: ' d-none d-lg-table-cell',
sortable: false,
key: `1.minTotalPower`
},
{
title: 'Max. Total',
align: ' d-none d-lg-table-cell',
sortable: false,
key: `1.maxTotalPower`
},
{
title: 'Mean Total Power',
align: 'end',
sortable: false,
key: `1.aveTotalPower`
}
])
const sortBy = ref([
{
key: '1.minItemPower',
order: 'asc'
}
])
const selectedEvents: Ref<string[]> = ref(['All'])
const getEventImageUrl = function(eventName: string): string {
return eventName !== undefined ? "/images/" + eventName.replace(/\s/g, '_').toLocaleLowerCase() + ".png" : ''
}
const events = computed(() =>
[...specialBlessingItems.value.values()]
.map((cur) => cur.origin)
.filter((value: string, idx: number, arr: string[]) => arr.indexOf(value) === idx)
.concat('All')
)
const filteredItems = computed(() =>
[...specialBlessingItems.value.entries()]
.map((value) =>
selectedEvents.value.indexOf('All') !== -1 ||
selectedEvents.value.indexOf(value[1].origin) !== -1
? value
: undefined
)
.filter((value) => value !== undefined)
)
const getColor = computed(() => (rarity: number): string => {
if (rarity === 5) {
return 'red'
} else if (rarity === 4) {
return 'amber'
} else if (rarity === 3) {
return 'purple'
} else if (rarity === 2) {
return 'blue'
} else {
return 'green'
}
})
</script>
<template>
<v-card fluid>
<v-card-title>Special Items</v-card-title>
<v-card-subtitle>Items from events</v-card-subtitle>
<v-card-item>
<v-select
clearable
chips
label="Event"
:items="events"
multiple
density="compact"
v-model="selectedEvents"
></v-select>
<v-data-table
density="compact"
v-model:sort-by="sortBy"
:items="filteredItems"
:headers="headers"
>
<template v-slot:item.1.origin="{ item }">
<v-card class="my-2" elevation="2" rounded width="39" v-if="getEventImageUrl(item[1].origin) !== ''" color="transparent">
<v-img :src="getEventImageUrl(item[1].origin)"></v-img>
</v-card>
</template>
<template v-slot:item.1.itemName="{ item }">
<v-tooltip activator="parent" v-if="item[1].tooltip != undefined" content-class="custom-tooltip">
<v-card variant="text" density="compact" max-width="25vw">
<v-card-title class="px-2">Origin: {{ item[1].origin }}</v-card-title>
<v-card-text class="px-2" v-if="item[1].tooltip !== ''">{{ item[1].tooltip }}</v-card-text>
</v-card>
</v-tooltip>
<v-chip :color="`${getColor(item[1].rarity)}`">
{{ item[1].itemName }}
</v-chip>
</template>
<template v-slot:item.1.owned="{ item }">
<v-text-field
density="compact"
hide-details="auto"
v-model.number="item[1].owned"
@update:model-value="usePowerItems().updateOwned(item[0], item[1].owned)"
></v-text-field>
</template>
<template v-slot:item.1.minTotalPower="{ item }">
{{ item[1].minItemPower * item[1].owned }}
</template>
<template v-slot:item.1.maxTotalPower="{ item }">
{{ item[1].maxItemPower * item[1].owned }}
</template>
<template v-slot:item.1.aveTotalPower="{ item }">
{{ ((item[1].minItemPower + item[1].maxItemPower) / 2) * item[1].owned }}
</template>
<template v-slot:tfoot>
<tfoot>
<tr>
<td class="d-none d-lg-table-cell"></td>
<td></td>
<td class="d-none d-lg-table-cell"></td>
<td class="d-none d-lg-table-cell"></td>
<td></td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">
{{ specialBlessingItemsMinTotal }}
</td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">
{{ specialBlessingItemsMaxTotal }}
</td>
<td class="px-0 text-right font-weight-bold">{{ specialBlessingItemsAveTotal }}</td>
</tr>
</tfoot>
</template>
</v-data-table>
</v-card-item>
</v-card>
</template>
<style lang="scss" scoped>
:global(.custom-tooltip) {
padding: 0 !important;
}
</style>

View file

@ -1,107 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems'
import { storeToRefs } from 'pinia'
import { computed, ref } from 'vue'
const { standardFellowItems, standardFellowItemTotal } = storeToRefs(usePowerItems())
const headers = ref([
{
title: 'Name',
align: 'start',
sortable: true,
value: '1.itemName'
},
{
title: 'Power',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.minItemPower'
},
{
title: 'Owned',
align: 'end',
sortable: true,
key: `1.owned`
},
{
title: 'Total Power',
align: 'end',
sortable: false,
key: `1.totalPower`
}
])
const sortBy = ref([
{
key: '1.minItemPower',
order: 'asc'
}
])
const getColor = computed(() => (rarity: number): string => {
if (rarity === 5) {
return 'red'
} else if (rarity === 4) {
return 'amber'
} else if (rarity === 3) {
return 'purple'
} else if (rarity === 2) {
return 'blue'
} else {
return 'green'
}
})
</script>
<template>
<v-card>
<v-card-title>Standard Items</v-card-title>
<v-card-subtitle>Items that exist all the time</v-card-subtitle>
<v-card-item>
<v-data-table
density="compact"
v-model:sort-by="sortBy"
:items="[...standardFellowItems.entries()]"
:headers="headers"
>
<template v-slot:item.1.itemName="{ item }">
<v-tooltip activator="parent" v-if="item[1].tooltip != undefined" content-class="custom-tooltip">
<v-card variant="text" density="compact" max-width="25vw">
<v-card-title class="px-2">Origin: {{ item[1].origin }}</v-card-title>
<v-card-text class="px-2" v-if="item[1].tooltip !== ''">{{ item[1].tooltip }}</v-card-text>
</v-card>
</v-tooltip>
<v-chip :color="`${getColor(item[1].rarity)}`">
{{ item[1].itemName }}
</v-chip>
</template>
<template v-slot:item.1.owned="{ item }">
<v-text-field
density="compact"
hide-details="auto"
v-model.number="item[1].owned"
@update:model-value="usePowerItems().updateOwned(item[0], item[1].owned)"
></v-text-field>
</template>
<template v-slot:item.1.totalPower="{ item }">
{{ item[1].minItemPower * item[1].owned }}
</template>
<template v-slot:tfoot>
<tfoot>
<tr>
<td></td>
<td></td>
<td></td>
<td class="px-0 text-right font-weight-bold">{{ standardFellowItemTotal }}</td>
</tr>
</tfoot>
</template>
</v-data-table>
</v-card-item>
</v-card>
</template>
<style lang="scss" scoped>
:global(.custom-tooltip) {
padding: 0 !important;
}
</style>

View file

@ -1,30 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems';
import { storeToRefs } from 'pinia';
import { computed } from 'vue';
const { standardFellowItemTotal, specialFellowItemsMinTotal, specialFellowItemsMaxTotal, specialFellowItemsAveTotal} = storeToRefs(usePowerItems())
const minIncrease = computed(() => standardFellowItemTotal.value + specialFellowItemsMinTotal.value)
const maxIncrease = computed(() => standardFellowItemTotal.value + specialFellowItemsMaxTotal.value)
const aveIncrease = computed(() => standardFellowItemTotal.value + specialFellowItemsAveTotal.value)
</script>
<template>
<v-card>
<v-card-title>Overall Fellow Power Increase</v-card-title>
<v-card-item>
<v-list density="compact">
<v-list-item>
<v-list-item-title>Minimum: {{ minIncrease }}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title>Maximum: {{ maxIncrease }}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title>Mean: {{ aveIncrease }}</v-list-item-title>
</v-list-item>
</v-list>
</v-card-item>
</v-card>
</template>

View file

@ -1,183 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems'
import { storeToRefs } from 'pinia'
import { computed, ref, type Ref } from 'vue'
const {
specialIntimacyItems,
specialIntimacyItemsMinTotal,
specialIntimacyItemsMaxTotal,
specialIntimacyItemsAveTotal
} = storeToRefs(usePowerItems())
const headers = ref([
{
title: "Event",
align: ' d-none d-lg-table-cell start',
sortable: true,
value: '1.origin'
},
{
title: 'Name',
align: 'start',
sortable: true,
value: '1.itemName'
},
{
title: 'Min.',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.minItemPower'
},
{
title: 'Max.',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.maxItemPower'
},
{
title: 'Owned',
align: 'end',
sortable: true,
key: `1.owned`
},
{
title: 'Min. Total',
align: ' d-none d-lg-table-cell',
sortable: false,
key: `1.minTotalPower`
},
{
title: 'Max. Total',
align: ' d-none d-lg-table-cell',
sortable: false,
key: `1.maxTotalPower`
},
{
title: 'Mean Total',
align: 'end',
sortable: false,
key: `1.aveTotalPower`
}
])
const sortBy = ref([
{
key: '1.minItemPower',
order: 'asc'
}
])
const selectedEvents: Ref<string[]> = ref(['All'])
const getEventImageUrl = function(eventName: string): string {
return eventName !== undefined ? "/images/" + eventName.replace(/\s/g, '_').toLocaleLowerCase() + ".png" : ''
}
const events = computed(() =>
[...specialIntimacyItems.value.values()]
.map((cur) => cur.origin)
.filter((value: string, idx: number, arr: string[]) => arr.indexOf(value) === idx)
.concat('All')
)
const filteredItems = computed(() =>
[...specialIntimacyItems.value.entries()]
.map((value) =>
selectedEvents.value.indexOf('All') !== -1 ||
selectedEvents.value.indexOf(value[1].origin) !== -1
? value
: undefined
)
.filter((value) => value !== undefined)
)
const getColor = computed(() => (rarity: number): string => {
if (rarity === 5) {
return 'red'
} else if (rarity === 4) {
return 'amber'
} else if (rarity === 3) {
return 'purple'
} else if (rarity === 2) {
return 'blue'
} else {
return 'green'
}
})
</script>
<template>
<v-card fluid>
<v-card-title>Special Items</v-card-title>
<v-card-subtitle>Items from events</v-card-subtitle>
<v-card-item>
<v-select
clearable
chips
label="Event"
:items="events"
multiple
density="compact"
v-model="selectedEvents"
></v-select>
<v-data-table
density="compact"
v-model:sort-by="sortBy"
:items="filteredItems"
:headers="headers"
>
<template v-slot:item.1.origin="{ item }">
<v-card class="my-2" elevation="2" rounded width="39" v-if="getEventImageUrl(item[1].origin) !== ''" color="transparent">
<v-img :src="getEventImageUrl(item[1].origin)"></v-img>
</v-card>
</template>
<template v-slot:item.1.itemName="{ item }">
<v-tooltip activator="parent" v-if="item[1].tooltip != undefined" content-class="custom-tooltip">
<v-card variant="text" density="compact" max-width="25vw">
<v-card-title class="px-2">Origin: {{ item[1].origin }}</v-card-title>
<v-card-text class="px-2" v-if="item[1].tooltip !== ''">{{ item[1].tooltip }}</v-card-text>
</v-card>
</v-tooltip>
<v-chip :color="`${getColor(item[1].rarity)}`">
{{ item[1].itemName }}
</v-chip>
</template>
<template v-slot:item.1.owned="{ item }">
<v-text-field
reverse
density="compact"
hide-details="auto"
v-model.number="item[1].owned"
@update:model-value="usePowerItems().updateOwned(item[0], item[1].owned)"
></v-text-field>
</template>
<template v-slot:item.1.minTotalPower="{ item }">
{{ item[1].minItemPower * item[1].owned }}
</template>
<template v-slot:item.1.maxTotalPower="{ item }">
{{ item[1].maxItemPower * item[1].owned }}
</template>
<template v-slot:item.1.aveTotalPower="{ item }">
{{ ((item[1].minItemPower + item[1].maxItemPower) / 2) * item[1].owned }}
</template>
<template v-slot:tfoot>
<tfoot>
<tr>
<td class="d-none d-lg-table-cell"></td>
<td></td>
<td class="d-none d-lg-table-cell"></td>
<td class="d-none d-lg-table-cell"></td>
<td></td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">{{ specialIntimacyItemsMinTotal }}</td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">{{ specialIntimacyItemsMaxTotal }}</td>
<td class="px-0 text-right font-weight-bold">{{ specialIntimacyItemsAveTotal }}</td>
</tr>
</tfoot>
</template>
</v-data-table>
</v-card-item>
</v-card>
</template>
<style lang="scss" scoped>
:global(.custom-tooltip) {
padding: 0 !important;
}
</style>

View file

@ -1,107 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems'
import { storeToRefs } from 'pinia'
import { computed, ref } from 'vue'
const { standardIntimacyItems, standardIntimacyItemTotal } = storeToRefs(usePowerItems())
const headers = ref([
{
title: 'Name',
align: 'start',
sortable: true,
value: '1.itemName'
},
{
title: 'Power',
align: ' d-none d-lg-table-cell',
sortable: true,
key: '1.minItemPower'
},
{
title: 'Owned',
align: 'end',
sortable: true,
key: `1.owned`
},
{
title: 'Total Power',
align: 'end',
sortable: false,
key: `1.totalPower`
}
])
const sortBy = ref([
{
key: '1.minItemPower',
order: 'asc'
}
])
const getColor = computed(() => (rarity: number): string => {
if (rarity === 5) {
return 'red'
} else if (rarity === 4) {
return 'amber'
} else if (rarity === 3) {
return 'purple'
} else if (rarity === 2) {
return 'blue'
} else {
return 'green'
}
})
</script>
<template>
<v-card>
<v-card-title>Standard Items</v-card-title>
<v-card-subtitle>Items that exist all the time</v-card-subtitle>
<v-card-item>
<v-data-table
density="compact"
v-model:sort-by="sortBy"
:items="[...standardIntimacyItems.entries()]"
:headers="headers"
>
<template v-slot:item.1.itemName="{ item }">
<v-tooltip activator="parent" v-if="item[1].tooltip != undefined" content-class="custom-tooltip">
<v-card variant="text" density="compact" max-width="25vw">
<v-card-title class="px-2">Origin: {{ item[1].origin }}</v-card-title>
<v-card-text class="px-2" v-if="item[1].tooltip !== ''">{{ item[1].tooltip }}</v-card-text>
</v-card>
</v-tooltip>
<v-chip :color="`${getColor(item[1].rarity)}`">
{{ item[1].itemName }}
</v-chip>
</template>
<template v-slot:item.1.owned="{ item }">
<v-text-field
density="compact"
hide-details="auto"
v-model.number="item[1].owned"
@update:model-value="usePowerItems().updateOwned(item[0], item[1].owned)"
></v-text-field>
</template>
<template v-slot:item.1.totalPower="{ item }">
{{ item[1].minItemPower * item[1].owned }}
</template>
<template v-slot:tfoot>
<tfoot>
<tr>
<td></td>
<td></td>
<td></td>
<td class="px-0 text-right font-weight-bold">{{ standardIntimacyItemTotal }}</td>
</tr>
</tfoot>
</template>
</v-data-table>
</v-card-item>
</v-card>
</template>
<style scoped lang="scss">
:global(.custom-tooltip) {
padding: 0 !important;
}
</style>

View file

@ -1,30 +0,0 @@
<script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems';
import { storeToRefs } from 'pinia';
import { computed } from 'vue';
const { standardIntimacyItemTotal, specialIntimacyItemsMinTotal, specialIntimacyItemsMaxTotal, specialIntimacyItemsAveTotal} = storeToRefs(usePowerItems())
const minIncrease = computed(() => standardIntimacyItemTotal.value + specialIntimacyItemsMinTotal.value)
const maxIncrease = computed(() => standardIntimacyItemTotal.value + specialIntimacyItemsMaxTotal.value)
const aveIncrease = computed(() => standardIntimacyItemTotal.value + specialIntimacyItemsAveTotal.value)
</script>
<template>
<v-card>
<v-card-title>Overall Intimacy Power Increase</v-card-title>
<v-card-item>
<v-list density="compact">
<v-list-item>
<v-list-item-title>Minimum: {{ minIncrease }}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title>Maximum: {{ maxIncrease }}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title>Mean: {{ aveIncrease }}</v-list-item-title>
</v-list-item>
</v-list>
</v-card-item>
</v-card>
</template>

View file

@ -1,16 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems' import { usePowerItems } from '@/stores/powerItems'
import type { PowerItem } from '@/types/PowerItem' import type { PowerItem } from '@/types/PowerItem';
import { storeToRefs } from 'pinia'
import type { Ref } from 'vue' import type { Ref } from 'vue'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
const { export interface Props {
specialFellowItems, items: Map<string, PowerItem>
specialFellowItemsMinTotal, minimumTotal: number
specialFellowItemsMaxTotal, maximumTotal: number
specialFellowItemsAveTotal averageTotal: number
} = storeToRefs(usePowerItems()) }
const props = withDefaults(defineProps<Props>(), {
items: () => new Map<string, PowerItem>
})
const headers = ref([ const headers = ref([
{ {
@ -56,7 +59,7 @@ const headers = ref([
key: `1.maxTotalPower` key: `1.maxTotalPower`
}, },
{ {
title: 'Mean Total', title: 'Mean Total Power',
align: 'end', align: 'end',
sortable: false, sortable: false,
key: `1.aveTotalPower` key: `1.aveTotalPower`
@ -68,22 +71,28 @@ const sortBy = ref([
order: 'asc' order: 'asc'
} }
]) ])
const selectedEvents: Ref<string[]> = ref(['All']) const selectedEvents: Ref<string[]> = ref([])
const getEventImageUrl = function (eventName: string): string { const getEventImageUrl = function (eventName: string): string {
return eventName !== undefined return eventName !== undefined
? '/images/' + eventName.replace(/\s/g, '_').toLocaleLowerCase() + '.png' ? '/images/' + eventName.replace(/\s/g, '_').toLocaleLowerCase() + '.png'
: '' : ''
} }
const toggle = function () {
if (allSelected.value) {
selectedEvents.value = []
} else {
selectedEvents.value = events.value.slice()
}
}
const events = computed(() => const events = computed(() =>
[...specialFellowItems.value.values()] [...props.items.values()]
.map((cur) => cur.origin) .map((cur) => cur.origin)
.filter((value: string, idx: number, arr: string[]) => arr.indexOf(value) === idx) .filter((value: string, idx: number, arr: string[]) => arr.indexOf(value) === idx)
.concat('All')
) )
const filteredItems = computed(() => const filteredItems = computed(() =>
[...specialFellowItems.value.entries()] [...props.items.entries()]
.map((value) => .map((value) =>
selectedEvents.value.indexOf('All') !== -1 || selectedEvents.value.indexOf('All') !== -1 ||
selectedEvents.value.indexOf(value[1].origin) !== -1 selectedEvents.value.indexOf(value[1].origin) !== -1
@ -105,6 +114,9 @@ const getColor = computed(() => (rarity: number): string => {
return 'green' return 'green'
} }
}) })
const allSelected = computed(() => events.value.length === selectedEvents.value.length)
const partialSelected = computed(() => selectedEvents.value.length > 0)
toggle()
</script> </script>
<template> <template>
@ -120,7 +132,19 @@ const getColor = computed(() => (rarity: number): string => {
multiple multiple
density="compact" density="compact"
v-model="selectedEvents" v-model="selectedEvents"
></v-select> >
<template v-slot:prepend-item>
<v-list-item title="Select All" @click="toggle">
<template v-slot:prepend>
<v-checkbox-btn
:color="partialSelected ? 'indigo-darken-2' : undefined"
:indeterminate="partialSelected && !allSelected"
:model-value="partialSelected"
></v-checkbox-btn>
</template>
</v-list-item>
</template>
</v-select>
<v-data-table <v-data-table
density="compact" density="compact"
v-model:sort-by="sortBy" v-model:sort-by="sortBy"
@ -137,6 +161,7 @@ const getColor = computed(() => (rarity: number): string => {
color="transparent" color="transparent"
> >
<v-img :src="getEventImageUrl(item[1].origin)"></v-img> <v-img :src="getEventImageUrl(item[1].origin)"></v-img>
<v-tooltip activator="parent">{{ item?.[1].origin }}</v-tooltip>
</v-card> </v-card>
</template> </template>
<template v-slot:item.1.itemName="{ item }"> <template v-slot:item.1.itemName="{ item }">
@ -182,12 +207,12 @@ const getColor = computed(() => (rarity: number): string => {
<td class="d-none d-lg-table-cell"></td> <td class="d-none d-lg-table-cell"></td>
<td></td> <td></td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell"> <td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">
{{ specialFellowItemsMinTotal }} {{ minimumTotal }}
</td> </td>
<td class="px-0 text-right font-weight-bold d-none d-lg-table-cell"> <td class="px-0 text-right font-weight-bold d-none d-lg-table-cell">
{{ specialFellowItemsMaxTotal }} {{ maximumTotal }}
</td> </td>
<td class="px-0 text-right font-weight-bold">{{ specialFellowItemsAveTotal }}</td> <td class="px-0 text-right font-weight-bold">{{ averageTotal }}</td>
</tr> </tr>
</tfoot> </tfoot>
</template> </template>

View file

@ -1,9 +1,17 @@
<script setup lang="ts"> <script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems' import { usePowerItems } from '@/stores/powerItems'
import { storeToRefs } from 'pinia' import type { PowerItem } from '@/types/PowerItem'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
const { standardBlessingItems, standardBlessingItemTotal } = storeToRefs(usePowerItems()) export interface Props {
items: Map<string, PowerItem>
total: number
}
const props = withDefaults(defineProps<Props>(), {
items: () => new Map<string, PowerItem>
})
const headers = ref([ const headers = ref([
{ {
title: '', title: '',
@ -66,7 +74,7 @@ const getColor = computed(() => (rarity: number): string => {
<v-data-table <v-data-table
density="compact" density="compact"
v-model:sort-by="sortBy" v-model:sort-by="sortBy"
:items="[...standardBlessingItems.entries()]" :items="[...items.entries()]"
:headers="headers" :headers="headers"
> >
<template v-slot:item.1.iconURL="{ item }"> <template v-slot:item.1.iconURL="{ item }">
@ -109,7 +117,7 @@ const getColor = computed(() => (rarity: number): string => {
<td class="d-none d-lg-table-cell"></td> <td class="d-none d-lg-table-cell"></td>
<td></td> <td></td>
<td></td> <td></td>
<td class="px-0 text-right font-weight-bold">{{ standardBlessingItemTotal }}</td> <td class="px-0 text-right font-weight-bold">{{ total }}</td>
</tr> </tr>
</tfoot> </tfoot>
</template> </template>

View file

@ -1,13 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import { usePowerItems } from '@/stores/powerItems';
import { storeToRefs } from 'pinia';
import { computed } from 'vue'; import { computed } from 'vue';
const { standardBlessingItemTotal, specialBlessingItemsMinTotal, specialBlessingItemsMaxTotal, specialBlessingItemsAveTotal} = storeToRefs(usePowerItems()) export interface Props {
standardTotal: number
minimumTotal: number
maximumTotal: number
averageTotal: number
}
const minIncrease = computed(() => standardBlessingItemTotal.value + specialBlessingItemsMinTotal.value) const props = defineProps<Props>()
const maxIncrease = computed(() => standardBlessingItemTotal.value + specialBlessingItemsMaxTotal.value)
const aveIncrease = computed(() => standardBlessingItemTotal.value + specialBlessingItemsAveTotal.value) const minIncrease = computed(() => props.standardTotal + props.minimumTotal)
const maxIncrease = computed(() => props.standardTotal + props.maximumTotal)
const aveIncrease = computed(() => props.standardTotal + props.averageTotal)
</script> </script>
<template> <template>

View file

@ -23,6 +23,11 @@ const router = createRouter({
path: "/intimacy-power", path: "/intimacy-power",
name: "intimacy-power", name: "intimacy-power",
component: () => import('@/views/IntimacyPowerView.vue') component: () => import('@/views/IntimacyPowerView.vue')
},
{
path: "/test",
name: "test",
component: () => import('@/views/Test.vue')
} }
] ]
}) })

View file

@ -10,6 +10,7 @@ export const usePowerItems = defineStore('powerItems', () => {
const blessingPowerItems = ref(new Map<string, PowerItem>()) const blessingPowerItems = ref(new Map<string, PowerItem>())
const fellowPowerItems = ref(new Map<string, PowerItem>()) const fellowPowerItems = ref(new Map<string, PowerItem>())
const intimacyPowerItems = ref(new Map<string, PowerItem>()) const intimacyPowerItems = ref(new Map<string, PowerItem>())
const isLoadComplete = ref(false)
async function fetchPowerItems() { async function fetchPowerItems() {
axios axios
@ -78,6 +79,7 @@ export const usePowerItems = defineStore('powerItems', () => {
.catch((err) => { .catch((err) => {
console.log(err) console.log(err)
}) })
isLoadComplete.value = true
} }
function updateOwned(key: string, newOwned: number) { function updateOwned(key: string, newOwned: number) {
@ -134,12 +136,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const standardBlessingItems = computed( const standardBlessingItems = computed(
() => () => new Map([...blessingPowerItems.value.entries()].filter((cur) => !cur[1].isEventItem))
new Map(
[...blessingPowerItems.value.entries()].filter(
(cur) => !(cur[1].isEventItem)
)
)
) )
const standardBlessingItemTotal = computed(() => const standardBlessingItemTotal = computed(() =>
@ -154,12 +151,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const specialBlessingItems = computed( const specialBlessingItems = computed(
() => () => new Map([...blessingPowerItems.value.entries()].filter((cur) => cur[1].isEventItem))
new Map(
[...blessingPowerItems.value.entries()].filter(
(cur) => (cur[1].isEventItem)
)
)
) )
const specialBlessingItemsMinTotal = computed(() => const specialBlessingItemsMinTotal = computed(() =>
@ -203,12 +195,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const standardFellowItems = computed( const standardFellowItems = computed(
() => () => new Map([...fellowPowerItems.value.entries()].filter((cur) => !cur[1].isEventItem))
new Map(
[...fellowPowerItems.value.entries()].filter(
(cur) => !(cur[1].isEventItem)
)
)
) )
const standardFellowItemTotal = computed(() => const standardFellowItemTotal = computed(() =>
@ -223,12 +210,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const specialFellowItems = computed( const specialFellowItems = computed(
() => () => new Map([...fellowPowerItems.value.entries()].filter((cur) => cur[1].isEventItem))
new Map(
[...fellowPowerItems.value.entries()].filter(
(cur) => (cur[1].isEventItem)
)
)
) )
const specialFellowItemsMinTotal = computed(() => const specialFellowItemsMinTotal = computed(() =>
@ -275,12 +257,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const standardIntimacyItems = computed( const standardIntimacyItems = computed(
() => () => new Map([...intimacyPowerItems.value.entries()].filter((cur) => !cur[1].isEventItem))
new Map(
[...intimacyPowerItems.value.entries()].filter(
(cur) => !(cur[1].isEventItem)
)
)
) )
const standardIntimacyItemTotal = computed(() => const standardIntimacyItemTotal = computed(() =>
@ -295,12 +272,7 @@ export const usePowerItems = defineStore('powerItems', () => {
) )
const specialIntimacyItems = computed( const specialIntimacyItems = computed(
() => () => new Map([...intimacyPowerItems.value.entries()].filter((cur) => cur[1].isEventItem))
new Map(
[...intimacyPowerItems.value.entries()].filter(
(cur) => (cur[1].isEventItem)
)
)
) )
const specialIntimacyItemsMinTotal = computed(() => const specialIntimacyItemsMinTotal = computed(() =>
@ -338,6 +310,9 @@ export const usePowerItems = defineStore('powerItems', () => {
return { return {
blessingPowerItems, blessingPowerItems,
fellowPowerItems,
intimacyPowerItems,
isLoadComplete,
fetchPowerItems, fetchPowerItems,
updateOwned, updateOwned,
totalBlessingPower, totalBlessingPower,

View file

@ -1,15 +1,47 @@
<script setup lang="ts"> <script setup lang="ts">
import SpecialItemsCard from '@/components/BlessingPower/SpecialItemsCard.vue' import SpecialItemsCard from '@/components/SpecialItemsCard.vue'
import StandardItemsCard from '@/components/BlessingPower/StandardItemsCard.vue' import StandardItemsCard from '@/components/StandardItemsCard.vue'
import SummaryCard from '@/components/BlessingPower/SummaryCard.vue' import SummaryCard from '@/components/SummaryCard.vue'
import { storeToRefs } from 'pinia'
import { usePowerItems } from '@/stores/powerItems'
const {
standardBlessingItems,
standardBlessingItemTotal,
specialBlessingItems,
specialBlessingItemsMinTotal,
specialBlessingItemsMaxTotal,
specialBlessingItemsAveTotal
} = storeToRefs(usePowerItems())
</script> </script>
<template> <template>
<v-sheet class="d-flex flex-wrap flex-fill"> <v-card>
<StandardItemsCard class="ma-2 align-self-start" /> <v-card-title>Blessing Power</v-card-title>
<SpecialItemsCard class="ma-2 align-self-start" /> <v-card-text>
<SummaryCard class="ma-2 align-self-start" /> <v-sheet class="d-flex flex-wrap flex-fill">
</v-sheet> <StandardItemsCard
class="ma-2 align-self-start"
:items="standardBlessingItems"
:total="standardBlessingItemTotal"
/>
<SpecialItemsCard
class="ma-2 align-self-start"
:items="specialBlessingItems"
:minimum-total="specialBlessingItemsMinTotal"
:maximum-total="specialBlessingItemsMaxTotal"
:average-total="specialBlessingItemsAveTotal"
/>
<SummaryCard
class="ma-2 align-self-start"
:standard-total="standardBlessingItemTotal"
:minimum-total="specialBlessingItemsMinTotal"
:maximum-total="specialBlessingItemsMaxTotal"
:average-total="specialBlessingItemsAveTotal"
/>
</v-sheet>
</v-card-text>
</v-card>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>

View file

@ -1,19 +1,51 @@
<script setup lang="ts"> <script setup lang="ts">
import SpecialItemsCard from '@/components/FellowPower/SpecialItemsCard.vue' import SpecialItemsCard from '@/components/SpecialItemsCard.vue'
import StandardItemsCard from '@/components/FellowPower/StandardItemsCard.vue' import StandardItemsCard from '@/components/StandardItemsCard.vue'
import SummaryCard from '@/components/FellowPower/SummaryCard.vue' import SummaryCard from '@/components/SummaryCard.vue'
import { storeToRefs } from 'pinia'
import { usePowerItems } from '@/stores/powerItems'
const {
standardFellowItems,
standardFellowItemTotal,
specialFellowItems,
specialFellowItemsMinTotal,
specialFellowItemsMaxTotal,
specialFellowItemsAveTotal
} = storeToRefs(usePowerItems())
</script> </script>
<template> <template>
<v-sheet class="d-flex flex-wrap flex-fill"> <v-card>
<StandardItemsCard class="ma-2 align-self-start"/> <v-card-title>Fellow Power</v-card-title>
<SpecialItemsCard class="ma-2 align-self-start"/> <v-card-text>
<SummaryCard class="ma-2 align-self-start" /> <v-sheet class="d-flex flex-wrap flex-fill">
</v-sheet> <StandardItemsCard
class="ma-2 align-self-start"
:items="standardFellowItems"
:total="standardFellowItemTotal"
/>
<SpecialItemsCard
class="ma-2 align-self-start"
:items="specialFellowItems"
:minimum-total="specialFellowItemsMinTotal"
:maximum-total="specialFellowItemsMaxTotal"
:average-total="specialFellowItemsAveTotal"
/>
<SummaryCard
class="ma-2 align-self-start"
:standard-total="standardFellowItemTotal"
:minimum-total="specialFellowItemsMinTotal"
:maximum-total="specialFellowItemsMaxTotal"
:average-total="specialFellowItemsAveTotal"
/>
</v-sheet>
</v-card-text>
</v-card>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@use "@/styles/settings.scss"; @use '@/styles/settings.scss';
:deep(tbody) tr:nth-of-type(even) { :deep(tbody) tr:nth-of-type(even) {
background-color: rgba(var(--v-theme-primary-darken-1), 0.25); background-color: rgba(var(--v-theme-primary-darken-1), 0.25);
} }

View file

@ -13,6 +13,11 @@ const entries20240121 = ref([
'Added event icon display', 'Added event icon display',
'Added filters, looks ugly, maybe works' 'Added filters, looks ugly, maybe works'
]) ])
const entries20240122 = ref([
'Added a better "Select All" to event filters',
'Added a default image so there aren\'t random blank spots',
'Did a bunch of code cleanup',
])
</script> </script>
<template> <template>
@ -84,6 +89,7 @@ const entries20240121 = ref([
</v-list-item> </v-list-item>
<ChangeLogEntry date="2024-01-20" :entries="entries20240120"></ChangeLogEntry> <ChangeLogEntry date="2024-01-20" :entries="entries20240120"></ChangeLogEntry>
<ChangeLogEntry date="2024-01-21" :entries="entries20240121"></ChangeLogEntry> <ChangeLogEntry date="2024-01-21" :entries="entries20240121"></ChangeLogEntry>
<ChangeLogEntry date="2024-01-22" :entries="entries20240122"></ChangeLogEntry>
</v-list> </v-list>
</v-sheet> </v-sheet>
<v-sheet :elevation="1" class="ma-2 my-4"> <v-sheet :elevation="1" class="ma-2 my-4">
@ -95,7 +101,7 @@ const entries20240121 = ref([
</p> </p>
<p> <p>
Thanks to <span class="font-weight-bold">@kathinja</span> for her assistance with flavor Thanks to <span class="font-weight-bold">@kathinja</span> for her assistance with flavor
text and proof reading. text and proofreading.
</p> </p>
<p> <p>
Thanks <span class="font-weight-bold">@werewaffle</span> for all of his help with Thanks <span class="font-weight-bold">@werewaffle</span> for all of his help with

View file

@ -1,19 +1,51 @@
<script setup lang="ts"> <script setup lang="ts">
import SpecialItemsCard from '@/components/IntimacyPower/SpecialItemsCard.vue' import SpecialItemsCard from '@/components/SpecialItemsCard.vue'
import StandardItemsCard from '@/components/IntimacyPower/StandardItemsCard.vue' import StandardItemsCard from '@/components/StandardItemsCard.vue'
import SummaryCard from '@/components/IntimacyPower/SummaryCard.vue' import SummaryCard from '@/components/SummaryCard.vue'
import { storeToRefs } from 'pinia'
import { usePowerItems } from '@/stores/powerItems'
const {
standardIntimacyItems,
standardIntimacyItemTotal,
specialIntimacyItems,
specialIntimacyItemsMinTotal,
specialIntimacyItemsMaxTotal,
specialIntimacyItemsAveTotal
} = storeToRefs(usePowerItems())
</script> </script>
<template> <template>
<v-sheet class="d-flex flex-wrap flex-fill"> <v-card>
<StandardItemsCard class="ma-2 align-self-start"/> <v-card-title>Intimacy Power</v-card-title>
<SpecialItemsCard class="ma-2 align-self-start"/> <v-card-text>
<SummaryCard class="ma-2 align-self-start" /> <v-sheet class="d-flex flex-wrap flex-fill">
</v-sheet> <StandardItemsCard
class="ma-2 align-self-start"
:items="standardIntimacyItems"
:total="standardIntimacyItemTotal"
/>
<SpecialItemsCard
class="ma-2 align-self-start"
:items="specialIntimacyItems"
:minimum-total="specialIntimacyItemsMinTotal"
:maximum-total="specialIntimacyItemsMaxTotal"
:average-total="specialIntimacyItemsAveTotal"
/>
<SummaryCard
class="ma-2 align-self-start"
:standard-total="standardIntimacyItemTotal"
:minimum-total="specialIntimacyItemsMinTotal"
:maximum-total="specialIntimacyItemsMaxTotal"
:average-total="specialIntimacyItemsAveTotal"
/>
</v-sheet>
</v-card-text>
</v-card>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@use "@/styles/settings.scss"; @use '@/styles/settings.scss';
:deep(tbody) tr:nth-of-type(even) { :deep(tbody) tr:nth-of-type(even) {
background-color: rgba(var(--v-theme-primary-darken-1), 0.25); background-color: rgba(var(--v-theme-primary-darken-1), 0.25);
} }

52
src/views/Test.vue Normal file
View file

@ -0,0 +1,52 @@
<script setup lang="ts">
import SpecialItemsCard from '@/components/SpecialItemsCard.vue'
import StandardItemsCard from '@/components/StandardItemsCard.vue'
import SummaryCard from '@/components/SummaryCard.vue'
import { storeToRefs } from 'pinia'
import { usePowerItems } from '@/stores/powerItems'
const {
standardBlessingItems,
standardBlessingItemTotal,
specialBlessingItems,
specialBlessingItemsMinTotal,
specialBlessingItemsMaxTotal,
specialBlessingItemsAveTotal
} = storeToRefs(usePowerItems())
</script>
<template>
<v-card>
<v-card-title>Intimacy Power</v-card-title>
<v-card-text>
<v-sheet class="d-flex flex-wrap flex-fill">
<StandardItemsCard
class="ma-2 align-self-start"
:items="standardBlessingItems"
:total="standardBlessingItemTotal"
/>
<SpecialItemsCard
class="ma-2 align-self-start"
:items="specialBlessingItems"
:minimum-total="specialBlessingItemsMinTotal"
:maximum-total="specialBlessingItemsMaxTotal"
:average-total="specialBlessingItemsAveTotal"
/>
<SummaryCard
class="ma-2 align-self-start"
:standard-total="standardBlessingItemTotal"
:minimum-total="specialBlessingItemsMinTotal"
:maximum-total="specialBlessingItemsMaxTotal"
:average-total="specialBlessingItemsAveTotal"
/>
</v-sheet>
</v-card-text>
</v-card>
</template>
<style lang="scss" scoped>
@use '@/styles/settings.scss';
:deep(tbody) tr:nth-of-type(even) {
background-color: rgba(var(--v-theme-primary-darken-1), 0.25);
}
</style>