diff --git a/.travis.yml b/.travis.yml index f3ef3e38..aff016db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,4 @@ cache: - node_modules script: - yarn lint - - yarn build \ No newline at end of file + - yarn build:single \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index ba179669..89d647a4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,5 +1,8 @@ module.exports = { presets: [ '@vue/app' + ], + plugins: [ + "@babel/plugin-transform-modules-commonjs" ] } diff --git a/browserslist-stats.json b/browserslist-stats.json new file mode 100644 index 00000000..c38d85d9 --- /dev/null +++ b/browserslist-stats.json @@ -0,0 +1,347 @@ +{ + "ie": { + "6": 0, + "7": 0.0007920927465565852, + "8": 0.001653667312986555, + "9": 0.00033351273539224645, + "10": 0.0003752018273162772, + "11": 0.14289631075160292, + "5.5": 0 + }, + "edge": { + "12": 0.000041689091924030806, + "13": 0.0019454909564547707, + "14": 0.043829131976131044, + "15": 0.02262328055077405, + "16": 0.06435406156672888, + "17": 0.661856023385913, + "18": 2.3937876582778483, + "79": 0.00787923837364182, + "80": 0.056933403204251394 + }, + "firefox": { + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0, + "10": 0, + "11": 0, + "12": 0, + "13": 0, + "14": 0, + "15": 0, + "16": 0, + "17": 0, + "18": 0, + "19": 0, + "20": 0, + "21": 0, + "22": 0, + "23": 0, + "24": 0, + "25": 0, + "26": 0, + "27": 0, + "28": 0, + "29": 0, + "30": 0, + "31": 0, + "32": 0.00025013455154418484, + "33": 0.002681998247112648, + "34": 0, + "35": 0, + "36": 0, + "37": 0, + "38": 0.0008198854745059391, + "39": 0.0005419581950124005, + "40": 0.00016675636769612322, + "41": 0, + "42": 0, + "43": 0.0007504036546325544, + "44": 0.0003752018273162772, + "45": 0.00016675636769612322, + "46": 0.0008615745664299699, + "47": 0.0002918236434682156, + "48": 0.0022373145999229865, + "49": 0.007309487450680068, + "50": 0.0012367763937462472, + "51": 0, + "52": 0.02402681331221642, + "53": 0.0011533982098981856, + "54": 0.00016675636769612322, + "55": 0.00025013455154418484, + "56": 0.02034427685892703, + "57": 0.0006670254707844929, + "58": 0.0009449527502780314, + "59": 0.0004585800111643388, + "60": 0.009741351146248531, + "61": 0.013840778518778225, + "62": 0.006600772887971543, + "63": 0.002112247324150894, + "64": 0.010477858436906408, + "65": 0.0213865041570278, + "66": 0.042564562854435446, + "67": 0.09410617683651219, + "68": 0.5248934600514972, + "69": 0.466014565890791, + "70": 0.26379467733129225, + "71": 0.4447809217374846, + "72": 0.9282910098723939, + "73": 0.3224790223963529, + "74": 0.0048359346631875735, + "75": 0.0007365072906578775, + "3.5": 0, + "3.6": 0 + }, + "chrome": { + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0, + "10": 0, + "11": 0.011436707551159116, + "12": 0, + "13": 0, + "14": 0, + "15": 0, + "16": 0, + "17": 0.0019454909564547707, + "18": 0, + "19": 0, + "20": 0, + "21": 0.00025013455154418484, + "22": 0, + "23": 0, + "24": 0, + "25": 0, + "26": 0, + "27": 0, + "28": 0.00008337818384806161, + "29": 0, + "30": 0.0012367763937462472, + "31": 0.002598620063264587, + "32": 0.000041689091924030806, + "33": 0, + "34": 0, + "35": 0.00020844545962015403, + "36": 0.005655820137693513, + "37": 0.001278465485670278, + "38": 0.0024735527874924943, + "39": 0.021511571432799893, + "40": 0.05279228673979767, + "41": 0.0004585800111643388, + "42": 0.00226510732787234, + "43": 0.0006670254707844929, + "44": 0.00020844545962015403, + "45": 0.01028330934126093, + "46": 0.0002918236434682156, + "47": 0.02292900055821694, + "48": 0.11638204828791933, + "49": 0.22535733457733584, + "50": 0.013145960320044382, + "51": 0.004307872832149849, + "52": 0.00041689091924030806, + "53": 0.05393178858572118, + "54": 0.014118705798271763, + "55": 0.664913223460342, + "56": 0.04210598284327111, + "57": 0.41975357021909143, + "58": 0.983209440300317, + "59": 0.018343200446573553, + "60": 0.018732298637864506, + "61": 0.44630952177469907, + "62": 0.13493369419411302, + "63": 5.703429080670755, + "64": 0.0517500594416969, + "65": 1.5191088206197583, + "66": 0.13375250325626548, + "67": 0.11950873018222163, + "68": 0.2192985198843767, + "69": 3.01442706611487, + "70": 4.109488340047362, + "71": 0.46181786397043856, + "72": 0.411513026382108, + "73": 0.7344645251536, + "74": 1.2208928497231915, + "75": 3.2911314655786366, + "76": 3.8960262930323495, + "77": 2.9883713836623507, + "78": 2.6049984943289632, + "79": 10.671198548886087, + "80": 2.5007618681549117, + "81": 0.040049320975018926, + "82": 0.0031544746222516643, + "83": 0 + }, + "safari": { + "4": 0, + "5": 0, + "6": 0, + "7": 0.0019454909564547707, + "8": 0, + "9": 0.0005002691030883697, + "10": 0.00025013455154418484, + "11": 0.035560795411198276, + "12": 0.032239564421250484, + "13": 1.1123344543530151, + "3.1": 0, + "3.2": 0, + "5.1": 0, + "6.1": 0, + "7.1": 0, + "9.1": 0.00330733462597311, + "10.1": 0.011033712995893487, + "11.1": 0.04152233555633468, + "12.1": 0.18842079913264456, + "TP": 0 + }, + "opera": { + "9": 0, + "11": 0, + "12": 0, + "15": 0, + "16": 0, + "17": 0, + "18": 0, + "19": 0, + "20": 0, + "21": 0, + "22": 0, + "23": 0, + "24": 0, + "25": 0, + "26": 0, + "27": 0, + "28": 0, + "29": 0, + "30": 0, + "31": 0, + "32": 0, + "33": 0, + "34": 0, + "35": 0, + "36": 0, + "37": 0, + "38": 0, + "39": 0, + "40": 0, + "41": 0, + "42": 0, + "43": 0, + "44": 0, + "45": 0, + "46": 0.0040855310085550186, + "47": 0, + "48": 0.00008337818384806161, + "49": 0.0017370454968346168, + "50": 0, + "51": 0, + "52": 0, + "53": 0.000625336378860462, + "54": 0.0002918236434682156, + "55": 0, + "56": 0, + "57": 0, + "58": 0.00025013455154418484, + "60": 0.0070176638072118516, + "62": 0.05136096125040594, + "63": 0.04145285373646129, + "64": 0.018051376803105337, + "65": 0.08386455658717529, + "66": 0.06169985604756559, + "9.5-9.6": 0, + "10.0-10.1": 0, + "10.5": 0, + "10.6": 0, + "11.1": 0, + "11.5": 0, + "11.6": 0, + "12.1": 0.12234358843305573 + }, + "ios_saf": { + "8": 0.00012506727577209242, + "3.2": 0.00016675636769612322, + "4.0-4.1": 0.5105385160656559, + "4.2-4.3": 0.04840103572379976, + "5.0-5.1": 0.035463520863375536, + "6.0-6.1": 0.022748347826546143, + "7.0-7.1": 0.0013201545775943088, + "8.1-8.4": 0.002126143688125571, + "9.0-9.2": 0.018885158641585954, + "9.3": 0.020872338689964753, + "10.0-10.2": 0.06531291068098159, + "10.3": 0.10186034793438192, + "11.0-11.2": 0.26033448270159765, + "11.3-11.4": 0.41896147747253487, + "12.0-12.1": 1.1564137208806904, + "12.2-12.4": 5.242389413082899, + "13.0-13.1": 1.5734713964886946, + "13.2": 0.3941008823218378, + "13.3": 3.5753399015887295 + }, + "op_mini": { + "all": 0 + }, + "android": { + "3": 0, + "4": 0.00025013455154418484, + "80": 6.6285795122848725, + "2.1": 0, + "2.2": 0, + "2.3": 0, + "4.1": 0, + "4.2-4.3": 0, + "4.4": 0.0007920927465565852, + "4.4.3-4.4.4": 0 + }, + "bb": { + "7": 0, + "10": 0 + }, + "op_mob": { + "10": 0.011533982098981856, + "11": 0.011533982098981856, + "12": 0.011533982098981856, + "46": 0.011533982098981856, + "11.1": 0.011533982098981856, + "11.5": 0.011533982098981856, + "12.1": 0.011533982098981856 + }, + "and_chr": { + "80": 18.81086867977733 + }, + "and_ff": { + "68": 0.22967910377346035 + }, + "ie_mob": { + "10": 0, + "11": 0 + }, + "and_uc": { + "12.12": 2.5861828175072508 + }, + "samsung": { + "4": 0, + "5.0-5.4": 0, + "6.2-6.4": 0, + "7.2-7.4": 0, + "8.2": 0, + "9.2": 0, + "10.1": 0 + }, + "and_qq": { + "1.2": 0 + }, + "baidu": { + "7.12": 0 + }, + "kaios": { + "2.5": 0 + } +} \ No newline at end of file diff --git a/package.json b/package.json index 79855838..22c78d2a 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,34 @@ { "name": "penguin-stats-frontend", - "version": "1.1.2", + "version": "1.1.3", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "npx --max_old_space_size=4096 vue-cli-service build --modern", + "build:single": "npx --max_old_space_size=4096 vue-cli-service build", "lint": "vue-cli-service lint", "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'", "submit": "git add . && git cz && git push" }, "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@chenfengyuan/vue-number-input": "^1.2.1", "@sentry/browser": "^5.6.2", "@sentry/integrations": "^5.6.1", + "animejs": "^3.1.0", "aos": "^2.3.4", + "clipboard-polyfill": "^2.8.6", "core-js": "^2.6.5", - "dayjs": "^1.8.15", + "dayjs": "^1.8.21", "js-cookie": "^2.2.1", "plotly.js": "^1.49.2", "vue": "^2.6.10", - "vue-analytics": "^5.17.0", + "vue-analytics": "^5.22.1", "vue-i18n": "^8.0.0", "vue-router": "^3.0.3", - "vuetify": "^2.2.4", + "vuetify": "^2.2.15", "vuex": "^3.0.1", - "vuex-persistedstate": "^2.5.4" + "vuex-persistedstate": "^2.7.1" }, "devDependencies": { "@kazupon/vue-i18n-loader": "^0.3.0", @@ -34,6 +39,7 @@ "@vue/cli-service": "^3.9.0", "axios": "^0.19.0", "babel-eslint": "^10.0.1", + "browserslist-ga-export": "^2.0.0", "cz-conventional-changelog": "3.0.2", "eslint": "^5.16.0", "eslint-plugin-vue": "^5.0.0", @@ -42,8 +48,8 @@ "sass-loader": "^8.0.2", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", - "vue-cli-plugin-i18n": "^0.6.0", - "vue-cli-plugin-vuetify": "^2.0.3", + "vue-cli-plugin-i18n": "^0.6.1", + "vue-cli-plugin-vuetify": "^2.0.5", "vue-template-compiler": "^2.6.10", "vuetify-loader": "^1.4.3" }, @@ -53,8 +59,10 @@ } }, "browserslist": [ - "> 1%", - "last 2 versions" + "> 0.1% in my stats", + "> 1% in CN", + "last 5 versions", + "defaults" ], "config": { "commitizen": { diff --git a/public/index.html b/public/index.html index 43de3f8e..7a8e2d53 100644 --- a/public/index.html +++ b/public/index.html @@ -3,7 +3,7 @@ - + @@ -12,13 +12,18 @@ - + 企鹅物流数据统计 diff --git a/src/apis/planner.js b/src/apis/planner.js new file mode 100644 index 00000000..4bde16de --- /dev/null +++ b/src/apis/planner.js @@ -0,0 +1,7 @@ +import service from '@/utils/service' + +export default { + plan (data) { + return service.post("https://planner.penguin-stats.io/plan", data) + } +} \ No newline at end of file diff --git a/src/assets/preloader_i18n.js b/src/assets/preloader_i18n.js index 62a487e8..1e022373 100644 --- a/src/assets/preloader_i18n.js +++ b/src/assets/preloader_i18n.js @@ -60,12 +60,12 @@ let _i18n = { }, "ja": { "load_title--text": "読み込み中...", - "load_caption--text": "読み込みが初めて遅くなる場合があります
しばらくお待ちください", + "load_caption--text": "初めての読み込みは動作が遅くなる可能性があります
少々お待ち下さい", "load_copyright--text": "ペンギン急便データ統計処理部門" }, "ko": { - "load_title--text": "로딩...", - "load_caption--text": "처음으로 로딩이 느려질 수 있으므로 잠시 기다려주십시오", + "load_title--text": "로딩중...", + "load_caption--text": "초기 설정에 시간이 좀 걸릴 수 있으니, 기다려 주시기 바랍니다", "load_copyright--text": "펭귄 물류 데이터 분석 부서" }, }, diff --git a/src/components/global/GlobalSnackbar.vue b/src/components/global/GlobalSnackbar.vue new file mode 100644 index 00000000..6c6a484a --- /dev/null +++ b/src/components/global/GlobalSnackbar.vue @@ -0,0 +1,72 @@ + + { + "zh": { + "network": { + "error": "网络请求失败,请检查网络后重试" + }, + "clipboard": { + "success": "复制成功", + "error": "复制到剪贴板失败,请手动复制" + }, + "planner": { + "import": { + "jsonError": "导入失败:数据格式错误,请检查后重试({error})", + "success": "导入成功:导入了 {amount} 个物品数据" + }, + "calculationError": "计算失败:{error}" + } + }, + "en": { + "network": { + "error": "Network error, please check your network and try again." + }, + "clipboard": { + "success": "Copied to clipboard", + "error": "Failed to copy to clipboard, please manually select text and copy it" + }, + "planner": { + "import": { + "jsonError": "Failed to import: Data parsing error, please check your input ({error})", + "success": "Successfully imported data for {amount} items" + }, + "calculationError": "Failed to calculate: {error}" + } + } + } + + + + + + + \ No newline at end of file diff --git a/src/components/global/Item.vue b/src/components/global/Item.vue index ce1c301b..d50d2fde 100644 --- a/src/components/global/Item.vue +++ b/src/components/global/Item.vue @@ -1,8 +1,9 @@ - {{ name }} + {{ name }}
mdi-lamp @@ -18,8 +16,7 @@ mdi-treasure-chest @@ -52,7 +49,7 @@ export default { originalIconSize: 60, originalSpriteDimensions: { x: 360, - y: 600 + y: 720 } }; }, @@ -99,7 +96,7 @@ export default { width: 60px; display: inline-block; overflow: hidden; - background-size: 360px 600px; + background-size: 360px 720px; transition: transform 150ms cubic-bezier(.25,.8,.5,1); } @@ -110,4 +107,8 @@ export default { .item-icon--sprite--disable-hover-effect { transform: none !important; } + + .item-icon--special { + border-radius: 50%; + } diff --git a/src/components/global/ItemStepper.vue b/src/components/global/ItemStepper.vue index 816d45f4..13ba6bae 100644 --- a/src/components/global/ItemStepper.vue +++ b/src/components/global/ItemStepper.vue @@ -37,6 +37,7 @@ :ratio="1" disable-link tooltip-position="bottom" + :tooltip-nudge="0" /> @@ -117,11 +118,6 @@ \ No newline at end of file diff --git a/src/components/stats/StageSelector.vue b/src/components/stats/StageSelector.vue index 8ac3d138..acaabc5b 100644 --- a/src/components/stats/StageSelector.vue +++ b/src/components/stats/StageSelector.vue @@ -76,14 +76,14 @@ } }, "ko": { - "opensAt": "Opens at: {0} - {1}", + "opensAt": "이벤트 기간: {0} - {1}", "zone": { "name": "에피소드", "types": { - "MAINLINE": "메인", + "MAINLINE": "메인 스토리", "WEEKLY": "물자 비축", - "ACTIVITY_OPEN": "Event (Opening)", - "ACTIVITY_CLOSED": "Event (Closed)" + "ACTIVITY_OPEN": "이벤트 (개방중)", + "ACTIVITY_CLOSED": "이벤트 (종료)" }, "status": { "closed": "Closed", @@ -92,7 +92,7 @@ }, "stage": { "name": "작전지역", - "apCost": "{apCost} AP required", + "apCost": "{apCost} 이성 필요", "loots": { "normal": "일반 드랍", "extra": "추가 드랍", @@ -107,10 +107,10 @@ - + {{ category.zones[0].icon }} @@ -219,7 +221,7 @@ :key="stage.stageId" :stage="stage" - @click.native="selectStage(zone.zoneId, stage.stageId)" + @click.native="selectStage(zone.zoneId, stage.stageId, stage.code)" /> @@ -232,6 +234,12 @@ :step="2" class="pa-0 pt-2" > + + {{ selectedStage.code || "" }} + @@ -312,28 +320,29 @@ return this.$vuetify.breakpoint.xsOnly }, categorizedZones() { - const categories = ["ACTIVITY_OPEN", "MAINLINE", "WEEKLY"]; - !this.hideClosed ? categories.push("ACTIVITY_CLOSED") : null; - let result = []; - for (let category of categories) { - let filter = null; - let zones = get.zones.byType(category.startsWith("ACTIVITY") ? "ACTIVITY" : category); - if (category === "ACTIVITY_OPEN") { - filter = zone => !zone.isOutdated; - } else if (category === "ACTIVITY_CLOSED") { - filter = zone => zone.isOutdated; - } - if (filter) { - zones = zones.filter(filter); - } - if (zones && zones.length) { - result.push({ - id: category, - zones: zones - }) + const categoriesSet = [["ACTIVITY_OPEN", "MAINLINE"], ["WEEKLY"]]; + if (!this.hideClosed) categoriesSet[1].push("ACTIVITY_CLOSED"); + let result = [[], []]; + for (let [index, categories] of categoriesSet.entries()) { + for (let category of categories) { + let filter = null; + let zones = get.zones.byType(category.startsWith("ACTIVITY") ? "ACTIVITY" : category); + if (category === "ACTIVITY_OPEN") { + filter = zone => !zone.isOutdated; + } else if (category === "ACTIVITY_CLOSED") { + filter = zone => zone.isOutdated; + } + if (filter) { + zones = zones.filter(filter); + } + if (zones && zones.length) { + result[index].push({ + id: category, + zones: zones + }) + } } } - result = [result.slice(0, -1), result.slice(-1)] return result; }, selectedStage() { @@ -381,11 +390,22 @@ \ No newline at end of file diff --git a/src/components/toolbar/AccountManager.vue b/src/components/toolbar/AccountManager.vue index a07366ab..c74d1c16 100644 --- a/src/components/toolbar/AccountManager.vue +++ b/src/components/toolbar/AccountManager.vue @@ -40,17 +40,17 @@ "userId": "ユーザーID" }, "ko": { - "notice": "The User ID helps us identifies your upload identity. Inputting this ID on other devices enable you to manage and inspect your uploads with ease.", - "success": "Successfully logged in", + "notice": "사용자 ID는 당신의 보고서를 확인하는데 사용됩니다. 이 ID를 다른 기기에 입력하면 편리하게 보고서를 관리하고 검사할 수 있습니다.", + "success": "성공적으로 로그인 되었습니다.", "failed": { - "message": "Failed to log in: {message}", - "notfound": "The specified User ID could not been found" + "message": "로그인에 실패했습니다: {message}", + "notfound": "지정된 사용자 ID를 찾을 수 없습니다" }, - "login": "Login", - "logout": "Logout", - "logoutPrompt": "Are you sure?", - "loggedOut": "Logged out", - "userId": "User ID" + "login": "로그인", + "logout": "로그아웃", + "logoutPrompt": "정말로 로그아웃 하시겠습니까?", + "loggedOut": "로그아웃 되었습니다", + "userId": "사용자 ID" } } diff --git a/src/components/toolbar/NetworkStateIndicator.vue b/src/components/toolbar/NetworkStateIndicator.vue index a162692d..73ae4f6a 100644 --- a/src/components/toolbar/NetworkStateIndicator.vue +++ b/src/components/toolbar/NetworkStateIndicator.vue @@ -68,8 +68,8 @@ @@ -125,13 +125,16 @@ name: "NetworkStateIndicator", data () { return { - model: false, + model: false } }, computed: { ...mapGetters('ajax', ['pending', 'errors']), haveError () { return this.errors.length > 0 + }, + show () { + return (this.haveError && !this.model) || this.pending } }, watch: { @@ -153,13 +156,14 @@ } - \ No newline at end of file diff --git a/src/config/index.js b/src/config/index.js index 89fdccbf..f09e82dd 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -1,6 +1,6 @@ const client = { source: "frontend-v2", - version: "v1.1.2" + version: "v1.1.3" }; export default { diff --git a/src/layouts/AboutLayout.vue b/src/layouts/AboutLayout.vue index 79bd3210..c86ddc82 100644 --- a/src/layouts/AboutLayout.vue +++ b/src/layouts/AboutLayout.vue @@ -3,7 +3,7 @@ class="fill-height justify-center" > - + - + { - document.title = `${I18n.t(to.meta.i18n)} | ${I18n.t('app.name')}`; + document.title = `${i18n.t(to.meta.i18n)} | ${i18n.t('app.name')}`; next(); }); Vue.config.productionTip = false; +Vue.use(VueNumberInput); + new Vue({ vuetify, router, store, i18n, - created() { - AOS.init({ - delay: 100, - duration: 700, - easing: 'ease-in-out-sine' - }) - }, render: h => h(App), }).$mount('#app'); \ No newline at end of file diff --git a/src/models/items.js b/src/models/items.js index 4c10346f..8edcf6e5 100644 --- a/src/models/items.js +++ b/src/models/items.js @@ -6,36 +6,10 @@ const items = new ObjectManager({ api: '/items?i18n=true', transform: [ (object) => { - const META_MAP = { - CARD_EXP: { - name: "作战记录", - icon: "mdi-card-bulleted", - color: "light-blue" - }, - MATERIAL: { - name: "材料", - icon: "mdi-cube-outline", - color: "lime" - }, - FURN: { - name: "家具", - icon: "mdi-lamp", - color: "blue-grey" - }, - ACTIVITY_ITEM: { - name: "活动道具", - icon: "mdi-treasure-chest", - color: "blue" - } - }; + let filtered = object.filter(el => !el.hide); + filtered = filtered.sort((a, b) => a.sortId - b.sortId); - object.forEach(el => { - el.meta = META_MAP[el.itemType] - }); - - object.sort((a, b) => a.sortId - b.sortId) - - return object + return filtered }, ], ttl: 1000 * 60 * 60, // 1 hours diff --git a/src/plugins/vuetify.js b/src/plugins/vuetify.js index 36e725a0..ea7f3251 100644 --- a/src/plugins/vuetify.js +++ b/src/plugins/vuetify.js @@ -2,10 +2,18 @@ import '@mdi/font/css/materialdesignicons.css' import Vue from 'vue'; import Vuetify from 'vuetify/lib'; +import zhHans from 'vuetify/es5/locale/zh-Hans' +import ja from 'vuetify/es5/locale/ja' +import ko from 'vuetify/es5/locale/ko' +import en from 'vuetify/es5/locale/en' + Vue.use(Vuetify); export default new Vuetify({ icons: { iconfont: 'mdi', }, + lang: { + locales: { zh: zhHans, ja, ko, en } + }, }); \ No newline at end of file diff --git a/src/router.js b/src/router.js index 543b0763..95a842fb 100644 --- a/src/router.js +++ b/src/router.js @@ -3,6 +3,7 @@ import Router from 'vue-router' import Home from './views/Home' import Report from './views/Report' +import Planner from './views/Planner' import StatsLayout from './layouts/StatsLayout' import StatsByStage from './views/Stats/Stage' @@ -111,19 +112,12 @@ const router = new Router({ ] }, { - path: '/_redirect/planner', + path: '/planner', name: 'Planner', + component: Planner, meta: { - ga: { - category: 'redirect', - action: 'links', - label: 'ArkPlanner', - value: 1 - }, - link: "https://planner.penguin-stats.io", icon: 'mdi-floor-plan', - i18n: 'menu.planner', - externalRedirect: true + i18n: 'menu.planner' } }, { diff --git a/src/store/index.js b/src/store/index.js index 39a075b3..ced87f6c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -9,17 +9,42 @@ import cacheUpdateAt from './modules/cacheUpdateAt'; import data from './modules/data'; import dataSource from './modules/dataSource'; import settings from './modules/settings'; +import ui from './modules/ui'; Vue.use(Vuex); +const previousState = localStorage.getItem("penguin-stats-state"); +if (previousState) { + localStorage.setItem("penguin-stats-data", {data: previousState["data"]}); + localStorage.setItem("penguin-stats-settings", {settings: previousState["settings"]}); + localStorage.setItem("penguin-stats-auth", {auth: previousState["auth"]}); + localStorage.setItem("penguin-stats-cacheTTL", {cacheUpdateAt: previousState["cacheUpdateAt"]}); + localStorage.removeItem("penguin-stats-state") +} + export default new Vuex.Store({ plugins: [ createPersistedState({ - key: "penguin-stats-state", + key: "penguin-stats-data", + paths: [ + "data" + ] + }), + createPersistedState({ + key: "penguin-stats-settings", + paths: [ + "settings" + ] + }), + createPersistedState({ + key: "penguin-stats-auth", + paths: [ + "auth" + ] + }), + createPersistedState({ + key: "penguin-stats-cacheTTL", paths: [ - "data", - "settings", - "auth", "cacheUpdateAt" ] }) @@ -30,6 +55,7 @@ export default new Vuex.Store({ cacheUpdateAt, data, dataSource, - settings + settings, + ui } }); \ No newline at end of file diff --git a/src/store/modules/ajax.js b/src/store/modules/ajax.js index f83494f8..c534b19a 100644 --- a/src/store/modules/ajax.js +++ b/src/store/modules/ajax.js @@ -47,5 +47,6 @@ export default { errors: state => { return state.states.filter(value => !!value.error) }, + matrixPending: state => state.states.some(value => value.pending && value.id.includes("Matrix")) } }; \ No newline at end of file diff --git a/src/store/modules/ui.js b/src/store/modules/ui.js new file mode 100644 index 00000000..97067515 --- /dev/null +++ b/src/store/modules/ui.js @@ -0,0 +1,26 @@ +export default { + namespaced: true, + state: { + snackbar: { + enabled: false, + color: "", + timeout: 0, + text: "", + icon: "", + extra: {} + } + }, + mutations: { + setSnackbar (state, {color, timeout, text, icon, extra}) { + state.snackbar.enabled = true; + state.snackbar.color = color; + state.snackbar.timeout = timeout; + state.snackbar.text = text; + state.snackbar.icon = icon; + state.snackbar.extra = extra; + }, + }, + getters: { + snackbar: state => state.snackbar, + } +}; \ No newline at end of file diff --git a/src/utils/getters.js b/src/utils/getters.js index 4d01fa9e..a55a9dfc 100644 --- a/src/utils/getters.js +++ b/src/utils/getters.js @@ -4,13 +4,26 @@ import Console from "@/utils/Console"; let Getters = {}; Getters.items = { + _cache: null, byItemId(itemId) { - return this.all().find(el => { - return el.itemId === itemId - }) + const got = this.all(true); + if (!got) return {}; + return got.get(itemId) || {} }, - all() { - return store.state.data.items || [] + byName (name) { + const got = this.all(false); + if (!got) return {}; + return got.find(el => el.name === name) || {} + }, + all(map=false) { + const items = store.state.data.items; + if (!items) return []; + if (map) { + if (!this._cache) this._cache = new Map(items.map(item => [item.itemId, item])) + return this._cache + } else { + return items + } } } Getters.limitations = { diff --git a/src/utils/marshaller.js b/src/utils/marshaller.js new file mode 100644 index 00000000..9b664716 --- /dev/null +++ b/src/utils/marshaller.js @@ -0,0 +1,25 @@ +export default { + planner ({items, options}) { + const body = { + required: {}, + owned: {}, + extra_outc: false, + exp_demand: false, + gold_demand: false + }; + + items.forEach(el => { + if (el.need) body.required[el.name] = el.need; + if (el.have) body.owned[el.name] = el.have; + }); + + body.extra_outc = options.byProduct; + body.exp_demand = options.requireExp; + body.gold_demand = options.requireLmb; + if (options.foreignServer) { + body["exclude"] = ["6-1","6-10","6-11","6-12","6-14","6-15","6-16","6-2","6-3","6-4","6-5","6-8","6-9","S6-1","S6-2","S6-3","S6-4"] + } + + return body + } +} \ No newline at end of file diff --git a/src/utils/snackbar.js b/src/utils/snackbar.js new file mode 100644 index 00000000..61b8dc4e --- /dev/null +++ b/src/utils/snackbar.js @@ -0,0 +1,24 @@ +import store from "../store"; + +function getDefaultIcon (type) { + const MAP = { + "success": "mdi-check-circle", + "error": "mdi-close-circle", + }; + return MAP[type] +} + +export default { + launch (type, timeout, text, extra, icon) { + return store.commit("ui/setSnackbar", { + color: type, + timeout, + text, + extra, + icon: icon || getDefaultIcon(type) || "mdi-alert-circle" + }) + }, + networkError () { + this.launch("error", 10000, "network.error") + } +} \ No newline at end of file diff --git a/src/views/About/Bulletin.vue b/src/views/About/Bulletin.vue index 524dc834..8f1607b3 100644 --- a/src/views/About/Bulletin.vue +++ b/src/views/About/Bulletin.vue @@ -3,25 +3,29 @@ "zh": { "bulletin": { "bulletin_0": "1月16日海外版正式上线,为了避免数据混淆,请只上传国服的掉落。", - "bulletin_1": "专用于海外版的素材统计站是否开放正在计划中。" + "bulletin_1": "专用于海外版的素材统计站是否开放正在计划中。", + "bulletin_2": "全站翻译已经完成,感谢Syaro和方舟航海図的帮助!" } }, "en": { "bulletin": { "bulletin_0": "Arknights EN server was officially released on 1/16. In order not to mess up the data, please only submit drop data from CN server.", - "bulletin_1": "We are considering whether to open another website for overseas servers." + "bulletin_1": "We are considering whether to open another website for overseas servers.", + "bulletin_2": "The translation of the entire website has been finished. Thanks Syaro and 方舟航海図 for their efforts!" } }, "ja": { "bulletin": { "bulletin_0": "1月16日に海外版が正式にリリースされます。データの混雑を避けるために、当サイトでは大陸版のドロップデータのみをアップロードして下さい。", - "bulletin_1": "海外版のドロップまとめサイトを開設するかは現時点では思案中のみとなっています。" + "bulletin_1": "海外版のドロップまとめサイトを開設するかは現時点では思案中のみとなっています。", + "bulletin_2": "Webサイトの翻訳は全て完了しました。Syaroと方舟航海図のご協力に感謝します!" } }, "ko": { "bulletin": { "bulletin_0": "명일방주 해외서버가 1/16일에 오픈하였습니다. 데이터의 혼란을 방지하기 위해, 중국 서버의 보고서만 작성하여 주십시오.", - "bulletin_1": "저희는 해외서버를 위한 웹 사이트 개설을 검토하고 있습니다." + "bulletin_1": "저희는 해외서버를 위한 웹 사이트 개설을 검토하고 있습니다.", + "bulletin_2": "웹 사이트 전체의 번역이 끝났습니다. Syaro님과 方舟航海図님의 노력에 감사드립니다!" } } } @@ -44,6 +48,8 @@ {{ $t('bulletin.bulletin_0') }}
{{ $t('bulletin.bulletin_1') }} +
+ {{ $t('bulletin.bulletin_2') }}
diff --git a/src/views/About/Changelog.vue b/src/views/About/Changelog.vue index b3297729..a7964f88 100644 --- a/src/views/About/Changelog.vue +++ b/src/views/About/Changelog.vue @@ -1,17 +1,18 @@ diff --git a/src/views/About/Contact.vue b/src/views/About/Contact.vue index acdfa2d5..376a8b5e 100644 --- a/src/views/About/Contact.vue +++ b/src/views/About/Contact.vue @@ -7,7 +7,7 @@ "contributor": "团队成员页面", "contact_1": "页面内的各种联系方式", "github": "Github Issues", - "nga": "NGA讨论帖" + "nga": "NGA 讨论帖" } }, "en": { @@ -26,7 +26,7 @@ "contact_2": "ご質問、ご要望などございましたら、管理人さんにお気軽にお問い合わせください。(日本語でもOKです)", "contributor": "制作協力者ページ", "github": "Github Issues", - "nga": "NGAスレッド" + "nga": "NGA スレッド" } }, "ko": { @@ -57,10 +57,12 @@ class="mx-2 my-1" color="secondary" text-color="white" - @click="$router.push({name: 'AboutMembers'})" + :to="{name: 'AboutMembers'}" > {{ $t('contact.contributor') }} - + mdi-account-multiple @@ -68,10 +70,13 @@ class="mx-2 my-1" color="secondary" text-color="white" - @click="goToHref('https://github.com/penguin-statistics/frontend-v2/issues')" + href="https://github.com/penguin-statistics/frontend-v2/issues" + target="_blank" > {{ $t('contact.github') }} - + mdi-github-circle @@ -79,11 +84,14 @@ class="mx-2 my-1" color="secondary" text-color="white" - @click="goToHref('https://bbs.nga.cn/read.php?tid=17340880')" + href="https://bbs.nga.cn/read.php?tid=17340880" + target="_blank" > {{ $t('contact.nga') }} - - mdi-share + + mdi-forum @@ -153,9 +161,6 @@ export default { name: 'Contact', methods: { - goToHref(href) { - window.open(href) - } } } diff --git a/src/views/About/Contribute.vue b/src/views/About/Contribute.vue index 679be0dc..7fc06d8b 100644 --- a/src/views/About/Contribute.vue +++ b/src/views/About/Contribute.vue @@ -39,6 +39,7 @@

{{ $t('menu.about.contribute') }} diff --git a/src/views/About/Donate.vue b/src/views/About/Donate.vue index e0614963..924ce288 100644 --- a/src/views/About/Donate.vue +++ b/src/views/About/Donate.vue @@ -7,11 +7,11 @@ "donate_2": "服务器费用", "donate_3": "pocky、阿噗噜派也可", "donate_4": ",我们将不胜感激!", - "redirectToApp": "打开“{app}” APP 捐助", + "redirectToApp": "打开 “{app}” APP 捐助", "methods": { "alipay": "支付宝", "wechatPay": "微信支付", - "paypal": "使用PayPal捐助" + "paypal": "使用 PayPal 捐助" } } }, @@ -37,11 +37,11 @@ "donate_2": "運営費用", "donate_3": "ポッキーやアップルパイでも可", "donate_4": "を寄付頂けると非常にありがたいです。", - "redirectToApp": "{app}アプリで寄付します", + "redirectToApp": "{app} アプリで寄付します", "methods": { "alipay": "Alipay", "wechatPay": "WeChat Pay", - "paypal": "PayPalで寄付" + "paypal": "PayPal で寄付" } } }, @@ -52,11 +52,11 @@ "donate_2": "서버비", "donate_3": "빼빼로나 애플파이도 환영합니다!", "donate_4": "를 기부해 줄 수 있다면, 우리는 매우 감사할 것입니다!", - "redirectToApp": "{app}로 기부하기", + "redirectToApp": "{app} 로 기부하기", "methods": { "alipay": "Alipay", "wechatPay": "WeChat Pay", - "paypal": "PayPal로 기부하기" + "paypal": "PayPal 로 기부하기" } } } @@ -106,6 +106,7 @@ :alt="$t('donate.methods.alipay')" max-height="128px" contain + aspect-ratio="1" /> {{ $t('donate.redirectToApp', {app: $t('donate.methods.alipay')}) }} @@ -144,6 +146,7 @@ :alt="$t('donate.methods.wechatPay')" max-height="128px" contain + aspect-ratio="1" /> mdi-paypal @@ -187,17 +191,6 @@ export default { paypal: "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=T9LRK3VEL645J&item_name=Penguin+Statistics+Donation¤cy_code=USD&source=url" } } - }, - methods: { - redirectAlipay() { - window.location = this.qr.alipay - }, - redirectWechatPay() { - window.location = this.qr.wechatPay - }, - redirectPayPal() { - window.open(this.qr.paypal) - } } }; diff --git a/src/views/About/Intro.vue b/src/views/About/Intro.vue index 4f3f8b3c..4acf8bff 100644 --- a/src/views/About/Intro.vue +++ b/src/views/About/Intro.vue @@ -25,7 +25,7 @@ "intro": { "intro_0": "펭귄 물류 데이터 분석 부서에 오신것을 환영합니다!", "intro_1": "저희는 펭귄 물류의 데이터 분석 부서입니다. 저희는 아이템 드랍에 대한 분석을 맡고 있습니다.", - "intro_2": "대부분의 드랍 데이터는 박사들에 의해 수동으로 제출되었으며, 저희 부서는 잘못된 보고서나 잘못된 결과를 방지하기 위해 전체적인 데이터 검사를 실시하고 있습니다." + "intro_2": "대부분의 데이터는 박사들에 의해 수동으로 제출되었으며, 저희 부서는 잘못된 보고서나 잘못된 결과를 방지하기 위해 전체적인 데이터 검사를 실시하고 있습니다." } } } @@ -33,8 +33,8 @@ @@ -315,9 +334,4 @@ export default { width: 100%; border: 1px solid rgba(255, 255, 255, 0.75); } - -.monospace { - font-family: SF Mono, Consolas, Courier, Courier New, monospace; - font-size: 10px; -} diff --git a/src/views/About/Members.vue b/src/views/About/Members.vue index 3ab9ab5e..17a6b972 100644 --- a/src/views/About/Members.vue +++ b/src/views/About/Members.vue @@ -129,8 +129,9 @@ {{ $t('categories.' + key) }} @@ -139,7 +140,7 @@ - - - {{ $t(`socials.${id}`) }} - + + {{ getSocial(id).icon }} + + @@ -189,6 +184,8 @@ @@ -78,14 +93,14 @@ export default { } .animation-blink:hover{ - animation-play-state: paused; + animation-play-state: paused !important; } .theme--light .animation-blink { background: repeating-linear-gradient( -45deg, - rgba(240, 240, 240, 0.95), - rgba(240, 240, 240, 0.95) 45px, + rgba(240, 240, 240, 0.98), + rgba(240, 240, 240, 0.98) 45px, rgba(255, 255, 255, 0.9) 45px, rgba(255, 255, 255, 0.9) 90px ) !important; @@ -95,10 +110,10 @@ export default { .theme--dark .animation-blink { background: repeating-linear-gradient( -45deg, - rgba(81, 81, 81, 0.95), - rgba(81, 81, 81, 0.95) 45px, - rgba(66, 66, 66, 0.9) 45px, - rgba(66, 66, 66, 0.9) 90px + rgba(61, 61, 61, 0.98), + rgba(61, 61, 61, 0.98) 45px, + rgba(46, 46, 46, 0.9) 45px, + rgba(46, 46, 46, 0.9) 90px ) !important; animation: dark-blink 3s infinite alternate ease-in-out; } @@ -106,22 +121,22 @@ export default { @keyframes light-blink { from { text-shadow: 0 0 0 rgba(0, 0, 0, .2); - box-shadow: 0 0 0 1px rgba(0, 0, 0, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);; + box-shadow: 0 0 0 1px rgba(0, 0, 0, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); } to { text-shadow: 0 0 5px rgba(0, 0, 0, .2); - box-shadow: 0 0 0 3px rgba(0, 0, 0, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);; + box-shadow: 0 0 0 3px rgba(0, 0, 0, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); } } @keyframes dark-blink { from { text-shadow: 0 0 0 rgba(255, 255, 255, .3); - box-shadow: 0 0 0 1px rgba(255, 255, 255, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);; + box-shadow: 0 0 0 1px rgba(255, 255, 255, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); } to { text-shadow: 0 0 5px rgba(255, 255, 255, .3); - box-shadow: 0 0 0 3px rgba(255, 255, 255, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);; + box-shadow: 0 0 0 3px rgba(255, 255, 255, .5), 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); } } \ No newline at end of file diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue index f1f19b2b..2e226a91 100644 --- a/src/views/NotFound.vue +++ b/src/views/NotFound.vue @@ -4,7 +4,7 @@ class="fill-height" fluid style="cursor: pointer; padding: 0;" - @click="redirect" + @click="$router.push({name: 'home'})" > diff --git a/src/views/Planner.vue b/src/views/Planner.vue new file mode 100644 index 00000000..a33b9b5b --- /dev/null +++ b/src/views/Planner.vue @@ -0,0 +1,1128 @@ + + { + "zh": { + "options": { + "_name": "选项", + "byProduct": "考虑合成副产物", + "requireExp": "大量需求经验", + "requireLmb": "大量需求龙门币", + "foreignServer": "不考虑第六章" + }, + "actions": { + "import": "导入", + "export": "导出", + "importExport": "@:(actions.import)/@:(actions.export)", + "calculate": "计算规划" + }, + "have": "已有", + "need": "需要", + "copy": "复制到剪贴板", + "calculation": { + "title": "规划结果", + "tabs": { + "stages": "关卡列表", + "syntheses": "合成列表", + "values": "素材价值" + }, + "lmb": "预计龙门币收益", + "sanity": "预计需要理智", + "exp": "预计获得录像带经验", + "times": "次", + "level": "材料等级", + "noStage": "未找到需要进行的作战。是不是忘记选择所需素材了?", + "noSyntheses": "未找到需要合成的素材。是不是忘记选择所需素材了?" + } + }, + "en": { + "options": { + "_name": "Options", + "byProduct": "Consider by-products", + "requireExp": "Large demand for EXP", + "requireLmb": "Large demand for LMD", + "foreignServer": "Do not add Chapter 6 into calculation" + }, + "actions": { + "import": "Import", + "export": "Export", + "importExport": "@:(actions.import)/@:(actions.export)", + "calculate": "Calculate" + }, + "have": "Have", + "need": "Need", + "copy": "Copy to Clipboard", + "calculation": { + "title": "Calculation Result", + "tabs": { + "stages": "Stages", + "syntheses": "Syntheses", + "values": "Values" + }, + "lmb": "Estimated LMD income", + "sanity": "Estimated Sanity required", + "exp": "Estimated EXP from Battle Records", + "times": "battles", + "level": "Material Level", + "noStage": "No stage found. Have you selected any material yet?", + "noSyntheses": "No syntheses found. Have you selected any material yet?" + } + }, + "ja": { + "options": { + "_name": "オプション", + "byProduct": "加工副産物を考慮する", + "requireExp": "大量の経験値が必要", + "requireLmb": "大量の龍門幣が必要", + "foreignServer": "第6章を計算に追加しません" + }, + "actions": { + "import": "インポート", + "export": "エクスポート", + "importExport": "@:(actions.import)/@:(actions.export)", + "calculate": "計算を行う" + }, + "have": "所持数", + "need": "必要数", + "copy": "クリップボードにコピー", + "calculation": { + "title": "計算結果", + "tabs": { + "stages": "ステージ", + "syntheses": "素材加工", + "values": "素材等級" + }, + "lmb": "推定獲得龍門幣", + "sanity": "推定必要理性", + "exp": "戦闘で入手出来る経験値の推定", + "times": "回", + "level": "素材レベル", + "noStage": "入力内容に不備があるため結果を表示出来ません。必要な素材の入力を忘れていませんか?", + "noSyntheses": "入力内容に不備があるため結果を表示出来ません。必要な素材の入力を忘れていませんか?" + } + }, + "ko": { + "options": { + "_name": "설정", + "byProduct": "부산물 획득 고려", + "requireExp": "경험치 획득 고려", + "requireLmb": "용문폐 획득 고려", + "foreignServer": "에피소드 6을 계산에 넣지 마십시오" + }, + "actions": { + "import": "가져오기", + "export": "내보내기", + "importExport": "@:(actions.import)/@:(actions.export)", + "calculate": "계산하기" + }, + "have": "소유량", + "need": "필요량", + "copy": "클립보드에 복사", + "calculation": { + "title": "계산 결과", + "tabs": { + "stages": "작전 지역 기준", + "syntheses": "재료 가공 기준", + "values": "재료 등급 기준" + }, + "lmb": "예상 용문폐 획득량", + "sanity": "예상 이성 필요량", + "exp": "예상 경험치 획득량", + "times": "회", + "level": "재료 등급", + "noStage": "작전 지역을 찾을 수 없습니다. 필요한 재료를 선택하셨습니까?", + "noSyntheses": "가공할 재료를 찾을 수 없습니다. 필요한 재료를 선택하셨습니까?" + } + } + } + + + + + + + \ No newline at end of file diff --git a/src/views/Report.vue b/src/views/Report.vue index ec4744c4..6fe55435 100644 --- a/src/views/Report.vue +++ b/src/views/Report.vue @@ -16,7 +16,8 @@ "undo": "撤销", "undoSuccess": "撤销成功", "unable": "无法提交:", - "clear": "清空" + "clear": "清空", + "expired": "此活动关卡已过期,汇报已关闭" }, "rules": { "rule_1": "这是单次作战的提交,请注意核对数目;", @@ -44,7 +45,8 @@ "undo": "Recall", "undoSuccess": "Successfully recalled submission", "clear": "Clear", - "unable": "Failed to submit: " + "unable": "Failed to submit: ", + "expired": "This activity has ended, thus the report function of this stage has been closed." }, "rules": { "rule_1": "This is only intended for reporting a single combat, please double-check your inputting.", @@ -82,7 +84,7 @@ "rule_5": "大陸版のドロップデータのみをアップロードして下さい。ご協力ありがとうございます。" }, "usage": "左クリックで個数増加、右クリックで個数減少", - "gacha": "Multiple results are allowed in the reporting of this stage." + "gacha": "この操作を行うことでデータに複数の結果を反映させることが出来ます。" }, "ko": { "stage": { @@ -121,7 +123,7 @@ fluid > - - + + + + + mdi-cancel + + + {{ $t('report.expired') }} + + + + + +

+ {{ strings.translate(selectedZone, "zoneName") }} + {{ selectedStage.code }} +

+ + + + mdi-chart-pie + + {{ $t('menu.stats._name') }} + +
+ @@ -284,7 +338,7 @@
- + ({ + invalidPath: false, snackbar: false, submitting: false, undoing: false, @@ -501,9 +556,17 @@ export default { strings() { return strings }, + selectedZone () { + if (!this.selected.zone) return []; + return get.zones.byZoneId(this.selected.zone); + }, + selectedStage () { + if (!this.selected.stage) return []; + return get.stages.byStageId(this.selected.stage); + }, stageItems() { if (!this.selected.stage) return []; - let stages = get.stages.byStageId(this.selected.stage); + let stages = this.selectedStage; let items = []; const categories = [{ i18n: "normal", @@ -637,22 +700,29 @@ export default { }, slashStripClasses() { return { 'slash-strip--warning': this.validation.rate <= 2, 'slash-strip--danger': this.validation.rate > 2 } - }, - showSubmittedSnackbar() { - return this.submitted } }, + created () { + this.validateZone(this.$route.params.zoneId) + }, methods: { + validateZone (zoneId) { + if (zoneId) { + const got = get.zones.byZoneId(zoneId); + if (got.isOutdated) { + return this.invalidPath = true; + } + } + return this.invalidPath = false; + }, goToPage(name) { this.$router.push({ name: name }) }, select({ zone, stage }) { + this.reset(); this.selected.zone = zone; this.selected.stage = stage; - - if (!zone && !stage) { - this.reset(); - } + this.validateZone(zone); }, getItem(itemId) { return get.items.byItemId(itemId) @@ -786,6 +856,16 @@ export default { ); } +.slash-strip--warning-transparent { + background: repeating-linear-gradient( + -45deg, + rgba(237, 144, 53, 0.5), + rgba(237, 144, 53, 0.5) 45px, + rgba(0, 0, 0, 0.5) 45px, + rgba(0, 0, 0, 0.5) 90px + ); +} + .slash-strip--danger { background: repeating-linear-gradient( -45deg, diff --git a/src/views/Stats/Item.vue b/src/views/Stats/Item.vue index 4be812fb..254eefcf 100644 --- a/src/views/Stats/Item.vue +++ b/src/views/Stats/Item.vue @@ -67,10 +67,10 @@ -

+

{{ $t('result.title', {item: selectedItemName}) }}

@@ -168,7 +168,7 @@ :items="itemStagesStats" type="item" - class="px-6 pb-6" + class="px-3 px-sm-4 px-md-6 px-lg-6 px-xl-8 pt-0 pb-6" />
@@ -310,18 +310,18 @@ export default { (this.step += 1); }, methods: { - getStageItemTrendInterval(stageId) { - let trend = this.getStageItemTrend(stageId); - return trend && trend.interval; - }, - getStageItemTrendStartTime(stageId) { - let trend = this.getStageItemTrend(stageId); - return trend && trend.startTime; - }, - getStageItemTrendResults(stageId) { - let trend = this.getStageItemTrend(stageId); - return trend && trend.results; - }, + // getStageItemTrendInterval(stageId) { + // let trend = this.getStageItemTrend(stageId); + // return trend && trend.interval; + // }, + // getStageItemTrendStartTime(stageId) { + // let trend = this.getStageItemTrend(stageId); + // return trend && trend.startTime; + // }, + // getStageItemTrendResults(stageId) { + // let trend = this.getStageItemTrend(stageId); + // return trend && trend.results; + // }, getStageItemTrend(stageId) { return this.currentItemTrends && this.currentItemTrends[stageId]; }, diff --git a/src/views/Stats/Stage.vue b/src/views/Stats/Stage.vue index 2e0e57db..c6a9f802 100644 --- a/src/views/Stats/Stage.vue +++ b/src/views/Stats/Stage.vue @@ -28,23 +28,46 @@