diff --git a/public/base-locales/en.json b/public/base-locales/en.json index 8b35aeba2..52729aa1c 100644 --- a/public/base-locales/en.json +++ b/public/base-locales/en.json @@ -547,6 +547,7 @@ "quest_condition": "Quest Condition", "always_show_labels": "Always Show Labels", "scan_areas_options": "Scan Areas Options", + "poi": "Points of Interest", "300m_range": "300m Range", "lure_range": "Lure Range" } diff --git a/server/src/configs/custom-environment-variables.json b/server/src/configs/custom-environment-variables.json index 6648dfaa1..9ebfcc373 100644 --- a/server/src/configs/custom-environment-variables.json +++ b/server/src/configs/custom-environment-variables.json @@ -876,6 +876,18 @@ "enabled": { "__name": "DEFAULT_FILTERS_SUBMISSION_CELLS_ENABLED", "__format": "boolean" + }, + "rings": { + "__name": "DEFAULT_FILTERS_SUBMISSION_CELLS_RINGS", + "__format": "boolean" + }, + "s17Cells": { + "__name": "DEFAULT_FILTERS_SUBMISSION_CELLS_S17CELLS", + "__format": "boolean" + }, + "s14Cells": { + "__name": "DEFAULT_FILTERS_SUBMISSION_CELLS_S14CELLS", + "__format": "boolean" } }, "weather": { diff --git a/server/src/configs/default.json b/server/src/configs/default.json index e5858484a..aa653be66 100644 --- a/server/src/configs/default.json +++ b/server/src/configs/default.json @@ -419,7 +419,10 @@ "enabled": false }, "submissionCells": { - "enabled": false + "enabled": false, + "rings": true, + "s17Cells": true, + "s14Cells": true }, "weather": { "enabled": true diff --git a/server/src/graphql/resolvers.js b/server/src/graphql/resolvers.js index d0be2763f..3eceb79b9 100644 --- a/server/src/graphql/resolvers.js +++ b/server/src/graphql/resolvers.js @@ -299,10 +299,13 @@ module.exports = { return [ { placementCells: - args.zoom >= config.map.submissionZoom + args.zoom >= config.map.submissionZoom && + args.filters.onlyS17Cells ? Utility.getPlacementCells(args, pokestops, gyms) : [], - typeCells: Utility.getTypeCells(args, pokestops, gyms), + typeCells: args.filters.onlyS14Cells + ? Utility.getTypeCells(args, pokestops, gyms) + : [], }, ] } diff --git a/server/src/services/defaultFilters/buildDefaultFilters.js b/server/src/services/defaultFilters/buildDefaultFilters.js index 92ff1c658..715ed5009 100644 --- a/server/src/services/defaultFilters/buildDefaultFilters.js +++ b/server/src/services/defaultFilters/buildDefaultFilters.js @@ -106,6 +106,9 @@ module.exports = function buildDefault(perms, available) { submissionCells: perms.submissionCells ? { enabled: defaultFilters.submissionCells.enabled, + rings: defaultFilters.submissionCells.rings, + s17Cells: defaultFilters.submissionCells.s17Cells, + s14Cells: defaultFilters.submissionCells.s14Cells, filter: { global: new GenericFilter() }, } : undefined, diff --git a/server/src/services/functions/getPlacementCells.js b/server/src/services/functions/getPlacementCells.js index 8805ebbee..05120f14a 100644 --- a/server/src/services/functions/getPlacementCells.js +++ b/server/src/services/functions/getPlacementCells.js @@ -46,7 +46,9 @@ module.exports = function getPlacementCells(bounds, pokestops, gyms) { cell.blocked = true } } - const rings = allCoords.map((poi) => new Ring(poi.id, poi.lat, poi.lon)) + const rings = bounds.filters.onlyRings + ? allCoords.map((poi) => new Ring(poi.id, poi.lat, poi.lon)) + : [] return { cells: Object.values(indexedCells), diff --git a/server/src/services/ui/clientOptions.js b/server/src/services/ui/clientOptions.js index b6eaad6e6..6e8e44045 100644 --- a/server/src/services/ui/clientOptions.js +++ b/server/src/services/ui/clientOptions.js @@ -17,7 +17,7 @@ module.exports = function clientOptions(perms) { clustering: { type: 'bool', perm: ['gyms', 'raids'] }, raidTimers: { type: 'bool', perm: ['raids'] }, interactionRanges: { type: 'bool', perm: ['gyms', 'raids'] }, - "300mRange": { type: 'bool', perm: ['raids'] }, + '300mRange': { type: 'bool', perm: ['raids'] }, showExBadge: { type: 'bool', perm: ['gyms'] }, showArBadge: { type: 'bool', perm: ['gyms'] }, raidLevelBadges: { type: 'bool', perm: ['raids'] }, diff --git a/server/src/services/ui/primary.js b/server/src/services/ui/primary.js index 10d327e18..8e753e577 100644 --- a/server/src/services/ui/primary.js +++ b/server/src/services/ui/primary.js @@ -1,100 +1,98 @@ -/* eslint-disable no-restricted-syntax */ const { api: { pvp: { leagues }, }, defaultFilters: { - nests: { avgSliderStep }, + nests: { avgSliderStep, avgFilter }, }, } = require('../config') +const refSliders = { + pokemon: { + primary: [ + { + name: 'iv', + label: '%', + min: 0, + max: 100, + perm: 'iv', + color: 'secondary', + }, + ], + secondary: [ + { + name: 'level', + label: '', + min: 1, + max: 35, + perm: 'iv', + }, + { + name: 'atk_iv', + label: '', + min: 0, + max: 15, + perm: 'iv', + }, + { + name: 'def_iv', + label: '', + min: 0, + max: 15, + perm: 'iv', + }, + { + name: 'sta_iv', + label: '', + min: 0, + max: 15, + perm: 'iv', + }, + ], + }, + nests: { + secondary: [ + { + name: 'avgFilter', + i18nKey: 'spawns_per_hour', + label: '', + min: avgFilter[0], + max: avgFilter[1], + perm: 'nests', + step: avgSliderStep, + }, + ], + }, +} + +leagues.forEach((league) => + refSliders.pokemon.primary.push({ + name: league.name, + label: 'rank', + min: league.minRank || 1, + max: league.maxRank || 100, + perm: 'pvp', + color: 'primary', + }), +) + +const ignoredKeys = [ + 'enabled', + 'filter', + 'showQuestSet', + 'badge', + 'avgFilter', + 'raidTier', +] + module.exports = function generateUi(filters, perms) { const ui = {} - const ignoredKeys = [ - 'enabled', - 'filter', - 'showQuestSet', - 'badge', - 'avgFilter', - 'raidTier', - ] // builds the initial categories - for (const [key, value] of Object.entries(filters)) { + Object.entries(filters).forEach(([key, value]) => { let sliders if (value) { switch (key) { - case 'nests': - ui[key] = {} - sliders = { - secondary: [ - { - name: 'avgFilter', - i18nKey: 'spawns_per_hour', - label: '', - min: filters.nests.avgFilter[0], - max: filters.nests.avgFilter[1], - perm: 'nests', - step: avgSliderStep, - }, - ], - } - break - case 'pokemon': - ui[key] = {} - sliders = { - primary: [ - { - name: 'iv', - label: '%', - min: 0, - max: 100, - perm: 'iv', - color: 'secondary', - }, - ], - secondary: [ - { - name: 'level', - label: '', - min: 1, - max: 35, - perm: 'iv', - }, - { - name: 'atk_iv', - label: '', - min: 0, - max: 15, - perm: 'iv', - }, - { - name: 'def_iv', - label: '', - min: 0, - max: 15, - perm: 'iv', - }, - { - name: 'sta_iv', - label: '', - min: 0, - max: 15, - perm: 'iv', - }, - ], - } - leagues.forEach((league) => - sliders.primary.push({ - name: league.name, - label: 'rank', - min: league.minRank || 1, - max: league.maxRank || 100, - perm: 'pvp', - color: 'primary', - }), - ) - break case 'submissionCells': case 'portals': if (!ui.wayfarer) ui.wayfarer = {} @@ -108,10 +106,11 @@ module.exports = function generateUi(filters, perms) { break default: ui[key] = {} + sliders = refSliders[key] break } // builds each subcategory - for (const [subKey, subValue] of Object.entries(value)) { + Object.entries(value).forEach(([subKey, subValue]) => { if ( (!ignoredKeys.includes(subKey) && subValue !== undefined) || key === 'weather' || @@ -136,7 +135,7 @@ module.exports = function generateUi(filters, perms) { break } } - } + }) // adds any sliders present if (sliders) { ui[key].sliders = sliders @@ -150,7 +149,7 @@ module.exports = function generateUi(filters, perms) { }) } } - } + }) // deletes any menus that do not have any items/perms Object.keys(ui).forEach((category) => { diff --git a/src/components/layout/drawer/WithSubItems.jsx b/src/components/layout/drawer/WithSubItems.jsx index 50c668dc8..527c93d77 100644 --- a/src/components/layout/drawer/WithSubItems.jsx +++ b/src/components/layout/drawer/WithSubItems.jsx @@ -1,6 +1,6 @@ -import React from 'react' +import React, { Fragment } from 'react' import { Grid, Typography, Switch, Select, MenuItem } from '@material-ui/core' -import { useTranslation } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import Utility from '@services/Utility' @@ -148,6 +148,40 @@ export default function WithSubItems({ )} + {category === 'wayfarer' && subItem === 'submissionCells' && ( + <> + {['rings', 's14Cells', 's17Cells'].map((item, i) => ( + + + + {i ? ( + + {{ level: item.substring(1, 3) }} + + ) : ( + t('poi') + )} + + + + { + setFilters({ + ...filters, + [subItem]: { + ...filters[subItem], + [item]: !filters[subItem][item], + }, + }) + }} + disabled={!filters[subItem].enabled} + /> + + + ))} + + )} ) }